1 ///////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxWidgets database demo app
4 // Author: George Tasker
8 // Copyright: (c) 1998 Remstar International, Inc.
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
15 This sample program demonstrates the cross-platform ODBC database classes
16 donated by the development team at Remstar International.
18 The table this sample is based on is developer contact table, and shows
19 some of the simple uses of the database classes wxDb and wxDbTable.
25 #pragma implementation "dbtest.h"
28 #include "wx/wxprec.h"
38 #if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMAC__)
42 #include <stdio.h> /* Included strictly for reading the text file with the database parameters */
44 //#include "wx/db.h" /* Required in the file which will get the data source connection */
45 //#include "wx/dbtable.h" /* Has the wxDbTable object from which all data objects will inherit their data table functionality */
47 //extern wxDbList WXDLLEXPORT *PtrBegDbList; /* from db.cpp, used in getting back error results from db connections */
51 #include "wx/generic/gridctrl.h"
52 #include "wx/dbgrid.h"
57 #include "dbtest.h" /* Header file for this demonstration program */
58 #include "listdb.h" /* Code to support the "Lookup" button on the editor dialog */
60 IMPLEMENT_APP(DatabaseDemoApp
)
62 extern wxChar ListDB_Selection
[]; /* Used to return the first column value for the selected line from the listDB routines */
63 extern wxChar ListDB_Selection2
[]; /* Used to return the second column value for the selected line from the listDB routines */
67 #error Sample cannot be compiled unless setup.h has wxUSE_ODBC set to 1
71 bool DataTypeSupported(wxDb
*pDb
, SWORD datatype
, wxString
*nativeDataTypeName
)
73 wxDbSqlTypeInfo sqlTypeInfo
;
75 bool breakpoint
= false;
77 *nativeDataTypeName
= wxEmptyString
;
78 if (pDb
->GetDataTypeInfo(datatype
, sqlTypeInfo
))
80 *nativeDataTypeName
= sqlTypeInfo
.TypeName
;
86 } // GetDataTypesSupported();
90 void CheckSupportForAllDataTypes(wxDb
*pDb
)
92 wxString nativeDataTypeName
;
94 wxLogMessage(wxT("\nThe following datatypes are supported by the\ndatabase you are currently connected to:"));
96 if (DataTypeSupported(pDb
,SQL_C_BINARY
, &nativeDataTypeName
))
98 nativeDataTypeName
= wxT("SQL_C_BINARY (") + nativeDataTypeName
;
99 nativeDataTypeName
+= wxT(")\n");
100 wxLogMessage(nativeDataTypeName
);
104 if (DataTypeSupported(pDb
,SQL_C_BIT
, &nativeDataTypeName
))
106 nativeDataTypeName
= wxT("SQL_C_BIT (") + nativeDataTypeName
;
107 nativeDataTypeName
+= wxT(")\n");
108 wxLogMessage(nativeDataTypeName
);
111 #ifdef SQL_C_BOOKMARK
112 if (DataTypeSupported(pDb
,SQL_C_BOOKMARK
, &nativeDataTypeName
))
114 nativeDataTypeName
= wxT("SQL_C_BOOKMARK (") + nativeDataTypeName
;
115 nativeDataTypeName
+= wxT(")\n");
116 wxLogMessage(nativeDataTypeName
);
120 if (DataTypeSupported(pDb
,SQL_C_CHAR
, &nativeDataTypeName
))
122 nativeDataTypeName
= wxT("SQL_C_CHAR (") + nativeDataTypeName
;
123 nativeDataTypeName
+= wxT(")\n");
124 wxLogMessage(nativeDataTypeName
);
128 if (DataTypeSupported(pDb
,SQL_C_DATE
, &nativeDataTypeName
))
130 nativeDataTypeName
= wxT("SQL_C_DATE (") + nativeDataTypeName
;
131 nativeDataTypeName
+= wxT(")\n");
132 wxLogMessage(nativeDataTypeName
);
136 if (DataTypeSupported(pDb
,SQL_C_DEFAULT
, &nativeDataTypeName
))
138 nativeDataTypeName
= wxT("SQL_C_DEFAULT (") + nativeDataTypeName
;
139 nativeDataTypeName
+= wxT(")\n");
140 wxLogMessage(nativeDataTypeName
);
144 if (DataTypeSupported(pDb
,SQL_C_DOUBLE
, &nativeDataTypeName
))
146 nativeDataTypeName
= wxT("SQL_C_DOUBLE (") + nativeDataTypeName
;
147 nativeDataTypeName
+= wxT(")\n");
148 wxLogMessage(nativeDataTypeName
);
152 if (DataTypeSupported(pDb
,SQL_C_FLOAT
, &nativeDataTypeName
))
154 nativeDataTypeName
= wxT("SQL_C_FLOAT (") + nativeDataTypeName
;
155 nativeDataTypeName
+= wxT(")\n");
156 wxLogMessage(nativeDataTypeName
);
160 if (DataTypeSupported(pDb
,SQL_C_GUID
, &nativeDataTypeName
))
162 nativeDataTypeName
= wxT("SQL_C_GUID (") + nativeDataTypeName
;
163 nativeDataTypeName
+= wxT(")\n");
164 wxLogMessage(nativeDataTypeName
);
167 #ifdef SQL_C_INTERVAL_DAY
168 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_DAY
, &nativeDataTypeName
))
170 nativeDataTypeName
= wxT("SQL_C_INTERVAL_DAY (") + nativeDataTypeName
;
171 nativeDataTypeName
+= wxT(")\n");
172 wxLogMessage(nativeDataTypeName
);
175 #ifdef SQL_C_INTERVAL_DAY_TO_HOUR
176 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_DAY_TO_HOUR
, &nativeDataTypeName
))
178 nativeDataTypeName
= wxT("SQL_C_INTERVAL_DAY_TO_HOUR (") + nativeDataTypeName
;
179 nativeDataTypeName
+= wxT(")\n");
180 wxLogMessage(nativeDataTypeName
);
183 #ifdef SQL_C_INTERVAL_DAY_TO_MINUTE
184 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_DAY_TO_MINUTE
, &nativeDataTypeName
))
186 nativeDataTypeName
= wxT("SQL_C_INTERVAL_DAY_TO_MINUTE (") + nativeDataTypeName
;
187 nativeDataTypeName
+= wxT(")\n");
188 wxLogMessage(nativeDataTypeName
);
191 #ifdef SQL_C_INTERVAL_DAY_TO_SECOND
192 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_DAY_TO_SECOND
, &nativeDataTypeName
))
194 nativeDataTypeName
= wxT("SQL_C_INTERVAL_DAY_TO_SECOND (") + nativeDataTypeName
;
195 nativeDataTypeName
+= wxT(")\n");
196 wxLogMessage(nativeDataTypeName
);
199 #ifdef SQL_C_INTERVAL_HOUR
200 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_HOUR
, &nativeDataTypeName
))
202 nativeDataTypeName
= wxT("SQL_C_INTERVAL_HOUR (") + nativeDataTypeName
;
203 nativeDataTypeName
+= wxT(")\n");
204 wxLogMessage(nativeDataTypeName
);
207 #ifdef SQL_C_INTERVAL_HOUR_TO_MINUTE
208 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_HOUR_TO_MINUTE
, &nativeDataTypeName
))
210 nativeDataTypeName
= wxT("SQL_C_INTERVAL_HOUR_TO_MINUTE (") + nativeDataTypeName
;
211 nativeDataTypeName
+= wxT(")\n");
212 wxLogMessage(nativeDataTypeName
);
215 #ifdef SQL_C_INTERVAL_HOUR_TO_SECOND
216 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_HOUR_TO_SECOND
, &nativeDataTypeName
))
218 nativeDataTypeName
= wxT("SQL_C_INTERVAL_HOUR_TO_SECOND (") + nativeDataTypeName
;
219 nativeDataTypeName
+= wxT(")\n");
220 wxLogMessage(nativeDataTypeName
);
223 #ifdef SQL_C_INTERVAL_MINUTE
224 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_MINUTE
, &nativeDataTypeName
))
226 nativeDataTypeName
= wxT("SQL_C_INTERVAL_MINUTE (") + nativeDataTypeName
;
227 nativeDataTypeName
+= wxT(")\n");
228 wxLogMessage(nativeDataTypeName
);
231 #ifdef SQL_C_INTERVAL_MINUTE_TO_SECOND
232 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_MINUTE_TO_SECOND
, &nativeDataTypeName
))
234 nativeDataTypeName
= wxT("SQL_C_INTERVAL_MINUTE_TO_SECOND (") + nativeDataTypeName
;
235 nativeDataTypeName
+= wxT(")\n");
236 wxLogMessage(nativeDataTypeName
);
239 #ifdef SQL_C_INTERVAL_MONTH
240 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_MONTH
, &nativeDataTypeName
))
242 nativeDataTypeName
= wxT("SQL_C_INTERVAL_MONTH (") + nativeDataTypeName
;
243 nativeDataTypeName
+= wxT(")\n");
244 wxLogMessage(nativeDataTypeName
);
247 #ifdef SQL_C_INTERVAL_SECOND
248 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_SECOND
, &nativeDataTypeName
))
250 nativeDataTypeName
= wxT("SQL_C_INTERVAL_SECOND (") + nativeDataTypeName
;
251 nativeDataTypeName
+= wxT(")\n");
252 wxLogMessage(nativeDataTypeName
);
255 #ifdef SQL_C_INTERVAL_YEAR
256 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_YEAR
, &nativeDataTypeName
))
258 nativeDataTypeName
= wxT("SQL_C_INTERVAL_YEAR (") + nativeDataTypeName
;
259 nativeDataTypeName
+= wxT(")\n");
260 wxLogMessage(nativeDataTypeName
);
263 #ifdef SQL_C_INTERVAL_YEAR_TO_MONTH
264 if (DataTypeSupported(pDb
,SQL_C_INTERVAL_YEAR_TO_MONTH
, &nativeDataTypeName
))
266 nativeDataTypeName
= wxT("SQL_C_INTERVAL_YEAR_TO_MONTH (") + nativeDataTypeName
;
267 nativeDataTypeName
+= wxT(")\n");
268 wxLogMessage(nativeDataTypeName
);
272 if (DataTypeSupported(pDb
,SQL_C_LONG
, &nativeDataTypeName
))
274 nativeDataTypeName
= wxT("SQL_C_LONG (") + nativeDataTypeName
;
275 nativeDataTypeName
+= wxT(")\n");
276 wxLogMessage(nativeDataTypeName
);
280 if (DataTypeSupported(pDb
,SQL_C_NUMERIC
, &nativeDataTypeName
))
282 nativeDataTypeName
= wxT("SQL_C_NUMERIC (") + nativeDataTypeName
;
283 nativeDataTypeName
+= wxT(")\n");
284 wxLogMessage(nativeDataTypeName
);
288 if (DataTypeSupported(pDb
,SQL_C_SBIGINT
, &nativeDataTypeName
))
290 nativeDataTypeName
= wxT("SQL_C_SBIGINT (") + nativeDataTypeName
;
291 nativeDataTypeName
+= wxT(")\n");
292 wxLogMessage(nativeDataTypeName
);
296 if (DataTypeSupported(pDb
,SQL_C_SHORT
, &nativeDataTypeName
))
298 nativeDataTypeName
= wxT("SQL_C_SHORT (") + nativeDataTypeName
;
299 nativeDataTypeName
+= wxT(")\n");
300 wxLogMessage(nativeDataTypeName
);
304 if (DataTypeSupported(pDb
,SQL_C_SLONG
, &nativeDataTypeName
))
306 nativeDataTypeName
= wxT("SQL_C_SLONG (") + nativeDataTypeName
;
307 nativeDataTypeName
+= wxT(")\n");
308 wxLogMessage(nativeDataTypeName
);
312 if (DataTypeSupported(pDb
,SQL_C_SSHORT
, &nativeDataTypeName
))
314 nativeDataTypeName
= wxT("SQL_C_SSHORT (") + nativeDataTypeName
;
315 nativeDataTypeName
+= wxT(")\n");
316 wxLogMessage(nativeDataTypeName
);
319 #ifdef SQL_C_STINYINT
320 if (DataTypeSupported(pDb
,SQL_C_STINYINT
, &nativeDataTypeName
))
322 nativeDataTypeName
= wxT("SQL_C_STINYINT (") + nativeDataTypeName
;
323 nativeDataTypeName
+= wxT(")\n");
324 wxLogMessage(nativeDataTypeName
);
328 if (DataTypeSupported(pDb
,SQL_C_TIME
, &nativeDataTypeName
))
330 nativeDataTypeName
= wxT("SQL_C_TIME (") + nativeDataTypeName
;
331 nativeDataTypeName
+= wxT(")\n");
332 wxLogMessage(nativeDataTypeName
);
335 #ifdef SQL_C_TIMESTAMP
336 if (DataTypeSupported(pDb
,SQL_C_TIMESTAMP
, &nativeDataTypeName
))
338 nativeDataTypeName
= wxT("SQL_C_TIMESTAMP (") + nativeDataTypeName
;
339 nativeDataTypeName
+= wxT(")\n");
340 wxLogMessage(nativeDataTypeName
);
344 if (DataTypeSupported(pDb
,SQL_C_TINYINT
, &nativeDataTypeName
))
346 nativeDataTypeName
= wxT("SQL_C_TINYINT (") + nativeDataTypeName
;
347 nativeDataTypeName
+= wxT(")\n");
348 wxLogMessage(nativeDataTypeName
);
351 #ifdef SQL_C_TYPE_DATE
352 if (DataTypeSupported(pDb
,SQL_C_TYPE_DATE
, &nativeDataTypeName
))
354 nativeDataTypeName
= wxT("SQL_C_TYPE_DATE (") + nativeDataTypeName
;
355 nativeDataTypeName
+= wxT(")\n");
356 wxLogMessage(nativeDataTypeName
);
359 #ifdef SQL_C_TYPE_TIME
360 if (DataTypeSupported(pDb
,SQL_C_TYPE_TIME
, &nativeDataTypeName
))
362 nativeDataTypeName
= wxT("SQL_C_TYPE_TIME (") + nativeDataTypeName
;
363 nativeDataTypeName
+= wxT(")\n");
364 wxLogMessage(nativeDataTypeName
);
367 #ifdef SQL_C_TYPE_TIMESTAMP
368 if (DataTypeSupported(pDb
,SQL_C_TYPE_TIMESTAMP
, &nativeDataTypeName
))
370 nativeDataTypeName
= wxT("SQL_C_TYPE_TIMESTAMP (") + nativeDataTypeName
;
371 nativeDataTypeName
+= wxT(")\n");
372 wxLogMessage(nativeDataTypeName
);
376 if (DataTypeSupported(pDb
,SQL_C_UBIGINT
, &nativeDataTypeName
))
378 nativeDataTypeName
= wxT("SQL_C_UBIGINT (") + nativeDataTypeName
;
379 nativeDataTypeName
+= wxT(")\n");
380 wxLogMessage(nativeDataTypeName
);
384 if (DataTypeSupported(pDb
,SQL_C_ULONG
, &nativeDataTypeName
))
386 nativeDataTypeName
= wxT("SQL_C_ULONG (") + nativeDataTypeName
;
387 nativeDataTypeName
+= wxT(")\n");
388 wxLogMessage(nativeDataTypeName
);
392 if (DataTypeSupported(pDb
,SQL_C_USHORT
, &nativeDataTypeName
))
394 nativeDataTypeName
= wxT("SQL_C_USHORT (") + nativeDataTypeName
;
395 nativeDataTypeName
+= wxT(")\n");
396 wxLogMessage(nativeDataTypeName
);
399 #ifdef SQL_C_UTINYINT
400 if (DataTypeSupported(pDb
,SQL_C_UTINYINT
, &nativeDataTypeName
))
402 nativeDataTypeName
= wxT("SQL_C_UTINYINT (") + nativeDataTypeName
;
403 nativeDataTypeName
+= wxT(")\n");
404 wxLogMessage(nativeDataTypeName
);
407 #ifdef SQL_C_VARBOOKMARK
408 if (DataTypeSupported(pDb
,SQL_C_VARBOOKMARK
, &nativeDataTypeName
))
410 nativeDataTypeName
= wxT("SQL_C_VARBOOKMARK (") + nativeDataTypeName
;
411 nativeDataTypeName
+= wxT(")\n");
412 wxLogMessage(nativeDataTypeName
);
416 // Extended SQL types
418 if (DataTypeSupported(pDb
,SQL_DATE
, &nativeDataTypeName
))
420 nativeDataTypeName
= wxT("SQL_DATE (") + nativeDataTypeName
;
421 nativeDataTypeName
+= wxT(")\n");
422 wxLogMessage(nativeDataTypeName
);
426 if (DataTypeSupported(pDb
,SQL_INTERVAL
, &nativeDataTypeName
))
428 nativeDataTypeName
= wxT("SQL_INTERVAL (") + nativeDataTypeName
;
429 nativeDataTypeName
+= wxT(")\n");
430 wxLogMessage(nativeDataTypeName
);
434 if (DataTypeSupported(pDb
,SQL_TIME
, &nativeDataTypeName
))
436 nativeDataTypeName
= wxT("SQL_TIME (") + nativeDataTypeName
;
437 nativeDataTypeName
+= wxT(")\n");
438 wxLogMessage(nativeDataTypeName
);
442 if (DataTypeSupported(pDb
,SQL_TIMESTAMP
, &nativeDataTypeName
))
444 nativeDataTypeName
= wxT("SQL_TIMESTAMP (") + nativeDataTypeName
;
445 nativeDataTypeName
+= wxT(")\n");
446 wxLogMessage(nativeDataTypeName
);
449 #ifdef SQL_LONGVARCHAR
450 if (DataTypeSupported(pDb
,SQL_LONGVARCHAR
, &nativeDataTypeName
))
452 nativeDataTypeName
= wxT("SQL_LONGVARCHAR (") + nativeDataTypeName
;
453 nativeDataTypeName
+= wxT(")\n");
454 wxLogMessage(nativeDataTypeName
);
458 if (DataTypeSupported(pDb
,SQL_BINARY
, &nativeDataTypeName
))
460 nativeDataTypeName
= wxT("SQL_BINARY (") + nativeDataTypeName
;
461 nativeDataTypeName
+= wxT(")\n");
462 wxLogMessage(nativeDataTypeName
);
466 if (DataTypeSupported(pDb
,SQL_VARBINARY
, &nativeDataTypeName
))
468 nativeDataTypeName
= wxT("SQL_VARBINARY (") + nativeDataTypeName
;
469 nativeDataTypeName
+= wxT(")\n");
470 wxLogMessage(nativeDataTypeName
);
473 #ifdef SQL_LONGVARBINARY
474 if (DataTypeSupported(pDb
,SQL_LONGVARBINARY
, &nativeDataTypeName
))
476 nativeDataTypeName
= wxT("SQL_LOGVARBINARY (") + nativeDataTypeName
;
477 nativeDataTypeName
+= wxT(")\n");
478 wxLogMessage(nativeDataTypeName
);
482 if (DataTypeSupported(pDb
,SQL_BIGINT
, &nativeDataTypeName
))
484 nativeDataTypeName
= wxT("SQL_BIGINT (") + nativeDataTypeName
;
485 nativeDataTypeName
+= wxT(")\n");
486 wxLogMessage(nativeDataTypeName
);
490 if (DataTypeSupported(pDb
,SQL_TINYINT
, &nativeDataTypeName
))
492 nativeDataTypeName
= wxT("SQL_TINYINT (") + nativeDataTypeName
;
493 nativeDataTypeName
+= wxT(")\n");
494 wxLogMessage(nativeDataTypeName
);
498 if (DataTypeSupported(pDb
,SQL_BIT
, &nativeDataTypeName
))
500 nativeDataTypeName
= wxT("SQL_BIT (") + nativeDataTypeName
;
501 nativeDataTypeName
+= wxT(")\n");
502 wxLogMessage(nativeDataTypeName
);
506 if (DataTypeSupported(pDb
,SQL_GUID
, &nativeDataTypeName
))
508 nativeDataTypeName
= wxT("SQL_GUID (") + nativeDataTypeName
;
509 nativeDataTypeName
+= wxT(")\n");
510 wxLogMessage(nativeDataTypeName
);
515 if (DataTypeSupported(pDb
,SQL_CHAR
, &nativeDataTypeName
))
517 nativeDataTypeName
= wxT("SQL_CHAR (") + nativeDataTypeName
;
518 nativeDataTypeName
+= wxT(")\n");
519 wxLogMessage(nativeDataTypeName
);
523 if (DataTypeSupported(pDb
,SQL_INTEGER
, &nativeDataTypeName
))
525 nativeDataTypeName
= wxT("SQL_INTEGER (") + nativeDataTypeName
;
526 nativeDataTypeName
+= wxT(")\n");
527 wxLogMessage(nativeDataTypeName
);
531 if (DataTypeSupported(pDb
,SQL_SMALLINT
, &nativeDataTypeName
))
533 nativeDataTypeName
= wxT("SQL_SAMLLINT (") + nativeDataTypeName
;
534 nativeDataTypeName
+= wxT(")\n");
535 wxLogMessage(nativeDataTypeName
);
539 if (DataTypeSupported(pDb
,SQL_REAL
, &nativeDataTypeName
))
541 nativeDataTypeName
= wxT("SQL_REAL (") + nativeDataTypeName
;
542 nativeDataTypeName
+= wxT(")\n");
543 wxLogMessage(nativeDataTypeName
);
547 if (DataTypeSupported(pDb
,SQL_DOUBLE
, &nativeDataTypeName
))
549 nativeDataTypeName
= wxT("SQL_DOUBLE (") + nativeDataTypeName
;
550 nativeDataTypeName
+= wxT(")\n");
551 wxLogMessage(nativeDataTypeName
);
555 if (DataTypeSupported(pDb
,SQL_NUMERIC
, &nativeDataTypeName
))
557 nativeDataTypeName
= wxT("SQL_NUMERIC (") + nativeDataTypeName
;
558 nativeDataTypeName
+= wxT(")\n");
559 wxLogMessage(nativeDataTypeName
);
563 if (DataTypeSupported(pDb
,SQL_DATE
, &nativeDataTypeName
))
565 nativeDataTypeName
= wxT("SQL_DATE (") + nativeDataTypeName
;
566 nativeDataTypeName
+= wxT(")\n");
567 wxLogMessage(nativeDataTypeName
);
571 if (DataTypeSupported(pDb
,SQL_TIME
, &nativeDataTypeName
))
573 nativeDataTypeName
= wxT("SQL_TIME (") + nativeDataTypeName
;
574 nativeDataTypeName
+= wxT(")\n");
575 wxLogMessage(nativeDataTypeName
);
579 if (DataTypeSupported(pDb
,SQL_TIMESTAMP
, &nativeDataTypeName
))
581 nativeDataTypeName
= wxT("SQL_TIMESTAMP (") + nativeDataTypeName
;
582 nativeDataTypeName
+= wxT(")\n");
583 wxLogMessage(nativeDataTypeName
);
587 if (DataTypeSupported(pDb
,SQL_VARCHAR
, &nativeDataTypeName
))
589 nativeDataTypeName
= wxT("SQL_VARCHAR (") + nativeDataTypeName
;
590 nativeDataTypeName
+= wxT(")\n");
591 wxLogMessage(nativeDataTypeName
);
597 if (DataTypeSupported(pDb
,SQL_C_TCHAR
, &nativeDataTypeName
))
599 nativeDataTypeName
= wxT("SQL_C_TCHAR (") + nativeDataTypeName
;
600 nativeDataTypeName
+= wxT(")\n");
601 wxLogMessage(nativeDataTypeName
);
605 wxLogMessage(wxT("Done\n"));
606 } // CheckSupportForAllDataTypes()
609 bool DatabaseDemoApp::OnInit()
614 // Create the main frame window
615 DemoFrame
= new DatabaseDemoFrame(NULL
, wxT("wxWidgets Database Demo"), wxPoint(50, 50), wxSize(537, 480));
618 DemoFrame
->SetIcon(wxICON(db
));
621 wxMenu
*file_menu
= new wxMenu
;
622 file_menu
->Append(FILE_CREATE_ID
, wxT("&Create CONTACT table"));
623 file_menu
->Append(FILE_RECREATE_TABLE
, wxT("&Recreate CONTACT table"));
624 file_menu
->Append(FILE_RECREATE_INDEXES
, wxT("&Recreate CONTACT indexes"));
626 file_menu
->Append(FILE_DBGRID_TABLE
, wxT("&Open DB Grid example"));
628 file_menu
->Append(FILE_EXIT
, wxT("E&xit"));
630 wxMenu
*edit_menu
= new wxMenu
;
631 edit_menu
->Append(EDIT_PARAMETERS
, wxT("&Parameters..."));
633 wxMenu
*help_menu
= new wxMenu
;
634 help_menu
->Append(HELP_ABOUT
, wxT("&About"));
636 wxMenuBar
*menu_bar
= new wxMenuBar
;
637 menu_bar
->Append(file_menu
, wxT("&File"));
638 menu_bar
->Append(edit_menu
, wxT("&Edit"));
639 menu_bar
->Append(help_menu
, wxT("&Help"));
640 DemoFrame
->SetMenuBar(menu_bar
);
642 params
.ODBCSource
[0] = 0;
643 params
.UserName
[0] = 0;
644 params
.Password
[0] = 0;
645 params
.DirPath
[0] = 0;
648 DemoFrame
->Show(true);
650 // Passing NULL for the SQL environment handle causes
651 // the wxDbConnectInf constructor to obtain a handle
654 // WARNING: Be certain that you do not free this handle
655 // directly with SQLFreeEnv(). Use either the
656 // method ::FreeHenv() or delete the DbConnectInf.
657 DbConnectInf
= new wxDbConnectInf(NULL
, params
.ODBCSource
, params
.UserName
,
658 params
.Password
, params
.DirPath
);
660 if (!DbConnectInf
|| !DbConnectInf
->GetHenv())
662 wxMessageBox(wxT("Unable to define data source connection info."), wxT("DB CONNECTION ERROR..."),wxOK
| wxICON_EXCLAMATION
);
663 wxDELETE(DbConnectInf
);
666 if (!ReadParamFile(params
))
667 DemoFrame
->BuildParameterDialog(NULL
);
669 if (!wxStrlen(params
.ODBCSource
))
671 wxDELETE(DbConnectInf
);
675 DbConnectInf
->SetDsn(params
.ODBCSource
);
676 DbConnectInf
->SetUserID(params
.UserName
);
677 DbConnectInf
->SetPassword(params
.Password
);
678 DbConnectInf
->SetDefaultDir(params
.DirPath
);
680 READONLY_DB
= wxDbGetConnection(DbConnectInf
);
681 if (READONLY_DB
== 0)
683 wxMessageBox(wxT("Unable to connect to the data source.\n\nCheck the name of your data source to verify it has been correctly entered/spelled.\n\nWith some databases, the user name and password must\nbe created with full rights to the CONTACT table prior to making a connection\n(using tools provided by the database manufacturer)"), wxT("DB CONNECTION ERROR..."),wxOK
| wxICON_EXCLAMATION
);
684 DemoFrame
->BuildParameterDialog(NULL
);
685 wxDELETE(DbConnectInf
);
686 wxMessageBox(wxT("Now exiting program.\n\nRestart program to try any new settings."),wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
690 DemoFrame
->BuildEditorDialog();
693 DemoFrame
->Refresh();
696 } // DatabaseDemoApp::OnInit()
700 * Remove CR or CR/LF from a character string.
702 wxChar
* wxRemoveLineTerminator(wxChar
* aString
)
704 int len
= wxStrlen(aString
);
705 while (len
> 0 && (aString
[len
-1] == wxT('\r') || aString
[len
-1] == wxT('\n'))) {
706 aString
[len
-1] = wxT('\0');
713 bool DatabaseDemoApp::ReadParamFile(Cparameters
¶ms
)
716 if ((paramFile
= wxFopen(PARAM_FILENAME
, wxT("r"))) == NULL
)
719 tStr
.Printf(wxT("Unable to open the parameter file '%s' for reading.\n\nYou must specify the data source, user name, and\npassword that will be used and save those settings."),PARAM_FILENAME
);
720 wxMessageBox(tStr
,wxT("File I/O Error..."),wxOK
| wxICON_EXCLAMATION
);
725 wxChar buffer
[1000+1];
726 wxFgets(buffer
, sizeof(params
.ODBCSource
), paramFile
);
727 wxRemoveLineTerminator(buffer
);
728 wxStrcpy(params
.ODBCSource
,buffer
);
730 wxFgets(buffer
, sizeof(params
.UserName
), paramFile
);
731 wxRemoveLineTerminator(buffer
);
732 wxStrcpy(params
.UserName
,buffer
);
734 wxFgets(buffer
, sizeof(params
.Password
), paramFile
);
735 wxRemoveLineTerminator(buffer
);
736 wxStrcpy(params
.Password
,buffer
);
738 wxFgets(buffer
, sizeof(params
.DirPath
), paramFile
);
739 wxRemoveLineTerminator(buffer
);
740 wxStrcpy(params
.DirPath
,buffer
);
745 } // DatabaseDemoApp::ReadParamFile()
748 bool DatabaseDemoApp::WriteParamFile(Cparameters
&WXUNUSED(params
))
751 if ((paramFile
= wxFopen(PARAM_FILENAME
, wxT("wt"))) == NULL
)
754 tStr
.Printf(wxT("Unable to write/overwrite '%s'."),PARAM_FILENAME
);
755 wxMessageBox(tStr
,wxT("File I/O Error..."),wxOK
| wxICON_EXCLAMATION
);
759 wxFputs(wxGetApp().params
.ODBCSource
, paramFile
);
760 wxFputc(wxT('\n'), paramFile
);
761 wxFputs(wxGetApp().params
.UserName
, paramFile
);
762 wxFputc(wxT('\n'), paramFile
);
763 wxFputs(wxGetApp().params
.Password
, paramFile
);
764 wxFputc(wxT('\n'), paramFile
);
765 wxFputs(wxGetApp().params
.DirPath
, paramFile
);
766 wxFputc(wxT('\n'), paramFile
);
770 } // DatabaseDemoApp::WriteParamFile()
773 void DatabaseDemoApp::CreateDataTable(bool recreate
)
777 Ok
= (wxMessageBox(wxT("Any data currently residing in the table will be erased.\n\nAre you sure?"),wxT("Confirm"),wxYES_NO
|wxICON_QUESTION
) == wxYES
);
786 Contact
->GetDb()->RollbackTrans(); // Make sure the current cursor is in a known/stable state
788 if (!Contact
->CreateTable(recreate
))
792 tStr
= wxT("Error creating CONTACTS table.\nTable was not created.\n\n");
793 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),Contact
->GetDb(),__TFILE__
,__LINE__
),
794 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
800 if (!Contact
->CreateIndexes(recreate
))
804 tStr
= wxT("Error creating CONTACTS indexes.\nIndexes will be unavailable.\n\n");
805 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),Contact
->GetDb(),__TFILE__
,__LINE__
),
806 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
815 wxMessageBox(wxT("Table and index(es) were successfully created."),wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
816 } // DatabaseDemoApp::CreateDataTable()
819 BEGIN_EVENT_TABLE(DatabaseDemoFrame
, wxFrame
)
820 EVT_MENU(FILE_CREATE_ID
, DatabaseDemoFrame::OnCreate
)
821 EVT_MENU(FILE_RECREATE_TABLE
, DatabaseDemoFrame::OnRecreateTable
)
822 EVT_MENU(FILE_RECREATE_INDEXES
, DatabaseDemoFrame::OnRecreateIndexes
)
824 EVT_MENU(FILE_DBGRID_TABLE
, DatabaseDemoFrame::OnDbGridTable
)
826 EVT_MENU(FILE_EXIT
, DatabaseDemoFrame::OnExit
)
827 EVT_MENU(EDIT_PARAMETERS
, DatabaseDemoFrame::OnEditParameters
)
828 EVT_MENU(HELP_ABOUT
, DatabaseDemoFrame::OnAbout
)
829 EVT_CLOSE(DatabaseDemoFrame::OnCloseWindow
)
833 // DatabaseDemoFrame constructor
834 DatabaseDemoFrame::DatabaseDemoFrame(wxFrame
*frame
, const wxString
& title
,
835 const wxPoint
& pos
, const wxSize
& size
):
836 wxFrame(frame
, wxID_ANY
, title
, pos
, size
)
838 // Put any code in necessary for initializing the main frame here
843 delete wxLog::SetActiveTarget(new wxLogStderr
);
846 } // DatabaseDemoFrame constructor
848 DatabaseDemoFrame::~DatabaseDemoFrame()
851 delete wxLog::SetActiveTarget(NULL
);
853 } // DatabaseDemoFrame destructor
856 void DatabaseDemoFrame::OnCreate(wxCommandEvent
& WXUNUSED(event
))
858 wxGetApp().CreateDataTable(false);
859 } // DatabaseDemoFrame::OnCreate()
862 void DatabaseDemoFrame::OnRecreateTable(wxCommandEvent
& WXUNUSED(event
))
864 wxGetApp().CreateDataTable(true);
865 } // DatabaseDemoFrame::OnRecreate()
868 void DatabaseDemoFrame::OnRecreateIndexes(wxCommandEvent
& WXUNUSED(event
))
870 wxGetApp().Contact
->GetDb()->RollbackTrans(); // Make sure the current cursor is in a known/stable state
872 if (!wxGetApp().Contact
->CreateIndexes(true))
877 tStr
= wxT("Error creating CONTACTS indexes.\nNew indexes will be unavailable.\n\n");
878 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
879 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
883 wxMessageBox(wxT("Index(es) were successfully recreated."),wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
885 } // DatabaseDemoFrame::OnRecreateIndexes()
889 void DatabaseDemoFrame::OnDbGridTable(wxCommandEvent
& WXUNUSED(event
))
891 DbGridFrame
*frame
= new DbGridFrame(this);
892 if (frame
->Initialize())
899 void DatabaseDemoFrame::OnExit(wxCommandEvent
& WXUNUSED(event
))
902 } // DatabaseDemoFrame::OnExit()
905 void DatabaseDemoFrame::OnEditParameters(wxCommandEvent
& WXUNUSED(event
))
907 if ((pEditorDlg
->mode
!= mCreate
) && (pEditorDlg
->mode
!= mEdit
))
908 BuildParameterDialog(this);
910 wxMessageBox(wxT("Cannot change database parameters while creating or editing a record"),wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
911 } // DatabaseDemoFrame::OnEditParameters()
914 void DatabaseDemoFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
))
916 wxMessageBox(wxT("wxWidgets sample program for database classes\n\nContributed on 27 July 1998"),wxT("About..."),wxOK
| wxICON_INFORMATION
);
917 } // DatabaseDemoFrame::OnAbout()
920 // Put any additional checking necessary to make certain it is alright
921 // to close the program here that is not done elsewhere
922 void DatabaseDemoFrame::OnCloseWindow(wxCloseEvent
& event
)
925 if (pEditorDlg
&& pEditorDlg
->Close())
936 wxDELETE(wxGetApp().Contact
);
938 // This function will close all the connections to the database that have been
939 // previously cached.
940 wxDbCloseConnections();
942 // Deletion of the wxDbConnectInf instance must be the LAST thing done that
943 // has anything to do with the database. Deleting this before disconnecting,
944 // freeing/closing connections, etc will result in a crash!
945 wxDELETE(wxGetApp().DbConnectInf
);
949 } // DatabaseDemoFrame::OnCloseWindow()
952 void DatabaseDemoFrame::BuildEditorDialog()
955 pEditorDlg
= new CeditorDlg(this);
958 pEditorDlg
->Initialize();
959 if (!pEditorDlg
->initialized
)
963 wxMessageBox(wxT("Unable to initialize the editor dialog for some reason"),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
969 wxMessageBox(wxT("Unable to create the editor dialog for some reason"),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
972 } // DatabaseDemoFrame::BuildEditorDialog()
975 void DatabaseDemoFrame::BuildParameterDialog(wxWindow
*parent
)
977 pParamDlg
= new CparameterDlg(parent
);
980 wxMessageBox(wxT("Unable to create the parameter dialog for some reason"),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
981 } // DatabaseDemoFrame::BuildParameterDialog()
985 * Constructor note: If no wxDb object is passed in, a new connection to the database
986 * is created for this instance of Ccontact. This can be a slow process depending
987 * on the database engine being used, and some database engines have a limit on the
988 * number of connections (either hard limits, or license restricted) so care should
989 * be used to use as few connections as is necessary.
991 * IMPORTANT: Objects which share a wxDb pointer are ALL acted upon whenever a member
992 * function of pDb is called (i.e. CommitTrans() or RollbackTrans(), so if modifying
993 * or creating a table objects which use the same pDb, know that all the objects
994 * will be committed or rolled back when any of the objects has this function call made.
996 Ccontact::Ccontact (wxDb
*pwxDb
) : wxDbTable(pwxDb
? pwxDb
: wxDbGetConnection(wxGetApp().DbConnectInf
),
997 CONTACT_TABLE_NAME
, CONTACT_NO_COLS
, wxT(""),
998 !wxDB_QUERY_ONLY
, wxGetApp().DbConnectInf
->GetDefaultDir())
1000 // This is used to represent whether the database connection should be released
1001 // when this instance of the object is deleted. If using the same connection
1002 // for multiple instance of database objects, then the connection should only be
1003 // released when the last database instance using the connection is deleted
1004 freeDbConn
= !pwxDb
;
1007 GetDb()->SetSqlLogging(sqlLogON
);
1011 } // Ccontact Constructor
1014 void Ccontact::Initialize()
1023 JoinDate
.year
= 1980;
1027 JoinDate
.minute
= 0;
1028 JoinDate
.second
= 0;
1029 JoinDate
.fraction
= 0;
1030 NativeLanguage
= langENGLISH
;
1031 IsDeveloper
= false;
1035 } // Ccontact::Initialize
1038 Ccontact::~Ccontact()
1042 if (!wxDbFreeConnection(GetDb()))
1045 tStr
= wxT("Unable to Free the Ccontact data table handle\n\n");
1047 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1048 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1051 } // Ccontract destructor
1055 * Handles setting up all the connections for the interface from the wxDbTable
1056 * functions to interface to the data structure used to store records in
1057 * memory, and for all the column definitions that define the table structure
1059 void Ccontact::SetupColumns()
1061 // NOTE: Columns now are 8 character names, as that is all dBase can support. Longer
1062 // names can be used for other database engines
1063 SetColDefs ( 0,wxT("NAME"), DB_DATA_TYPE_VARCHAR
, Name
, SQL_C_CHAR
, sizeof(Name
), true, true); // Primary index
1064 SetColDefs ( 1,wxT("ADDRESS1"), DB_DATA_TYPE_VARCHAR
, Addr1
, SQL_C_CHAR
, sizeof(Addr1
), false,true);
1065 SetColDefs ( 2,wxT("ADDRESS2"), DB_DATA_TYPE_VARCHAR
, Addr2
, SQL_C_CHAR
, sizeof(Addr2
), false,true);
1066 SetColDefs ( 3,wxT("CITY"), DB_DATA_TYPE_VARCHAR
, City
, SQL_C_CHAR
, sizeof(City
), false,true);
1067 SetColDefs ( 4,wxT("STATE"), DB_DATA_TYPE_VARCHAR
, State
, SQL_C_CHAR
, sizeof(State
), false,true);
1068 SetColDefs ( 5,wxT("POSTCODE"), DB_DATA_TYPE_VARCHAR
, PostalCode
, SQL_C_CHAR
, sizeof(PostalCode
), false,true);
1069 SetColDefs ( 6,wxT("COUNTRY"), DB_DATA_TYPE_VARCHAR
, Country
, SQL_C_CHAR
, sizeof(Country
), false,true);
1070 SetColDefs ( 7,wxT("JOINDATE"), DB_DATA_TYPE_DATE
, &JoinDate
, SQL_C_TIMESTAMP
, sizeof(JoinDate
), false,true);
1071 SetColDefs ( 8,wxT("IS_DEV"), DB_DATA_TYPE_INTEGER
, &IsDeveloper
, SQL_C_BOOLEAN(IsDeveloper
), sizeof(IsDeveloper
), false,true);
1072 SetColDefs ( 9,wxT("CONTRIBS"), DB_DATA_TYPE_INTEGER
, &Contributions
, SQL_C_UTINYINT
, sizeof(Contributions
), false,true);
1073 SetColDefs (10,wxT("LINE_CNT"), DB_DATA_TYPE_INTEGER
, &LinesOfCode
, SQL_C_ULONG
, sizeof(LinesOfCode
), false,true);
1074 SetColDefs (11,wxT("LANGUAGE"), DB_DATA_TYPE_INTEGER
, &NativeLanguage
, SQL_C_ENUM
, sizeof(NativeLanguage
), false,true);
1075 #ifdef wxODBC_BLOB_SUPPORT
1076 SetColDefs (12,wxT("PICTURE"), DB_DATA_TYPE_BLOB
, Picture
, SQL_C_BINARY
, sizeof(Picture
), false,true);
1078 } // Ccontact::SetupColumns
1081 bool Ccontact::CreateIndexes(bool recreate
)
1083 // This index could easily be accomplished with an "orderBy" clause,
1084 // but is done to show how to construct a non-primary index.
1086 wxDbIdxDef idxDef
[2];
1088 wxStrcpy(idxDef
[0].ColName
, wxT("IS_DEV"));
1089 idxDef
[0].Ascending
= true;
1091 wxStrcpy(idxDef
[1].ColName
, wxT("NAME"));
1092 idxDef
[1].Ascending
= true;
1094 indexName
= GetTableName();
1095 indexName
+= wxT("_IDX1");
1097 return CreateIndex(indexName
.c_str(), true, 2, idxDef
, recreate
);
1099 } // Ccontact::CreateIndexes()
1103 * Having a function to do a query on the primary key (and possibly others) is
1104 * very efficient and tighter coding so that it is available where ever the object
1105 * is. Great for use with multiple tables when not using views or outer joins
1107 bool Ccontact::FetchByName(const wxString
&name
)
1109 whereStr
.Printf(wxT("NAME = '%s'"),name
.c_str());
1110 SetWhereClause(whereStr
.c_str());
1111 SetOrderByClause(wxT(""));
1119 } // Ccontact::FetchByName()
1124 * ************* DIALOGS ***************
1129 /* CeditorDlg constructor
1131 * Creates the dialog used for creating/editing/deleting/copying a Ccontact object.
1132 * This dialog actually is drawn in the main frame of the program
1134 * An instance of Ccontact is created - "Contact" - which is used to hold the Ccontact
1135 * object that is currently being worked with.
1138 BEGIN_EVENT_TABLE(CeditorDlg
, wxPanel
)
1139 EVT_BUTTON(wxID_ANY
, CeditorDlg::OnButton
)
1140 EVT_CLOSE(CeditorDlg::OnCloseWindow
)
1143 CeditorDlg::CeditorDlg(wxWindow
*parent
) : wxPanel (parent
, 0, 0, 537, 480)
1145 // Since the ::OnCommand() function is overridden, this prevents the widget
1146 // detection in ::OnCommand() until all widgets have been initialized to prevent
1147 // uninitialized pointers from crashing the program
1148 widgetPtrsSet
= false;
1150 initialized
= false;
1155 } // CeditorDlg constructor
1158 void CeditorDlg::OnCloseWindow(wxCloseEvent
& event
)
1161 if ((mode
!= mCreate
) && (mode
!= mEdit
))
1167 wxMessageBox(wxT("Must finish processing the current record being created/modified before exiting"),wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
1170 } // CeditorDlg::OnCloseWindow()
1173 void CeditorDlg::OnButton(wxCommandEvent
&event
)
1175 wxWindow
*win
= (wxWindow
*) event
.GetEventObject();
1176 OnCommand( *win
, event
);
1177 } // CeditorDlg::OnButton()
1180 void CeditorDlg::OnCommand(wxWindow
& win
, wxCommandEvent
& WXUNUSED(event
))
1182 wxString widgetName
;
1184 widgetName
= win
.GetName();
1189 if (widgetName
== pCreateBtn
->GetName())
1191 wxGetApp().Contact
->Initialize();
1194 pNameTxt
->SetValue(wxT(""));
1195 pNameTxt
->SetFocus();
1199 if (widgetName
== pEditBtn
->GetName())
1201 saveName
= wxGetApp().Contact
->Name
;
1203 pNameTxt
->SetFocus();
1207 if (widgetName
== pCopyBtn
->GetName())
1210 pNameTxt
->SetValue(wxT(""));
1211 pNameTxt
->SetFocus();
1215 if (widgetName
== pDeleteBtn
->GetName())
1217 bool Ok
= (wxMessageBox(wxT("Are you sure?"),wxT("Confirm"),wxYES_NO
|wxICON_QUESTION
) == wxYES
);
1222 if (Ok
&& wxGetApp().Contact
->Delete())
1224 // NOTE: Deletions are not finalized until a CommitTrans() is performed.
1225 // If the commit were not performed, the program will continue to
1226 // show the table contents as if they were deleted until this instance
1227 // of Ccontact is deleted. If the Commit wasn't performed, the
1228 // database will automatically Rollback the changes when the database
1229 // connection is terminated
1230 wxGetApp().Contact
->GetDb()->CommitTrans();
1232 // Try to get the row that followed the just deleted row in the orderBy sequence
1235 // There was now row (in sequence) after the just deleted row, so get the
1236 // row which preceded the just deleted row
1239 // There are now no rows remaining, so clear the dialog widgets
1240 wxGetApp().Contact
->Initialize();
1244 SetMode(mode
); // force reset of button enable/disable
1248 wxGetApp().Contact
->GetDb()->RollbackTrans();
1254 if (widgetName
== pSaveBtn
->GetName())
1260 if (widgetName
== pCancelBtn
->GetName())
1262 bool Ok
= (wxMessageBox(wxT("Are you sure?"),wxT("Confirm"),wxYES_NO
|wxICON_QUESTION
) == wxYES
);
1267 if (saveName
.IsEmpty())
1269 wxGetApp().Contact
->Initialize();
1276 // Requery previous record
1277 if (wxGetApp().Contact
->FetchByName(saveName
))
1285 // Previous record not available, retrieve first record in table
1286 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1287 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1289 wxGetApp().Contact
->whereStr
= wxT("NAME = (SELECT MIN(NAME) FROM ");
1290 wxGetApp().Contact
->whereStr
+= wxGetApp().Contact
->GetTableName();
1291 wxGetApp().Contact
->whereStr
+= wxT(")");
1292 wxGetApp().Contact
->SetWhereClause(wxGetApp().Contact
->whereStr
.c_str());
1295 wxGetApp().Contact
->SetWhereClause(wxT(""));
1297 if (!wxGetApp().Contact
->Query())
1300 tStr
= wxT("ODBC error during Query()\n\n");
1301 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1302 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1307 if (wxGetApp().Contact
->GetNext()) // Successfully read first record
1313 // No contacts are available, clear dialog
1314 wxGetApp().Contact
->Initialize();
1320 if (widgetName
== pPrevBtn
->GetName())
1327 if (widgetName
== pNextBtn
->GetName())
1334 if (widgetName
== pQueryBtn
->GetName())
1336 // Display the query dialog box
1337 wxChar qryWhere
[DB_MAX_WHERE_CLAUSE_LEN
+1];
1338 wxStrcpy(qryWhere
, (const wxChar
*) wxGetApp().Contact
->qryWhereStr
);
1339 wxChar
*tblName
[] = {(wxChar
*)CONTACT_TABLE_NAME
, 0};
1340 new CqueryDlg(GetParent(), wxGetApp().Contact
->GetDb(), tblName
, qryWhere
);
1342 // Query the first record in the new record set and
1343 // display it, if the query string has changed.
1344 if (wxStrcmp(qryWhere
, (const wxChar
*) wxGetApp().Contact
->qryWhereStr
))
1346 wxGetApp().Contact
->whereStr
.Empty();
1347 wxGetApp().Contact
->SetOrderByClause(wxT("NAME"));
1349 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1350 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1352 wxGetApp().Contact
->whereStr
= wxT("NAME = (SELECT MIN(NAME) FROM ");
1353 wxGetApp().Contact
->whereStr
+= CONTACT_TABLE_NAME
;
1356 // Append the query where string (if there is one)
1357 wxGetApp().Contact
->qryWhereStr
= qryWhere
;
1358 if (wxStrlen(qryWhere
))
1360 wxGetApp().Contact
->whereStr
+= wxT(" WHERE ");
1361 wxGetApp().Contact
->whereStr
+= wxGetApp().Contact
->qryWhereStr
;
1363 // Close the expression with a right paren
1364 wxGetApp().Contact
->whereStr
+= wxT(")");
1365 // Requery the table
1366 wxGetApp().Contact
->SetWhereClause(wxGetApp().Contact
->whereStr
.c_str());
1367 if (!wxGetApp().Contact
->Query())
1370 tStr
= wxT("ODBC error during Query()\n\n");
1371 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1372 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1376 // Display the first record from the query set
1377 if (!wxGetApp().Contact
->GetNext())
1378 wxGetApp().Contact
->Initialize();
1382 // Enable/Disable the reset button
1383 pResetBtn
->Enable(!wxGetApp().Contact
->qryWhereStr
.IsEmpty());
1389 if (widgetName
== pResetBtn
->GetName())
1391 // Clear the additional where criteria established by the query feature
1392 wxGetApp().Contact
->qryWhereStr
= wxT("");
1393 wxGetApp().Contact
->SetOrderByClause(wxT("NAME"));
1395 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1396 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1398 wxGetApp().Contact
->whereStr
= wxT("NAME = (SELECT MIN(NAME) FROM ");
1399 wxGetApp().Contact
->whereStr
+= CONTACT_TABLE_NAME
;
1400 wxGetApp().Contact
->whereStr
+= wxT(")");
1403 wxGetApp().Contact
->SetWhereClause(wxGetApp().Contact
->whereStr
.c_str());
1404 if (!wxGetApp().Contact
->Query())
1407 tStr
= wxT("ODBC error during Query()\n\n");
1408 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1409 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1412 if (!wxGetApp().Contact
->GetNext())
1413 wxGetApp().Contact
->Initialize();
1415 pResetBtn
->Enable(false);
1421 if (widgetName
== pNameListBtn
->GetName())
1423 new ClookUpDlg(/* wxWindow *parent */ this,
1424 /* wxChar *windowTitle */ wxT("Select contact name"),
1425 /* wxChar *tableName */ (wxChar
*) CONTACT_TABLE_NAME
,
1426 /* wxChar *dispCol1 */ wxT("NAME"),
1427 /* wxChar *dispCol2 */ wxT("JOINDATE"),
1428 /* wxChar *where */ wxT(""),
1429 /* wxChar *orderBy */ wxT("NAME"),
1430 /* wxDb *pDb */ wxGetApp().READONLY_DB
,
1431 /* const wxString &defDir */ wxGetApp().DbConnectInf
->GetDefaultDir(),
1432 /* bool distinctValues */ true);
1434 if (ListDB_Selection
&& wxStrlen(ListDB_Selection
))
1436 wxString w
= wxT("NAME = '");
1437 w
+= ListDB_Selection
;
1445 if (widgetName
== pDataTypesBtn
->GetName())
1447 CheckSupportForAllDataTypes(wxGetApp().READONLY_DB
);
1448 wxMessageBox(wxT("Support datatypes was dumped to stdout."));
1450 } // Data types Button
1452 if (widgetName
== pDbDiagsBtn
->GetName())
1454 DisplayDbDiagnostics(wxGetApp().READONLY_DB
);
1455 wxMessageBox(wxT("Diagnostics info was dumped to stdout."));
1459 if (widgetName
== pCatalogBtn
->GetName())
1461 if (wxGetApp().Contact
->GetDb()->Catalog(wxT(""),wxT("catalog.txt")))
1462 wxMessageBox(wxT("The file 'catalog.txt' was created."));
1464 wxMessageBox(wxT("Creation of the file 'catalog.txt' was failed."));
1468 } // CeditorDlg::OnCommand()
1471 bool CeditorDlg::Initialize()
1473 // Create the data structure and a new database connection.
1474 // (As there is not a pDb being passed in the constructor, a new database
1475 // connection is created)
1476 wxGetApp().Contact
= new Ccontact();
1478 if (!wxGetApp().Contact
)
1480 wxMessageBox(wxT("Unable to instantiate an instance of Ccontact"),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
1484 // Check if the table exists or not. If it doesn't, ask the user if they want to
1485 // create the table. Continue trying to create the table until it exists, or user aborts
1486 while (!wxGetApp().Contact
->GetDb()->TableExists((wxChar
*)CONTACT_TABLE_NAME
,
1487 wxGetApp().DbConnectInf
->GetUserID(),
1488 wxGetApp().DbConnectInf
->GetDefaultDir()))
1491 tStr
.Printf(wxT("Unable to open the table '%s'. The table may\nneed to be created.\n\nDo you wish to try to create/clear the table?\n\n"),CONTACT_TABLE_NAME
);
1492 bool createTable
= (wxMessageBox(tStr
.c_str(),wxT("Confirm"),wxYES_NO
|wxICON_QUESTION
) == wxYES
);
1500 wxGetApp().CreateDataTable(false);
1503 // Tables must be "opened" before anything other than creating/deleting table can be done
1504 if (!wxGetApp().Contact
->Open())
1506 // Table does exist, or there was some problem opening it. Currently this should
1507 // never fail, except in the case of the table not exisiting or the current
1508 // user has insufficent privileges to access the table
1510 // This code is experimenting with a new function that will hopefully be available
1511 // in the 2.4 release. This check will determine whether the open failing was due
1512 // to the table not existing, or the users privileges being insufficient to
1514 if (!wxGetApp().Contact
->GetDb()->TablePrivileges(CONTACT_TABLE_NAME
, wxT("SELECT"),
1515 wxGetApp().Contact
->GetDb()->GetUsername(),
1516 wxGetApp().Contact
->GetDb()->GetUsername(),
1517 wxGetApp().DbConnectInf
->GetDefaultDir()))
1520 tStr
.Printf(wxT("Unable to open the table '%s' (likely due to\ninsufficient privileges of the logged in user).\n\n"),CONTACT_TABLE_NAME
);
1522 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1523 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1527 if (!wxGetApp().Contact
->GetDb()->TableExists(CONTACT_TABLE_NAME
,
1528 wxGetApp().Contact
->GetDb()->GetUsername(),
1529 wxGetApp().DbConnectInf
->GetDefaultDir()))
1532 tStr
.Printf(wxT("Unable to open the table '%s' as the table\ndoes not appear to exist in the tablespace available\nto the currently logged in user.\n\n"),CONTACT_TABLE_NAME
);
1533 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1534 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1542 (void)new wxStaticBox(this, EDITOR_DIALOG_FN_GROUP
, wxT(""), wxPoint(15, 1), wxSize(497, 69), 0, wxT("FunctionGrp"));
1543 (void)new wxStaticBox(this, EDITOR_DIALOG_SEARCH_GROUP
, wxT(""), wxPoint(417, 1), wxSize(95, 242), 0, wxT("SearchGrp"));
1545 pCreateBtn
= new wxButton(this, EDITOR_DIALOG_CREATE
, wxT("&Create"), wxPoint( 25, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("CreateBtn"));
1546 pEditBtn
= new wxButton(this, EDITOR_DIALOG_EDIT
, wxT("&Edit"), wxPoint(102, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("EditBtn"));
1547 pDeleteBtn
= new wxButton(this, EDITOR_DIALOG_DELETE
, wxT("&Delete"), wxPoint(179, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("DeleteBtn"));
1548 pCopyBtn
= new wxButton(this, EDITOR_DIALOG_COPY
, wxT("Cop&y"), wxPoint(256, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("CopyBtn"));
1549 pSaveBtn
= new wxButton(this, EDITOR_DIALOG_SAVE
, wxT("&Save"), wxPoint(333, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("SaveBtn"));
1550 pCancelBtn
= new wxButton(this, EDITOR_DIALOG_CANCEL
, wxT("C&ancel"), wxPoint(430, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("CancelBtn"));
1551 pPrevBtn
= new wxButton(this, EDITOR_DIALOG_PREV
, wxT("<< &Prev"), wxPoint(430, 81), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("PrevBtn"));
1552 pNextBtn
= new wxButton(this, EDITOR_DIALOG_NEXT
, wxT("&Next >>"), wxPoint(430, 121), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("NextBtn"));
1553 pQueryBtn
= new wxButton(this, EDITOR_DIALOG_QUERY
, wxT("&Query"), wxPoint(430, 161), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("QueryBtn"));
1554 pResetBtn
= new wxButton(this, EDITOR_DIALOG_RESET
, wxT("&Reset"), wxPoint(430, 200), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("ResetBtn"));
1555 pNameMsg
= new wxStaticText(this, EDITOR_DIALOG_NAME_MSG
, wxT("Name:"), wxPoint( 17, 80), wxDefaultSize
, 0, wxT("NameMsg"));
1556 pNameTxt
= new wxTextCtrl(this, EDITOR_DIALOG_NAME_TEXT
, wxT(""), wxPoint( 17, 97), wxSize(308, 25), 0, wxDefaultValidator
, wxT("NameTxt"));
1557 pNameListBtn
= new wxButton(this, EDITOR_DIALOG_LOOKUP
, wxT("&Lookup"), wxPoint(333, 97), wxSize( 70, 24), 0, wxDefaultValidator
, wxT("LookupBtn"));
1558 pAddress1Msg
= new wxStaticText(this, EDITOR_DIALOG_ADDRESS1_MSG
, wxT("Address:"), wxPoint( 17, 130), wxDefaultSize
, 0, wxT("Address1Msg"));
1559 pAddress1Txt
= new wxTextCtrl(this, EDITOR_DIALOG_ADDRESS2_TEXT
, wxT(""), wxPoint( 17, 147), wxSize(308, 25), 0, wxDefaultValidator
, wxT("Address1Txt"));
1560 pAddress2Msg
= new wxStaticText(this, EDITOR_DIALOG_ADDRESS2_MSG
, wxT("Address:"), wxPoint( 17, 180), wxDefaultSize
, 0, wxT("Address2Msg"));
1561 pAddress2Txt
= new wxTextCtrl(this, EDITOR_DIALOG_ADDRESS2_TEXT
, wxT(""), wxPoint( 17, 197), wxSize(308, 25), 0, wxDefaultValidator
, wxT("Address2Txt"));
1562 pCityMsg
= new wxStaticText(this, EDITOR_DIALOG_CITY_MSG
, wxT("City:"), wxPoint( 17, 230), wxDefaultSize
, 0, wxT("CityMsg"));
1563 pCityTxt
= new wxTextCtrl(this, EDITOR_DIALOG_CITY_TEXT
, wxT(""), wxPoint( 17, 247), wxSize(225, 25), 0, wxDefaultValidator
, wxT("CityTxt"));
1564 pStateMsg
= new wxStaticText(this, EDITOR_DIALOG_STATE_MSG
, wxT("State:"), wxPoint(250, 230), wxDefaultSize
, 0, wxT("StateMsg"));
1565 pStateTxt
= new wxTextCtrl(this, EDITOR_DIALOG_STATE_TEXT
, wxT(""), wxPoint(250, 247), wxSize(153, 25), 0, wxDefaultValidator
, wxT("StateTxt"));
1566 pCountryMsg
= new wxStaticText(this, EDITOR_DIALOG_COUNTRY_MSG
, wxT("Country:"), wxPoint( 17, 280), wxDefaultSize
, 0, wxT("CountryMsg"));
1567 pCountryTxt
= new wxTextCtrl(this, EDITOR_DIALOG_COUNTRY_TEXT
, wxT(""), wxPoint( 17, 297), wxSize(225, 25), 0, wxDefaultValidator
, wxT("CountryTxt"));
1568 pPostalCodeMsg
= new wxStaticText(this, EDITOR_DIALOG_POSTAL_MSG
, wxT("Postal Code:"),wxPoint(250, 280), wxDefaultSize
, 0, wxT("PostalCodeMsg"));
1569 pPostalCodeTxt
= new wxTextCtrl(this, EDITOR_DIALOG_POSTAL_TEXT
, wxT(""), wxPoint(250, 297), wxSize(153, 25), 0, wxDefaultValidator
, wxT("PostalCodeTxt"));
1571 wxString choice_strings
[5];
1572 choice_strings
[0] = wxT("English");
1573 choice_strings
[1] = wxT("French");
1574 choice_strings
[2] = wxT("German");
1575 choice_strings
[3] = wxT("Spanish");
1576 choice_strings
[4] = wxT("Other");
1578 pNativeLangChoice
= new wxChoice(this, EDITOR_DIALOG_LANG_CHOICE
, wxPoint( 17, 346), wxSize(277, wxDefaultCoord
), 5, choice_strings
);
1579 pNativeLangMsg
= new wxStaticText(this, EDITOR_DIALOG_LANG_MSG
, wxT("Native language:"), wxPoint( 17, 330), wxDefaultSize
, 0, wxT("NativeLangMsg"));
1581 wxString radio_strings
[2];
1582 radio_strings
[0] = wxT("No");
1583 radio_strings
[1] = wxT("Yes");
1584 pDeveloperRadio
= new wxRadioBox(this,EDITOR_DIALOG_DEVELOPER
, wxT("Developer:"), wxPoint(303, 330), wxDefaultSize
, 2, radio_strings
, 2, wxHORIZONTAL
);
1585 pJoinDateMsg
= new wxStaticText(this, EDITOR_DIALOG_JOIN_MSG
, wxT("Date joined:"), wxPoint( 17, 380), wxDefaultSize
, 0, wxT("JoinDateMsg"));
1586 pJoinDateTxt
= new wxTextCtrl(this, EDITOR_DIALOG_JOIN_TEXT
, wxT(""), wxPoint( 17, 397), wxSize(150, 25), 0, wxDefaultValidator
, wxT("JoinDateTxt"));
1587 pContribMsg
= new wxStaticText(this, EDITOR_DIALOG_CONTRIB_MSG
,wxT("Contributions:"), wxPoint(175, 380), wxDefaultSize
, 0, wxT("ContribMsg"));
1588 pContribTxt
= new wxTextCtrl(this, EDITOR_DIALOG_CONTRIB_TEXT
, wxT(""), wxPoint(175, 397), wxSize(120, 25), 0, wxDefaultValidator
, wxT("ContribTxt"));
1589 pLinesMsg
= new wxStaticText(this, EDITOR_DIALOG_LINES_MSG
, wxT("Lines of code:"), wxPoint(303, 380), wxDefaultSize
, 0, wxT("LinesMsg"));
1590 pLinesTxt
= new wxTextCtrl(this, EDITOR_DIALOG_LINES_TEXT
, wxT(""), wxPoint(303, 397), wxSize(100, 25), 0, wxDefaultValidator
, wxT("LinesTxt"));
1592 pCatalogBtn
= new wxButton(this, EDITOR_DIALOG_CATALOG
, wxT("Catalo&g"), wxPoint(430, 287), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("CatalogBtn"));
1593 pDataTypesBtn
= new wxButton(this, EDITOR_DIALOG_DATATYPES
, wxT("Data&types"), wxPoint(430, 337), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("DataTypesBtn"));
1594 pDbDiagsBtn
= new wxButton(this, EDITOR_DIALOG_DB_DIAGS
, wxT("DB Dia&gs"), wxPoint(430, 387), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("DbDiagsBtn"));
1596 // Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to
1597 // handle all widget processing
1598 widgetPtrsSet
= true;
1600 // Setup the orderBy and where clauses to return back a single record as the result set,
1601 // as there will only be one record being shown on the dialog at a time, this optimizes
1602 // network traffic by only returning a one row result
1604 wxGetApp().Contact
->SetOrderByClause(wxT("NAME")); // field name to sort by
1606 // The wxString "whereStr" is not a member of the wxDbTable object, it is a member variable
1607 // specifically in the Ccontact class. It is used here for simpler construction of a varying
1608 // length string, and then after the string is built, the wxDbTable member variable "where" is
1609 // assigned the pointer to the constructed string.
1611 // The constructed where clause below has a sub-query within it "SELECT MIN(NAME) FROM %s"
1612 // to achieve a single row (in this case the first name in alphabetical order).
1614 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1615 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1617 wxGetApp().Contact
->whereStr
.Printf(wxT("NAME = (SELECT MIN(NAME) FROM %s)"),
1618 wxGetApp().Contact
->GetTableName().c_str());
1619 // NOTE: (const wxChar*) returns a pointer which may not be valid later, so this is short term use only
1620 wxGetApp().Contact
->SetWhereClause(wxGetApp().Contact
->whereStr
);
1623 wxGetApp().Contact
->SetWhereClause(wxT(""));
1625 // Perform the Query to get the result set.
1626 // NOTE: If there are no rows returned, that is a valid result, so Query() would return true.
1627 // Only if there is a database error will Query() come back as false
1628 if (!wxGetApp().Contact
->Query())
1631 tStr
= wxT("ODBC error during Query()\n\n");
1632 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1633 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1637 // Since Query succeeded, now get the row that was returned
1638 if (!wxGetApp().Contact
->GetNext())
1639 // If the GetNext() failed at this point, then there are no rows to retrieve,
1640 // so clear the values in the members of "Contact" so that PutData() blanks the
1641 // widgets on the dialog
1642 wxGetApp().Contact
->Initialize();
1644 wxGetApp().Contact->GetDb()->RollbackTrans();
1653 } // CeditorDlg::Initialize()
1656 void CeditorDlg::FieldsEditable()
1661 pNameTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1662 pAddress1Txt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1663 pAddress2Txt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1664 pCityTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1665 pStateTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1666 pPostalCodeTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1667 pCountryTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1669 pJoinDateTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1670 pContribTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1671 pLinesTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1672 pNativeLangChoice
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1673 pDeveloperRadio
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1675 } // CeditorDlg::FieldsEditable()
1678 void CeditorDlg::SetMode(enum DialogModes m
)
1699 pCreateBtn
->Enable( !edit
);
1700 pEditBtn
->Enable( !edit
&& (wxStrcmp(wxGetApp().Contact
->Name
,wxT(""))!=0) );
1701 pDeleteBtn
->Enable( !edit
&& (wxStrcmp(wxGetApp().Contact
->Name
,wxT(""))!=0) );
1702 pCopyBtn
->Enable( !edit
&& (wxStrcmp(wxGetApp().Contact
->Name
,wxT(""))!=0) );
1703 pSaveBtn
->Enable( edit
);
1704 pCancelBtn
->Enable( edit
);
1705 pPrevBtn
->Enable( !edit
);
1706 pNextBtn
->Enable( !edit
);
1707 pQueryBtn
->Enable( !edit
);
1708 pResetBtn
->Enable( !edit
&& !wxGetApp().Contact
->qryWhereStr
.IsEmpty() );
1709 pNameListBtn
->Enable( !edit
);
1713 } // CeditorDlg::SetMode()
1716 bool CeditorDlg::PutData()
1720 pNameTxt
->SetValue(wxGetApp().Contact
->Name
);
1721 pAddress1Txt
->SetValue(wxGetApp().Contact
->Addr1
);
1722 pAddress2Txt
->SetValue(wxGetApp().Contact
->Addr2
);
1723 pCityTxt
->SetValue(wxGetApp().Contact
->City
);
1724 pStateTxt
->SetValue(wxGetApp().Contact
->State
);
1725 pCountryTxt
->SetValue(wxGetApp().Contact
->Country
);
1726 pPostalCodeTxt
->SetValue(wxGetApp().Contact
->PostalCode
);
1728 tStr
.Printf(wxT("%d/%d/%d"),wxGetApp().Contact
->JoinDate
.month
,wxGetApp().Contact
->JoinDate
.day
,wxGetApp().Contact
->JoinDate
.year
);
1729 pJoinDateTxt
->SetValue(tStr
);
1731 tStr
.Printf(wxT("%d"),wxGetApp().Contact
->Contributions
);
1732 pContribTxt
->SetValue(tStr
);
1734 tStr
.Printf(wxT("%lu"),wxGetApp().Contact
->LinesOfCode
);
1735 pLinesTxt
->SetValue(tStr
);
1737 pNativeLangChoice
->SetSelection(wxGetApp().Contact
->NativeLanguage
);
1739 pDeveloperRadio
->SetSelection(wxGetApp().Contact
->IsDeveloper
);
1742 } // Ceditor::PutData()
1746 * Reads the data out of all the widgets on the dialog. Some data evaluation is done
1747 * to ensure that there is a name entered and that the date field is valid.
1749 * A return value of true means that valid data was retrieved from the dialog, otherwise
1750 * invalid data was found (and a message was displayed telling the user what to fix), and
1751 * the data was not placed into the appropraite fields of Ccontact
1753 bool CeditorDlg::GetData()
1755 // Validate that the data currently entered into the widgets is valid data
1758 tStr
= pNameTxt
->GetValue();
1759 if (!wxStrcmp((const wxChar
*) tStr
,wxT("")))
1761 wxMessageBox(wxT("A name is required for entry into the contact table"),wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
1765 bool invalid
= false;
1766 int mm
= 1,dd
= 1,yyyy
= 2001;
1769 tStr
= pJoinDateTxt
->GetValue();
1770 if (tStr
.Freq(wxT('/')) != 2)
1773 // Find the month, day, and year tokens
1776 first
= tStr
.First(wxT('/'));
1777 second
= tStr
.Last(wxT('/'));
1779 mm
= wxAtoi(tStr
.SubString(0,first
));
1780 dd
= wxAtoi(tStr
.SubString(first
+1,second
));
1781 yyyy
= wxAtoi(tStr
.SubString(second
+1,tStr
.Length()-1));
1783 invalid
= !(mm
&& dd
&& yyyy
);
1786 // Force Year 2000 compliance
1787 if (!invalid
&& (yyyy
< 1000))
1790 // Check the token ranges for validity
1795 else if ((mm
< 1) || (mm
> 12))
1803 int days
[12] = {31,28,31,30,31,30,
1805 if (dd
> days
[mm
-1])
1808 if ((dd
== 29) && (mm
== 2))
1810 if (((yyyy
% 4) == 0) && (((yyyy
% 100) != 0) || ((yyyy
% 400) == 0)))
1820 wxGetApp().Contact
->JoinDate
.month
= mm
;
1821 wxGetApp().Contact
->JoinDate
.day
= dd
;
1822 wxGetApp().Contact
->JoinDate
.year
= yyyy
;
1826 wxMessageBox(wxT("Improper date format. Please check the date\nspecified and try again.\n\nNOTE: Dates are in american format (MM/DD/YYYY)"),wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
1830 tStr
= pNameTxt
->GetValue();
1831 wxStrcpy(wxGetApp().Contact
->Name
,(const wxChar
*) tStr
);
1832 wxStrcpy(wxGetApp().Contact
->Addr1
,pAddress1Txt
->GetValue());
1833 wxStrcpy(wxGetApp().Contact
->Addr2
,pAddress2Txt
->GetValue());
1834 wxStrcpy(wxGetApp().Contact
->City
,pCityTxt
->GetValue());
1835 wxStrcpy(wxGetApp().Contact
->State
,pStateTxt
->GetValue());
1836 wxStrcpy(wxGetApp().Contact
->Country
,pCountryTxt
->GetValue());
1837 wxStrcpy(wxGetApp().Contact
->PostalCode
,pPostalCodeTxt
->GetValue());
1839 wxGetApp().Contact
->Contributions
= wxAtoi(pContribTxt
->GetValue());
1840 wxGetApp().Contact
->LinesOfCode
= wxAtol(pLinesTxt
->GetValue());
1842 wxGetApp().Contact
->NativeLanguage
= (enum Language
) pNativeLangChoice
->GetSelection();
1843 wxGetApp().Contact
->IsDeveloper
= pDeveloperRadio
->GetSelection() > 0;
1846 } // CeditorDlg::GetData()
1850 * Retrieve data from the dialog, verify the validity of the data, and if it is valid,
1851 * try to insert/update the data to the table based on the current 'mode' the dialog
1854 * A return value of true means the insert/update was completed successfully, a return
1855 * value of false means that Save() failed. If returning false, then this function
1856 * has displayed a detailed error message for the user.
1858 bool CeditorDlg::Save()
1860 bool failed
= false;
1862 // Read the data in the widgets of the dialog to get the user's data
1866 // Perform any other required validations necessary before saving
1869 wxBeginBusyCursor();
1871 if (mode
== mCreate
)
1873 RETCODE result
= wxGetApp().Contact
->Insert();
1875 failed
= (result
!= DB_SUCCESS
);
1878 // Some errors may be expected, like a duplicate key, so handle those instances with
1879 // specific error messages.
1880 if (result
== DB_ERR_INTEGRITY_CONSTRAINT_VIOL
)
1883 tStr
= wxT("A duplicate key value already exists in the table.\nUnable to save record\n\n");
1884 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1885 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1889 // Some other unexpected error occurred
1891 tStr
= wxT("Database insert failed\n\n");
1892 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1893 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1897 else // mode == mEdit
1899 wxGetApp().Contact
->GetDb()->RollbackTrans();
1900 wxGetApp().Contact
->whereStr
.Printf(wxT("NAME = '%s'"),saveName
.c_str());
1901 if (!wxGetApp().Contact
->UpdateWhere(wxGetApp().Contact
->whereStr
))
1904 tStr
= wxT("Database update failed\n\n");
1905 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1906 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1913 wxGetApp().Contact
->GetDb()->CommitTrans();
1914 SetMode(mView
); // Sets the dialog mode back to viewing after save is successful
1917 wxGetApp().Contact
->GetDb()->RollbackTrans();
1923 } // CeditorDlg::Save()
1927 * Where this program is only showing a single row at a time in the dialog,
1928 * a special where clause must be built to find just the single row which,
1929 * in sequence, would follow the currently displayed row.
1931 bool CeditorDlg::GetNextRec()
1935 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1936 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1938 w
= wxT("NAME = (SELECT MIN(NAME) FROM ");
1939 w
+= wxGetApp().Contact
->GetTableName();
1940 w
+= wxT(" WHERE NAME > '");
1943 w
= wxT("(NAME > '");
1945 w
+= wxGetApp().Contact
->Name
;
1948 // If a query where string is currently set, append that criteria
1949 if (!wxGetApp().Contact
->qryWhereStr
.IsEmpty())
1952 w
+= wxGetApp().Contact
->qryWhereStr
;
1959 } // CeditorDlg::GetNextRec()
1963 * Where this program is only showing a single row at a time in the dialog,
1964 * a special where clause must be built to find just the single row which,
1965 * in sequence, would precede the currently displayed row.
1967 bool CeditorDlg::GetPrevRec()
1971 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1972 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1974 w
= wxT("NAME = (SELECT MAX(NAME) FROM ");
1975 w
+= wxGetApp().Contact
->GetTableName();
1976 w
+= wxT(" WHERE NAME < '");
1979 w
= wxT("(NAME < '");
1981 w
+= wxGetApp().Contact
->Name
;
1984 // If a query where string is currently set, append that criteria
1985 if (!wxGetApp().Contact
->qryWhereStr
.IsEmpty())
1988 w
+= wxGetApp().Contact
->qryWhereStr
;
1996 } // CeditorDlg::GetPrevRec()
2000 * This function is here to avoid duplicating this same code in both the
2001 * GetPrevRec() and GetNextRec() functions
2003 bool CeditorDlg::GetRec(const wxString
&whereStr
)
2005 wxGetApp().Contact
->SetWhereClause(whereStr
);
2006 wxGetApp().Contact
->SetOrderByClause(wxT("NAME"));
2008 if (!wxGetApp().Contact
->Query())
2011 tStr
= wxT("ODBC error during Query()\n\n");
2012 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
2013 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
2018 if (wxGetApp().Contact
->GetNext())
2025 } // CeditorDlg::GetRec()
2030 * CparameterDlg constructor
2033 BEGIN_EVENT_TABLE(CparameterDlg
, wxDialog
)
2034 EVT_BUTTON(PARAMETER_DIALOG_SAVE
, CparameterDlg::OnButton
)
2035 EVT_BUTTON(PARAMETER_DIALOG_CANCEL
, CparameterDlg::OnButton
)
2036 EVT_CLOSE(CparameterDlg::OnCloseWindow
)
2039 CparameterDlg::CparameterDlg(wxWindow
*parent
) : wxDialog (parent
, PARAMETER_DIALOG
, wxT("ODBC parameter settings"), wxDefaultPosition
, wxSize(400, 325))
2041 // Since the ::OnCommand() function is overridden, this prevents the widget
2042 // detection in ::OnCommand() until all widgets have been initialized to prevent
2043 // uninitialized pointers from crashing the program
2044 widgetPtrsSet
= false;
2046 pParamODBCSourceMsg
= new wxStaticText(this, PARAMETER_DIALOG_SOURCE_MSG
, wxT("ODBC data sources:"), wxPoint( 10, 10), wxDefaultSize
, 0, wxT("ParamODBCSourceMsg"));
2047 pParamODBCSourceList
= new wxListBox(this, PARAMETER_DIALOG_SOURCE_LISTBOX
, wxPoint( 10, 29), wxSize(285, 150), 0, 0, wxLB_SINGLE
|wxLB_ALWAYS_SB
, wxDefaultValidator
, wxT("ParamODBCSourceList"));
2048 pParamUserNameMsg
= new wxStaticText(this, PARAMETER_DIALOG_NAME_MSG
, wxT("Database user name:"), wxPoint( 10, 193), wxDefaultSize
, 0, wxT("ParamUserNameMsg"));
2049 pParamUserNameTxt
= new wxTextCtrl(this, PARAMETER_DIALOG_NAME_TEXT
, wxT(""), wxPoint(10, 209), wxSize( 140, 25), 0, wxDefaultValidator
, wxT("ParamUserNameTxt"));
2050 pParamPasswordMsg
= new wxStaticText(this, PARAMETER_DIALOG_PASSWORD_MSG
, wxT("Password:"), wxPoint(156, 193), wxDefaultSize
, 0, wxT("ParamPasswordMsg"));
2051 pParamPasswordTxt
= new wxTextCtrl(this, PARAMETER_DIALOG_PASSWORD_TEXT
, wxT(""), wxPoint(156, 209), wxSize( 140, 25), 0, wxDefaultValidator
, wxT("ParamPasswordTxt"));
2052 pParamDirPathMsg
= new wxStaticText(this, PARAMETER_DIALOG_DIRPATH_MSG
, wxT("Directory:"), wxPoint( 10, 243), wxDefaultSize
, 0, wxT("ParamDirPathMsg"));
2053 pParamDirPathTxt
= new wxTextCtrl(this, PARAMETER_DIALOG_DIRPATH_TEXT
, wxT(""), wxPoint( 10, 259), wxSize(140, 25), 0, wxDefaultValidator
, wxT("ParamDirPathTxt"));
2054 pParamSaveBtn
= new wxButton(this, PARAMETER_DIALOG_SAVE
, wxT("&Save"), wxPoint(310, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("ParamSaveBtn"));
2055 pParamCancelBtn
= new wxButton(this, PARAMETER_DIALOG_CANCEL
, wxT("C&ancel"), wxPoint(310, 66), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("ParamCancelBtn"));
2057 // Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to
2058 // handle all widget processing
2059 widgetPtrsSet
= true;
2062 savedParamSettings
= wxGetApp().params
;
2067 } // CparameterDlg constructor
2070 void CparameterDlg::OnCloseWindow(wxCloseEvent
& event
)
2072 // Put any additional checking necessary to make certain it is alright
2073 // to close the program here that is not done elsewhere
2076 bool Ok
= (wxMessageBox(wxT("No changes have been saved.\n\nAre you sure you wish exit the parameter screen?"),wxT("Confirm"),wxYES_NO
|wxICON_QUESTION
) == wxYES
);
2084 wxGetApp().params
= savedParamSettings
;
2087 if (GetParent() != NULL
)
2088 GetParent()->SetFocus();
2094 SetReturnCode(0); // added so BoundsChecker would not report use of uninitialized variable
2097 } // CparameterDlg::OnCloseWindow()
2100 void CparameterDlg::OnButton( wxCommandEvent
&event
)
2102 wxWindow
*win
= (wxWindow
*) event
.GetEventObject();
2103 OnCommand( *win
, event
);
2107 void CparameterDlg::OnCommand(wxWindow
& win
, wxCommandEvent
& WXUNUSED(event
))
2109 wxString widgetName
;
2111 widgetName
= win
.GetName();
2116 if (widgetName
== pParamSaveBtn
->GetName())
2121 tStr
= wxT("Database parameters have been saved.");
2122 if (GetParent() != NULL
) // The parameter dialog was not called during startup due to a missing cfg file
2123 tStr
+= wxT("\nNew parameters will take effect the next time the program is started.");
2124 wxMessageBox(tStr
,wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
2131 if (widgetName
== pParamCancelBtn
->GetName())
2136 } // CparameterDlg::OnCommand()
2139 bool CparameterDlg::PutData()
2141 // Fill the data source list box
2142 FillDataSourceList();
2144 // Fill in the fields from the params object
2145 if (wxGetApp().params
.ODBCSource
&& wxStrlen(wxGetApp().params
.ODBCSource
))
2147 int index
= pParamODBCSourceList
->FindString(wxGetApp().params
.ODBCSource
);
2148 if (index
!= wxNOT_FOUND
)
2149 pParamODBCSourceList
->SetSelection(index
);
2151 pParamUserNameTxt
->SetValue(wxGetApp().params
.UserName
);
2152 pParamPasswordTxt
->SetValue(wxGetApp().params
.Password
);
2153 pParamDirPathTxt
->SetValue(wxGetApp().params
.DirPath
);
2155 } // CparameterDlg::PutData()
2158 bool CparameterDlg::GetData()
2161 if (pParamODBCSourceList
->GetStringSelection() != wxT(""))
2163 tStr
= pParamODBCSourceList
->GetStringSelection();
2164 if (tStr
.Length() > (sizeof(wxGetApp().params
.ODBCSource
)-1))
2167 errmsg
.Printf(wxT("ODBC Data source name is longer than the data structure to hold it.\n'Cparameter.ODBCSource' must have a larger character array\nto handle a data source with this long of a name\n\nThe data source currently selected is %d characters long."),tStr
.Length());
2168 wxMessageBox(errmsg
,wxT("Internal program error..."),wxOK
| wxICON_EXCLAMATION
);
2171 wxStrcpy(wxGetApp().params
.ODBCSource
, tStr
);
2176 tStr
= pParamUserNameTxt
->GetValue();
2177 if (tStr
.Length() > (sizeof(wxGetApp().params
.UserName
)-1))
2180 errmsg
.Printf(wxT("User name is longer than the data structure to hold it.\n'Cparameter.UserName' must have a larger character array\nto handle a data source with this long of a name\n\nThe user name currently specified is %d characters long."),tStr
.Length());
2181 wxMessageBox(errmsg
,wxT("Internal program error..."),wxOK
| wxICON_EXCLAMATION
);
2184 wxStrcpy(wxGetApp().params
.UserName
, tStr
);
2186 tStr
= pParamPasswordTxt
->GetValue();
2187 if (tStr
.Length() > (sizeof(wxGetApp().params
.Password
)-1))
2190 errmsg
.Printf(wxT("Password is longer than the data structure to hold it.\n'Cparameter.Password' must have a larger character array\nto handle a data source with this long of a name\n\nThe password currently specified is %d characters long."),tStr
.Length());
2191 wxMessageBox(errmsg
,wxT("Internal program error..."),wxOK
| wxICON_EXCLAMATION
);
2194 wxStrcpy(wxGetApp().params
.Password
,tStr
);
2196 tStr
= pParamDirPathTxt
->GetValue();
2197 tStr
.Replace(wxT("\\"),wxT("/"));
2198 if (tStr
.Length() > (sizeof(wxGetApp().params
.DirPath
)-1))
2201 errmsg
.Printf(wxT("DirPath is longer than the data structure to hold it.\n'Cparameter.DirPath' must have a larger character array\nto handle a data source with this long of a name\n\nThe password currently specified is %d characters long."),tStr
.Length());
2202 wxMessageBox(errmsg
,wxT("Internal program error..."),wxOK
| wxICON_EXCLAMATION
);
2205 wxStrcpy(wxGetApp().params
.DirPath
,tStr
);
2207 } // CparameterDlg::GetData()
2210 bool CparameterDlg::Save()
2212 // Copy the current params in case user cancels changing
2213 // the params, so that we can reset them.
2216 wxGetApp().params
= savedParamSettings
;
2220 wxGetApp().WriteParamFile(wxGetApp().params
);
2223 } // CparameterDlg::Save()
2226 void CparameterDlg::FillDataSourceList()
2228 wxChar Dsn
[SQL_MAX_DSN_LENGTH
+ 1];
2230 wxStringList strList
;
2232 while (wxDbGetDataSource(wxGetApp().DbConnectInf
->GetHenv(), Dsn
,
2233 SQL_MAX_DSN_LENGTH
+1, DsDesc
, 255))
2237 strList
.Add(wxT(""));
2240 for (wxStringList::Node
*node
= strList
.GetFirst(); node
; node
= node
->GetNext() )
2242 current
= node
->GetData();
2243 if(!current
.IsEmpty())
2244 pParamODBCSourceList
->Append(current
.c_str());
2247 } // CparameterDlg::FillDataSourceList()
2250 BEGIN_EVENT_TABLE(CqueryDlg
, wxDialog
)
2251 EVT_BUTTON(wxID_ANY
, CqueryDlg::OnButton
)
2252 EVT_CLOSE(CqueryDlg::OnCloseWindow
)
2256 // CqueryDlg() constructor
2257 CqueryDlg::CqueryDlg(wxWindow
*parent
, wxDb
*pDb
, wxChar
*tblName
[],
2258 const wxString
&pWhereArg
) :
2259 wxDialog (parent
, QUERY_DIALOG
, wxT("Query"), wxDefaultPosition
, wxSize(480, 360))
2261 wxBeginBusyCursor();
2265 masterTableName
= tblName
[0];
2266 widgetPtrsSet
= false;
2269 // Initialize the WHERE clause from the string passed in
2270 pWhere
= pWhereArg
; // Save a pointer to the output buffer
2271 if (pWhere
.Length() > (unsigned int)DB_MAX_WHERE_CLAUSE_LEN
) // Check the length of the buffer passed in
2274 s
.Printf(wxT("Maximum where clause length exceeded.\nLength must be less than %d"), DB_MAX_WHERE_CLAUSE_LEN
+1);
2275 wxMessageBox(s
,wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
2280 pQueryCol1Msg
= new wxStaticText(this, QUERY_DIALOG_COL_MSG
, wxT("Column 1:"), wxPoint( 10, 10), wxSize( 69, 16), 0, wxT("QueryCol1Msg"));
2281 pQueryCol1Choice
= new wxChoice(this, QUERY_DIALOG_COL_CHOICE
, wxPoint( 10, 27), wxSize(250, 27), 0, 0, 0, wxDefaultValidator
, wxT("QueryCol1Choice"));
2282 pQueryNotMsg
= new wxStaticText(this, QUERY_DIALOG_NOT_MSG
, wxT("NOT"), wxPoint(268, 10), wxDefaultSize
, 0, wxT("QueryNotMsg"));
2283 pQueryNotCheck
= new wxCheckBox(this, QUERY_DIALOG_NOT_CHECKBOX
, wxT(""), wxPoint(275, 37), wxSize( 20, 20), 0, wxDefaultValidator
, wxT("QueryNotCheck"));
2285 wxString choice_strings
[9];
2286 choice_strings
[0] = wxT("=");
2287 choice_strings
[1] = wxT("<");
2288 choice_strings
[2] = wxT(">");
2289 choice_strings
[3] = wxT("<=");
2290 choice_strings
[4] = wxT(">=");
2291 choice_strings
[5] = wxT("Begins");
2292 choice_strings
[6] = wxT("Contains");
2293 choice_strings
[7] = wxT("Like");
2294 choice_strings
[8] = wxT("Between");
2296 pQueryOperatorMsg
= new wxStaticText(this, QUERY_DIALOG_OP_MSG
, wxT("Operator:"), wxPoint(305, 10), wxDefaultSize
, 0, wxT("QueryOperatorMsg"));
2297 pQueryOperatorChoice
= new wxChoice(this, QUERY_DIALOG_OP_CHOICE
, wxPoint(305, 27), wxSize( 80, 27), 9, choice_strings
, 0, wxDefaultValidator
, wxT("QueryOperatorChoice"));
2298 pQueryCol2Msg
= new wxStaticText(this, QUERY_DIALOG_COL2_MSG
, wxT("Column 2:"), wxPoint( 10, 65), wxSize( 69, 16), 0, wxT("QueryCol2Msg"));
2299 pQueryCol2Choice
= new wxChoice(this, QUERY_DIALOG_COL2_CHOICE
, wxPoint( 10, 82), wxSize(250, 27), 0, 0, 0, wxDefaultValidator
, wxT("QueryCol2Choice"));
2300 pQuerySqlWhereMsg
= new wxStaticText(this, QUERY_DIALOG_WHERE_MSG
, wxT("SQL where clause:"), wxPoint( 10, 141), wxDefaultSize
, 0, wxT("QuerySqlWhereMsg"));
2301 pQuerySqlWhereMtxt
= new wxTextCtrl(this, QUERY_DIALOG_WHERE_TEXT
, wxT(""), wxPoint( 10, 159), wxSize(377, 134), wxTE_MULTILINE
, wxDefaultValidator
, wxT("QuerySqlWhereMtxt"));
2302 pQueryAddBtn
= new wxButton(this, QUERY_DIALOG_ADD
, wxT("&Add"), wxPoint(406, 24), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryAddBtn"));
2303 pQueryAndBtn
= new wxButton(this, QUERY_DIALOG_AND
, wxT("A&nd"), wxPoint(406, 58), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryAndBtn"));
2304 pQueryOrBtn
= new wxButton(this, QUERY_DIALOG_OR
, wxT("&Or"), wxPoint(406, 92), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryOrBtn"));
2305 pQueryLParenBtn
= new wxButton(this, QUERY_DIALOG_LPAREN
, wxT("("), wxPoint(406, 126), wxSize( 26, 26), 0, wxDefaultValidator
, wxT("QueryLParenBtn"));
2306 pQueryRParenBtn
= new wxButton(this, QUERY_DIALOG_RPAREN
, wxT(")"), wxPoint(436, 126), wxSize( 26, 26), 0, wxDefaultValidator
, wxT("QueryRParenBtn"));
2307 pQueryDoneBtn
= new wxButton(this, QUERY_DIALOG_DONE
, wxT("&Done"), wxPoint(406, 185), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryDoneBtn"));
2308 pQueryClearBtn
= new wxButton(this, QUERY_DIALOG_CLEAR
, wxT("C&lear"), wxPoint(406, 218), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryClearBtn"));
2309 pQueryCountBtn
= new wxButton(this, QUERY_DIALOG_COUNT
, wxT("&Count"), wxPoint(406, 252), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryCountBtn"));
2310 pQueryValue1Msg
= new wxStaticText(this, QUERY_DIALOG_VALUE1_MSG
, wxT("Value:"), wxPoint(277, 66), wxDefaultSize
, 0, wxT("QueryValue1Msg"));
2311 pQueryValue1Txt
= new wxTextCtrl(this, QUERY_DIALOG_VALUE1_TEXT
, wxT(""), wxPoint(277, 83), wxSize(108, 25), 0, wxDefaultValidator
, wxT("QueryValue1Txt"));
2312 pQueryValue2Msg
= new wxStaticText(this, QUERY_DIALOG_VALUE2_MSG
, wxT("AND"), wxPoint(238, 126), wxDefaultSize
, 0, wxT("QueryValue2Msg"));
2313 pQueryValue2Txt
= new wxTextCtrl(this, QUERY_DIALOG_VALUE2_TEXT
, wxT(""), wxPoint(277, 120), wxSize(108, 25), 0, wxDefaultValidator
, wxT("QueryValue2Txt"));
2314 pQueryHintGrp
= new wxStaticBox(this, QUERY_DIALOG_HINT_GROUP
, wxT(""), wxPoint( 10, 291), wxSize(377, 40), 0, wxT("QueryHintGrp"));
2315 pQueryHintMsg
= new wxStaticText(this, QUERY_DIALOG_HINT_MSG
, wxT(""), wxPoint( 16, 306), wxDefaultSize
, 0, wxT("QueryHintMsg"));
2317 widgetPtrsSet
= true;
2318 // Initialize the dialog
2320 pQueryCol2Choice
->Append(wxT("VALUE -->"));
2321 colInf
= pDB
->GetColumns(tblName
);
2327 tStr
= wxT("ODBC error during GetColumns()\n\n");
2328 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
2329 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
2334 for (i
= 0; colInf
[i
].colName
&& wxStrlen(colInf
[i
].colName
); i
++)
2336 // If there is more than one table being queried, qualify
2337 // the column names with the table name prefix.
2338 if (tblName
[1] && wxStrlen(tblName
[1]))
2340 qualName
.Printf(wxT("%s.%s"), colInf
[i
].tableName
, colInf
[i
].colName
);
2341 pQueryCol1Choice
->Append(qualName
);
2342 pQueryCol2Choice
->Append(qualName
);
2344 else // Single table query, append just the column names
2346 pQueryCol1Choice
->Append(colInf
[i
].colName
);
2347 pQueryCol2Choice
->Append(colInf
[i
].colName
);
2351 pQueryCol1Choice
->SetSelection(0);
2352 pQueryCol2Choice
->SetSelection(0);
2353 pQueryOperatorChoice
->SetSelection(0);
2355 pQueryValue2Msg
->Show(false);
2356 pQueryValue2Txt
->Show(false);
2358 pQueryHintMsg
->SetLabel(langQRY_EQ
);
2360 pQuerySqlWhereMtxt
->SetValue(pWhere
.c_str());
2364 // Display the dialog window
2367 } // CqueryDlg() constructor
2370 CqueryDlg::~CqueryDlg()
2372 } // CqueryDlg::~CqueryDlg() destructor
2375 void CqueryDlg::OnButton(wxCommandEvent
&event
)
2377 wxWindow
*win
= (wxWindow
*) event
.GetEventObject();
2378 OnCommand( *win
, event
);
2379 } // CqueryDlg::OnButton()
2382 void CqueryDlg::OnCommand(wxWindow
& win
, wxCommandEvent
& WXUNUSED(event
))
2384 // Widget pointers won't be set when the dialog is constructed.
2385 // Control is passed through this function once for each widget on
2386 // a dialog as the dialog is constructed.
2390 wxString widgetName
= win
.GetName();
2392 // Operator choice box
2393 if (widgetName
== pQueryOperatorChoice
->GetName())
2395 // Set the help text
2396 switch((qryOp
) pQueryOperatorChoice
->GetSelection())
2399 pQueryHintMsg
->SetLabel(langQRY_EQ
);
2402 pQueryHintMsg
->SetLabel(langQRY_LT
);
2405 pQueryHintMsg
->SetLabel(langQRY_GT
);
2408 pQueryHintMsg
->SetLabel(langQRY_LE
);
2411 pQueryHintMsg
->SetLabel(langQRY_GE
);
2414 pQueryHintMsg
->SetLabel(langQRY_BEGINS
);
2417 pQueryHintMsg
->SetLabel(langQRY_CONTAINS
);
2420 pQueryHintMsg
->SetLabel(langQRY_LIKE
);
2423 pQueryHintMsg
->SetLabel(langQRY_BETWEEN
);
2427 // Hide the value2 widget
2428 pQueryValue2Msg
->Show(false); // BETWEEN will show this widget
2429 pQueryValue2Txt
->Show(false); // BETWEEN will show this widget
2431 // Disable the NOT operator for <, <=, >, >=
2432 switch((qryOp
) pQueryOperatorChoice
->GetSelection())
2438 pQueryNotCheck
->SetValue(0);
2439 pQueryNotCheck
->Enable(false);
2442 pQueryNotCheck
->Enable(true);
2446 // Manipulate the dialog to handle the selected operator
2447 switch((qryOp
) pQueryOperatorChoice
->GetSelection())
2454 pQueryCol2Choice
->Enable(true);
2455 if (pQueryCol2Choice
->GetSelection()) // Column name is highlighted
2457 pQueryValue1Msg
->Show(false);
2458 pQueryValue1Txt
->Show(false);
2460 else // "Value" is highlighted
2462 pQueryValue1Msg
->Show(true);
2463 pQueryValue1Txt
->Show(true);
2464 pQueryValue1Txt
->SetFocus();
2470 pQueryCol2Choice
->SetSelection(0);
2471 pQueryCol2Choice
->Enable(false);
2472 pQueryValue1Msg
->Show(true);
2473 pQueryValue1Txt
->Show(true);
2474 pQueryValue1Txt
->SetFocus();
2477 pQueryCol2Choice
->SetSelection(0);
2478 pQueryCol2Choice
->Enable(false);
2479 pQueryValue2Msg
->Show(true);
2480 pQueryValue2Txt
->Show(true);
2481 pQueryValue1Msg
->Show(true);
2482 pQueryValue1Txt
->Show(true);
2483 pQueryValue1Txt
->SetFocus();
2489 } // Operator choice box
2492 if (widgetName
== pQueryCol2Choice
->GetName())
2494 if (pQueryCol2Choice
->GetSelection()) // Column name is highlighted
2496 pQueryValue1Msg
->Show(false);
2497 pQueryValue1Txt
->Show(false);
2499 else // "Value" is highlighted
2501 pQueryValue1Msg
->Show(true);
2502 pQueryValue1Txt
->Show(true);
2503 pQueryValue1Txt
->SetFocus();
2506 } // Column 2 choice
2509 if (widgetName
== pQueryAddBtn
->GetName())
2516 if (widgetName
== pQueryAndBtn
->GetName())
2518 AppendToWhere(wxT(" AND\n"));
2523 if (widgetName
== pQueryOrBtn
->GetName())
2525 AppendToWhere(wxT(" OR\n"));
2529 // Left Paren button
2530 if (widgetName
== pQueryLParenBtn
->GetName())
2532 AppendToWhere(wxT("("));
2534 } // Left Paren button
2536 // Right paren button
2537 if (widgetName
== pQueryRParenBtn
->GetName())
2539 AppendToWhere(wxT(")"));
2541 } // Right Paren button
2544 if (widgetName
== pQueryDoneBtn
->GetName())
2546 // Be sure the where clause will not overflow the output buffer
2547 if (wxStrlen(pQuerySqlWhereMtxt
->GetValue()) > (unsigned int)DB_MAX_WHERE_CLAUSE_LEN
)
2550 s
.Printf(wxT("Maximum where clause length exceeded.\nLength must be less than %d"), DB_MAX_WHERE_CLAUSE_LEN
+1);
2551 wxMessageBox(s
,wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
2554 // Validate the where clause for things such as matching parens
2555 if (!ValidateWhereClause())
2557 // Copy the where clause to the output buffer and exit
2558 pWhere
= pQuerySqlWhereMtxt
->GetValue();
2564 if (widgetName
== pQueryClearBtn
->GetName())
2566 bool Ok
= (wxMessageBox(wxT("Are you sure you wish to clear the Query?"),wxT("Confirm"),wxYES_NO
|wxICON_QUESTION
) == wxYES
);
2569 pQuerySqlWhereMtxt
->SetValue(wxT(""));
2574 if (widgetName
== pQueryCountBtn
->GetName())
2576 wxBeginBusyCursor();
2582 } // CqueryDlg::OnCommand
2585 void CqueryDlg::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
2592 GetParent()->SetFocus();
2597 SetReturnCode(1); // added so BoundsChecker would not report use of uninitialized variable
2600 } // CqueryDlg::OnCloseWindow()
2603 void CqueryDlg::AppendToWhere(wxChar
*s
)
2605 wxString whereStr
= pQuerySqlWhereMtxt
->GetValue();
2607 pQuerySqlWhereMtxt
->SetValue(whereStr
);
2608 } // CqueryDlg::AppendToWhere()
2611 void CqueryDlg::ProcessAddBtn()
2613 qryOp oper
= (qryOp
) pQueryOperatorChoice
->GetSelection();
2615 // Verify that eveything is filled in correctly
2616 if (pQueryCol2Choice
->GetSelection() == 0) // "Value" is selected
2618 // Verify that value 1 is filled in
2619 if (wxStrlen(pQueryValue1Txt
->GetValue()) == 0)
2622 pQueryValue1Txt
->SetFocus();
2625 // For the BETWEEN operator, value 2 must be filled in as well
2626 if (oper
== qryOpBETWEEN
&&
2627 wxStrlen(pQueryValue2Txt
->GetValue()) == 0)
2630 pQueryValue2Txt
->SetFocus();
2635 // Build the expression and append it to the where clause window
2636 wxString s
= pQueryCol1Choice
->GetStringSelection();
2638 if (pQueryNotCheck
->GetValue() && (oper
!= qryOpEQ
))
2644 if (pQueryNotCheck
->GetValue()) // NOT box is checked
2667 s
+= wxT(" BETWEEN");
2673 int col1Idx
= pQueryCol1Choice
->GetSelection();
2676 if (colInf
[col1Idx
].sqlDataType
== SQL_VARCHAR
||
2677 oper
== qryOpBEGINS
||
2678 oper
== qryOpCONTAINS
||
2682 if (pQueryCol2Choice
->GetSelection()) // Column name
2683 s
+= pQueryCol2Choice
->GetStringSelection();
2684 else // Column 2 is a "value"
2688 if (oper
== qryOpCONTAINS
)
2690 s
+= pQueryValue1Txt
->GetValue();
2691 if (oper
== qryOpCONTAINS
|| oper
== qryOpBEGINS
)
2697 if (oper
== qryOpBETWEEN
)
2702 s
+= pQueryValue2Txt
->GetValue();
2707 AppendToWhere((wxChar
*) (const wxChar
*) s
);
2709 } // CqueryDlg::ProcessAddBtn()
2712 void CqueryDlg::ProcessCountBtn()
2714 if (!ValidateWhereClause())
2717 if (!dbTable
) // wxDbTable object needs to be created and opened
2719 dbTable
= new wxDbTable(pDB
, masterTableName
, 0, wxT(""),
2721 wxGetApp().DbConnectInf
->GetDefaultDir());
2724 wxMessageBox(wxT("Memory allocation failed creating a wxDbTable object."),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
2727 if (!dbTable
->Open())
2730 tStr
= wxT("ODBC error during Open()\n\n");
2731 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
2732 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
2737 // Count() with WHERE clause
2740 whereStr
= pQuerySqlWhereMtxt
->GetValue();
2741 dbTable
->SetWhereClause(whereStr
.c_str());
2743 ULONG whereCnt
= dbTable
->Count();
2745 // Count() of all records in the table
2746 dbTable
->SetWhereClause(wxT(""));
2747 ULONG totalCnt
= dbTable
->Count();
2749 if (whereCnt
> 0 || totalCnt
== 0)
2752 tStr
.Printf(wxT("%lu of %lu records match the query criteria."),whereCnt
,totalCnt
);
2753 wxMessageBox(tStr
,wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
2758 tStr
.Printf(wxT("%lu of %lu records match the query criteria.\n\nEither the criteria entered produced a result set\nwith no records, or there was a syntactical error\nin the clause you entered.\n\nPress the details button to see if any database errors were reported."),whereCnt
,totalCnt
);
2759 wxMessageBox(tStr
,wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
2762 // After a wxMessageBox, the focus does not necessarily return to the
2763 // window which was the focus when the message box popped up, so return
2764 // focus to the Query dialog for certain
2767 } // CqueryDlg::ProcessCountBtn()
2770 bool CqueryDlg::ValidateWhereClause()
2772 wxString where
= pQuerySqlWhereMtxt
->GetValue();
2774 if (where
.Freq(wxT('(')) != where
.Freq(wxT(')')))
2776 wxMessageBox(wxT("There are mismatched parenthesis in the constructed where clause"),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
2779 // After a wxMessageBox, the focus does not necessarily return to the
2780 // window which was the focus when the message box popped up, so return
2781 // focus to the Query dialog for certain
2786 } // CqueryDlg::ValidateWhereClause()
2790 void DisplayDbDiagnostics(wxDb
*pDb
)
2795 s
= wxT("Diagnostics Output\n");
2796 s
+= langDBINF_DB_NAME
;
2797 s
+= pDb
->dbInf
.dbmsName
;
2800 s
+= langDBINF_DB_VER
;
2801 s
+= pDb
->dbInf
.dbmsVer
;
2804 s
+= langDBINF_DRIVER_NAME
;
2805 s
+= pDb
->dbInf
.driverName
;
2808 s
+= langDBINF_DRIVER_ODBC_VER
;
2809 s
+= pDb
->dbInf
.odbcVer
;
2812 s
+= langDBINF_DRIVER_MGR_ODBC_VER
;
2813 s
+= pDb
->dbInf
.drvMgrOdbcVer
;
2816 s
+= langDBINF_DRIVER_VER
;
2817 s
+= pDb
->dbInf
.driverVer
;
2820 s
+= langDBINF_SERVER_NAME
;
2821 s
+= pDb
->dbInf
.serverName
;
2824 s
+= langDBINF_FILENAME
;
2825 s
+= pDb
->dbInf
.databaseName
;
2828 s
+= langDBINF_OUTER_JOINS
;
2829 s
+= pDb
->dbInf
.outerJoins
;
2832 s
+= langDBINF_STORED_PROC
;
2833 s
+= pDb
->dbInf
.procedureSupport
;
2836 if (pDb
->dbInf
.maxConnections
)
2837 t
.sprintf(wxT("%s%d\n"), langDBINF_MAX_HDBC
, pDb
->dbInf
.maxConnections
);
2839 t
.sprintf(wxT("%s%s\n"), langDBINF_MAX_HDBC
, langDBINF_UNLIMITED
);
2842 if (pDb
->dbInf
.maxStmts
)
2843 t
.sprintf(wxT("%s%d\n"), langDBINF_MAX_HSTMT
, pDb
->dbInf
.maxStmts
);
2845 t
.sprintf(wxT("%s%s\n"), langDBINF_MAX_HSTMT
, langDBINF_UNLIMITED
);
2848 s
+= langDBINF_API_LVL
;
2849 switch(pDb
->dbInf
.apiConfLvl
)
2851 case SQL_OAC_NONE
: s
+= langDBINF_NONE
; break;
2852 case SQL_OAC_LEVEL1
: s
+= langDBINF_LEVEL1
; break;
2853 case SQL_OAC_LEVEL2
: s
+= langDBINF_LEVEL2
; break;
2857 s
+= langDBINF_CLI_LVL
;
2858 switch(pDb
->dbInf
.cliConfLvl
)
2860 case SQL_OSCC_NOT_COMPLIANT
: s
+= langDBINF_NOT_COMPLIANT
; break;
2861 case SQL_OSCC_COMPLIANT
: s
+= langDBINF_COMPLIANT
; break;
2865 s
+= langDBINF_SQL_LVL
;
2866 switch(pDb
->dbInf
.sqlConfLvl
)
2868 case SQL_OSC_MINIMUM
: s
+= langDBINF_MIN_GRAMMAR
; break;
2869 case SQL_OSC_CORE
: s
+= langDBINF_CORE_GRAMMAR
; break;
2870 case SQL_OSC_EXTENDED
: s
+= langDBINF_EXT_GRAMMAR
; break;
2874 s
+= langDBINF_COMMIT_BEHAVIOR
;
2875 switch(pDb
->dbInf
.cursorCommitBehavior
)
2877 case SQL_CB_DELETE
: s
+= langDBINF_DELETE_CURSORS
; break;
2878 case SQL_CB_CLOSE
: s
+= langDBINF_CLOSE_CURSORS
; break;
2879 case SQL_CB_PRESERVE
: s
+= langDBINF_PRESERVE_CURSORS
; break;
2883 s
+= langDBINF_ROLLBACK_BEHAVIOR
;
2884 switch(pDb
->dbInf
.cursorRollbackBehavior
)
2886 case SQL_CB_DELETE
: s
+= langDBINF_DELETE_CURSORS
; break;
2887 case SQL_CB_CLOSE
: s
+= langDBINF_CLOSE_CURSORS
; break;
2888 case SQL_CB_PRESERVE
: s
+= langDBINF_PRESERVE_CURSORS
; break;
2892 s
+= langDBINF_SUPP_NOT_NULL
;
2893 switch(pDb
->dbInf
.supportNotNullClause
)
2895 case SQL_NNC_NULL
: s
+= langNO
; break;
2896 case SQL_NNC_NON_NULL
: s
+= langYES
; break;
2900 s
+= langDBINF_SUPP_IEF
;
2901 s
+= pDb
->dbInf
.supportIEF
;
2904 // DEFAULT setting for "Transaction Isolation Level"
2905 s
+= langDBINF_TXN_ISOLATION
;
2906 switch(pDb
->dbInf
.txnIsolation
)
2908 case SQL_TXN_READ_UNCOMMITTED
: s
+= langDBINF_READ_UNCOMMITTED
; break;
2909 case SQL_TXN_READ_COMMITTED
: s
+= langDBINF_READ_COMMITTED
; break;
2910 case SQL_TXN_REPEATABLE_READ
: s
+= langDBINF_REPEATABLE_READ
; break;
2911 case SQL_TXN_SERIALIZABLE
: s
+= langDBINF_SERIALIZABLE
; break;
2913 case SQL_TXN_VERSIONING
: s
+= langDBINF_VERSIONING
; break;
2918 // CURRENT setting for "Transaction Isolation Level"
2920 s
+= langDBINF_TXN_ISOLATION_CURR
;
2921 if (SQLGetConnectOption(pDb
->GetHDBC(),SQL_TXN_ISOLATION
,&txnIsoLvl
) == SQL_SUCCESS
)
2925 case SQL_TXN_READ_UNCOMMITTED
: s
+= langDBINF_READ_UNCOMMITTED
; break;
2926 case SQL_TXN_READ_COMMITTED
: s
+= langDBINF_READ_COMMITTED
; break;
2927 case SQL_TXN_REPEATABLE_READ
: s
+= langDBINF_REPEATABLE_READ
; break;
2928 case SQL_TXN_SERIALIZABLE
: s
+= langDBINF_SERIALIZABLE
; break;
2930 case SQL_TXN_VERSIONING
: s
+= langDBINF_VERSIONING
; break;
2937 #pragma message disable incboodep
2940 s
+= langDBINF_TXN_ISOLATION_OPTS
;
2941 if (pDb
->dbInf
.txnIsolationOptions
& SQL_TXN_READ_UNCOMMITTED
)
2942 {s
+= langDBINF_READ_UNCOMMITTED
; comma
++;}
2943 if (pDb
->dbInf
.txnIsolationOptions
& SQL_TXN_READ_COMMITTED
)
2944 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_READ_COMMITTED
;}
2945 if (pDb
->dbInf
.txnIsolationOptions
& SQL_TXN_REPEATABLE_READ
)
2946 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_REPEATABLE_READ
;}
2947 if (pDb
->dbInf
.txnIsolationOptions
& SQL_TXN_SERIALIZABLE
)
2948 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_SERIALIZABLE
;}
2950 if (pDb
->dbInf
.txnIsolationOptions
& SQL_TXN_VERSIONING
)
2951 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_VERSIONING
;}
2956 s
+= langDBINF_FETCH_DIRS
;
2957 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_NEXT
)
2958 {s
+= langDBINF_NEXT
; comma
++;}
2959 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_PRIOR
)
2960 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_PREV
;}
2961 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_FIRST
)
2962 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_FIRST
;}
2963 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_LAST
)
2964 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_LAST
;}
2965 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_ABSOLUTE
)
2966 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_ABSOLUTE
;}
2967 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_RELATIVE
)
2968 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_RELATIVE
;}
2970 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_RESUME
)
2971 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_RESUME
;}
2973 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_BOOKMARK
)
2974 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_BOOKMARK
;}
2978 s
+= langDBINF_LOCK_TYPES
;
2979 if (pDb
->dbInf
.lockTypes
& SQL_LCK_NO_CHANGE
)
2980 {s
+= langDBINF_NO_CHANGE
; comma
++;}
2981 if (pDb
->dbInf
.lockTypes
& SQL_LCK_EXCLUSIVE
)
2982 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_EXCLUSIVE
;}
2983 if (pDb
->dbInf
.lockTypes
& SQL_LCK_UNLOCK
)
2984 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_UNLOCK
;}
2988 s
+= langDBINF_POS_OPERS
;
2989 if (pDb
->dbInf
.posOperations
& SQL_POS_POSITION
)
2990 {s
+= langDBINF_POSITION
; comma
++;}
2991 if (pDb
->dbInf
.posOperations
& SQL_POS_REFRESH
)
2992 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_REFRESH
;}
2993 if (pDb
->dbInf
.posOperations
& SQL_POS_UPDATE
)
2994 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_UPD
;}
2995 if (pDb
->dbInf
.posOperations
& SQL_POS_DELETE
)
2996 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_DEL
;}
2997 if (pDb
->dbInf
.posOperations
& SQL_POS_ADD
)
2998 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_ADD
;}
3002 s
+= langDBINF_POS_STMTS
;
3003 if (pDb
->dbInf
.posStmts
& SQL_PS_POSITIONED_DELETE
)
3004 {s
+= langDBINF_POS_DEL
; comma
++;}
3005 if (pDb
->dbInf
.posStmts
& SQL_PS_POSITIONED_UPDATE
)
3006 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_POS_UPD
;}
3007 if (pDb
->dbInf
.posStmts
& SQL_PS_SELECT_FOR_UPDATE
)
3008 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_SELECT_FOR_UPD
;}
3012 s
+= langDBINF_SCROLL_CONCURR
;
3013 if (pDb
->dbInf
.scrollConcurrency
& SQL_SCCO_READ_ONLY
)
3014 {s
+= langDBINF_READ_ONLY
; comma
++;}
3015 if (pDb
->dbInf
.scrollConcurrency
& SQL_SCCO_LOCK
)
3016 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_LOCK
;}
3017 if (pDb
->dbInf
.scrollConcurrency
& SQL_SCCO_OPT_ROWVER
)
3018 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_OPT_ROWVER
;}
3019 if (pDb
->dbInf
.scrollConcurrency
& SQL_SCCO_OPT_VALUES
)
3020 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_OPT_VALUES
;}
3024 s
+= langDBINF_SCROLL_OPTS
;
3025 if (pDb
->dbInf
.scrollOptions
& SQL_SO_FORWARD_ONLY
)
3026 {s
+= langDBINF_FWD_ONLY
; comma
++;}
3027 if (pDb
->dbInf
.scrollOptions
& SQL_SO_STATIC
)
3028 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_STATIC
;}
3029 if (pDb
->dbInf
.scrollOptions
& SQL_SO_KEYSET_DRIVEN
)
3030 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_KEYSET_DRIVEN
;}
3031 if (pDb
->dbInf
.scrollOptions
& SQL_SO_DYNAMIC
)
3032 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_DYNAMIC
;}
3033 if (pDb
->dbInf
.scrollOptions
& SQL_SO_MIXED
)
3034 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_MIXED
;}
3038 s
+= langDBINF_STATIC_SENS
;
3039 if (pDb
->dbInf
.staticSensitivity
& SQL_SS_ADDITIONS
)
3040 {s
+= langDBINF_ADDITIONS
; comma
++;}
3041 if (pDb
->dbInf
.staticSensitivity
& SQL_SS_DELETIONS
)
3042 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_DELETIONS
;}
3043 if (pDb
->dbInf
.staticSensitivity
& SQL_SS_UPDATES
)
3044 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_UPDATES
;}
3047 #pragma message enable incboodep
3051 s
+= langDBINF_TXN_CAPABLE
;
3052 switch(pDb
->dbInf
.txnCapable
)
3054 case SQL_TC_NONE
: s
+= langNO
; break;
3055 case SQL_TC_DML
: s
+= langDBINF_DML_ONLY
; break;
3056 case SQL_TC_DDL_COMMIT
: s
+= langDBINF_DDL_COMMIT
; break;
3057 case SQL_TC_DDL_IGNORE
: s
+= langDBINF_DDL_IGNORE
; break;
3058 case SQL_TC_ALL
: s
+= langDBINF_DDL_AND_DML
; break;
3062 t
.sprintf(wxT("%s%lu\n"), langDBINF_LOGIN_TIMEOUT
, pDb
->dbInf
.loginTimeout
);
3065 // Oracle specific information
3066 if (pDb
->Dbms() == dbmsORACLE
)
3069 s
+= langDBINF_ORACLE_BANNER
;
3072 // Oracle cache hit ratio
3075 pDb
->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'db block gets'"));
3077 if (pDb
->GetData(1, SQL_C_ULONG
, &dbBlockGets
, 0, &cb
))
3079 t
.sprintf(wxT("%s: %lu\n"), langDBINF_DB_BLOCK_GETS
, dbBlockGets
);
3083 ULONG consistentGets
;
3084 pDb
->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'consistent gets'"));
3086 if (pDb
->GetData(1, SQL_C_ULONG
, &consistentGets
, 0, &cb
))
3088 t
.sprintf(wxT("%s: %lu\n"), langDBINF_CONSISTENT_GETS
, consistentGets
);
3093 pDb
->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'physical reads'"));
3095 if (pDb
->GetData(1, SQL_C_ULONG
, &physReads
, 0, &cb
))
3097 t
.sprintf(wxT("%s: %lu\n"), langDBINF_PHYSICAL_READS
, physReads
);
3101 ULONG hitRatio
= (ULONG
)((1.00 - ((float)physReads
/ (float)(dbBlockGets
+ consistentGets
))) * 100.00);
3102 t
.sprintf(wxT("*** %s: %lu%%\n"), langDBINF_CACHE_HIT_RATIO
, hitRatio
);
3105 // Tablespace information
3107 s
+= langDBINF_TABLESPACE_IO
;
3110 char tablespaceName
[257];
3111 pDb
->ExecSql(wxT("SELECT NAME,PHYRDS,PHYWRTS FROM V$DATAFILE, V$FILESTAT WHERE V$DATAFILE.FILE# = V$FILESTAT.FILE#"));
3112 while (pDb
->GetNext())
3114 pDb
->GetData(1, SQL_C_CHAR
, tablespaceName
, 257, &cb
);
3115 pDb
->GetData(2, SQL_C_ULONG
, &physReads
, 0, &cb
);
3116 pDb
->GetData(3, SQL_C_ULONG
, &physWrites
, 0, &cb
);
3117 t
.sprintf(wxT("%s\n\t%s: %lu\t%s: %lu\n"), tablespaceName
,
3118 langDBINF_PHYSICAL_READS
, physReads
, langDBINF_PHYSICAL_WRITES
, physWrites
);
3125 s
+= wxT("End of Diagnostics\n");
3128 } // DisplayDbDiagnostics()
3132 BEGIN_EVENT_TABLE(DbGridFrame
, wxFrame
)
3133 // EVT_CLOSE(DbGridFrame::OnCloseWindow)
3137 DbGridFrame::DbGridFrame(wxWindow
*parent
)
3138 : wxFrame (parent
, wxID_ANY
, wxT("Database Table"),
3139 wxDefaultPosition
, wxSize(400, 325))
3141 initialized
= false;
3145 void DbGridFrame::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
3151 bool DbGridFrame::Initialize()
3153 wxGrid
*grid
= new wxGrid(this, wxID_ANY
, wxDefaultPosition
);
3155 grid
->RegisterDataType(wxGRID_VALUE_DATETIME
,
3156 new wxGridCellDateTimeRenderer(wxT("%d %b %Y")),
3157 new wxGridCellTextEditor
);
3159 grid
->RegisterDataType(wxGRID_VALUE_CHOICEINT
,
3160 new wxGridCellEnumRenderer
,
3161 new wxGridCellEnumEditor
);
3163 wxString
NativeLangChoice( wxString::Format(wxT("%s:%s,%s,%s,%s,%s"),wxGRID_VALUE_CHOICEINT
,
3171 // Columns must match the sequence specified in SetColDef() calls
3172 wxDbGridColInfo
* cols
=
3173 new wxDbGridColInfo( 0,wxGRID_VALUE_STRING
,wxT("Name"),
3174 new wxDbGridColInfo( 1,wxGRID_VALUE_STRING
,wxT("Address 1"),
3175 new wxDbGridColInfo( 2,wxGRID_VALUE_STRING
,wxT("Address 2"),
3176 new wxDbGridColInfo( 3,wxGRID_VALUE_STRING
,wxT("City"),
3177 new wxDbGridColInfo( 4,wxGRID_VALUE_STRING
,wxT("State"),
3178 new wxDbGridColInfo( 5,wxGRID_VALUE_STRING
,wxT("PostCode"),
3179 new wxDbGridColInfo( 6,wxGRID_VALUE_STRING
,wxT("Country"),
3180 new wxDbGridColInfo( 7,wxGRID_VALUE_DBAUTO
,wxT("Join Date"),
3181 new wxDbGridColInfo( 8,wxGRID_VALUE_BOOL
, wxT("Developer"),
3182 new wxDbGridColInfo( 9,wxGRID_VALUE_NUMBER
,wxT("Contributions"),
3183 new wxDbGridColInfo(10,wxGRID_VALUE_NUMBER
,wxT("Lines Of Code"),
3185 new wxDbGridColInfo(11,NativeLangChoice
, wxT("Native Language"),NULL
))))))))))));
3187 new wxDbGridColInfo(11,wxGRID_VALUE_NUMBER
,wxT("Native Language"),NULL
))))))))))));
3190 Ccontact
*Contact
= new Ccontact();
3191 //wxGetApp().Contact
3195 wxMessageBox(wxT("Unable to instantiate an instance of Ccontact"), wxT("Error..."), wxOK
| wxICON_EXCLAMATION
);
3199 if (!Contact
->Open())
3201 if (Contact
->GetDb()->TableExists(CONTACT_TABLE_NAME
, Contact
->GetDb()->GetUsername(),
3202 wxGetApp().DbConnectInf
->GetDefaultDir()))
3205 tStr
.Printf(wxT("Unable to open the table '%s'.\n\n"),CONTACT_TABLE_NAME
);
3206 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
3207 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
3213 // Execute the following query using the cursor designated
3214 // for full table query
3215 Contact
->SetRowMode(wxDbTable::WX_ROW_MODE_QUERY
);
3217 if (!Contact
->Query())
3220 tStr
= wxT("ODBC error during Query()\n\n");
3221 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
3222 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
3226 // No data has been read in from the database yet, so
3227 // we need to initialize the data members to valid values
3228 // so Fit() can correctly size the grid
3229 Contact
->Initialize();
3231 wxDbGridTableBase
* db
= new wxDbGridTableBase(Contact
, cols
, wxUSE_QUERY
, true);
3235 grid
->SetTable(db
,true);
3236 grid
->SetMargins(0, 0);
3239 wxSize size
= grid
->GetSize();
3242 SetClientSize(size
);
3245 } // DbGridFrame::Initialize()
3247 #endif // #if wxUSE_GRID
3250 TEST CODE FOR TESTING THE wxDbCreateDataSource() FUNCTION
3253 result = wxDbCreateDataSource(wxT("Microsoft Access Driver (*.mdb)"),wxT("GLT-TEST2"),wxT("GLT-Descrip"),false,wxT(""),this);
3256 // check for errors caused by ConfigDSN based functions
3259 wxChar errMsg[500+1];
3260 errMsg[0] = wxT('\0');
3262 SQLInstallerError(1,&retcode,errMsg,500,&cb);
3264 wxMessageBox(wxT("FAILED creating data source"),wxT("FAILED"));
3267 wxMessageBox(wxT("SUCCEEDED creating data source"),wxT("SUCCESS"));