From 1fc5dd6f8eb590992150b3998266fb50dfaab227 Mon Sep 17 00:00:00 2001 From: Julian Smart <julian@anthemion.co.uk> Date: Wed, 30 Dec 1998 17:40:53 +0000 Subject: [PATCH] Updated the Remstar ODBC files, got the db sample compiling; added Freq and SubString to wxString git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1283 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/word/odbc.doc | Bin 238080 -> 198656 bytes include/wx/db.h | 85 ++++--- include/wx/dbtable.h | 108 ++++----- include/wx/string.h | 7 + samples/db/dbtest.cpp | 485 +++++++++++++++++++--------------------- samples/db/dbtest.h | 142 +++++++++--- samples/db/listdb.cpp | 64 ++---- samples/db/listdb.h | 10 +- samples/db/makefile.nt | 68 ++---- samples/db/makefile.unx | 70 +----- src/common/db.cpp | 199 +++++++++++++++-- src/common/dbtable.cpp | 134 ++++++++--- src/common/string.cpp | 13 ++ 13 files changed, 802 insertions(+), 583 deletions(-) diff --git a/docs/word/odbc.doc b/docs/word/odbc.doc index 7f60405dd2fa03ce26d8a5f726a55f97e51e5bb0..8f6929136d94f9607632e11a91cfb823202c39d2 100644 GIT binary patch literal 198656 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�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≷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 literal 238080 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∈{r{s^qxSd#MB!IjXLV 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 diff --git a/include/wx/db.h b/include/wx/db.h index 9f47abf00b..25edff65da 100644 --- a/include/wx/db.h +++ b/include/wx/db.h @@ -5,6 +5,8 @@ // source such as opening and closing the data source. // Author: Doug Card // Modified by: +// Mods: Dec, 1998: Added support for SQL statement logging and database +// cataloging // Created: 9.96 // RCS-ID: $Id$ // Copyright: (c) 1996 Remstar International, Inc. @@ -18,6 +20,7 @@ // 3) These classes may not be distributed as part of any other class library, // DLL, text (written or electronic), other than a complete distribution of // the wxWindows GUI development toolkit. +// /////////////////////////////////////////////////////////////////////////////// /* @@ -27,12 +30,12 @@ #ifndef DB_DOT_H #define DB_DOT_H - + #ifdef __GNUG__ #pragma interface "db.h" #endif -#if defined(wx_msw) || defined(WIN32) +#if defined(__WXMSW__) || defined(WIN32) #include <windows.h> #endif @@ -45,20 +48,6 @@ enum enumDummy {enumDum1}; #define SQL_C_BOOLEAN (sizeof(int) == 2 ? SQL_C_USHORT : SQL_C_ULONG) #define SQL_C_ENUM (sizeof(enumDummy) == 2 ? SQL_C_USHORT : SQL_C_ULONG) //glt 2-21-97 -/* -#ifndef Bool -#define Bool int -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif -*/ - // Database Globals const DB_TYPE_NAME_LEN = 40; const DB_MAX_STATEMENT_LEN = 2048; @@ -224,15 +213,23 @@ public: int sqlDataType; }; +enum sqlLog +{ + sqlLogOFF, + sqlLogON +}; + class wxDB { private: // Private data - bool dbIsOpen; - char *dsn; // Data source name - char *uid; // User ID - char *authStr; // Authorization string (password) + bool dbIsOpen; + char *dsn; // Data source name + char *uid; // User ID + char *authStr; // Authorization string (password) + FILE *fpSqlLog; // Sql Log file pointer + enum sqlLog sqlLogState; // On or Off // Private member functions bool getDbInfo(void); @@ -303,28 +300,31 @@ public: // Public member functions wxDB(HENV &aHenv); - bool Open(char *Dsn, char *Uid, char *AuthStr); // Data Source Name, User ID, Password - void Close(void); - bool CommitTrans(void); - bool RollbackTrans(void); - bool DispAllErrors(HENV aHenv, HDBC aHdbc = SQL_NULL_HDBC, HSTMT aHstmt = SQL_NULL_HSTMT); - bool GetNextError(HENV aHenv, HDBC aHdbc = SQL_NULL_HDBC, HSTMT aHstmt = SQL_NULL_HSTMT); - void DispNextError(void); - bool CreateView(char *viewName, char *colList, char *pSqlStmt); - bool ExecSql(char *pSqlStmt); - bool Grant(int privileges, char *tableName, char *userList = "PUBLIC"); - int TranslateSqlState(char *SQLState); - CcolInf *GetColumns(char *tableName[]); - char *GetDatabaseName(void) {return dbInf.dbmsName;} - char *GetDataSource(void) {return dsn;} - char *GetUsername(void) {return uid;} - char *GetPassword(void) {return authStr;} - bool IsOpen(void) {return dbIsOpen;} - HENV GetHENV(void) {return henv;} - HDBC GetHDBC(void) {return hdbc;} - HSTMT GetHSTMT(void) {return hstmt;} - bool TableExists(char *tableName); // Table name can refer to a table, view, alias or synonym - void LogError(char *errMsg, char *SQLState = 0) {logError(errMsg, SQLState);} + bool Open(char *Dsn, char *Uid, char *AuthStr); // Data Source Name, User ID, Password + void Close(void); + bool CommitTrans(void); + bool RollbackTrans(void); + bool DispAllErrors(HENV aHenv, HDBC aHdbc = SQL_NULL_HDBC, HSTMT aHstmt = SQL_NULL_HSTMT); + bool GetNextError(HENV aHenv, HDBC aHdbc = SQL_NULL_HDBC, HSTMT aHstmt = SQL_NULL_HSTMT); + void DispNextError(void); + bool CreateView(char *viewName, char *colList, char *pSqlStmt); + bool ExecSql(char *pSqlStmt); + bool Grant(int privileges, char *tableName, char *userList = "PUBLIC"); + int TranslateSqlState(char *SQLState); + bool Catalog(char *userID, char *fileName = "Catalog.txt"); + CcolInf *GetColumns(char *tableName[]); + char *GetDatabaseName(void) {return dbInf.dbmsName;} + char *GetDataSource(void) {return dsn;} + char *GetUsername(void) {return uid;} + char *GetPassword(void) {return authStr;} + bool IsOpen(void) {return dbIsOpen;} + HENV GetHENV(void) {return henv;} + HDBC GetHDBC(void) {return hdbc;} + HSTMT GetHSTMT(void) {return hstmt;} + bool TableExists(char *tableName); // Table name can refer to a table, view, alias or synonym + void LogError(char *errMsg, char *SQLState = 0) {logError(errMsg, SQLState);} + bool SqlLog(enum sqlLog state, char *filename = "sqllog.txt", bool append = FALSE); + bool WriteSqlLog(char *logMsg); }; // wxDB @@ -359,4 +359,3 @@ bool GetDataSource(HENV henv, char *Dsn, SWORD DsnMax, char *DsDesc, SWORD DsDes UWORD direction = SQL_FETCH_NEXT); #endif - diff --git a/include/wx/dbtable.h b/include/wx/dbtable.h index 23e6d10f8a..0fa4fef0b9 100644 --- a/include/wx/dbtable.h +++ b/include/wx/dbtable.h @@ -46,24 +46,24 @@ const ROWID_LEN = 24; // 18 is the max, 24 is in case it gets larger class CcolDef { public: - char ColName[DB_MAX_COLUMN_NAME_LEN+1]; // Column Name glt 4/19/97 added one for the null terminator - int DbDataType; // Logical Data Type; e.g. DB_DATA_TYPE_INTEGER - int SqlCtype; // C data type; e.g. SQL_C_LONG - void *PtrDataObj; // Address of the data object - int SzDataObj; // Size, in bytes, of the data object - bool KeyField; // TRUE if this column is part of the PRIMARY KEY to the table; Date fields should NOT be KeyFields. - bool Updateable; // Specifies whether this column is updateable - bool InsertAllowed; // Specifies whether this column should be included in an INSERT statement - bool DerivedCol; // Specifies whether this column is a derived value - SDWORD CbValue; // Internal use only!!! + char ColName[DB_MAX_COLUMN_NAME_LEN+1]; // Column Name glt 4/19/97 added one for the null terminator + int DbDataType; // Logical Data Type; e.g. DB_DATA_TYPE_INTEGER + int SqlCtype; // C data type; e.g. SQL_C_LONG + void *PtrDataObj; // Address of the data object + int SzDataObj; // Size, in bytes, of the data object + bool KeyField; // TRUE if this column is part of the PRIMARY KEY to the table; Date fields should NOT be KeyFields. + bool Updateable; // Specifies whether this column is updateable + bool InsertAllowed; // Specifies whether this column should be included in an INSERT statement + bool DerivedCol; // Specifies whether this column is a derived value + SDWORD CbValue; // Internal use only!!! }; // CcolDef // This structure is used when creating secondary indexes. class CidxDef { public: - char ColName[DB_MAX_COLUMN_NAME_LEN+1]; // Column Name glt 4/19/97 added one for the null terminator - bool Ascending; + char ColName[DB_MAX_COLUMN_NAME_LEN+1]; // Column Name glt 4/19/97 added one for the null terminator + bool Ascending; }; // CidxDef class wxTable @@ -106,9 +106,10 @@ public: // Column Definitions CcolDef *colDefs; // Array of CcolDef structures - // Where and Order By clauses + // Where, Order By and From clauses char *where; // Standard SQL where clause, minus the word WHERE char *orderBy; // Standard SQL order by clause, minus the ORDER BY + char *from; // Allows for joins in a Ctable::Query(). Format: ",tbl,tbl..." // Flags bool selectForUpdate; @@ -116,50 +117,49 @@ public: // Public member functions wxTable(wxDB *pwxDB, const char *tblName, const int nCols, const char *qryTblName = 0); ~wxTable(); - bool Open(void); - bool CreateTable(void); - bool CreateIndex(char * idxName, bool unique, int noIdxCols, CidxDef *pIdxDefs); - bool CloseCursor(HSTMT cursor); - int Insert(void); - bool Update(void); - bool Update(char *pSqlStmt); - bool UpdateWhere(char *pWhereClause); - bool Delete(void); - bool DeleteWhere(char *pWhereClause); - bool DeleteMatching(void); - bool Query(bool forUpdate = FALSE, bool distinct = FALSE); - bool QueryBySqlStmt(char *pSqlStmt); - bool QueryMatching(bool forUpdate = FALSE, bool distinct = FALSE); - bool QueryOnKeyFields(bool forUpdate = FALSE, bool distinct = FALSE); - bool GetNext(void) { return(getRec(SQL_FETCH_NEXT)); } - bool operator++(int) { return(getRec(SQL_FETCH_NEXT)); } + bool Open(void); + bool CreateTable(void); + bool CreateIndex(char * idxName, bool unique, int noIdxCols, CidxDef *pIdxDefs); + bool CloseCursor(HSTMT cursor); + int Insert(void); + bool Update(void); + bool Update(char *pSqlStmt); + bool UpdateWhere(char *pWhereClause); + bool Delete(void); + bool DeleteWhere(char *pWhereClause); + bool DeleteMatching(void); + virtual bool Query(bool forUpdate = FALSE, bool distinct = FALSE); + bool QueryBySqlStmt(char *pSqlStmt); + bool QueryMatching(bool forUpdate = FALSE, bool distinct = FALSE); + bool QueryOnKeyFields(bool forUpdate = FALSE, bool distinct = FALSE); + bool GetNext(void) { return(getRec(SQL_FETCH_NEXT)); } + bool operator++(int) { return(getRec(SQL_FETCH_NEXT)); } #ifndef FWD_ONLY_CURSORS - bool GetPrev(void) { return(getRec(SQL_FETCH_PRIOR)); } - bool operator--(int) { return(getRec(SQL_FETCH_PRIOR)); } - bool GetFirst(void) { return(getRec(SQL_FETCH_FIRST)); } - bool GetLast(void) { return(getRec(SQL_FETCH_LAST)); } + bool GetPrev(void) { return(getRec(SQL_FETCH_PRIOR)); } + bool operator--(int) { return(getRec(SQL_FETCH_PRIOR)); } + bool GetFirst(void) { return(getRec(SQL_FETCH_FIRST)); } + bool GetLast(void) { return(getRec(SQL_FETCH_LAST)); } #endif - bool IsCursorClosedOnCommit(void); - bool IsColNull(int colNo); - UWORD GetRowNum(void); - void GetSelectStmt(char *pSqlStmt, int typeOfSelect, bool distinct); - void GetDeleteStmt(char *pSqlStmt, int typeOfDel, char *pWhereClause = 0); - void GetUpdateStmt(char *pSqlStmt, int typeOfUpd, char *pWhereClause = 0); - void GetWhereClause(char *pWhereClause, int typeOfWhere); - bool CanSelectForUpdate(void); - bool CanUpdByROWID(void); - void ClearMemberVars(void); - bool SetQueryTimeout(UDWORD nSeconds); - void SetColDefs (int index, char *fieldName, int dataType, void *pData, int cType, - int size, bool keyField = FALSE, bool upd = TRUE, - bool insAllow = TRUE, bool derivedCol = FALSE); - bool SetCursor(int cursorNo = DB_CURSOR0); - int GetCursor(void) { return(currCursorNo); } - ULONG Count(void); - int DB_STATUS(void) { return(pDb->DB_STATUS); } - bool Refresh(void); + bool IsCursorClosedOnCommit(void); + bool IsColNull(int colNo); + UWORD GetRowNum(void); + void GetSelectStmt(char *pSqlStmt, int typeOfSelect, bool distinct); + void GetDeleteStmt(char *pSqlStmt, int typeOfDel, char *pWhereClause = 0); + void GetUpdateStmt(char *pSqlStmt, int typeOfUpd, char *pWhereClause = 0); + void GetWhereClause(char *pWhereClause, int typeOfWhere, char *qualTableName = 0); + bool CanSelectForUpdate(void); + bool CanUpdByROWID(void); + void ClearMemberVars(void); + bool SetQueryTimeout(UDWORD nSeconds); + void SetColDefs (int index, char *fieldName, int dataType, void *pData, int cType, + int size, bool keyField = FALSE, bool upd = TRUE, + bool insAllow = TRUE, bool derivedCol = FALSE); + bool SetCursor(int cursorNo = DB_CURSOR0); + int GetCursor(void) { return(currCursorNo); } + ULONG Count(void); + int DB_STATUS(void) { return(pDb->DB_STATUS); } + bool Refresh(void); }; // wxTable #endif - diff --git a/include/wx/string.h b/include/wx/string.h index f9f731380f..9e7a4fe95b 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -433,6 +433,11 @@ public: nCount (or till the end if nCount = default value) */ wxString Mid(size_t nFirst, size_t nCount = STRING_MAXLEN) const; + /// Compatibility with wxWindows 1.xx + wxString SubString(size_t from, size_t to) const + { + return Mid(from, (to - from + 1)); + } /// get first nCount characters wxString Left(size_t nCount) const; /// get all characters before the first occurence of ch @@ -547,6 +552,8 @@ public: { *this = str + *this; return *this; } /// same as Len size_t Length() const { return Len(); } + /// Count the number of characters + int Freq(char ch) const; /// same as MakeLower void LowerCase() { MakeLower(); } /// same as MakeUpper diff --git a/samples/db/dbtest.cpp b/samples/db/dbtest.cpp index 165444a0ad..b6dc66390a 100644 --- a/samples/db/dbtest.cpp +++ b/samples/db/dbtest.cpp @@ -37,17 +37,18 @@ #include <wx/wx.h> #endif //WX_PRECOMP -IMPLEMENT_APP(DatabaseDemoApp) - #include <stdio.h> // Included strictly for reading the text file with the database parameters #include <wx/db.h> // Required in the file which will get the data source connection #include <wx/dbtable.h> // Has the wxTable object from which all data objects will inherit their data table functionality -extern DbList *PtrBegDbList; // from wx_db.cpp, used in getting back error results from db connections +extern DbList *PtrBegDbList; // from db.cpp, used in getting back error results from db connections #include "dbtest.h" // Header file for this demonstration program #include "listdb.h" // Code to support the "Lookup" button on the editor dialog + +IMPLEMENT_APP(DatabaseDemoApp) + extern char ListDB_Selection[]; // Used to return the first column value for the selected line from the listDB routines extern char ListDB_Selection2[]; // Used to return the second column value for the selected line from the listDB routines @@ -87,7 +88,7 @@ wxDB *READONLY_DB; * last call to the database engine. * * This demo uses the returned string by displaying it in a wxMessageBox. The - * formatting therefore is not the greatest, but this is just a demo, not a + * formatting therefore is not the greatest, but this is just a demo, not a * finished product. :-) gt * * NOTE: The value returned by this function is for temporary use only and @@ -106,7 +107,7 @@ char *GetExtendedDBErrorMsg(char *ErrFile, int ErrLine) msg += "\nFile: "; msg += ErrFile; msg += " Line: "; - tStr.sprintf("%d",ErrLine); + tStr.Printf("%d",ErrLine); msg += tStr.GetData(); msg += "\n"; } @@ -135,24 +136,17 @@ char *GetExtendedDBErrorMsg(char *ErrFile, int ErrLine) } msg += "\n"; - return msg.GetData(); + return (char*) (const char*) msg; } // GetExtendedDBErrorMsg - -// `Main program' equivalent, creating windows and returning main app frame -wxFrame *DatabaseDemoApp::OnInit(void) +bool DatabaseDemoApp::OnInit() { // Create the main frame window - DemoFrame = new DatabaseDemoFrame(NULL, "wxWindows Database Demo", 50, 50, 537, 480); + DemoFrame = new DatabaseDemoFrame(NULL, "wxWindows Database Demo", wxPoint(50, 50), wxSize(537, 480)); // Give it an icon -#ifdef __WXMSW__ - DemoFrame->SetIcon(wxIcon("db_icon")); -#endif -#ifdef __X__ - DemoFrame->SetIcon(wxIcon("db.xbm")); -#endif + DemoFrame->SetIcon(wxICON(db)); // Make a menubar wxMenu *file_menu = new wxMenu; @@ -182,8 +176,8 @@ wxFrame *DatabaseDemoApp::OnInit(void) if ((paramFile = fopen(paramFilename, "r")) == NULL) { wxString tStr; - tStr.sprintf("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.",paramFilename); - wxMessageBox(tStr.GetData(),"File I/O Error...",wxOK | wxICON_EXCLAMATION); + tStr.Printf("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.",paramFilename); + wxMessageBox(tStr,"File I/O Error...",wxOK | wxICON_EXCLAMATION); DemoFrame->BuildParameterDialog(NULL); if ((paramFile = fopen(paramFilename, "r")) == NULL) return FALSE; @@ -225,63 +219,67 @@ wxFrame *DatabaseDemoApp::OnInit(void) // Show the frame DemoFrame->Show(TRUE); - // Return the main frame window - return DemoFrame; + return TRUE; } // DatabaseDemoApp::OnInit() - +BEGIN_EVENT_TABLE(DatabaseDemoFrame, wxFrame) + EVT_MENU(FILE_CREATE, DatabaseDemoFrame::OnCreate) + EVT_MENU(FILE_EXIT, DatabaseDemoFrame::OnExit) + EVT_MENU(EDIT_PARAMETERS, DatabaseDemoFrame::OnEditParameters) + EVT_MENU(ABOUT_DEMO, DatabaseDemoFrame::OnAbout) + EVT_CLOSE(DatabaseDemoFrame::OnCloseWindow) +END_EVENT_TABLE() // DatabaseDemoFrame constructor -DatabaseDemoFrame::DatabaseDemoFrame(wxFrame *frame, char *title, int x, int y, int w, int h): - wxFrame(frame, title, x, y, w, h) +DatabaseDemoFrame::DatabaseDemoFrame(wxFrame *frame, const wxString& title, + const wxPoint& pos, const wxSize& size): + wxFrame(frame, -1, title, pos, size) { // Put any code in necessary for initializing the main frame here } +void DatabaseDemoFrame::OnCreate(wxCommandEvent& event) +{ + CreateDataTable(); +} -// Intercept menu commands -void DatabaseDemoFrame::OnMenuCommand(int id) +void DatabaseDemoFrame::OnExit(wxCommandEvent& event) { - switch (id) - { - case FILE_CREATE: - CreateDataTable(); - break; - case FILE_EXIT: - Close(); - break; - case EDIT_PARAMETERS: - if ((pEditorDlg->mode != mCreate) && (pEditorDlg->mode != mEdit)) - BuildParameterDialog(this); - else - wxMessageBox("Cannot change database parameters while creating or editing a record","Notice...",wxOK | wxICON_INFORMATION); - break; - case ABOUT_DEMO: - wxMessageBox("wxWindows sample program for database classes\n\nContributed on 27 July 1998","About...",wxOK | wxICON_INFORMATION); - break; - } -} // DatabaseDemoFrame::OnMenuCommand() + this->Destroy(); +} +void DatabaseDemoFrame::OnEditParameters(wxCommandEvent& event) +{ + if ((pEditorDlg->mode != mCreate) && (pEditorDlg->mode != mEdit)) + BuildParameterDialog(this); + else + wxMessageBox("Cannot change database parameters while creating or editing a record","Notice...",wxOK | wxICON_INFORMATION); +} + +void DatabaseDemoFrame::OnAbout(wxCommandEvent& event) +{ + wxMessageBox("wxWindows sample program for database classes\n\nContributed on 27 July 1998","About...",wxOK | wxICON_INFORMATION); +} -Bool DatabaseDemoFrame::OnClose(void) +void DatabaseDemoFrame::OnCloseWindow(wxCloseEvent& event) { // Put any additional checking necessary to make certain it is alright // to close the program here that is not done elsewhere - return TRUE; + this->Destroy(); } // DatabaseDemoFrame::OnClose() void DatabaseDemoFrame::CreateDataTable() { - Bool Ok = (wxMessageBox("Any data currently residing in the table will be erased.\n\nAre you sure?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); + bool Ok = (wxMessageBox("Any data currently residing in the table will be erased.\n\nAre you sure?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); if (!Ok) return; wxBeginBusyCursor(); - Bool success = TRUE; + bool success = TRUE; Ccontact *Contact = new Ccontact(); if (!Contact) @@ -297,7 +295,7 @@ void DatabaseDemoFrame::CreateDataTable() wxString tStr; tStr = "Error creating CONTACTS table.\nTable was not created.\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); success = FALSE; } else @@ -308,7 +306,7 @@ void DatabaseDemoFrame::CreateDataTable() wxString tStr; tStr = "Error creating CONTACTS indexes.\nIndexes will be unavailable.\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); success = FALSE; } } @@ -394,7 +392,7 @@ Ccontact::~Ccontact() wxString tStr; tStr = "Unable to Free the Ccontact data table handle\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); } } } // Ccontract destructor @@ -416,20 +414,20 @@ void Ccontact::SetupColumns() SetColDefs ( 6,"COUNTRY", DB_DATA_TYPE_VARCHAR, Country, SQL_C_CHAR, sizeof(Country), FALSE,TRUE); SetColDefs ( 7,"JOIN_DATE", DB_DATA_TYPE_DATE, &JoinDate, SQL_C_TIMESTAMP, sizeof(JoinDate), FALSE,TRUE); SetColDefs ( 8,"NATIVE_LANGUAGE", DB_DATA_TYPE_INTEGER, &NativeLanguage, SQL_C_ENUM, sizeof(NativeLanguage), FALSE,TRUE); - SetColDefs ( 9,"IS_DEVELOPER", DB_DATA_TYPE_INTEGER, &IsDeveloper, SQL_C_BOOLEAN, sizeof(Bool), FALSE,TRUE); + SetColDefs ( 9,"IS_DEVELOPER", DB_DATA_TYPE_INTEGER, &IsDeveloper, SQL_C_BOOLEAN, sizeof(bool), FALSE,TRUE); SetColDefs (10,"CONTRIBUTIONS", DB_DATA_TYPE_INTEGER, &Contributions, SQL_C_USHORT, sizeof(Contributions), FALSE,TRUE); SetColDefs (11,"LINES_OF_CODE", DB_DATA_TYPE_INTEGER, &LinesOfCode, SQL_C_ULONG, sizeof(LinesOfCode), FALSE,TRUE); } // Ccontact::SetupColumns -Bool Ccontact::CreateIndexes(void) +bool Ccontact::CreateIndexes(void) { // This index could easily be accomplished with an "orderBy" clause, // but is done to show how to construct a non-primary index. wxString indexName; CidxDef idxDef[2]; - Bool Ok = TRUE; + bool Ok = TRUE; strcpy(idxDef[0].ColName, "IS_DEVELOPER"); idxDef[0].Ascending = TRUE; @@ -439,7 +437,7 @@ Bool Ccontact::CreateIndexes(void) indexName = CONTACT_TABLE_NAME; indexName += "_IDX1"; - Ok = CreateIndex(indexName.GetData(), TRUE, 2, idxDef); + Ok = CreateIndex((char*) (const char*) indexName, TRUE, 2, idxDef); return Ok; } // Ccontact::CreateIndexes() @@ -450,10 +448,10 @@ Bool Ccontact::CreateIndexes(void) * very efficient and tighter coding so that it is available where ever the object * is. Great for use with multiple tables when not using views or outer joins */ -Bool Ccontact::FetchByName(char *name) +bool Ccontact::FetchByName(char *name) { - whereStr.sprintf("NAME = '%s'",name); - where = this->whereStr.GetData(); + whereStr.Printf("NAME = '%s'",name); + where = (char*) (const char*) this->whereStr; orderBy = 0; if (!Query()) @@ -503,11 +501,11 @@ CeditorDlg::CeditorDlg(wxWindow *parent) : wxPanel (parent, 1, 1, 460, 455) while (!Contact->pDb->TableExists((char *)CONTACT_TABLE_NAME)) { wxString tStr; - tStr.sprintf("Unable to open the table '%s'.\n\nTable may need to be created...?\n\n",CONTACT_TABLE_NAME); + tStr.Printf("Unable to open the table '%s'.\n\nTable may need to be created...?\n\n",CONTACT_TABLE_NAME); tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); - Bool createTable = (wxMessageBox("Do you wish to try to create/clear the CONTACTS table?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); + bool createTable = (wxMessageBox("Do you wish to try to create/clear the CONTACTS table?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); if (!createTable) { @@ -529,9 +527,9 @@ CeditorDlg::CeditorDlg(wxWindow *parent) : wxPanel (parent, 1, 1, 460, 455) if (Contact->pDb->TableExists((char *)CONTACT_TABLE_NAME)) { wxString tStr; - tStr.sprintf("Unable to open the table '%s'.\n\n",CONTACT_TABLE_NAME); + tStr.Printf("Unable to open the table '%s'.\n\n",CONTACT_TABLE_NAME); tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); delete Contact; Close(); DemoFrame->Close(); @@ -540,74 +538,66 @@ CeditorDlg::CeditorDlg(wxWindow *parent) : wxPanel (parent, 1, 1, 460, 455) } // Build the dialog - SetLabelPosition(wxHORIZONTAL); - - wxFont *ButtonFont = new wxFont(12,wxSWISS,wxNORMAL,wxBOLD); - wxFont *TextFont = new wxFont(12,wxSWISS,wxNORMAL,wxNORMAL); - SetButtonFont(ButtonFont); - SetLabelFont(TextFont); - SetLabelPosition(wxVERTICAL); + wxStaticBox *FunctionGrp = new wxStaticBox(this, EDITOR_DIALOG_FN_GROUP, "", wxPoint(15, 1), wxSize(497, 69), 0, "FunctionGrp"); + wxStaticBox *SearchGrp = new wxStaticBox(this, EDITOR_DIALOG_SEARCH_GROUP, "", wxPoint(417, 1), wxSize(95, 242), 0, "SearchGrp"); - wxGroupBox *FunctionGrp = new wxGroupBox(this, "", 15, 1, 497, 69, 0, "FunctionGrp"); - wxGroupBox *SearchGrp = new wxGroupBox(this, "", 417, 1, 95, 242, 0, "SearchGrp"); + pCreateBtn = new wxButton(this, EDITOR_DIALOG_CREATE, "&Create", wxPoint(25, 21), wxSize(70, 35), 0, wxDefaultValidator, "CreateBtn"); + pEditBtn = new wxButton(this, EDITOR_DIALOG_EDIT, "&Edit", wxPoint(102, 21), wxSize(70, 35), 0, wxDefaultValidator, "EditBtn"); + pDeleteBtn = new wxButton(this, EDITOR_DIALOG_DELETE, "&Delete", wxPoint(179, 21), wxSize(70, 35), 0, wxDefaultValidator, "DeleteBtn"); + pCopyBtn = new wxButton(this, EDITOR_DIALOG_COPY, "Cop&y", wxPoint(256, 21), wxSize(70, 35), 0, wxDefaultValidator, "CopyBtn"); + pSaveBtn = new wxButton(this, EDITOR_DIALOG_SAVE, "&Save", wxPoint(333, 21), wxSize(70, 35), 0, wxDefaultValidator, "SaveBtn"); + pCancelBtn = new wxButton(this, EDITOR_DIALOG_CANCEL, "C&ancel", wxPoint(430, 21), wxSize(70, 35), 0, wxDefaultValidator, "CancelBtn"); - pCreateBtn = new wxButton(this, NULL, "&Create", 25, 21, 70, 35, 0, "CreateBtn"); - pEditBtn = new wxButton(this, NULL, "&Edit", 102, 21, 70, 35, 0, "EditBtn"); - pDeleteBtn = new wxButton(this, NULL, "&Delete", 179, 21, 70, 35, 0, "DeleteBtn"); - pCopyBtn = new wxButton(this, NULL, "Cop&y", 256, 21, 70, 35, 0, "CopyBtn"); - pSaveBtn = new wxButton(this, NULL, "&Save", 333, 21, 70, 35, 0, "SaveBtn"); - pCancelBtn = new wxButton(this, NULL, "C&ancel", 430, 21, 70, 35, 0, "CancelBtn"); + pPrevBtn = new wxButton(this, EDITOR_DIALOG_PREV, "<< &Prev", wxPoint(430, 81), wxSize(70, 35), 0, wxDefaultValidator, "PrevBtn"); + pNextBtn = new wxButton(this, EDITOR_DIALOG_NEXT, "&Next >>", wxPoint(430, 121), wxSize(70, 35), 0, wxDefaultValidator, "NextBtn"); + pQueryBtn = new wxButton(this, EDITOR_DIALOG_QUERY, "&Query", wxPoint(430, 161), wxSize(70, 35), 0, wxDefaultValidator, "QueryBtn"); + pResetBtn = new wxButton(this, EDITOR_DIALOG_RESET, "&Reset", wxPoint(430, 200), wxSize(70, 35), 0, wxDefaultValidator, "ResetBtn"); - pPrevBtn = new wxButton(this, NULL, "<< &Prev",430, 81, 70, 35, 0, "PrevBtn"); - pNextBtn = new wxButton(this, NULL, "&Next >>",430, 121, 70, 35, 0, "NextBtn"); - pQueryBtn = new wxButton(this, NULL, "&Query", 430, 161, 70, 35, 0, "QueryBtn"); - pResetBtn = new wxButton(this, NULL, "&Reset", 430, 200, 70, 35, 0, "ResetBtn"); + pNameMsg = new wxStaticText(this, EDITOR_DIALOG_NAME_MSG, "Name:", wxPoint(17, 80), wxSize(-1, -1), 0, "NameMsg"); + pNameTxt = new wxTextCtrl(this, EDITOR_DIALOG_NAME_TEXT, "", wxPoint(17, 97), wxSize(308, 25), 0, wxDefaultValidator, "NameTxt"); + pNameListBtn = new wxButton(this, EDITOR_DIALOG_LOOKUP, "&Lookup", wxPoint(333, 99), wxSize(70, 24), 0, wxDefaultValidator, "LookupBtn"); - pNameMsg = new wxMessage(this, "Name:", 17, 80, -1, -1, 0, "NameMsg"); - pNameTxt = new wxText(this, NULL, "", "", 17, 97, 308, 25, 0, "NameTxt"); - pNameListBtn = new wxButton(this, NULL, "&Lookup", 333, 99, 70, 24, 0, "LookupBtn"); + pAddress1Msg = new wxStaticText(this, EDITOR_DIALOG_ADDRESS1_MSG, "Address:", wxPoint(17, 130), wxSize(-1, -1), 0, "Address1Msg"); + pAddress1Txt = new wxTextCtrl(this, EDITOR_DIALOG_ADDRESS2_TEXT, "", wxPoint(17, 147), wxSize(308, 25), 0, wxDefaultValidator, "Address1Txt"); - pAddress1Msg = new wxMessage(this, "Address:", 17, 130, -1, -1, 0, "Address1Msg"); - pAddress1Txt = new wxText(this, NULL, "", "", 17, 147, 308, 25, 0, "Address1Txt"); + pAddress2Msg = new wxStaticText(this, EDITOR_DIALOG_ADDRESS2_MSG, "Address:", wxPoint(17, 180), wxSize(-1, -1), 0, "Address2Msg"); + pAddress2Txt = new wxTextCtrl(this, EDITOR_DIALOG_ADDRESS2_TEXT, "", wxPoint(17, 197), wxSize(308, 25), 0, wxDefaultValidator, "Address2Txt"); - pAddress2Msg = new wxMessage(this, "Address:", 17, 180, -1, -1, 0, "Address2Msg"); - pAddress2Txt = new wxText(this, NULL, "", "", 17, 197, 308, 25, 0, "Address2Txt"); + pCityMsg = new wxStaticText(this, EDITOR_DIALOG_CITY_MSG, "City:", wxPoint(17, 230), wxSize(-1, -1), 0, "CityMsg"); + pCityTxt = new wxTextCtrl(this, EDITOR_DIALOG_CITY_TEXT, "", wxPoint(17, 247), wxSize(225, 25), 0, wxDefaultValidator, "CityTxt"); - pCityMsg = new wxMessage(this, "City:", 17, 230, -1, -1, 0, "CityMsg"); - pCityTxt = new wxText(this, NULL, "", "", 17, 247, 225, 25, 0, "CityTxt"); + pStateMsg = new wxStaticText(this, EDITOR_DIALOG_STATE_MSG, "State:", wxPoint(250, 230), wxSize(-1, -1), 0, "StateMsg"); + pStateTxt = new wxTextCtrl(this, EDITOR_DIALOG_STATE_TEXT, "", wxPoint(250, 247), wxSize(153, 25), 0, wxDefaultValidator, "StateTxt"); - pStateMsg = new wxMessage(this, "State:", 250, 230, -1, -1, 0, "StateMsg"); - pStateTxt = new wxText(this, NULL, "", "", 250, 247, 153, 25, 0, "StateTxt"); + pCountryMsg = new wxStaticText(this, EDITOR_DIALOG_COUNTRY_MSG, "Country:", wxPoint(17, 280), wxSize(-1, -1), 0, "CountryMsg"); + pCountryTxt = new wxTextCtrl(this, EDITOR_DIALOG_COUNTRY_TEXT, "", wxPoint(17, 297), wxSize(225, 25), 0, wxDefaultValidator, "CountryTxt"); - pCountryMsg = new wxMessage(this, "Country:", 17, 280, -1, -1, 0, "CountryMsg"); - pCountryTxt = new wxText(this, NULL, "", "", 17, 297, 225, 25, 0, "CountryTxt"); + pPostalCodeMsg = new wxStaticText(this, EDITOR_DIALOG_POSTAL_MSG, "Postal Code:", wxPoint(250, 280), wxSize(-1, -1), 0, "PostalCodeMsg"); + pPostalCodeTxt = new wxTextCtrl(this, EDITOR_DIALOG_POSTAL_TEXT, "", wxPoint(250, 297), wxSize(153, 25), 0, wxDefaultValidator, "PostalCodeTxt"); - pPostalCodeMsg = new wxMessage(this, "Postal Code:", 250, 280, -1, -1, 0, "PostalCodeMsg"); - pPostalCodeTxt = new wxText(this, NULL, "", "", 250, 297, 153, 25, 0, "PostalCodeTxt"); - - char *choice_strings[5]; + wxString choice_strings[5]; choice_strings[0] = "English"; choice_strings[1] = "French"; choice_strings[2] = "German"; choice_strings[3] = "Spanish"; choice_strings[4] = "Other"; - pNativeLangChoice = new wxChoice(this, NULL, "",17, 346, 277, -1, 5, choice_strings); - pNativeLangMsg = new wxMessage(this, "Native language:", 17, 330, -1, -1, 0, "NativeLangMsg"); + pNativeLangChoice = new wxChoice(this, EDITOR_DIALOG_LANG_CHOICE, wxPoint(17, 346), wxSize(277, -1), 5, choice_strings); + pNativeLangMsg = new wxStaticText(this, EDITOR_DIALOG_LANG_MSG, "Native language:", wxPoint(17, 330), wxSize(-1, -1), 0, "NativeLangMsg"); - char *radio_strings[2]; + wxString radio_strings[2]; radio_strings[0] = "No"; radio_strings[1] = "Yes"; - pDeveloperRadio = new wxRadioBox(this,NULL,"Developer:",303,330,-1,-1,2,radio_strings,2,wxHORIZONTAL|wxFLAT); + pDeveloperRadio = new wxRadioBox(this,EDITOR_DIALOG_DEVELOPER,"Developer:",wxPoint(303,330),wxSize(-1,-1),2,radio_strings,2,wxHORIZONTAL); - pJoinDateMsg = new wxMessage(this, "Date joined:", 17, 380, -1, -1, 0, "JoinDateMsg"); - pJoinDateTxt = new wxText(this, NULL, "", "", 17, 397, 150, 25, 0, "JoinDateTxt"); + pJoinDateMsg = new wxStaticText(this, EDITOR_DIALOG_JOIN_MSG, "Date joined:", wxPoint(17, 380), wxSize(-1, -1), 0, "JoinDateMsg"); + pJoinDateTxt = new wxTextCtrl(this, EDITOR_DIALOG_JOIN_TEXT, "", wxPoint(17, 397), wxSize(150, 25), 0, wxDefaultValidator, "JoinDateTxt"); - pContribMsg = new wxMessage(this, "Contributions:", 175, 380, -1, -1, 0, "ContribMsg"); - pContribTxt = new wxText(this, NULL, "", "", 175, 397, 120, 25, 0, "ContribTxt"); + pContribMsg = new wxStaticText(this, EDITOR_DIALOG_CONTRIB_MSG, "Contributions:", wxPoint(175, 380), wxSize(-1, -1), 0, "ContribMsg"); + pContribTxt = new wxTextCtrl(this, EDITOR_DIALOG_CONTRIB_TEXT, "", wxPoint(175, 397), wxSize(120, 25), 0, wxDefaultValidator, "ContribTxt"); - pLinesMsg = new wxMessage(this, "Lines of code:", 303, 380, -1, -1, 0, "LinesMsg"); - pLinesTxt = new wxText(this, NULL, "", "", 303, 397, 100, 25, 0, "LinesTxt"); + pLinesMsg = new wxStaticText(this, EDITOR_DIALOG_LINES_MSG, "Lines of code:", wxPoint(303, 380), wxSize(-1, -1), 0, "LinesMsg"); + pLinesTxt = new wxTextCtrl(this, EDITOR_DIALOG_LINES_TEXT, "", wxPoint(303, 397), wxSize(100, 25), 0, wxDefaultValidator, "LinesTxt"); // Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to // handle all widget processing @@ -626,10 +616,10 @@ CeditorDlg::CeditorDlg(wxWindow *parent) : wxPanel (parent, 1, 1, 460, 455) // // The constructed where clause below has a sub-query within it "SELECT MIN(NAME) FROM %s" // to achieve a single row (in this case the first name in alphabetical order). - Contact->whereStr.sprintf("NAME = (SELECT MIN(NAME) FROM %s)",Contact->tableName); - - // NOTE: GetData() returns a pointer which may not be valid later, so this is short term use only - Contact->where = Contact->whereStr.GetData(); + Contact->whereStr.Printf("NAME = (SELECT MIN(NAME) FROM %s)",Contact->tableName); + + // NOTE: (const char*) returns a pointer which may not be valid later, so this is short term use only + Contact->where = (char*) (const char*) Contact->whereStr; // Perform the Query to get the result set. // NOTE: If there are no rows returned, that is a valid result, so Query() would return TRUE. @@ -639,7 +629,7 @@ CeditorDlg::CeditorDlg(wxWindow *parent) : wxPanel (parent, 1, 1, 460, 455) wxString tStr; tStr = "ODBC error during Query()\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); GetParent()->Close(); return; } @@ -658,7 +648,7 @@ CeditorDlg::CeditorDlg(wxWindow *parent) : wxPanel (parent, 1, 1, 460, 455) } // CeditorDlg constructor -Bool CeditorDlg::OnClose() +bool CeditorDlg::OnClose() { // Clean up time if ((mode != mCreate) && (mode != mEdit)) @@ -712,7 +702,7 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) if (widgetName == pDeleteBtn->GetName()) { - Bool Ok = (wxMessageBox("Are you sure?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); + bool Ok = (wxMessageBox("Are you sure?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); if (!Ok) return; @@ -757,12 +747,12 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) if (widgetName == pCancelBtn->GetName()) { - Bool Ok = (wxMessageBox("Are you sure?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); + bool Ok = (wxMessageBox("Are you sure?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); if (!Ok) return; - if (!strcmp(saveName.GetData(),"")) + if (!strcmp((const char*) saveName,"")) { Contact->Initialize(); PutData(); @@ -772,7 +762,7 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) else { // Requery previous record - if (Contact->FetchByName(saveName.GetData())) + if (Contact->FetchByName((char*) (const char*) saveName)) { PutData(); SetMode(mView); @@ -785,13 +775,13 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) Contact->whereStr += Contact->tableName; Contact->whereStr += ")"; - Contact->where = Contact->whereStr.GetData(); + Contact->where = (char*) (const char*) Contact->whereStr; if (!Contact->Query()) { wxString tStr; tStr = "ODBC error during Query()\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); SetMode(mView); return; } @@ -826,13 +816,13 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) { // Display the query dialog box char qryWhere[DB_MAX_WHERE_CLAUSE_LEN+1]; - strcpy(qryWhere, Contact->qryWhereStr.GetData()); + strcpy(qryWhere, (const char*) Contact->qryWhereStr); char *tblName[] = {(char *)CONTACT_TABLE_NAME, 0}; new CqueryDlg(GetParent(), Contact->pDb, tblName, qryWhere); // Query the first record in the new record set and // display it, if the query string has changed. - if (strcmp(qryWhere, Contact->qryWhereStr.GetData())) + if (strcmp(qryWhere, (const char*) Contact->qryWhereStr)) { Contact->orderBy = "NAME"; Contact->whereStr = "NAME = (SELECT MIN(NAME) FROM "; @@ -847,13 +837,13 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) // Close the expression with a right paren Contact->whereStr += ")"; // Requery the table - Contact->where = Contact->whereStr.GetData(); + Contact->where = (char*) (const char*) Contact->whereStr; if (!Contact->Query()) { wxString tStr; tStr = "ODBC error during Query()\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); return; } // Display the first record from the query set @@ -863,7 +853,7 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) } // Enable/Disable the reset button - pResetBtn->Enable(!Contact->qryWhereStr.Empty()); + pResetBtn->Enable(!Contact->qryWhereStr.IsEmpty()); return; } // Query button @@ -879,13 +869,13 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) Contact->whereStr = "NAME = (SELECT MIN(NAME) FROM "; Contact->whereStr += CONTACT_TABLE_NAME; Contact->whereStr += ")"; - Contact->where = Contact->whereStr.GetData(); + Contact->where = (char*) (const char*) Contact->whereStr; if (!Contact->Query()) { wxString tStr; tStr = "ODBC error during Query()\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); return; } if (!Contact->GetNext()) @@ -906,14 +896,14 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) /* char *dispCol2 */ "JOIN_DATE", /* char *where */ "", /* char *orderBy */ "NAME", - /* Bool distinctValues */ TRUE); + /* bool distinctValues */ TRUE); if (ListDB_Selection && strlen(ListDB_Selection)) { wxString w = "NAME = '"; w += ListDB_Selection; w += "'"; - GetRec(w.GetData()); + GetRec((char*) (const char*) w); } return; @@ -943,7 +933,7 @@ void CeditorDlg::FieldsEditable() void CeditorDlg::SetMode(enum DialogModes m) { - Bool edit = FALSE; + bool edit = FALSE; mode = m; switch (mode) @@ -971,7 +961,7 @@ void CeditorDlg::SetMode(enum DialogModes m) pPrevBtn->Enable( !edit ); pNextBtn->Enable( !edit ); pQueryBtn->Enable( !edit ); - pResetBtn->Enable( !edit && !Contact->qryWhereStr.Empty() ); + pResetBtn->Enable( !edit && !Contact->qryWhereStr.IsEmpty() ); pNameListBtn->Enable( !edit ); } @@ -979,7 +969,7 @@ void CeditorDlg::SetMode(enum DialogModes m) } // CeditorDlg::SetMode() -Bool CeditorDlg::PutData() +bool CeditorDlg::PutData() { wxString tStr; @@ -991,14 +981,14 @@ Bool CeditorDlg::PutData() pCountryTxt->SetValue(Contact->Country); pPostalCodeTxt->SetValue(Contact->PostalCode); - tStr.sprintf("%d/%d/%d",Contact->JoinDate.month,Contact->JoinDate.day,Contact->JoinDate.year); - pJoinDateTxt->SetValue(tStr.GetData()); + tStr.Printf("%d/%d/%d",Contact->JoinDate.month,Contact->JoinDate.day,Contact->JoinDate.year); + pJoinDateTxt->SetValue(tStr); - tStr.sprintf("%d",Contact->Contributions); - pContribTxt->SetValue(tStr.GetData()); + tStr.Printf("%d",Contact->Contributions); + pContribTxt->SetValue(tStr); - tStr.sprintf("%lu",Contact->LinesOfCode); - pLinesTxt->SetValue(tStr.GetData()); + tStr.Printf("%lu",Contact->LinesOfCode); + pLinesTxt->SetValue(tStr); pNativeLangChoice->SetSelection(Contact->NativeLanguage); @@ -1016,19 +1006,19 @@ Bool CeditorDlg::PutData() * invalid data was found (and a message was displayed telling the user what to fix), and * the data was not placed into the appropraite fields of Ccontact */ -Bool CeditorDlg::GetData() +bool CeditorDlg::GetData() { // Validate that the data currently entered into the widgets is valid data wxString tStr; tStr = pNameTxt->GetValue(); - if (!strcmp(tStr.GetData(),"")) + if (!strcmp((const char*) tStr,"")) { wxMessageBox("A name is required for entry into the contact table","Notice...",wxOK | wxICON_INFORMATION); return FALSE; } - Bool invalid = FALSE; + bool invalid = FALSE; int mm,dd,yyyy; int first, second; @@ -1094,7 +1084,7 @@ Bool CeditorDlg::GetData() } tStr = pNameTxt->GetValue(); - strcpy(Contact->Name,tStr.GetData()); + strcpy(Contact->Name,(const char*) tStr); strcpy(Contact->Addr1,pAddress1Txt->GetValue()); strcpy(Contact->Addr2,pAddress2Txt->GetValue()); strcpy(Contact->City,pCityTxt->GetValue()); @@ -1106,7 +1096,7 @@ Bool CeditorDlg::GetData() Contact->LinesOfCode = atol(pLinesTxt->GetValue()); Contact->NativeLanguage = (enum Language) pNativeLangChoice->GetSelection(); - Contact->IsDeveloper = pDeveloperRadio->GetSelection(); + Contact->IsDeveloper = (bool) pDeveloperRadio->GetSelection(); return TRUE; } // CeditorDlg::GetData() @@ -1121,9 +1111,9 @@ Bool CeditorDlg::GetData() * value of FALSE means that Save() failed. If returning FALSE, then this function * has displayed a detailed error message for the user. */ -Bool CeditorDlg::Save() +bool CeditorDlg::Save() { - Bool failed = FALSE; + bool failed = FALSE; // Read the data in the widgets of the dialog to get the user's data if (!GetData()) @@ -1150,7 +1140,7 @@ Bool CeditorDlg::Save() wxString tStr; tStr = "A duplicate key value already exists in the table.\nUnable to save record\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); } else { @@ -1158,7 +1148,7 @@ Bool CeditorDlg::Save() wxString tStr; tStr = "Database insert failed\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); } } } @@ -1169,7 +1159,7 @@ Bool CeditorDlg::Save() wxString tStr; tStr = "Database update failed\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); failed = TRUE; } } @@ -1194,7 +1184,7 @@ Bool CeditorDlg::Save() * a special where clause must be built to find just the single row which, * in sequence, would follow the currently displayed row. */ -Bool CeditorDlg::GetNextRec() +bool CeditorDlg::GetNextRec() { wxString w; @@ -1205,7 +1195,7 @@ Bool CeditorDlg::GetNextRec() w += "'"; // If a query where string is currently set, append that criteria - if (!Contact->qryWhereStr.Empty()) + if (!Contact->qryWhereStr.IsEmpty()) { w += " AND ("; w += Contact->qryWhereStr; @@ -1214,7 +1204,7 @@ Bool CeditorDlg::GetNextRec() w += ")"; - return(GetRec(w.GetData())); + return(GetRec((char*) (const char*) w)); } // CeditorDlg::GetNextRec() @@ -1224,7 +1214,7 @@ Bool CeditorDlg::GetNextRec() * a special where clause must be built to find just the single row which, * in sequence, would precede the currently displayed row. */ -Bool CeditorDlg::GetPrevRec() +bool CeditorDlg::GetPrevRec() { wxString w; @@ -1235,7 +1225,7 @@ Bool CeditorDlg::GetPrevRec() w += "'"; // If a query where string is currently set, append that criteria - if (!Contact->qryWhereStr.Empty()) + if (!Contact->qryWhereStr.IsEmpty()) { w += " AND ("; w += Contact->qryWhereStr; @@ -1244,7 +1234,7 @@ Bool CeditorDlg::GetPrevRec() w += ")"; - return(GetRec(w.GetData())); + return(GetRec((char*) (const char*)w)); } // CeditorDlg::GetPrevRec() @@ -1253,7 +1243,7 @@ Bool CeditorDlg::GetPrevRec() * This function is here to avoid duplicating this same code in both the * GetPrevRec() and GetNextRec() functions */ -Bool CeditorDlg::GetRec(char *whereStr) +bool CeditorDlg::GetRec(char *whereStr) { Contact->where = whereStr; Contact->orderBy = "NAME"; @@ -1263,7 +1253,7 @@ Bool CeditorDlg::GetRec(char *whereStr) wxString tStr; tStr = "ODBC error during Query()\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); return(FALSE); } @@ -1282,34 +1272,24 @@ Bool CeditorDlg::GetRec(char *whereStr) /* * CparameterDlg constructor */ -CparameterDlg::CparameterDlg(wxWindow *parent) : wxDialogBox (parent, "ODBC parameter settings", 1, -1, -1, 400, 275) +CparameterDlg::CparameterDlg(wxWindow *parent) : wxDialog (parent, PARAMETER_DIALOG, "ODBC parameter settings", wxPoint(-1, -1), wxSize(400, 275)) { // Since the ::OnCommand() function is overridden, this prevents the widget // detection in ::OnCommand() until all widgets have been initialized to prevent // uninitialized pointers from crashing the program widgetPtrsSet = FALSE; - // Build the dialog - SetLabelPosition(wxVERTICAL); - - wxFont *ButtonFont = new wxFont(12,wxSWISS,wxNORMAL,wxBOLD); - wxFont *TextFont = new wxFont(12,wxSWISS,wxNORMAL,wxNORMAL); + pParamODBCSourceMsg = new wxStaticText(this, PARAMETER_DIALOG_SOURCE_MSG, "ODBC data sources:", wxPoint(10, 10), wxSize(-1, -1), 0, "ParamODBCSourceMsg"); + pParamODBCSourceList = new wxListBox(this, PARAMETER_DIALOG_SOURCE_LISTBOX, wxPoint(10, 29), wxSize(285, 150), 0, 0, wxLB_SINGLE|wxLB_ALWAYS_SB, wxDefaultValidator, "ParamODBCSourceList"); - SetButtonFont(ButtonFont); - SetLabelFont(TextFont); - SetLabelPosition(wxVERTICAL); + pParamUserNameMsg = new wxStaticText(this, PARAMETER_DIALOG_NAME_MSG, "Database user name:", wxPoint(10, 193), wxSize(-1, -1), 0, "ParamUserNameMsg"); + pParamUserNameTxt = new wxTextCtrl(this, PARAMETER_DIALOG_NAME_TEXT, "", wxPoint(10, 209), wxSize(140, 25), 0, wxDefaultValidator, "ParamUserNameTxt"); - pParamODBCSourceMsg = new wxMessage(this, "ODBC data sources:", 10, 10, -1, -1, 0, "ParamODBCSourceMsg"); - pParamODBCSourceList = new wxListBox(this, NULL, "", wxSINGLE|wxALWAYS_SB, 10, 29, 285, 150, 0, 0, 0, "ParamODBCSourceList"); + pParamPasswordMsg = new wxStaticText(this, PARAMETER_DIALOG_PASSWORD_MSG, "Password:", wxPoint(156, 193), wxSize(-1, -1), 0, "ParamPasswordMsg"); + pParamPasswordTxt = new wxTextCtrl(this, PARAMETER_DIALOG_PASSWORD_TEXT, "", wxPoint(156, 209), wxSize(140, 25), 0, wxDefaultValidator, "ParamPasswordTxt"); - pParamUserNameMsg = new wxMessage(this, "Database user name:", 10, 193, -1, -1, 0, "ParamUserNameMsg"); - pParamUserNameTxt = new wxText(this, NULL, "", "", 10, 209, 140, 25, 0, "ParamUserNameTxt"); - - pParamPasswordMsg = new wxMessage(this, "Password:", 156, 193, -1, -1, 0, "ParamPasswordMsg"); - pParamPasswordTxt = new wxText(this, NULL, "", "", 156, 209, 140, 25, 0, "ParamPasswordTxt"); - - pParamSaveBtn = new wxButton(this, NULL, "&Save", 310, 21, 70, 35, 0, "ParamSaveBtn"); - pParamCancelBtn = new wxButton(this, NULL, "C&ancel", 310, 66, 70, 35, 0, "ParamCancelBtn"); + pParamSaveBtn = new wxButton(this, PARAMETER_DIALOG_SAVE, "&Save", wxPoint(310, 21), wxSize(70, 35), 0, wxDefaultValidator, "ParamSaveBtn"); + pParamCancelBtn = new wxButton(this, PARAMETER_DIALOG_CANCEL, "C&ancel", wxPoint(310, 66), wxSize(70, 35), 0, wxDefaultValidator, "ParamCancelBtn"); // Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to // handle all widget processing @@ -1320,17 +1300,17 @@ CparameterDlg::CparameterDlg(wxWindow *parent) : wxDialogBox (parent, "ODBC para Centre(wxBOTH); PutData(); - Show(TRUE); + ShowModal(); } // CparameterDlg constructor -Bool CparameterDlg::OnClose() +bool CparameterDlg::OnClose() { // Put any additional checking necessary to make certain it is alright // to close the program here that is not done elsewhere if (!saved) { - Bool Ok = (wxMessageBox("No changes have been saved.\n\nAre you sure you wish exit the parameter screen?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); + bool Ok = (wxMessageBox("No changes have been saved.\n\nAre you sure you wish exit the parameter screen?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); if (!Ok) return FALSE; @@ -1361,7 +1341,7 @@ void CparameterDlg::OnCommand(wxWindow& win, wxCommandEvent& event) tStr = "Database parameters have been saved."; if (GetParent() != NULL) // The parameter dialog was not called during startup due to a missing cfg file tStr += "\nNew parameters will take effect the next time the program is started."; - wxMessageBox(tStr.GetData(),"Notice...",wxOK | wxICON_INFORMATION); + wxMessageBox(tStr,"Notice...",wxOK | wxICON_INFORMATION); saved = TRUE; Close(); } @@ -1376,7 +1356,7 @@ void CparameterDlg::OnCommand(wxWindow& win, wxCommandEvent& event) } // CparameterDlg::OnCommand() -Bool CparameterDlg::PutData() +bool CparameterDlg::PutData() { // Fill the data source list box FillDataSourceList(); @@ -1389,7 +1369,7 @@ Bool CparameterDlg::PutData() } // CparameterDlg::PutData() -Bool CparameterDlg::GetData() +bool CparameterDlg::GetData() { wxString tStr; if (pParamODBCSourceList->GetStringSelection()) @@ -1398,11 +1378,11 @@ Bool CparameterDlg::GetData() if (tStr.Length() > (sizeof(DatabaseDemoApp.params.ODBCSource)-1)) { wxString errmsg; - errmsg.sprintf("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()); - wxMessageBox(errmsg.GetData(),"Internal program error...",wxOK | wxICON_EXCLAMATION); + errmsg.Printf("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()); + wxMessageBox(errmsg,"Internal program error...",wxOK | wxICON_EXCLAMATION); return FALSE; } - strcpy(DatabaseDemoApp.params.ODBCSource, tStr.GetData()); + strcpy(DatabaseDemoApp.params.ODBCSource, tStr); } else return FALSE; @@ -1411,26 +1391,26 @@ Bool CparameterDlg::GetData() if (tStr.Length() > (sizeof(DatabaseDemoApp.params.UserName)-1)) { wxString errmsg; - errmsg.sprintf("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()); - wxMessageBox(errmsg.GetData(),"Internal program error...",wxOK | wxICON_EXCLAMATION); + errmsg.Printf("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()); + wxMessageBox(errmsg,"Internal program error...",wxOK | wxICON_EXCLAMATION); return FALSE; } - strcpy(DatabaseDemoApp.params.UserName, tStr.GetData()); + strcpy(DatabaseDemoApp.params.UserName, tStr); tStr = pParamPasswordTxt->GetValue(); if (tStr.Length() > (sizeof(DatabaseDemoApp.params.Password)-1)) { wxString errmsg; - errmsg.sprintf("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()); - wxMessageBox(errmsg.GetData(),"Internal program error...",wxOK | wxICON_EXCLAMATION); + errmsg.Printf("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()); + wxMessageBox(errmsg,"Internal program error...",wxOK | wxICON_EXCLAMATION); return FALSE; } - strcpy(DatabaseDemoApp.params.Password,tStr.GetData()); + strcpy(DatabaseDemoApp.params.Password,tStr); return TRUE; } // CparameterDlg::GetData() -Bool CparameterDlg::Save() +bool CparameterDlg::Save() { Cparameters saveParams = DatabaseDemoApp.params; if (!GetData()) @@ -1443,8 +1423,8 @@ Bool CparameterDlg::Save() if ((paramFile = fopen(paramFilename, "wt")) == NULL) { wxString tStr; - tStr.sprintf("Unable to write/overwrite '%s'.",paramFilename); - wxMessageBox(tStr.GetData(),"File I/O Error...",wxOK | wxICON_EXCLAMATION); + tStr.Printf("Unable to write/overwrite '%s'.",paramFilename); + wxMessageBox(tStr,"File I/O Error...",wxOK | wxICON_EXCLAMATION); return FALSE; } @@ -1479,7 +1459,7 @@ void CparameterDlg::FillDataSourceList() // CqueryDlg() constructor -CqueryDlg::CqueryDlg(wxWindow *parent, wxDB *pDb, char *tblName[], char *pWhereArg) : wxDialogBox (parent, "Query", 1, -1, -1, 480, 360) +CqueryDlg::CqueryDlg(wxWindow *parent, wxDB *pDb, char *tblName[], char *pWhereArg) : wxDialog (parent, QUERY_DIALOG, "Query", wxPoint(-1, -1), wxSize(480, 360)) { wxBeginBusyCursor(); @@ -1494,29 +1474,19 @@ CqueryDlg::CqueryDlg(wxWindow *parent, wxDB *pDb, char *tblName[], char *pWhereA if (strlen(pWhere) > DB_MAX_WHERE_CLAUSE_LEN) // Check the length of the buffer passed in { wxString s; - s.sprintf("Maximum where clause length exceeded.\nLength must be less than %d", DB_MAX_WHERE_CLAUSE_LEN+1); - wxMessageBox(s.GetData(),"Error...",wxOK | wxICON_EXCLAMATION); + s.Printf("Maximum where clause length exceeded.\nLength must be less than %d", DB_MAX_WHERE_CLAUSE_LEN+1); + wxMessageBox(s,"Error...",wxOK | wxICON_EXCLAMATION); Close(); return; } - // Build the dialog - SetLabelPosition(wxVERTICAL); - - wxFont *ButtonFont = new wxFont(12,wxSWISS,wxNORMAL,wxBOLD); - wxFont *TextFont = new wxFont(12,wxSWISS,wxNORMAL,wxNORMAL); + pQueryCol1Msg = new wxStaticText(this, QUERY_DIALOG_COL_MSG, "Column 1:", wxPoint(10, 10), wxSize(69, 16), 0, "QueryCol1Msg"); + pQueryCol1Choice = new wxChoice(this, QUERY_DIALOG_COL_CHOICE, wxPoint(10, 27), wxSize(250, 27), 0, 0, 0, wxDefaultValidator, "QueryCol1Choice"); - SetButtonFont(ButtonFont); - SetLabelFont(TextFont); - SetLabelPosition(wxVERTICAL); + pQueryNotMsg = new wxStaticText(this, QUERY_DIALOG_NOT_MSG, "NOT", wxPoint(268, 10), wxSize(-1, -1), 0, "QueryNotMsg"); + pQueryNotCheck = new wxCheckBox(this, QUERY_DIALOG_NOT_CHECKBOX, "", wxPoint(275, 37), wxSize(20, 20), 0, wxDefaultValidator, "QueryNotCheck"); - pQueryCol1Msg = new wxMessage(this, "Column 1:", 10, 10, 69, 16, 0, "QueryCol1Msg"); - pQueryCol1Choice = new wxChoice(this, NULL, "", 10, 27, 250, 27, 0, 0, 0, "QueryCol1Choice"); - - pQueryNotMsg = new wxMessage(this, "NOT", 268, 10, -1, -1, 0, "QueryNotMsg"); - pQueryNotCheck = new wxCheckBox(this, NULL, "", 275, 37, 20, 20, 0, "QueryNotCheck"); - - char *choice_strings[9]; + wxString choice_strings[9]; choice_strings[0] = "="; choice_strings[1] = "<"; choice_strings[2] = ">"; @@ -1526,34 +1496,34 @@ CqueryDlg::CqueryDlg(wxWindow *parent, wxDB *pDb, char *tblName[], char *pWhereA choice_strings[6] = "Contains"; choice_strings[7] = "Like"; choice_strings[8] = "Between"; - pQueryOperatorMsg = new wxMessage(this, "Operator:", 305, 10, -1, -1, 0, "QueryOperatorMsg"); - pQueryOperatorChoice = new wxChoice(this, NULL, "", 305, 27, 80, 27, 9, choice_strings, 0, "QueryOperatorChoice"); - - pQueryCol2Msg = new wxMessage(this, "Column 2:", 10, 65, 69, 16, 0, "QueryCol2Msg"); - pQueryCol2Choice = new wxChoice(this, NULL, "", 10, 82, 250, 27, 0, 0, 0, "QueryCol2Choice"); + pQueryOperatorMsg = new wxStaticText(this, QUERY_DIALOG_OP_MSG, "Operator:", wxPoint(305, 10), wxSize(-1, -1), 0, "QueryOperatorMsg"); + pQueryOperatorChoice = new wxChoice(this, QUERY_DIALOG_OP_CHOICE, wxPoint(305, 27), wxSize(80, 27), 9, choice_strings, 0, wxDefaultValidator, "QueryOperatorChoice"); - pQuerySqlWhereMsg = new wxMessage(this, "SQL where clause:", 10, 141, -1, -1, 0, "QuerySqlWhereMsg"); - pQuerySqlWhereMtxt = new wxMultiText(this, NULL, "", "", 10, 159, 377, 134, 0, "QuerySqlWhereMtxt"); + pQueryCol2Msg = new wxStaticText(this, QUERY_DIALOG_COL2_MSG, "Column 2:", wxPoint(10, 65), wxSize(69, 16), 0, "QueryCol2Msg"); + pQueryCol2Choice = new wxChoice(this, QUERY_DIALOG_COL2_CHOICE, wxPoint(10, 82), wxSize(250, 27), 0, 0, 0, wxDefaultValidator, "QueryCol2Choice"); - pQueryAddBtn = new wxButton(this, NULL, "&Add", 406, 24, 56, 26, 0, "QueryAddBtn"); - pQueryAndBtn = new wxButton(this, NULL, "A&nd", 406, 58, 56, 26, 0, "QueryAndBtn"); - pQueryOrBtn = new wxButton(this, NULL, "&Or", 406, 92, 56, 26, 0, "QueryOrBtn"); + pQuerySqlWhereMsg = new wxStaticText(this, QUERY_DIALOG_WHERE_MSG, "SQL where clause:", wxPoint(10, 141), wxSize(-1, -1), 0, "QuerySqlWhereMsg"); + pQuerySqlWhereMtxt = new wxTextCtrl(this, QUERY_DIALOG_WHERE_TEXT, "", wxPoint(10, 159), wxSize(377, 134), wxTE_MULTILINE, wxDefaultValidator, "QuerySqlWhereMtxt"); - pQueryLParenBtn = new wxButton(this, NULL, "(", 406, 126, 26, 26, 0, "QueryLParenBtn"); - pQueryRParenBtn = new wxButton(this, NULL, ")", 436, 126, 26, 26, 0, "QueryRParenBtn"); + pQueryAddBtn = new wxButton(this, QUERY_DIALOG_ADD, "&Add", wxPoint(406, 24), wxSize(56, 26), 0, wxDefaultValidator, "QueryAddBtn"); + pQueryAndBtn = new wxButton(this, QUERY_DIALOG_AND, "A&nd", wxPoint(406, 58), wxSize(56, 26), 0, wxDefaultValidator, "QueryAndBtn"); + pQueryOrBtn = new wxButton(this, QUERY_DIALOG_OR, "&Or", wxPoint(406, 92), wxSize(56, 26), 0, wxDefaultValidator, "QueryOrBtn"); - pQueryDoneBtn = new wxButton(this, NULL, "&Done", 406, 185, 56, 26, 0, "QueryDoneBtn"); - pQueryClearBtn = new wxButton(this, NULL, "C&lear", 406, 218, 56, 26, 0, "QueryClearBtn"); - pQueryCountBtn = new wxButton(this, NULL, "&Count", 406, 252, 56, 26, 0, "QueryCountBtn"); + pQueryLParenBtn = new wxButton(this, QUERY_DIALOG_LPAREN, "(", wxPoint(406, 126), wxSize(26, 26), 0, wxDefaultValidator, "QueryLParenBtn"); + pQueryRParenBtn = new wxButton(this, QUERY_DIALOG_RPAREN, ")", wxPoint(436, 126), wxSize(26, 26), 0, wxDefaultValidator, "QueryRParenBtn"); - pQueryValue1Msg = new wxMessage(this, "Value:", 277, 66, -1, -1, 0, "QueryValue1Msg"); - pQueryValue1Txt = new wxText(this, NULL, "", "", 277, 83, 108, 25, 0, "QueryValue1Txt"); + pQueryDoneBtn = new wxButton(this, QUERY_DIALOG_DONE, "&Done", wxPoint(406, 185), wxSize(56, 26), 0, wxDefaultValidator, "QueryDoneBtn"); + pQueryClearBtn = new wxButton(this, QUERY_DIALOG_CLEAR, "C&lear", wxPoint(406, 218), wxSize(56, 26), 0, wxDefaultValidator, "QueryClearBtn"); + pQueryCountBtn = new wxButton(this, QUERY_DIALOG_COUNT, "&Count", wxPoint(406, 252), wxSize(56, 26), 0, wxDefaultValidator, "QueryCountBtn"); - pQueryValue2Msg = new wxMessage(this, "AND", 238, 126, -1, -1, 0, "QueryValue2Msg"); - pQueryValue2Txt = new wxText(this, NULL, "", "", 277, 120, 108, 25, 0, "QueryValue2Txt"); + pQueryValue1Msg = new wxStaticText(this, QUERY_DIALOG_VALUE1_MSG, "Value:", wxPoint(277, 66), wxSize(-1, -1), 0, "QueryValue1Msg"); + pQueryValue1Txt = new wxTextCtrl(this, QUERY_DIALOG_VALUE1_TEXT, "", wxPoint(277, 83), wxSize(108, 25), 0, wxDefaultValidator, "QueryValue1Txt"); - pQueryHintGrp = new wxGroupBox(this, "", 10, 291, 377, 40, 0, "QueryHintGrp"); - pQueryHintMsg = new wxMessage(this, "", 16, 306, -1, -1, 0, "QueryHintMsg"); + pQueryValue2Msg = new wxStaticText(this, QUERY_DIALOG_VALUE2_MSG, "AND", wxPoint(238, 126), wxSize(-1, -1), 0, "QueryValue2Msg"); + pQueryValue2Txt = new wxTextCtrl(this, QUERY_DIALOG_VALUE2_TEXT, "", wxPoint(277, 120), wxSize(108, 25), 0, wxDefaultValidator, "QueryValue2Txt"); + + pQueryHintGrp = new wxStaticBox(this, QUERY_DIALOG_HINT_GROUP, "", wxPoint(10, 291), wxSize(377, 40), 0, "QueryHintGrp"); + pQueryHintMsg = new wxStaticText(this, QUERY_DIALOG_HINT_MSG, "", wxPoint(16, 306), wxSize(-1, -1), 0, "QueryHintMsg"); widgetPtrsSet = TRUE; // Initialize the dialog @@ -1566,9 +1536,9 @@ CqueryDlg::CqueryDlg(wxWindow *parent, wxDB *pDb, char *tblName[], char *pWhereA // the column names with the table name prefix. if (tblName[1] && strlen(tblName[1])) { - qualName.sprintf("%s.%s", colInf[i].tableName, colInf[i].colName); - pQueryCol1Choice->Append(qualName.GetData()); - pQueryCol2Choice->Append(qualName.GetData()); + qualName.Printf("%s.%s", colInf[i].tableName, colInf[i].colName); + pQueryCol1Choice->Append(qualName); + pQueryCol2Choice->Append(qualName); } else // Single table query, append just the column names { @@ -1591,9 +1561,8 @@ CqueryDlg::CqueryDlg(wxWindow *parent, wxDB *pDb, char *tblName[], char *pWhereA wxEndBusyCursor(); // Display the dialog window - SetModal(TRUE); Centre(wxBOTH); - Show(TRUE); + ShowModal(); } // CqueryDlg() constructor @@ -1772,8 +1741,8 @@ void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& event) if (strlen(pQuerySqlWhereMtxt->GetValue()) > DB_MAX_WHERE_CLAUSE_LEN) { wxString s; - s.sprintf("Maximum where clause length exceeded.\nLength must be less than %d", DB_MAX_WHERE_CLAUSE_LEN+1); - wxMessageBox(s.GetData(),"Error...",wxOK | wxICON_EXCLAMATION); + s.Printf("Maximum where clause length exceeded.\nLength must be less than %d", DB_MAX_WHERE_CLAUSE_LEN+1); + wxMessageBox(s,"Error...",wxOK | wxICON_EXCLAMATION); return; } // Validate the where clause for things such as matching parens @@ -1789,7 +1758,7 @@ void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& event) // Clear button if (widgetName == pQueryClearBtn->GetName()) { - Bool Ok = (wxMessageBox("Are you sure you wish to clear the Query?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); + bool Ok = (wxMessageBox("Are you sure you wish to clear the Query?","Confirm",wxYES_NO|wxICON_QUESTION) == wxYES); if (Ok) pQuerySqlWhereMtxt->SetValue(""); @@ -1810,7 +1779,7 @@ void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& event) } // CqueryDlg::OnCommand -Bool CqueryDlg::OnClose() +bool CqueryDlg::OnClose() { // Clean up if (colInf) @@ -1832,16 +1801,16 @@ Bool CqueryDlg::OnClose() } // CqueryDlg::OnClose() /* -Bool CqueryDlg::SetWidgetPtrs() +bool CqueryDlg::SetWidgetPtrs() { - Bool abort = FALSE; + bool abort = FALSE; abort = abort || !(pQueryCol1Choice = (wxChoice *)GetWidgetPtr("QueryCol1Choice",this)); abort = abort || !(pQueryNotCheck = (wxCheckBox *)GetWidgetPtr("QueryNotCheck",this)); abort = abort || !(pQueryOperatorChoice = (wxChoice *)GetWidgetPtr("QueryOperatorChoice",this)); abort = abort || !(pQueryCol2Choice = (wxChoice *)GetWidgetPtr("QueryCol2Choice",this)); - abort = abort || !(pQueryValue1Txt = (wxText *)GetWidgetPtr("QueryValue1Txt",this)); - abort = abort || !(pQueryValue2Txt = (wxText *)GetWidgetPtr("QueryValue2Txt",this)); + abort = abort || !(pQueryValue1Txt = (wxTextCtrl *)GetWidgetPtr("QueryValue1Txt",this)); + abort = abort || !(pQueryValue2Txt = (wxTextCtrl *)GetWidgetPtr("QueryValue2Txt",this)); abort = abort || !(pQuerySqlWhereMtxt = (wxMultiText *)GetWidgetPtr("QuerySqlWhereMtxt",this)); abort = abort || !(pQueryAddBtn = (wxButton *)GetWidgetPtr("QueryAddBtn",this)); abort = abort || !(pQueryAndBtn = (wxButton *)GetWidgetPtr("QueryAndBtn",this)); @@ -1852,7 +1821,7 @@ Bool CqueryDlg::SetWidgetPtrs() abort = abort || !(pQueryClearBtn = (wxButton *)GetWidgetPtr("QueryClearBtn",this)); abort = abort || !(pQueryCountBtn = (wxButton *)GetWidgetPtr("QueryCountBtn",this)); abort = abort || !(pQueryHelpBtn = (wxButton *)GetWidgetPtr("QueryHelpBtn",this)); - abort = abort || !(pQueryHintMsg = (wxMessage *)GetWidgetPtr("QueryHintMsg",this)); + abort = abort || !(pQueryHintMsg = (wxStaticText *)GetWidgetPtr("QueryHintMsg",this)); pFocusTxt = NULL; @@ -1865,7 +1834,7 @@ void CqueryDlg::AppendToWhere(char *s) { wxString whereStr = pQuerySqlWhereMtxt->GetValue(); whereStr += s; - pQuerySqlWhereMtxt->SetValue(whereStr.GetData()); + pQuerySqlWhereMtxt->SetValue(whereStr); } // CqueryDlg::AppendToWhere() @@ -1934,8 +1903,8 @@ void CqueryDlg::ProcessAddBtn() int col1Idx = pQueryCol1Choice->GetSelection(); - Bool quote = FALSE; - if (colInf[col1Idx].sqlDataType == SQL_VARCHAR || + bool quote = FALSE; + if (colInf[col1Idx].sqlDataType == SQL_VARCHAR || oper == qryOpBEGINS || oper == qryOpCONTAINS || oper == qryOpLIKE) @@ -1966,7 +1935,7 @@ void CqueryDlg::ProcessAddBtn() s += "'"; } - AppendToWhere(s.GetData()); + AppendToWhere((char*) (const char*) s); } // CqueryDlg::ProcessAddBtn() @@ -1988,13 +1957,13 @@ void CqueryDlg::ProcessCountBtn() wxString tStr; tStr = "ODBC error during Open()\n\n"; tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); - wxMessageBox(tStr.GetData(),"ODBC Error...",wxOK | wxICON_EXCLAMATION); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); return; } } // Count() with WHERE clause - dbTable->where = pQuerySqlWhereMtxt->GetValue(); + dbTable->where = (char*) (const char*) pQuerySqlWhereMtxt->GetValue(); ULONG whereCnt = dbTable->Count(); // Count() of all records in the table @@ -2004,14 +1973,14 @@ void CqueryDlg::ProcessCountBtn() if (whereCnt > 0 || totalCnt == 0) { wxString tStr; - tStr.sprintf("%lu of %lu records match the query criteria.",whereCnt,totalCnt); - wxMessageBox(tStr.GetData(),"Notice...",wxOK | wxICON_INFORMATION); + tStr.Printf("%lu of %lu records match the query criteria.",whereCnt,totalCnt); + wxMessageBox(tStr,"Notice...",wxOK | wxICON_INFORMATION); } else { wxString tStr; - tStr.sprintf("%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); - wxMessageBox(tStr.GetData(),"Notice...",wxOK | wxICON_INFORMATION); + tStr.Printf("%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); + wxMessageBox(tStr,"Notice...",wxOK | wxICON_INFORMATION); } // After a wxMessageBox, the focus does not necessarily return to the @@ -2022,7 +1991,7 @@ void CqueryDlg::ProcessCountBtn() } // CqueryDlg::ProcessCountBtn() -Bool CqueryDlg::ValidateWhereClause() +bool CqueryDlg::ValidateWhereClause() { wxString where = pQuerySqlWhereMtxt->GetValue(); diff --git a/samples/db/dbtest.h b/samples/db/dbtest.h index 76ee48eaba..6689d522ea 100644 --- a/samples/db/dbtest.h +++ b/samples/db/dbtest.h @@ -9,7 +9,9 @@ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// +#ifdef __GNUG__ #pragma interface "dbtest.h" +#endif #include <wx/string.h> #include <wx/dbtable.h> @@ -104,7 +106,7 @@ class DatabaseDemoApp: public wxApp { public: Cparameters params; - wxFrame *OnInit(void); + bool OnInit(); }; // DatabaseDemoApp DECLARE_APP(DatabaseDemoApp) @@ -117,14 +119,19 @@ class DatabaseDemoFrame: public wxFrame CparameterDlg *pParamDlg; public: - DatabaseDemoFrame(wxFrame *frame, char *title, int x, int y, int w, int h); + DatabaseDemoFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& sz); - void OnMenuCommand(int id); - bool OnClose(void); + void OnCloseWindow(wxCloseEvent& event); + void OnCreate(wxCommandEvent& event); + void OnExit(wxCommandEvent& event); + void OnEditParameters(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); void CreateDataTable(); void BuildEditorDialog(); void BuildParameterDialog(wxWindow *parent); + +DECLARE_EVENT_TABLE() }; // DatabaseDemoFrame @@ -141,13 +148,13 @@ class CeditorDlg : public wxPanel wxButton *pCreateBtn, *pEditBtn, *pDeleteBtn, *pCopyBtn, *pSaveBtn, *pCancelBtn; wxButton *pPrevBtn, *pNextBtn, *pQueryBtn, *pResetBtn, *pDoneBtn, *pHelpBtn; wxButton *pNameListBtn; - wxText *pNameTxt, *pAddress1Txt, *pAddress2Txt,*pCityTxt, *pStateTxt, *pCountryTxt,*pPostalCodeTxt; - wxMessage *pNameMsg, *pAddress1Msg, *pAddress2Msg,*pCityMsg, *pStateMsg, *pCountryMsg,*pPostalCodeMsg; - wxText *pJoinDateTxt,*pContribTxt, *pLinesTxt; - wxMessage *pJoinDateMsg,*pContribMsg, *pLinesMsg; + wxTextCtrl *pNameTxt, *pAddress1Txt, *pAddress2Txt,*pCityTxt, *pStateTxt, *pCountryTxt,*pPostalCodeTxt; + wxStaticText *pNameMsg, *pAddress1Msg, *pAddress2Msg,*pCityMsg, *pStateMsg, *pCountryMsg,*pPostalCodeMsg; + wxTextCtrl *pJoinDateTxt,*pContribTxt, *pLinesTxt; + wxStaticText *pJoinDateMsg,*pContribMsg, *pLinesMsg; wxRadioBox *pDeveloperRadio; wxChoice *pNativeLangChoice; - wxMessage *pNativeLangMsg; + wxStaticText *pNativeLangMsg; public: enum DialogModes mode; @@ -168,10 +175,51 @@ class CeditorDlg : public wxPanel bool GetRec(char *whereStr); }; // CeditorDlg +#define EDITOR_DIALOG 199 + +// Editor dialog control ids +#define EDITOR_DIALOG_FN_GROUP 200 +#define EDITOR_DIALOG_SEARCH_GROUP 201 +#define EDITOR_DIALOG_CREATE 202 +#define EDITOR_DIALOG_EDIT 203 +#define EDITOR_DIALOG_DELETE 204 +#define EDITOR_DIALOG_COPY 205 +#define EDITOR_DIALOG_SAVE 206 +#define EDITOR_DIALOG_CANCEL 207 +#define EDITOR_DIALOG_PREV 208 +#define EDITOR_DIALOG_NEXT 209 +#define EDITOR_DIALOG_QUERY 211 +#define EDITOR_DIALOG_RESET 212 +#define EDITOR_DIALOG_NAME_MSG 213 +#define EDITOR_DIALOG_NAME_TEXT 214 +#define EDITOR_DIALOG_LOOKUP 215 +#define EDITOR_DIALOG_ADDRESS1_MSG 216 +#define EDITOR_DIALOG_ADDRESS1_TEXT 217 +#define EDITOR_DIALOG_ADDRESS2_MSG 218 +#define EDITOR_DIALOG_ADDRESS2_TEXT 219 +#define EDITOR_DIALOG_CITY_MSG 220 +#define EDITOR_DIALOG_CITY_TEXT 221 +#define EDITOR_DIALOG_COUNTRY_MSG 222 +#define EDITOR_DIALOG_COUNTRY_TEXT 223 +#define EDITOR_DIALOG_POSTAL_MSG 224 +#define EDITOR_DIALOG_POSTAL_TEXT 225 +#define EDITOR_DIALOG_LANG_MSG 226 +#define EDITOR_DIALOG_LANG_CHOICE 227 +#define EDITOR_DIALOG_DATE_MSG 228 +#define EDITOR_DIALOG_DATE_TEXT 229 +#define EDITOR_DIALOG_CONTRIB_MSG 230 +#define EDITOR_DIALOG_CONTRIB_TEXT 231 +#define EDITOR_DIALOG_LINES_MSG 232 +#define EDITOR_DIALOG_LINES_TEXT 233 +#define EDITOR_DIALOG_STATE_MSG 234 +#define EDITOR_DIALOG_STATE_TEXT 235 +#define EDITOR_DIALOG_DEVELOPER 236 +#define EDITOR_DIALOG_JOIN_MSG 237 +#define EDITOR_DIALOG_JOIN_TEXT 238 // *************************** CparameterDlg *************************** -class CparameterDlg : public wxDialogBox +class CparameterDlg : public wxDialog { private: bool widgetPtrsSet; @@ -180,10 +228,10 @@ class CparameterDlg : public wxDialogBox Cparameters savedParamSettings; // Pointers to all widgets on the dialog - wxMessage *pParamODBCSourceMsg; + wxStaticText *pParamODBCSourceMsg; wxListBox *pParamODBCSourceList; - wxMessage *pParamUserNameMsg, *pParamPasswordMsg; - wxText *pParamUserNameTxt, *pParamPasswordTxt; + wxStaticText *pParamUserNameMsg, *pParamPasswordMsg; + wxTextCtrl *pParamUserNameTxt, *pParamPasswordTxt; wxButton *pParamSaveBtn, *pParamCancelBtn; public: @@ -199,6 +247,17 @@ class CparameterDlg : public wxDialogBox }; // CparameterDlg +#define PARAMETER_DIALOG 400 + +// Parameter dialog control ids +#define PARAMETER_DIALOG_SOURCE_MSG 401 +#define PARAMETER_DIALOG_SOURCE_LISTBOX 402 +#define PARAMETER_DIALOG_NAME_MSG 403 +#define PARAMETER_DIALOG_NAME_TEXT 404 +#define PARAMETER_DIALOG_PASSWORD_MSG 405 +#define PARAMETER_DIALOG_PASSWORD_TEXT 406 +#define PARAMETER_DIALOG_SAVE 407 +#define PARAMETER_DIALOG_CANCEL 408 // *************************** CqueryDlg *************************** @@ -230,7 +289,7 @@ char * const langQRY_LIKE = "% matches 0 or more of any char; _ matches char * const langQRY_BETWEEN = "column BETWEEN value AND value"; -class CqueryDlg : public wxDialogBox +class CqueryDlg : public wxDialog { private: CcolInf *colInf; // Column inf. returned by db->GetColumns() @@ -243,20 +302,20 @@ class CqueryDlg : public wxDialogBox bool widgetPtrsSet; // Widget pointers - wxMessage *pQueryCol1Msg; + wxStaticText *pQueryCol1Msg; wxChoice *pQueryCol1Choice; - wxMessage *pQueryNotMsg; + wxStaticText *pQueryNotMsg; wxCheckBox *pQueryNotCheck; - wxMessage *pQueryOperatorMsg; + wxStaticText *pQueryOperatorMsg; wxChoice *pQueryOperatorChoice; - wxMessage *pQueryCol2Msg; + wxStaticText *pQueryCol2Msg; wxChoice *pQueryCol2Choice; - wxMessage *pQueryValue1Msg; - wxText *pQueryValue1Txt; - wxMessage *pQueryValue2Msg; - wxText *pQueryValue2Txt; - wxMessage *pQuerySqlWhereMsg; - wxMultiText *pQuerySqlWhereMtxt; + wxStaticText *pQueryValue1Msg; + wxTextCtrl *pQueryValue1Txt; + wxStaticText *pQueryValue2Msg; + wxTextCtrl *pQueryValue2Txt; + wxStaticText *pQuerySqlWhereMsg; + wxTextCtrl *pQuerySqlWhereMtxt; wxButton *pQueryAddBtn; wxButton *pQueryAndBtn; wxButton *pQueryOrBtn; @@ -266,10 +325,10 @@ class CqueryDlg : public wxDialogBox wxButton *pQueryClearBtn; wxButton *pQueryCountBtn; wxButton *pQueryHelpBtn; - wxGroupBox *pQueryHintGrp; - wxMessage *pQueryHintMsg; + wxStaticBox *pQueryHintGrp; + wxStaticText *pQueryHintMsg; - wxText *pFocusTxt; + wxTextCtrl *pFocusTxt; CqueryDlg(wxWindow *parent, wxDB *pDb, char *tblName[], char *pWhereArg); @@ -284,3 +343,32 @@ class CqueryDlg : public wxDialogBox bool ValidateWhereClause(); }; // CqueryDlg + +#define QUERY_DIALOG 300 + +// Parameter dialog control ids +#define QUERY_DIALOG_COL_MSG 301 +#define QUERY_DIALOG_COL_CHOICE 302 +#define QUERY_DIALOG_NOT_MSG 303 +#define QUERY_DIALOG_NOT_CHECKBOX 304 +#define QUERY_DIALOG_OP_MSG 305 +#define QUERY_DIALOG_OP_CHOICE 306 +#define QUERY_DIALOG_COL2_MSG 307 +#define QUERY_DIALOG_COL2_CHOICE 308 +#define QUERY_DIALOG_WHERE_MSG 309 +#define QUERY_DIALOG_WHERE_TEXT 310 +#define QUERY_DIALOG_ADD 311 +#define QUERY_DIALOG_AND 312 +#define QUERY_DIALOG_OR 313 +#define QUERY_DIALOG_LPAREN 314 +#define QUERY_DIALOG_RPAREN 315 +#define QUERY_DIALOG_DONE 316 +#define QUERY_DIALOG_CLEAR 317 +#define QUERY_DIALOG_COUNT 318 +#define QUERY_DIALOG_VALUE1_MSG 319 +#define QUERY_DIALOG_VALUE1_TEXT 320 +#define QUERY_DIALOG_VALUE2_MSG 321 +#define QUERY_DIALOG_VALUE2_TEXT 322 +#define QUERY_DIALOG_HINT_GROUP 323 +#define QUERY_DIALOG_HINT_MSG 324 + diff --git a/samples/db/listdb.cpp b/samples/db/listdb.cpp index 330c79db2a..bea0ddc717 100644 --- a/samples/db/listdb.cpp +++ b/samples/db/listdb.cpp @@ -103,7 +103,7 @@ Clookup2::Clookup2(char *tblName, char *colName1, char *colName2, wxDB *pDb) // This is a generic lookup constructor that will work with any table and any column ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, char *colName, - char *where, char *orderBy) : wxDialogBox (parent, "Select...", 1, -1, -1, 400, 290) + char *where, char *orderBy) : wxDialog (parent, LOOKUP_DIALOG, "Select...", wxPoint(-1, -1), wxSize(400, 290)) { wxBeginBusyCursor(); @@ -114,19 +114,9 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, cha noDisplayCols = 1; col1Len = 0; - // Build the dialog - SetLabelPosition(wxVERTICAL); - - wxFont *ButtonFont = new wxFont(12,wxSWISS,wxNORMAL,wxBOLD); - wxFont *TextFont = new wxFont(12,wxSWISS,wxNORMAL,wxNORMAL); - - SetButtonFont(ButtonFont); - SetLabelFont(TextFont); - SetLabelPosition(wxVERTICAL); - - pLookUpSelectList = new wxListBox(this, NULL, "", wxSINGLE|wxALWAYS_SB, 5, 15, 384, 195, 0, 0, 0, "LookUpSelectList"); - pLookUpOkBtn = new wxButton(this, NULL, "&Ok", 113, 222, 70, 35, 0, "LookUpOkBtn"); - pLookUpCancelBtn = new wxButton(this, NULL, "C&ancel", 212, 222, 70, 35, 0, "LookUpCancelBtn"); + pLookUpSelectList = new wxListBox(this, LOOKUP_DIALOG_SELECT, wxPoint(5, 15), wxSize(384, 195), 0, 0, wxLB_SINGLE|wxLB_ALWAYS_SB, wxDefaultValidator, "LookUpSelectList"); + pLookUpOkBtn = new wxButton(this, LOOKUP_DIALOG_OK, "&Ok", wxPoint(113, 222), wxSize(70, 35), 0, wxDefaultValidator, "LookUpOkBtn"); + pLookUpCancelBtn = new wxButton(this, LOOKUP_DIALOG_CANCEL, "C&ancel", wxPoint(212, 222), wxSize(70, 35), 0, wxDefaultValidator, "LookUpCancelBtn"); widgetPtrsSet = TRUE; @@ -141,8 +131,8 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, cha if (!lookup->Open()) { wxString tStr; - tStr.sprintf("Unable to open the table '%s'.",tableName); - wxMessageBox(tStr.GetData(),"ODBC Error..."); + tStr.Printf("Unable to open the table '%s'.",tableName); + wxMessageBox(tStr,"ODBC Error..."); Close(); return; } @@ -176,7 +166,7 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, cha SetTitle(windowTitle); Centre(wxBOTH); wxEndBusyCursor(); - Show(TRUE); + ShowModal(); } // Generic lookup constructor @@ -207,7 +197,7 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, cha // ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, char *dispCol1, char *dispCol2, char *where, char *orderBy, bool distinctValues, - char *selectStmt, int maxLenCol1, wxDB *pDb, bool allowOk) : wxDialogBox (parent, "Select...", 1, -1, -1, 400, 290) + char *selectStmt, int maxLenCol1, wxDB *pDb, bool allowOk) : wxDialog (parent, LOOKUP_DIALOG, "Select...", wxPoint(-1, -1), wxSize(400, 290)) { wxBeginBusyCursor(); @@ -219,24 +209,16 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, noDisplayCols = (strlen(dispCol2) ? 2 : 1); col1Len = 0; - // Build the dialog - SetLabelPosition(wxVERTICAL); - - wxFont *ButtonFont = new wxFont(12,wxSWISS,wxNORMAL,wxBOLD); - wxFont *TextFont = new wxFont(12,wxSWISS,wxNORMAL,wxNORMAL); - wxFont *FixedFont = new wxFont(12,wxMODERN,wxNORMAL,wxNORMAL); - - SetButtonFont(ButtonFont); - SetLabelFont(TextFont); - SetLabelPosition(wxVERTICAL); + wxFont fixedFont(12,wxMODERN,wxNORMAL,wxNORMAL); // this is done with fixed font so that the second column (if any) will be left // justified in the second column - SetButtonFont(FixedFont); - pLookUpSelectList = new wxListBox(this, NULL, "", wxSINGLE|wxALWAYS_SB, 5, 15, 384, 195, 0, 0, 0, "LookUpSelectList"); - SetButtonFont(ButtonFont); - pLookUpOkBtn = new wxButton(this, NULL, "&Ok", 113, 222, 70, 35, 0, "LookUpOkBtn"); - pLookUpCancelBtn = new wxButton(this, NULL, "C&ancel", 212, 222, 70, 35, 0, "LookUpCancelBtn"); + pLookUpSelectList = new wxListBox(this, LOOKUP_DIALOG_SELECT, wxPoint(5, 15), wxSize(384, 195), 0, 0, wxLB_SINGLE|wxLB_ALWAYS_SB, wxDefaultValidator, "LookUpSelectList"); + + pLookUpSelectList->SetFont(fixedFont); + + pLookUpOkBtn = new wxButton(this, LOOKUP_DIALOG_OK, "&Ok", wxPoint(113, 222), wxSize(70, 35), 0, wxDefaultValidator, "LookUpOkBtn"); + pLookUpCancelBtn = new wxButton(this, LOOKUP_DIALOG_CANCEL, "C&ancel", wxPoint(212, 222), wxSize(70, 35), 0, wxDefaultValidator, "LookUpCancelBtn"); widgetPtrsSet = TRUE; @@ -251,8 +233,8 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, if (!lookup2->Open()) { wxString tStr; - tStr.sprintf("Unable to open the table '%s'.",tableName); - wxMessageBox(tStr.GetData(),"ODBC Error..."); + tStr.Printf("Unable to open the table '%s'.",tableName); + wxMessageBox(tStr,"ODBC Error..."); Close(); return; } @@ -276,7 +258,7 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, q += " WHERE "; q += where; } - if (!lookup2->QueryBySqlStmt(q.GetData())) + if (!lookup2->QueryBySqlStmt((char*) (const char*) q)) { wxMessageBox("ODBC error during QueryBySqlStmt()","ODBC Error..."); Close(); @@ -321,7 +303,7 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, s.Append(' ', (maxColLen + LISTDB_NO_SPACES_BETWEEN_COLS - strlen(lookup2->lookupCol1))); s.Append(lookup2->lookupCol2); } - pLookUpSelectList->Append(s.GetData()); + pLookUpSelectList->Append(s); } // Highlight the first list item @@ -342,7 +324,7 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, SetTitle(windowTitle); Centre(wxBOTH); wxEndBusyCursor(); - Show(TRUE); + ShowModal(); } // Generic lookup constructor 2 @@ -382,12 +364,12 @@ void ClookUpDlg::OnCommand(wxWindow& win, wxCommandEvent& event) // Column 1 s = s.SubString(0, col1Len-1); s = s.Strip(); - strcpy(ListDB_Selection, s.GetData()); + strcpy(ListDB_Selection, s); // Column 2 s = pLookUpSelectList->GetStringSelection(); - s = s.From(col1Len + LISTDB_NO_SPACES_BETWEEN_COLS); + s = s.Mid(col1Len + LISTDB_NO_SPACES_BETWEEN_COLS); s = s.Strip(); - strcpy(ListDB_Selection2, s.GetData()); + strcpy(ListDB_Selection2, s); } } else diff --git a/samples/db/listdb.h b/samples/db/listdb.h index 0d966c961e..f510fbf130 100644 --- a/samples/db/listdb.h +++ b/samples/db/listdb.h @@ -9,7 +9,9 @@ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// +#ifdef __GNUG__ #pragma interface "listdb.h" +#endif /* /* @@ -54,7 +56,7 @@ class Clookup2 : public wxTable }; // Clookup2 -class ClookUpDlg : public wxDialogBox +class ClookUpDlg : public wxDialog { private: bool widgetPtrsSet; @@ -120,6 +122,12 @@ class ClookUpDlg : public wxDialogBox void OnActivate(bool) {}; // necessary for hot keys }; +#define LOOKUP_DIALOG 500 + +#define LOOKUP_DIALOG_SELECT 501 +#define LOOKUP_DIALOG_OK 502 +#define LOOKUP_DIALOG_CANCEL 503 + #endif // LISTDB_DOT_H // ************************************ listdb.h ********************************* diff --git a/samples/db/makefile.nt b/samples/db/makefile.nt index 2db0a71c6e..1888b9caf0 100644 --- a/samples/db/makefile.nt +++ b/samples/db/makefile.nt @@ -1,53 +1,31 @@ # # File: makefile.nt -# Author: George Tasker -# Created: 1998 +# Author: Julian Smart +# Created: 1993 # Updated: +# Copyright: (c) 1993, AIAI, University of Edinburgh # # "%W% %G%" # -# Makefile : Builds database example (MS VC++). - -!if "$(FINAL)" == "" -FINAL=0 -!endif - - -!if "$(MSVCDIR)" == "" -MSVCDIR=c:\devstudio\vc -!endif +# Makefile : Builds db example (MS VC++). +# Use FINAL=1 argument to nmake to build final version with no debugging +# info # Set WXDIR for your system -WXDIR = $(WXWIN) -THISDIR = $(WXDIR)\samples\database -WXODBCDIR = $(WXDIR)\utils\wxodbc - -!if "$(MSVCDIR)" == "" -DBLIBS=$(MSDEVDIR)\lib\odbc32.lib -!else -DBLIBS=$(MSVCDIR)\lib\odbc32.lib -!endif +WXDIR = $(WXWIN) -EXTRAINC = -I$(WXODBCDIR)\src -EXTRALIBS = $(DBLIBS) $(WXODBCDIR)\lib\wxodbc.lib +WXUSINGDLL=0 !include $(WXDIR)\src\ntwxwin.mak -PROGRAM=database +THISDIR = $(WXDIR)\samples\db +PROGRAM=dbtest -OBJECTS = $(PROGRAM).$(OBJSUFF) listdb.$(OBJSUFF) - -all: wxodbc $(PROGRAM).exe +OBJECTS = $(PROGRAM).obj listdb.obj $(PROGRAM): $(PROGRAM).exe -gt: - cd $(CPPFLAGS) - -wxodbc: - cd $(WXODBCDIR)\src - nmake -f makefile.nt FINAL=$(FINAL) - cd $(THISDIR) +all: wx $(PROGRAM).exe wx: cd $(WXDIR)\src\msw @@ -58,12 +36,8 @@ wxclean: cd $(WXDIR)\src\msw nmake -f makefile.nt clean cd $(THISDIR) - cd $(WXODBCDIR)\src - nmake -f makefile.nt clean - cd $(THISDIR) - -$(PROGRAM).exe: $(DUMMYOBJ) $(OBJECTS) $(PROGRAM).res +$(PROGRAM).exe: $(DUMMYOBJ) $(WXLIB) $(OBJECTS) $(PROGRAM).res $(link) @<< -out:$(PROGRAM).exe $(LINKFLAGS) @@ -72,19 +46,17 @@ $(LIBS) << -listdb.$(OBJSUFF): $(*B).$(SRCSUFF) $(*B).h - $(cc) @<< -$(CPPFLAGS) /c /Fo$(*B).$(OBJSUFF) /Tp $(*B).$(SRCSUFF) +$(PROGRAM).obj: $(PROGRAM).$(SRCSUFF) $(DUMMYOBJ) + $(cc) @<< +$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) << - -$(PROGRAM).$(OBJSUFF): $(PROGRAM).$(SRCSUFF) $(PROGRAM).h listdb.h - $(cc) @<< -$(CPPFLAGS) /c /Fo$(*B).$(OBJSUFF) /Tp $(*B).$(SRCSUFF) +listdb.obj: listdb.cpp $(DUMMYOBJ) + $(cc) @<< +$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) << - -$(PROGRAM).res: $(PROGRAM).rc $(WXDIR)\include\wx\msw\wx.rc +$(PROGRAM).res : $(PROGRAM).rc $(WXDIR)\include\wx\msw\wx.rc $(rc) -r /i$(WXDIR)\include -fo$@ $(PROGRAM).rc diff --git a/samples/db/makefile.unx b/samples/db/makefile.unx index 3c4142d09b..2c8bf754e9 100644 --- a/samples/db/makefile.unx +++ b/samples/db/makefile.unx @@ -1,71 +1,17 @@ # # File: makefile.unx -# Author: Terry Tompkins +# Author: Julian Smart # Created: 1998 # Updated: -# Copyright: (c) 1998, Remstar International +# Copyright: (c) 1998 Julian Smart # -# Makefile for wxDB (UNIX). - -OBJDIR=database -OBJSUFF=.o -SRCSUFF=.cpp -WXDIR = $(WXWIN) - -# All common UNIX compiler flags and options are now in -# this central makefile. -include $(WXDIR)/src/make.env - -PROGRAM=database - -OBJECTS = $(OBJDIR)/$(PROGRAM).$(OBJSUFF) $(OBJDIR)/table.$(OBJSUFF) $(OBJDIR)/db.$(OBJSUFF) $(OBJDIR)/listdb.$(OBJSUFF) - -.SUFFIXES: - -all: $(OBJDIR) $(PROGRAM)$(GUISUFFIX) - -wx: - - -motif: - $(MAKE) -f makefile.unx GUISUFFIX=_motif GUI=-Dwx_motif GUISUFFIX=_motif OPT='$(OPT)' LDLIBS='$(MOTIFLDLIBS)' WXLIB=$(WXDIR)/lib/libwx_motif.a OPTIONS='$(OPTIONS)' DEBUG='$(DEBUG)' WARN='$(WARN)' XLIB='$(XLIB)' XINCLUDE='$(XINCLUDE)' XVIEW_LINK= - -xview: - cd $(WXDIR)/src/x; $(MAKE) -f makefile.unx xview - $(MAKE) -f makefile.unx GUI=-Dwx_xview GUISUFFIX=_ol CC=$(CC) OPTIONS='$(OPTIONS)' DEBUG='$(DEBUG)' WARN='$(WARN)' XLIB='$(XLIB)' XINCLUDE='$(XINCLUDE)' - -hp: - cd $(WXDIR)/src/x; $(MAKE) -f makefile.unx hp - $(MAKE) -f makefile.unx GUI=-Dwx_motif GUISUFFIX=_hp CC=CC DEBUG='$(DEBUG)' WARN='-w' \ - XINCLUDE='$(HPXINCLUDE)' XLIB='$(HPXLIB)' XVIEW_LINK='' LDLIBS='$(HPLDLIBS)' - -$(OBJDIR): - mkdir $(OBJDIR) - -$(PROGRAM)$(GUISUFFIX): $(DUMMYOBJ) $(DBLIBS) $(OBJECTS) $(WXLIB) - $(CC) $(LDFLAGS) -o $(PROGRAM)$(GUISUFFIX) $(OBJECTS) $(XVIEW_LINK) $(LDLIBS) - -$(OBJDIR)/$(PROGRAM).$(OBJSUFF): $(PROGRAM).$(SRCSUFF) - $(CC) -c $(CPPFLAGS) -o $@ $(PROGRAM).$(SRCSUFF) - -$(OBJDIR)/table.$(OBJSUFF): table.$(SRCSUFF) - $(CC) -c $(CPPFLAGS) -o $@ table.$(SRCSUFF) - -$(OBJDIR)/db.$(OBJSUFF): db.$(SRCSUFF) - $(CC) -c $(CPPFLAGS) -o $@ db.$(SRCSUFF) - -$(OBJDIR)/listdb.$(OBJSUFF): listdb.$(SRCSUFF) - $(CC) -c $(CPPFLAGS) -o $@ listdb.$(SRCSUFF) - -clean_motif: - $(MAKE) -f makefile.unx GUISUFFIX=_motif cleanany +# "%W% %G%" +# +# Makefile for dbtest example (UNIX). -clean_ol: - $(MAKE) -f makefile.unx GUISUFFIX=_ol cleanany +PROGRAM=dbtest -clean_hp: - $(MAKE) -f makefile.unx GUISUFFIX=_hp cleanany +OBJECTS=$(PROGRAM).o listdb.o -cleanany: - rm -f $(OBJECTS) $(PROGRAM)$(GUISUFFIX) core +include ../../src/makeprog.env diff --git a/src/common/db.cpp b/src/common/db.cpp index 1c2c703f42..9125384a3f 100644 --- a/src/common/db.cpp +++ b/src/common/db.cpp @@ -5,6 +5,8 @@ // source such as opening and closing the data source. // Author: Doug Card // Modified by: +// Mods: Dec, 1998: Added support for SQL statement logging and database +// cataloging // Created: 9.96 // RCS-ID: $Id$ // Copyright: (c) 1996 Remstar International, Inc. @@ -20,17 +22,17 @@ // the wxWindows GUI development toolkit. /////////////////////////////////////////////////////////////////////////////// +#ifdef __GNUG__ +#pragma implementation "db.h" +#endif + /* // SYNOPSIS START // SYNOPSIS STOP */ -#ifdef __GNUG__ -#pragma implementation "db.h" -#endif - /* -#ifdef _CONSOLE +#ifdef DBDEBUG_CONSOLE #include <iostream.h> #endif */ @@ -47,11 +49,10 @@ #if wxUSE_ODBC -#include <wx/db.h> - #include <stdio.h> #include <string.h> #include <assert.h> +#include "wx/db.h" DbList *PtrBegDbList = 0; @@ -59,6 +60,9 @@ DbList *PtrBegDbList = 0; wxDB::wxDB(HENV &aHenv) { int i; + + fpSqlLog = 0; // Sql Log file pointer + sqlLogState = sqlLogOFF; // By default, logging is turned off strcpy(sqlState,""); strcpy(errorMsg,""); @@ -112,7 +116,7 @@ wxDB::wxDB(HENV &aHenv) /********** wxDB::Open() **********/ bool wxDB::Open(char *Dsn, char *Uid, char *AuthStr) { - assert(Dsn); + assert(Dsn && strlen(Dsn)); dsn = Dsn; uid = Uid; authStr = AuthStr; @@ -125,7 +129,7 @@ bool wxDB::Open(char *Dsn, char *Uid, char *AuthStr) // specified before the connection is made. retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED); - #ifdef _CONSOLE + #ifdef DBDEBUG_CONSOLE if (retcode == SQL_SUCCESS) cout << "SQLSetConnectOption(CURSOR_LIB) successful" << endl; else @@ -240,7 +244,7 @@ bool wxDB::Open(char *Dsn, char *Uid, char *AuthStr) else typeInfDate.FsqlType = SQL_TIMESTAMP; -#ifdef _CONSOLE +#ifdef DBDEBUG_CONSOLE cout << "VARCHAR DATA TYPE: " << typeInfVarchar.TypeName << endl; cout << "INTEGER DATA TYPE: " << typeInfInteger.TypeName << endl; cout << "FLOAT DATA TYPE: " << typeInfFloat.TypeName << endl; @@ -262,7 +266,7 @@ bool wxDB::setConnectionOptions(void) SQLSetConnectOption(hdbc, SQL_OPT_TRACE, SQL_OPT_TRACE_OFF); // Display the connection options to verify them -#ifdef _CONSOLE +#ifdef DBDEBUG_CONSOLE long l; cout << ">>>>> CONNECTION OPTIONS <<<<<<" << endl; @@ -394,7 +398,7 @@ bool wxDB::getDbInfo(void) if (SQLGetInfo(hdbc, SQL_LOGIN_TIMEOUT, &dbInf.loginTimeout, sizeof(dbInf.loginTimeout), &cb) != SQL_SUCCESS) return(DispAllErrors(henv, hdbc)); -#ifdef _CONSOLE +#ifdef DBDEBUG_CONSOLE cout << ">>>>> DATA SOURCE INFORMATION <<<<<" << endl; cout << "SERVER Name: " << dbInf.serverName << endl; cout << "DBMS Name: " << dbInf.dbmsName << "; DBMS Version: " << dbInf.dbmsVer << endl; @@ -612,7 +616,7 @@ bool wxDB::getDataTypeInfo(SWORD fSqlType, SqlTypeInfo &structSQLTypeInfo) // Fetch the record if ((retcode = SQLFetch(hstmt)) != SQL_SUCCESS) { -#ifdef _CONSOLE +#ifdef DBDEBUG_CONSOLE if (retcode == SQL_NO_DATA_FOUND) cout << "SQL_NO_DATA_FOUND fetching inf. about data type." << endl; #endif @@ -647,6 +651,13 @@ bool wxDB::getDataTypeInfo(SWORD fSqlType, SqlTypeInfo &structSQLTypeInfo) /********** wxDB::Close() **********/ void wxDB::Close(void) { + // Close the Sql Log file + if (fpSqlLog) + { + fclose(fpSqlLog); + fpSqlLog = 0; //glt + } + // Free statement handle if (dbIsOpen) { @@ -699,7 +710,7 @@ bool wxDB::DispAllErrors(HENV aHenv, HDBC aHdbc, HSTMT aHstmt) logError(odbcErrMsg, sqlState); if (!silent) { -#ifdef _CONSOLE +#ifdef DBDEBUG_CONSOLE // When run in console mode, use standard out to display errors. cout << odbcErrMsg << endl; cout << "Press any key to continue..." << endl; @@ -733,7 +744,7 @@ void wxDB::DispNextError(void) if (silent) return; -#ifdef _CONSOLE +#ifdef DBDEBUG_CONSOLE // When run in console mode, use standard out to display errors. cout << odbcErrMsg << endl; cout << "Press any key to continue..." << endl; @@ -994,10 +1005,12 @@ bool wxDB::Grant(int privileges, char *tableName, char *userList) strcat(sqlStmt, " TO "); strcat(sqlStmt, userList); -#ifdef _CONSOLE +#ifdef DBDEBUG_CONSOLE cout << endl << sqlStmt << endl; #endif + WriteSqlLog(sqlStmt); + return(ExecSql(sqlStmt)); } // wxDB::Grant() @@ -1025,7 +1038,9 @@ bool wxDB::CreateView(char *viewName, char *colList, char *pSqlStmt) } } -#ifdef _CONSOLE + WriteSqlLog(sqlStmt); + +#ifdef DBDEBUG_CONSOLE cout << endl << sqlStmt << endl; #endif @@ -1043,7 +1058,9 @@ bool wxDB::CreateView(char *viewName, char *colList, char *pSqlStmt) strcat(sqlStmt, " AS "); strcat(sqlStmt, pSqlStmt); -#ifdef _CONSOLE + WriteSqlLog(sqlStmt); + +#ifdef DBDEBUG_CONSOLE cout << sqlStmt << endl; #endif @@ -1161,6 +1178,101 @@ CcolInf *wxDB::GetColumns(char *tableName[]) } // wxDB::GetColumns() +/********** wxDB::Catalog() **********/ +bool wxDB::Catalog(char *userID, char *fileName) +{ + assert(userID && strlen(userID)); + assert(fileName && strlen(fileName)); + + RETCODE retcode; + SDWORD cb; + char tblName[DB_MAX_TABLE_NAME_LEN+1]; + char tblNameSave[DB_MAX_TABLE_NAME_LEN+1]; + char colName[DB_MAX_COLUMN_NAME_LEN+1]; + SWORD sqlDataType; + char typeName[16]; + SWORD precision, length; + + FILE *fp = fopen(fileName,"wt"); + if (fp == NULL) + return(FALSE); + + SQLFreeStmt(hstmt, SQL_CLOSE); + + int i = 0; + char userIdUC[81]; + for (char *p = userID; *p; p++) + userIdUC[i++] = toupper(*p); + userIdUC[i] = 0; + + retcode = SQLColumns(hstmt, + NULL, 0, // All qualifiers + (UCHAR *) userIdUC, SQL_NTS, // User specified + NULL, 0, // All tables + NULL, 0); // All columns + if (retcode != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + fclose(fp); + return(FALSE); + } + + SQLBindCol(hstmt, 3, SQL_C_CHAR, tblName, DB_MAX_TABLE_NAME_LEN+1, &cb); + SQLBindCol(hstmt, 4, SQL_C_CHAR, colName, DB_MAX_COLUMN_NAME_LEN+1, &cb); + SQLBindCol(hstmt, 5, SQL_C_SSHORT, &sqlDataType, 0, &cb); + SQLBindCol(hstmt, 6, SQL_C_CHAR, typeName, 16, &cb); + SQLBindCol(hstmt, 7, SQL_C_SSHORT, &precision, 0, &cb); + SQLBindCol(hstmt, 8, SQL_C_SSHORT, &length, 0, &cb); + + char outStr[256]; + strcpy(tblNameSave,""); + int cnt = 0; + + while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS) + { + if (strcmp(tblName,tblNameSave)) + { + if (cnt) + fputs("\n", fp); + fputs("================================ ", fp); + fputs("================================ ", fp); + fputs("===================== ", fp); + fputs("========= ", fp); + fputs("=========\n", fp); + sprintf(outStr, "%-32s %-32s %-21s %9s %9s\n", + "TABLE NAME", "COLUMN NAME", "DATA TYPE", "PRECISION", "LENGTH"); + fputs(outStr, fp); + fputs("================================ ", fp); + fputs("================================ ", fp); + fputs("===================== ", fp); + fputs("========= ", fp); + fputs("=========\n", fp); + strcpy(tblNameSave,tblName); + } + sprintf(outStr, "%-32s %-32s (%04d)%-15s %9d %9d\n", + tblName, colName, sqlDataType, typeName, precision, length); + if (fputs(outStr, fp) == EOF) + { + fclose(fp); + return(FALSE); + } + cnt++; + } + + if (retcode != SQL_NO_DATA_FOUND) + { + DispAllErrors(henv, hdbc, hstmt); + fclose(fp); + return(FALSE); + } + + SQLFreeStmt(hstmt, SQL_CLOSE); + fclose(fp); + return(TRUE); + +} // wxDB::Catalog() + + // Table name can refer to a table, view, alias or synonym. Returns true // if the object exists in the database. This function does not indicate // whether or not the user has privleges to query or perform other functions @@ -1190,6 +1302,54 @@ bool wxDB::TableExists(char *tableName) } // wxDB::TableExists() +/********** wxDB::SqlLog() **********/ +bool wxDB::SqlLog(enum sqlLog state, char *filename, bool append) +{ + assert(state == sqlLogON || state == sqlLogOFF); + assert(state == sqlLogOFF || filename); + + if (state == sqlLogON) + { + if (fpSqlLog == 0) + { + fpSqlLog = fopen(filename, (append ? "at" : "wt")); + if (fpSqlLog == NULL) + return(FALSE); + } + } + else // sqlLogOFF + { + if (fpSqlLog) + { + if (fclose(fpSqlLog)) + return(FALSE); + fpSqlLog = 0; + } + } + + sqlLogState = state; + return(TRUE); + +} // wxDB::SqlLog() + + +/********** wxDB::WriteSqlLog() **********/ +bool wxDB::WriteSqlLog(char *logMsg) +{ + assert(logMsg); + + if (fpSqlLog == 0 || sqlLogState == sqlLogOFF) + return(FALSE); + + if (fputs("\n", fpSqlLog) == EOF) return(FALSE); + if (fputs(logMsg, fpSqlLog) == EOF) return(FALSE); + if (fputs("\n", fpSqlLog) == EOF) return(FALSE); + + return(TRUE); + +} // wxDB::WriteSqlLog() + + /********** GetDbConnection() **********/ wxDB *GetDbConnection(DbStuff *pDbStuff) { @@ -1319,4 +1479,5 @@ bool GetDataSource(HENV henv, char *Dsn, SWORD DsnMax, char *DsDesc, SWORD DsDes } // GetDataSource() #endif - // wxUSE_ODBC + // wxUSE_ODBC + diff --git a/src/common/dbtable.cpp b/src/common/dbtable.cpp index 5a888dec03..decce99426 100644 --- a/src/common/dbtable.cpp +++ b/src/common/dbtable.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: table.cpp +// Name: dbtable.cpp // Purpose: Implementation of the wxTable class. // Author: Doug Card // Modified by: @@ -18,6 +18,10 @@ // the wxWindows GUI development toolkit. /////////////////////////////////////////////////////////////////////////////// +#ifdef __GNUG__ +#pragma implementation "dbtable.h" +#endif + /* // SYNOPSIS START // SYNOPSIS STOP @@ -46,14 +50,15 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <assert.h> -#ifdef __WXUNIX__ +#ifdef __UNIX__ // The HPUX preprocessor lines below were commented out on 8/20/97 // because macros.h currently redefines DEBUG and is unneeded. // # ifdef HPUX // # include <macros.h> // # endif -# ifdef __WXLINUX__ +# ifdef LINUX # include <sys/minmax.h> # endif #endif @@ -63,16 +68,22 @@ wxTable::wxTable(wxDB *pwxDB, const char *tblName, const int nCols, const char * { // Assign member variables pDb = pwxDB; // Pointer to the wxDB object + strcpy(tableName, tblName); // Table Name if (qryTblName) // Name of the table/view to query strcpy(queryTableName, qryTblName); else strcpy(queryTableName, tblName); - noCols = nCols; // No. of cols in the table - where = 0; // Where clause - orderBy = 0; // Order By clause - selectForUpdate = FALSE; // SELECT ... FOR UPDATE; Indicates whether to include the FOR UPDATE phrase + assert(pDb); // Assert is placed after table name is assigned for error reporting reasons + if (!pDb) + return; + + noCols = nCols; // No. of cols in the table + where = 0; // Where clause + orderBy = 0; // Order By clause + from = 0; // From clause + selectForUpdate = FALSE; // SELECT ... FOR UPDATE; Indicates whether to include the FOR UPDATE phrase // Grab the HENV and HDBC from the wxDB object henv = pDb->henv; @@ -214,15 +225,18 @@ wxTable::~wxTable() /********** wxTable::Open() **********/ bool wxTable::Open(void) { + if (!pDb) + return FALSE; + int i; char sqlStmt[DB_MAX_STATEMENT_LEN]; // Verify that the table exists in the database if (!pDb->TableExists(tableName)) { - wxString s; - s.Printf("Error opening '%s', table/view does not exist in the database.", tableName); - pDb->LogError(WXSTRINGCAST(s)); + char s[128]; + sprintf(s, "Error opening '%s', table/view does not exist in the database.", tableName); + pDb->LogError(s); return(FALSE); } @@ -272,6 +286,8 @@ bool wxTable::Open(void) } strcat(sqlStmt, ")"); + pDb->WriteSqlLog(sqlStmt); + // Prepare the insert statement for execution if (SQLPrepare(hstmtInsert, (UCHAR FAR *) sqlStmt, SQL_NTS) != SQL_SUCCESS) return(pDb->DispAllErrors(henv, hdbc, hstmtInsert)); @@ -293,6 +309,7 @@ bool wxTable::Query(bool forUpdate, bool distinct) /********** wxTable::QueryBySqlStmt() **********/ bool wxTable::QueryBySqlStmt(char *pSqlStmt) { + pDb->WriteSqlLog(pSqlStmt); return(query(DB_SELECT_STATEMENT, FALSE, FALSE, pSqlStmt)); @@ -328,7 +345,10 @@ bool wxTable::query(int queryType, bool forUpdate, bool distinct, char *pSqlStmt // Set the SQL SELECT string if (queryType != DB_SELECT_STATEMENT) // A select statement was not passed in, - GetSelectStmt(sqlStmt, queryType, distinct); // so generate a select statement. + { // so generate a select statement. + GetSelectStmt(sqlStmt, queryType, distinct); + pDb->WriteSqlLog(sqlStmt); + } // Make sure the cursor is closed first if (! CloseCursor(hstmt)) @@ -358,9 +378,21 @@ void wxTable::GetSelectStmt(char *pSqlStmt, int typeOfSelect, bool distinct) if (distinct) strcat(pSqlStmt, "DISTINCT "); + // Was a FROM clause specified to join tables to the base table? + // Available for ::Query() only!!! + bool appendFromClause = FALSE; + if (typeOfSelect == DB_SELECT_WHERE && from && strlen(from)) + appendFromClause = TRUE; + // Add the column list for (int i = 0; i < noCols; i++) { + // If joining tables, the base table column names must be qualified to avoid ambiguity + if (appendFromClause) + { + strcat(pSqlStmt, queryTableName); + strcat(pSqlStmt, "."); + } strcat(pSqlStmt, colDefs[i].ColName); if (i + 1 < noCols) strcat(pSqlStmt, ","); @@ -369,11 +401,23 @@ void wxTable::GetSelectStmt(char *pSqlStmt, int typeOfSelect, bool distinct) // If the datasource supports ROWID, get this column as well. Exception: Don't retrieve // the ROWID if querying distinct records. The rowid will always be unique. if (!distinct && CanUpdByROWID()) - strcat(pSqlStmt, ",ROWID"); + { + // If joining tables, the base table column names must be qualified to avoid ambiguity + if (appendFromClause) + { + strcat(pSqlStmt, ","); + strcat(pSqlStmt, queryTableName); + strcat(pSqlStmt, ".ROWID"); + } + else + strcat(pSqlStmt, ",ROWID"); + } // Append the FROM tablename portion strcat(pSqlStmt, " FROM "); strcat(pSqlStmt, queryTableName); + if (appendFromClause) + strcat(pSqlStmt, from); // Append the WHERE clause. Either append the where clause for the class // or build a where clause. The typeOfSelect determines this. @@ -468,12 +512,9 @@ bool wxTable::bindInsertParams(void) UDWORD precision; SWORD scale; -//glt CcolDef *tColDef; - // Bind each column (that can be inserted) of the table to a parameter marker for (int i = 0; i < noCols; i++) { -//glt tColDef = &colDefs[i]; if (! colDefs[i].InsertAllowed) continue; switch(colDefs[i].DbDataType) @@ -606,6 +647,9 @@ bool wxTable::CloseCursor(HSTMT cursor) /********** wxTable::CreateTable() **********/ bool wxTable::CreateTable(void) { + if (!pDb) + return FALSE; + int i, j; char sqlStmt[DB_MAX_STATEMENT_LEN]; @@ -632,6 +676,8 @@ bool wxTable::CreateTable(void) } } + pDb->WriteSqlLog(sqlStmt); + // Commit the transaction and close the cursor if (! pDb->CommitTrans()) return(FALSE); @@ -694,11 +740,11 @@ bool wxTable::CreateTable(void) // For varchars, append the size of the string if (colDefs[i].DbDataType == DB_DATA_TYPE_VARCHAR) { + char s[10]; // strcat(sqlStmt, "("); // strcat(sqlStmt, itoa(colDefs[i].SzDataObj, s, 10)); // strcat(sqlStmt, ")"); - wxString s; - s.Printf("(%d)", colDefs[i].SzDataObj); + sprintf(s, "(%d)", colDefs[i].SzDataObj); strcat(sqlStmt, s); } needComma = TRUE; @@ -732,6 +778,8 @@ bool wxTable::CreateTable(void) // Append the closing parentheses for the create table statement strcat(sqlStmt, ")"); + pDb->WriteSqlLog(sqlStmt); + #ifdef _CONSOLE cout << endl << sqlStmt << endl; #endif @@ -787,6 +835,8 @@ bool wxTable::CreateIndex(char * idxName, bool unique, int noIdxCols, CidxDef *p // Append closing parentheses strcat(sqlStmt, ")"); + pDb->WriteSqlLog(sqlStmt); + #ifdef _CONSOLE cout << endl << sqlStmt << endl << endl; #endif @@ -837,6 +887,7 @@ int wxTable::Insert(void) /********** wxTable::Update(pSqlStmt) **********/ bool wxTable::Update(char *pSqlStmt) { + pDb->WriteSqlLog(pSqlStmt); return(execUpdate(pSqlStmt)); @@ -850,6 +901,8 @@ bool wxTable::Update(void) // Build the SQL UPDATE statement GetUpdateStmt(sqlStmt, DB_UPD_KEYFIELDS); + pDb->WriteSqlLog(sqlStmt); + #ifdef _CONSOLE cout << endl << sqlStmt << endl << endl; #endif @@ -867,6 +920,8 @@ bool wxTable::UpdateWhere(char *pWhereClause) // Build the SQL UPDATE statement GetUpdateStmt(sqlStmt, DB_UPD_WHERE, pWhereClause); + pDb->WriteSqlLog(sqlStmt); + #ifdef _CONSOLE cout << endl << sqlStmt << endl << endl; #endif @@ -884,6 +939,8 @@ bool wxTable::Delete(void) // Build the SQL DELETE statement GetDeleteStmt(sqlStmt, DB_DEL_KEYFIELDS); + pDb->WriteSqlLog(sqlStmt); + // Execute the SQL DELETE statement return(execDelete(sqlStmt)); @@ -897,6 +954,8 @@ bool wxTable::DeleteWhere(char *pWhereClause) // Build the SQL DELETE statement GetDeleteStmt(sqlStmt, DB_DEL_WHERE, pWhereClause); + pDb->WriteSqlLog(sqlStmt); + // Execute the SQL DELETE statement return(execDelete(sqlStmt)); @@ -910,6 +969,8 @@ bool wxTable::DeleteMatching(void) // Build the SQL DELETE statement GetDeleteStmt(sqlStmt, DB_DEL_MATCHING); + pDb->WriteSqlLog(sqlStmt); + // Execute the SQL DELETE statement return(execDelete(sqlStmt)); @@ -1061,10 +1122,10 @@ void wxTable::GetDeleteStmt(char *pSqlStmt, int typeOfDel, char *pWhereClause) * They are not included as part of the where clause. */ -void wxTable::GetWhereClause(char *pWhereClause, int typeOfWhere) +void wxTable::GetWhereClause(char *pWhereClause, int typeOfWhere, char *qualTableName) { bool moreThanOneColumn = FALSE; - wxString colValue; + char colValue[255]; // Loop through the columns building a where clause as you go for (int i = 0; i < noCols; i++) @@ -1082,30 +1143,35 @@ void wxTable::GetWhereClause(char *pWhereClause, int typeOfWhere) else moreThanOneColumn = TRUE; // Concatenate where phrase for the column + if (qualTableName && strlen(qualTableName)) + { + strcat(pWhereClause, qualTableName); + strcat(pWhereClause, "."); + } strcat(pWhereClause, colDefs[i].ColName); strcat(pWhereClause, " = "); switch(colDefs[i].SqlCtype) { case SQL_C_CHAR: - colValue.Printf("'%s'", (UCHAR FAR *) colDefs[i].PtrDataObj); + sprintf(colValue, "'%s'", (UCHAR FAR *) colDefs[i].PtrDataObj); break; case SQL_C_SSHORT: - colValue.Printf("%hi", *((SWORD *) colDefs[i].PtrDataObj)); + sprintf(colValue, "%hi", *((SWORD *) colDefs[i].PtrDataObj)); break; case SQL_C_USHORT: - colValue.Printf("%hu", *((UWORD *) colDefs[i].PtrDataObj)); + sprintf(colValue, "%hu", *((UWORD *) colDefs[i].PtrDataObj)); break; case SQL_C_SLONG: - colValue.Printf("%li", *((SDWORD *) colDefs[i].PtrDataObj)); + sprintf(colValue, "%li", *((SDWORD *) colDefs[i].PtrDataObj)); break; case SQL_C_ULONG: - colValue.Printf("%lu", *((UDWORD *) colDefs[i].PtrDataObj)); + sprintf(colValue, "%lu", *((UDWORD *) colDefs[i].PtrDataObj)); break; case SQL_C_FLOAT: - colValue.Printf("%.6f", *((SFLOAT *) colDefs[i].PtrDataObj)); + sprintf(colValue, "%.6f", *((SFLOAT *) colDefs[i].PtrDataObj)); break; case SQL_C_DOUBLE: - colValue.Printf("%.6f", *((SDOUBLE *) colDefs[i].PtrDataObj)); + sprintf(colValue, "%.6f", *((SDOUBLE *) colDefs[i].PtrDataObj)); break; } strcat(pWhereClause, colValue); @@ -1161,7 +1227,8 @@ bool wxTable::CanSelectForUpdate(void) bool wxTable::CanUpdByROWID(void) { -//@@@@@@glt - returning FALSE for testing purposes, as the ROWID is not getting updated correctly +//NOTE: Returning FALSE for now until this can be debugged, +// as the ROWID is not getting updated correctly return FALSE; if ((! strcmp(pDb->dbInf.dbmsName, "Oracle")) || (! strcmp(pDb->dbInf.dbmsName, "ORACLE"))) @@ -1345,6 +1412,9 @@ ULONG wxTable::Count(void) strcpy(sqlStmt, "SELECT COUNT(*) FROM "); strcat(sqlStmt, queryTableName); + if (from && strlen(from)) + strcat(sqlStmt, from); + // Add the where clause if one is provided if (where && strlen(where)) { @@ -1352,6 +1422,8 @@ ULONG wxTable::Count(void) strcat(sqlStmt, where); } + pDb->WriteSqlLog(sqlStmt); + // Execute the SQL statement if (SQLExecDirect(hstmtCount, (UCHAR FAR *) sqlStmt, SQL_NTS) != SQL_SUCCESS) { @@ -1410,7 +1482,8 @@ bool wxTable::Refresh(void) // based on the key fields. if (SQLGetData(hstmt, noCols+1, SQL_C_CHAR, rowid, ROWID_LEN, &cb) == SQL_SUCCESS) { - strcat(whereClause, "ROWID = '"); + strcat(whereClause, queryTableName); + strcat(whereClause, ".ROWID = '"); strcat(whereClause, rowid); strcat(whereClause, "'"); } @@ -1418,7 +1491,7 @@ bool wxTable::Refresh(void) // If unable to use the ROWID, build a where clause from the keyfields if (strlen(whereClause) == 0) - GetWhereClause(whereClause, DB_WHERE_KEYFIELDS); + GetWhereClause(whereClause, DB_WHERE_KEYFIELDS, queryTableName); // Requery the record where = whereClause; @@ -1442,4 +1515,5 @@ bool wxTable::Refresh(void) } // wxTable::Refresh() #endif - // wxUSE_ODBC + // wxUSE_ODBC + diff --git a/src/common/string.cpp b/src/common/string.cpp index dcd371e0d2..9d05639046 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -1075,6 +1075,19 @@ bool wxString::Matches(const char *pszMask) const return *pszTxt == '\0'; } +// Count the number of chars +int wxString::Freq(char ch) const +{ + int count = 0; + int len = Len(); + for (int i = 0; i < len; i++) + { + if (GetChar(i) == ch) + count ++; + } + return count; +} + // --------------------------------------------------------------------------- // standard C++ library string functions // --------------------------------------------------------------------------- -- 2.45.2