]>
git.saurik.com Git - wxWidgets.git/blob - demos/dbbrowse/browsedb.cpp
1 //---------------------------------------------------------------------------
2 // Name: BrowserDB.h,cpp
4 // Author: Mark Johnson, mj10777@gmx.net
6 // Created: 19991127.mj10777
7 // Copyright: (c) Mark Johnson
8 // Licence: wxWindows license
10 //---------------------------------------------------------------------------
12 //---------------------------------------------------------------------------
13 //-- all #ifdefs that the whole Project needs. ------------------------------
14 //---------------------------------------------------------------------------
16 #pragma implementation
19 //---------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
22 //---------------------------------------------------------------------------
26 //---------------------------------------------------------------------------
30 //---------------------------------------------------------------------------
31 #include <wx/dbtable.h>
34 //---------------------------------------------------------------------------
35 // Global structure for holding ODBC connection information
36 // - darf nur einmal im Projekte definiert werden ?? Extra Databasse Klasse ?
37 struct DbStuff ConnectInf
; // Für DBase
38 //---------------------------------------------------------------------------
39 extern DbList
* WXDLLEXPORT PtrBegDbList
; /* from db.cpp, used in getting back error results from db connections */
40 //---------------------------------------------------------------------------
41 char * GetExtendedDBErrorMsg ( char * ErrFile
, int ErrLine
)
45 if ( ErrFile
|| ErrLine
)
50 tStr
. Printf ( " %d " , ErrLine
);
51 msg
+= tStr
. GetData ();
54 msg
. Append ( " \n ODBC errors: \n " );
56 /* Scan through each database connection displaying
57 * any ODBC errors that have occured. */
58 for ( DbList
* pDbList
= PtrBegDbList
; pDbList
; pDbList
= pDbList
-> PtrNext
)
60 // Skip over any free connections
63 // Display errors for this connection
64 for ( int i
= 0 ; i
< DB_MAX_ERROR_HISTORY
; i
++)
66 if ( pDbList
-> PtrDb
-> errorList
[ i
])
68 msg
. Append ( pDbList
-> PtrDb
-> errorList
[ i
]);
69 if ( strcmp ( pDbList
-> PtrDb
-> errorList
[ i
], "" ) != 0 )
75 return ( char *) ( const char *) msg
;
76 } // GetExtendedDBErrorMsg
78 //---------------------------------------------------------------------------
79 BrowserDB :: BrowserDB ()
82 ODBCSource
= "" ; // ODBC data source name (created with ODBC Administrator under Win95/NT)
83 UserName
= "" ; // database username - must already exist in the data source
84 Password
= "" ; // password database username
87 } // BrowserDB Constructor
88 //---------------------------------------------------------------------------
89 BrowserDB ::~ BrowserDB ()
91 Zeiger_auf_NULL ( 1 ); // Clean up Tables and Databases (Commit, Close und delete)
92 } // BrowserDB destructor
93 //--------------------------------------------------------------------------------------------
94 bool BrowserDB :: Initialize ( int Quite
)
96 if (! OnStartDB ( Quite
))
98 wxLogMessage ( _ ( " \n\n -E-> BrowserDB::OnStartDB( %s ) : Failed ! " ), ODBCSource
. c_str ());
102 } // BrowserDB:Initialize
103 //--------------------------------------------------------------------------------------------
104 bool BrowserDB :: OnStartDB ( int Quite
)
107 wxLogMessage ( _ ( " \n -I-> BrowserDB::OnStartDB( %s ) : Begin " ), ODBCSource
. c_str ());
108 if ( db_BrowserDB
!= NULL
)
111 wxLogMessage ( _ ( " \n -I-> BrowserDB::OnStartDB() : DB is allready open." ));
114 // Initialize the ODBC Environment for Database Operations
115 if ( SQLAllocEnv (& ConnectInf
. Henv
) != SQL_SUCCESS
)
118 wxLogMessage ( _ ( " \n -E-> BrowserDB::OnStartDB() : DB CONNECTION ERROR : A problem occured while trying to get a connection to the data source" ));
121 //---------------------------------------------------------------------------
122 // Connect to datasource
123 //---------------------------
124 DlgUser
* p_Dlg
= new DlgUser ( pDoc
-> p_MainFrame
, "Username and Password" );
125 p_Dlg
-> s_DSN
= ODBCSource
;
126 p_Dlg
-> s_User
= UserName
;
127 p_Dlg
-> s_Password
= Password
;
132 if ( p_Dlg
-> ShowModal () == wxID_OK
)
134 ( pDoc
-> p_DSN
+ i_Which
)-> Usr
= p_Dlg
-> s_User
;
135 ( pDoc
-> p_DSN
+ i_Which
)-> Pas
= p_Dlg
-> s_Password
;
136 UserName
= p_Dlg
-> s_User
;
137 Password
= p_Dlg
-> s_Password
;
145 //---------------------------
146 strcpy ( ConnectInf
. Dsn
, ODBCSource
); // ODBC data source name (created with ODBC Administrator under Win95/NT)
147 strcpy ( ConnectInf
. Uid
, UserName
); // database username - must already exist in the data source
148 strcpy ( ConnectInf
. AuthStr
, Password
); // password database username
149 db_BrowserDB
= GetDbConnection (& ConnectInf
);
150 // wxLogMessage(">>>%s<<<>>>%s<<<",UserName.c_str(),Password.c_str());
151 if ( db_BrowserDB
== NULL
)
153 strcpy ( ConnectInf
. Dsn
, "" );
154 strcpy ( ConnectInf
. Uid
, "" );
155 strcpy ( ConnectInf
. AuthStr
, "" );
158 wxLogMessage ( _ ( " \n -E-> BrowserDB::OnConnectDataSource() DB CONNECTION ERROR : Unable to connect to the data source. \n\n Check the name of your data source to verify it has been correctly entered/spelled. \n\n With some databases, the user name and password must \n be created with full rights to the table prior to making a connection \n (using tools provided by the database manufacturer)" ));
159 wxLogMessage ( _ ( "-I-> BrowserDB::OnStartDB( %s ) : End " ), ODBCSource
. c_str ());
163 //--------------------------------------------------------------------------
166 Temp1
= db_BrowserDB
-> GetDatabaseName ();
167 Temp2
= db_BrowserDB
-> GetDataSource ();
168 wxLogMessage ( _ ( "-I-> BrowserDB::OnGetDataSourceODBC() - DatabaseName( %s ) ; DataSource( %s )" ), Temp1
. c_str (), Temp2
. c_str ());
169 wxLogMessage ( _ ( "-I-> BrowserDB::OnStartDB( %s ) : End " ), ODBCSource
. c_str ());
174 //--------------------------------------------------------------------------------------------
175 bool BrowserDB :: OnCloseDB ( int Quite
)
178 wxLogMessage ( _ ( "-I-> BrowserDB::OnCloseDB() : Begin " ));
181 db_BrowserDB
-> Close ();
182 FreeDbConnection ( db_BrowserDB
);
184 // Free Environment Handle that ODBC uses
185 if ( SQLFreeEnv (& ConnectInf
. Henv
) != SQL_SUCCESS
)
187 // Error freeing environment handle
192 wxLogMessage ( _ ( " \n -I-> BrowserDB::OnCloseDB() : End " ));
195 //----------------------------------------------------------------------------------------
196 bool BrowserDB :: OnGetNext ( int Cols
, int Quite
)
205 TIMESTAMP_STRUCT t_temp
;
207 //-----------------------------
208 if (! db_BrowserDB
-> GetNext ())
211 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetNext - ODBC-Error with GetNext \n -E-> " ));
212 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
220 strcpy (( cl_BrowserDB
+ i
)-> tableName
, "-E->" );
221 i_dbDataType
= ( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
;
222 if ( i_dbDataType
== 0 ) // Filter unsupported dbDataTypes
224 if ((( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_VARCHAR
) || (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_LONGVARCHAR
))
225 i_dbDataType
= DB_DATA_TYPE_VARCHAR
;
226 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_C_DATE
)
227 i_dbDataType
= DB_DATA_TYPE_DATE
;
228 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_C_BIT
)
229 i_dbDataType
= DB_DATA_TYPE_INTEGER
;
230 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_NUMERIC
)
231 i_dbDataType
= DB_DATA_TYPE_VARCHAR
;
232 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_REAL
)
233 i_dbDataType
= DB_DATA_TYPE_FLOAT
;
235 if (( i_dbDataType
== DB_DATA_TYPE_INTEGER
) && (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_C_DOUBLE
))
237 i_dbDataType
= DB_DATA_TYPE_FLOAT
;
241 case DB_DATA_TYPE_VARCHAR
:
243 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
,& s_temp
, sizeof ( s_temp
), & cb
))
245 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetNext - ODBC-Error with GetNext of > %s <. \n -E-> " ),( cl_BrowserDB
+ i
)-> tableName
);
246 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
249 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, s_temp
);
250 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
252 case DB_DATA_TYPE_INTEGER
:
254 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
,& l_temp
, sizeof ( l_temp
), & cb
))
256 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n -E-> " ));
257 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
261 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, l_temp
);
262 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
265 case DB_DATA_TYPE_FLOAT
:
267 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
,& f_temp
, sizeof ( f_temp
), & cb
))
269 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n -E-> " ));
270 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
275 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, f_temp
);
276 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
279 case DB_DATA_TYPE_DATE
:
280 t_temp
. day
= t_temp
. month
= t_temp
. year
= t_temp
. hour
= t_temp
. minute
= t_temp
. second
= t_temp
. fraction
= 0 ;
281 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
,& t_temp
, sizeof ( t_temp
), & cb
))
283 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n -E-> " ));
284 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
288 // i_Nation = 0 = timestamp , 1=EU, 2=UK, 3=International, 4=US
289 if ((( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 0 ) || // TS YYYY-MM-DD
290 (( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 3 )) // IT YYYY-MM-DD
292 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, t_temp
. year
, t_temp
. month
, t_temp
. day
,
293 t_temp
. hour
, t_temp
. minute
, t_temp
. second
, t_temp
. fraction
);
294 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
296 if ( (( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 1 ) || // EU DD.MM.YYYY
297 (( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 2 )) // UK DD/MM/YYYY
299 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, t_temp
. day
, t_temp
. month
, t_temp
. year
,
300 t_temp
. hour
, t_temp
. minute
, t_temp
. second
, t_temp
. fraction
);
301 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
303 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 3 ) // US MM/DD/YYYY
305 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, t_temp
. month
, t_temp
. day
, t_temp
. year
,
306 t_temp
. hour
, t_temp
. minute
, t_temp
. second
, t_temp
. fraction
);
307 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
315 Temp0
= ( cl_BrowserDB
+ i
)-> colName
;
316 wxLogMessage ( _ ( "-E-> BrowserDB::OnGetNext - DB_DATA_TYPE_?? ( %d ) in Col( %s )" ),( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
, Temp0
. c_str ());
320 Temp0
. Printf ( _ ( "-E-> unknown Format( %d ) - sql( %d )" ),( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
);
321 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
326 // wxLogMessage("-E-> BrowserDB::OnGetNext - End");
329 //----------------------------------------------------------------------------------------
330 bool BrowserDB :: OnSelect ( wxString tb_Name
, int Quite
)
334 //--------------------------------------------------------------------------
335 SQLStmt
. sprintf ( "SELECT * FROM %s " , tb_Name
. c_str ());
336 if (! db_BrowserDB
-> ExecSql (( char *)( SQLStmt
. GetData ())))
338 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnSelect - ODBC-Error with ExecSql of > %s <. \n -E-> " ), tb_Name
. c_str ());
339 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
341 wxMessageBox ( "-E-> BrowserDB::OnSelect - GetData()" );
344 //--------------------------------------------------------------------------
345 while ( db_BrowserDB
-> GetNext ())
349 //--------------------------------------------------------------------------
350 if (! db_BrowserDB
-> ExecSql (( char *)( SQLStmt
. GetData ())))
352 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnSelect - ODBC-Error with ExecSql of > %s <. \n -E-> " ), tb_Name
. c_str ());
353 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
357 //--------------------------------------------------------------------------
358 // SetColDefs ( 0,"NAME", DB_DATA_TYPE_VARCHAR, Name, SQL_C_CHAR, sizeof(Name), TRUE, TRUE); // Primary index
359 //--------------------------------------------------------------------------
362 wxLogMessage ( _ ( " \n -I-> BrowserDB::OnSelect( %s ) Records( %d ): End " ), tb_Name
. c_str (), i_Records
);
366 //----------------------------------------------------------------------------------------
367 bool BrowserDB :: OnExecSql ( wxString SQLStmt
, int Quite
)
369 //--------------------------------------------------------------------------
370 if (! db_BrowserDB
-> ExecSql (( char *)( SQLStmt
. GetData ())))
372 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnExecSQL - ODBC-Error with ExecSql of > %s <. \n -E-> " ), SQLStmt
. c_str ());
373 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
377 wxMessageBox ( "-E-> BrowserDB::OnExecSql - ExecSql()" );
382 // wxLogMessage(_("\n-I-> BrowserDB::OnExecSql(%s) - End "),SQLStmt.c_str());
386 //----------------------------------------------------------------------------------------
387 wxDbInf
* BrowserDB :: OnGetCatalog ( int Quite
)
390 strcpy ( UName
, UserName
);
391 ct_BrowserDB
= db_BrowserDB
-> GetCatalog ( UName
);
394 //----------------------------------------------------------------------------------------
395 wxColInf
* BrowserDB :: OnGetColumns ( char * tableName
, int numCols
, int Quite
)
399 strcpy ( UName
, UserName
);
400 cl_BrowserDB
= db_BrowserDB
-> GetColumns ( tableName
,& numCols
, UName
);
401 cl_BrowserDB
-> pColFor
= new wxColFor
[ numCols
];
402 for ( i
= 0 ; i
< numCols
; i
++)
404 ( cl_BrowserDB
-> pColFor
+ i
)-> Format ( 1 ,( cl_BrowserDB
+ i
)-> dbDataType
,( cl_BrowserDB
+ i
)-> sqlDataType
,
405 ( cl_BrowserDB
+ i
)-> columnSize
, ( cl_BrowserDB
+ i
)-> decimalDigits
);
409 //----------------------------------------------------------------------------------------
410 void BrowserDB :: Zeiger_auf_NULL ( int Art
)
412 if ( Art
== 1 ) // Löschen
414 if ( cl_BrowserDB
!= NULL
)
415 { // Destroy the memory
416 delete [] cl_BrowserDB
;
418 if ( ct_BrowserDB
!= NULL
)
419 { // Destroy the memory
420 delete [] ct_BrowserDB
;
422 if ( db_BrowserDB
!= NULL
)
424 db_BrowserDB
-> CommitTrans ();
425 db_BrowserDB
-> Close ();
426 CloseDbConnections ();
435 //----------------------------------------------------------------------------------------
436 void BrowserDB :: OnFillSqlTyp ()
438 i_SqlTyp
[ 1 ] = SQL_C_BINARY
; s_SqlTyp
[ 1 ] = "SQL_C_BINARY" ;
439 i_SqlTyp
[ 2 ] = SQL_C_BIT
; s_SqlTyp
[ 2 ] = "SQL_C_BIT" ;
440 i_SqlTyp
[ 3 ] = SQL_C_BOOKMARK
; s_SqlTyp
[ 3 ] = "SQL_C_BOOKMARK" ;
441 i_SqlTyp
[ 4 ] = SQL_C_CHAR
; s_SqlTyp
[ 4 ] = "SQL_C_CHAR" ;
442 i_SqlTyp
[ 5 ] = SQL_C_DATE
; s_SqlTyp
[ 5 ] = "SQL_C_DATE" ;
443 i_SqlTyp
[ 6 ] = SQL_C_DEFAULT
; s_SqlTyp
[ 6 ] = "SQL_C_DEFAULT" ;
444 i_SqlTyp
[ 7 ] = SQL_C_DOUBLE
; s_SqlTyp
[ 7 ] = "SQL_C_DOUBLE" ;
445 i_SqlTyp
[ 8 ] = SQL_C_FLOAT
; s_SqlTyp
[ 8 ] = "SQL_C_FLOAT" ;
446 i_SqlTyp
[ 9 ] = SQL_C_LONG
; s_SqlTyp
[ 9 ] = "SQL_C_LONG" ;
447 i_SqlTyp
[ 10 ] = SQL_C_SHORT
; s_SqlTyp
[ 10 ] = "SQL_C_SHORT" ;
448 i_SqlTyp
[ 11 ] = SQL_C_SLONG
; s_SqlTyp
[ 11 ] = "SQL_C_SLONG" ;
449 i_SqlTyp
[ 12 ] = SQL_C_SSHORT
; s_SqlTyp
[ 12 ] = "SQL_C_SSHORT" ;
450 i_SqlTyp
[ 13 ] = SQL_C_STINYINT
; s_SqlTyp
[ 13 ] = "SQL_C_STINYINT" ;
451 i_SqlTyp
[ 14 ] = SQL_C_TIME
; s_SqlTyp
[ 14 ] = "SQL_C_TIME" ;
452 i_SqlTyp
[ 15 ] = SQL_C_TIMESTAMP
; s_SqlTyp
[ 15 ] = "SQL_C_TIMESTAMP" ;
453 i_SqlTyp
[ 16 ] = SQL_C_TINYINT
; s_SqlTyp
[ 16 ] = "SQL_C_TINYINT" ;
454 i_SqlTyp
[ 17 ] = SQL_C_ULONG
; s_SqlTyp
[ 17 ] = "SQL_C_ULONG" ;
455 i_SqlTyp
[ 18 ] = SQL_C_USHORT
; s_SqlTyp
[ 18 ] = "SQL_C_USHORT" ;
456 i_SqlTyp
[ 19 ] = SQL_C_UTINYINT
; s_SqlTyp
[ 19 ] = "SQL_C_UTINYINT" ;
457 i_SqlTyp
[ 20 ] = SQL_VARCHAR
; s_SqlTyp
[ 20 ] = "SQL_VARCHAR" ;
458 i_SqlTyp
[ 21 ] = SQL_NUMERIC
; s_SqlTyp
[ 21 ] = "SQL_NUMERIC" ;
459 i_SqlTyp
[ 22 ] = SQL_LONGVARCHAR
; s_SqlTyp
[ 22 ] = "SQL_LONGVARCHAR" ;
460 i_SqlTyp
[ 23 ] = SQL_REAL
; s_SqlTyp
[ 23 ] = "SQL_REAL" ;
461 i_SqlTyp
[ 0 ] = 23 ; s_SqlTyp
[ 0 ] = "" ;
463 //----------------------------------------------------------------------------------------
464 void BrowserDB :: OnFilldbTyp ()
466 i_dbTyp
[ 1 ] = DB_DATA_TYPE_VARCHAR
; s_dbTyp
[ 1 ] = "DB_DATA_TYPE_VARCHAR" ;
467 i_dbTyp
[ 2 ] = DB_DATA_TYPE_INTEGER
; s_dbTyp
[ 2 ] = "DB_DATA_TYPE_INTEGER" ;
468 i_dbTyp
[ 3 ] = DB_DATA_TYPE_FLOAT
; s_dbTyp
[ 3 ] = "DB_DATA_TYPE_FLOAT" ;
469 i_dbTyp
[ 4 ] = DB_DATA_TYPE_DATE
; s_dbTyp
[ 4 ] = "DB_DATA_TYPE_DATE" ;
470 i_dbTyp
[ 0 ] = 4 ; s_dbTyp
[ 0 ] = "" ;
472 //----------------------------------------------------------------------------------------