]> git.saurik.com Git - wxWidgets.git/blame - samples/db/dbtest.cpp
Script updates
[wxWidgets.git] / samples / db / dbtest.cpp
CommitLineData
108106cf
JS
1///////////////////////////////////////////////////////////////////////////////
2// Name: dbtest.cpp
be5a51fb 3// Purpose: wxWidgets database demo app
108106cf
JS
4// Author: George Tasker
5// Modified by:
6// Created: 1998
7// RCS-ID: $Id$
8// Copyright: (c) 1998 Remstar International, Inc.
9// Licence: wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12/*
e70e8f4c 13 * SYNOPSIS START
108106cf 14
e70e8f4c
GT
15 This sample program demonstrates the cross-platform ODBC database classes
16 donated by the development team at Remstar International.
108106cf 17
e70e8f4c 18 The table this sample is based on is developer contact table, and shows
f6bcfd97 19 some of the simple uses of the database classes wxDb and wxDbTable.
108106cf 20
e70e8f4c 21 * SYNOPSIS END
108106cf
JS
22 */
23
24#ifdef __GNUG__
25#pragma implementation "dbtest.h"
26#endif
27
28#include "wx/wxprec.h"
29
30#ifdef __BORLANDC__
31#pragma hdrstop
32#endif //__BORLANDC__
33
34#ifndef WX_PRECOMP
fb86524f 35#include "wx/wx.h"
108106cf
JS
36#endif //WX_PRECOMP
37
52ad8c7d 38#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMAC__)
7e616b10
RR
39#include "db.xpm"
40#endif
41
5b077d48 42#include <stdio.h> /* Included strictly for reading the text file with the database parameters */
108106cf 43
fb86524f
GD
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 */
108106cf 46
3fe813a9 47//extern wxDbList WXDLLEXPORT *PtrBegDbList; /* from db.cpp, used in getting back error results from db connections */
108106cf 48
9b12bd99 49#if wxUSE_GRID
fb86524f
GD
50#include "wx/grid.h"
51#include "wx/generic/gridctrl.h"
52#include "wx/dbgrid.h"
f21b2fd8
GT
53
54#define CHOICEINT
55#endif
56
5b077d48
RR
57#include "dbtest.h" /* Header file for this demonstration program */
58#include "listdb.h" /* Code to support the "Lookup" button on the editor dialog */
1fc5dd6f
JS
59
60IMPLEMENT_APP(DatabaseDemoApp)
61
049977d0
GT
62extern wxChar ListDB_Selection[]; /* Used to return the first column value for the selected line from the listDB routines */
63extern wxChar ListDB_Selection2[]; /* Used to return the second column value for the selected line from the listDB routines */
108106cf 64
5d59e67a
GT
65
66#if !wxUSE_ODBC
67 #error Sample cannot be compiled unless setup.h has wxUSE_ODBC set to 1
68#endif
69
70
aaf0836c 71bool DataTypeSupported(wxDb *pDb, SWORD datatype, wxString *nativeDataTypeName)
3fe813a9
GT
72{
73 wxDbSqlTypeInfo sqlTypeInfo;
74
6d841efd 75 bool breakpoint = false;
3fe813a9 76
aaf0836c 77 *nativeDataTypeName = wxEmptyString;
3fe813a9 78 if (pDb->GetDataTypeInfo(datatype, sqlTypeInfo))
aaf0836c
GT
79 {
80 *nativeDataTypeName = sqlTypeInfo.TypeName;
6d841efd 81 breakpoint = true;
aaf0836c 82 }
3fe813a9
GT
83
84 return breakpoint;
85
86} // GetDataTypesSupported();
87
88
89
90void CheckSupportForAllDataTypes(wxDb *pDb)
91{
aaf0836c
GT
92 wxString nativeDataTypeName;
93
74de91cc 94 wxLogMessage(wxT("\nThe following datatypes are supported by the\ndatabase you are currently connected to:"));
3fe813a9 95#ifdef SQL_C_BINARY
aaf0836c
GT
96 if (DataTypeSupported(pDb,SQL_C_BINARY, &nativeDataTypeName))
97 {
74de91cc 98 nativeDataTypeName = wxT("SQL_C_BINARY (") + nativeDataTypeName;
9b12bd99 99 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
100 wxLogMessage(nativeDataTypeName);
101 }
3fe813a9
GT
102#endif
103#ifdef SQL_C_BIT
aaf0836c
GT
104 if (DataTypeSupported(pDb,SQL_C_BIT, &nativeDataTypeName))
105 {
74de91cc 106 nativeDataTypeName = wxT("SQL_C_BIT (") + nativeDataTypeName;
9b12bd99 107 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
108 wxLogMessage(nativeDataTypeName);
109 }
3fe813a9
GT
110#endif
111#ifdef SQL_C_BOOKMARK
aaf0836c
GT
112 if (DataTypeSupported(pDb,SQL_C_BOOKMARK, &nativeDataTypeName))
113 {
74de91cc 114 nativeDataTypeName = wxT("SQL_C_BOOKMARK (") + nativeDataTypeName;
9b12bd99 115 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
116 wxLogMessage(nativeDataTypeName);
117 }
3fe813a9
GT
118#endif
119#ifdef SQL_C_CHAR
aaf0836c
GT
120 if (DataTypeSupported(pDb,SQL_C_CHAR, &nativeDataTypeName))
121 {
74de91cc 122 nativeDataTypeName = wxT("SQL_C_CHAR (") + nativeDataTypeName;
9b12bd99 123 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
124 wxLogMessage(nativeDataTypeName);
125 }
3fe813a9
GT
126#endif
127#ifdef SQL_C_DATE
aaf0836c
GT
128 if (DataTypeSupported(pDb,SQL_C_DATE, &nativeDataTypeName))
129 {
74de91cc 130 nativeDataTypeName = wxT("SQL_C_DATE (") + nativeDataTypeName;
9b12bd99 131 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
132 wxLogMessage(nativeDataTypeName);
133 }
3fe813a9
GT
134#endif
135#ifdef SQL_C_DEFAULT
aaf0836c
GT
136 if (DataTypeSupported(pDb,SQL_C_DEFAULT, &nativeDataTypeName))
137 {
74de91cc 138 nativeDataTypeName = wxT("SQL_C_DEFAULT (") + nativeDataTypeName;
9b12bd99 139 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
140 wxLogMessage(nativeDataTypeName);
141 }
3fe813a9
GT
142#endif
143#ifdef SQL_C_DOUBLE
aaf0836c
GT
144 if (DataTypeSupported(pDb,SQL_C_DOUBLE, &nativeDataTypeName))
145 {
74de91cc 146 nativeDataTypeName = wxT("SQL_C_DOUBLE (") + nativeDataTypeName;
9b12bd99 147 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
148 wxLogMessage(nativeDataTypeName);
149 }
3fe813a9
GT
150#endif
151#ifdef SQL_C_FLOAT
aaf0836c
GT
152 if (DataTypeSupported(pDb,SQL_C_FLOAT, &nativeDataTypeName))
153 {
74de91cc 154 nativeDataTypeName = wxT("SQL_C_FLOAT (") + nativeDataTypeName;
9b12bd99 155 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
156 wxLogMessage(nativeDataTypeName);
157 }
3fe813a9
GT
158#endif
159#ifdef SQL_C_GUID
aaf0836c
GT
160 if (DataTypeSupported(pDb,SQL_C_GUID, &nativeDataTypeName))
161 {
74de91cc 162 nativeDataTypeName = wxT("SQL_C_GUID (") + nativeDataTypeName;
9b12bd99 163 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
164 wxLogMessage(nativeDataTypeName);
165 }
3fe813a9
GT
166#endif
167#ifdef SQL_C_INTERVAL_DAY
aaf0836c
GT
168 if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY, &nativeDataTypeName))
169 {
74de91cc 170 nativeDataTypeName = wxT("SQL_C_INTERVAL_DAY (") + nativeDataTypeName;
9b12bd99 171 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
172 wxLogMessage(nativeDataTypeName);
173 }
3fe813a9
GT
174#endif
175#ifdef SQL_C_INTERVAL_DAY_TO_HOUR
aaf0836c
GT
176 if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY_TO_HOUR, &nativeDataTypeName))
177 {
74de91cc 178 nativeDataTypeName = wxT("SQL_C_INTERVAL_DAY_TO_HOUR (") + nativeDataTypeName;
9b12bd99 179 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
180 wxLogMessage(nativeDataTypeName);
181 }
3fe813a9
GT
182#endif
183#ifdef SQL_C_INTERVAL_DAY_TO_MINUTE
aaf0836c
GT
184 if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY_TO_MINUTE, &nativeDataTypeName))
185 {
74de91cc 186 nativeDataTypeName = wxT("SQL_C_INTERVAL_DAY_TO_MINUTE (") + nativeDataTypeName;
9b12bd99 187 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
188 wxLogMessage(nativeDataTypeName);
189 }
3fe813a9
GT
190#endif
191#ifdef SQL_C_INTERVAL_DAY_TO_SECOND
aaf0836c
GT
192 if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY_TO_SECOND, &nativeDataTypeName))
193 {
74de91cc 194 nativeDataTypeName = wxT("SQL_C_INTERVAL_DAY_TO_SECOND (") + nativeDataTypeName;
9b12bd99 195 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
196 wxLogMessage(nativeDataTypeName);
197 }
3fe813a9
GT
198#endif
199#ifdef SQL_C_INTERVAL_HOUR
aaf0836c
GT
200 if (DataTypeSupported(pDb,SQL_C_INTERVAL_HOUR, &nativeDataTypeName))
201 {
74de91cc 202 nativeDataTypeName = wxT("SQL_C_INTERVAL_HOUR (") + nativeDataTypeName;
9b12bd99 203 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
204 wxLogMessage(nativeDataTypeName);
205 }
3fe813a9
GT
206#endif
207#ifdef SQL_C_INTERVAL_HOUR_TO_MINUTE
aaf0836c
GT
208 if (DataTypeSupported(pDb,SQL_C_INTERVAL_HOUR_TO_MINUTE, &nativeDataTypeName))
209 {
74de91cc 210 nativeDataTypeName = wxT("SQL_C_INTERVAL_HOUR_TO_MINUTE (") + nativeDataTypeName;
9b12bd99 211 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
212 wxLogMessage(nativeDataTypeName);
213 }
3fe813a9
GT
214#endif
215#ifdef SQL_C_INTERVAL_HOUR_TO_SECOND
aaf0836c
GT
216 if (DataTypeSupported(pDb,SQL_C_INTERVAL_HOUR_TO_SECOND, &nativeDataTypeName))
217 {
74de91cc 218 nativeDataTypeName = wxT("SQL_C_INTERVAL_HOUR_TO_SECOND (") + nativeDataTypeName;
9b12bd99 219 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
220 wxLogMessage(nativeDataTypeName);
221 }
3fe813a9
GT
222#endif
223#ifdef SQL_C_INTERVAL_MINUTE
aaf0836c
GT
224 if (DataTypeSupported(pDb,SQL_C_INTERVAL_MINUTE, &nativeDataTypeName))
225 {
74de91cc 226 nativeDataTypeName = wxT("SQL_C_INTERVAL_MINUTE (") + nativeDataTypeName;
9b12bd99 227 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
228 wxLogMessage(nativeDataTypeName);
229 }
3fe813a9
GT
230#endif
231#ifdef SQL_C_INTERVAL_MINUTE_TO_SECOND
aaf0836c
GT
232 if (DataTypeSupported(pDb,SQL_C_INTERVAL_MINUTE_TO_SECOND, &nativeDataTypeName))
233 {
74de91cc 234 nativeDataTypeName = wxT("SQL_C_INTERVAL_MINUTE_TO_SECOND (") + nativeDataTypeName;
9b12bd99 235 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
236 wxLogMessage(nativeDataTypeName);
237 }
3fe813a9
GT
238#endif
239#ifdef SQL_C_INTERVAL_MONTH
aaf0836c
GT
240 if (DataTypeSupported(pDb,SQL_C_INTERVAL_MONTH, &nativeDataTypeName))
241 {
74de91cc 242 nativeDataTypeName = wxT("SQL_C_INTERVAL_MONTH (") + nativeDataTypeName;
9b12bd99 243 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
244 wxLogMessage(nativeDataTypeName);
245 }
3fe813a9
GT
246#endif
247#ifdef SQL_C_INTERVAL_SECOND
aaf0836c
GT
248 if (DataTypeSupported(pDb,SQL_C_INTERVAL_SECOND, &nativeDataTypeName))
249 {
74de91cc 250 nativeDataTypeName = wxT("SQL_C_INTERVAL_SECOND (") + nativeDataTypeName;
9b12bd99 251 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
252 wxLogMessage(nativeDataTypeName);
253 }
3fe813a9
GT
254#endif
255#ifdef SQL_C_INTERVAL_YEAR
aaf0836c
GT
256 if (DataTypeSupported(pDb,SQL_C_INTERVAL_YEAR, &nativeDataTypeName))
257 {
74de91cc 258 nativeDataTypeName = wxT("SQL_C_INTERVAL_YEAR (") + nativeDataTypeName;
9b12bd99 259 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
260 wxLogMessage(nativeDataTypeName);
261 }
3fe813a9
GT
262#endif
263#ifdef SQL_C_INTERVAL_YEAR_TO_MONTH
aaf0836c
GT
264 if (DataTypeSupported(pDb,SQL_C_INTERVAL_YEAR_TO_MONTH, &nativeDataTypeName))
265 {
74de91cc 266 nativeDataTypeName = wxT("SQL_C_INTERVAL_YEAR_TO_MONTH (") + nativeDataTypeName;
9b12bd99 267 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
268 wxLogMessage(nativeDataTypeName);
269 }
3fe813a9
GT
270#endif
271#ifdef SQL_C_LONG
aaf0836c
GT
272 if (DataTypeSupported(pDb,SQL_C_LONG, &nativeDataTypeName))
273 {
74de91cc 274 nativeDataTypeName = wxT("SQL_C_LONG (") + nativeDataTypeName;
9b12bd99 275 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
276 wxLogMessage(nativeDataTypeName);
277 }
3fe813a9
GT
278#endif
279#ifdef SQL_C_NUMERIC
aaf0836c
GT
280 if (DataTypeSupported(pDb,SQL_C_NUMERIC, &nativeDataTypeName))
281 {
74de91cc 282 nativeDataTypeName = wxT("SQL_C_NUMERIC (") + nativeDataTypeName;
9b12bd99 283 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
284 wxLogMessage(nativeDataTypeName);
285 }
3fe813a9
GT
286#endif
287#ifdef SQL_C_SBIGINT
aaf0836c
GT
288 if (DataTypeSupported(pDb,SQL_C_SBIGINT, &nativeDataTypeName))
289 {
74de91cc 290 nativeDataTypeName = wxT("SQL_C_SBIGINT (") + nativeDataTypeName;
9b12bd99 291 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
292 wxLogMessage(nativeDataTypeName);
293 }
3fe813a9
GT
294#endif
295#ifdef SQL_C_SHORT
aaf0836c
GT
296 if (DataTypeSupported(pDb,SQL_C_SHORT, &nativeDataTypeName))
297 {
74de91cc 298 nativeDataTypeName = wxT("SQL_C_SHORT (") + nativeDataTypeName;
9b12bd99 299 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
300 wxLogMessage(nativeDataTypeName);
301 }
3fe813a9
GT
302#endif
303#ifdef SQL_C_SLONG
aaf0836c
GT
304 if (DataTypeSupported(pDb,SQL_C_SLONG, &nativeDataTypeName))
305 {
74de91cc 306 nativeDataTypeName = wxT("SQL_C_SLONG (") + nativeDataTypeName;
9b12bd99 307 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
308 wxLogMessage(nativeDataTypeName);
309 }
3fe813a9
GT
310#endif
311#ifdef SQL_C_SSHORT
aaf0836c
GT
312 if (DataTypeSupported(pDb,SQL_C_SSHORT, &nativeDataTypeName))
313 {
74de91cc 314 nativeDataTypeName = wxT("SQL_C_SSHORT (") + nativeDataTypeName;
9b12bd99 315 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
316 wxLogMessage(nativeDataTypeName);
317 }
3fe813a9
GT
318#endif
319#ifdef SQL_C_STINYINT
aaf0836c
GT
320 if (DataTypeSupported(pDb,SQL_C_STINYINT, &nativeDataTypeName))
321 {
74de91cc 322 nativeDataTypeName = wxT("SQL_C_STINYINT (") + nativeDataTypeName;
9b12bd99 323 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
324 wxLogMessage(nativeDataTypeName);
325 }
3fe813a9
GT
326#endif
327#ifdef SQL_C_TIME
aaf0836c
GT
328 if (DataTypeSupported(pDb,SQL_C_TIME, &nativeDataTypeName))
329 {
74de91cc 330 nativeDataTypeName = wxT("SQL_C_TIME (") + nativeDataTypeName;
9b12bd99 331 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
332 wxLogMessage(nativeDataTypeName);
333 }
3fe813a9
GT
334#endif
335#ifdef SQL_C_TIMESTAMP
aaf0836c
GT
336 if (DataTypeSupported(pDb,SQL_C_TIMESTAMP, &nativeDataTypeName))
337 {
74de91cc 338 nativeDataTypeName = wxT("SQL_C_TIMESTAMP (") + nativeDataTypeName;
9b12bd99 339 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
340 wxLogMessage(nativeDataTypeName);
341 }
3fe813a9
GT
342#endif
343#ifdef SQL_C_TINYINT
aaf0836c
GT
344 if (DataTypeSupported(pDb,SQL_C_TINYINT, &nativeDataTypeName))
345 {
74de91cc 346 nativeDataTypeName = wxT("SQL_C_TINYINT (") + nativeDataTypeName;
9b12bd99 347 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
348 wxLogMessage(nativeDataTypeName);
349 }
3fe813a9
GT
350#endif
351#ifdef SQL_C_TYPE_DATE
aaf0836c
GT
352 if (DataTypeSupported(pDb,SQL_C_TYPE_DATE, &nativeDataTypeName))
353 {
74de91cc 354 nativeDataTypeName = wxT("SQL_C_TYPE_DATE (") + nativeDataTypeName;
9b12bd99 355 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
356 wxLogMessage(nativeDataTypeName);
357 }
3fe813a9
GT
358#endif
359#ifdef SQL_C_TYPE_TIME
aaf0836c
GT
360 if (DataTypeSupported(pDb,SQL_C_TYPE_TIME, &nativeDataTypeName))
361 {
74de91cc 362 nativeDataTypeName = wxT("SQL_C_TYPE_TIME (") + nativeDataTypeName;
9b12bd99 363 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
364 wxLogMessage(nativeDataTypeName);
365 }
3fe813a9
GT
366#endif
367#ifdef SQL_C_TYPE_TIMESTAMP
aaf0836c
GT
368 if (DataTypeSupported(pDb,SQL_C_TYPE_TIMESTAMP, &nativeDataTypeName))
369 {
74de91cc 370 nativeDataTypeName = wxT("SQL_C_TYPE_TIMESTAMP (") + nativeDataTypeName;
9b12bd99 371 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
372 wxLogMessage(nativeDataTypeName);
373 }
3fe813a9
GT
374#endif
375#ifdef SQL_C_UBIGINT
aaf0836c
GT
376 if (DataTypeSupported(pDb,SQL_C_UBIGINT, &nativeDataTypeName))
377 {
74de91cc 378 nativeDataTypeName = wxT("SQL_C_UBIGINT (") + nativeDataTypeName;
9b12bd99 379 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
380 wxLogMessage(nativeDataTypeName);
381 }
3fe813a9
GT
382#endif
383#ifdef SQL_C_ULONG
aaf0836c
GT
384 if (DataTypeSupported(pDb,SQL_C_ULONG, &nativeDataTypeName))
385 {
74de91cc 386 nativeDataTypeName = wxT("SQL_C_ULONG (") + nativeDataTypeName;
9b12bd99 387 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
388 wxLogMessage(nativeDataTypeName);
389 }
3fe813a9
GT
390#endif
391#ifdef SQL_C_USHORT
aaf0836c
GT
392 if (DataTypeSupported(pDb,SQL_C_USHORT, &nativeDataTypeName))
393 {
74de91cc 394 nativeDataTypeName = wxT("SQL_C_USHORT (") + nativeDataTypeName;
9b12bd99 395 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
396 wxLogMessage(nativeDataTypeName);
397 }
3fe813a9
GT
398#endif
399#ifdef SQL_C_UTINYINT
aaf0836c
GT
400 if (DataTypeSupported(pDb,SQL_C_UTINYINT, &nativeDataTypeName))
401 {
74de91cc 402 nativeDataTypeName = wxT("SQL_C_UTINYINT (") + nativeDataTypeName;
9b12bd99 403 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
404 wxLogMessage(nativeDataTypeName);
405 }
3fe813a9
GT
406#endif
407#ifdef SQL_C_VARBOOKMARK
aaf0836c
GT
408 if (DataTypeSupported(pDb,SQL_C_VARBOOKMARK, &nativeDataTypeName))
409 {
74de91cc 410 nativeDataTypeName = wxT("SQL_C_VARBOOKMARK (") + nativeDataTypeName;
9b12bd99 411 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
412 wxLogMessage(nativeDataTypeName);
413 }
3fe813a9
GT
414#endif
415
416// Extended SQL types
417#ifdef SQL_DATE
aaf0836c
GT
418 if (DataTypeSupported(pDb,SQL_DATE, &nativeDataTypeName))
419 {
74de91cc 420 nativeDataTypeName = wxT("SQL_DATE (") + nativeDataTypeName;
9b12bd99 421 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
422 wxLogMessage(nativeDataTypeName);
423 }
3fe813a9
GT
424#endif
425#ifdef SQL_INTERVAL
aaf0836c
GT
426 if (DataTypeSupported(pDb,SQL_INTERVAL, &nativeDataTypeName))
427 {
74de91cc 428 nativeDataTypeName = wxT("SQL_INTERVAL (") + nativeDataTypeName;
9b12bd99 429 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
430 wxLogMessage(nativeDataTypeName);
431 }
3fe813a9
GT
432#endif
433#ifdef SQL_TIME
aaf0836c
GT
434 if (DataTypeSupported(pDb,SQL_TIME, &nativeDataTypeName))
435 {
74de91cc 436 nativeDataTypeName = wxT("SQL_TIME (") + nativeDataTypeName;
9b12bd99 437 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
438 wxLogMessage(nativeDataTypeName);
439 }
3fe813a9
GT
440#endif
441#ifdef SQL_TIMESTAMP
aaf0836c
GT
442 if (DataTypeSupported(pDb,SQL_TIMESTAMP, &nativeDataTypeName))
443 {
74de91cc 444 nativeDataTypeName = wxT("SQL_TIMESTAMP (") + nativeDataTypeName;
9b12bd99 445 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
446 wxLogMessage(nativeDataTypeName);
447 }
3fe813a9
GT
448#endif
449#ifdef SQL_LONGVARCHAR
aaf0836c
GT
450 if (DataTypeSupported(pDb,SQL_LONGVARCHAR, &nativeDataTypeName))
451 {
74de91cc 452 nativeDataTypeName = wxT("SQL_LONGVARCHAR (") + nativeDataTypeName;
9b12bd99 453 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
454 wxLogMessage(nativeDataTypeName);
455 }
3fe813a9
GT
456#endif
457#ifdef SQL_BINARY
aaf0836c
GT
458 if (DataTypeSupported(pDb,SQL_BINARY, &nativeDataTypeName))
459 {
74de91cc 460 nativeDataTypeName = wxT("SQL_BINARY (") + nativeDataTypeName;
9b12bd99 461 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
462 wxLogMessage(nativeDataTypeName);
463 }
3fe813a9
GT
464#endif
465#ifdef SQL_VARBINARY
aaf0836c
GT
466 if (DataTypeSupported(pDb,SQL_VARBINARY, &nativeDataTypeName))
467 {
74de91cc 468 nativeDataTypeName = wxT("SQL_VARBINARY (") + nativeDataTypeName;
9b12bd99 469 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
470 wxLogMessage(nativeDataTypeName);
471 }
3fe813a9
GT
472#endif
473#ifdef SQL_LONGVARBINARY
aaf0836c
GT
474 if (DataTypeSupported(pDb,SQL_LONGVARBINARY, &nativeDataTypeName))
475 {
74de91cc 476 nativeDataTypeName = wxT("SQL_LOGVARBINARY (") + nativeDataTypeName;
9b12bd99 477 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
478 wxLogMessage(nativeDataTypeName);
479 }
3fe813a9
GT
480#endif
481#ifdef SQL_BIGINT
aaf0836c
GT
482 if (DataTypeSupported(pDb,SQL_BIGINT, &nativeDataTypeName))
483 {
74de91cc 484 nativeDataTypeName = wxT("SQL_BIGINT (") + nativeDataTypeName;
9b12bd99 485 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
486 wxLogMessage(nativeDataTypeName);
487 }
3fe813a9
GT
488#endif
489#ifdef SQL_TINYINT
aaf0836c
GT
490 if (DataTypeSupported(pDb,SQL_TINYINT, &nativeDataTypeName))
491 {
74de91cc 492 nativeDataTypeName = wxT("SQL_TINYINT (") + nativeDataTypeName;
9b12bd99 493 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
494 wxLogMessage(nativeDataTypeName);
495 }
3fe813a9
GT
496#endif
497#ifdef SQL_BIT
aaf0836c
GT
498 if (DataTypeSupported(pDb,SQL_BIT, &nativeDataTypeName))
499 {
74de91cc 500 nativeDataTypeName = wxT("SQL_BIT (") + nativeDataTypeName;
9b12bd99 501 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
502 wxLogMessage(nativeDataTypeName);
503 }
3fe813a9
GT
504#endif
505#ifdef SQL_GUID
aaf0836c
GT
506 if (DataTypeSupported(pDb,SQL_GUID, &nativeDataTypeName))
507 {
74de91cc 508 nativeDataTypeName = wxT("SQL_GUID (") + nativeDataTypeName;
9b12bd99 509 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
510 wxLogMessage(nativeDataTypeName);
511 }
3fe813a9
GT
512#endif
513
514#ifdef SQL_CHAR
aaf0836c
GT
515 if (DataTypeSupported(pDb,SQL_CHAR, &nativeDataTypeName))
516 {
74de91cc 517 nativeDataTypeName = wxT("SQL_CHAR (") + nativeDataTypeName;
9b12bd99 518 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
519 wxLogMessage(nativeDataTypeName);
520 }
3fe813a9
GT
521#endif
522#ifdef SQL_INTEGER
aaf0836c
GT
523 if (DataTypeSupported(pDb,SQL_INTEGER, &nativeDataTypeName))
524 {
74de91cc 525 nativeDataTypeName = wxT("SQL_INTEGER (") + nativeDataTypeName;
9b12bd99 526 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
527 wxLogMessage(nativeDataTypeName);
528 }
3fe813a9
GT
529#endif
530#ifdef SQL_SMALLINT
aaf0836c
GT
531 if (DataTypeSupported(pDb,SQL_SMALLINT, &nativeDataTypeName))
532 {
74de91cc 533 nativeDataTypeName = wxT("SQL_SAMLLINT (") + nativeDataTypeName;
9b12bd99 534 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
535 wxLogMessage(nativeDataTypeName);
536 }
3fe813a9
GT
537#endif
538#ifdef SQL_REAL
aaf0836c
GT
539 if (DataTypeSupported(pDb,SQL_REAL, &nativeDataTypeName))
540 {
74de91cc 541 nativeDataTypeName = wxT("SQL_REAL (") + nativeDataTypeName;
9b12bd99 542 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
543 wxLogMessage(nativeDataTypeName);
544 }
3fe813a9
GT
545#endif
546#ifdef SQL_DOUBLE
aaf0836c
GT
547 if (DataTypeSupported(pDb,SQL_DOUBLE, &nativeDataTypeName))
548 {
74de91cc 549 nativeDataTypeName = wxT("SQL_DOUBLE (") + nativeDataTypeName;
9b12bd99 550 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
551 wxLogMessage(nativeDataTypeName);
552 }
3fe813a9
GT
553#endif
554#ifdef SQL_NUMERIC
aaf0836c
GT
555 if (DataTypeSupported(pDb,SQL_NUMERIC, &nativeDataTypeName))
556 {
74de91cc 557 nativeDataTypeName = wxT("SQL_NUMERIC (") + nativeDataTypeName;
9b12bd99 558 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
559 wxLogMessage(nativeDataTypeName);
560 }
3fe813a9
GT
561#endif
562#ifdef SQL_DATE
aaf0836c
GT
563 if (DataTypeSupported(pDb,SQL_DATE, &nativeDataTypeName))
564 {
74de91cc 565 nativeDataTypeName = wxT("SQL_DATE (") + nativeDataTypeName;
9b12bd99 566 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
567 wxLogMessage(nativeDataTypeName);
568 }
3fe813a9
GT
569#endif
570#ifdef SQL_TIME
aaf0836c
GT
571 if (DataTypeSupported(pDb,SQL_TIME, &nativeDataTypeName))
572 {
74de91cc 573 nativeDataTypeName = wxT("SQL_TIME (") + nativeDataTypeName;
9b12bd99 574 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
575 wxLogMessage(nativeDataTypeName);
576 }
3fe813a9
GT
577#endif
578#ifdef SQL_TIMESTAMP
aaf0836c
GT
579 if (DataTypeSupported(pDb,SQL_TIMESTAMP, &nativeDataTypeName))
580 {
74de91cc 581 nativeDataTypeName = wxT("SQL_TIMESTAMP (") + nativeDataTypeName;
9b12bd99 582 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
583 wxLogMessage(nativeDataTypeName);
584 }
3fe813a9
GT
585#endif
586#ifdef SQL_VARCHAR
aaf0836c
GT
587 if (DataTypeSupported(pDb,SQL_VARCHAR, &nativeDataTypeName))
588 {
74de91cc 589 nativeDataTypeName = wxT("SQL_VARCHAR (") + nativeDataTypeName;
9b12bd99 590 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
591 wxLogMessage(nativeDataTypeName);
592 }
3fe813a9
GT
593#endif
594
3fe813a9
GT
595// UNICODE
596#ifdef SQL_C_TCHAR
aaf0836c
GT
597 if (DataTypeSupported(pDb,SQL_C_TCHAR, &nativeDataTypeName))
598 {
74de91cc 599 nativeDataTypeName = wxT("SQL_C_TCHAR (") + nativeDataTypeName;
9b12bd99 600 nativeDataTypeName += wxT(")\n");
aaf0836c
GT
601 wxLogMessage(nativeDataTypeName);
602 }
3fe813a9 603#endif
3f030b48 604
9b12bd99 605 wxLogMessage(wxT("Done\n"));
3fe813a9
GT
606} // CheckSupportForAllDataTypes()
607
608
1fc5dd6f 609bool DatabaseDemoApp::OnInit()
108106cf 610{
ea24eeb2
GT
611 DbConnectInf = NULL;
612 Contact = NULL;
049977d0 613
e70e8f4c 614 // Create the main frame window
be5a51fb 615 DemoFrame = new DatabaseDemoFrame(NULL, wxT("wxWidgets Database Demo"), wxPoint(50, 50), wxSize(537, 480));
e70e8f4c
GT
616
617 // Give it an icon
618 DemoFrame->SetIcon(wxICON(db));
619
620 // Make a menubar
621 wxMenu *file_menu = new wxMenu;
74de91cc 622 file_menu->Append(FILE_CREATE_ID, wxT("&Create CONTACT table"));
94613352
GT
623 file_menu->Append(FILE_RECREATE_TABLE, wxT("&Recreate CONTACT table"));
624 file_menu->Append(FILE_RECREATE_INDEXES, wxT("&Recreate CONTACT indexes"));
9b12bd99 625#if wxUSE_GRID
f21b2fd8
GT
626 file_menu->Append(FILE_DBGRID_TABLE, wxT("&Open DB Grid example"));
627#endif
94613352 628 file_menu->Append(FILE_EXIT, wxT("E&xit"));
e70e8f4c
GT
629
630 wxMenu *edit_menu = new wxMenu;
94613352 631 edit_menu->Append(EDIT_PARAMETERS, wxT("&Parameters..."));
e70e8f4c 632
ea24eeb2
GT
633 wxMenu *help_menu = new wxMenu;
634 help_menu->Append(HELP_ABOUT, wxT("&About"));
e70e8f4c
GT
635
636 wxMenuBar *menu_bar = new wxMenuBar;
94613352
GT
637 menu_bar->Append(file_menu, wxT("&File"));
638 menu_bar->Append(edit_menu, wxT("&Edit"));
ea24eeb2 639 menu_bar->Append(help_menu, wxT("&Help"));
e70e8f4c
GT
640 DemoFrame->SetMenuBar(menu_bar);
641
e70e8f4c
GT
642 params.ODBCSource[0] = 0;
643 params.UserName[0] = 0;
644 params.Password[0] = 0;
645 params.DirPath[0] = 0;
646
3ca6a5f0 647 // Show the frame
6d841efd 648 DemoFrame->Show(true);
3ca6a5f0 649
049977d0
GT
650 // Passing NULL for the SQL environment handle causes
651 // the wxDbConnectInf constructor to obtain a handle
652 // for you.
653 //
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.
925e9792 657 DbConnectInf = new wxDbConnectInf(NULL, params.ODBCSource, params.UserName,
049977d0
GT
658 params.Password, params.DirPath);
659
660 if (!DbConnectInf || !DbConnectInf->GetHenv())
661 {
662 wxMessageBox(wxT("Unable to define data source connection info."), wxT("DB CONNECTION ERROR..."),wxOK | wxICON_EXCLAMATION);
ea24eeb2 663 wxDELETE(DbConnectInf);
049977d0
GT
664 }
665
3fe813a9
GT
666 if (!ReadParamFile(params))
667 DemoFrame->BuildParameterDialog(NULL);
668
669 if (!wxStrlen(params.ODBCSource))
670 {
ea24eeb2 671 wxDELETE(DbConnectInf);
6d841efd 672 return(false);
3fe813a9
GT
673 }
674
675 DbConnectInf->SetDsn(params.ODBCSource);
676 DbConnectInf->SetUserID(params.UserName);
677 DbConnectInf->SetPassword(params.Password);
678 DbConnectInf->SetDefaultDir(params.DirPath);
679
049977d0
GT
680 READONLY_DB = wxDbGetConnection(DbConnectInf);
681 if (READONLY_DB == 0)
682 {
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);
ea24eeb2 685 wxDELETE(DbConnectInf);
049977d0 686 wxMessageBox(wxT("Now exiting program.\n\nRestart program to try any new settings."),wxT("Notice..."),wxOK | wxICON_INFORMATION);
6d841efd 687 return(false);
049977d0
GT
688 }
689
690 DemoFrame->BuildEditorDialog();
691
692 // Show the frame
693 DemoFrame->Refresh();
694
6d841efd 695 return true;
049977d0
GT
696} // DatabaseDemoApp::OnInit()
697
698
f369dd4f
GT
699/*
700* Remove CR or CR/LF from a character string.
701*/
74de91cc 702wxChar* wxRemoveLineTerminator(wxChar* aString)
f369dd4f 703{
74de91cc
JS
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');
f369dd4f
GT
707 len--;
708 }
709 return aString;
710}
711
712
049977d0
GT
713bool DatabaseDemoApp::ReadParamFile(Cparameters &params)
714{
e70e8f4c 715 FILE *paramFile;
74de91cc 716 if ((paramFile = wxFopen(PARAM_FILENAME, wxT("r"))) == NULL)
e70e8f4c
GT
717 {
718 wxString tStr;
049977d0 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);
94613352 720 wxMessageBox(tStr,wxT("File I/O Error..."),wxOK | wxICON_EXCLAMATION);
e70e8f4c 721
6d841efd 722 return false;
e70e8f4c
GT
723 }
724
94613352 725 wxChar buffer[1000+1];
74de91cc 726 wxFgets(buffer, sizeof(params.ODBCSource), paramFile);
f369dd4f 727 wxRemoveLineTerminator(buffer);
f6bcfd97 728 wxStrcpy(params.ODBCSource,buffer);
e70e8f4c 729
74de91cc 730 wxFgets(buffer, sizeof(params.UserName), paramFile);
f369dd4f 731 wxRemoveLineTerminator(buffer);
f6bcfd97 732 wxStrcpy(params.UserName,buffer);
e70e8f4c 733
74de91cc 734 wxFgets(buffer, sizeof(params.Password), paramFile);
f369dd4f 735 wxRemoveLineTerminator(buffer);
f6bcfd97 736 wxStrcpy(params.Password,buffer);
e70e8f4c 737
74de91cc 738 wxFgets(buffer, sizeof(params.DirPath), paramFile);
f369dd4f 739 wxRemoveLineTerminator(buffer);
f6bcfd97 740 wxStrcpy(params.DirPath,buffer);
e70e8f4c
GT
741
742 fclose(paramFile);
743
6d841efd 744 return true;
049977d0 745} // DatabaseDemoApp::ReadParamFile()
e70e8f4c 746
049977d0 747
74de91cc 748bool DatabaseDemoApp::WriteParamFile(Cparameters &WXUNUSED(params))
049977d0
GT
749{
750 FILE *paramFile;
74de91cc 751 if ((paramFile = wxFopen(PARAM_FILENAME, wxT("wt"))) == NULL)
e70e8f4c 752 {
049977d0
GT
753 wxString tStr;
754 tStr.Printf(wxT("Unable to write/overwrite '%s'."),PARAM_FILENAME);
755 wxMessageBox(tStr,wxT("File I/O Error..."),wxOK | wxICON_EXCLAMATION);
6d841efd 756 return false;
e70e8f4c
GT
757 }
758
74de91cc
JS
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);
049977d0 767 fclose(paramFile);
108106cf 768
6d841efd 769 return true;
049977d0
GT
770} // DatabaseDemoApp::WriteParamFile()
771
772
773void DatabaseDemoApp::CreateDataTable(bool recreate)
774{
6d841efd 775 bool Ok = true;
049977d0
GT
776 if (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);
778
779 if (!Ok)
780 return;
781
782 wxBeginBusyCursor();
783
6d841efd 784 bool success = true;
049977d0 785
ea24eeb2 786 Contact->GetDb()->RollbackTrans(); // Make sure the current cursor is in a known/stable state
049977d0
GT
787
788 if (!Contact->CreateTable(recreate))
789 {
790 wxEndBusyCursor();
791 wxString tStr;
f21b2fd8 792 tStr = wxT("Error creating CONTACTS table.\nTable was not created.\n\n");
74de91cc 793 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8
GT
794 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
795
6d841efd 796 success = false;
049977d0
GT
797 }
798 else
799 {
69a2b59d 800 if (!Contact->CreateIndexes(recreate))
049977d0
GT
801 {
802 wxEndBusyCursor();
803 wxString tStr;
f21b2fd8 804 tStr = wxT("Error creating CONTACTS indexes.\nIndexes will be unavailable.\n\n");
74de91cc 805 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8
GT
806 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
807
6d841efd 808 success = false;
049977d0
GT
809 }
810 }
811 while (wxIsBusy())
812 wxEndBusyCursor();
813
049977d0
GT
814 if (success)
815 wxMessageBox(wxT("Table and index(es) were successfully created."),wxT("Notice..."),wxOK | wxICON_INFORMATION);
816} // DatabaseDemoApp::CreateDataTable()
108106cf 817
3ca6a5f0 818
1fc5dd6f 819BEGIN_EVENT_TABLE(DatabaseDemoFrame, wxFrame)
74de91cc 820 EVT_MENU(FILE_CREATE_ID, DatabaseDemoFrame::OnCreate)
3ca6a5f0
BP
821 EVT_MENU(FILE_RECREATE_TABLE, DatabaseDemoFrame::OnRecreateTable)
822 EVT_MENU(FILE_RECREATE_INDEXES, DatabaseDemoFrame::OnRecreateIndexes)
9b12bd99 823#if wxUSE_GRID
f21b2fd8
GT
824 EVT_MENU(FILE_DBGRID_TABLE, DatabaseDemoFrame::OnDbGridTable)
825#endif
1fc5dd6f
JS
826 EVT_MENU(FILE_EXIT, DatabaseDemoFrame::OnExit)
827 EVT_MENU(EDIT_PARAMETERS, DatabaseDemoFrame::OnEditParameters)
ea24eeb2 828 EVT_MENU(HELP_ABOUT, DatabaseDemoFrame::OnAbout)
1fc5dd6f
JS
829 EVT_CLOSE(DatabaseDemoFrame::OnCloseWindow)
830END_EVENT_TABLE()
108106cf 831
3ca6a5f0 832
108106cf 833// DatabaseDemoFrame constructor
1fc5dd6f 834DatabaseDemoFrame::DatabaseDemoFrame(wxFrame *frame, const wxString& title,
3ca6a5f0 835 const wxPoint& pos, const wxSize& size):
6d841efd 836 wxFrame(frame, wxID_ANY, title, pos, size)
108106cf 837{
3ca6a5f0
BP
838 // Put any code in necessary for initializing the main frame here
839 pEditorDlg = NULL;
840 pParamDlg = NULL;
3f030b48 841
f07941fc 842#if wxUSE_LOG
3f030b48 843 delete wxLog::SetActiveTarget(new wxLogStderr);
f07941fc 844#endif // wxUSE_LOG
3f030b48 845
3ca6a5f0
BP
846} // DatabaseDemoFrame constructor
847
3f030b48
GT
848DatabaseDemoFrame::~DatabaseDemoFrame()
849{
f07941fc 850#if wxUSE_LOG
3f030b48 851 delete wxLog::SetActiveTarget(NULL);
f07941fc 852#endif // wxUSE_LOG
3f030b48
GT
853} // DatabaseDemoFrame destructor
854
108106cf 855
74de91cc 856void DatabaseDemoFrame::OnCreate(wxCommandEvent& WXUNUSED(event))
1fc5dd6f 857{
6d841efd 858 wxGetApp().CreateDataTable(false);
3ca6a5f0
BP
859} // DatabaseDemoFrame::OnCreate()
860
861
74de91cc 862void DatabaseDemoFrame::OnRecreateTable(wxCommandEvent& WXUNUSED(event))
3ca6a5f0 863{
6d841efd 864 wxGetApp().CreateDataTable(true);
3ca6a5f0
BP
865} // DatabaseDemoFrame::OnRecreate()
866
867
74de91cc 868void DatabaseDemoFrame::OnRecreateIndexes(wxCommandEvent& WXUNUSED(event))
3ca6a5f0 869{
69a2b59d
GT
870 wxGetApp().Contact->GetDb()->RollbackTrans(); // Make sure the current cursor is in a known/stable state
871
6d841efd 872 if (!wxGetApp().Contact->CreateIndexes(true))
3ca6a5f0 873 {
ea24eeb2
GT
874 while (wxIsBusy())
875 wxEndBusyCursor();
876 wxString tStr;
f21b2fd8 877 tStr = wxT("Error creating CONTACTS indexes.\nNew indexes will be unavailable.\n\n");
74de91cc 878 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8
GT
879 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
880
3ca6a5f0 881 }
69a2b59d 882 else
ea24eeb2 883 wxMessageBox(wxT("Index(es) were successfully recreated."),wxT("Notice..."),wxOK | wxICON_INFORMATION);
3ca6a5f0 884
3ca6a5f0 885} // DatabaseDemoFrame::OnRecreateIndexes()
108106cf 886
ea24eeb2 887
9b12bd99 888#if wxUSE_GRID
74de91cc 889void DatabaseDemoFrame::OnDbGridTable(wxCommandEvent& WXUNUSED(event))
f21b2fd8
GT
890{
891 DbGridFrame *frame = new DbGridFrame(this);
892 if (frame->Initialize())
893 {
894 frame->Show();
895 }
896}
897#endif
898
74de91cc 899void DatabaseDemoFrame::OnExit(wxCommandEvent& WXUNUSED(event))
108106cf 900{
3f755e2d 901 Close();
3ca6a5f0
BP
902} // DatabaseDemoFrame::OnExit()
903
108106cf 904
74de91cc 905void DatabaseDemoFrame::OnEditParameters(wxCommandEvent& WXUNUSED(event))
1fc5dd6f 906{
e70e8f4c
GT
907 if ((pEditorDlg->mode != mCreate) && (pEditorDlg->mode != mEdit))
908 BuildParameterDialog(this);
909 else
94613352 910 wxMessageBox(wxT("Cannot change database parameters while creating or editing a record"),wxT("Notice..."),wxOK | wxICON_INFORMATION);
3ca6a5f0
BP
911} // DatabaseDemoFrame::OnEditParameters()
912
1fc5dd6f 913
74de91cc 914void DatabaseDemoFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
1fc5dd6f 915{
be5a51fb 916 wxMessageBox(wxT("wxWidgets sample program for database classes\n\nContributed on 27 July 1998"),wxT("About..."),wxOK | wxICON_INFORMATION);
3ca6a5f0
BP
917} // DatabaseDemoFrame::OnAbout()
918
108106cf 919
049977d0
GT
920// Put any additional checking necessary to make certain it is alright
921// to close the program here that is not done elsewhere
1fc5dd6f 922void DatabaseDemoFrame::OnCloseWindow(wxCloseEvent& event)
108106cf 923{
3f755e2d 924 // Clean up time
3ca6a5f0 925 if (pEditorDlg && pEditorDlg->Close())
3f755e2d
GT
926 pEditorDlg = NULL;
927 else
f6bcfd97 928 {
3ca6a5f0
BP
929 if (pEditorDlg)
930 {
931 event.Veto();
932 return;
933 }
f6bcfd97
BP
934 }
935
ea24eeb2
GT
936 wxDELETE(wxGetApp().Contact);
937
3ca6a5f0
BP
938 // This function will close all the connections to the database that have been
939 // previously cached.
940 wxDbCloseConnections();
941
049977d0
GT
942 // Deletion of the wxDbConnectInf instance must be the LAST thing done that
943 // has anything to do with the database. Deleting this before disconnecting,
944 // freeing/closing connections, etc will result in a crash!
ea24eeb2 945 wxDELETE(wxGetApp().DbConnectInf);
3f755e2d 946
1fc5dd6f 947 this->Destroy();
3f755e2d 948
e3065973 949} // DatabaseDemoFrame::OnCloseWindow()
108106cf
JS
950
951
108106cf
JS
952void DatabaseDemoFrame::BuildEditorDialog()
953{
3ca6a5f0 954 pEditorDlg = NULL;
e70e8f4c 955 pEditorDlg = new CeditorDlg(this);
3ca6a5f0
BP
956 if (pEditorDlg)
957 {
958 pEditorDlg->Initialize();
959 if (!pEditorDlg->initialized)
960 {
961 pEditorDlg->Close();
973f2539 962 pEditorDlg = NULL;
94613352 963 wxMessageBox(wxT("Unable to initialize the editor dialog for some reason"),wxT("Error..."),wxOK | wxICON_EXCLAMATION);
049977d0 964 Close();
3ca6a5f0 965 }
925e9792 966 }
3ca6a5f0
BP
967 else
968 {
94613352 969 wxMessageBox(wxT("Unable to create the editor dialog for some reason"),wxT("Error..."),wxOK | wxICON_EXCLAMATION);
049977d0 970 Close();
3ca6a5f0 971 }
108106cf
JS
972} // DatabaseDemoFrame::BuildEditorDialog()
973
974
975void DatabaseDemoFrame::BuildParameterDialog(wxWindow *parent)
976{
e70e8f4c 977 pParamDlg = new CparameterDlg(parent);
108106cf 978
e70e8f4c 979 if (!pParamDlg)
94613352 980 wxMessageBox(wxT("Unable to create the parameter dialog for some reason"),wxT("Error..."),wxOK | wxICON_EXCLAMATION);
108106cf
JS
981} // DatabaseDemoFrame::BuildParameterDialog()
982
983
984/*
f6bcfd97 985 * Constructor note: If no wxDb object is passed in, a new connection to the database
108106cf
JS
986 * is created for this instance of Ccontact. This can be a slow process depending
987 * on the database engine being used, and some database engines have a limit on the
925e9792
WS
988 * number of connections (either hard limits, or license restricted) so care should
989 * be used to use as few connections as is necessary.
e70e8f4c 990 *
925e9792
WS
991 * IMPORTANT: Objects which share a wxDb pointer are ALL acted upon whenever a member
992 * function of pDb is called (i.e. CommitTrans() or RollbackTrans(), so if modifying
108106cf
JS
993 * or creating a table objects which use the same pDb, know that all the objects
994 * will be committed or rolled back when any of the objects has this function call made.
995 */
049977d0 996Ccontact::Ccontact (wxDb *pwxDb) : wxDbTable(pwxDb ? pwxDb : wxDbGetConnection(wxGetApp().DbConnectInf),
925e9792 997 CONTACT_TABLE_NAME, CONTACT_NO_COLS, wxEmptyString,
049977d0 998 !wxDB_QUERY_ONLY, wxGetApp().DbConnectInf->GetDefaultDir())
108106cf 999{
e70e8f4c
GT
1000 // This is used to represent whether the database connection should be released
1001 // when this instance of the object is deleted. If using the same connection
925e9792 1002 // for multiple instance of database objects, then the connection should only be
e70e8f4c 1003 // released when the last database instance using the connection is deleted
f6bcfd97 1004 freeDbConn = !pwxDb;
925e9792 1005
3fe813a9
GT
1006 if (GetDb())
1007 GetDb()->SetSqlLogging(sqlLogON);
1008
e70e8f4c 1009 SetupColumns();
108106cf
JS
1010
1011} // Ccontact Constructor
1012
1013
1014void Ccontact::Initialize()
1015{
e70e8f4c
GT
1016 Name[0] = 0;
1017 Addr1[0] = 0;
1018 Addr2[0] = 0;
1019 City[0] = 0;
1020 State[0] = 0;
1021 PostalCode[0] = 0;
1022 Country[0] = 0;
1023 JoinDate.year = 1980;
1024 JoinDate.month = 1;
1025 JoinDate.day = 1;
1026 JoinDate.hour = 0;
1027 JoinDate.minute = 0;
1028 JoinDate.second = 0;
1029 JoinDate.fraction = 0;
1030 NativeLanguage = langENGLISH;
6d841efd 1031 IsDeveloper = false;
e70e8f4c
GT
1032 Contributions = 0;
1033 LinesOfCode = 0L;
44ca6244 1034 Picture[0] = 0;
108106cf
JS
1035} // Ccontact::Initialize
1036
1037
1038Ccontact::~Ccontact()
1039{
e70e8f4c
GT
1040 if (freeDbConn)
1041 {
f6bcfd97 1042 if (!wxDbFreeConnection(GetDb()))
e70e8f4c
GT
1043 {
1044 wxString tStr;
f21b2fd8
GT
1045 tStr = wxT("Unable to Free the Ccontact data table handle\n\n");
1046
74de91cc 1047 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 1048 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
e70e8f4c
GT
1049 }
1050 }
108106cf
JS
1051} // Ccontract destructor
1052
1053
1054/*
f6bcfd97 1055 * Handles setting up all the connections for the interface from the wxDbTable
925e9792 1056 * functions to interface to the data structure used to store records in
108106cf
JS
1057 * memory, and for all the column definitions that define the table structure
1058 */
f21b2fd8 1059void Ccontact::SetupColumns()
108106cf 1060{
e70e8f4c
GT
1061 // NOTE: Columns now are 8 character names, as that is all dBase can support. Longer
1062 // names can be used for other database engines
6d841efd
WS
1063 SetColDefs ( 0,wxT("NAME"), DB_DATA_TYPE_VARCHAR, Name, SQL_C_CHAR, sizeof(Name), true, true); // Primary index
1064 SetColDefs ( 1,wxT("ADDRESS1"), DB_DATA_TYPE_VARCHAR, Addr1, SQL_C_CHAR, sizeof(Addr1), false,true);
1065 SetColDefs ( 2,wxT("ADDRESS2"), DB_DATA_TYPE_VARCHAR, Addr2, SQL_C_CHAR, sizeof(Addr2), false,true);
1066 SetColDefs ( 3,wxT("CITY"), DB_DATA_TYPE_VARCHAR, City, SQL_C_CHAR, sizeof(City), false,true);
1067 SetColDefs ( 4,wxT("STATE"), DB_DATA_TYPE_VARCHAR, State, SQL_C_CHAR, sizeof(State), false,true);
1068 SetColDefs ( 5,wxT("POSTCODE"), DB_DATA_TYPE_VARCHAR, PostalCode, SQL_C_CHAR, sizeof(PostalCode), false,true);
1069 SetColDefs ( 6,wxT("COUNTRY"), DB_DATA_TYPE_VARCHAR, Country, SQL_C_CHAR, sizeof(Country), false,true);
1070 SetColDefs ( 7,wxT("JOINDATE"), DB_DATA_TYPE_DATE, &JoinDate, SQL_C_TIMESTAMP, sizeof(JoinDate), false,true);
1071 SetColDefs ( 8,wxT("IS_DEV"), DB_DATA_TYPE_INTEGER, &IsDeveloper, SQL_C_BOOLEAN(IsDeveloper), sizeof(IsDeveloper), false,true);
1072 SetColDefs ( 9,wxT("CONTRIBS"), DB_DATA_TYPE_INTEGER, &Contributions, SQL_C_UTINYINT, sizeof(Contributions), false,true);
1073 SetColDefs (10,wxT("LINE_CNT"), DB_DATA_TYPE_INTEGER, &LinesOfCode, SQL_C_ULONG, sizeof(LinesOfCode), false,true);
1074 SetColDefs (11,wxT("LANGUAGE"), DB_DATA_TYPE_INTEGER, &NativeLanguage, SQL_C_ENUM, sizeof(NativeLanguage), false,true);
dd5b579c 1075#ifdef wxODBC_BLOB_SUPPORT
6d841efd 1076 SetColDefs (12,wxT("PICTURE"), DB_DATA_TYPE_BLOB, Picture, SQL_C_BINARY, sizeof(Picture), false,true);
3fe813a9 1077#endif
108106cf
JS
1078} // Ccontact::SetupColumns
1079
1080
69a2b59d 1081bool Ccontact::CreateIndexes(bool recreate)
108106cf 1082{
925e9792 1083 // This index could easily be accomplished with an "orderBy" clause,
e70e8f4c
GT
1084 // but is done to show how to construct a non-primary index.
1085 wxString indexName;
f6bcfd97 1086 wxDbIdxDef idxDef[2];
108106cf 1087
74de91cc 1088 wxStrcpy(idxDef[0].ColName, wxT("IS_DEV"));
6d841efd 1089 idxDef[0].Ascending = true;
108106cf 1090
74de91cc 1091 wxStrcpy(idxDef[1].ColName, wxT("NAME"));
6d841efd 1092 idxDef[1].Ascending = true;
108106cf 1093
f6bcfd97 1094 indexName = GetTableName();
74de91cc 1095 indexName += wxT("_IDX1");
108106cf 1096
6d841efd
WS
1097 return CreateIndex(indexName.c_str(), true, 2, idxDef, recreate);
1098
108106cf
JS
1099} // Ccontact::CreateIndexes()
1100
1101
1102/*
1103 * Having a function to do a query on the primary key (and possibly others) is
1104 * very efficient and tighter coding so that it is available where ever the object
1105 * is. Great for use with multiple tables when not using views or outer joins
1106 */
049977d0 1107bool Ccontact::FetchByName(const wxString &name)
108106cf 1108{
24e2b35d 1109 whereStr.Printf(wxT("NAME = '%s'"),name.c_str());
f6bcfd97 1110 SetWhereClause(whereStr.c_str());
94613352 1111 SetOrderByClause(wxT(""));
108106cf 1112
e70e8f4c 1113 if (!Query())
6d841efd 1114 return(false);
108106cf 1115
e70e8f4c
GT
1116 // Fetch the record
1117 return(GetNext());
108106cf
JS
1118
1119} // Ccontact::FetchByName()
1120
1121
1122/*
1123 *
1124 * ************* DIALOGS ***************
1125 *
1126 */
1127
1128
1129/* CeditorDlg constructor
1130 *
1131 * Creates the dialog used for creating/editing/deleting/copying a Ccontact object.
1132 * This dialog actually is drawn in the main frame of the program
1133 *
1134 * An instance of Ccontact is created - "Contact" - which is used to hold the Ccontact
1135 * object that is currently being worked with.
1136 */
925e9792 1137
f6fcbb63 1138BEGIN_EVENT_TABLE(CeditorDlg, wxPanel)
6d841efd 1139 EVT_BUTTON(wxID_ANY, CeditorDlg::OnButton)
3f755e2d 1140 EVT_CLOSE(CeditorDlg::OnCloseWindow)
f6fcbb63 1141END_EVENT_TABLE()
925e9792 1142
3ca6a5f0 1143CeditorDlg::CeditorDlg(wxWindow *parent) : wxPanel (parent, 0, 0, 537, 480)
108106cf 1144{
e70e8f4c
GT
1145 // Since the ::OnCommand() function is overridden, this prevents the widget
1146 // detection in ::OnCommand() until all widgets have been initialized to prevent
1147 // uninitialized pointers from crashing the program
6d841efd 1148 widgetPtrsSet = false;
e70e8f4c 1149
6d841efd 1150 initialized = false;
e70e8f4c 1151
3fe813a9
GT
1152 SetMode(mView);
1153
6d841efd 1154 Show(false);
108106cf
JS
1155} // CeditorDlg constructor
1156
1157
e3065973 1158void CeditorDlg::OnCloseWindow(wxCloseEvent& event)
108106cf 1159{
e70e8f4c 1160 // Clean up time
3f755e2d 1161 if ((mode != mCreate) && (mode != mEdit))
e70e8f4c 1162 {
e70e8f4c
GT
1163 this->Destroy();
1164 }
1165 else
1166 {
94613352 1167 wxMessageBox(wxT("Must finish processing the current record being created/modified before exiting"),wxT("Notice..."),wxOK | wxICON_INFORMATION);
e70e8f4c
GT
1168 event.Veto();
1169 }
e3065973 1170} // CeditorDlg::OnCloseWindow()
108106cf
JS
1171
1172
3ca6a5f0 1173void CeditorDlg::OnButton(wxCommandEvent &event)
f6fcbb63 1174{
3ca6a5f0
BP
1175 wxWindow *win = (wxWindow*) event.GetEventObject();
1176 OnCommand( *win, event );
1177} // CeditorDlg::OnButton()
f6fcbb63 1178
65d7ddc4 1179
74de91cc 1180void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& WXUNUSED(event))
108106cf 1181{
e70e8f4c 1182 wxString widgetName;
925e9792 1183
e70e8f4c
GT
1184 widgetName = win.GetName();
1185
1186 if (!widgetPtrsSet)
1187 return;
1188
1189 if (widgetName == pCreateBtn->GetName())
1190 {
ea24eeb2 1191 wxGetApp().Contact->Initialize();
e70e8f4c
GT
1192 PutData();
1193 SetMode( mCreate );
94613352 1194 pNameTxt->SetValue(wxT(""));
e70e8f4c
GT
1195 pNameTxt->SetFocus();
1196 return;
1197 }
1198
1199 if (widgetName == pEditBtn->GetName())
1200 {
ea24eeb2 1201 saveName = wxGetApp().Contact->Name;
e70e8f4c
GT
1202 SetMode( mEdit );
1203 pNameTxt->SetFocus();
1204 return;
1205 }
1206
1207 if (widgetName == pCopyBtn->GetName())
1208 {
1209 SetMode(mCreate);
94613352 1210 pNameTxt->SetValue(wxT(""));
e70e8f4c
GT
1211 pNameTxt->SetFocus();
1212 return;
1213 }
1214
1215 if (widgetName == pDeleteBtn->GetName())
1216 {
94613352 1217 bool Ok = (wxMessageBox(wxT("Are you sure?"),wxT("Confirm"),wxYES_NO|wxICON_QUESTION) == wxYES);
e70e8f4c
GT
1218
1219 if (!Ok)
1220 return;
1221
ea24eeb2 1222 if (Ok && wxGetApp().Contact->Delete())
e70e8f4c 1223 {
925e9792
WS
1224 // NOTE: Deletions are not finalized until a CommitTrans() is performed.
1225 // If the commit were not performed, the program will continue to
e70e8f4c 1226 // show the table contents as if they were deleted until this instance
925e9792 1227 // of Ccontact is deleted. If the Commit wasn't performed, the
e70e8f4c
GT
1228 // database will automatically Rollback the changes when the database
1229 // connection is terminated
ea24eeb2 1230 wxGetApp().Contact->GetDb()->CommitTrans();
e70e8f4c
GT
1231
1232 // Try to get the row that followed the just deleted row in the orderBy sequence
1233 if (!GetNextRec())
1234 {
1235 // There was now row (in sequence) after the just deleted row, so get the
1236 // row which preceded the just deleted row
1237 if (!GetPrevRec())
1238 {
1239 // There are now no rows remaining, so clear the dialog widgets
ea24eeb2 1240 wxGetApp().Contact->Initialize();
e70e8f4c
GT
1241 PutData();
1242 }
1243 }
1244 SetMode(mode); // force reset of button enable/disable
1245 }
1246 else
1247 // Delete failed
ea24eeb2 1248 wxGetApp().Contact->GetDb()->RollbackTrans();
e70e8f4c
GT
1249
1250 SetMode(mView);
1251 return;
1252 }
1253
1254 if (widgetName == pSaveBtn->GetName())
1255 {
1256 Save();
1257 return;
1258 }
1259
1260 if (widgetName == pCancelBtn->GetName())
1261 {
94613352 1262 bool Ok = (wxMessageBox(wxT("Are you sure?"),wxT("Confirm"),wxYES_NO|wxICON_QUESTION) == wxYES);
e70e8f4c
GT
1263
1264 if (!Ok)
1265 return;
1266
94613352 1267 if (saveName.IsEmpty())
e70e8f4c 1268 {
ea24eeb2 1269 wxGetApp().Contact->Initialize();
e70e8f4c
GT
1270 PutData();
1271 SetMode(mView);
1272 return;
1273 }
1274 else
1275 {
1276 // Requery previous record
ea24eeb2 1277 if (wxGetApp().Contact->FetchByName(saveName))
e70e8f4c
GT
1278 {
1279 PutData();
1280 SetMode(mView);
1281 return;
1282 }
1283 }
1284
1285 // Previous record not available, retrieve first record in table
ea24eeb2
GT
1286 if (wxGetApp().Contact->GetDb()->Dbms() != dbmsPOSTGRES &&
1287 wxGetApp().Contact->GetDb()->Dbms() != dbmsMY_SQL)
e70e8f4c 1288 {
ea24eeb2
GT
1289 wxGetApp().Contact->whereStr = wxT("NAME = (SELECT MIN(NAME) FROM ");
1290 wxGetApp().Contact->whereStr += wxGetApp().Contact->GetTableName();
1291 wxGetApp().Contact->whereStr += wxT(")");
1292 wxGetApp().Contact->SetWhereClause(wxGetApp().Contact->whereStr.c_str());
e70e8f4c
GT
1293 }
1294 else
ea24eeb2 1295 wxGetApp().Contact->SetWhereClause(wxT(""));
e70e8f4c 1296
ea24eeb2 1297 if (!wxGetApp().Contact->Query())
e70e8f4c
GT
1298 {
1299 wxString tStr;
f21b2fd8 1300 tStr = wxT("ODBC error during Query()\n\n");
74de91cc 1301 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 1302 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
925e9792 1303
e70e8f4c
GT
1304 SetMode(mView);
1305 return;
1306 }
ea24eeb2 1307 if (wxGetApp().Contact->GetNext()) // Successfully read first record
e70e8f4c
GT
1308 {
1309 PutData();
1310 SetMode(mView);
1311 return;
1312 }
1313 // No contacts are available, clear dialog
ea24eeb2 1314 wxGetApp().Contact->Initialize();
e70e8f4c
GT
1315 PutData();
1316 SetMode(mView);
1317 return;
1318 } // Cancel Button
1319
1320 if (widgetName == pPrevBtn->GetName())
1321 {
1322 if (!GetPrevRec())
1323 wxBell();
1324 return;
1325 } // Prev Button
1326
1327 if (widgetName == pNextBtn->GetName())
1328 {
1329 if (!GetNextRec())
1330 wxBell();
1331 return;
1332 } // Next Button
1333
1334 if (widgetName == pQueryBtn->GetName())
1335 {
1336 // Display the query dialog box
94613352 1337 wxChar qryWhere[DB_MAX_WHERE_CLAUSE_LEN+1];
ea24eeb2 1338 wxStrcpy(qryWhere, (const wxChar*) wxGetApp().Contact->qryWhereStr);
94613352 1339 wxChar *tblName[] = {(wxChar *)CONTACT_TABLE_NAME, 0};
ea24eeb2 1340 new CqueryDlg(GetParent(), wxGetApp().Contact->GetDb(), tblName, qryWhere);
e70e8f4c
GT
1341
1342 // Query the first record in the new record set and
1343 // display it, if the query string has changed.
ea24eeb2 1344 if (wxStrcmp(qryWhere, (const wxChar*) wxGetApp().Contact->qryWhereStr))
e70e8f4c 1345 {
ea24eeb2 1346 wxGetApp().Contact->whereStr.Empty();
74de91cc 1347 wxGetApp().Contact->SetOrderByClause(wxT("NAME"));
e70e8f4c 1348
ea24eeb2
GT
1349 if (wxGetApp().Contact->GetDb()->Dbms() != dbmsPOSTGRES &&
1350 wxGetApp().Contact->GetDb()->Dbms() != dbmsMY_SQL)
e70e8f4c 1351 {
ea24eeb2
GT
1352 wxGetApp().Contact->whereStr = wxT("NAME = (SELECT MIN(NAME) FROM ");
1353 wxGetApp().Contact->whereStr += CONTACT_TABLE_NAME;
e70e8f4c 1354 }
925e9792 1355
e70e8f4c 1356 // Append the query where string (if there is one)
ea24eeb2 1357 wxGetApp().Contact->qryWhereStr = qryWhere;
f6bcfd97 1358 if (wxStrlen(qryWhere))
e70e8f4c 1359 {
ea24eeb2
GT
1360 wxGetApp().Contact->whereStr += wxT(" WHERE ");
1361 wxGetApp().Contact->whereStr += wxGetApp().Contact->qryWhereStr;
e70e8f4c
GT
1362 }
1363 // Close the expression with a right paren
ea24eeb2 1364 wxGetApp().Contact->whereStr += wxT(")");
e70e8f4c 1365 // Requery the table
ea24eeb2
GT
1366 wxGetApp().Contact->SetWhereClause(wxGetApp().Contact->whereStr.c_str());
1367 if (!wxGetApp().Contact->Query())
e70e8f4c
GT
1368 {
1369 wxString tStr;
f21b2fd8 1370 tStr = wxT("ODBC error during Query()\n\n");
74de91cc 1371 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8
GT
1372 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
1373
e70e8f4c
GT
1374 return;
1375 }
1376 // Display the first record from the query set
ea24eeb2
GT
1377 if (!wxGetApp().Contact->GetNext())
1378 wxGetApp().Contact->Initialize();
e70e8f4c
GT
1379 PutData();
1380 }
1381
1382 // Enable/Disable the reset button
ea24eeb2 1383 pResetBtn->Enable(!wxGetApp().Contact->qryWhereStr.IsEmpty());
e70e8f4c
GT
1384
1385 return;
1386 } // Query button
1387
1388
1389 if (widgetName == pResetBtn->GetName())
1390 {
1391 // Clear the additional where criteria established by the query feature
ea24eeb2
GT
1392 wxGetApp().Contact->qryWhereStr = wxT("");
1393 wxGetApp().Contact->SetOrderByClause(wxT("NAME"));
e70e8f4c 1394
ea24eeb2
GT
1395 if (wxGetApp().Contact->GetDb()->Dbms() != dbmsPOSTGRES &&
1396 wxGetApp().Contact->GetDb()->Dbms() != dbmsMY_SQL)
e70e8f4c 1397 {
ea24eeb2
GT
1398 wxGetApp().Contact->whereStr = wxT("NAME = (SELECT MIN(NAME) FROM ");
1399 wxGetApp().Contact->whereStr += CONTACT_TABLE_NAME;
1400 wxGetApp().Contact->whereStr += wxT(")");
e70e8f4c
GT
1401 }
1402
ea24eeb2
GT
1403 wxGetApp().Contact->SetWhereClause(wxGetApp().Contact->whereStr.c_str());
1404 if (!wxGetApp().Contact->Query())
e70e8f4c
GT
1405 {
1406 wxString tStr;
f21b2fd8 1407 tStr = wxT("ODBC error during Query()\n\n");
74de91cc 1408 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 1409 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
e70e8f4c
GT
1410 return;
1411 }
ea24eeb2
GT
1412 if (!wxGetApp().Contact->GetNext())
1413 wxGetApp().Contact->Initialize();
e70e8f4c 1414 PutData();
6d841efd 1415 pResetBtn->Enable(false);
e70e8f4c
GT
1416
1417 return;
1418 } // Reset button
1419
1420
1421 if (widgetName == pNameListBtn->GetName())
1422 {
049977d0 1423 new ClookUpDlg(/* wxWindow *parent */ this,
94613352
GT
1424 /* wxChar *windowTitle */ wxT("Select contact name"),
1425 /* wxChar *tableName */ (wxChar *) CONTACT_TABLE_NAME,
1426 /* wxChar *dispCol1 */ wxT("NAME"),
1427 /* wxChar *dispCol2 */ wxT("JOINDATE"),
1428 /* wxChar *where */ wxT(""),
1429 /* wxChar *orderBy */ wxT("NAME"),
049977d0
GT
1430 /* wxDb *pDb */ wxGetApp().READONLY_DB,
1431 /* const wxString &defDir */ wxGetApp().DbConnectInf->GetDefaultDir(),
6d841efd 1432 /* bool distinctValues */ true);
e70e8f4c 1433
f6bcfd97 1434 if (ListDB_Selection && wxStrlen(ListDB_Selection))
e70e8f4c 1435 {
94613352 1436 wxString w = wxT("NAME = '");
e70e8f4c 1437 w += ListDB_Selection;
94613352 1438 w += wxT("'");
049977d0 1439 GetRec(w);
e70e8f4c
GT
1440 }
1441
1442 return;
1443 }
3f030b48
GT
1444
1445 if (widgetName == pDataTypesBtn->GetName())
1446 {
1447 CheckSupportForAllDataTypes(wxGetApp().READONLY_DB);
74de91cc 1448 wxMessageBox(wxT("Support datatypes was dumped to stdout."));
3f030b48
GT
1449 return;
1450 } // Data types Button
1451
1452 if (widgetName == pDbDiagsBtn->GetName())
1453 {
1454 DisplayDbDiagnostics(wxGetApp().READONLY_DB);
74de91cc 1455 wxMessageBox(wxT("Diagnostics info was dumped to stdout."));
69a2b59d
GT
1456 return;
1457 }
1458
1459 if (widgetName == pCatalogBtn->GetName())
1460 {
74de91cc
JS
1461 if (wxGetApp().Contact->GetDb()->Catalog(wxT(""),wxT("catalog.txt")))
1462 wxMessageBox(wxT("The file 'catalog.txt' was created."));
69a2b59d 1463 else
74de91cc 1464 wxMessageBox(wxT("Creation of the file 'catalog.txt' was failed."));
3f030b48
GT
1465 return;
1466 }
1467
108106cf
JS
1468} // CeditorDlg::OnCommand()
1469
1470
3ca6a5f0
BP
1471bool CeditorDlg::Initialize()
1472{
925e9792 1473 // Create the data structure and a new database connection.
3ca6a5f0
BP
1474 // (As there is not a pDb being passed in the constructor, a new database
1475 // connection is created)
ea24eeb2 1476 wxGetApp().Contact = new Ccontact();
3ca6a5f0 1477
ea24eeb2 1478 if (!wxGetApp().Contact)
3ca6a5f0 1479 {
94613352 1480 wxMessageBox(wxT("Unable to instantiate an instance of Ccontact"),wxT("Error..."),wxOK | wxICON_EXCLAMATION);
6d841efd 1481 return false;
3ca6a5f0
BP
1482 }
1483
925e9792 1484 // Check if the table exists or not. If it doesn't, ask the user if they want to
3ca6a5f0 1485 // create the table. Continue trying to create the table until it exists, or user aborts
925e9792
WS
1486 while (!wxGetApp().Contact->GetDb()->TableExists((wxChar *)CONTACT_TABLE_NAME,
1487 wxGetApp().DbConnectInf->GetUserID(),
049977d0 1488 wxGetApp().DbConnectInf->GetDefaultDir()))
3ca6a5f0
BP
1489 {
1490 wxString tStr;
f21b2fd8
GT
1491 tStr.Printf(wxT("Unable to open the table '%s'. The table may\nneed to be created.\n\nDo you wish to try to create/clear the table?\n\n"),CONTACT_TABLE_NAME);
1492 bool createTable = (wxMessageBox(tStr.c_str(),wxT("Confirm"),wxYES_NO|wxICON_QUESTION) == wxYES);
3ca6a5f0
BP
1493
1494 if (!createTable)
1495 {
1496// Close();
6d841efd 1497 return false;
3ca6a5f0
BP
1498 }
1499 else
6d841efd 1500 wxGetApp().CreateDataTable(false);
3ca6a5f0
BP
1501 }
1502
1503 // Tables must be "opened" before anything other than creating/deleting table can be done
ea24eeb2 1504 if (!wxGetApp().Contact->Open())
3ca6a5f0
BP
1505 {
1506 // Table does exist, or there was some problem opening it. Currently this should
973f2539 1507 // never fail, except in the case of the table not exisiting or the current
3ca6a5f0 1508 // user has insufficent privileges to access the table
3fe813a9 1509#if 1
3ca6a5f0
BP
1510// This code is experimenting with a new function that will hopefully be available
1511// in the 2.4 release. This check will determine whether the open failing was due
1512// to the table not existing, or the users privileges being insufficient to
1513// open the table.
ea24eeb2
GT
1514 if (!wxGetApp().Contact->GetDb()->TablePrivileges(CONTACT_TABLE_NAME, wxT("SELECT"),
1515 wxGetApp().Contact->GetDb()->GetUsername(),
69a2b59d
GT
1516 wxGetApp().Contact->GetDb()->GetUsername(),
1517 wxGetApp().DbConnectInf->GetDefaultDir()))
3ca6a5f0
BP
1518 {
1519 wxString tStr;
3fe813a9 1520 tStr.Printf(wxT("Unable to open the table '%s' (likely due to\ninsufficient privileges of the logged in user).\n\n"),CONTACT_TABLE_NAME);
f21b2fd8 1521
74de91cc 1522 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 1523 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
3ca6a5f0 1524 }
925e9792 1525 else
3ca6a5f0 1526#endif
ea24eeb2
GT
1527 if (!wxGetApp().Contact->GetDb()->TableExists(CONTACT_TABLE_NAME,
1528 wxGetApp().Contact->GetDb()->GetUsername(),
3fe813a9 1529 wxGetApp().DbConnectInf->GetDefaultDir()))
3ca6a5f0
BP
1530 {
1531 wxString tStr;
3fe813a9 1532 tStr.Printf(wxT("Unable to open the table '%s' as the table\ndoes not appear to exist in the tablespace available\nto the currently logged in user.\n\n"),CONTACT_TABLE_NAME);
74de91cc 1533 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 1534 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
3ca6a5f0
BP
1535 }
1536
6d841efd 1537 return false;
3ca6a5f0
BP
1538 }
1539
1540 // Build the dialog
1541
94613352
GT
1542 (void)new wxStaticBox(this, EDITOR_DIALOG_FN_GROUP, wxT(""), wxPoint(15, 1), wxSize(497, 69), 0, wxT("FunctionGrp"));
1543 (void)new wxStaticBox(this, EDITOR_DIALOG_SEARCH_GROUP, wxT(""), wxPoint(417, 1), wxSize(95, 242), 0, wxT("SearchGrp"));
1544
1545 pCreateBtn = new wxButton(this, EDITOR_DIALOG_CREATE, wxT("&Create"), wxPoint( 25, 21), wxSize( 70, 35), 0, wxDefaultValidator, wxT("CreateBtn"));
1546 pEditBtn = new wxButton(this, EDITOR_DIALOG_EDIT, wxT("&Edit"), wxPoint(102, 21), wxSize( 70, 35), 0, wxDefaultValidator, wxT("EditBtn"));
1547 pDeleteBtn = new wxButton(this, EDITOR_DIALOG_DELETE, wxT("&Delete"), wxPoint(179, 21), wxSize( 70, 35), 0, wxDefaultValidator, wxT("DeleteBtn"));
1548 pCopyBtn = new wxButton(this, EDITOR_DIALOG_COPY, wxT("Cop&y"), wxPoint(256, 21), wxSize( 70, 35), 0, wxDefaultValidator, wxT("CopyBtn"));
1549 pSaveBtn = new wxButton(this, EDITOR_DIALOG_SAVE, wxT("&Save"), wxPoint(333, 21), wxSize( 70, 35), 0, wxDefaultValidator, wxT("SaveBtn"));
1550 pCancelBtn = new wxButton(this, EDITOR_DIALOG_CANCEL, wxT("C&ancel"), wxPoint(430, 21), wxSize( 70, 35), 0, wxDefaultValidator, wxT("CancelBtn"));
1551 pPrevBtn = new wxButton(this, EDITOR_DIALOG_PREV, wxT("<< &Prev"), wxPoint(430, 81), wxSize( 70, 35), 0, wxDefaultValidator, wxT("PrevBtn"));
1552 pNextBtn = new wxButton(this, EDITOR_DIALOG_NEXT, wxT("&Next >>"), wxPoint(430, 121), wxSize( 70, 35), 0, wxDefaultValidator, wxT("NextBtn"));
1553 pQueryBtn = new wxButton(this, EDITOR_DIALOG_QUERY, wxT("&Query"), wxPoint(430, 161), wxSize( 70, 35), 0, wxDefaultValidator, wxT("QueryBtn"));
1554 pResetBtn = new wxButton(this, EDITOR_DIALOG_RESET, wxT("&Reset"), wxPoint(430, 200), wxSize( 70, 35), 0, wxDefaultValidator, wxT("ResetBtn"));
6d841efd 1555 pNameMsg = new wxStaticText(this, EDITOR_DIALOG_NAME_MSG, wxT("Name:"), wxPoint( 17, 80), wxDefaultSize, 0, wxT("NameMsg"));
94613352
GT
1556 pNameTxt = new wxTextCtrl(this, EDITOR_DIALOG_NAME_TEXT, wxT(""), wxPoint( 17, 97), wxSize(308, 25), 0, wxDefaultValidator, wxT("NameTxt"));
1557 pNameListBtn = new wxButton(this, EDITOR_DIALOG_LOOKUP, wxT("&Lookup"), wxPoint(333, 97), wxSize( 70, 24), 0, wxDefaultValidator, wxT("LookupBtn"));
6d841efd 1558 pAddress1Msg = new wxStaticText(this, EDITOR_DIALOG_ADDRESS1_MSG, wxT("Address:"), wxPoint( 17, 130), wxDefaultSize, 0, wxT("Address1Msg"));
94613352 1559 pAddress1Txt = new wxTextCtrl(this, EDITOR_DIALOG_ADDRESS2_TEXT, wxT(""), wxPoint( 17, 147), wxSize(308, 25), 0, wxDefaultValidator, wxT("Address1Txt"));
6d841efd 1560 pAddress2Msg = new wxStaticText(this, EDITOR_DIALOG_ADDRESS2_MSG, wxT("Address:"), wxPoint( 17, 180), wxDefaultSize, 0, wxT("Address2Msg"));
94613352 1561 pAddress2Txt = new wxTextCtrl(this, EDITOR_DIALOG_ADDRESS2_TEXT, wxT(""), wxPoint( 17, 197), wxSize(308, 25), 0, wxDefaultValidator, wxT("Address2Txt"));
6d841efd 1562 pCityMsg = new wxStaticText(this, EDITOR_DIALOG_CITY_MSG, wxT("City:"), wxPoint( 17, 230), wxDefaultSize, 0, wxT("CityMsg"));
94613352 1563 pCityTxt = new wxTextCtrl(this, EDITOR_DIALOG_CITY_TEXT, wxT(""), wxPoint( 17, 247), wxSize(225, 25), 0, wxDefaultValidator, wxT("CityTxt"));
6d841efd 1564 pStateMsg = new wxStaticText(this, EDITOR_DIALOG_STATE_MSG, wxT("State:"), wxPoint(250, 230), wxDefaultSize, 0, wxT("StateMsg"));
94613352 1565 pStateTxt = new wxTextCtrl(this, EDITOR_DIALOG_STATE_TEXT, wxT(""), wxPoint(250, 247), wxSize(153, 25), 0, wxDefaultValidator, wxT("StateTxt"));
6d841efd 1566 pCountryMsg = new wxStaticText(this, EDITOR_DIALOG_COUNTRY_MSG, wxT("Country:"), wxPoint( 17, 280), wxDefaultSize, 0, wxT("CountryMsg"));
94613352 1567 pCountryTxt = new wxTextCtrl(this, EDITOR_DIALOG_COUNTRY_TEXT, wxT(""), wxPoint( 17, 297), wxSize(225, 25), 0, wxDefaultValidator, wxT("CountryTxt"));
6d841efd 1568 pPostalCodeMsg = new wxStaticText(this, EDITOR_DIALOG_POSTAL_MSG, wxT("Postal Code:"),wxPoint(250, 280), wxDefaultSize, 0, wxT("PostalCodeMsg"));
94613352 1569 pPostalCodeTxt = new wxTextCtrl(this, EDITOR_DIALOG_POSTAL_TEXT, wxT(""), wxPoint(250, 297), wxSize(153, 25), 0, wxDefaultValidator, wxT("PostalCodeTxt"));
3ca6a5f0
BP
1570
1571 wxString choice_strings[5];
94613352
GT
1572 choice_strings[0] = wxT("English");
1573 choice_strings[1] = wxT("French");
1574 choice_strings[2] = wxT("German");
1575 choice_strings[3] = wxT("Spanish");
1576 choice_strings[4] = wxT("Other");
3ca6a5f0 1577
422d0ff0 1578 pNativeLangChoice = new wxChoice(this, EDITOR_DIALOG_LANG_CHOICE, wxPoint( 17, 346), wxSize(277, wxDefaultCoord), 5, choice_strings);
6d841efd 1579 pNativeLangMsg = new wxStaticText(this, EDITOR_DIALOG_LANG_MSG, wxT("Native language:"), wxPoint( 17, 330), wxDefaultSize, 0, wxT("NativeLangMsg"));
3ca6a5f0
BP
1580
1581 wxString radio_strings[2];
94613352
GT
1582 radio_strings[0] = wxT("No");
1583 radio_strings[1] = wxT("Yes");
6d841efd
WS
1584 pDeveloperRadio = new wxRadioBox(this,EDITOR_DIALOG_DEVELOPER, wxT("Developer:"), wxPoint(303, 330), wxDefaultSize, 2, radio_strings, 2, wxHORIZONTAL);
1585 pJoinDateMsg = new wxStaticText(this, EDITOR_DIALOG_JOIN_MSG, wxT("Date joined:"), wxPoint( 17, 380), wxDefaultSize, 0, wxT("JoinDateMsg"));
94613352 1586 pJoinDateTxt = new wxTextCtrl(this, EDITOR_DIALOG_JOIN_TEXT, wxT(""), wxPoint( 17, 397), wxSize(150, 25), 0, wxDefaultValidator, wxT("JoinDateTxt"));
6d841efd 1587 pContribMsg = new wxStaticText(this, EDITOR_DIALOG_CONTRIB_MSG,wxT("Contributions:"), wxPoint(175, 380), wxDefaultSize, 0, wxT("ContribMsg"));
94613352 1588 pContribTxt = new wxTextCtrl(this, EDITOR_DIALOG_CONTRIB_TEXT, wxT(""), wxPoint(175, 397), wxSize(120, 25), 0, wxDefaultValidator, wxT("ContribTxt"));
6d841efd 1589 pLinesMsg = new wxStaticText(this, EDITOR_DIALOG_LINES_MSG, wxT("Lines of code:"), wxPoint(303, 380), wxDefaultSize, 0, wxT("LinesMsg"));
94613352 1590 pLinesTxt = new wxTextCtrl(this, EDITOR_DIALOG_LINES_TEXT, wxT(""), wxPoint(303, 397), wxSize(100, 25), 0, wxDefaultValidator, wxT("LinesTxt"));
3ca6a5f0 1591
69a2b59d 1592 pCatalogBtn = new wxButton(this, EDITOR_DIALOG_CATALOG, wxT("Catalo&g"), wxPoint(430, 287), wxSize( 70, 35), 0, wxDefaultValidator, wxT("CatalogBtn"));
3f030b48
GT
1593 pDataTypesBtn = new wxButton(this, EDITOR_DIALOG_DATATYPES, wxT("Data&types"), wxPoint(430, 337), wxSize( 70, 35), 0, wxDefaultValidator, wxT("DataTypesBtn"));
1594 pDbDiagsBtn = new wxButton(this, EDITOR_DIALOG_DB_DIAGS, wxT("DB Dia&gs"), wxPoint(430, 387), wxSize( 70, 35), 0, wxDefaultValidator, wxT("DbDiagsBtn"));
1595
925e9792 1596 // Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to
3ca6a5f0 1597 // handle all widget processing
6d841efd 1598 widgetPtrsSet = true;
3ca6a5f0 1599
925e9792 1600 // Setup the orderBy and where clauses to return back a single record as the result set,
3ca6a5f0
BP
1601 // as there will only be one record being shown on the dialog at a time, this optimizes
1602 // network traffic by only returning a one row result
925e9792 1603
ea24eeb2 1604 wxGetApp().Contact->SetOrderByClause(wxT("NAME")); // field name to sort by
3ca6a5f0
BP
1605
1606 // The wxString "whereStr" is not a member of the wxDbTable object, it is a member variable
1607 // specifically in the Ccontact class. It is used here for simpler construction of a varying
1608 // length string, and then after the string is built, the wxDbTable member variable "where" is
1609 // assigned the pointer to the constructed string.
1610 //
925e9792 1611 // The constructed where clause below has a sub-query within it "SELECT MIN(NAME) FROM %s"
3ca6a5f0 1612 // to achieve a single row (in this case the first name in alphabetical order).
925e9792 1613
ea24eeb2
GT
1614 if (wxGetApp().Contact->GetDb()->Dbms() != dbmsPOSTGRES &&
1615 wxGetApp().Contact->GetDb()->Dbms() != dbmsMY_SQL)
3ca6a5f0 1616 {
ea24eeb2
GT
1617 wxGetApp().Contact->whereStr.Printf(wxT("NAME = (SELECT MIN(NAME) FROM %s)"),
1618 wxGetApp().Contact->GetTableName().c_str());
94613352 1619 // NOTE: (const wxChar*) returns a pointer which may not be valid later, so this is short term use only
ea24eeb2 1620 wxGetApp().Contact->SetWhereClause(wxGetApp().Contact->whereStr);
3ca6a5f0
BP
1621 }
1622 else
ea24eeb2 1623 wxGetApp().Contact->SetWhereClause(wxT(""));
3ca6a5f0 1624
925e9792
WS
1625 // Perform the Query to get the result set.
1626 // NOTE: If there are no rows returned, that is a valid result, so Query() would return true.
6d841efd 1627 // Only if there is a database error will Query() come back as false
ea24eeb2 1628 if (!wxGetApp().Contact->Query())
3ca6a5f0
BP
1629 {
1630 wxString tStr;
f21b2fd8 1631 tStr = wxT("ODBC error during Query()\n\n");
74de91cc 1632 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 1633 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
6d841efd 1634 return false;
3ca6a5f0
BP
1635 }
1636
1637 // Since Query succeeded, now get the row that was returned
ea24eeb2 1638 if (!wxGetApp().Contact->GetNext())
925e9792
WS
1639 // If the GetNext() failed at this point, then there are no rows to retrieve,
1640 // so clear the values in the members of "Contact" so that PutData() blanks the
3ca6a5f0 1641 // widgets on the dialog
ea24eeb2
GT
1642 wxGetApp().Contact->Initialize();
1643/*
1644 wxGetApp().Contact->GetDb()->RollbackTrans();
1645*/
3ca6a5f0
BP
1646 SetMode(mView);
1647 PutData();
1648
6d841efd 1649 Show(true);
3ca6a5f0 1650
6d841efd
WS
1651 initialized = true;
1652 return true;
3ca6a5f0
BP
1653} // CeditorDlg::Initialize()
1654
1655
108106cf
JS
1656void CeditorDlg::FieldsEditable()
1657{
3fe813a9
GT
1658 if (!widgetPtrsSet)
1659 return;
1660
e70e8f4c
GT
1661 pNameTxt->Enable((mode == mCreate) || (mode == mEdit));
1662 pAddress1Txt->Enable((mode == mCreate) || (mode == mEdit));
1663 pAddress2Txt->Enable((mode == mCreate) || (mode == mEdit));
1664 pCityTxt->Enable((mode == mCreate) || (mode == mEdit));
1665 pStateTxt->Enable((mode == mCreate) || (mode == mEdit));
1666 pPostalCodeTxt->Enable((mode == mCreate) || (mode == mEdit));
1667 pCountryTxt->Enable((mode == mCreate) || (mode == mEdit));
1668
1669 pJoinDateTxt->Enable((mode == mCreate) || (mode == mEdit));
1670 pContribTxt->Enable((mode == mCreate) || (mode == mEdit));
1671 pLinesTxt->Enable((mode == mCreate) || (mode == mEdit));
1672 pNativeLangChoice->Enable((mode == mCreate) || (mode == mEdit));
1673 pDeveloperRadio->Enable((mode == mCreate) || (mode == mEdit));
108106cf
JS
1674
1675} // CeditorDlg::FieldsEditable()
1676
1677
1678void CeditorDlg::SetMode(enum DialogModes m)
1679{
6d841efd 1680 bool edit = false;
e70e8f4c
GT
1681
1682 mode = m;
1683 switch (mode)
1684 {
1685 case mCreate:
1686 case mEdit:
6d841efd 1687 edit = true;
e70e8f4c
GT
1688 break;
1689 case mView:
1690 case mSearch:
6d841efd 1691 edit = false;
e70e8f4c
GT
1692 break;
1693 default:
1694 break;
1695 };
1696
1697 if (widgetPtrsSet)
1698 {
1699 pCreateBtn->Enable( !edit );
ea24eeb2
GT
1700 pEditBtn->Enable( !edit && (wxStrcmp(wxGetApp().Contact->Name,wxT(""))!=0) );
1701 pDeleteBtn->Enable( !edit && (wxStrcmp(wxGetApp().Contact->Name,wxT(""))!=0) );
1702 pCopyBtn->Enable( !edit && (wxStrcmp(wxGetApp().Contact->Name,wxT(""))!=0) );
e70e8f4c
GT
1703 pSaveBtn->Enable( edit );
1704 pCancelBtn->Enable( edit );
1705 pPrevBtn->Enable( !edit );
1706 pNextBtn->Enable( !edit );
1707 pQueryBtn->Enable( !edit );
ea24eeb2 1708 pResetBtn->Enable( !edit && !wxGetApp().Contact->qryWhereStr.IsEmpty() );
e70e8f4c
GT
1709 pNameListBtn->Enable( !edit );
1710 }
1711
1712 FieldsEditable();
108106cf
JS
1713} // CeditorDlg::SetMode()
1714
1715
1fc5dd6f 1716bool CeditorDlg::PutData()
108106cf 1717{
e70e8f4c 1718 wxString tStr;
108106cf 1719
ea24eeb2
GT
1720 pNameTxt->SetValue(wxGetApp().Contact->Name);
1721 pAddress1Txt->SetValue(wxGetApp().Contact->Addr1);
1722 pAddress2Txt->SetValue(wxGetApp().Contact->Addr2);
1723 pCityTxt->SetValue(wxGetApp().Contact->City);
1724 pStateTxt->SetValue(wxGetApp().Contact->State);
1725 pCountryTxt->SetValue(wxGetApp().Contact->Country);
1726 pPostalCodeTxt->SetValue(wxGetApp().Contact->PostalCode);
108106cf 1727
ea24eeb2 1728 tStr.Printf(wxT("%d/%d/%d"),wxGetApp().Contact->JoinDate.month,wxGetApp().Contact->JoinDate.day,wxGetApp().Contact->JoinDate.year);
e70e8f4c 1729 pJoinDateTxt->SetValue(tStr);
108106cf 1730
ea24eeb2 1731 tStr.Printf(wxT("%d"),wxGetApp().Contact->Contributions);
e70e8f4c 1732 pContribTxt->SetValue(tStr);
108106cf 1733
ea24eeb2 1734 tStr.Printf(wxT("%lu"),wxGetApp().Contact->LinesOfCode);
e70e8f4c 1735 pLinesTxt->SetValue(tStr);
108106cf 1736
ea24eeb2 1737 pNativeLangChoice->SetSelection(wxGetApp().Contact->NativeLanguage);
108106cf 1738
ea24eeb2 1739 pDeveloperRadio->SetSelection(wxGetApp().Contact->IsDeveloper);
108106cf 1740
6d841efd 1741 return true;
108106cf
JS
1742} // Ceditor::PutData()
1743
1744
1745/*
1746 * Reads the data out of all the widgets on the dialog. Some data evaluation is done
1747 * to ensure that there is a name entered and that the date field is valid.
1748 *
6d841efd 1749 * A return value of true means that valid data was retrieved from the dialog, otherwise
108106cf
JS
1750 * invalid data was found (and a message was displayed telling the user what to fix), and
1751 * the data was not placed into the appropraite fields of Ccontact
1752 */
1fc5dd6f 1753bool CeditorDlg::GetData()
108106cf 1754{
e70e8f4c
GT
1755 // Validate that the data currently entered into the widgets is valid data
1756
1757 wxString tStr;
1758 tStr = pNameTxt->GetValue();
94613352 1759 if (!wxStrcmp((const wxChar*) tStr,wxT("")))
e70e8f4c 1760 {
94613352 1761 wxMessageBox(wxT("A name is required for entry into the contact table"),wxT("Notice..."),wxOK | wxICON_INFORMATION);
6d841efd 1762 return false;
e70e8f4c
GT
1763 }
1764
6d841efd 1765 bool invalid = false;
f369dd4f 1766 int mm = 1,dd = 1,yyyy = 2001;
e70e8f4c
GT
1767 int first, second;
1768
1769 tStr = pJoinDateTxt->GetValue();
94613352 1770 if (tStr.Freq(wxT('/')) != 2)
6d841efd 1771 invalid = true;
e70e8f4c
GT
1772
1773 // Find the month, day, and year tokens
1774 if (!invalid)
1775 {
94613352
GT
1776 first = tStr.First(wxT('/'));
1777 second = tStr.Last(wxT('/'));
e70e8f4c 1778
74de91cc
JS
1779 mm = wxAtoi(tStr.SubString(0,first));
1780 dd = wxAtoi(tStr.SubString(first+1,second));
1781 yyyy = wxAtoi(tStr.SubString(second+1,tStr.Length()-1));
e70e8f4c
GT
1782
1783 invalid = !(mm && dd && yyyy);
1784 }
1785
1786 // Force Year 2000 compliance
1787 if (!invalid && (yyyy < 1000))
6d841efd 1788 invalid = true;
e70e8f4c
GT
1789
1790 // Check the token ranges for validity
1791 if (!invalid)
1792 {
1793 if (yyyy > 9999)
6d841efd 1794 invalid = true;
e70e8f4c 1795 else if ((mm < 1) || (mm > 12))
6d841efd 1796 invalid = true;
e70e8f4c
GT
1797 else
1798 {
1799 if (dd < 1)
6d841efd 1800 invalid = true;
e70e8f4c
GT
1801 else
1802 {
1803 int days[12] = {31,28,31,30,31,30,
1804 31,31,30,31,30,31};
1805 if (dd > days[mm-1])
1806 {
6d841efd 1807 invalid = true;
e70e8f4c
GT
1808 if ((dd == 29) && (mm == 2))
1809 {
1810 if (((yyyy % 4) == 0) && (((yyyy % 100) != 0) || ((yyyy % 400) == 0)))
6d841efd 1811 invalid = false;
e70e8f4c
GT
1812 }
1813 }
1814 }
1815 }
1816 }
1817
1818 if (!invalid)
1819 {
29787237
JS
1820 wxGetApp().Contact->JoinDate.month = (unsigned short) mm;
1821 wxGetApp().Contact->JoinDate.day = (unsigned short) dd;
1822 wxGetApp().Contact->JoinDate.year = (short) yyyy;
e70e8f4c
GT
1823 }
1824 else
1825 {
94613352 1826 wxMessageBox(wxT("Improper date format. Please check the date\nspecified and try again.\n\nNOTE: Dates are in american format (MM/DD/YYYY)"),wxT("Notice..."),wxOK | wxICON_INFORMATION);
6d841efd 1827 return false;
e70e8f4c
GT
1828 }
1829
1830 tStr = pNameTxt->GetValue();
ea24eeb2
GT
1831 wxStrcpy(wxGetApp().Contact->Name,(const wxChar*) tStr);
1832 wxStrcpy(wxGetApp().Contact->Addr1,pAddress1Txt->GetValue());
1833 wxStrcpy(wxGetApp().Contact->Addr2,pAddress2Txt->GetValue());
1834 wxStrcpy(wxGetApp().Contact->City,pCityTxt->GetValue());
1835 wxStrcpy(wxGetApp().Contact->State,pStateTxt->GetValue());
1836 wxStrcpy(wxGetApp().Contact->Country,pCountryTxt->GetValue());
1837 wxStrcpy(wxGetApp().Contact->PostalCode,pPostalCodeTxt->GetValue());
e70e8f4c 1838
925e9792 1839 wxGetApp().Contact->Contributions = (UCHAR)wxAtoi(pContribTxt->GetValue());
74de91cc 1840 wxGetApp().Contact->LinesOfCode = wxAtol(pLinesTxt->GetValue());
e70e8f4c 1841
ea24eeb2
GT
1842 wxGetApp().Contact->NativeLanguage = (enum Language) pNativeLangChoice->GetSelection();
1843 wxGetApp().Contact->IsDeveloper = pDeveloperRadio->GetSelection() > 0;
e70e8f4c 1844
6d841efd 1845 return true;
108106cf
JS
1846} // CeditorDlg::GetData()
1847
1848
1849/*
1850 * Retrieve data from the dialog, verify the validity of the data, and if it is valid,
1851 * try to insert/update the data to the table based on the current 'mode' the dialog
1852 * is set to.
1853 *
6d841efd
WS
1854 * A return value of true means the insert/update was completed successfully, a return
1855 * value of false means that Save() failed. If returning false, then this function
108106cf
JS
1856 * has displayed a detailed error message for the user.
1857 */
1fc5dd6f 1858bool CeditorDlg::Save()
108106cf 1859{
6d841efd 1860 bool failed = false;
e70e8f4c
GT
1861
1862 // Read the data in the widgets of the dialog to get the user's data
1863 if (!GetData())
6d841efd 1864 failed = true;
e70e8f4c
GT
1865
1866 // Perform any other required validations necessary before saving
1867 if (!failed)
1868 {
1869 wxBeginBusyCursor();
1870
1871 if (mode == mCreate)
1872 {
925e9792 1873 RETCODE result = (RETCODE)wxGetApp().Contact->Insert();
e70e8f4c
GT
1874
1875 failed = (result != DB_SUCCESS);
1876 if (failed)
1877 {
1878 // Some errors may be expected, like a duplicate key, so handle those instances with
1879 // specific error messages.
1880 if (result == DB_ERR_INTEGRITY_CONSTRAINT_VIOL)
1881 {
1882 wxString tStr;
f21b2fd8 1883 tStr = wxT("A duplicate key value already exists in the table.\nUnable to save record\n\n");
74de91cc 1884 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 1885 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
e70e8f4c
GT
1886 }
1887 else
1888 {
5d59e67a 1889 // Some other unexpected error occurred
e70e8f4c 1890 wxString tStr;
f21b2fd8 1891 tStr = wxT("Database insert failed\n\n");
74de91cc 1892 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 1893 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
e70e8f4c
GT
1894 }
1895 }
1896 }
1897 else // mode == mEdit
1898 {
5d59e67a 1899 wxGetApp().Contact->GetDb()->RollbackTrans();
74de91cc 1900 wxGetApp().Contact->whereStr.Printf(wxT("NAME = '%s'"),saveName.c_str());
ea24eeb2 1901 if (!wxGetApp().Contact->UpdateWhere(wxGetApp().Contact->whereStr))
e70e8f4c
GT
1902 {
1903 wxString tStr;
f21b2fd8 1904 tStr = wxT("Database update failed\n\n");
74de91cc 1905 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 1906 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
6d841efd 1907 failed = true;
e70e8f4c
GT
1908 }
1909 }
1910
1911 if (!failed)
1912 {
ea24eeb2 1913 wxGetApp().Contact->GetDb()->CommitTrans();
e70e8f4c
GT
1914 SetMode(mView); // Sets the dialog mode back to viewing after save is successful
1915 }
1916 else
ea24eeb2 1917 wxGetApp().Contact->GetDb()->RollbackTrans();
e70e8f4c
GT
1918
1919 wxEndBusyCursor();
1920 }
1921
1922 return !failed;
108106cf
JS
1923} // CeditorDlg::Save()
1924
1925
1926/*
1927 * Where this program is only showing a single row at a time in the dialog,
1928 * a special where clause must be built to find just the single row which,
1929 * in sequence, would follow the currently displayed row.
1930 */
1fc5dd6f 1931bool CeditorDlg::GetNextRec()
108106cf 1932{
e70e8f4c
GT
1933 wxString w;
1934
ea24eeb2
GT
1935 if (wxGetApp().Contact->GetDb()->Dbms() != dbmsPOSTGRES &&
1936 wxGetApp().Contact->GetDb()->Dbms() != dbmsMY_SQL)
e70e8f4c 1937 {
94613352 1938 w = wxT("NAME = (SELECT MIN(NAME) FROM ");
ea24eeb2 1939 w += wxGetApp().Contact->GetTableName();
94613352 1940 w += wxT(" WHERE NAME > '");
e70e8f4c
GT
1941 }
1942 else
94613352 1943 w = wxT("(NAME > '");
e70e8f4c 1944
ea24eeb2 1945 w += wxGetApp().Contact->Name;
94613352 1946 w += wxT("'");
e70e8f4c
GT
1947
1948 // If a query where string is currently set, append that criteria
ea24eeb2 1949 if (!wxGetApp().Contact->qryWhereStr.IsEmpty())
e70e8f4c 1950 {
94613352 1951 w += wxT(" AND (");
ea24eeb2 1952 w += wxGetApp().Contact->qryWhereStr;
94613352 1953 w += wxT(")");
e70e8f4c
GT
1954 }
1955
94613352 1956 w += wxT(")");
049977d0 1957 return(GetRec(w));
108106cf
JS
1958
1959} // CeditorDlg::GetNextRec()
1960
1961
1962/*
1963 * Where this program is only showing a single row at a time in the dialog,
1964 * a special where clause must be built to find just the single row which,
1965 * in sequence, would precede the currently displayed row.
1966 */
1fc5dd6f 1967bool CeditorDlg::GetPrevRec()
108106cf 1968{
e70e8f4c 1969 wxString w;
108106cf 1970
ea24eeb2
GT
1971 if (wxGetApp().Contact->GetDb()->Dbms() != dbmsPOSTGRES &&
1972 wxGetApp().Contact->GetDb()->Dbms() != dbmsMY_SQL)
e70e8f4c 1973 {
94613352 1974 w = wxT("NAME = (SELECT MAX(NAME) FROM ");
ea24eeb2 1975 w += wxGetApp().Contact->GetTableName();
94613352 1976 w += wxT(" WHERE NAME < '");
e70e8f4c
GT
1977 }
1978 else
94613352 1979 w = wxT("(NAME < '");
65d7ddc4 1980
ea24eeb2 1981 w += wxGetApp().Contact->Name;
94613352 1982 w += wxT("'");
108106cf 1983
e70e8f4c 1984 // If a query where string is currently set, append that criteria
ea24eeb2 1985 if (!wxGetApp().Contact->qryWhereStr.IsEmpty())
e70e8f4c 1986 {
94613352 1987 w += wxT(" AND (");
ea24eeb2 1988 w += wxGetApp().Contact->qryWhereStr;
94613352 1989 w += wxT(")");
e70e8f4c 1990 }
108106cf 1991
94613352 1992 w += wxT(")");
108106cf 1993
049977d0 1994 return(GetRec(w));
108106cf
JS
1995
1996} // CeditorDlg::GetPrevRec()
1997
1998
1999/*
2000 * This function is here to avoid duplicating this same code in both the
2001 * GetPrevRec() and GetNextRec() functions
2002 */
049977d0 2003bool CeditorDlg::GetRec(const wxString &whereStr)
108106cf 2004{
ea24eeb2
GT
2005 wxGetApp().Contact->SetWhereClause(whereStr);
2006 wxGetApp().Contact->SetOrderByClause(wxT("NAME"));
e70e8f4c 2007
ea24eeb2 2008 if (!wxGetApp().Contact->Query())
e70e8f4c
GT
2009 {
2010 wxString tStr;
f21b2fd8 2011 tStr = wxT("ODBC error during Query()\n\n");
74de91cc 2012 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 2013 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
e70e8f4c 2014
6d841efd 2015 return(false);
e70e8f4c
GT
2016 }
2017
ea24eeb2 2018 if (wxGetApp().Contact->GetNext())
e70e8f4c
GT
2019 {
2020 PutData();
6d841efd 2021 return(true);
e70e8f4c
GT
2022 }
2023 else
6d841efd 2024 return(false);
108106cf
JS
2025} // CeditorDlg::GetRec()
2026
2027
2028
2029/*
2030 * CparameterDlg constructor
2031 */
e3065973
JS
2032
2033BEGIN_EVENT_TABLE(CparameterDlg, wxDialog)
65d7ddc4
GT
2034 EVT_BUTTON(PARAMETER_DIALOG_SAVE, CparameterDlg::OnButton)
2035 EVT_BUTTON(PARAMETER_DIALOG_CANCEL, CparameterDlg::OnButton)
e3065973
JS
2036 EVT_CLOSE(CparameterDlg::OnCloseWindow)
2037END_EVENT_TABLE()
2038
6d841efd 2039CparameterDlg::CparameterDlg(wxWindow *parent) : wxDialog (parent, PARAMETER_DIALOG, wxT("ODBC parameter settings"), wxDefaultPosition, wxSize(400, 325))
108106cf 2040{
e70e8f4c
GT
2041 // Since the ::OnCommand() function is overridden, this prevents the widget
2042 // detection in ::OnCommand() until all widgets have been initialized to prevent
2043 // uninitialized pointers from crashing the program
6d841efd 2044 widgetPtrsSet = false;
e70e8f4c 2045
6d841efd 2046 pParamODBCSourceMsg = new wxStaticText(this, PARAMETER_DIALOG_SOURCE_MSG, wxT("ODBC data sources:"), wxPoint( 10, 10), wxDefaultSize, 0, wxT("ParamODBCSourceMsg"));
94613352 2047 pParamODBCSourceList = new wxListBox(this, PARAMETER_DIALOG_SOURCE_LISTBOX, wxPoint( 10, 29), wxSize(285, 150), 0, 0, wxLB_SINGLE|wxLB_ALWAYS_SB, wxDefaultValidator, wxT("ParamODBCSourceList"));
6d841efd 2048 pParamUserNameMsg = new wxStaticText(this, PARAMETER_DIALOG_NAME_MSG, wxT("Database user name:"), wxPoint( 10, 193), wxDefaultSize, 0, wxT("ParamUserNameMsg"));
94613352 2049 pParamUserNameTxt = new wxTextCtrl(this, PARAMETER_DIALOG_NAME_TEXT, wxT(""), wxPoint(10, 209), wxSize( 140, 25), 0, wxDefaultValidator, wxT("ParamUserNameTxt"));
6d841efd 2050 pParamPasswordMsg = new wxStaticText(this, PARAMETER_DIALOG_PASSWORD_MSG, wxT("Password:"), wxPoint(156, 193), wxDefaultSize, 0, wxT("ParamPasswordMsg"));
94613352 2051 pParamPasswordTxt = new wxTextCtrl(this, PARAMETER_DIALOG_PASSWORD_TEXT, wxT(""), wxPoint(156, 209), wxSize( 140, 25), 0, wxDefaultValidator, wxT("ParamPasswordTxt"));
6d841efd 2052 pParamDirPathMsg = new wxStaticText(this, PARAMETER_DIALOG_DIRPATH_MSG, wxT("Directory:"), wxPoint( 10, 243), wxDefaultSize, 0, wxT("ParamDirPathMsg"));
94613352
GT
2053 pParamDirPathTxt = new wxTextCtrl(this, PARAMETER_DIALOG_DIRPATH_TEXT, wxT(""), wxPoint( 10, 259), wxSize(140, 25), 0, wxDefaultValidator, wxT("ParamDirPathTxt"));
2054 pParamSaveBtn = new wxButton(this, PARAMETER_DIALOG_SAVE, wxT("&Save"), wxPoint(310, 21), wxSize( 70, 35), 0, wxDefaultValidator, wxT("ParamSaveBtn"));
2055 pParamCancelBtn = new wxButton(this, PARAMETER_DIALOG_CANCEL, wxT("C&ancel"), wxPoint(310, 66), wxSize( 70, 35), 0, wxDefaultValidator, wxT("ParamCancelBtn"));
e70e8f4c 2056
925e9792 2057 // Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to
e70e8f4c 2058 // handle all widget processing
6d841efd 2059 widgetPtrsSet = true;
e70e8f4c 2060
6d841efd 2061 saved = false;
e70e8f4c
GT
2062 savedParamSettings = wxGetApp().params;
2063
2064 Centre(wxBOTH);
2065 PutData();
2066 ShowModal();
108106cf
JS
2067} // CparameterDlg constructor
2068
2069
e3065973 2070void CparameterDlg::OnCloseWindow(wxCloseEvent& event)
108106cf 2071{
e70e8f4c
GT
2072 // Put any additional checking necessary to make certain it is alright
2073 // to close the program here that is not done elsewhere
2074 if (!saved)
2075 {
94613352 2076 bool Ok = (wxMessageBox(wxT("No changes have been saved.\n\nAre you sure you wish exit the parameter screen?"),wxT("Confirm"),wxYES_NO|wxICON_QUESTION) == wxYES);
925e9792 2077
e70e8f4c 2078 if (!Ok)
e3065973
JS
2079 {
2080 event.Veto();
e70e8f4c 2081 return;
e3065973 2082 }
925e9792 2083
e70e8f4c
GT
2084 wxGetApp().params = savedParamSettings;
2085 }
108106cf 2086
e70e8f4c
GT
2087 if (GetParent() != NULL)
2088 GetParent()->SetFocus();
e3065973 2089
3ca6a5f0
BP
2090 while (wxIsBusy())
2091 wxEndBusyCursor();
2092
6d841efd 2093 Show(false);
3ca6a5f0
BP
2094 SetReturnCode(0); // added so BoundsChecker would not report use of uninitialized variable
2095
2096 this->Destroy();
2097} // CparameterDlg::OnCloseWindow()
108106cf
JS
2098
2099
65d7ddc4
GT
2100void CparameterDlg::OnButton( wxCommandEvent &event )
2101{
e70e8f4c
GT
2102 wxWindow *win = (wxWindow*) event.GetEventObject();
2103 OnCommand( *win, event );
65d7ddc4
GT
2104}
2105
3ca6a5f0 2106
74de91cc 2107void CparameterDlg::OnCommand(wxWindow& win, wxCommandEvent& WXUNUSED(event))
108106cf 2108{
e70e8f4c 2109 wxString widgetName;
925e9792 2110
e70e8f4c
GT
2111 widgetName = win.GetName();
2112
2113 if (!widgetPtrsSet)
2114 return;
2115
2116 if (widgetName == pParamSaveBtn->GetName())
2117 {
2118 if (Save())
2119 {
2120 wxString tStr;
94613352 2121 tStr = wxT("Database parameters have been saved.");
e70e8f4c 2122 if (GetParent() != NULL) // The parameter dialog was not called during startup due to a missing cfg file
94613352
GT
2123 tStr += wxT("\nNew parameters will take effect the next time the program is started.");
2124 wxMessageBox(tStr,wxT("Notice..."),wxOK | wxICON_INFORMATION);
6d841efd 2125 saved = true;
e70e8f4c
GT
2126 Close();
2127 }
2128 return;
2129 }
2130
2131 if (widgetName == pParamCancelBtn->GetName())
2132 {
2133 Close();
2134 return;
2135 }
108106cf
JS
2136} // CparameterDlg::OnCommand()
2137
2138
1fc5dd6f 2139bool CparameterDlg::PutData()
108106cf 2140{
e70e8f4c
GT
2141 // Fill the data source list box
2142 FillDataSourceList();
2143
2144 // Fill in the fields from the params object
2145 if (wxGetApp().params.ODBCSource && wxStrlen(wxGetApp().params.ODBCSource))
f369dd4f
GT
2146 {
2147 int index = pParamODBCSourceList->FindString(wxGetApp().params.ODBCSource);
6d841efd 2148 if (index != wxNOT_FOUND)
f369dd4f
GT
2149 pParamODBCSourceList->SetSelection(index);
2150 }
e70e8f4c
GT
2151 pParamUserNameTxt->SetValue(wxGetApp().params.UserName);
2152 pParamPasswordTxt->SetValue(wxGetApp().params.Password);
2153 pParamDirPathTxt->SetValue(wxGetApp().params.DirPath);
6d841efd 2154 return true;
108106cf
JS
2155} // CparameterDlg::PutData()
2156
2157
1fc5dd6f 2158bool CparameterDlg::GetData()
108106cf 2159{
e70e8f4c 2160 wxString tStr;
94613352 2161 if (pParamODBCSourceList->GetStringSelection() != wxT(""))
e70e8f4c
GT
2162 {
2163 tStr = pParamODBCSourceList->GetStringSelection();
2164 if (tStr.Length() > (sizeof(wxGetApp().params.ODBCSource)-1))
2165 {
2166 wxString errmsg;
94613352
GT
2167 errmsg.Printf(wxT("ODBC Data source name is longer than the data structure to hold it.\n'Cparameter.ODBCSource' must have a larger character array\nto handle a data source with this long of a name\n\nThe data source currently selected is %d characters long."),tStr.Length());
2168 wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
6d841efd 2169 return false;
e70e8f4c 2170 }
f6bcfd97 2171 wxStrcpy(wxGetApp().params.ODBCSource, tStr);
e70e8f4c
GT
2172 }
2173 else
6d841efd 2174 return false;
925e9792 2175
e70e8f4c
GT
2176 tStr = pParamUserNameTxt->GetValue();
2177 if (tStr.Length() > (sizeof(wxGetApp().params.UserName)-1))
2178 {
2179 wxString errmsg;
94613352
GT
2180 errmsg.Printf(wxT("User name is longer than the data structure to hold it.\n'Cparameter.UserName' must have a larger character array\nto handle a data source with this long of a name\n\nThe user name currently specified is %d characters long."),tStr.Length());
2181 wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
6d841efd 2182 return false;
e70e8f4c 2183 }
f6bcfd97 2184 wxStrcpy(wxGetApp().params.UserName, tStr);
e70e8f4c
GT
2185
2186 tStr = pParamPasswordTxt->GetValue();
2187 if (tStr.Length() > (sizeof(wxGetApp().params.Password)-1))
2188 {
2189 wxString errmsg;
94613352
GT
2190 errmsg.Printf(wxT("Password is longer than the data structure to hold it.\n'Cparameter.Password' must have a larger character array\nto handle a data source with this long of a name\n\nThe password currently specified is %d characters long."),tStr.Length());
2191 wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
6d841efd 2192 return false;
e70e8f4c 2193 }
f6bcfd97 2194 wxStrcpy(wxGetApp().params.Password,tStr);
e70e8f4c
GT
2195
2196 tStr = pParamDirPathTxt->GetValue();
94613352 2197 tStr.Replace(wxT("\\"),wxT("/"));
e70e8f4c
GT
2198 if (tStr.Length() > (sizeof(wxGetApp().params.DirPath)-1))
2199 {
2200 wxString errmsg;
94613352
GT
2201 errmsg.Printf(wxT("DirPath is longer than the data structure to hold it.\n'Cparameter.DirPath' must have a larger character array\nto handle a data source with this long of a name\n\nThe password currently specified is %d characters long."),tStr.Length());
2202 wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
6d841efd 2203 return false;
e70e8f4c 2204 }
f6bcfd97 2205 wxStrcpy(wxGetApp().params.DirPath,tStr);
6d841efd 2206 return true;
108106cf
JS
2207} // CparameterDlg::GetData()
2208
2209
1fc5dd6f 2210bool CparameterDlg::Save()
108106cf 2211{
049977d0
GT
2212 // Copy the current params in case user cancels changing
2213 // the params, so that we can reset them.
e70e8f4c
GT
2214 if (!GetData())
2215 {
049977d0 2216 wxGetApp().params = savedParamSettings;
6d841efd 2217 return false;
e70e8f4c
GT
2218 }
2219
049977d0 2220 wxGetApp().WriteParamFile(wxGetApp().params);
e70e8f4c 2221
6d841efd 2222 return true;
108106cf
JS
2223} // CparameterDlg::Save()
2224
2225
2226void CparameterDlg::FillDataSourceList()
2227{
94613352
GT
2228 wxChar Dsn[SQL_MAX_DSN_LENGTH + 1];
2229 wxChar DsDesc[255];
44420d2e 2230 wxSortedArrayString strArr;
108106cf 2231
049977d0
GT
2232 while (wxDbGetDataSource(wxGetApp().DbConnectInf->GetHenv(), Dsn,
2233 SQL_MAX_DSN_LENGTH+1, DsDesc, 255))
44420d2e
WS
2234 {
2235 strArr.Add(Dsn);
2236 }
108106cf 2237
44420d2e 2238 for (size_t i=0; i < strArr.GetCount(); i++ )
6d841efd 2239 {
44420d2e 2240 pParamODBCSourceList->Append(strArr[i].c_str());
6d841efd 2241 }
3ca6a5f0 2242
3fe813a9 2243} // CparameterDlg::FillDataSourceList()
108106cf
JS
2244
2245
f6fcbb63 2246BEGIN_EVENT_TABLE(CqueryDlg, wxDialog)
6d841efd 2247 EVT_BUTTON(wxID_ANY, CqueryDlg::OnButton)
e3065973 2248 EVT_CLOSE(CqueryDlg::OnCloseWindow)
f6fcbb63 2249END_EVENT_TABLE()
3ca6a5f0 2250
925e9792 2251
108106cf 2252// CqueryDlg() constructor
925e9792 2253CqueryDlg::CqueryDlg(wxWindow *parent, wxDb *pDb, wxChar *tblName[],
d3358961 2254 const wxString &pWhereArg) :
6d841efd 2255 wxDialog (parent, QUERY_DIALOG, wxT("Query"), wxDefaultPosition, wxSize(480, 360))
108106cf 2256{
e70e8f4c
GT
2257 wxBeginBusyCursor();
2258
2259 colInf = 0;
2260 dbTable = 0;
2261 masterTableName = tblName[0];
6d841efd 2262 widgetPtrsSet = false;
e70e8f4c
GT
2263 pDB = pDb;
2264
2265 // Initialize the WHERE clause from the string passed in
d3358961
GT
2266 pWhere = pWhereArg; // Save a pointer to the output buffer
2267 if (pWhere.Length() > (unsigned int)DB_MAX_WHERE_CLAUSE_LEN) // Check the length of the buffer passed in
e70e8f4c
GT
2268 {
2269 wxString s;
94613352
GT
2270 s.Printf(wxT("Maximum where clause length exceeded.\nLength must be less than %d"), DB_MAX_WHERE_CLAUSE_LEN+1);
2271 wxMessageBox(s,wxT("Error..."),wxOK | wxICON_EXCLAMATION);
e70e8f4c
GT
2272 Close();
2273 return;
2274 }
2275
94613352
GT
2276 pQueryCol1Msg = new wxStaticText(this, QUERY_DIALOG_COL_MSG, wxT("Column 1:"), wxPoint( 10, 10), wxSize( 69, 16), 0, wxT("QueryCol1Msg"));
2277 pQueryCol1Choice = new wxChoice(this, QUERY_DIALOG_COL_CHOICE, wxPoint( 10, 27), wxSize(250, 27), 0, 0, 0, wxDefaultValidator, wxT("QueryCol1Choice"));
6d841efd 2278 pQueryNotMsg = new wxStaticText(this, QUERY_DIALOG_NOT_MSG, wxT("NOT"), wxPoint(268, 10), wxDefaultSize, 0, wxT("QueryNotMsg"));
94613352 2279 pQueryNotCheck = new wxCheckBox(this, QUERY_DIALOG_NOT_CHECKBOX, wxT(""), wxPoint(275, 37), wxSize( 20, 20), 0, wxDefaultValidator, wxT("QueryNotCheck"));
e70e8f4c
GT
2280
2281 wxString choice_strings[9];
94613352
GT
2282 choice_strings[0] = wxT("=");
2283 choice_strings[1] = wxT("<");
2284 choice_strings[2] = wxT(">");
2285 choice_strings[3] = wxT("<=");
2286 choice_strings[4] = wxT(">=");
2287 choice_strings[5] = wxT("Begins");
2288 choice_strings[6] = wxT("Contains");
2289 choice_strings[7] = wxT("Like");
2290 choice_strings[8] = wxT("Between");
2291
6d841efd 2292 pQueryOperatorMsg = new wxStaticText(this, QUERY_DIALOG_OP_MSG, wxT("Operator:"), wxPoint(305, 10), wxDefaultSize, 0, wxT("QueryOperatorMsg"));
94613352
GT
2293 pQueryOperatorChoice = new wxChoice(this, QUERY_DIALOG_OP_CHOICE, wxPoint(305, 27), wxSize( 80, 27), 9, choice_strings, 0, wxDefaultValidator, wxT("QueryOperatorChoice"));
2294 pQueryCol2Msg = new wxStaticText(this, QUERY_DIALOG_COL2_MSG, wxT("Column 2:"), wxPoint( 10, 65), wxSize( 69, 16), 0, wxT("QueryCol2Msg"));
2295 pQueryCol2Choice = new wxChoice(this, QUERY_DIALOG_COL2_CHOICE, wxPoint( 10, 82), wxSize(250, 27), 0, 0, 0, wxDefaultValidator, wxT("QueryCol2Choice"));
6d841efd 2296 pQuerySqlWhereMsg = new wxStaticText(this, QUERY_DIALOG_WHERE_MSG, wxT("SQL where clause:"), wxPoint( 10, 141), wxDefaultSize, 0, wxT("QuerySqlWhereMsg"));
94613352
GT
2297 pQuerySqlWhereMtxt = new wxTextCtrl(this, QUERY_DIALOG_WHERE_TEXT, wxT(""), wxPoint( 10, 159), wxSize(377, 134), wxTE_MULTILINE, wxDefaultValidator, wxT("QuerySqlWhereMtxt"));
2298 pQueryAddBtn = new wxButton(this, QUERY_DIALOG_ADD, wxT("&Add"), wxPoint(406, 24), wxSize( 56, 26), 0, wxDefaultValidator, wxT("QueryAddBtn"));
2299 pQueryAndBtn = new wxButton(this, QUERY_DIALOG_AND, wxT("A&nd"), wxPoint(406, 58), wxSize( 56, 26), 0, wxDefaultValidator, wxT("QueryAndBtn"));
2300 pQueryOrBtn = new wxButton(this, QUERY_DIALOG_OR, wxT("&Or"), wxPoint(406, 92), wxSize( 56, 26), 0, wxDefaultValidator, wxT("QueryOrBtn"));
2301 pQueryLParenBtn = new wxButton(this, QUERY_DIALOG_LPAREN, wxT("("), wxPoint(406, 126), wxSize( 26, 26), 0, wxDefaultValidator, wxT("QueryLParenBtn"));
2302 pQueryRParenBtn = new wxButton(this, QUERY_DIALOG_RPAREN, wxT(")"), wxPoint(436, 126), wxSize( 26, 26), 0, wxDefaultValidator, wxT("QueryRParenBtn"));
2303 pQueryDoneBtn = new wxButton(this, QUERY_DIALOG_DONE, wxT("&Done"), wxPoint(406, 185), wxSize( 56, 26), 0, wxDefaultValidator, wxT("QueryDoneBtn"));
2304 pQueryClearBtn = new wxButton(this, QUERY_DIALOG_CLEAR, wxT("C&lear"), wxPoint(406, 218), wxSize( 56, 26), 0, wxDefaultValidator, wxT("QueryClearBtn"));
2305 pQueryCountBtn = new wxButton(this, QUERY_DIALOG_COUNT, wxT("&Count"), wxPoint(406, 252), wxSize( 56, 26), 0, wxDefaultValidator, wxT("QueryCountBtn"));
6d841efd 2306 pQueryValue1Msg = new wxStaticText(this, QUERY_DIALOG_VALUE1_MSG, wxT("Value:"), wxPoint(277, 66), wxDefaultSize, 0, wxT("QueryValue1Msg"));
94613352 2307 pQueryValue1Txt = new wxTextCtrl(this, QUERY_DIALOG_VALUE1_TEXT, wxT(""), wxPoint(277, 83), wxSize(108, 25), 0, wxDefaultValidator, wxT("QueryValue1Txt"));
6d841efd 2308 pQueryValue2Msg = new wxStaticText(this, QUERY_DIALOG_VALUE2_MSG, wxT("AND"), wxPoint(238, 126), wxDefaultSize, 0, wxT("QueryValue2Msg"));
94613352
GT
2309 pQueryValue2Txt = new wxTextCtrl(this, QUERY_DIALOG_VALUE2_TEXT, wxT(""), wxPoint(277, 120), wxSize(108, 25), 0, wxDefaultValidator, wxT("QueryValue2Txt"));
2310 pQueryHintGrp = new wxStaticBox(this, QUERY_DIALOG_HINT_GROUP, wxT(""), wxPoint( 10, 291), wxSize(377, 40), 0, wxT("QueryHintGrp"));
6d841efd 2311 pQueryHintMsg = new wxStaticText(this, QUERY_DIALOG_HINT_MSG, wxT(""), wxPoint( 16, 306), wxDefaultSize, 0, wxT("QueryHintMsg"));
e70e8f4c 2312
6d841efd 2313 widgetPtrsSet = true;
e70e8f4c
GT
2314 // Initialize the dialog
2315 wxString qualName;
94613352 2316 pQueryCol2Choice->Append(wxT("VALUE -->"));
e70e8f4c
GT
2317 colInf = pDB->GetColumns(tblName);
2318
2319 if (!colInf)
2320 {
2321 wxEndBusyCursor();
2322 wxString tStr;
f21b2fd8 2323 tStr = wxT("ODBC error during GetColumns()\n\n");
74de91cc 2324 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 2325 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
e70e8f4c
GT
2326 return;
2327 }
2328
2329 int i;
f6bcfd97 2330 for (i = 0; colInf[i].colName && wxStrlen(colInf[i].colName); i++)
e70e8f4c
GT
2331 {
2332 // If there is more than one table being queried, qualify
2333 // the column names with the table name prefix.
f6bcfd97 2334 if (tblName[1] && wxStrlen(tblName[1]))
e70e8f4c 2335 {
94613352 2336 qualName.Printf(wxT("%s.%s"), colInf[i].tableName, colInf[i].colName);
e70e8f4c
GT
2337 pQueryCol1Choice->Append(qualName);
2338 pQueryCol2Choice->Append(qualName);
2339 }
2340 else // Single table query, append just the column names
2341 {
2342 pQueryCol1Choice->Append(colInf[i].colName);
2343 pQueryCol2Choice->Append(colInf[i].colName);
2344 }
2345 }
2346
2347 pQueryCol1Choice->SetSelection(0);
2348 pQueryCol2Choice->SetSelection(0);
2349 pQueryOperatorChoice->SetSelection(0);
2350
6d841efd
WS
2351 pQueryValue2Msg->Show(false);
2352 pQueryValue2Txt->Show(false);
e70e8f4c
GT
2353
2354 pQueryHintMsg->SetLabel(langQRY_EQ);
2355
d3358961 2356 pQuerySqlWhereMtxt->SetValue(pWhere.c_str());
e70e8f4c
GT
2357
2358 wxEndBusyCursor();
2359
2360 // Display the dialog window
2361 Centre(wxBOTH);
2362 ShowModal();
108106cf
JS
2363} // CqueryDlg() constructor
2364
2365
3ca6a5f0 2366void CqueryDlg::OnButton(wxCommandEvent &event)
f6fcbb63
RR
2367{
2368 wxWindow *win = (wxWindow*) event.GetEventObject();
2369 OnCommand( *win, event );
3ca6a5f0
BP
2370} // CqueryDlg::OnButton()
2371
f6fcbb63 2372
74de91cc 2373void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& WXUNUSED(event))
108106cf 2374{
e70e8f4c
GT
2375 // Widget pointers won't be set when the dialog is constructed.
2376 // Control is passed through this function once for each widget on
2377 // a dialog as the dialog is constructed.
2378 if (!widgetPtrsSet)
2379 return;
2380
2381 wxString widgetName = win.GetName();
2382
2383 // Operator choice box
2384 if (widgetName == pQueryOperatorChoice->GetName())
2385 {
2386 // Set the help text
2387 switch((qryOp) pQueryOperatorChoice->GetSelection())
2388 {
3ca6a5f0
BP
2389 case qryOpEQ:
2390 pQueryHintMsg->SetLabel(langQRY_EQ);
2391 break;
2392 case qryOpLT:
2393 pQueryHintMsg->SetLabel(langQRY_LT);
2394 break;
2395 case qryOpGT:
2396 pQueryHintMsg->SetLabel(langQRY_GT);
2397 break;
2398 case qryOpLE:
2399 pQueryHintMsg->SetLabel(langQRY_LE);
2400 break;
2401 case qryOpGE:
2402 pQueryHintMsg->SetLabel(langQRY_GE);
2403 break;
2404 case qryOpBEGINS:
2405 pQueryHintMsg->SetLabel(langQRY_BEGINS);
2406 break;
2407 case qryOpCONTAINS:
2408 pQueryHintMsg->SetLabel(langQRY_CONTAINS);
2409 break;
2410 case qryOpLIKE:
2411 pQueryHintMsg->SetLabel(langQRY_LIKE);
2412 break;
2413 case qryOpBETWEEN:
2414 pQueryHintMsg->SetLabel(langQRY_BETWEEN);
2415 break;
e70e8f4c
GT
2416 }
2417
2418 // Hide the value2 widget
6d841efd
WS
2419 pQueryValue2Msg->Show(false); // BETWEEN will show this widget
2420 pQueryValue2Txt->Show(false); // BETWEEN will show this widget
e70e8f4c
GT
2421
2422 // Disable the NOT operator for <, <=, >, >=
2423 switch((qryOp) pQueryOperatorChoice->GetSelection())
2424 {
3ca6a5f0
BP
2425 case qryOpLT:
2426 case qryOpGT:
2427 case qryOpLE:
2428 case qryOpGE:
2429 pQueryNotCheck->SetValue(0);
6d841efd 2430 pQueryNotCheck->Enable(false);
3ca6a5f0
BP
2431 break;
2432 default:
6d841efd 2433 pQueryNotCheck->Enable(true);
3ca6a5f0 2434 break;
e70e8f4c
GT
2435 }
2436
2437 // Manipulate the dialog to handle the selected operator
2438 switch((qryOp) pQueryOperatorChoice->GetSelection())
2439 {
3ca6a5f0
BP
2440 case qryOpEQ:
2441 case qryOpLT:
2442 case qryOpGT:
2443 case qryOpLE:
2444 case qryOpGE:
6d841efd 2445 pQueryCol2Choice->Enable(true);
3ca6a5f0
BP
2446 if (pQueryCol2Choice->GetSelection()) // Column name is highlighted
2447 {
6d841efd
WS
2448 pQueryValue1Msg->Show(false);
2449 pQueryValue1Txt->Show(false);
3ca6a5f0
BP
2450 }
2451 else // "Value" is highlighted
2452 {
6d841efd
WS
2453 pQueryValue1Msg->Show(true);
2454 pQueryValue1Txt->Show(true);
3ca6a5f0
BP
2455 pQueryValue1Txt->SetFocus();
2456 }
2457 break;
2458 case qryOpBEGINS:
2459 case qryOpCONTAINS:
2460 case qryOpLIKE:
2461 pQueryCol2Choice->SetSelection(0);
6d841efd
WS
2462 pQueryCol2Choice->Enable(false);
2463 pQueryValue1Msg->Show(true);
2464 pQueryValue1Txt->Show(true);
e70e8f4c 2465 pQueryValue1Txt->SetFocus();
3ca6a5f0
BP
2466 break;
2467 case qryOpBETWEEN:
2468 pQueryCol2Choice->SetSelection(0);
6d841efd
WS
2469 pQueryCol2Choice->Enable(false);
2470 pQueryValue2Msg->Show(true);
2471 pQueryValue2Txt->Show(true);
2472 pQueryValue1Msg->Show(true);
2473 pQueryValue1Txt->Show(true);
3ca6a5f0
BP
2474 pQueryValue1Txt->SetFocus();
2475 break;
e70e8f4c
GT
2476 }
2477
2478 return;
2479
2480 } // Operator choice box
2481
2482 // Column 2 choice
2483 if (widgetName == pQueryCol2Choice->GetName())
2484 {
2485 if (pQueryCol2Choice->GetSelection()) // Column name is highlighted
2486 {
6d841efd
WS
2487 pQueryValue1Msg->Show(false);
2488 pQueryValue1Txt->Show(false);
e70e8f4c
GT
2489 }
2490 else // "Value" is highlighted
2491 {
6d841efd
WS
2492 pQueryValue1Msg->Show(true);
2493 pQueryValue1Txt->Show(true);
e70e8f4c
GT
2494 pQueryValue1Txt->SetFocus();
2495 }
2496 return;
e70e8f4c
GT
2497 } // Column 2 choice
2498
2499 // Add button
2500 if (widgetName == pQueryAddBtn->GetName())
2501 {
2502 ProcessAddBtn();
2503 return;
e70e8f4c
GT
2504 } // Add button
2505
2506 // And button
2507 if (widgetName == pQueryAndBtn->GetName())
2508 {
94613352 2509 AppendToWhere(wxT(" AND\n"));
e70e8f4c 2510 return;
e70e8f4c
GT
2511 } // And button
2512
2513 // Or button
2514 if (widgetName == pQueryOrBtn->GetName())
2515 {
94613352 2516 AppendToWhere(wxT(" OR\n"));
e70e8f4c 2517 return;
e70e8f4c
GT
2518 } // Or button
2519
2520 // Left Paren button
2521 if (widgetName == pQueryLParenBtn->GetName())
2522 {
94613352 2523 AppendToWhere(wxT("("));
e70e8f4c 2524 return;
e70e8f4c
GT
2525 } // Left Paren button
2526
2527 // Right paren button
2528 if (widgetName == pQueryRParenBtn->GetName())
2529 {
94613352 2530 AppendToWhere(wxT(")"));
e70e8f4c 2531 return;
e70e8f4c
GT
2532 } // Right Paren button
2533
2534 // Done button
2535 if (widgetName == pQueryDoneBtn->GetName())
2536 {
2537 // Be sure the where clause will not overflow the output buffer
3ca6a5f0 2538 if (wxStrlen(pQuerySqlWhereMtxt->GetValue()) > (unsigned int)DB_MAX_WHERE_CLAUSE_LEN)
e70e8f4c
GT
2539 {
2540 wxString s;
94613352
GT
2541 s.Printf(wxT("Maximum where clause length exceeded.\nLength must be less than %d"), DB_MAX_WHERE_CLAUSE_LEN+1);
2542 wxMessageBox(s,wxT("Error..."),wxOK | wxICON_EXCLAMATION);
e70e8f4c
GT
2543 return;
2544 }
2545 // Validate the where clause for things such as matching parens
2546 if (!ValidateWhereClause())
2547 return;
2548 // Copy the where clause to the output buffer and exit
d3358961 2549 pWhere = pQuerySqlWhereMtxt->GetValue();
e70e8f4c
GT
2550 Close();
2551 return;
e70e8f4c
GT
2552 } // Done button
2553
2554 // Clear button
2555 if (widgetName == pQueryClearBtn->GetName())
2556 {
94613352 2557 bool Ok = (wxMessageBox(wxT("Are you sure you wish to clear the Query?"),wxT("Confirm"),wxYES_NO|wxICON_QUESTION) == wxYES);
e70e8f4c
GT
2558
2559 if (Ok)
94613352 2560 pQuerySqlWhereMtxt->SetValue(wxT(""));
e70e8f4c 2561 return;
e70e8f4c
GT
2562 } // Clear button
2563
2564 // Count button
2565 if (widgetName == pQueryCountBtn->GetName())
2566 {
2567 wxBeginBusyCursor();
2568 ProcessCountBtn();
2569 wxEndBusyCursor();
2570 return;
e70e8f4c 2571 } // Count button
108106cf
JS
2572
2573} // CqueryDlg::OnCommand
2574
2575
74de91cc 2576void CqueryDlg::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
108106cf 2577{
e70e8f4c 2578 // Clean up
ea24eeb2 2579 wxDELETEA(colInf);
e70e8f4c 2580
ea24eeb2 2581 wxDELETE(dbTable);
e70e8f4c
GT
2582
2583 GetParent()->SetFocus();
2584 while (wxIsBusy())
2585 wxEndBusyCursor();
108106cf 2586
6d841efd 2587 Show(false);
3ca6a5f0 2588 SetReturnCode(1); // added so BoundsChecker would not report use of uninitialized variable
e3065973 2589
3ca6a5f0 2590 this->Destroy();
e3065973 2591} // CqueryDlg::OnCloseWindow()
108106cf 2592
108106cf 2593
94613352 2594void CqueryDlg::AppendToWhere(wxChar *s)
108106cf 2595{
3ca6a5f0
BP
2596 wxString whereStr = pQuerySqlWhereMtxt->GetValue();
2597 whereStr += s;
2598 pQuerySqlWhereMtxt->SetValue(whereStr);
108106cf
JS
2599} // CqueryDlg::AppendToWhere()
2600
2601
2602void CqueryDlg::ProcessAddBtn()
2603{
e70e8f4c
GT
2604 qryOp oper = (qryOp) pQueryOperatorChoice->GetSelection();
2605
2606 // Verify that eveything is filled in correctly
2607 if (pQueryCol2Choice->GetSelection() == 0) // "Value" is selected
2608 {
2609 // Verify that value 1 is filled in
f6bcfd97 2610 if (wxStrlen(pQueryValue1Txt->GetValue()) == 0)
e70e8f4c
GT
2611 {
2612 wxBell();
2613 pQueryValue1Txt->SetFocus();
2614 return;
2615 }
2616 // For the BETWEEN operator, value 2 must be filled in as well
2617 if (oper == qryOpBETWEEN &&
f6bcfd97 2618 wxStrlen(pQueryValue2Txt->GetValue()) == 0)
e70e8f4c
GT
2619 {
2620 wxBell();
2621 pQueryValue2Txt->SetFocus();
2622 return;
2623 }
2624 }
2625
2626 // Build the expression and append it to the where clause window
2627 wxString s = pQueryCol1Choice->GetStringSelection();
925e9792 2628
e70e8f4c 2629 if (pQueryNotCheck->GetValue() && (oper != qryOpEQ))
94613352 2630 s += wxT(" NOT");
925e9792 2631
e70e8f4c
GT
2632 switch(oper)
2633 {
2634 case qryOpEQ:
2635 if (pQueryNotCheck->GetValue()) // NOT box is checked
94613352 2636 s += wxT(" <>");
e70e8f4c 2637 else
94613352 2638 s += wxT(" =");
e70e8f4c
GT
2639 break;
2640 case qryOpLT:
94613352 2641 s += wxT(" <");
e70e8f4c
GT
2642 break;
2643 case qryOpGT:
94613352 2644 s += wxT(" >");
e70e8f4c
GT
2645 break;
2646 case qryOpLE:
94613352 2647 s += wxT(" <=");
e70e8f4c
GT
2648 break;
2649 case qryOpGE:
94613352 2650 s += wxT(" >=");
e70e8f4c
GT
2651 break;
2652 case qryOpBEGINS:
2653 case qryOpCONTAINS:
2654 case qryOpLIKE:
94613352 2655 s += wxT(" LIKE");
e70e8f4c
GT
2656 break;
2657 case qryOpBETWEEN:
94613352 2658 s += wxT(" BETWEEN");
e70e8f4c
GT
2659 break;
2660 }
2661
94613352 2662 s += wxT(" ");
e70e8f4c
GT
2663
2664 int col1Idx = pQueryCol1Choice->GetSelection();
2665
6d841efd 2666 bool quote = false;
e70e8f4c
GT
2667 if (colInf[col1Idx].sqlDataType == SQL_VARCHAR ||
2668 oper == qryOpBEGINS ||
2669 oper == qryOpCONTAINS ||
2670 oper == qryOpLIKE)
6d841efd 2671 quote = true;
e70e8f4c
GT
2672
2673 if (pQueryCol2Choice->GetSelection()) // Column name
2674 s += pQueryCol2Choice->GetStringSelection();
2675 else // Column 2 is a "value"
2676 {
2677 if (quote)
94613352 2678 s += wxT("'");
e70e8f4c 2679 if (oper == qryOpCONTAINS)
94613352 2680 s += wxT("%");
e70e8f4c
GT
2681 s += pQueryValue1Txt->GetValue();
2682 if (oper == qryOpCONTAINS || oper == qryOpBEGINS)
94613352 2683 s += wxT("%");
e70e8f4c 2684 if (quote)
94613352 2685 s += wxT("'");
e70e8f4c
GT
2686 }
2687
2688 if (oper == qryOpBETWEEN)
2689 {
94613352 2690 s += wxT(" AND ");
e70e8f4c 2691 if (quote)
94613352 2692 s += wxT("'");
e70e8f4c
GT
2693 s += pQueryValue2Txt->GetValue();
2694 if (quote)
94613352 2695 s += wxT("'");
e70e8f4c
GT
2696 }
2697
94613352 2698 AppendToWhere((wxChar*) (const wxChar*) s);
108106cf
JS
2699
2700} // CqueryDlg::ProcessAddBtn()
2701
2702
2703void CqueryDlg::ProcessCountBtn()
2704{
e70e8f4c
GT
2705 if (!ValidateWhereClause())
2706 return;
2707
3fe813a9 2708 if (!dbTable) // wxDbTable object needs to be created and opened
e70e8f4c 2709 {
925e9792
WS
2710 dbTable = new wxDbTable(pDB, masterTableName, 0, wxEmptyString,
2711 !wxDB_QUERY_ONLY,
3fe813a9
GT
2712 wxGetApp().DbConnectInf->GetDefaultDir());
2713 if (!dbTable)
e70e8f4c 2714 {
94613352 2715 wxMessageBox(wxT("Memory allocation failed creating a wxDbTable object."),wxT("Error..."),wxOK | wxICON_EXCLAMATION);
e70e8f4c
GT
2716 return;
2717 }
2718 if (!dbTable->Open())
2719 {
2720 wxString tStr;
f21b2fd8 2721 tStr = wxT("ODBC error during Open()\n\n");
74de91cc 2722 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 2723 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
e70e8f4c
GT
2724 return;
2725 }
2726 }
2727
2728 // Count() with WHERE clause
f6bcfd97 2729 wxString whereStr;
4c4a393f
GT
2730
2731 whereStr = pQuerySqlWhereMtxt->GetValue();
f6bcfd97 2732 dbTable->SetWhereClause(whereStr.c_str());
94613352 2733
e70e8f4c
GT
2734 ULONG whereCnt = dbTable->Count();
2735
2736 // Count() of all records in the table
94613352 2737 dbTable->SetWhereClause(wxT(""));
e70e8f4c
GT
2738 ULONG totalCnt = dbTable->Count();
2739
2740 if (whereCnt > 0 || totalCnt == 0)
2741 {
2742 wxString tStr;
94613352
GT
2743 tStr.Printf(wxT("%lu of %lu records match the query criteria."),whereCnt,totalCnt);
2744 wxMessageBox(tStr,wxT("Notice..."),wxOK | wxICON_INFORMATION);
e70e8f4c
GT
2745 }
2746 else
2747 {
2748 wxString tStr;
94613352
GT
2749 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);
2750 wxMessageBox(tStr,wxT("Notice..."),wxOK | wxICON_INFORMATION);
e70e8f4c
GT
2751 }
2752
2753 // After a wxMessageBox, the focus does not necessarily return to the
2754 // window which was the focus when the message box popped up, so return
2755 // focus to the Query dialog for certain
2756 SetFocus();
108106cf
JS
2757
2758} // CqueryDlg::ProcessCountBtn()
2759
2760
1fc5dd6f 2761bool CqueryDlg::ValidateWhereClause()
108106cf 2762{
e70e8f4c
GT
2763 wxString where = pQuerySqlWhereMtxt->GetValue();
2764
94613352 2765 if (where.Freq(wxT('(')) != where.Freq(wxT(')')))
e70e8f4c 2766 {
94613352 2767 wxMessageBox(wxT("There are mismatched parenthesis in the constructed where clause"),wxT("Error..."),wxOK | wxICON_EXCLAMATION);
6d841efd 2768 return(false);
e70e8f4c
GT
2769 }
2770 // After a wxMessageBox, the focus does not necessarily return to the
2771 // window which was the focus when the message box popped up, so return
2772 // focus to the Query dialog for certain
2773 SetFocus();
2774
6d841efd 2775 return(true);
108106cf
JS
2776
2777} // CqueryDlg::ValidateWhereClause()
3f755e2d
GT
2778
2779
2780
3f030b48
GT
2781void DisplayDbDiagnostics(wxDb *pDb)
2782{
69a2b59d 2783 wxString s, t;
6d841efd 2784 bool comma;
69a2b59d 2785
9b12bd99
GT
2786 s = wxT("Diagnostics Output\n");
2787 s += langDBINF_DB_NAME;
69a2b59d 2788 s += pDb->dbInf.dbmsName;
74de91cc 2789 s += wxT("\n");
69a2b59d
GT
2790
2791 s += langDBINF_DB_VER;
2792 s += pDb->dbInf.dbmsVer;
74de91cc 2793 s += wxT("\n");
69a2b59d
GT
2794
2795 s += langDBINF_DRIVER_NAME;
2796 s += pDb->dbInf.driverName;
74de91cc 2797 s += wxT("\n");
69a2b59d
GT
2798
2799 s += langDBINF_DRIVER_ODBC_VER;
2800 s += pDb->dbInf.odbcVer;
74de91cc 2801 s += wxT("\n");
69a2b59d
GT
2802
2803 s += langDBINF_DRIVER_MGR_ODBC_VER;
2804 s += pDb->dbInf.drvMgrOdbcVer;
74de91cc 2805 s += wxT("\n");
69a2b59d
GT
2806
2807 s += langDBINF_DRIVER_VER;
2808 s += pDb->dbInf.driverVer;
74de91cc 2809 s += wxT("\n");
69a2b59d
GT
2810
2811 s += langDBINF_SERVER_NAME;
2812 s += pDb->dbInf.serverName;
74de91cc 2813 s += wxT("\n");
69a2b59d
GT
2814
2815 s += langDBINF_FILENAME;
2816 s += pDb->dbInf.databaseName;
74de91cc 2817 s += wxT("\n");
69a2b59d
GT
2818
2819 s += langDBINF_OUTER_JOINS;
2820 s += pDb->dbInf.outerJoins;
74de91cc 2821 s += wxT("\n");
69a2b59d
GT
2822
2823 s += langDBINF_STORED_PROC;
2824 s += pDb->dbInf.procedureSupport;
74de91cc 2825 s += wxT("\n");
69a2b59d
GT
2826
2827 if (pDb->dbInf.maxConnections)
74de91cc 2828 t.sprintf(wxT("%s%d\n"), langDBINF_MAX_HDBC, pDb->dbInf.maxConnections);
69a2b59d 2829 else
74de91cc 2830 t.sprintf(wxT("%s%s\n"), langDBINF_MAX_HDBC, langDBINF_UNLIMITED);
69a2b59d
GT
2831 s += t;
2832
2833 if (pDb->dbInf.maxStmts)
74de91cc 2834 t.sprintf(wxT("%s%d\n"), langDBINF_MAX_HSTMT, pDb->dbInf.maxStmts);
69a2b59d 2835 else
74de91cc 2836 t.sprintf(wxT("%s%s\n"), langDBINF_MAX_HSTMT, langDBINF_UNLIMITED);
69a2b59d
GT
2837 s += t;
2838
2839 s += langDBINF_API_LVL;
2840 switch(pDb->dbInf.apiConfLvl)
2841 {
2842 case SQL_OAC_NONE: s += langDBINF_NONE; break;
2843 case SQL_OAC_LEVEL1: s += langDBINF_LEVEL1; break;
2844 case SQL_OAC_LEVEL2: s += langDBINF_LEVEL2; break;
2845 }
74de91cc 2846 s += wxT("\n");
69a2b59d
GT
2847
2848 s += langDBINF_CLI_LVL;
2849 switch(pDb->dbInf.cliConfLvl)
2850 {
2851 case SQL_OSCC_NOT_COMPLIANT: s += langDBINF_NOT_COMPLIANT; break;
2852 case SQL_OSCC_COMPLIANT: s += langDBINF_COMPLIANT; break;
2853 }
74de91cc 2854 s += wxT("\n");
69a2b59d
GT
2855
2856 s += langDBINF_SQL_LVL;
2857 switch(pDb->dbInf.sqlConfLvl)
2858 {
2859 case SQL_OSC_MINIMUM: s += langDBINF_MIN_GRAMMAR; break;
2860 case SQL_OSC_CORE: s += langDBINF_CORE_GRAMMAR; break;
2861 case SQL_OSC_EXTENDED: s += langDBINF_EXT_GRAMMAR; break;
2862 }
74de91cc 2863 s += wxT("\n");
69a2b59d
GT
2864
2865 s += langDBINF_COMMIT_BEHAVIOR;
2866 switch(pDb->dbInf.cursorCommitBehavior)
2867 {
2868 case SQL_CB_DELETE: s += langDBINF_DELETE_CURSORS; break;
2869 case SQL_CB_CLOSE: s += langDBINF_CLOSE_CURSORS; break;
2870 case SQL_CB_PRESERVE: s += langDBINF_PRESERVE_CURSORS; break;
2871 }
74de91cc 2872 s += wxT("\n");
69a2b59d
GT
2873
2874 s += langDBINF_ROLLBACK_BEHAVIOR;
2875 switch(pDb->dbInf.cursorRollbackBehavior)
2876 {
2877 case SQL_CB_DELETE: s += langDBINF_DELETE_CURSORS; break;
2878 case SQL_CB_CLOSE: s += langDBINF_CLOSE_CURSORS; break;
2879 case SQL_CB_PRESERVE: s += langDBINF_PRESERVE_CURSORS; break;
2880 }
74de91cc 2881 s += wxT("\n");
69a2b59d
GT
2882
2883 s += langDBINF_SUPP_NOT_NULL;
2884 switch(pDb->dbInf.supportNotNullClause)
2885 {
2886 case SQL_NNC_NULL: s += langNO; break;
2887 case SQL_NNC_NON_NULL: s += langYES; break;
2888 }
74de91cc 2889 s += wxT("\n");
69a2b59d
GT
2890
2891 s += langDBINF_SUPP_IEF;
2892 s += pDb->dbInf.supportIEF;
74de91cc 2893 s += wxT("\n");
69a2b59d
GT
2894
2895 // DEFAULT setting for "Transaction Isolation Level"
2896 s += langDBINF_TXN_ISOLATION;
2897 switch(pDb->dbInf.txnIsolation)
2898 {
2899 case SQL_TXN_READ_UNCOMMITTED: s += langDBINF_READ_UNCOMMITTED; break;
2900 case SQL_TXN_READ_COMMITTED: s += langDBINF_READ_COMMITTED; break;
2901 case SQL_TXN_REPEATABLE_READ: s += langDBINF_REPEATABLE_READ; break;
2902 case SQL_TXN_SERIALIZABLE: s += langDBINF_SERIALIZABLE; break;
3f030b48 2903#ifdef ODBC_V20
69a2b59d
GT
2904 case SQL_TXN_VERSIONING: s += langDBINF_VERSIONING; break;
2905#endif
2906 }
74de91cc 2907 s += wxT("\n");
69a2b59d
GT
2908
2909 // CURRENT setting for "Transaction Isolation Level"
2910 long txnIsoLvl;
2911 s += langDBINF_TXN_ISOLATION_CURR;
2912 if (SQLGetConnectOption(pDb->GetHDBC(),SQL_TXN_ISOLATION,&txnIsoLvl) == SQL_SUCCESS)
2913 {
2914 switch(txnIsoLvl)
2915 {
2916 case SQL_TXN_READ_UNCOMMITTED: s += langDBINF_READ_UNCOMMITTED; break;
2917 case SQL_TXN_READ_COMMITTED: s += langDBINF_READ_COMMITTED; break;
2918 case SQL_TXN_REPEATABLE_READ: s += langDBINF_REPEATABLE_READ; break;
2919 case SQL_TXN_SERIALIZABLE: s += langDBINF_SERIALIZABLE; break;
3f030b48 2920#ifdef ODBC_V20
69a2b59d
GT
2921 case SQL_TXN_VERSIONING: s += langDBINF_VERSIONING; break;
2922#endif
2923 }
2924 }
74de91cc 2925 s += wxT("\n");
69a2b59d 2926
abfcca57
JJ
2927#ifdef __VMS__
2928#pragma message disable incboodep
2929#endif
6d841efd 2930 comma = false;
69a2b59d
GT
2931 s += langDBINF_TXN_ISOLATION_OPTS;
2932 if (pDb->dbInf.txnIsolationOptions & SQL_TXN_READ_UNCOMMITTED)
2933 {s += langDBINF_READ_UNCOMMITTED; comma++;}
2934 if (pDb->dbInf.txnIsolationOptions & SQL_TXN_READ_COMMITTED)
74de91cc 2935 {if (comma++) s += wxT(", "); s += langDBINF_READ_COMMITTED;}
69a2b59d 2936 if (pDb->dbInf.txnIsolationOptions & SQL_TXN_REPEATABLE_READ)
74de91cc 2937 {if (comma++) s += wxT(", "); s += langDBINF_REPEATABLE_READ;}
69a2b59d 2938 if (pDb->dbInf.txnIsolationOptions & SQL_TXN_SERIALIZABLE)
74de91cc 2939 {if (comma++) s += wxT(", "); s += langDBINF_SERIALIZABLE;}
3f030b48 2940#ifdef ODBC_V20
69a2b59d 2941 if (pDb->dbInf.txnIsolationOptions & SQL_TXN_VERSIONING)
74de91cc 2942 {if (comma++) s += wxT(", "); s += langDBINF_VERSIONING;}
69a2b59d 2943#endif
74de91cc 2944 s += wxT("\n");
69a2b59d 2945
6d841efd 2946 comma = false;
69a2b59d
GT
2947 s += langDBINF_FETCH_DIRS;
2948 if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_NEXT)
2949 {s += langDBINF_NEXT; comma++;}
2950 if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_PRIOR)
74de91cc 2951 {if (comma++) s += wxT(", "); s += langDBINF_PREV;}
69a2b59d 2952 if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_FIRST)
74de91cc 2953 {if (comma++) s += wxT(", "); s += langDBINF_FIRST;}
69a2b59d 2954 if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_LAST)
74de91cc 2955 {if (comma++) s += wxT(", "); s += langDBINF_LAST;}
69a2b59d 2956 if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_ABSOLUTE)
74de91cc 2957 {if (comma++) s += wxT(", "); s += langDBINF_ABSOLUTE;}
69a2b59d 2958 if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_RELATIVE)
74de91cc 2959 {if (comma++) s += wxT(", "); s += langDBINF_RELATIVE;}
3f030b48 2960#ifdef ODBC_V20
69a2b59d 2961 if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_RESUME)
74de91cc 2962 {if (comma++) s += wxT(", "); s += langDBINF_RESUME;}
69a2b59d
GT
2963#endif
2964 if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_BOOKMARK)
74de91cc
JS
2965 {if (comma++) s += wxT(", "); s += langDBINF_BOOKMARK;}
2966 s += wxT("\n");
69a2b59d 2967
6d841efd 2968 comma = false;
69a2b59d
GT
2969 s += langDBINF_LOCK_TYPES;
2970 if (pDb->dbInf.lockTypes & SQL_LCK_NO_CHANGE)
2971 {s += langDBINF_NO_CHANGE; comma++;}
2972 if (pDb->dbInf.lockTypes & SQL_LCK_EXCLUSIVE)
74de91cc 2973 {if (comma++) s += wxT(", "); s += langDBINF_EXCLUSIVE;}
69a2b59d 2974 if (pDb->dbInf.lockTypes & SQL_LCK_UNLOCK)
74de91cc
JS
2975 {if (comma++) s += wxT(", "); s += langDBINF_UNLOCK;}
2976 s += wxT("\n");
69a2b59d 2977
6d841efd 2978 comma = false;
69a2b59d
GT
2979 s += langDBINF_POS_OPERS;
2980 if (pDb->dbInf.posOperations & SQL_POS_POSITION)
2981 {s += langDBINF_POSITION; comma++;}
2982 if (pDb->dbInf.posOperations & SQL_POS_REFRESH)
74de91cc 2983 {if (comma++) s += wxT(", "); s += langDBINF_REFRESH;}
69a2b59d 2984 if (pDb->dbInf.posOperations & SQL_POS_UPDATE)
74de91cc 2985 {if (comma++) s += wxT(", "); s += langDBINF_UPD;}
69a2b59d 2986 if (pDb->dbInf.posOperations & SQL_POS_DELETE)
74de91cc 2987 {if (comma++) s += wxT(", "); s += langDBINF_DEL;}
69a2b59d 2988 if (pDb->dbInf.posOperations & SQL_POS_ADD)
74de91cc
JS
2989 {if (comma++) s += wxT(", "); s += langDBINF_ADD;}
2990 s += wxT("\n");
69a2b59d 2991
6d841efd 2992 comma = false;
69a2b59d
GT
2993 s += langDBINF_POS_STMTS;
2994 if (pDb->dbInf.posStmts & SQL_PS_POSITIONED_DELETE)
2995 {s += langDBINF_POS_DEL; comma++;}
2996 if (pDb->dbInf.posStmts & SQL_PS_POSITIONED_UPDATE)
74de91cc 2997 {if (comma++) s += wxT(", "); s += langDBINF_POS_UPD;}
69a2b59d 2998 if (pDb->dbInf.posStmts & SQL_PS_SELECT_FOR_UPDATE)
74de91cc
JS
2999 {if (comma++) s += wxT(", "); s += langDBINF_SELECT_FOR_UPD;}
3000 s += wxT("\n");
69a2b59d 3001
6d841efd 3002 comma = false;
69a2b59d
GT
3003 s += langDBINF_SCROLL_CONCURR;
3004 if (pDb->dbInf.scrollConcurrency & SQL_SCCO_READ_ONLY)
3005 {s += langDBINF_READ_ONLY; comma++;}
3006 if (pDb->dbInf.scrollConcurrency & SQL_SCCO_LOCK)
74de91cc 3007 {if (comma++) s += wxT(", "); s += langDBINF_LOCK;}
69a2b59d 3008 if (pDb->dbInf.scrollConcurrency & SQL_SCCO_OPT_ROWVER)
74de91cc 3009 {if (comma++) s += wxT(", "); s += langDBINF_OPT_ROWVER;}
69a2b59d 3010 if (pDb->dbInf.scrollConcurrency & SQL_SCCO_OPT_VALUES)
74de91cc
JS
3011 {if (comma++) s += wxT(", "); s += langDBINF_OPT_VALUES;}
3012 s += wxT("\n");
69a2b59d 3013
6d841efd 3014 comma = false;
69a2b59d
GT
3015 s += langDBINF_SCROLL_OPTS;
3016 if (pDb->dbInf.scrollOptions & SQL_SO_FORWARD_ONLY)
3017 {s += langDBINF_FWD_ONLY; comma++;}
3018 if (pDb->dbInf.scrollOptions & SQL_SO_STATIC)
74de91cc 3019 {if (comma++) s += wxT(", "); s += langDBINF_STATIC;}
69a2b59d 3020 if (pDb->dbInf.scrollOptions & SQL_SO_KEYSET_DRIVEN)
74de91cc 3021 {if (comma++) s += wxT(", "); s += langDBINF_KEYSET_DRIVEN;}
69a2b59d 3022 if (pDb->dbInf.scrollOptions & SQL_SO_DYNAMIC)
74de91cc 3023 {if (comma++) s += wxT(", "); s += langDBINF_DYNAMIC;}
69a2b59d 3024 if (pDb->dbInf.scrollOptions & SQL_SO_MIXED)
74de91cc
JS
3025 {if (comma++) s += wxT(", "); s += langDBINF_MIXED;}
3026 s += wxT("\n");
69a2b59d 3027
6d841efd 3028 comma = false;
69a2b59d
GT
3029 s += langDBINF_STATIC_SENS;
3030 if (pDb->dbInf.staticSensitivity & SQL_SS_ADDITIONS)
3031 {s += langDBINF_ADDITIONS; comma++;}
3032 if (pDb->dbInf.staticSensitivity & SQL_SS_DELETIONS)
74de91cc 3033 {if (comma++) s += wxT(", "); s += langDBINF_DELETIONS;}
69a2b59d 3034 if (pDb->dbInf.staticSensitivity & SQL_SS_UPDATES)
74de91cc
JS
3035 {if (comma++) s += wxT(", "); s += langDBINF_UPDATES;}
3036 s += wxT("\n");
abfcca57
JJ
3037#ifdef __VMS__
3038#pragma message enable incboodep
3039#endif
69a2b59d
GT
3040
3041
3042 s += langDBINF_TXN_CAPABLE;
3043 switch(pDb->dbInf.txnCapable)
3044 {
3045 case SQL_TC_NONE: s += langNO; break;
3046 case SQL_TC_DML: s += langDBINF_DML_ONLY; break;
3047 case SQL_TC_DDL_COMMIT: s += langDBINF_DDL_COMMIT; break;
3048 case SQL_TC_DDL_IGNORE: s += langDBINF_DDL_IGNORE; break;
3049 case SQL_TC_ALL: s += langDBINF_DDL_AND_DML; break;
3050 }
74de91cc 3051 s += wxT("\n");
69a2b59d 3052
74de91cc 3053 t.sprintf(wxT("%s%lu\n"), langDBINF_LOGIN_TIMEOUT, pDb->dbInf.loginTimeout);
69a2b59d
GT
3054 s += t;
3055
3056 // Oracle specific information
3057 if (pDb->Dbms() == dbmsORACLE)
3058 {
74de91cc 3059 s += wxT("\n");
69a2b59d 3060 s += langDBINF_ORACLE_BANNER;
74de91cc 3061 s += wxT("\n");
69a2b59d
GT
3062
3063 // Oracle cache hit ratio
3064 SDWORD cb;
3065 ULONG dbBlockGets;
74de91cc 3066 pDb->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'db block gets'"));
69a2b59d
GT
3067 pDb->GetNext();
3068 if (pDb->GetData(1, SQL_C_ULONG, &dbBlockGets, 0, &cb))
3069 {
74de91cc 3070 t.sprintf(wxT("%s: %lu\n"), langDBINF_DB_BLOCK_GETS, dbBlockGets);
69a2b59d
GT
3071 s += t;
3072 }
3073
3074 ULONG consistentGets;
74de91cc 3075 pDb->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'consistent gets'"));
69a2b59d
GT
3076 pDb->GetNext();
3077 if (pDb->GetData(1, SQL_C_ULONG, &consistentGets, 0, &cb))
3078 {
74de91cc 3079 t.sprintf(wxT("%s: %lu\n"), langDBINF_CONSISTENT_GETS, consistentGets);
69a2b59d
GT
3080 s += t;
3081 }
3082
3083 ULONG physReads;
74de91cc 3084 pDb->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'physical reads'"));
69a2b59d
GT
3085 pDb->GetNext();
3086 if (pDb->GetData(1, SQL_C_ULONG, &physReads, 0, &cb))
3087 {
74de91cc 3088 t.sprintf(wxT("%s: %lu\n"), langDBINF_PHYSICAL_READS, physReads);
69a2b59d
GT
3089 s += t;
3090 }
3091
3092 ULONG hitRatio = (ULONG)((1.00 - ((float)physReads / (float)(dbBlockGets + consistentGets))) * 100.00);
74de91cc 3093 t.sprintf(wxT("*** %s: %lu%%\n"), langDBINF_CACHE_HIT_RATIO, hitRatio);
69a2b59d
GT
3094 s += t;
3095
3096 // Tablespace information
74de91cc 3097 s += wxT("\n");
69a2b59d 3098 s += langDBINF_TABLESPACE_IO;
74de91cc 3099 s += wxT("\n");
69a2b59d
GT
3100 ULONG physWrites;
3101 char tablespaceName[257];
74de91cc 3102 pDb->ExecSql(wxT("SELECT NAME,PHYRDS,PHYWRTS FROM V$DATAFILE, V$FILESTAT WHERE V$DATAFILE.FILE# = V$FILESTAT.FILE#"));
69a2b59d
GT
3103 while (pDb->GetNext())
3104 {
3105 pDb->GetData(1, SQL_C_CHAR, tablespaceName, 257, &cb);
3106 pDb->GetData(2, SQL_C_ULONG, &physReads, 0, &cb);
3107 pDb->GetData(3, SQL_C_ULONG, &physWrites, 0, &cb);
74de91cc 3108 t.sprintf(wxT("%s\n\t%s: %lu\t%s: %lu\n"), tablespaceName,
69a2b59d
GT
3109 langDBINF_PHYSICAL_READS, physReads, langDBINF_PHYSICAL_WRITES, physWrites);
3110 s += t;
3111 }
3112
74de91cc 3113 s += wxT("\n");
69a2b59d 3114 }
3f030b48 3115
9b12bd99 3116 s += wxT("End of Diagnostics\n");
3f030b48
GT
3117 wxLogMessage(s);
3118
3119} // DisplayDbDiagnostics()
3120
9b12bd99 3121#if wxUSE_GRID
f21b2fd8
GT
3122
3123BEGIN_EVENT_TABLE(DbGridFrame, wxFrame)
3124 // EVT_CLOSE(DbGridFrame::OnCloseWindow)
3125END_EVENT_TABLE()
3126
3127
3128DbGridFrame::DbGridFrame(wxWindow *parent)
6d841efd 3129 : wxFrame (parent, wxID_ANY, wxT("Database Table"),
2f6c54eb 3130 wxDefaultPosition, wxSize(400, 325))
f21b2fd8 3131{
6d841efd 3132 initialized = false;
f21b2fd8
GT
3133}
3134
3135
9b12bd99 3136void DbGridFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
f21b2fd8
GT
3137{
3138 this->Destroy();
3139}
3140
3141
3142bool DbGridFrame::Initialize()
3143{
6d841efd 3144 wxGrid *grid = new wxGrid(this, wxID_ANY, wxDefaultPosition);
f21b2fd8
GT
3145
3146 grid->RegisterDataType(wxGRID_VALUE_DATETIME,
74de91cc 3147 new wxGridCellDateTimeRenderer(wxT("%d %b %Y")),
f21b2fd8
GT
3148 new wxGridCellTextEditor);
3149#ifdef CHOICEINT
3150 grid->RegisterDataType(wxGRID_VALUE_CHOICEINT,
3151 new wxGridCellEnumRenderer,
3152 new wxGridCellEnumEditor);
925e9792
WS
3153
3154 wxString NativeLangChoice( wxString::Format(wxT("%s:%s,%s,%s,%s,%s"),wxGRID_VALUE_CHOICEINT,
f21b2fd8
GT
3155 wxT("English"),
3156 wxT("French"),
3157 wxT("German"),
3158 wxT("Spanish"),
925e9792 3159 wxT("Other") ));
f21b2fd8
GT
3160#endif
3161
3162 // Columns must match the sequence specified in SetColDef() calls
3163 wxDbGridColInfo* cols =
3164 new wxDbGridColInfo( 0,wxGRID_VALUE_STRING,wxT("Name"),
3165 new wxDbGridColInfo( 1,wxGRID_VALUE_STRING,wxT("Address 1"),
3166 new wxDbGridColInfo( 2,wxGRID_VALUE_STRING,wxT("Address 2"),
3167 new wxDbGridColInfo( 3,wxGRID_VALUE_STRING,wxT("City"),
3168 new wxDbGridColInfo( 4,wxGRID_VALUE_STRING,wxT("State"),
3169 new wxDbGridColInfo( 5,wxGRID_VALUE_STRING,wxT("PostCode"),
3170 new wxDbGridColInfo( 6,wxGRID_VALUE_STRING,wxT("Country"),
3171 new wxDbGridColInfo( 7,wxGRID_VALUE_DBAUTO,wxT("Join Date"),
3172 new wxDbGridColInfo( 8,wxGRID_VALUE_BOOL, wxT("Developer"),
3173 new wxDbGridColInfo( 9,wxGRID_VALUE_NUMBER,wxT("Contributions"),
3174 new wxDbGridColInfo(10,wxGRID_VALUE_NUMBER,wxT("Lines Of Code"),
3175#ifdef CHOICEINT
3176 new wxDbGridColInfo(11,NativeLangChoice, wxT("Native Language"),NULL))))))))))));
925e9792 3177#else
f21b2fd8
GT
3178 new wxDbGridColInfo(11,wxGRID_VALUE_NUMBER,wxT("Native Language"),NULL))))))))))));
3179#endif
3180
3181 Ccontact *Contact = new Ccontact();
3182 //wxGetApp().Contact
3183
3184 if (!Contact)
3185 {
3186 wxMessageBox(wxT("Unable to instantiate an instance of Ccontact"), wxT("Error..."), wxOK | wxICON_EXCLAMATION);
6d841efd 3187 return false;
f21b2fd8
GT
3188 }
3189
3190 if (!Contact->Open())
3191 {
3192 if (Contact->GetDb()->TableExists(CONTACT_TABLE_NAME, Contact->GetDb()->GetUsername(),
3193 wxGetApp().DbConnectInf->GetDefaultDir()))
3194 {
3195 wxString tStr;
3196 tStr.Printf(wxT("Unable to open the table '%s'.\n\n"),CONTACT_TABLE_NAME);
74de91cc 3197 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8
GT
3198 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
3199 }
3200
6d841efd 3201 return false;
f21b2fd8
GT
3202 }
3203
3204 // Execute the following query using the cursor designated
3205 // for full table query
3206 Contact->SetRowMode(wxDbTable::WX_ROW_MODE_QUERY);
3207
3208 if (!Contact->Query())
3209 {
3210 wxString tStr;
3211 tStr = wxT("ODBC error during Query()\n\n");
74de91cc 3212 wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
f21b2fd8 3213 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
6d841efd 3214 return false;
f21b2fd8
GT
3215 }
3216
3217 // No data has been read in from the database yet, so
3218 // we need to initialize the data members to valid values
3219 // so Fit() can correctly size the grid
3220 Contact->Initialize();
3221
6d841efd 3222 wxDbGridTableBase* db = new wxDbGridTableBase(Contact, cols, wxUSE_QUERY, true);
f21b2fd8
GT
3223
3224 delete cols;
3225
6d841efd 3226 grid->SetTable(db,true);
f21b2fd8 3227 grid->SetMargins(0, 0);
3f030b48 3228
f21b2fd8
GT
3229 grid->Fit();
3230 wxSize size = grid->GetSize();
3231 size.x += 10;
3232 size.y += 10;
3233 SetClientSize(size);
6d841efd
WS
3234 initialized = true;
3235 return true;
f21b2fd8 3236} // DbGridFrame::Initialize()
3f030b48 3237
9b12bd99 3238#endif // #if wxUSE_GRID
3f755e2d
GT
3239
3240/*
3241 TEST CODE FOR TESTING THE wxDbCreateDataSource() FUNCTION
3242
3243 int result = 0;
6d841efd 3244 result = wxDbCreateDataSource(wxT("Microsoft Access Driver (*.mdb)"),wxT("GLT-TEST2"),wxT("GLT-Descrip"),false,wxT(""),this);
3f755e2d
GT
3245 if (!result)
3246 {
3247 // check for errors caused by ConfigDSN based functions
3248 DWORD retcode = 0;
3249 WORD cb;
3250 wxChar errMsg[500+1];
94613352 3251 errMsg[0] = wxT('\0');
3f755e2d
GT
3252
3253 SQLInstallerError(1,&retcode,errMsg,500,&cb);
3254
94613352 3255 wxMessageBox(wxT("FAILED creating data source"),wxT("FAILED"));
3f755e2d
GT
3256 }
3257 else
94613352 3258 wxMessageBox(wxT("SUCCEEDED creating data source"),wxT("SUCCESS"));
3f755e2d
GT
3259*/
3260
3261