]>
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 //----------------------------------------------------------------------------------------
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" );
126 p_Dlg
-> s_DSN
= ODBCSource
;
127 p_Dlg
-> s_User
= UserName
;
128 p_Dlg
-> s_Password
= Password
;
133 if ( p_Dlg
-> ShowModal () == wxID_OK
)
135 ( pDoc
-> p_DSN
+ i_Which
)-> Usr
= p_Dlg
-> s_User
;
136 ( pDoc
-> p_DSN
+ i_Which
)-> Pas
= p_Dlg
-> s_Password
;
137 UserName
= p_Dlg
-> s_User
;
138 Password
= p_Dlg
-> s_Password
;
144 //--------------------------------------------------------------------------------------
145 strcpy ( ConnectInf
. Dsn
, ODBCSource
); // ODBC data source name (created with ODBC Administrator under Win95/NT)
146 strcpy ( ConnectInf
. Uid
, UserName
); // database username - must already exist in the data source
147 strcpy ( ConnectInf
. AuthStr
, Password
); // password database username
148 db_BrowserDB
= GetDbConnection (& ConnectInf
);
149 // wxLogMessage(">>>%s<<<>>>%s<<<",UserName.c_str(),Password.c_str());
150 if ( db_BrowserDB
== NULL
)
152 strcpy ( ConnectInf
. Dsn
, "" );
153 strcpy ( ConnectInf
. Uid
, "" );
154 strcpy ( ConnectInf
. AuthStr
, "" );
157 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)" ));
158 wxLogMessage ( _ ( "-I-> BrowserDB::OnStartDB( %s ) : End " ), ODBCSource
. c_str ());
162 //--------------------------------------------------------------------------------------
165 Temp1
= db_BrowserDB
-> GetDatabaseName ();
166 Temp2
= db_BrowserDB
-> GetDataSource ();
167 wxLogMessage ( _ ( "-I-> BrowserDB::OnGetDataSourceODBC() - DatabaseName( %s ) ; DataSource( %s )" ), Temp1
. c_str (), Temp2
. c_str ());
168 wxLogMessage ( _ ( "-I-> BrowserDB::OnStartDB( %s ) : End " ), ODBCSource
. c_str ());
173 //----------------------------------------------------------------------------------------
174 bool BrowserDB :: OnCloseDB ( int Quite
)
177 wxLogMessage ( _ ( "-I-> BrowserDB::OnCloseDB() : Begin " ));
180 db_BrowserDB
-> Close ();
181 FreeDbConnection ( db_BrowserDB
);
183 // Free Environment Handle that ODBC uses
184 if ( SQLFreeEnv (& ConnectInf
. Henv
) != SQL_SUCCESS
)
186 // Error freeing environment handle
191 wxLogMessage ( _ ( " \n -I-> BrowserDB::OnCloseDB() : End " ));
194 //----------------------------------------------------------------------------------------
195 bool BrowserDB :: OnGetNext ( int Cols
, int Quite
)
204 TIMESTAMP_STRUCT t_temp
;
206 //-----------------------------
207 if (! db_BrowserDB
-> GetNext ())
210 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetNext - ODBC-Error with GetNext \n -E-> " ));
211 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
219 strcpy (( cl_BrowserDB
+ i
)-> tableName
, "-E->" );
220 i_dbDataType
= ( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
;
221 if ( i_dbDataType
== 0 ) // Filter unsupported dbDataTypes
223 if ((( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_VARCHAR
) || (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_LONGVARCHAR
))
224 i_dbDataType
= DB_DATA_TYPE_VARCHAR
;
225 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_C_DATE
)
226 i_dbDataType
= DB_DATA_TYPE_DATE
;
227 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_C_BIT
)
228 i_dbDataType
= DB_DATA_TYPE_INTEGER
;
229 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_NUMERIC
)
230 i_dbDataType
= DB_DATA_TYPE_VARCHAR
;
231 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_REAL
)
232 i_dbDataType
= DB_DATA_TYPE_FLOAT
;
234 if (( i_dbDataType
== DB_DATA_TYPE_INTEGER
) && (( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
== SQL_C_DOUBLE
))
236 i_dbDataType
= DB_DATA_TYPE_FLOAT
;
240 case DB_DATA_TYPE_VARCHAR
:
242 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
,& s_temp
, sizeof ( s_temp
), & cb
))
244 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetNext - ODBC-Error with GetNext of > %s <. \n -E-> " ),( cl_BrowserDB
+ i
)-> tableName
);
245 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
248 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, s_temp
);
249 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
251 case DB_DATA_TYPE_INTEGER
:
253 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
,& l_temp
, sizeof ( l_temp
), & cb
))
255 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n -E-> " ));
256 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
260 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, l_temp
);
261 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
264 case DB_DATA_TYPE_FLOAT
:
266 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
,& f_temp
, sizeof ( f_temp
), & cb
))
268 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n -E-> " ));
269 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
274 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, f_temp
);
275 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
278 case DB_DATA_TYPE_DATE
:
279 t_temp
. day
= t_temp
. month
= t_temp
. year
= t_temp
. hour
= t_temp
. minute
= t_temp
. second
= t_temp
. fraction
= 0 ;
280 if (! db_BrowserDB
-> GetData ( i
+ 1 ,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
,& t_temp
, sizeof ( t_temp
), & cb
))
282 Temp0
. Printf ( _ ( " \n -E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n -E-> " ));
283 Temp0
+= GetExtendedDBErrorMsg ( __FILE__
, __LINE__
);
287 // i_Nation = 0 = timestamp , 1=EU, 2=UK, 3=International, 4=US
288 if ((( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 0 ) || // TS YYYY-MM-DD
289 (( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 3 )) // IT YYYY-MM-DD
291 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, t_temp
. year
, t_temp
. month
, t_temp
. day
,
292 t_temp
. hour
, t_temp
. minute
, t_temp
. second
, t_temp
. fraction
);
293 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
295 if ((( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 1 ) || // EU DD.MM.YYYY
296 (( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 2 )) // UK DD/MM/YYYY
298 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, t_temp
. day
, t_temp
. month
, t_temp
. year
,
299 t_temp
. hour
, t_temp
. minute
, t_temp
. second
, t_temp
. fraction
);
300 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
302 if (( cl_BrowserDB
-> pColFor
+ i
)-> i_Nation
== 3 ) // US MM/DD/YYYY
304 Temp0
. Printf (( cl_BrowserDB
-> pColFor
+ i
)-> s_Field
, t_temp
. month
, t_temp
. day
, t_temp
. year
,
305 t_temp
. hour
, t_temp
. minute
, t_temp
. second
, t_temp
. fraction
);
306 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
314 Temp0
= ( cl_BrowserDB
+ i
)-> colName
;
315 wxLogMessage ( _ ( "-E-> BrowserDB::OnGetNext - DB_DATA_TYPE_?? ( %d ) in Col( %s )" ),( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
, Temp0
. c_str ());
319 Temp0
. Printf ( _ ( "-E-> unknown Format( %d ) - sql( %d )" ),( cl_BrowserDB
-> pColFor
+ i
)-> i_dbDataType
,( cl_BrowserDB
-> pColFor
+ i
)-> i_sqlDataType
);
320 strcpy (( cl_BrowserDB
+ i
)-> tableName
, Temp0
. c_str ());
325 // wxLogMessage("-E-> BrowserDB::OnGetNext - End");
328 //----------------------------------------------------------------------------------------
329 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 " ), tb_Name
. c_str (), i_Records
);
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 "),SQLStmt.c_str());
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 //----------------------------------------------------------------------------------------