1 ///////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxWindows 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(")");
100 wxLogMessage(nativeDataTypeName
);
104 if (DataTypeSupported(pDb
,SQL_C_BIT
, &nativeDataTypeName
))
106 nativeDataTypeName
= wxT("SQL_C_BIT (") + nativeDataTypeName
;
107 nativeDataTypeName
+= wxT(")");
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(")");
116 wxLogMessage(nativeDataTypeName
);
120 if (DataTypeSupported(pDb
,SQL_C_CHAR
, &nativeDataTypeName
))
122 nativeDataTypeName
= wxT("SQL_C_CHAR (") + nativeDataTypeName
;
123 nativeDataTypeName
+= wxT(")");
124 wxLogMessage(nativeDataTypeName
);
128 if (DataTypeSupported(pDb
,SQL_C_DATE
, &nativeDataTypeName
))
130 nativeDataTypeName
= wxT("SQL_C_DATE (") + nativeDataTypeName
;
131 nativeDataTypeName
+= wxT(")");
132 wxLogMessage(nativeDataTypeName
);
136 if (DataTypeSupported(pDb
,SQL_C_DEFAULT
, &nativeDataTypeName
))
138 nativeDataTypeName
= wxT("SQL_C_DEFAULT (") + nativeDataTypeName
;
139 nativeDataTypeName
+= wxT(")");
140 wxLogMessage(nativeDataTypeName
);
144 if (DataTypeSupported(pDb
,SQL_C_DOUBLE
, &nativeDataTypeName
))
146 nativeDataTypeName
= wxT("SQL_C_DOUBLE (") + nativeDataTypeName
;
147 nativeDataTypeName
+= wxT(")");
148 wxLogMessage(nativeDataTypeName
);
152 if (DataTypeSupported(pDb
,SQL_C_FLOAT
, &nativeDataTypeName
))
154 nativeDataTypeName
= wxT("SQL_C_FLOAT (") + nativeDataTypeName
;
155 nativeDataTypeName
+= wxT(")");
156 wxLogMessage(nativeDataTypeName
);
160 if (DataTypeSupported(pDb
,SQL_C_GUID
, &nativeDataTypeName
))
162 nativeDataTypeName
= wxT("SQL_C_GUID (") + nativeDataTypeName
;
163 nativeDataTypeName
+= wxT(")");
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(")");
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(")");
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(")");
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(")");
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(")");
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(")");
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(")");
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(")");
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(")");
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(")");
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(")");
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(")");
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(")");
268 wxLogMessage(nativeDataTypeName
);
272 if (DataTypeSupported(pDb
,SQL_C_LONG
, &nativeDataTypeName
))
274 nativeDataTypeName
= wxT("SQL_C_LONG (") + nativeDataTypeName
;
275 nativeDataTypeName
+= wxT(")");
276 wxLogMessage(nativeDataTypeName
);
280 if (DataTypeSupported(pDb
,SQL_C_NUMERIC
, &nativeDataTypeName
))
282 nativeDataTypeName
= wxT("SQL_C_NUMERIC (") + nativeDataTypeName
;
283 nativeDataTypeName
+= wxT(")");
284 wxLogMessage(nativeDataTypeName
);
288 if (DataTypeSupported(pDb
,SQL_C_SBIGINT
, &nativeDataTypeName
))
290 nativeDataTypeName
= wxT("SQL_C_SBIGINT (") + nativeDataTypeName
;
291 nativeDataTypeName
+= wxT(")");
292 wxLogMessage(nativeDataTypeName
);
296 if (DataTypeSupported(pDb
,SQL_C_SHORT
, &nativeDataTypeName
))
298 nativeDataTypeName
= wxT("SQL_C_SHORT (") + nativeDataTypeName
;
299 nativeDataTypeName
+= wxT(")");
300 wxLogMessage(nativeDataTypeName
);
304 if (DataTypeSupported(pDb
,SQL_C_SLONG
, &nativeDataTypeName
))
306 nativeDataTypeName
= wxT("SQL_C_SLONG (") + nativeDataTypeName
;
307 nativeDataTypeName
+= wxT(")");
308 wxLogMessage(nativeDataTypeName
);
312 if (DataTypeSupported(pDb
,SQL_C_SSHORT
, &nativeDataTypeName
))
314 nativeDataTypeName
= wxT("SQL_C_SSHORT (") + nativeDataTypeName
;
315 nativeDataTypeName
+= wxT(")");
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(")");
324 wxLogMessage(nativeDataTypeName
);
328 if (DataTypeSupported(pDb
,SQL_C_TIME
, &nativeDataTypeName
))
330 nativeDataTypeName
= wxT("SQL_C_TIME (") + nativeDataTypeName
;
331 nativeDataTypeName
+= wxT(")");
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(")");
340 wxLogMessage(nativeDataTypeName
);
344 if (DataTypeSupported(pDb
,SQL_C_TINYINT
, &nativeDataTypeName
))
346 nativeDataTypeName
= wxT("SQL_C_TINYINT (") + nativeDataTypeName
;
347 nativeDataTypeName
+= wxT(")");
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(")");
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(")");
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(")");
372 wxLogMessage(nativeDataTypeName
);
376 if (DataTypeSupported(pDb
,SQL_C_UBIGINT
, &nativeDataTypeName
))
378 nativeDataTypeName
= wxT("SQL_C_UBIGINT (") + nativeDataTypeName
;
379 nativeDataTypeName
+= wxT(")");
380 wxLogMessage(nativeDataTypeName
);
384 if (DataTypeSupported(pDb
,SQL_C_ULONG
, &nativeDataTypeName
))
386 nativeDataTypeName
= wxT("SQL_C_ULONG (") + nativeDataTypeName
;
387 nativeDataTypeName
+= wxT(")");
388 wxLogMessage(nativeDataTypeName
);
392 if (DataTypeSupported(pDb
,SQL_C_USHORT
, &nativeDataTypeName
))
394 nativeDataTypeName
= wxT("SQL_C_USHORT (") + nativeDataTypeName
;
395 nativeDataTypeName
+= wxT(")");
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(")");
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(")");
412 wxLogMessage(nativeDataTypeName
);
416 // Extended SQL types
418 if (DataTypeSupported(pDb
,SQL_DATE
, &nativeDataTypeName
))
420 nativeDataTypeName
= wxT("SQL_DATE (") + nativeDataTypeName
;
421 nativeDataTypeName
+= wxT(")");
422 wxLogMessage(nativeDataTypeName
);
426 if (DataTypeSupported(pDb
,SQL_INTERVAL
, &nativeDataTypeName
))
428 nativeDataTypeName
= wxT("SQL_INTERVAL (") + nativeDataTypeName
;
429 nativeDataTypeName
+= wxT(")");
430 wxLogMessage(nativeDataTypeName
);
434 if (DataTypeSupported(pDb
,SQL_TIME
, &nativeDataTypeName
))
436 nativeDataTypeName
= wxT("SQL_TIME (") + nativeDataTypeName
;
437 nativeDataTypeName
+= wxT(")");
438 wxLogMessage(nativeDataTypeName
);
442 if (DataTypeSupported(pDb
,SQL_TIMESTAMP
, &nativeDataTypeName
))
444 nativeDataTypeName
= wxT("SQL_TIMESTAMP (") + nativeDataTypeName
;
445 nativeDataTypeName
+= wxT(")");
446 wxLogMessage(nativeDataTypeName
);
449 #ifdef SQL_LONGVARCHAR
450 if (DataTypeSupported(pDb
,SQL_LONGVARCHAR
, &nativeDataTypeName
))
452 nativeDataTypeName
= wxT("SQL_LONGVARCHAR (") + nativeDataTypeName
;
453 nativeDataTypeName
+= wxT(")");
454 wxLogMessage(nativeDataTypeName
);
458 if (DataTypeSupported(pDb
,SQL_BINARY
, &nativeDataTypeName
))
460 nativeDataTypeName
= wxT("SQL_BINARY (") + nativeDataTypeName
;
461 nativeDataTypeName
+= wxT(")");
462 wxLogMessage(nativeDataTypeName
);
466 if (DataTypeSupported(pDb
,SQL_VARBINARY
, &nativeDataTypeName
))
468 nativeDataTypeName
= wxT("SQL_VARBINARY (") + nativeDataTypeName
;
469 nativeDataTypeName
+= wxT(")");
470 wxLogMessage(nativeDataTypeName
);
473 #ifdef SQL_LONGVARBINARY
474 if (DataTypeSupported(pDb
,SQL_LONGVARBINARY
, &nativeDataTypeName
))
476 nativeDataTypeName
= wxT("SQL_LOGVARBINARY (") + nativeDataTypeName
;
477 nativeDataTypeName
+= wxT(")");
478 wxLogMessage(nativeDataTypeName
);
482 if (DataTypeSupported(pDb
,SQL_BIGINT
, &nativeDataTypeName
))
484 nativeDataTypeName
= wxT("SQL_BIGINT (") + nativeDataTypeName
;
485 nativeDataTypeName
+= wxT(")");
486 wxLogMessage(nativeDataTypeName
);
490 if (DataTypeSupported(pDb
,SQL_TINYINT
, &nativeDataTypeName
))
492 nativeDataTypeName
= wxT("SQL_TINYINT (") + nativeDataTypeName
;
493 nativeDataTypeName
+= wxT(")");
494 wxLogMessage(nativeDataTypeName
);
498 if (DataTypeSupported(pDb
,SQL_BIT
, &nativeDataTypeName
))
500 nativeDataTypeName
= wxT("SQL_BIT (") + nativeDataTypeName
;
501 nativeDataTypeName
+= wxT(")");
502 wxLogMessage(nativeDataTypeName
);
506 if (DataTypeSupported(pDb
,SQL_GUID
, &nativeDataTypeName
))
508 nativeDataTypeName
= wxT("SQL_GUID (") + nativeDataTypeName
;
509 nativeDataTypeName
+= wxT(")");
510 wxLogMessage(nativeDataTypeName
);
515 if (DataTypeSupported(pDb
,SQL_CHAR
, &nativeDataTypeName
))
517 nativeDataTypeName
= wxT("SQL_CHAR (") + nativeDataTypeName
;
518 nativeDataTypeName
+= wxT(")");
519 wxLogMessage(nativeDataTypeName
);
523 if (DataTypeSupported(pDb
,SQL_INTEGER
, &nativeDataTypeName
))
525 nativeDataTypeName
= wxT("SQL_INTEGER (") + nativeDataTypeName
;
526 nativeDataTypeName
+= wxT(")");
527 wxLogMessage(nativeDataTypeName
);
531 if (DataTypeSupported(pDb
,SQL_SMALLINT
, &nativeDataTypeName
))
533 nativeDataTypeName
= wxT("SQL_SAMLLINT (") + nativeDataTypeName
;
534 nativeDataTypeName
+= wxT(")");
535 wxLogMessage(nativeDataTypeName
);
539 if (DataTypeSupported(pDb
,SQL_REAL
, &nativeDataTypeName
))
541 nativeDataTypeName
= wxT("SQL_REAL (") + nativeDataTypeName
;
542 nativeDataTypeName
+= wxT(")");
543 wxLogMessage(nativeDataTypeName
);
547 if (DataTypeSupported(pDb
,SQL_DOUBLE
, &nativeDataTypeName
))
549 nativeDataTypeName
= wxT("SQL_DOUBLE (") + nativeDataTypeName
;
550 nativeDataTypeName
+= wxT(")");
551 wxLogMessage(nativeDataTypeName
);
555 if (DataTypeSupported(pDb
,SQL_NUMERIC
, &nativeDataTypeName
))
557 nativeDataTypeName
= wxT("SQL_NUMERIC (") + nativeDataTypeName
;
558 nativeDataTypeName
+= wxT(")");
559 wxLogMessage(nativeDataTypeName
);
563 if (DataTypeSupported(pDb
,SQL_DATE
, &nativeDataTypeName
))
565 nativeDataTypeName
= wxT("SQL_DATE (") + nativeDataTypeName
;
566 nativeDataTypeName
+= wxT(")");
567 wxLogMessage(nativeDataTypeName
);
571 if (DataTypeSupported(pDb
,SQL_TIME
, &nativeDataTypeName
))
573 nativeDataTypeName
= wxT("SQL_TIME (") + nativeDataTypeName
;
574 nativeDataTypeName
+= wxT(")");
575 wxLogMessage(nativeDataTypeName
);
579 if (DataTypeSupported(pDb
,SQL_TIMESTAMP
, &nativeDataTypeName
))
581 nativeDataTypeName
= wxT("SQL_TIMESTAMP (") + nativeDataTypeName
;
582 nativeDataTypeName
+= wxT(")");
583 wxLogMessage(nativeDataTypeName
);
587 if (DataTypeSupported(pDb
,SQL_VARCHAR
, &nativeDataTypeName
))
589 nativeDataTypeName
= wxT("SQL_VARCHAR (") + nativeDataTypeName
;
590 nativeDataTypeName
+= wxT(")");
591 wxLogMessage(nativeDataTypeName
);
597 if (DataTypeSupported(pDb
,SQL_C_TCHAR
, &nativeDataTypeName
))
599 nativeDataTypeName
= wxT("SQL_C_TCHAR (") + nativeDataTypeName
;
600 nativeDataTypeName
+= wxT(")");
601 wxLogMessage(nativeDataTypeName
);
605 wxLogMessage(wxT("\n"));
606 } // CheckSupportForAllDataTypes()
609 bool DatabaseDemoApp::OnInit()
614 // Create the main frame window
615 DemoFrame
= new DatabaseDemoFrame(NULL
, wxT("wxWindows 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
, -1, title
, pos
, size
)
838 // Put any code in necessary for initializing the main frame here
842 delete wxLog::SetActiveTarget(new wxLogStderr
);
844 } // DatabaseDemoFrame constructor
846 DatabaseDemoFrame::~DatabaseDemoFrame()
848 delete wxLog::SetActiveTarget(NULL
);
849 } // DatabaseDemoFrame destructor
852 void DatabaseDemoFrame::OnCreate(wxCommandEvent
& WXUNUSED(event
))
854 wxGetApp().CreateDataTable(FALSE
);
855 } // DatabaseDemoFrame::OnCreate()
858 void DatabaseDemoFrame::OnRecreateTable(wxCommandEvent
& WXUNUSED(event
))
860 wxGetApp().CreateDataTable(TRUE
);
861 } // DatabaseDemoFrame::OnRecreate()
864 void DatabaseDemoFrame::OnRecreateIndexes(wxCommandEvent
& WXUNUSED(event
))
866 wxGetApp().Contact
->GetDb()->RollbackTrans(); // Make sure the current cursor is in a known/stable state
868 if (!wxGetApp().Contact
->CreateIndexes(TRUE
))
873 tStr
= wxT("Error creating CONTACTS indexes.\nNew indexes will be unavailable.\n\n");
874 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
875 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
879 wxMessageBox(wxT("Index(es) were successfully recreated."),wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
881 } // DatabaseDemoFrame::OnRecreateIndexes()
885 void DatabaseDemoFrame::OnDbGridTable(wxCommandEvent
& WXUNUSED(event
))
887 DbGridFrame
*frame
= new DbGridFrame(this);
888 if (frame
->Initialize())
895 void DatabaseDemoFrame::OnExit(wxCommandEvent
& WXUNUSED(event
))
898 } // DatabaseDemoFrame::OnExit()
901 void DatabaseDemoFrame::OnEditParameters(wxCommandEvent
& WXUNUSED(event
))
903 if ((pEditorDlg
->mode
!= mCreate
) && (pEditorDlg
->mode
!= mEdit
))
904 BuildParameterDialog(this);
906 wxMessageBox(wxT("Cannot change database parameters while creating or editing a record"),wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
907 } // DatabaseDemoFrame::OnEditParameters()
910 void DatabaseDemoFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
))
912 wxMessageBox(wxT("wxWindows sample program for database classes\n\nContributed on 27 July 1998"),wxT("About..."),wxOK
| wxICON_INFORMATION
);
913 } // DatabaseDemoFrame::OnAbout()
916 // Put any additional checking necessary to make certain it is alright
917 // to close the program here that is not done elsewhere
918 void DatabaseDemoFrame::OnCloseWindow(wxCloseEvent
& event
)
921 if (pEditorDlg
&& pEditorDlg
->Close())
932 wxDELETE(wxGetApp().Contact
);
934 // This function will close all the connections to the database that have been
935 // previously cached.
936 wxDbCloseConnections();
938 // Deletion of the wxDbConnectInf instance must be the LAST thing done that
939 // has anything to do with the database. Deleting this before disconnecting,
940 // freeing/closing connections, etc will result in a crash!
941 wxDELETE(wxGetApp().DbConnectInf
);
945 } // DatabaseDemoFrame::OnCloseWindow()
948 void DatabaseDemoFrame::BuildEditorDialog()
951 pEditorDlg
= new CeditorDlg(this);
954 pEditorDlg
->Initialize();
955 if (!pEditorDlg
->initialized
)
959 wxMessageBox(wxT("Unable to initialize the editor dialog for some reason"),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
965 wxMessageBox(wxT("Unable to create the editor dialog for some reason"),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
968 } // DatabaseDemoFrame::BuildEditorDialog()
971 void DatabaseDemoFrame::BuildParameterDialog(wxWindow
*parent
)
973 pParamDlg
= new CparameterDlg(parent
);
976 wxMessageBox(wxT("Unable to create the parameter dialog for some reason"),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
977 } // DatabaseDemoFrame::BuildParameterDialog()
981 * Constructor note: If no wxDb object is passed in, a new connection to the database
982 * is created for this instance of Ccontact. This can be a slow process depending
983 * on the database engine being used, and some database engines have a limit on the
984 * number of connections (either hard limits, or license restricted) so care should
985 * be used to use as few connections as is necessary.
987 * IMPORTANT: Objects which share a wxDb pointer are ALL acted upon whenever a member
988 * function of pDb is called (i.e. CommitTrans() or RollbackTrans(), so if modifying
989 * or creating a table objects which use the same pDb, know that all the objects
990 * will be committed or rolled back when any of the objects has this function call made.
992 Ccontact::Ccontact (wxDb
*pwxDb
) : wxDbTable(pwxDb
? pwxDb
: wxDbGetConnection(wxGetApp().DbConnectInf
),
993 CONTACT_TABLE_NAME
, CONTACT_NO_COLS
, wxT(""),
994 !wxDB_QUERY_ONLY
, wxGetApp().DbConnectInf
->GetDefaultDir())
996 // This is used to represent whether the database connection should be released
997 // when this instance of the object is deleted. If using the same connection
998 // for multiple instance of database objects, then the connection should only be
999 // released when the last database instance using the connection is deleted
1000 freeDbConn
= !pwxDb
;
1003 GetDb()->SetSqlLogging(sqlLogON
);
1007 } // Ccontact Constructor
1010 void Ccontact::Initialize()
1019 JoinDate
.year
= 1980;
1023 JoinDate
.minute
= 0;
1024 JoinDate
.second
= 0;
1025 JoinDate
.fraction
= 0;
1026 NativeLanguage
= langENGLISH
;
1027 IsDeveloper
= FALSE
;
1030 } // Ccontact::Initialize
1033 Ccontact::~Ccontact()
1037 if (!wxDbFreeConnection(GetDb()))
1040 tStr
= wxT("Unable to Free the Ccontact data table handle\n\n");
1042 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1043 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1046 } // Ccontract destructor
1050 * Handles setting up all the connections for the interface from the wxDbTable
1051 * functions to interface to the data structure used to store records in
1052 * memory, and for all the column definitions that define the table structure
1054 void Ccontact::SetupColumns()
1056 // NOTE: Columns now are 8 character names, as that is all dBase can support. Longer
1057 // names can be used for other database engines
1058 SetColDefs ( 0,wxT("NAME"), DB_DATA_TYPE_VARCHAR
, Name
, SQL_C_CHAR
, sizeof(Name
), TRUE
, TRUE
); // Primary index
1059 SetColDefs ( 1,wxT("ADDRESS1"), DB_DATA_TYPE_VARCHAR
, Addr1
, SQL_C_CHAR
, sizeof(Addr1
), FALSE
,TRUE
);
1060 SetColDefs ( 2,wxT("ADDRESS2"), DB_DATA_TYPE_VARCHAR
, Addr2
, SQL_C_CHAR
, sizeof(Addr2
), FALSE
,TRUE
);
1061 SetColDefs ( 3,wxT("CITY"), DB_DATA_TYPE_VARCHAR
, City
, SQL_C_CHAR
, sizeof(City
), FALSE
,TRUE
);
1062 SetColDefs ( 4,wxT("STATE"), DB_DATA_TYPE_VARCHAR
, State
, SQL_C_CHAR
, sizeof(State
), FALSE
,TRUE
);
1063 SetColDefs ( 5,wxT("POSTCODE"), DB_DATA_TYPE_VARCHAR
, PostalCode
, SQL_C_CHAR
, sizeof(PostalCode
), FALSE
,TRUE
);
1064 SetColDefs ( 6,wxT("COUNTRY"), DB_DATA_TYPE_VARCHAR
, Country
, SQL_C_CHAR
, sizeof(Country
), FALSE
,TRUE
);
1065 SetColDefs ( 7,wxT("JOINDATE"), DB_DATA_TYPE_DATE
, &JoinDate
, SQL_C_TIMESTAMP
, sizeof(JoinDate
), FALSE
,TRUE
);
1066 SetColDefs ( 8,wxT("IS_DEV"), DB_DATA_TYPE_INTEGER
, &IsDeveloper
, SQL_C_BOOLEAN(IsDeveloper
), sizeof(IsDeveloper
), FALSE
,TRUE
);
1067 SetColDefs ( 9,wxT("CONTRIBS"), DB_DATA_TYPE_INTEGER
, &Contributions
, SQL_C_UTINYINT
, sizeof(Contributions
), FALSE
,TRUE
);
1068 SetColDefs (10,wxT("LINE_CNT"), DB_DATA_TYPE_INTEGER
, &LinesOfCode
, SQL_C_ULONG
, sizeof(LinesOfCode
), FALSE
,TRUE
);
1069 SetColDefs (11,wxT("LANGUAGE"), DB_DATA_TYPE_INTEGER
, &NativeLanguage
, SQL_C_ENUM
, sizeof(NativeLanguage
), FALSE
,TRUE
);
1070 #if wxODBC_BLOB_EXPERIMENT > 0
1071 SetColDefs (12,wxT("PICTURE"), DB_DATA_TYPE_BLOB
, Picture
, SQL_C_BINARY
, sizeof(Picture
), FALSE
,TRUE
);
1073 } // Ccontact::SetupColumns
1076 bool Ccontact::CreateIndexes(bool recreate
)
1078 // This index could easily be accomplished with an "orderBy" clause,
1079 // but is done to show how to construct a non-primary index.
1081 wxDbIdxDef idxDef
[2];
1085 wxStrcpy(idxDef
[0].ColName
, wxT("IS_DEV"));
1086 idxDef
[0].Ascending
= TRUE
;
1088 wxStrcpy(idxDef
[1].ColName
, wxT("NAME"));
1089 idxDef
[1].Ascending
= TRUE
;
1091 indexName
= GetTableName();
1092 indexName
+= wxT("_IDX1");
1093 Ok
= CreateIndex(indexName
.c_str(), TRUE
, 2, idxDef
, recreate
);
1096 } // Ccontact::CreateIndexes()
1100 * Having a function to do a query on the primary key (and possibly others) is
1101 * very efficient and tighter coding so that it is available where ever the object
1102 * is. Great for use with multiple tables when not using views or outer joins
1104 bool Ccontact::FetchByName(const wxString
&name
)
1106 whereStr
.Printf(wxT("NAME = '%s'"),name
.c_str());
1107 SetWhereClause(whereStr
.c_str());
1108 SetOrderByClause(wxT(""));
1116 } // Ccontact::FetchByName()
1121 * ************* DIALOGS ***************
1126 /* CeditorDlg constructor
1128 * Creates the dialog used for creating/editing/deleting/copying a Ccontact object.
1129 * This dialog actually is drawn in the main frame of the program
1131 * An instance of Ccontact is created - "Contact" - which is used to hold the Ccontact
1132 * object that is currently being worked with.
1135 BEGIN_EVENT_TABLE(CeditorDlg
, wxPanel
)
1136 EVT_BUTTON(-1, CeditorDlg::OnButton
)
1137 EVT_CLOSE(CeditorDlg::OnCloseWindow
)
1140 CeditorDlg::CeditorDlg(wxWindow
*parent
) : wxPanel (parent
, 0, 0, 537, 480)
1142 // Since the ::OnCommand() function is overridden, this prevents the widget
1143 // detection in ::OnCommand() until all widgets have been initialized to prevent
1144 // uninitialized pointers from crashing the program
1145 widgetPtrsSet
= FALSE
;
1147 initialized
= FALSE
;
1152 } // CeditorDlg constructor
1155 void CeditorDlg::OnCloseWindow(wxCloseEvent
& event
)
1158 if ((mode
!= mCreate
) && (mode
!= mEdit
))
1164 wxMessageBox(wxT("Must finish processing the current record being created/modified before exiting"),wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
1167 } // CeditorDlg::OnCloseWindow()
1170 void CeditorDlg::OnButton(wxCommandEvent
&event
)
1172 wxWindow
*win
= (wxWindow
*) event
.GetEventObject();
1173 OnCommand( *win
, event
);
1174 } // CeditorDlg::OnButton()
1177 void CeditorDlg::OnCommand(wxWindow
& win
, wxCommandEvent
& WXUNUSED(event
))
1179 wxString widgetName
;
1181 widgetName
= win
.GetName();
1186 if (widgetName
== pCreateBtn
->GetName())
1188 wxGetApp().Contact
->Initialize();
1191 pNameTxt
->SetValue(wxT(""));
1192 pNameTxt
->SetFocus();
1196 if (widgetName
== pEditBtn
->GetName())
1198 saveName
= wxGetApp().Contact
->Name
;
1200 pNameTxt
->SetFocus();
1204 if (widgetName
== pCopyBtn
->GetName())
1207 pNameTxt
->SetValue(wxT(""));
1208 pNameTxt
->SetFocus();
1212 if (widgetName
== pDeleteBtn
->GetName())
1214 bool Ok
= (wxMessageBox(wxT("Are you sure?"),wxT("Confirm"),wxYES_NO
|wxICON_QUESTION
) == wxYES
);
1219 if (Ok
&& wxGetApp().Contact
->Delete())
1221 // NOTE: Deletions are not finalized until a CommitTrans() is performed.
1222 // If the commit were not performed, the program will continue to
1223 // show the table contents as if they were deleted until this instance
1224 // of Ccontact is deleted. If the Commit wasn't performed, the
1225 // database will automatically Rollback the changes when the database
1226 // connection is terminated
1227 wxGetApp().Contact
->GetDb()->CommitTrans();
1229 // Try to get the row that followed the just deleted row in the orderBy sequence
1232 // There was now row (in sequence) after the just deleted row, so get the
1233 // row which preceded the just deleted row
1236 // There are now no rows remaining, so clear the dialog widgets
1237 wxGetApp().Contact
->Initialize();
1241 SetMode(mode
); // force reset of button enable/disable
1245 wxGetApp().Contact
->GetDb()->RollbackTrans();
1251 if (widgetName
== pSaveBtn
->GetName())
1257 if (widgetName
== pCancelBtn
->GetName())
1259 bool Ok
= (wxMessageBox(wxT("Are you sure?"),wxT("Confirm"),wxYES_NO
|wxICON_QUESTION
) == wxYES
);
1264 if (saveName
.IsEmpty())
1266 wxGetApp().Contact
->Initialize();
1273 // Requery previous record
1274 if (wxGetApp().Contact
->FetchByName(saveName
))
1282 // Previous record not available, retrieve first record in table
1283 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1284 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1286 wxGetApp().Contact
->whereStr
= wxT("NAME = (SELECT MIN(NAME) FROM ");
1287 wxGetApp().Contact
->whereStr
+= wxGetApp().Contact
->GetTableName();
1288 wxGetApp().Contact
->whereStr
+= wxT(")");
1289 wxGetApp().Contact
->SetWhereClause(wxGetApp().Contact
->whereStr
.c_str());
1292 wxGetApp().Contact
->SetWhereClause(wxT(""));
1294 if (!wxGetApp().Contact
->Query())
1297 tStr
= wxT("ODBC error during Query()\n\n");
1298 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1299 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1304 if (wxGetApp().Contact
->GetNext()) // Successfully read first record
1310 // No contacts are available, clear dialog
1311 wxGetApp().Contact
->Initialize();
1317 if (widgetName
== pPrevBtn
->GetName())
1324 if (widgetName
== pNextBtn
->GetName())
1331 if (widgetName
== pQueryBtn
->GetName())
1333 // Display the query dialog box
1334 wxChar qryWhere
[DB_MAX_WHERE_CLAUSE_LEN
+1];
1335 wxStrcpy(qryWhere
, (const wxChar
*) wxGetApp().Contact
->qryWhereStr
);
1336 wxChar
*tblName
[] = {(wxChar
*)CONTACT_TABLE_NAME
, 0};
1337 new CqueryDlg(GetParent(), wxGetApp().Contact
->GetDb(), tblName
, qryWhere
);
1339 // Query the first record in the new record set and
1340 // display it, if the query string has changed.
1341 if (wxStrcmp(qryWhere
, (const wxChar
*) wxGetApp().Contact
->qryWhereStr
))
1343 wxGetApp().Contact
->whereStr
.Empty();
1344 wxGetApp().Contact
->SetOrderByClause(wxT("NAME"));
1346 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1347 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1349 wxGetApp().Contact
->whereStr
= wxT("NAME = (SELECT MIN(NAME) FROM ");
1350 wxGetApp().Contact
->whereStr
+= CONTACT_TABLE_NAME
;
1353 // Append the query where string (if there is one)
1354 wxGetApp().Contact
->qryWhereStr
= qryWhere
;
1355 if (wxStrlen(qryWhere
))
1357 wxGetApp().Contact
->whereStr
+= wxT(" WHERE ");
1358 wxGetApp().Contact
->whereStr
+= wxGetApp().Contact
->qryWhereStr
;
1360 // Close the expression with a right paren
1361 wxGetApp().Contact
->whereStr
+= wxT(")");
1362 // Requery the table
1363 wxGetApp().Contact
->SetWhereClause(wxGetApp().Contact
->whereStr
.c_str());
1364 if (!wxGetApp().Contact
->Query())
1367 tStr
= wxT("ODBC error during Query()\n\n");
1368 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1369 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1373 // Display the first record from the query set
1374 if (!wxGetApp().Contact
->GetNext())
1375 wxGetApp().Contact
->Initialize();
1379 // Enable/Disable the reset button
1380 pResetBtn
->Enable(!wxGetApp().Contact
->qryWhereStr
.IsEmpty());
1386 if (widgetName
== pResetBtn
->GetName())
1388 // Clear the additional where criteria established by the query feature
1389 wxGetApp().Contact
->qryWhereStr
= wxT("");
1390 wxGetApp().Contact
->SetOrderByClause(wxT("NAME"));
1392 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1393 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1395 wxGetApp().Contact
->whereStr
= wxT("NAME = (SELECT MIN(NAME) FROM ");
1396 wxGetApp().Contact
->whereStr
+= CONTACT_TABLE_NAME
;
1397 wxGetApp().Contact
->whereStr
+= wxT(")");
1400 wxGetApp().Contact
->SetWhereClause(wxGetApp().Contact
->whereStr
.c_str());
1401 if (!wxGetApp().Contact
->Query())
1404 tStr
= wxT("ODBC error during Query()\n\n");
1405 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1406 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1409 if (!wxGetApp().Contact
->GetNext())
1410 wxGetApp().Contact
->Initialize();
1412 pResetBtn
->Enable(FALSE
);
1418 if (widgetName
== pNameListBtn
->GetName())
1420 new ClookUpDlg(/* wxWindow *parent */ this,
1421 /* wxChar *windowTitle */ wxT("Select contact name"),
1422 /* wxChar *tableName */ (wxChar
*) CONTACT_TABLE_NAME
,
1423 /* wxChar *dispCol1 */ wxT("NAME"),
1424 /* wxChar *dispCol2 */ wxT("JOINDATE"),
1425 /* wxChar *where */ wxT(""),
1426 /* wxChar *orderBy */ wxT("NAME"),
1427 /* wxDb *pDb */ wxGetApp().READONLY_DB
,
1428 /* const wxString &defDir */ wxGetApp().DbConnectInf
->GetDefaultDir(),
1429 /* bool distinctValues */ TRUE
);
1431 if (ListDB_Selection
&& wxStrlen(ListDB_Selection
))
1433 wxString w
= wxT("NAME = '");
1434 w
+= ListDB_Selection
;
1442 if (widgetName
== pDataTypesBtn
->GetName())
1444 CheckSupportForAllDataTypes(wxGetApp().READONLY_DB
);
1445 wxMessageBox(wxT("Support datatypes was dumped to stdout."));
1447 } // Data types Button
1449 if (widgetName
== pDbDiagsBtn
->GetName())
1451 DisplayDbDiagnostics(wxGetApp().READONLY_DB
);
1452 wxMessageBox(wxT("Diagnostics info was dumped to stdout."));
1456 if (widgetName
== pCatalogBtn
->GetName())
1458 if (wxGetApp().Contact
->GetDb()->Catalog(wxT(""),wxT("catalog.txt")))
1459 wxMessageBox(wxT("The file 'catalog.txt' was created."));
1461 wxMessageBox(wxT("Creation of the file 'catalog.txt' was failed."));
1465 } // CeditorDlg::OnCommand()
1468 bool CeditorDlg::Initialize()
1470 // Create the data structure and a new database connection.
1471 // (As there is not a pDb being passed in the constructor, a new database
1472 // connection is created)
1473 wxGetApp().Contact
= new Ccontact();
1475 if (!wxGetApp().Contact
)
1477 wxMessageBox(wxT("Unable to instantiate an instance of Ccontact"),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
1481 // Check if the table exists or not. If it doesn't, ask the user if they want to
1482 // create the table. Continue trying to create the table until it exists, or user aborts
1483 while (!wxGetApp().Contact
->GetDb()->TableExists((wxChar
*)CONTACT_TABLE_NAME
,
1484 wxGetApp().DbConnectInf
->GetUserID(),
1485 wxGetApp().DbConnectInf
->GetDefaultDir()))
1488 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
);
1489 bool createTable
= (wxMessageBox(tStr
.c_str(),wxT("Confirm"),wxYES_NO
|wxICON_QUESTION
) == wxYES
);
1497 wxGetApp().CreateDataTable(FALSE
);
1500 // Tables must be "opened" before anything other than creating/deleting table can be done
1501 if (!wxGetApp().Contact
->Open())
1503 // Table does exist, or there was some problem opening it. Currently this should
1504 // never fail, except in the case of the table not exisiting or the current
1505 // user has insufficent privileges to access the table
1507 // This code is experimenting with a new function that will hopefully be available
1508 // in the 2.4 release. This check will determine whether the open failing was due
1509 // to the table not existing, or the users privileges being insufficient to
1511 if (!wxGetApp().Contact
->GetDb()->TablePrivileges(CONTACT_TABLE_NAME
, wxT("SELECT"),
1512 wxGetApp().Contact
->GetDb()->GetUsername(),
1513 wxGetApp().Contact
->GetDb()->GetUsername(),
1514 wxGetApp().DbConnectInf
->GetDefaultDir()))
1517 tStr
.Printf(wxT("Unable to open the table '%s' (likely due to\ninsufficient privileges of the logged in user).\n\n"),CONTACT_TABLE_NAME
);
1519 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1520 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1524 if (!wxGetApp().Contact
->GetDb()->TableExists(CONTACT_TABLE_NAME
,
1525 wxGetApp().Contact
->GetDb()->GetUsername(),
1526 wxGetApp().DbConnectInf
->GetDefaultDir()))
1529 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
);
1530 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1531 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1539 (void)new wxStaticBox(this, EDITOR_DIALOG_FN_GROUP
, wxT(""), wxPoint(15, 1), wxSize(497, 69), 0, wxT("FunctionGrp"));
1540 (void)new wxStaticBox(this, EDITOR_DIALOG_SEARCH_GROUP
, wxT(""), wxPoint(417, 1), wxSize(95, 242), 0, wxT("SearchGrp"));
1542 pCreateBtn
= new wxButton(this, EDITOR_DIALOG_CREATE
, wxT("&Create"), wxPoint( 25, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("CreateBtn"));
1543 pEditBtn
= new wxButton(this, EDITOR_DIALOG_EDIT
, wxT("&Edit"), wxPoint(102, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("EditBtn"));
1544 pDeleteBtn
= new wxButton(this, EDITOR_DIALOG_DELETE
, wxT("&Delete"), wxPoint(179, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("DeleteBtn"));
1545 pCopyBtn
= new wxButton(this, EDITOR_DIALOG_COPY
, wxT("Cop&y"), wxPoint(256, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("CopyBtn"));
1546 pSaveBtn
= new wxButton(this, EDITOR_DIALOG_SAVE
, wxT("&Save"), wxPoint(333, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("SaveBtn"));
1547 pCancelBtn
= new wxButton(this, EDITOR_DIALOG_CANCEL
, wxT("C&ancel"), wxPoint(430, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("CancelBtn"));
1548 pPrevBtn
= new wxButton(this, EDITOR_DIALOG_PREV
, wxT("<< &Prev"), wxPoint(430, 81), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("PrevBtn"));
1549 pNextBtn
= new wxButton(this, EDITOR_DIALOG_NEXT
, wxT("&Next >>"), wxPoint(430, 121), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("NextBtn"));
1550 pQueryBtn
= new wxButton(this, EDITOR_DIALOG_QUERY
, wxT("&Query"), wxPoint(430, 161), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("QueryBtn"));
1551 pResetBtn
= new wxButton(this, EDITOR_DIALOG_RESET
, wxT("&Reset"), wxPoint(430, 200), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("ResetBtn"));
1552 pNameMsg
= new wxStaticText(this, EDITOR_DIALOG_NAME_MSG
, wxT("Name:"), wxPoint( 17, 80), wxSize( -1, -1), 0, wxT("NameMsg"));
1553 pNameTxt
= new wxTextCtrl(this, EDITOR_DIALOG_NAME_TEXT
, wxT(""), wxPoint( 17, 97), wxSize(308, 25), 0, wxDefaultValidator
, wxT("NameTxt"));
1554 pNameListBtn
= new wxButton(this, EDITOR_DIALOG_LOOKUP
, wxT("&Lookup"), wxPoint(333, 97), wxSize( 70, 24), 0, wxDefaultValidator
, wxT("LookupBtn"));
1555 pAddress1Msg
= new wxStaticText(this, EDITOR_DIALOG_ADDRESS1_MSG
, wxT("Address:"), wxPoint( 17, 130), wxSize( -1, -1), 0, wxT("Address1Msg"));
1556 pAddress1Txt
= new wxTextCtrl(this, EDITOR_DIALOG_ADDRESS2_TEXT
, wxT(""), wxPoint( 17, 147), wxSize(308, 25), 0, wxDefaultValidator
, wxT("Address1Txt"));
1557 pAddress2Msg
= new wxStaticText(this, EDITOR_DIALOG_ADDRESS2_MSG
, wxT("Address:"), wxPoint( 17, 180), wxSize( -1, -1), 0, wxT("Address2Msg"));
1558 pAddress2Txt
= new wxTextCtrl(this, EDITOR_DIALOG_ADDRESS2_TEXT
, wxT(""), wxPoint( 17, 197), wxSize(308, 25), 0, wxDefaultValidator
, wxT("Address2Txt"));
1559 pCityMsg
= new wxStaticText(this, EDITOR_DIALOG_CITY_MSG
, wxT("City:"), wxPoint( 17, 230), wxSize( -1, -1), 0, wxT("CityMsg"));
1560 pCityTxt
= new wxTextCtrl(this, EDITOR_DIALOG_CITY_TEXT
, wxT(""), wxPoint( 17, 247), wxSize(225, 25), 0, wxDefaultValidator
, wxT("CityTxt"));
1561 pStateMsg
= new wxStaticText(this, EDITOR_DIALOG_STATE_MSG
, wxT("State:"), wxPoint(250, 230), wxSize( -1, -1), 0, wxT("StateMsg"));
1562 pStateTxt
= new wxTextCtrl(this, EDITOR_DIALOG_STATE_TEXT
, wxT(""), wxPoint(250, 247), wxSize(153, 25), 0, wxDefaultValidator
, wxT("StateTxt"));
1563 pCountryMsg
= new wxStaticText(this, EDITOR_DIALOG_COUNTRY_MSG
, wxT("Country:"), wxPoint( 17, 280), wxSize( -1, -1), 0, wxT("CountryMsg"));
1564 pCountryTxt
= new wxTextCtrl(this, EDITOR_DIALOG_COUNTRY_TEXT
, wxT(""), wxPoint( 17, 297), wxSize(225, 25), 0, wxDefaultValidator
, wxT("CountryTxt"));
1565 pPostalCodeMsg
= new wxStaticText(this, EDITOR_DIALOG_POSTAL_MSG
, wxT("Postal Code:"),wxPoint(250, 280), wxSize( -1, -1), 0, wxT("PostalCodeMsg"));
1566 pPostalCodeTxt
= new wxTextCtrl(this, EDITOR_DIALOG_POSTAL_TEXT
, wxT(""), wxPoint(250, 297), wxSize(153, 25), 0, wxDefaultValidator
, wxT("PostalCodeTxt"));
1568 wxString choice_strings
[5];
1569 choice_strings
[0] = wxT("English");
1570 choice_strings
[1] = wxT("French");
1571 choice_strings
[2] = wxT("German");
1572 choice_strings
[3] = wxT("Spanish");
1573 choice_strings
[4] = wxT("Other");
1575 pNativeLangChoice
= new wxChoice(this, EDITOR_DIALOG_LANG_CHOICE
, wxPoint( 17, 346), wxSize(277, -1), 5, choice_strings
);
1576 pNativeLangMsg
= new wxStaticText(this, EDITOR_DIALOG_LANG_MSG
, wxT("Native language:"), wxPoint( 17, 330), wxSize( -1, -1), 0, wxT("NativeLangMsg"));
1578 wxString radio_strings
[2];
1579 radio_strings
[0] = wxT("No");
1580 radio_strings
[1] = wxT("Yes");
1581 pDeveloperRadio
= new wxRadioBox(this,EDITOR_DIALOG_DEVELOPER
, wxT("Developer:"), wxPoint(303, 330), wxSize( -1, -1), 2, radio_strings
, 2, wxHORIZONTAL
);
1582 pJoinDateMsg
= new wxStaticText(this, EDITOR_DIALOG_JOIN_MSG
, wxT("Date joined:"), wxPoint( 17, 380), wxSize( -1, -1), 0, wxT("JoinDateMsg"));
1583 pJoinDateTxt
= new wxTextCtrl(this, EDITOR_DIALOG_JOIN_TEXT
, wxT(""), wxPoint( 17, 397), wxSize(150, 25), 0, wxDefaultValidator
, wxT("JoinDateTxt"));
1584 pContribMsg
= new wxStaticText(this, EDITOR_DIALOG_CONTRIB_MSG
,wxT("Contributions:"), wxPoint(175, 380), wxSize( -1, -1), 0, wxT("ContribMsg"));
1585 pContribTxt
= new wxTextCtrl(this, EDITOR_DIALOG_CONTRIB_TEXT
, wxT(""), wxPoint(175, 397), wxSize(120, 25), 0, wxDefaultValidator
, wxT("ContribTxt"));
1586 pLinesMsg
= new wxStaticText(this, EDITOR_DIALOG_LINES_MSG
, wxT("Lines of code:"), wxPoint(303, 380), wxSize( -1, -1), 0, wxT("LinesMsg"));
1587 pLinesTxt
= new wxTextCtrl(this, EDITOR_DIALOG_LINES_TEXT
, wxT(""), wxPoint(303, 397), wxSize(100, 25), 0, wxDefaultValidator
, wxT("LinesTxt"));
1589 pCatalogBtn
= new wxButton(this, EDITOR_DIALOG_CATALOG
, wxT("Catalo&g"), wxPoint(430, 287), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("CatalogBtn"));
1590 pDataTypesBtn
= new wxButton(this, EDITOR_DIALOG_DATATYPES
, wxT("Data&types"), wxPoint(430, 337), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("DataTypesBtn"));
1591 pDbDiagsBtn
= new wxButton(this, EDITOR_DIALOG_DB_DIAGS
, wxT("DB Dia&gs"), wxPoint(430, 387), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("DbDiagsBtn"));
1593 // Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to
1594 // handle all widget processing
1595 widgetPtrsSet
= TRUE
;
1597 // Setup the orderBy and where clauses to return back a single record as the result set,
1598 // as there will only be one record being shown on the dialog at a time, this optimizes
1599 // network traffic by only returning a one row result
1601 wxGetApp().Contact
->SetOrderByClause(wxT("NAME")); // field name to sort by
1603 // The wxString "whereStr" is not a member of the wxDbTable object, it is a member variable
1604 // specifically in the Ccontact class. It is used here for simpler construction of a varying
1605 // length string, and then after the string is built, the wxDbTable member variable "where" is
1606 // assigned the pointer to the constructed string.
1608 // The constructed where clause below has a sub-query within it "SELECT MIN(NAME) FROM %s"
1609 // to achieve a single row (in this case the first name in alphabetical order).
1611 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1612 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1614 wxGetApp().Contact
->whereStr
.Printf(wxT("NAME = (SELECT MIN(NAME) FROM %s)"),
1615 wxGetApp().Contact
->GetTableName().c_str());
1616 // NOTE: (const wxChar*) returns a pointer which may not be valid later, so this is short term use only
1617 wxGetApp().Contact
->SetWhereClause(wxGetApp().Contact
->whereStr
);
1620 wxGetApp().Contact
->SetWhereClause(wxT(""));
1622 // Perform the Query to get the result set.
1623 // NOTE: If there are no rows returned, that is a valid result, so Query() would return TRUE.
1624 // Only if there is a database error will Query() come back as FALSE
1625 if (!wxGetApp().Contact
->Query())
1628 tStr
= wxT("ODBC error during Query()\n\n");
1629 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1630 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1634 // Since Query succeeded, now get the row that was returned
1635 if (!wxGetApp().Contact
->GetNext())
1636 // If the GetNext() failed at this point, then there are no rows to retrieve,
1637 // so clear the values in the members of "Contact" so that PutData() blanks the
1638 // widgets on the dialog
1639 wxGetApp().Contact
->Initialize();
1641 wxGetApp().Contact->GetDb()->RollbackTrans();
1650 } // CeditorDlg::Initialize()
1653 void CeditorDlg::FieldsEditable()
1658 pNameTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1659 pAddress1Txt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1660 pAddress2Txt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1661 pCityTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1662 pStateTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1663 pPostalCodeTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1664 pCountryTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1666 pJoinDateTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1667 pContribTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1668 pLinesTxt
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1669 pNativeLangChoice
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1670 pDeveloperRadio
->Enable((mode
== mCreate
) || (mode
== mEdit
));
1672 } // CeditorDlg::FieldsEditable()
1675 void CeditorDlg::SetMode(enum DialogModes m
)
1696 pCreateBtn
->Enable( !edit
);
1697 pEditBtn
->Enable( !edit
&& (wxStrcmp(wxGetApp().Contact
->Name
,wxT(""))!=0) );
1698 pDeleteBtn
->Enable( !edit
&& (wxStrcmp(wxGetApp().Contact
->Name
,wxT(""))!=0) );
1699 pCopyBtn
->Enable( !edit
&& (wxStrcmp(wxGetApp().Contact
->Name
,wxT(""))!=0) );
1700 pSaveBtn
->Enable( edit
);
1701 pCancelBtn
->Enable( edit
);
1702 pPrevBtn
->Enable( !edit
);
1703 pNextBtn
->Enable( !edit
);
1704 pQueryBtn
->Enable( !edit
);
1705 pResetBtn
->Enable( !edit
&& !wxGetApp().Contact
->qryWhereStr
.IsEmpty() );
1706 pNameListBtn
->Enable( !edit
);
1710 } // CeditorDlg::SetMode()
1713 bool CeditorDlg::PutData()
1717 pNameTxt
->SetValue(wxGetApp().Contact
->Name
);
1718 pAddress1Txt
->SetValue(wxGetApp().Contact
->Addr1
);
1719 pAddress2Txt
->SetValue(wxGetApp().Contact
->Addr2
);
1720 pCityTxt
->SetValue(wxGetApp().Contact
->City
);
1721 pStateTxt
->SetValue(wxGetApp().Contact
->State
);
1722 pCountryTxt
->SetValue(wxGetApp().Contact
->Country
);
1723 pPostalCodeTxt
->SetValue(wxGetApp().Contact
->PostalCode
);
1725 tStr
.Printf(wxT("%d/%d/%d"),wxGetApp().Contact
->JoinDate
.month
,wxGetApp().Contact
->JoinDate
.day
,wxGetApp().Contact
->JoinDate
.year
);
1726 pJoinDateTxt
->SetValue(tStr
);
1728 tStr
.Printf(wxT("%d"),wxGetApp().Contact
->Contributions
);
1729 pContribTxt
->SetValue(tStr
);
1731 tStr
.Printf(wxT("%lu"),wxGetApp().Contact
->LinesOfCode
);
1732 pLinesTxt
->SetValue(tStr
);
1734 pNativeLangChoice
->SetSelection(wxGetApp().Contact
->NativeLanguage
);
1736 pDeveloperRadio
->SetSelection(wxGetApp().Contact
->IsDeveloper
);
1739 } // Ceditor::PutData()
1743 * Reads the data out of all the widgets on the dialog. Some data evaluation is done
1744 * to ensure that there is a name entered and that the date field is valid.
1746 * A return value of TRUE means that valid data was retrieved from the dialog, otherwise
1747 * invalid data was found (and a message was displayed telling the user what to fix), and
1748 * the data was not placed into the appropraite fields of Ccontact
1750 bool CeditorDlg::GetData()
1752 // Validate that the data currently entered into the widgets is valid data
1755 tStr
= pNameTxt
->GetValue();
1756 if (!wxStrcmp((const wxChar
*) tStr
,wxT("")))
1758 wxMessageBox(wxT("A name is required for entry into the contact table"),wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
1762 bool invalid
= FALSE
;
1763 int mm
= 1,dd
= 1,yyyy
= 2001;
1766 tStr
= pJoinDateTxt
->GetValue();
1767 if (tStr
.Freq(wxT('/')) != 2)
1770 // Find the month, day, and year tokens
1773 first
= tStr
.First(wxT('/'));
1774 second
= tStr
.Last(wxT('/'));
1776 mm
= wxAtoi(tStr
.SubString(0,first
));
1777 dd
= wxAtoi(tStr
.SubString(first
+1,second
));
1778 yyyy
= wxAtoi(tStr
.SubString(second
+1,tStr
.Length()-1));
1780 invalid
= !(mm
&& dd
&& yyyy
);
1783 // Force Year 2000 compliance
1784 if (!invalid
&& (yyyy
< 1000))
1787 // Check the token ranges for validity
1792 else if ((mm
< 1) || (mm
> 12))
1800 int days
[12] = {31,28,31,30,31,30,
1802 if (dd
> days
[mm
-1])
1805 if ((dd
== 29) && (mm
== 2))
1807 if (((yyyy
% 4) == 0) && (((yyyy
% 100) != 0) || ((yyyy
% 400) == 0)))
1817 wxGetApp().Contact
->JoinDate
.month
= mm
;
1818 wxGetApp().Contact
->JoinDate
.day
= dd
;
1819 wxGetApp().Contact
->JoinDate
.year
= yyyy
;
1823 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
);
1827 tStr
= pNameTxt
->GetValue();
1828 wxStrcpy(wxGetApp().Contact
->Name
,(const wxChar
*) tStr
);
1829 wxStrcpy(wxGetApp().Contact
->Addr1
,pAddress1Txt
->GetValue());
1830 wxStrcpy(wxGetApp().Contact
->Addr2
,pAddress2Txt
->GetValue());
1831 wxStrcpy(wxGetApp().Contact
->City
,pCityTxt
->GetValue());
1832 wxStrcpy(wxGetApp().Contact
->State
,pStateTxt
->GetValue());
1833 wxStrcpy(wxGetApp().Contact
->Country
,pCountryTxt
->GetValue());
1834 wxStrcpy(wxGetApp().Contact
->PostalCode
,pPostalCodeTxt
->GetValue());
1836 wxGetApp().Contact
->Contributions
= wxAtoi(pContribTxt
->GetValue());
1837 wxGetApp().Contact
->LinesOfCode
= wxAtol(pLinesTxt
->GetValue());
1839 wxGetApp().Contact
->NativeLanguage
= (enum Language
) pNativeLangChoice
->GetSelection();
1840 wxGetApp().Contact
->IsDeveloper
= pDeveloperRadio
->GetSelection() > 0;
1843 } // CeditorDlg::GetData()
1847 * Retrieve data from the dialog, verify the validity of the data, and if it is valid,
1848 * try to insert/update the data to the table based on the current 'mode' the dialog
1851 * A return value of TRUE means the insert/update was completed successfully, a return
1852 * value of FALSE means that Save() failed. If returning FALSE, then this function
1853 * has displayed a detailed error message for the user.
1855 bool CeditorDlg::Save()
1857 bool failed
= FALSE
;
1859 // Read the data in the widgets of the dialog to get the user's data
1863 // Perform any other required validations necessary before saving
1866 wxBeginBusyCursor();
1868 if (mode
== mCreate
)
1870 RETCODE result
= wxGetApp().Contact
->Insert();
1872 failed
= (result
!= DB_SUCCESS
);
1875 // Some errors may be expected, like a duplicate key, so handle those instances with
1876 // specific error messages.
1877 if (result
== DB_ERR_INTEGRITY_CONSTRAINT_VIOL
)
1880 tStr
= wxT("A duplicate key value already exists in the table.\nUnable to save record\n\n");
1881 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1882 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1886 // Some other unexpected error occurred
1888 tStr
= wxT("Database insert failed\n\n");
1889 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1890 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1894 else // mode == mEdit
1896 wxGetApp().Contact
->GetDb()->RollbackTrans();
1897 wxGetApp().Contact
->whereStr
.Printf(wxT("NAME = '%s'"),saveName
.c_str());
1898 if (!wxGetApp().Contact
->UpdateWhere(wxGetApp().Contact
->whereStr
))
1901 tStr
= wxT("Database update failed\n\n");
1902 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
1903 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
1910 wxGetApp().Contact
->GetDb()->CommitTrans();
1911 SetMode(mView
); // Sets the dialog mode back to viewing after save is successful
1914 wxGetApp().Contact
->GetDb()->RollbackTrans();
1920 } // CeditorDlg::Save()
1924 * Where this program is only showing a single row at a time in the dialog,
1925 * a special where clause must be built to find just the single row which,
1926 * in sequence, would follow the currently displayed row.
1928 bool CeditorDlg::GetNextRec()
1932 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1933 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1935 w
= wxT("NAME = (SELECT MIN(NAME) FROM ");
1936 w
+= wxGetApp().Contact
->GetTableName();
1937 w
+= wxT(" WHERE NAME > '");
1940 w
= wxT("(NAME > '");
1942 w
+= wxGetApp().Contact
->Name
;
1945 // If a query where string is currently set, append that criteria
1946 if (!wxGetApp().Contact
->qryWhereStr
.IsEmpty())
1949 w
+= wxGetApp().Contact
->qryWhereStr
;
1956 } // CeditorDlg::GetNextRec()
1960 * Where this program is only showing a single row at a time in the dialog,
1961 * a special where clause must be built to find just the single row which,
1962 * in sequence, would precede the currently displayed row.
1964 bool CeditorDlg::GetPrevRec()
1968 if (wxGetApp().Contact
->GetDb()->Dbms() != dbmsPOSTGRES
&&
1969 wxGetApp().Contact
->GetDb()->Dbms() != dbmsMY_SQL
)
1971 w
= wxT("NAME = (SELECT MAX(NAME) FROM ");
1972 w
+= wxGetApp().Contact
->GetTableName();
1973 w
+= wxT(" WHERE NAME < '");
1976 w
= wxT("(NAME < '");
1978 w
+= wxGetApp().Contact
->Name
;
1981 // If a query where string is currently set, append that criteria
1982 if (!wxGetApp().Contact
->qryWhereStr
.IsEmpty())
1985 w
+= wxGetApp().Contact
->qryWhereStr
;
1993 } // CeditorDlg::GetPrevRec()
1997 * This function is here to avoid duplicating this same code in both the
1998 * GetPrevRec() and GetNextRec() functions
2000 bool CeditorDlg::GetRec(const wxString
&whereStr
)
2002 wxGetApp().Contact
->SetWhereClause(whereStr
);
2003 wxGetApp().Contact
->SetOrderByClause(wxT("NAME"));
2005 if (!wxGetApp().Contact
->Query())
2008 tStr
= wxT("ODBC error during Query()\n\n");
2009 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
2010 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
2015 if (wxGetApp().Contact
->GetNext())
2022 } // CeditorDlg::GetRec()
2027 * CparameterDlg constructor
2030 BEGIN_EVENT_TABLE(CparameterDlg
, wxDialog
)
2031 EVT_BUTTON(PARAMETER_DIALOG_SAVE
, CparameterDlg::OnButton
)
2032 EVT_BUTTON(PARAMETER_DIALOG_CANCEL
, CparameterDlg::OnButton
)
2033 EVT_CLOSE(CparameterDlg::OnCloseWindow
)
2036 CparameterDlg::CparameterDlg(wxWindow
*parent
) : wxDialog (parent
, PARAMETER_DIALOG
, wxT("ODBC parameter settings"), wxPoint(-1, -1), wxSize(400, 325))
2038 // Since the ::OnCommand() function is overridden, this prevents the widget
2039 // detection in ::OnCommand() until all widgets have been initialized to prevent
2040 // uninitialized pointers from crashing the program
2041 widgetPtrsSet
= FALSE
;
2043 pParamODBCSourceMsg
= new wxStaticText(this, PARAMETER_DIALOG_SOURCE_MSG
, wxT("ODBC data sources:"), wxPoint( 10, 10), wxSize( -1, -1), 0, wxT("ParamODBCSourceMsg"));
2044 pParamODBCSourceList
= new wxListBox(this, PARAMETER_DIALOG_SOURCE_LISTBOX
, wxPoint( 10, 29), wxSize(285, 150), 0, 0, wxLB_SINGLE
|wxLB_ALWAYS_SB
, wxDefaultValidator
, wxT("ParamODBCSourceList"));
2045 pParamUserNameMsg
= new wxStaticText(this, PARAMETER_DIALOG_NAME_MSG
, wxT("Database user name:"), wxPoint( 10, 193), wxSize( -1, -1), 0, wxT("ParamUserNameMsg"));
2046 pParamUserNameTxt
= new wxTextCtrl(this, PARAMETER_DIALOG_NAME_TEXT
, wxT(""), wxPoint(10, 209), wxSize( 140, 25), 0, wxDefaultValidator
, wxT("ParamUserNameTxt"));
2047 pParamPasswordMsg
= new wxStaticText(this, PARAMETER_DIALOG_PASSWORD_MSG
, wxT("Password:"), wxPoint(156, 193), wxSize( -1, -1), 0, wxT("ParamPasswordMsg"));
2048 pParamPasswordTxt
= new wxTextCtrl(this, PARAMETER_DIALOG_PASSWORD_TEXT
, wxT(""), wxPoint(156, 209), wxSize( 140, 25), 0, wxDefaultValidator
, wxT("ParamPasswordTxt"));
2049 pParamDirPathMsg
= new wxStaticText(this, PARAMETER_DIALOG_DIRPATH_MSG
, wxT("Directory:"), wxPoint( 10, 243), wxSize( -1, -1), 0, wxT("ParamDirPathMsg"));
2050 pParamDirPathTxt
= new wxTextCtrl(this, PARAMETER_DIALOG_DIRPATH_TEXT
, wxT(""), wxPoint( 10, 259), wxSize(140, 25), 0, wxDefaultValidator
, wxT("ParamDirPathTxt"));
2051 pParamSaveBtn
= new wxButton(this, PARAMETER_DIALOG_SAVE
, wxT("&Save"), wxPoint(310, 21), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("ParamSaveBtn"));
2052 pParamCancelBtn
= new wxButton(this, PARAMETER_DIALOG_CANCEL
, wxT("C&ancel"), wxPoint(310, 66), wxSize( 70, 35), 0, wxDefaultValidator
, wxT("ParamCancelBtn"));
2054 // Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to
2055 // handle all widget processing
2056 widgetPtrsSet
= TRUE
;
2059 savedParamSettings
= wxGetApp().params
;
2064 } // CparameterDlg constructor
2067 void CparameterDlg::OnCloseWindow(wxCloseEvent
& event
)
2069 // Put any additional checking necessary to make certain it is alright
2070 // to close the program here that is not done elsewhere
2073 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
);
2081 wxGetApp().params
= savedParamSettings
;
2084 if (GetParent() != NULL
)
2085 GetParent()->SetFocus();
2091 SetReturnCode(0); // added so BoundsChecker would not report use of uninitialized variable
2094 } // CparameterDlg::OnCloseWindow()
2097 void CparameterDlg::OnButton( wxCommandEvent
&event
)
2099 wxWindow
*win
= (wxWindow
*) event
.GetEventObject();
2100 OnCommand( *win
, event
);
2104 void CparameterDlg::OnCommand(wxWindow
& win
, wxCommandEvent
& WXUNUSED(event
))
2106 wxString widgetName
;
2108 widgetName
= win
.GetName();
2113 if (widgetName
== pParamSaveBtn
->GetName())
2118 tStr
= wxT("Database parameters have been saved.");
2119 if (GetParent() != NULL
) // The parameter dialog was not called during startup due to a missing cfg file
2120 tStr
+= wxT("\nNew parameters will take effect the next time the program is started.");
2121 wxMessageBox(tStr
,wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
2128 if (widgetName
== pParamCancelBtn
->GetName())
2133 } // CparameterDlg::OnCommand()
2136 bool CparameterDlg::PutData()
2138 // Fill the data source list box
2139 FillDataSourceList();
2141 // Fill in the fields from the params object
2142 if (wxGetApp().params
.ODBCSource
&& wxStrlen(wxGetApp().params
.ODBCSource
))
2144 int index
= pParamODBCSourceList
->FindString(wxGetApp().params
.ODBCSource
);
2146 pParamODBCSourceList
->SetSelection(index
);
2148 pParamUserNameTxt
->SetValue(wxGetApp().params
.UserName
);
2149 pParamPasswordTxt
->SetValue(wxGetApp().params
.Password
);
2150 pParamDirPathTxt
->SetValue(wxGetApp().params
.DirPath
);
2152 } // CparameterDlg::PutData()
2155 bool CparameterDlg::GetData()
2158 if (pParamODBCSourceList
->GetStringSelection() != wxT(""))
2160 tStr
= pParamODBCSourceList
->GetStringSelection();
2161 if (tStr
.Length() > (sizeof(wxGetApp().params
.ODBCSource
)-1))
2164 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());
2165 wxMessageBox(errmsg
,wxT("Internal program error..."),wxOK
| wxICON_EXCLAMATION
);
2168 wxStrcpy(wxGetApp().params
.ODBCSource
, tStr
);
2173 tStr
= pParamUserNameTxt
->GetValue();
2174 if (tStr
.Length() > (sizeof(wxGetApp().params
.UserName
)-1))
2177 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());
2178 wxMessageBox(errmsg
,wxT("Internal program error..."),wxOK
| wxICON_EXCLAMATION
);
2181 wxStrcpy(wxGetApp().params
.UserName
, tStr
);
2183 tStr
= pParamPasswordTxt
->GetValue();
2184 if (tStr
.Length() > (sizeof(wxGetApp().params
.Password
)-1))
2187 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());
2188 wxMessageBox(errmsg
,wxT("Internal program error..."),wxOK
| wxICON_EXCLAMATION
);
2191 wxStrcpy(wxGetApp().params
.Password
,tStr
);
2193 tStr
= pParamDirPathTxt
->GetValue();
2194 tStr
.Replace(wxT("\\"),wxT("/"));
2195 if (tStr
.Length() > (sizeof(wxGetApp().params
.DirPath
)-1))
2198 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());
2199 wxMessageBox(errmsg
,wxT("Internal program error..."),wxOK
| wxICON_EXCLAMATION
);
2202 wxStrcpy(wxGetApp().params
.DirPath
,tStr
);
2204 } // CparameterDlg::GetData()
2207 bool CparameterDlg::Save()
2209 // Copy the current params in case user cancels changing
2210 // the params, so that we can reset them.
2213 wxGetApp().params
= savedParamSettings
;
2217 wxGetApp().WriteParamFile(wxGetApp().params
);
2220 } // CparameterDlg::Save()
2223 void CparameterDlg::FillDataSourceList()
2225 wxChar Dsn
[SQL_MAX_DSN_LENGTH
+ 1];
2227 wxStringList strList
;
2229 while (wxDbGetDataSource(wxGetApp().DbConnectInf
->GetHenv(), Dsn
,
2230 SQL_MAX_DSN_LENGTH
+1, DsDesc
, 255))
2234 strList
.Add(wxT(""));
2235 wxChar
**p
= strList
.ListToArray();
2238 for (i
= 0; wxStrlen(p
[i
]); i
++)
2239 pParamODBCSourceList
->Append(p
[i
]);
2242 } // CparameterDlg::FillDataSourceList()
2245 BEGIN_EVENT_TABLE(CqueryDlg
, wxDialog
)
2246 EVT_BUTTON(-1, CqueryDlg::OnButton
)
2247 EVT_CLOSE(CqueryDlg::OnCloseWindow
)
2251 // CqueryDlg() constructor
2252 CqueryDlg::CqueryDlg(wxWindow
*parent
, wxDb
*pDb
, wxChar
*tblName
[],
2253 const wxString
&pWhereArg
) :
2254 wxDialog (parent
, QUERY_DIALOG
, wxT("Query"), wxPoint(-1, -1), wxSize(480, 360))
2256 wxBeginBusyCursor();
2260 masterTableName
= tblName
[0];
2261 widgetPtrsSet
= FALSE
;
2264 // Initialize the WHERE clause from the string passed in
2265 pWhere
= pWhereArg
; // Save a pointer to the output buffer
2266 if (pWhere
.Length() > (unsigned int)DB_MAX_WHERE_CLAUSE_LEN
) // Check the length of the buffer passed in
2269 s
.Printf(wxT("Maximum where clause length exceeded.\nLength must be less than %d"), DB_MAX_WHERE_CLAUSE_LEN
+1);
2270 wxMessageBox(s
,wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
2275 pQueryCol1Msg
= new wxStaticText(this, QUERY_DIALOG_COL_MSG
, wxT("Column 1:"), wxPoint( 10, 10), wxSize( 69, 16), 0, wxT("QueryCol1Msg"));
2276 pQueryCol1Choice
= new wxChoice(this, QUERY_DIALOG_COL_CHOICE
, wxPoint( 10, 27), wxSize(250, 27), 0, 0, 0, wxDefaultValidator
, wxT("QueryCol1Choice"));
2277 pQueryNotMsg
= new wxStaticText(this, QUERY_DIALOG_NOT_MSG
, wxT("NOT"), wxPoint(268, 10), wxSize( -1, -1), 0, wxT("QueryNotMsg"));
2278 pQueryNotCheck
= new wxCheckBox(this, QUERY_DIALOG_NOT_CHECKBOX
, wxT(""), wxPoint(275, 37), wxSize( 20, 20), 0, wxDefaultValidator
, wxT("QueryNotCheck"));
2280 wxString choice_strings
[9];
2281 choice_strings
[0] = wxT("=");
2282 choice_strings
[1] = wxT("<");
2283 choice_strings
[2] = wxT(">");
2284 choice_strings
[3] = wxT("<=");
2285 choice_strings
[4] = wxT(">=");
2286 choice_strings
[5] = wxT("Begins");
2287 choice_strings
[6] = wxT("Contains");
2288 choice_strings
[7] = wxT("Like");
2289 choice_strings
[8] = wxT("Between");
2291 pQueryOperatorMsg
= new wxStaticText(this, QUERY_DIALOG_OP_MSG
, wxT("Operator:"), wxPoint(305, 10), wxSize( -1, -1), 0, wxT("QueryOperatorMsg"));
2292 pQueryOperatorChoice
= new wxChoice(this, QUERY_DIALOG_OP_CHOICE
, wxPoint(305, 27), wxSize( 80, 27), 9, choice_strings
, 0, wxDefaultValidator
, wxT("QueryOperatorChoice"));
2293 pQueryCol2Msg
= new wxStaticText(this, QUERY_DIALOG_COL2_MSG
, wxT("Column 2:"), wxPoint( 10, 65), wxSize( 69, 16), 0, wxT("QueryCol2Msg"));
2294 pQueryCol2Choice
= new wxChoice(this, QUERY_DIALOG_COL2_CHOICE
, wxPoint( 10, 82), wxSize(250, 27), 0, 0, 0, wxDefaultValidator
, wxT("QueryCol2Choice"));
2295 pQuerySqlWhereMsg
= new wxStaticText(this, QUERY_DIALOG_WHERE_MSG
, wxT("SQL where clause:"), wxPoint( 10, 141), wxSize( -1, -1), 0, wxT("QuerySqlWhereMsg"));
2296 pQuerySqlWhereMtxt
= new wxTextCtrl(this, QUERY_DIALOG_WHERE_TEXT
, wxT(""), wxPoint( 10, 159), wxSize(377, 134), wxTE_MULTILINE
, wxDefaultValidator
, wxT("QuerySqlWhereMtxt"));
2297 pQueryAddBtn
= new wxButton(this, QUERY_DIALOG_ADD
, wxT("&Add"), wxPoint(406, 24), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryAddBtn"));
2298 pQueryAndBtn
= new wxButton(this, QUERY_DIALOG_AND
, wxT("A&nd"), wxPoint(406, 58), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryAndBtn"));
2299 pQueryOrBtn
= new wxButton(this, QUERY_DIALOG_OR
, wxT("&Or"), wxPoint(406, 92), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryOrBtn"));
2300 pQueryLParenBtn
= new wxButton(this, QUERY_DIALOG_LPAREN
, wxT("("), wxPoint(406, 126), wxSize( 26, 26), 0, wxDefaultValidator
, wxT("QueryLParenBtn"));
2301 pQueryRParenBtn
= new wxButton(this, QUERY_DIALOG_RPAREN
, wxT(")"), wxPoint(436, 126), wxSize( 26, 26), 0, wxDefaultValidator
, wxT("QueryRParenBtn"));
2302 pQueryDoneBtn
= new wxButton(this, QUERY_DIALOG_DONE
, wxT("&Done"), wxPoint(406, 185), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryDoneBtn"));
2303 pQueryClearBtn
= new wxButton(this, QUERY_DIALOG_CLEAR
, wxT("C&lear"), wxPoint(406, 218), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryClearBtn"));
2304 pQueryCountBtn
= new wxButton(this, QUERY_DIALOG_COUNT
, wxT("&Count"), wxPoint(406, 252), wxSize( 56, 26), 0, wxDefaultValidator
, wxT("QueryCountBtn"));
2305 pQueryValue1Msg
= new wxStaticText(this, QUERY_DIALOG_VALUE1_MSG
, wxT("Value:"), wxPoint(277, 66), wxSize( -1, -1), 0, wxT("QueryValue1Msg"));
2306 pQueryValue1Txt
= new wxTextCtrl(this, QUERY_DIALOG_VALUE1_TEXT
, wxT(""), wxPoint(277, 83), wxSize(108, 25), 0, wxDefaultValidator
, wxT("QueryValue1Txt"));
2307 pQueryValue2Msg
= new wxStaticText(this, QUERY_DIALOG_VALUE2_MSG
, wxT("AND"), wxPoint(238, 126), wxSize( -1, -1), 0, wxT("QueryValue2Msg"));
2308 pQueryValue2Txt
= new wxTextCtrl(this, QUERY_DIALOG_VALUE2_TEXT
, wxT(""), wxPoint(277, 120), wxSize(108, 25), 0, wxDefaultValidator
, wxT("QueryValue2Txt"));
2309 pQueryHintGrp
= new wxStaticBox(this, QUERY_DIALOG_HINT_GROUP
, wxT(""), wxPoint( 10, 291), wxSize(377, 40), 0, wxT("QueryHintGrp"));
2310 pQueryHintMsg
= new wxStaticText(this, QUERY_DIALOG_HINT_MSG
, wxT(""), wxPoint( 16, 306), wxSize( -1, -1), 0, wxT("QueryHintMsg"));
2312 widgetPtrsSet
= TRUE
;
2313 // Initialize the dialog
2315 pQueryCol2Choice
->Append(wxT("VALUE -->"));
2316 colInf
= pDB
->GetColumns(tblName
);
2322 tStr
= wxT("ODBC error during GetColumns()\n\n");
2323 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
2324 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
2329 for (i
= 0; colInf
[i
].colName
&& wxStrlen(colInf
[i
].colName
); i
++)
2331 // If there is more than one table being queried, qualify
2332 // the column names with the table name prefix.
2333 if (tblName
[1] && wxStrlen(tblName
[1]))
2335 qualName
.Printf(wxT("%s.%s"), colInf
[i
].tableName
, colInf
[i
].colName
);
2336 pQueryCol1Choice
->Append(qualName
);
2337 pQueryCol2Choice
->Append(qualName
);
2339 else // Single table query, append just the column names
2341 pQueryCol1Choice
->Append(colInf
[i
].colName
);
2342 pQueryCol2Choice
->Append(colInf
[i
].colName
);
2346 pQueryCol1Choice
->SetSelection(0);
2347 pQueryCol2Choice
->SetSelection(0);
2348 pQueryOperatorChoice
->SetSelection(0);
2350 pQueryValue2Msg
->Show(FALSE
);
2351 pQueryValue2Txt
->Show(FALSE
);
2353 pQueryHintMsg
->SetLabel(langQRY_EQ
);
2355 pQuerySqlWhereMtxt
->SetValue(pWhere
.c_str());
2359 // Display the dialog window
2362 } // CqueryDlg() constructor
2365 CqueryDlg::~CqueryDlg()
2367 } // CqueryDlg::~CqueryDlg() destructor
2370 void CqueryDlg::OnButton(wxCommandEvent
&event
)
2372 wxWindow
*win
= (wxWindow
*) event
.GetEventObject();
2373 OnCommand( *win
, event
);
2374 } // CqueryDlg::OnButton()
2377 void CqueryDlg::OnCommand(wxWindow
& win
, wxCommandEvent
& WXUNUSED(event
))
2379 // Widget pointers won't be set when the dialog is constructed.
2380 // Control is passed through this function once for each widget on
2381 // a dialog as the dialog is constructed.
2385 wxString widgetName
= win
.GetName();
2387 // Operator choice box
2388 if (widgetName
== pQueryOperatorChoice
->GetName())
2390 // Set the help text
2391 switch((qryOp
) pQueryOperatorChoice
->GetSelection())
2394 pQueryHintMsg
->SetLabel(langQRY_EQ
);
2397 pQueryHintMsg
->SetLabel(langQRY_LT
);
2400 pQueryHintMsg
->SetLabel(langQRY_GT
);
2403 pQueryHintMsg
->SetLabel(langQRY_LE
);
2406 pQueryHintMsg
->SetLabel(langQRY_GE
);
2409 pQueryHintMsg
->SetLabel(langQRY_BEGINS
);
2412 pQueryHintMsg
->SetLabel(langQRY_CONTAINS
);
2415 pQueryHintMsg
->SetLabel(langQRY_LIKE
);
2418 pQueryHintMsg
->SetLabel(langQRY_BETWEEN
);
2422 // Hide the value2 widget
2423 pQueryValue2Msg
->Show(FALSE
); // BETWEEN will show this widget
2424 pQueryValue2Txt
->Show(FALSE
); // BETWEEN will show this widget
2426 // Disable the NOT operator for <, <=, >, >=
2427 switch((qryOp
) pQueryOperatorChoice
->GetSelection())
2433 pQueryNotCheck
->SetValue(0);
2434 pQueryNotCheck
->Enable(FALSE
);
2437 pQueryNotCheck
->Enable(TRUE
);
2441 // Manipulate the dialog to handle the selected operator
2442 switch((qryOp
) pQueryOperatorChoice
->GetSelection())
2449 pQueryCol2Choice
->Enable(TRUE
);
2450 if (pQueryCol2Choice
->GetSelection()) // Column name is highlighted
2452 pQueryValue1Msg
->Show(FALSE
);
2453 pQueryValue1Txt
->Show(FALSE
);
2455 else // "Value" is highlighted
2457 pQueryValue1Msg
->Show(TRUE
);
2458 pQueryValue1Txt
->Show(TRUE
);
2459 pQueryValue1Txt
->SetFocus();
2465 pQueryCol2Choice
->SetSelection(0);
2466 pQueryCol2Choice
->Enable(FALSE
);
2467 pQueryValue1Msg
->Show(TRUE
);
2468 pQueryValue1Txt
->Show(TRUE
);
2469 pQueryValue1Txt
->SetFocus();
2472 pQueryCol2Choice
->SetSelection(0);
2473 pQueryCol2Choice
->Enable(FALSE
);
2474 pQueryValue2Msg
->Show(TRUE
);
2475 pQueryValue2Txt
->Show(TRUE
);
2476 pQueryValue1Msg
->Show(TRUE
);
2477 pQueryValue1Txt
->Show(TRUE
);
2478 pQueryValue1Txt
->SetFocus();
2484 } // Operator choice box
2487 if (widgetName
== pQueryCol2Choice
->GetName())
2489 if (pQueryCol2Choice
->GetSelection()) // Column name is highlighted
2491 pQueryValue1Msg
->Show(FALSE
);
2492 pQueryValue1Txt
->Show(FALSE
);
2494 else // "Value" is highlighted
2496 pQueryValue1Msg
->Show(TRUE
);
2497 pQueryValue1Txt
->Show(TRUE
);
2498 pQueryValue1Txt
->SetFocus();
2501 } // Column 2 choice
2504 if (widgetName
== pQueryAddBtn
->GetName())
2511 if (widgetName
== pQueryAndBtn
->GetName())
2513 AppendToWhere(wxT(" AND\n"));
2518 if (widgetName
== pQueryOrBtn
->GetName())
2520 AppendToWhere(wxT(" OR\n"));
2524 // Left Paren button
2525 if (widgetName
== pQueryLParenBtn
->GetName())
2527 AppendToWhere(wxT("("));
2529 } // Left Paren button
2531 // Right paren button
2532 if (widgetName
== pQueryRParenBtn
->GetName())
2534 AppendToWhere(wxT(")"));
2536 } // Right Paren button
2539 if (widgetName
== pQueryDoneBtn
->GetName())
2541 // Be sure the where clause will not overflow the output buffer
2542 if (wxStrlen(pQuerySqlWhereMtxt
->GetValue()) > (unsigned int)DB_MAX_WHERE_CLAUSE_LEN
)
2545 s
.Printf(wxT("Maximum where clause length exceeded.\nLength must be less than %d"), DB_MAX_WHERE_CLAUSE_LEN
+1);
2546 wxMessageBox(s
,wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
2549 // Validate the where clause for things such as matching parens
2550 if (!ValidateWhereClause())
2552 // Copy the where clause to the output buffer and exit
2553 pWhere
= pQuerySqlWhereMtxt
->GetValue();
2559 if (widgetName
== pQueryClearBtn
->GetName())
2561 bool Ok
= (wxMessageBox(wxT("Are you sure you wish to clear the Query?"),wxT("Confirm"),wxYES_NO
|wxICON_QUESTION
) == wxYES
);
2564 pQuerySqlWhereMtxt
->SetValue(wxT(""));
2569 if (widgetName
== pQueryCountBtn
->GetName())
2571 wxBeginBusyCursor();
2577 } // CqueryDlg::OnCommand
2580 void CqueryDlg::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
2587 GetParent()->SetFocus();
2592 SetReturnCode(1); // added so BoundsChecker would not report use of uninitialized variable
2595 } // CqueryDlg::OnCloseWindow()
2598 void CqueryDlg::AppendToWhere(wxChar
*s
)
2600 wxString whereStr
= pQuerySqlWhereMtxt
->GetValue();
2602 pQuerySqlWhereMtxt
->SetValue(whereStr
);
2603 } // CqueryDlg::AppendToWhere()
2606 void CqueryDlg::ProcessAddBtn()
2608 qryOp oper
= (qryOp
) pQueryOperatorChoice
->GetSelection();
2610 // Verify that eveything is filled in correctly
2611 if (pQueryCol2Choice
->GetSelection() == 0) // "Value" is selected
2613 // Verify that value 1 is filled in
2614 if (wxStrlen(pQueryValue1Txt
->GetValue()) == 0)
2617 pQueryValue1Txt
->SetFocus();
2620 // For the BETWEEN operator, value 2 must be filled in as well
2621 if (oper
== qryOpBETWEEN
&&
2622 wxStrlen(pQueryValue2Txt
->GetValue()) == 0)
2625 pQueryValue2Txt
->SetFocus();
2630 // Build the expression and append it to the where clause window
2631 wxString s
= pQueryCol1Choice
->GetStringSelection();
2633 if (pQueryNotCheck
->GetValue() && (oper
!= qryOpEQ
))
2639 if (pQueryNotCheck
->GetValue()) // NOT box is checked
2662 s
+= wxT(" BETWEEN");
2668 int col1Idx
= pQueryCol1Choice
->GetSelection();
2671 if (colInf
[col1Idx
].sqlDataType
== SQL_VARCHAR
||
2672 oper
== qryOpBEGINS
||
2673 oper
== qryOpCONTAINS
||
2677 if (pQueryCol2Choice
->GetSelection()) // Column name
2678 s
+= pQueryCol2Choice
->GetStringSelection();
2679 else // Column 2 is a "value"
2683 if (oper
== qryOpCONTAINS
)
2685 s
+= pQueryValue1Txt
->GetValue();
2686 if (oper
== qryOpCONTAINS
|| oper
== qryOpBEGINS
)
2692 if (oper
== qryOpBETWEEN
)
2697 s
+= pQueryValue2Txt
->GetValue();
2702 AppendToWhere((wxChar
*) (const wxChar
*) s
);
2704 } // CqueryDlg::ProcessAddBtn()
2707 void CqueryDlg::ProcessCountBtn()
2709 if (!ValidateWhereClause())
2712 if (!dbTable
) // wxDbTable object needs to be created and opened
2714 dbTable
= new wxDbTable(pDB
, masterTableName
, 0, wxT(""),
2716 wxGetApp().DbConnectInf
->GetDefaultDir());
2719 wxMessageBox(wxT("Memory allocation failed creating a wxDbTable object."),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
2722 if (!dbTable
->Open())
2725 tStr
= wxT("ODBC error during Open()\n\n");
2726 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
2727 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
2732 // Count() with WHERE clause
2735 whereStr
= pQuerySqlWhereMtxt
->GetValue();
2736 dbTable
->SetWhereClause(whereStr
.c_str());
2738 ULONG whereCnt
= dbTable
->Count();
2740 // Count() of all records in the table
2741 dbTable
->SetWhereClause(wxT(""));
2742 ULONG totalCnt
= dbTable
->Count();
2744 if (whereCnt
> 0 || totalCnt
== 0)
2747 tStr
.Printf(wxT("%lu of %lu records match the query criteria."),whereCnt
,totalCnt
);
2748 wxMessageBox(tStr
,wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
2753 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
);
2754 wxMessageBox(tStr
,wxT("Notice..."),wxOK
| wxICON_INFORMATION
);
2757 // After a wxMessageBox, the focus does not necessarily return to the
2758 // window which was the focus when the message box popped up, so return
2759 // focus to the Query dialog for certain
2762 } // CqueryDlg::ProcessCountBtn()
2765 bool CqueryDlg::ValidateWhereClause()
2767 wxString where
= pQuerySqlWhereMtxt
->GetValue();
2769 if (where
.Freq(wxT('(')) != where
.Freq(wxT(')')))
2771 wxMessageBox(wxT("There are mismatched parenthesis in the constructed where clause"),wxT("Error..."),wxOK
| wxICON_EXCLAMATION
);
2774 // After a wxMessageBox, the focus does not necessarily return to the
2775 // window which was the focus when the message box popped up, so return
2776 // focus to the Query dialog for certain
2781 } // CqueryDlg::ValidateWhereClause()
2785 void DisplayDbDiagnostics(wxDb
*pDb
)
2790 s
= langDBINF_DB_NAME
;
2791 s
+= pDb
->dbInf
.dbmsName
;
2794 s
+= langDBINF_DB_VER
;
2795 s
+= pDb
->dbInf
.dbmsVer
;
2798 s
+= langDBINF_DRIVER_NAME
;
2799 s
+= pDb
->dbInf
.driverName
;
2802 s
+= langDBINF_DRIVER_ODBC_VER
;
2803 s
+= pDb
->dbInf
.odbcVer
;
2806 s
+= langDBINF_DRIVER_MGR_ODBC_VER
;
2807 s
+= pDb
->dbInf
.drvMgrOdbcVer
;
2810 s
+= langDBINF_DRIVER_VER
;
2811 s
+= pDb
->dbInf
.driverVer
;
2814 s
+= langDBINF_SERVER_NAME
;
2815 s
+= pDb
->dbInf
.serverName
;
2818 s
+= langDBINF_FILENAME
;
2819 s
+= pDb
->dbInf
.databaseName
;
2822 s
+= langDBINF_OUTER_JOINS
;
2823 s
+= pDb
->dbInf
.outerJoins
;
2826 s
+= langDBINF_STORED_PROC
;
2827 s
+= pDb
->dbInf
.procedureSupport
;
2830 if (pDb
->dbInf
.maxConnections
)
2831 t
.sprintf(wxT("%s%d\n"), langDBINF_MAX_HDBC
, pDb
->dbInf
.maxConnections
);
2833 t
.sprintf(wxT("%s%s\n"), langDBINF_MAX_HDBC
, langDBINF_UNLIMITED
);
2836 if (pDb
->dbInf
.maxStmts
)
2837 t
.sprintf(wxT("%s%d\n"), langDBINF_MAX_HSTMT
, pDb
->dbInf
.maxStmts
);
2839 t
.sprintf(wxT("%s%s\n"), langDBINF_MAX_HSTMT
, langDBINF_UNLIMITED
);
2842 s
+= langDBINF_API_LVL
;
2843 switch(pDb
->dbInf
.apiConfLvl
)
2845 case SQL_OAC_NONE
: s
+= langDBINF_NONE
; break;
2846 case SQL_OAC_LEVEL1
: s
+= langDBINF_LEVEL1
; break;
2847 case SQL_OAC_LEVEL2
: s
+= langDBINF_LEVEL2
; break;
2851 s
+= langDBINF_CLI_LVL
;
2852 switch(pDb
->dbInf
.cliConfLvl
)
2854 case SQL_OSCC_NOT_COMPLIANT
: s
+= langDBINF_NOT_COMPLIANT
; break;
2855 case SQL_OSCC_COMPLIANT
: s
+= langDBINF_COMPLIANT
; break;
2859 s
+= langDBINF_SQL_LVL
;
2860 switch(pDb
->dbInf
.sqlConfLvl
)
2862 case SQL_OSC_MINIMUM
: s
+= langDBINF_MIN_GRAMMAR
; break;
2863 case SQL_OSC_CORE
: s
+= langDBINF_CORE_GRAMMAR
; break;
2864 case SQL_OSC_EXTENDED
: s
+= langDBINF_EXT_GRAMMAR
; break;
2868 s
+= langDBINF_COMMIT_BEHAVIOR
;
2869 switch(pDb
->dbInf
.cursorCommitBehavior
)
2871 case SQL_CB_DELETE
: s
+= langDBINF_DELETE_CURSORS
; break;
2872 case SQL_CB_CLOSE
: s
+= langDBINF_CLOSE_CURSORS
; break;
2873 case SQL_CB_PRESERVE
: s
+= langDBINF_PRESERVE_CURSORS
; break;
2877 s
+= langDBINF_ROLLBACK_BEHAVIOR
;
2878 switch(pDb
->dbInf
.cursorRollbackBehavior
)
2880 case SQL_CB_DELETE
: s
+= langDBINF_DELETE_CURSORS
; break;
2881 case SQL_CB_CLOSE
: s
+= langDBINF_CLOSE_CURSORS
; break;
2882 case SQL_CB_PRESERVE
: s
+= langDBINF_PRESERVE_CURSORS
; break;
2886 s
+= langDBINF_SUPP_NOT_NULL
;
2887 switch(pDb
->dbInf
.supportNotNullClause
)
2889 case SQL_NNC_NULL
: s
+= langNO
; break;
2890 case SQL_NNC_NON_NULL
: s
+= langYES
; break;
2894 s
+= langDBINF_SUPP_IEF
;
2895 s
+= pDb
->dbInf
.supportIEF
;
2898 // DEFAULT setting for "Transaction Isolation Level"
2899 s
+= langDBINF_TXN_ISOLATION
;
2900 switch(pDb
->dbInf
.txnIsolation
)
2902 case SQL_TXN_READ_UNCOMMITTED
: s
+= langDBINF_READ_UNCOMMITTED
; break;
2903 case SQL_TXN_READ_COMMITTED
: s
+= langDBINF_READ_COMMITTED
; break;
2904 case SQL_TXN_REPEATABLE_READ
: s
+= langDBINF_REPEATABLE_READ
; break;
2905 case SQL_TXN_SERIALIZABLE
: s
+= langDBINF_SERIALIZABLE
; break;
2907 case SQL_TXN_VERSIONING
: s
+= langDBINF_VERSIONING
; break;
2912 // CURRENT setting for "Transaction Isolation Level"
2914 s
+= langDBINF_TXN_ISOLATION_CURR
;
2915 if (SQLGetConnectOption(pDb
->GetHDBC(),SQL_TXN_ISOLATION
,&txnIsoLvl
) == SQL_SUCCESS
)
2919 case SQL_TXN_READ_UNCOMMITTED
: s
+= langDBINF_READ_UNCOMMITTED
; break;
2920 case SQL_TXN_READ_COMMITTED
: s
+= langDBINF_READ_COMMITTED
; break;
2921 case SQL_TXN_REPEATABLE_READ
: s
+= langDBINF_REPEATABLE_READ
; break;
2922 case SQL_TXN_SERIALIZABLE
: s
+= langDBINF_SERIALIZABLE
; break;
2924 case SQL_TXN_VERSIONING
: s
+= langDBINF_VERSIONING
; break;
2931 #pragma message disable incboodep
2934 s
+= langDBINF_TXN_ISOLATION_OPTS
;
2935 if (pDb
->dbInf
.txnIsolationOptions
& SQL_TXN_READ_UNCOMMITTED
)
2936 {s
+= langDBINF_READ_UNCOMMITTED
; comma
++;}
2937 if (pDb
->dbInf
.txnIsolationOptions
& SQL_TXN_READ_COMMITTED
)
2938 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_READ_COMMITTED
;}
2939 if (pDb
->dbInf
.txnIsolationOptions
& SQL_TXN_REPEATABLE_READ
)
2940 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_REPEATABLE_READ
;}
2941 if (pDb
->dbInf
.txnIsolationOptions
& SQL_TXN_SERIALIZABLE
)
2942 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_SERIALIZABLE
;}
2944 if (pDb
->dbInf
.txnIsolationOptions
& SQL_TXN_VERSIONING
)
2945 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_VERSIONING
;}
2950 s
+= langDBINF_FETCH_DIRS
;
2951 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_NEXT
)
2952 {s
+= langDBINF_NEXT
; comma
++;}
2953 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_PRIOR
)
2954 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_PREV
;}
2955 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_FIRST
)
2956 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_FIRST
;}
2957 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_LAST
)
2958 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_LAST
;}
2959 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_ABSOLUTE
)
2960 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_ABSOLUTE
;}
2961 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_RELATIVE
)
2962 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_RELATIVE
;}
2964 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_RESUME
)
2965 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_RESUME
;}
2967 if (pDb
->dbInf
.fetchDirections
& SQL_FD_FETCH_BOOKMARK
)
2968 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_BOOKMARK
;}
2972 s
+= langDBINF_LOCK_TYPES
;
2973 if (pDb
->dbInf
.lockTypes
& SQL_LCK_NO_CHANGE
)
2974 {s
+= langDBINF_NO_CHANGE
; comma
++;}
2975 if (pDb
->dbInf
.lockTypes
& SQL_LCK_EXCLUSIVE
)
2976 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_EXCLUSIVE
;}
2977 if (pDb
->dbInf
.lockTypes
& SQL_LCK_UNLOCK
)
2978 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_UNLOCK
;}
2982 s
+= langDBINF_POS_OPERS
;
2983 if (pDb
->dbInf
.posOperations
& SQL_POS_POSITION
)
2984 {s
+= langDBINF_POSITION
; comma
++;}
2985 if (pDb
->dbInf
.posOperations
& SQL_POS_REFRESH
)
2986 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_REFRESH
;}
2987 if (pDb
->dbInf
.posOperations
& SQL_POS_UPDATE
)
2988 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_UPD
;}
2989 if (pDb
->dbInf
.posOperations
& SQL_POS_DELETE
)
2990 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_DEL
;}
2991 if (pDb
->dbInf
.posOperations
& SQL_POS_ADD
)
2992 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_ADD
;}
2996 s
+= langDBINF_POS_STMTS
;
2997 if (pDb
->dbInf
.posStmts
& SQL_PS_POSITIONED_DELETE
)
2998 {s
+= langDBINF_POS_DEL
; comma
++;}
2999 if (pDb
->dbInf
.posStmts
& SQL_PS_POSITIONED_UPDATE
)
3000 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_POS_UPD
;}
3001 if (pDb
->dbInf
.posStmts
& SQL_PS_SELECT_FOR_UPDATE
)
3002 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_SELECT_FOR_UPD
;}
3006 s
+= langDBINF_SCROLL_CONCURR
;
3007 if (pDb
->dbInf
.scrollConcurrency
& SQL_SCCO_READ_ONLY
)
3008 {s
+= langDBINF_READ_ONLY
; comma
++;}
3009 if (pDb
->dbInf
.scrollConcurrency
& SQL_SCCO_LOCK
)
3010 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_LOCK
;}
3011 if (pDb
->dbInf
.scrollConcurrency
& SQL_SCCO_OPT_ROWVER
)
3012 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_OPT_ROWVER
;}
3013 if (pDb
->dbInf
.scrollConcurrency
& SQL_SCCO_OPT_VALUES
)
3014 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_OPT_VALUES
;}
3018 s
+= langDBINF_SCROLL_OPTS
;
3019 if (pDb
->dbInf
.scrollOptions
& SQL_SO_FORWARD_ONLY
)
3020 {s
+= langDBINF_FWD_ONLY
; comma
++;}
3021 if (pDb
->dbInf
.scrollOptions
& SQL_SO_STATIC
)
3022 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_STATIC
;}
3023 if (pDb
->dbInf
.scrollOptions
& SQL_SO_KEYSET_DRIVEN
)
3024 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_KEYSET_DRIVEN
;}
3025 if (pDb
->dbInf
.scrollOptions
& SQL_SO_DYNAMIC
)
3026 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_DYNAMIC
;}
3027 if (pDb
->dbInf
.scrollOptions
& SQL_SO_MIXED
)
3028 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_MIXED
;}
3032 s
+= langDBINF_STATIC_SENS
;
3033 if (pDb
->dbInf
.staticSensitivity
& SQL_SS_ADDITIONS
)
3034 {s
+= langDBINF_ADDITIONS
; comma
++;}
3035 if (pDb
->dbInf
.staticSensitivity
& SQL_SS_DELETIONS
)
3036 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_DELETIONS
;}
3037 if (pDb
->dbInf
.staticSensitivity
& SQL_SS_UPDATES
)
3038 {if (comma
++) s
+= wxT(", "); s
+= langDBINF_UPDATES
;}
3041 #pragma message enable incboodep
3045 s
+= langDBINF_TXN_CAPABLE
;
3046 switch(pDb
->dbInf
.txnCapable
)
3048 case SQL_TC_NONE
: s
+= langNO
; break;
3049 case SQL_TC_DML
: s
+= langDBINF_DML_ONLY
; break;
3050 case SQL_TC_DDL_COMMIT
: s
+= langDBINF_DDL_COMMIT
; break;
3051 case SQL_TC_DDL_IGNORE
: s
+= langDBINF_DDL_IGNORE
; break;
3052 case SQL_TC_ALL
: s
+= langDBINF_DDL_AND_DML
; break;
3056 t
.sprintf(wxT("%s%lu\n"), langDBINF_LOGIN_TIMEOUT
, pDb
->dbInf
.loginTimeout
);
3059 // Oracle specific information
3060 if (pDb
->Dbms() == dbmsORACLE
)
3063 s
+= langDBINF_ORACLE_BANNER
;
3066 // Oracle cache hit ratio
3069 pDb
->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'db block gets'"));
3071 if (pDb
->GetData(1, SQL_C_ULONG
, &dbBlockGets
, 0, &cb
))
3073 t
.sprintf(wxT("%s: %lu\n"), langDBINF_DB_BLOCK_GETS
, dbBlockGets
);
3077 ULONG consistentGets
;
3078 pDb
->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'consistent gets'"));
3080 if (pDb
->GetData(1, SQL_C_ULONG
, &consistentGets
, 0, &cb
))
3082 t
.sprintf(wxT("%s: %lu\n"), langDBINF_CONSISTENT_GETS
, consistentGets
);
3087 pDb
->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'physical reads'"));
3089 if (pDb
->GetData(1, SQL_C_ULONG
, &physReads
, 0, &cb
))
3091 t
.sprintf(wxT("%s: %lu\n"), langDBINF_PHYSICAL_READS
, physReads
);
3095 ULONG hitRatio
= (ULONG
)((1.00 - ((float)physReads
/ (float)(dbBlockGets
+ consistentGets
))) * 100.00);
3096 t
.sprintf(wxT("*** %s: %lu%%\n"), langDBINF_CACHE_HIT_RATIO
, hitRatio
);
3099 // Tablespace information
3101 s
+= langDBINF_TABLESPACE_IO
;
3104 char tablespaceName
[257];
3105 pDb
->ExecSql(wxT("SELECT NAME,PHYRDS,PHYWRTS FROM V$DATAFILE, V$FILESTAT WHERE V$DATAFILE.FILE# = V$FILESTAT.FILE#"));
3106 while (pDb
->GetNext())
3108 pDb
->GetData(1, SQL_C_CHAR
, tablespaceName
, 257, &cb
);
3109 pDb
->GetData(2, SQL_C_ULONG
, &physReads
, 0, &cb
);
3110 pDb
->GetData(3, SQL_C_ULONG
, &physWrites
, 0, &cb
);
3111 t
.sprintf(wxT("%s\n\t%s: %lu\t%s: %lu\n"), tablespaceName
,
3112 langDBINF_PHYSICAL_READS
, physReads
, langDBINF_PHYSICAL_WRITES
, physWrites
);
3121 } // DisplayDbDiagnostics()
3125 BEGIN_EVENT_TABLE(DbGridFrame
, wxFrame
)
3126 // EVT_CLOSE(DbGridFrame::OnCloseWindow)
3130 DbGridFrame::DbGridFrame(wxWindow
*parent
)
3131 : wxFrame (parent
, -1, wxT("Database Table"),
3132 wxDefaultPosition
, wxSize(400, 325))
3134 initialized
= FALSE
;
3138 void DbGridFrame::OnCloseWindow(wxCloseEvent
& event
)
3144 bool DbGridFrame::Initialize()
3146 wxGrid
*grid
= new wxGrid(this, -1, wxDefaultPosition
);
3148 grid
->RegisterDataType(wxGRID_VALUE_DATETIME
,
3149 new wxGridCellDateTimeRenderer(wxT("%d %b %Y")),
3150 new wxGridCellTextEditor
);
3152 grid
->RegisterDataType(wxGRID_VALUE_CHOICEINT
,
3153 new wxGridCellEnumRenderer
,
3154 new wxGridCellEnumEditor
);
3156 wxString
NativeLangChoice( wxString::Format("%s:%s,%s,%s,%s,%s",wxGRID_VALUE_CHOICEINT
,
3164 // Columns must match the sequence specified in SetColDef() calls
3165 wxDbGridColInfo
* cols
=
3166 new wxDbGridColInfo( 0,wxGRID_VALUE_STRING
,wxT("Name"),
3167 new wxDbGridColInfo( 1,wxGRID_VALUE_STRING
,wxT("Address 1"),
3168 new wxDbGridColInfo( 2,wxGRID_VALUE_STRING
,wxT("Address 2"),
3169 new wxDbGridColInfo( 3,wxGRID_VALUE_STRING
,wxT("City"),
3170 new wxDbGridColInfo( 4,wxGRID_VALUE_STRING
,wxT("State"),
3171 new wxDbGridColInfo( 5,wxGRID_VALUE_STRING
,wxT("PostCode"),
3172 new wxDbGridColInfo( 6,wxGRID_VALUE_STRING
,wxT("Country"),
3173 new wxDbGridColInfo( 7,wxGRID_VALUE_DBAUTO
,wxT("Join Date"),
3174 new wxDbGridColInfo( 8,wxGRID_VALUE_BOOL
, wxT("Developer"),
3175 new wxDbGridColInfo( 9,wxGRID_VALUE_NUMBER
,wxT("Contributions"),
3176 new wxDbGridColInfo(10,wxGRID_VALUE_NUMBER
,wxT("Lines Of Code"),
3178 new wxDbGridColInfo(11,NativeLangChoice
, wxT("Native Language"),NULL
))))))))))));
3180 new wxDbGridColInfo(11,wxGRID_VALUE_NUMBER
,wxT("Native Language"),NULL
))))))))))));
3183 Ccontact
*Contact
= new Ccontact();
3184 //wxGetApp().Contact
3188 wxMessageBox(wxT("Unable to instantiate an instance of Ccontact"), wxT("Error..."), wxOK
| wxICON_EXCLAMATION
);
3192 if (!Contact
->Open())
3194 if (Contact
->GetDb()->TableExists(CONTACT_TABLE_NAME
, Contact
->GetDb()->GetUsername(),
3195 wxGetApp().DbConnectInf
->GetDefaultDir()))
3198 tStr
.Printf(wxT("Unable to open the table '%s'.\n\n"),CONTACT_TABLE_NAME
);
3199 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
3200 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
3206 // Execute the following query using the cursor designated
3207 // for full table query
3208 Contact
->SetRowMode(wxDbTable::WX_ROW_MODE_QUERY
);
3210 if (!Contact
->Query())
3213 tStr
= wxT("ODBC error during Query()\n\n");
3214 wxMessageBox(wxDbLogExtendedErrorMsg(tStr
.c_str(),wxGetApp().Contact
->GetDb(),__TFILE__
,__LINE__
),
3215 wxT("ODBC Error..."),wxOK
| wxICON_EXCLAMATION
);
3219 // No data has been read in from the database yet, so
3220 // we need to initialize the data members to valid values
3221 // so Fit() can correctly size the grid
3222 Contact
->Initialize();
3224 wxDbGridTableBase
* db
= new wxDbGridTableBase(Contact
, cols
, wxUSE_QUERY
, TRUE
);
3228 grid
->SetTable(db
,TRUE
);
3229 grid
->SetMargins(0, 0);
3232 wxSize size
= grid
->GetSize();
3235 SetClientSize(size
);
3238 } // DbGridFrame::Initialize()
3240 #endif // #if wxUSE_NEW_GRID
3243 TEST CODE FOR TESTING THE wxDbCreateDataSource() FUNCTION
3246 result = wxDbCreateDataSource(wxT("Microsoft Access Driver (*.mdb)"),wxT("GLT-TEST2"),wxT("GLT-Descrip"),FALSE,wxT(""),this);
3249 // check for errors caused by ConfigDSN based functions
3252 wxChar errMsg[500+1];
3253 errMsg[0] = wxT('\0');
3255 SQLInstallerError(1,&retcode,errMsg,500,&cb);
3257 wxMessageBox(wxT("FAILED creating data source"),wxT("FAILED"));
3260 wxMessageBox(wxT("SUCCEEDED creating data source"),wxT("SUCCESS"));