]>
git.saurik.com Git - wxWidgets.git/blob - demos/dbbrowse/browsedb.cpp
1 //----------------------------------------------------------------------------------------
2 // Name: BrowserDB.h,cpp
3 // Purpose: a wxDB class
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 //----------------------------------------------------------------------------------------
32 //----------------------------------------------------------------------------------------
33 // Global structure for holding ODBC connection information
34 // - darf nur einmal im Projekte definiert werden ?? Extra Databasse Klasse ?
35 struct DbStuff ConnectInf
; // Für DBase
36 //----------------------------------------------------------------------------------------
37 extern DbList
* WXDLLEXPORT PtrBegDbList
; /* from db.cpp, used in getting back error results from db connections */
38 //----------------------------------------------------------------------------------------
39 char * GetExtendedDBErrorMsg ( char * ErrFile
, int ErrLine
)
43 if ( ErrFile
|| ErrLine
)
48 tStr
. Printf ( " %d " , ErrLine
);
49 msg
+= tStr
. GetData ();
52 msg
. Append ( " \n ODBC errors: \n " );
54 /* Scan through each database connection displaying
55 * any ODBC errors that have occured. */
56 for ( DbList
* pDbList
= PtrBegDbList
; pDbList
; pDbList
= pDbList
-> PtrNext
)
58 // Skip over any free connections
61 // Display errors for this connection
62 for ( int i
= 0 ; i
< DB_MAX_ERROR_HISTORY
; i
++)
64 if ( pDbList
-> PtrDb
-> errorList
[ i
])
66 msg
. Append ( pDbList
-> PtrDb
-> errorList
[ i
]);
67 if ( strcmp ( pDbList
-> PtrDb
-> errorList
[ i
], "" ) != 0 )
73 return ( char *) ( const char *) msg
;
74 } // GetExtendedDBErrorMsg
76 //----------------------------------------------------------------------------------------
77 BrowserDB :: BrowserDB ()
80 ODBCSource
= "" ; // ODBC data source name (created with ODBC Administrator under Win95/NT)
81 UserName
= "" ; // database username - must already exist in the data source
82 Password
= "" ; // password database username
85 } // BrowserDB Constructor
86 //----------------------------------------------------------------------------------------
87 BrowserDB ::~ BrowserDB ()
89 Zeiger_auf_NULL ( 1 ); // Clean up Tables and Databases (Commit, Close und delete)
90 } // BrowserDB destructor
91 //----------------------------------------------------------------------------------------
92 bool BrowserDB :: Initialize ( int Quite
)
94 if (! OnStartDB ( Quite
))
96 wxLogMessage ( _ ( " \n\n -E-> BrowserDB::OnStartDB( %s ) : Failed ! " ), ODBCSource
. c_str ());
100 } // BrowserDB:Initialize
101 //----------------------------------------------------------------------------------------
102 bool BrowserDB :: OnStartDB ( int Quite
)
106 wxLogMessage ( _ ( " \n -I-> BrowserDB::OnStartDB( %s ) : Begin " ), ODBCSource
. c_str ());
107 if ( db_BrowserDB
!= NULL
)
110 wxLogMessage ( _ ( " \n -I-> BrowserDB::OnStartDB() : DB is allready open." ));
113 // Initialize the ODBC Environment for Database Operations
114 if ( SQLAllocEnv (& ConnectInf
. Henv
) != SQL_SUCCESS
)
117 wxLogMessage ( _ ( " \n -E-> BrowserDB::OnStartDB() : DB CONNECTION ERROR : A problem occured while trying to get a connection to the data source" ));
120 //---------------------------------------------------------------------------------------
121 // Connect to datasource
122 //---------------------------------------------------------------------------------------
124 p_Dlg
= new DlgUser ( pDoc
-> p_MainFrame
, pDoc
, "" );
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
;
143 //--------------------------------------------------------------------------------------
144 strcpy ( ConnectInf
. Dsn
, ODBCSource
); // ODBC data source name (created with ODBC Administrator under Win95/NT)
145 strcpy ( ConnectInf
. Uid
, UserName
); // database username - must already exist in the data source
146 strcpy ( ConnectInf
. AuthStr
, Password
); // password database username
147 db_BrowserDB
= GetDbConnection (& ConnectInf
);
148 // wxLogMessage(">>>%s<<<>>>%s<<<",UserName.c_str(),Password.c_str());
149 if ( db_BrowserDB
== NULL
)
151 strcpy ( ConnectInf
. Dsn
, "" );
152 strcpy ( ConnectInf
. Uid
, "" );
153 strcpy ( ConnectInf
. AuthStr
, "" );
156 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)" ));
157 wxLogMessage ( _ ( "-I-> BrowserDB::OnStartDB( %s ) : End - Time needed : %l d ms" ), ODBCSource
. c_str (), sw
. Time ());
161 //--------------------------------------------------------------------------------------
164 Temp1
= db_BrowserDB
-> GetDatabaseName ();
165 Temp2
= db_BrowserDB
-> GetDataSource ();
166 wxLogMessage ( _ ( "-I-> BrowserDB::OnGetDataSourceODBC() - DatabaseName( %s ) ; DataSource( %s )" ), Temp1
. c_str (), Temp2
. c_str ());
167 wxLogMessage ( _ ( "-I-> BrowserDB::OnStartDB( %s ) : End - Time needed : %l d ms" ), ODBCSource
. c_str (), sw
. Time ());
172 //----------------------------------------------------------------------------------------
173 bool BrowserDB :: OnCloseDB ( int Quite
)
176 wxLogMessage ( _ ( "-I-> BrowserDB::OnCloseDB() : Begin " ));
179 db_BrowserDB
-> Close ();
180 FreeDbConnection ( db_BrowserDB
);
182 // Free Environment Handle that ODBC uses
183 if ( SQLFreeEnv (& ConnectInf
. Henv
) != SQL_SUCCESS
)
185 // Error freeing environment handle
190 wxLogMessage ( _ ( " \n -I-> BrowserDB::OnCloseDB() : End " ));
193 //----------------------------------------------------------------------------------------
194 bool BrowserDB :: OnGetNext ( int Cols
, int Quite
)
203 TIMESTAMP_STRUCT t_temp
;
205 //-----------------------------
206 if (! db_BrowserDB
-> GetNext ())
209 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetNext - ODBC-Error with GetNext \n -E-> " ));
210 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
218 strcpy (( cl_BrowserDB
+ i
)-> tableName
, "-E->" );
219 i_dbDataType
= ( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
;
220 if ( i_dbDataType
== 0 ) // Filter unsupported dbDataTypes
222 if ((( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_VARCHAR
) || (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_LONGVARCHAR
))
223 i_dbDataType
= DB_DATA_TYPE_VARCHAR
;
224 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_C_DATE
)
225 i_dbDataType
= DB_DATA_TYPE_DATE
;
226 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_C_BIT
)
227 i_dbDataType
= DB_DATA_TYPE_INTEGER
;
228 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_NUMERIC
)
229 i_dbDataType
= DB_DATA_TYPE_VARCHAR
;
230 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_REAL
)
231 i_dbDataType
= DB_DATA_TYPE_FLOAT
;
233 if (( i_dbDataType
== DB_DATA_TYPE_INTEGER
) && (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_C_DOUBLE
))
235 i_dbDataType
= DB_DATA_TYPE_FLOAT
;
239 case DB_DATA_TYPE_VARCHAR
:
241 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
,& s_temp
, sizeof ( s_temp
), & cb
))
243 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetNext - ODBC-Error with GetNext of > %s <. \n -E-> " ),( cl_BrowserDB
+ i
)-> tableName
);
244 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
247 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, s_temp
);
248 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
250 case DB_DATA_TYPE_INTEGER
:
252 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
,& l_temp
, sizeof ( l_temp
), & cb
))
254 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n -E-> " ));
255 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
259 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, l_temp
);
260 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
263 case DB_DATA_TYPE_FLOAT
:
265 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
,& f_temp
, sizeof ( f_temp
), & cb
))
267 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n -E-> " ));
268 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
273 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, f_temp
);
274 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
277 case DB_DATA_TYPE_DATE
:
278 t_temp
. day
= t_temp
. month
= t_temp
. year
= t_temp
. hour
= t_temp
. minute
= t_temp
. second
= t_temp
. fraction
= 0 ;
279 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
,& t_temp
, sizeof ( t_temp
), & cb
))
281 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n -E-> " ));
282 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
286 // i_Nation = 0 = timestamp , 1=EU, 2=UK, 3=International, 4=US
287 if ((( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 0 ) || // TS YYYY-MM-DD
288 (( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 3 )) // IT YYYY-MM-DD
290 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, t_temp
. year
, t_temp
. month
, t_temp
. day
,
291 t_temp
. hour
, t_temp
. minute
, t_temp
. second
, t_temp
. fraction
);
292 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
294 if ((( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 1 ) || // EU DD.MM.YYYY
295 (( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 2 )) // UK DD/MM/YYYY
297 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, t_temp
. day
, t_temp
. month
, t_temp
. year
,
298 t_temp
. hour
, t_temp
. minute
, t_temp
. second
, t_temp
. fraction
);
299 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
301 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 3 ) // US MM/DD/YYYY
303 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, t_temp
. month
, t_temp
. day
, t_temp
. year
,
304 t_temp
. hour
, t_temp
. minute
, t_temp
. second
, t_temp
. fraction
);
305 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
313 Temp0
= ( cl_BrowserDB
+ i
)-> colName
;
314 wxLogMessage ( _ ( "-E-> BrowserDB::OnGetNext - DB_DATA_TYPE_?? ( %d ) in Col( %s )" ),( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
, Temp0
. c_str ());
318 Temp0
. Printf ( _ ( "-E-> unknown Format( %d ) - sql( %d )" ),( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
);
319 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
324 // wxLogMessage("-E-> BrowserDB::OnGetNext - End");
327 //----------------------------------------------------------------------------------------
328 bool BrowserDB :: OnSelect ( wxString tb_Name
, int Quite
)
333 //---------------------------------------------------------------------------------------
334 SQLStmt
. sprintf ( "SELECT * FROM %s " , tb_Name
. c_str ());
335 if (! db_BrowserDB
-> ExecSql (( char *)( SQLStmt
. GetData ())))
337 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnSelect - ODBC-Error with ExecSql of > %s <. \n -E-> " ), tb_Name
. c_str ());
338 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
340 wxMessageBox ( "-E-> BrowserDB::OnSelect - GetData()" );
343 //---------------------------------------------------------------------------------------
344 while ( db_BrowserDB
-> GetNext ())
348 //---------------------------------------------------------------------------------------
349 if (! db_BrowserDB
-> ExecSql (( char *)( SQLStmt
. GetData ())))
351 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnSelect - ODBC-Error with ExecSql of > %s <. \n -E-> " ), tb_Name
. c_str ());
352 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
356 //---------------------------------------------------------------------------------------
357 // SetColDefs ( 0,"NAME", DB_DATA_TYPE_VARCHAR, Name, SQL_C_CHAR, sizeof(Name), TRUE, TRUE); // Primary index
358 //---------------------------------------------------------------------------------------
361 wxLogMessage ( _ ( " \n -I-> BrowserDB::OnSelect( %s ) Records( %d ): End - Time needed : %l d ms" ), tb_Name
. c_str (), i_Records
, sw
. Time ());
365 //----------------------------------------------------------------------------------------
366 bool BrowserDB :: OnExecSql ( wxString SQLStmt
, int Quite
)
368 //---------------------------------------------------------------------------------------
369 if (! db_BrowserDB
-> ExecSql (( char *)( SQLStmt
. GetData ())))
371 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnExecSQL - ODBC-Error with ExecSql of > %s <. \n -E-> " ), SQLStmt
. c_str ());
372 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
376 wxMessageBox ( "-E-> BrowserDB::OnExecSql - ExecSql()" );
381 // wxLogMessage(_("\n-I-> BrowserDB::OnExecSql(%s) - End - Time needed : %ld ms"),SQLStmt.c_str(),sw.Time());
385 //----------------------------------------------------------------------------------------
386 wxDbInf
* BrowserDB :: OnGetCatalog ( int Quite
)
389 strcpy ( UName
, UserName
);
390 ct_BrowserDB
= db_BrowserDB
-> GetCatalog ( UName
);
393 //----------------------------------------------------------------------------------------
394 wxColInf
* BrowserDB :: OnGetColumns ( char * tableName
, int numCols
, int Quite
)
398 strcpy ( UName
, UserName
);
399 cl_BrowserDB
= db_BrowserDB
-> GetColumns ( tableName
,& numCols
, UName
);
400 cl_BrowserDB
-> pColFor
= new wxColFor
[ numCols
];
401 for ( i
= 0 ; i
< numCols
; i
++)
403 ( cl_BrowserDB
-> pColFor
+ i
)-> Format ( 1 ,( cl_BrowserDB
+ i
)-> dbDataType
,( cl_BrowserDB
+ i
)-> sqlDataType
,
404 ( cl_BrowserDB
+ i
)-> columnSize
, ( cl_BrowserDB
+ i
)-> decimalDigits
);
408 //----------------------------------------------------------------------------------------
409 void BrowserDB :: Zeiger_auf_NULL ( int Art
)
411 if ( Art
== 1 ) // Löschen
413 if ( cl_BrowserDB
!= NULL
)
414 { // Destroy the memory
415 delete [] cl_BrowserDB
;
417 if ( ct_BrowserDB
!= NULL
)
418 { // Destroy the memory
419 delete [] ct_BrowserDB
;
421 if ( db_BrowserDB
!= NULL
)
423 db_BrowserDB
-> CommitTrans ();
424 db_BrowserDB
-> Close ();
425 CloseDbConnections ();
434 //----------------------------------------------------------------------------------------
435 void BrowserDB :: OnFillSqlTyp ()
437 i_SqlTyp
[ 1 ] = SQL_C_BINARY
; s_SqlTyp
[ 1 ] = "SQL_C_BINARY" ;
438 i_SqlTyp
[ 2 ] = SQL_C_BIT
; s_SqlTyp
[ 2 ] = "SQL_C_BIT" ;
439 i_SqlTyp
[ 3 ] = SQL_C_BOOKMARK
; s_SqlTyp
[ 3 ] = "SQL_C_BOOKMARK" ;
440 i_SqlTyp
[ 4 ] = SQL_C_CHAR
; s_SqlTyp
[ 4 ] = "SQL_C_CHAR" ;
441 i_SqlTyp
[ 5 ] = SQL_C_DATE
; s_SqlTyp
[ 5 ] = "SQL_C_DATE" ;
442 i_SqlTyp
[ 6 ] = SQL_C_DEFAULT
; s_SqlTyp
[ 6 ] = "SQL_C_DEFAULT" ;
443 i_SqlTyp
[ 7 ] = SQL_C_DOUBLE
; s_SqlTyp
[ 7 ] = "SQL_C_DOUBLE" ;
444 i_SqlTyp
[ 8 ] = SQL_C_FLOAT
; s_SqlTyp
[ 8 ] = "SQL_C_FLOAT" ;
445 i_SqlTyp
[ 9 ] = SQL_C_LONG
; s_SqlTyp
[ 9 ] = "SQL_C_LONG" ;
446 i_SqlTyp
[ 10 ] = SQL_C_SHORT
; s_SqlTyp
[ 10 ] = "SQL_C_SHORT" ;
447 i_SqlTyp
[ 11 ] = SQL_C_SLONG
; s_SqlTyp
[ 11 ] = "SQL_C_SLONG" ;
448 i_SqlTyp
[ 12 ] = SQL_C_SSHORT
; s_SqlTyp
[ 12 ] = "SQL_C_SSHORT" ;
449 i_SqlTyp
[ 13 ] = SQL_C_STINYINT
; s_SqlTyp
[ 13 ] = "SQL_C_STINYINT" ;
450 i_SqlTyp
[ 14 ] = SQL_C_TIME
; s_SqlTyp
[ 14 ] = "SQL_C_TIME" ;
451 i_SqlTyp
[ 15 ] = SQL_C_TIMESTAMP
; s_SqlTyp
[ 15 ] = "SQL_C_TIMESTAMP" ;
452 i_SqlTyp
[ 16 ] = SQL_C_TINYINT
; s_SqlTyp
[ 16 ] = "SQL_C_TINYINT" ;
453 i_SqlTyp
[ 17 ] = SQL_C_ULONG
; s_SqlTyp
[ 17 ] = "SQL_C_ULONG" ;
454 i_SqlTyp
[ 18 ] = SQL_C_USHORT
; s_SqlTyp
[ 18 ] = "SQL_C_USHORT" ;
455 i_SqlTyp
[ 19 ] = SQL_C_UTINYINT
; s_SqlTyp
[ 19 ] = "SQL_C_UTINYINT" ;
456 i_SqlTyp
[ 20 ] = SQL_VARCHAR
; s_SqlTyp
[ 20 ] = "SQL_VARCHAR" ;
457 i_SqlTyp
[ 21 ] = SQL_NUMERIC
; s_SqlTyp
[ 21 ] = "SQL_NUMERIC" ;
458 i_SqlTyp
[ 22 ] = SQL_LONGVARCHAR
; s_SqlTyp
[ 22 ] = "SQL_LONGVARCHAR" ;
459 i_SqlTyp
[ 23 ] = SQL_REAL
; s_SqlTyp
[ 23 ] = "SQL_REAL" ;
460 i_SqlTyp
[ 0 ] = 23 ; s_SqlTyp
[ 0 ] = "" ;
462 //----------------------------------------------------------------------------------------
463 void BrowserDB :: OnFilldbTyp ()
465 i_dbTyp
[ 1 ] = DB_DATA_TYPE_VARCHAR
; s_dbTyp
[ 1 ] = "DB_DATA_TYPE_VARCHAR" ;
466 i_dbTyp
[ 2 ] = DB_DATA_TYPE_INTEGER
; s_dbTyp
[ 2 ] = "DB_DATA_TYPE_INTEGER" ;
467 i_dbTyp
[ 3 ] = DB_DATA_TYPE_FLOAT
; s_dbTyp
[ 3 ] = "DB_DATA_TYPE_FLOAT" ;
468 i_dbTyp
[ 4 ] = DB_DATA_TYPE_DATE
; s_dbTyp
[ 4 ] = "DB_DATA_TYPE_DATE" ;
469 i_dbTyp
[ 0 ] = 4 ; s_dbTyp
[ 0 ] = "" ;
471 //----------------------------------------------------------------------------------------