X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/519cb848a8f4c91c73421bb75314754284e593a4..b685cd9bc8c23ead79c462965a8ca9f6f81f9734:/src/common/db.cpp?ds=sidebyside diff --git a/src/common/db.cpp b/src/common/db.cpp index 91f822b736..4063cdc163 100644 --- a/src/common/db.cpp +++ b/src/common/db.cpp @@ -33,11 +33,12 @@ // SYNOPSIS STOP */ +#include "wx/wxprec.h" + // Use this line for wxWindows v1.x //#include "wx_ver.h" // Use this line for wxWindows v2.x #include "wx/version.h" -#include "wx/wxprec.h" #if wxMAJOR_VERSION == 2 #ifdef __GNUG__ @@ -54,10 +55,15 @@ #endif //__BORLANDC__ #if wxMAJOR_VERSION == 2 - #ifndef WX_PRECOMP - #include "wx/string.h" - #endif //WX_PRECOMP + #ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/object.h" + #include "wx/list.h" + #include "wx/utils.h" + #include "wx/msgdlg.h" + #endif #include "wx/filefn.h" + #include "wx/wxchar.h" #endif #if wxMAJOR_VERSION == 1 @@ -86,20 +92,10 @@ DbList WXDLLEXPORT *PtrBegDbList = 0; -#if __WXDEBUG__ > 0 - #if wxMAJOR_VERSION == 2 - #include "wx/object.h" - #include "wx/list.h" - #include "wx/utils.h" - #include "wx/msgdlg.h" - #endif +#ifdef __WXDEBUG__ extern wxList TablesInUse; #endif -#ifdef __MWERKS__ -#define stricmp _stricmp -#define strnicmp _strnicmp -#endif // SQL Log defaults to be used by GetDbConnection enum sqlLog SQLLOGstate = sqlLogOFF; @@ -115,7 +111,7 @@ char SQLLOGfn[DB_PATH_MAX+1] = "sqllog.txt"; char DBerrorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN]; /********** wxDB Constructor **********/ -wxDB::wxDB(HENV &aHenv) +wxDB::wxDB(HENV &aHenv, bool FwdOnlyCursors) { int i; @@ -123,32 +119,32 @@ wxDB::wxDB(HENV &aHenv) sqlLogState = sqlLogOFF; // By default, logging is turned off nTables = 0; - strcpy(sqlState,""); - strcpy(errorMsg,""); + wxStrcpy(sqlState,""); + wxStrcpy(errorMsg,""); nativeError = cbErrorMsg = 0; for (i = 0; i < DB_MAX_ERROR_HISTORY; i++) - strcpy(errorList[i], ""); + wxStrcpy(errorList[i], ""); // Init typeInf structures - strcpy(typeInfVarchar.TypeName,""); + wxStrcpy(typeInfVarchar.TypeName,""); typeInfVarchar.FsqlType = 0; typeInfVarchar.Precision = 0; typeInfVarchar.CaseSensitive = 0; typeInfVarchar.MaximumScale = 0; - strcpy(typeInfInteger.TypeName,""); + wxStrcpy(typeInfInteger.TypeName,""); typeInfInteger.FsqlType = 0; typeInfInteger.Precision = 0; typeInfInteger.CaseSensitive = 0; typeInfInteger.MaximumScale = 0; - strcpy(typeInfFloat.TypeName,""); + wxStrcpy(typeInfFloat.TypeName,""); typeInfFloat.FsqlType = 0; typeInfFloat.Precision = 0; typeInfFloat.CaseSensitive = 0; typeInfFloat.MaximumScale = 0; - strcpy(typeInfDate.TypeName,""); + wxStrcpy(typeInfDate.TypeName,""); typeInfDate.FsqlType = 0; typeInfDate.Precision = 0; typeInfDate.CaseSensitive = 0; @@ -159,6 +155,7 @@ wxDB::wxDB(HENV &aHenv) // Copy the HENV into the db class henv = aHenv; + fwdOnlyCursors = FwdOnlyCursors; // Allocate a data source connection handle if (SQLAllocConnect(henv, &hdbc) != SQL_SUCCESS) @@ -175,27 +172,26 @@ wxDB::wxDB(HENV &aHenv) /********** wxDB::Open() **********/ bool wxDB::Open(char *Dsn, char *Uid, char *AuthStr) { - assert(Dsn && strlen(Dsn)); + assert(Dsn && wxStrlen(Dsn)); dsn = Dsn; uid = Uid; authStr = AuthStr; RETCODE retcode; -#ifndef FWD_ONLY_CURSORS - - // Specify that the ODBC cursor library be used, if needed. This must be - // specified before the connection is made. - retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED); + if (!FwdOnlyCursors()) + { + // Specify that the ODBC cursor library be used, if needed. This must be + // specified before the connection is made. + retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED); - #ifdef DBDEBUG_CONSOLE +#ifdef DBDEBUG_CONSOLE if (retcode == SQL_SUCCESS) cout << "SQLSetConnectOption(CURSOR_LIB) successful" << endl; else cout << "SQLSetConnectOption(CURSOR_LIB) failed" << endl; - #endif - #endif + } // Connect to the data source retcode = SQLConnect(hdbc, (UCHAR FAR *) Dsn, SQL_NTS, @@ -767,7 +763,7 @@ void wxDB::Close(void) // There should be zero Ctable objects still connected to this db object assert(nTables == 0); -#if __WXDEBUG__ > 0 +#ifdef __WXDEBUG__ CstructTablesInUse *tiu; wxNode *pNode; pNode = TablesInUse.First(); @@ -789,7 +785,7 @@ void wxDB::Close(void) // Copy the error messages to a global variable int i; for (i = 0; i < DB_MAX_ERROR_HISTORY; i++) - strcpy(DBerrorList[i],errorList[i]); + wxStrcpy(DBerrorList[i],errorList[i]); } // wxDB::Close() @@ -879,9 +875,9 @@ void wxDB::DispNextError(void) } // wxDB::DispNextError() /********** wxDB::logError() **********/ -void wxDB::logError(char *errMsg, char *SQLState) +void wxDB::logError(const char *errMsg, const char *SQLState) { - assert(errMsg && strlen(errMsg)); + assert(errMsg && wxStrlen(errMsg)); static int pLast = -1; int dbStatus; @@ -890,13 +886,13 @@ void wxDB::logError(char *errMsg, char *SQLState) { int i; for (i = 0; i < DB_MAX_ERROR_HISTORY; i++) - strcpy(errorList[i], errorList[i+1]); + wxStrcpy(errorList[i], errorList[i+1]); pLast--; } - strcpy(errorList[pLast], errMsg); + wxStrcpy(errorList[pLast], errMsg); - if (SQLState && strlen(SQLState)) + if (SQLState && wxStrlen(SQLState)) if ((dbStatus = TranslateSqlState(SQLState)) != DB_ERR_FUNCTION_SEQUENCE_ERROR) DB_STATUS = dbStatus; @@ -906,185 +902,185 @@ void wxDB::logError(char *errMsg, char *SQLState) } // wxDB::logError() /**********wxDB::TranslateSqlState() **********/ -int wxDB::TranslateSqlState(char *SQLState) +int wxDB::TranslateSqlState(const char *SQLState) { - if (!strcmp(SQLState, "01000")) + if (!wxStrcmp(SQLState, "01000")) return(DB_ERR_GENERAL_WARNING); - if (!strcmp(SQLState, "01002")) + if (!wxStrcmp(SQLState, "01002")) return(DB_ERR_DISCONNECT_ERROR); - if (!strcmp(SQLState, "01004")) + if (!wxStrcmp(SQLState, "01004")) return(DB_ERR_DATA_TRUNCATED); - if (!strcmp(SQLState, "01006")) + if (!wxStrcmp(SQLState, "01006")) return(DB_ERR_PRIV_NOT_REVOKED); - if (!strcmp(SQLState, "01S00")) + if (!wxStrcmp(SQLState, "01S00")) return(DB_ERR_INVALID_CONN_STR_ATTR); - if (!strcmp(SQLState, "01S01")) + if (!wxStrcmp(SQLState, "01S01")) return(DB_ERR_ERROR_IN_ROW); - if (!strcmp(SQLState, "01S02")) + if (!wxStrcmp(SQLState, "01S02")) return(DB_ERR_OPTION_VALUE_CHANGED); - if (!strcmp(SQLState, "01S03")) + if (!wxStrcmp(SQLState, "01S03")) return(DB_ERR_NO_ROWS_UPD_OR_DEL); - if (!strcmp(SQLState, "01S04")) + if (!wxStrcmp(SQLState, "01S04")) return(DB_ERR_MULTI_ROWS_UPD_OR_DEL); - if (!strcmp(SQLState, "07001")) + if (!wxStrcmp(SQLState, "07001")) return(DB_ERR_WRONG_NO_OF_PARAMS); - if (!strcmp(SQLState, "07006")) + if (!wxStrcmp(SQLState, "07006")) return(DB_ERR_DATA_TYPE_ATTR_VIOL); - if (!strcmp(SQLState, "08001")) + if (!wxStrcmp(SQLState, "08001")) return(DB_ERR_UNABLE_TO_CONNECT); - if (!strcmp(SQLState, "08002")) + if (!wxStrcmp(SQLState, "08002")) return(DB_ERR_CONNECTION_IN_USE); - if (!strcmp(SQLState, "08003")) + if (!wxStrcmp(SQLState, "08003")) return(DB_ERR_CONNECTION_NOT_OPEN); - if (!strcmp(SQLState, "08004")) + if (!wxStrcmp(SQLState, "08004")) return(DB_ERR_REJECTED_CONNECTION); - if (!strcmp(SQLState, "08007")) + if (!wxStrcmp(SQLState, "08007")) return(DB_ERR_CONN_FAIL_IN_TRANS); - if (!strcmp(SQLState, "08S01")) + if (!wxStrcmp(SQLState, "08S01")) return(DB_ERR_COMM_LINK_FAILURE); - if (!strcmp(SQLState, "21S01")) + if (!wxStrcmp(SQLState, "21S01")) return(DB_ERR_INSERT_VALUE_LIST_MISMATCH); - if (!strcmp(SQLState, "21S02")) + if (!wxStrcmp(SQLState, "21S02")) return(DB_ERR_DERIVED_TABLE_MISMATCH); - if (!strcmp(SQLState, "22001")) + if (!wxStrcmp(SQLState, "22001")) return(DB_ERR_STRING_RIGHT_TRUNC); - if (!strcmp(SQLState, "22003")) + if (!wxStrcmp(SQLState, "22003")) return(DB_ERR_NUMERIC_VALUE_OUT_OF_RNG); - if (!strcmp(SQLState, "22005")) + if (!wxStrcmp(SQLState, "22005")) return(DB_ERR_ERROR_IN_ASSIGNMENT); - if (!strcmp(SQLState, "22008")) + if (!wxStrcmp(SQLState, "22008")) return(DB_ERR_DATETIME_FLD_OVERFLOW); - if (!strcmp(SQLState, "22012")) + if (!wxStrcmp(SQLState, "22012")) return(DB_ERR_DIVIDE_BY_ZERO); - if (!strcmp(SQLState, "22026")) + if (!wxStrcmp(SQLState, "22026")) return(DB_ERR_STR_DATA_LENGTH_MISMATCH); - if (!strcmp(SQLState, "23000")) + if (!wxStrcmp(SQLState, "23000")) return(DB_ERR_INTEGRITY_CONSTRAINT_VIOL); - if (!strcmp(SQLState, "24000")) + if (!wxStrcmp(SQLState, "24000")) return(DB_ERR_INVALID_CURSOR_STATE); - if (!strcmp(SQLState, "25000")) + if (!wxStrcmp(SQLState, "25000")) return(DB_ERR_INVALID_TRANS_STATE); - if (!strcmp(SQLState, "28000")) + if (!wxStrcmp(SQLState, "28000")) return(DB_ERR_INVALID_AUTH_SPEC); - if (!strcmp(SQLState, "34000")) + if (!wxStrcmp(SQLState, "34000")) return(DB_ERR_INVALID_CURSOR_NAME); - if (!strcmp(SQLState, "37000")) + if (!wxStrcmp(SQLState, "37000")) return(DB_ERR_SYNTAX_ERROR_OR_ACCESS_VIOL); - if (!strcmp(SQLState, "3C000")) + if (!wxStrcmp(SQLState, "3C000")) return(DB_ERR_DUPLICATE_CURSOR_NAME); - if (!strcmp(SQLState, "40001")) + if (!wxStrcmp(SQLState, "40001")) return(DB_ERR_SERIALIZATION_FAILURE); - if (!strcmp(SQLState, "42000")) + if (!wxStrcmp(SQLState, "42000")) return(DB_ERR_SYNTAX_ERROR_OR_ACCESS_VIOL2); - if (!strcmp(SQLState, "70100")) + if (!wxStrcmp(SQLState, "70100")) return(DB_ERR_OPERATION_ABORTED); - if (!strcmp(SQLState, "IM001")) + if (!wxStrcmp(SQLState, "IM001")) return(DB_ERR_UNSUPPORTED_FUNCTION); - if (!strcmp(SQLState, "IM002")) + if (!wxStrcmp(SQLState, "IM002")) return(DB_ERR_NO_DATA_SOURCE); - if (!strcmp(SQLState, "IM003")) + if (!wxStrcmp(SQLState, "IM003")) return(DB_ERR_DRIVER_LOAD_ERROR); - if (!strcmp(SQLState, "IM004")) + if (!wxStrcmp(SQLState, "IM004")) return(DB_ERR_SQLALLOCENV_FAILED); - if (!strcmp(SQLState, "IM005")) + if (!wxStrcmp(SQLState, "IM005")) return(DB_ERR_SQLALLOCCONNECT_FAILED); - if (!strcmp(SQLState, "IM006")) + if (!wxStrcmp(SQLState, "IM006")) return(DB_ERR_SQLSETCONNECTOPTION_FAILED); - if (!strcmp(SQLState, "IM007")) + if (!wxStrcmp(SQLState, "IM007")) return(DB_ERR_NO_DATA_SOURCE_DLG_PROHIB); - if (!strcmp(SQLState, "IM008")) + if (!wxStrcmp(SQLState, "IM008")) return(DB_ERR_DIALOG_FAILED); - if (!strcmp(SQLState, "IM009")) + if (!wxStrcmp(SQLState, "IM009")) return(DB_ERR_UNABLE_TO_LOAD_TRANSLATION_DLL); - if (!strcmp(SQLState, "IM010")) + if (!wxStrcmp(SQLState, "IM010")) return(DB_ERR_DATA_SOURCE_NAME_TOO_LONG); - if (!strcmp(SQLState, "IM011")) + if (!wxStrcmp(SQLState, "IM011")) return(DB_ERR_DRIVER_NAME_TOO_LONG); - if (!strcmp(SQLState, "IM012")) + if (!wxStrcmp(SQLState, "IM012")) return(DB_ERR_DRIVER_KEYWORD_SYNTAX_ERROR); - if (!strcmp(SQLState, "IM013")) + if (!wxStrcmp(SQLState, "IM013")) return(DB_ERR_TRACE_FILE_ERROR); - if (!strcmp(SQLState, "S0001")) + if (!wxStrcmp(SQLState, "S0001")) return(DB_ERR_TABLE_OR_VIEW_ALREADY_EXISTS); - if (!strcmp(SQLState, "S0002")) + if (!wxStrcmp(SQLState, "S0002")) return(DB_ERR_TABLE_NOT_FOUND); - if (!strcmp(SQLState, "S0011")) + if (!wxStrcmp(SQLState, "S0011")) return(DB_ERR_INDEX_ALREADY_EXISTS); - if (!strcmp(SQLState, "S0012")) + if (!wxStrcmp(SQLState, "S0012")) return(DB_ERR_INDEX_NOT_FOUND); - if (!strcmp(SQLState, "S0021")) + if (!wxStrcmp(SQLState, "S0021")) return(DB_ERR_COLUMN_ALREADY_EXISTS); - if (!strcmp(SQLState, "S0022")) + if (!wxStrcmp(SQLState, "S0022")) return(DB_ERR_COLUMN_NOT_FOUND); - if (!strcmp(SQLState, "S0023")) + if (!wxStrcmp(SQLState, "S0023")) return(DB_ERR_NO_DEFAULT_FOR_COLUMN); - if (!strcmp(SQLState, "S1000")) + if (!wxStrcmp(SQLState, "S1000")) return(DB_ERR_GENERAL_ERROR); - if (!strcmp(SQLState, "S1001")) + if (!wxStrcmp(SQLState, "S1001")) return(DB_ERR_MEMORY_ALLOCATION_FAILURE); - if (!strcmp(SQLState, "S1002")) + if (!wxStrcmp(SQLState, "S1002")) return(DB_ERR_INVALID_COLUMN_NUMBER); - if (!strcmp(SQLState, "S1003")) + if (!wxStrcmp(SQLState, "S1003")) return(DB_ERR_PROGRAM_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1004")) + if (!wxStrcmp(SQLState, "S1004")) return(DB_ERR_SQL_DATA_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1008")) + if (!wxStrcmp(SQLState, "S1008")) return(DB_ERR_OPERATION_CANCELLED); - if (!strcmp(SQLState, "S1009")) + if (!wxStrcmp(SQLState, "S1009")) return(DB_ERR_INVALID_ARGUMENT_VALUE); - if (!strcmp(SQLState, "S1010")) + if (!wxStrcmp(SQLState, "S1010")) return(DB_ERR_FUNCTION_SEQUENCE_ERROR); - if (!strcmp(SQLState, "S1011")) + if (!wxStrcmp(SQLState, "S1011")) return(DB_ERR_OPERATION_INVALID_AT_THIS_TIME); - if (!strcmp(SQLState, "S1012")) + if (!wxStrcmp(SQLState, "S1012")) return(DB_ERR_INVALID_TRANS_OPERATION_CODE); - if (!strcmp(SQLState, "S1015")) + if (!wxStrcmp(SQLState, "S1015")) return(DB_ERR_NO_CURSOR_NAME_AVAIL); - if (!strcmp(SQLState, "S1090")) + if (!wxStrcmp(SQLState, "S1090")) return(DB_ERR_INVALID_STR_OR_BUF_LEN); - if (!strcmp(SQLState, "S1091")) + if (!wxStrcmp(SQLState, "S1091")) return(DB_ERR_DESCRIPTOR_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1092")) + if (!wxStrcmp(SQLState, "S1092")) return(DB_ERR_OPTION_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1093")) + if (!wxStrcmp(SQLState, "S1093")) return(DB_ERR_INVALID_PARAM_NO); - if (!strcmp(SQLState, "S1094")) + if (!wxStrcmp(SQLState, "S1094")) return(DB_ERR_INVALID_SCALE_VALUE); - if (!strcmp(SQLState, "S1095")) + if (!wxStrcmp(SQLState, "S1095")) return(DB_ERR_FUNCTION_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1096")) + if (!wxStrcmp(SQLState, "S1096")) return(DB_ERR_INF_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1097")) + if (!wxStrcmp(SQLState, "S1097")) return(DB_ERR_COLUMN_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1098")) + if (!wxStrcmp(SQLState, "S1098")) return(DB_ERR_SCOPE_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1099")) + if (!wxStrcmp(SQLState, "S1099")) return(DB_ERR_NULLABLE_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1100")) + if (!wxStrcmp(SQLState, "S1100")) return(DB_ERR_UNIQUENESS_OPTION_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1101")) + if (!wxStrcmp(SQLState, "S1101")) return(DB_ERR_ACCURACY_OPTION_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1103")) + if (!wxStrcmp(SQLState, "S1103")) return(DB_ERR_DIRECTION_OPTION_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1104")) + if (!wxStrcmp(SQLState, "S1104")) return(DB_ERR_INVALID_PRECISION_VALUE); - if (!strcmp(SQLState, "S1105")) + if (!wxStrcmp(SQLState, "S1105")) return(DB_ERR_INVALID_PARAM_TYPE); - if (!strcmp(SQLState, "S1106")) + if (!wxStrcmp(SQLState, "S1106")) return(DB_ERR_FETCH_TYPE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1107")) + if (!wxStrcmp(SQLState, "S1107")) return(DB_ERR_ROW_VALUE_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1108")) + if (!wxStrcmp(SQLState, "S1108")) return(DB_ERR_CONCURRENCY_OPTION_OUT_OF_RANGE); - if (!strcmp(SQLState, "S1109")) + if (!wxStrcmp(SQLState, "S1109")) return(DB_ERR_INVALID_CURSOR_POSITION); - if (!strcmp(SQLState, "S1110")) + if (!wxStrcmp(SQLState, "S1110")) return(DB_ERR_INVALID_DRIVER_COMPLETION); - if (!strcmp(SQLState, "S1111")) + if (!wxStrcmp(SQLState, "S1111")) return(DB_ERR_INVALID_BOOKMARK_VALUE); - if (!strcmp(SQLState, "S1C00")) + if (!wxStrcmp(SQLState, "S1C00")) return(DB_ERR_DRIVER_NOT_CAPABLE); - if (!strcmp(SQLState, "S1T00")) + if (!wxStrcmp(SQLState, "S1T00")) return(DB_ERR_TIMEOUT_EXPIRED); // No match @@ -1093,46 +1089,46 @@ int wxDB::TranslateSqlState(char *SQLState) } // wxDB::TranslateSqlState() /********** wxDB::Grant() **********/ -bool wxDB::Grant(int privileges, char *tableName, char *userList) +bool wxDB::Grant(int privileges, const char *tableName, const char *userList) { char sqlStmt[DB_MAX_STATEMENT_LEN]; // Build the grant statement - strcpy(sqlStmt, "GRANT "); + wxStrcpy(sqlStmt, "GRANT "); if (privileges == DB_GRANT_ALL) - strcat(sqlStmt, "ALL"); + wxStrcat(sqlStmt, "ALL"); else { int c = 0; if (privileges & DB_GRANT_SELECT) { - strcat(sqlStmt, "SELECT"); + wxStrcat(sqlStmt, "SELECT"); c++; } if (privileges & DB_GRANT_INSERT) { if (c++) - strcat(sqlStmt, ", "); - strcat(sqlStmt, "INSERT"); + wxStrcat(sqlStmt, ", "); + wxStrcat(sqlStmt, "INSERT"); } if (privileges & DB_GRANT_UPDATE) { if (c++) - strcat(sqlStmt, ", "); - strcat(sqlStmt, "UPDATE"); + wxStrcat(sqlStmt, ", "); + wxStrcat(sqlStmt, "UPDATE"); } if (privileges & DB_GRANT_DELETE) { if (c++) - strcat(sqlStmt, ", "); - strcat(sqlStmt, "DELETE"); + wxStrcat(sqlStmt, ", "); + wxStrcat(sqlStmt, "DELETE"); } } - strcat(sqlStmt, " ON "); - strcat(sqlStmt, tableName); - strcat(sqlStmt, " TO "); - strcat(sqlStmt, userList); + wxStrcat(sqlStmt, " ON "); + wxStrcat(sqlStmt, tableName); + wxStrcat(sqlStmt, " TO "); + wxStrcat(sqlStmt, userList); #ifdef DBDEBUG_CONSOLE cout << endl << sqlStmt << endl; @@ -1145,7 +1141,7 @@ bool wxDB::Grant(int privileges, char *tableName, char *userList) } // wxDB::Grant() /********** wxDB::CreateView() **********/ -bool wxDB::CreateView(char *viewName, char *colList, char *pSqlStmt, bool attemptDrop) +bool wxDB::CreateView(const char *viewName, const char *colList, const char *pSqlStmt, bool attemptDrop) { char sqlStmt[DB_MAX_STATEMENT_LEN]; @@ -1154,18 +1150,18 @@ bool wxDB::CreateView(char *viewName, char *colList, char *pSqlStmt, bool attemp return FALSE; // Build the create view statement - strcpy(sqlStmt, "CREATE VIEW "); - strcat(sqlStmt, viewName); + wxStrcpy(sqlStmt, "CREATE VIEW "); + wxStrcat(sqlStmt, viewName); - if (strlen(colList)) + if (wxStrlen(colList)) { - strcat(sqlStmt, " ("); - strcat(sqlStmt, colList); - strcat(sqlStmt, ")"); + wxStrcat(sqlStmt, " ("); + wxStrcat(sqlStmt, colList); + wxStrcat(sqlStmt, ")"); } - strcat(sqlStmt, " AS "); - strcat(sqlStmt, pSqlStmt); + wxStrcat(sqlStmt, " AS "); + wxStrcat(sqlStmt, pSqlStmt); WriteSqlLog(sqlStmt); @@ -1178,7 +1174,7 @@ bool wxDB::CreateView(char *viewName, char *colList, char *pSqlStmt, bool attemp } // wxDB::CreateView() /********** wxDB::DropView() **********/ -bool wxDB::DropView(char *viewName) +bool wxDB::DropView(const char *viewName) { // NOTE: This function returns TRUE if the View does not exist, but // only for identified databases. Code will need to be added @@ -1199,10 +1195,10 @@ bool wxDB::DropView(char *viewName) { // Check for "Base table not found" error and ignore GetNextError(henv, hdbc, hstmt); - if (strcmp(sqlState,"S0002")) // "Base table not found" + if (wxStrcmp(sqlState,"S0002")) // "Base table not found" { // Check for product specific error codes - if (!((Dbms() == dbmsSYBASE_ASA && !strcmp(sqlState,"42000")))) // 5.x (and lower?) + if (!((Dbms() == dbmsSYBASE_ASA && !wxStrcmp(sqlState,"42000")))) // 5.x (and lower?) { DispNextError(); DispAllErrors(henv, hdbc, hstmt); @@ -1222,7 +1218,7 @@ bool wxDB::DropView(char *viewName) /********** wxDB::ExecSql() **********/ -bool wxDB::ExecSql(char *pSqlStmt) +bool wxDB::ExecSql(const char *pSqlStmt) { SQLFreeStmt(hstmt, SQL_CLOSE); if (SQLExecDirect(hstmt, (UCHAR FAR *) pSqlStmt, SQL_NTS) == SQL_SUCCESS) @@ -1282,36 +1278,34 @@ bool wxDB::GetData(UWORD colNo, SWORD cType, PTR pData, SDWORD maxLen, SDWORD FA * delete [] colInf; * } */ -CcolInf *wxDB::GetColumns(char *tableName[], char *userID) +CcolInf *wxDB::GetColumns(char *tableName[], const char *userID) { - UINT noCols = 0; - UINT colNo = 0; + UINT noCols = 0; + UINT colNo = 0; CcolInf *colInf = 0; - RETCODE retcode; - SDWORD cb; - char tblName[DB_MAX_TABLE_NAME_LEN+1]; - char colName[DB_MAX_COLUMN_NAME_LEN+1]; - SWORD sqlDataType; - char userIdUC[80+1]; - char tableNameUC[DB_MAX_TABLE_NAME_LEN+1]; - if (!userID || !strlen(userID)) - userID = uid; + RETCODE retcode; + SDWORD cb; + char tblName[DB_MAX_TABLE_NAME_LEN+1]; + char colName[DB_MAX_COLUMN_NAME_LEN+1]; + SWORD sqlDataType; + + wxString UserID; + wxString TableName; + + if (!userID || !wxStrlen(userID)) + UserID = uid; + else + UserID = userID; // dBase does not use user names, and some drivers fail if you try to pass one if (Dbms() == dbmsDBASE) - userID = ""; + UserID = ""; // Oracle user names may only be in uppercase, so force // the name to uppercase if (Dbms() == dbmsORACLE) - { - int i = 0; - for (char *p = userID; *p; p++) - userIdUC[i++] = toupper(*p); - userIdUC[i] = 0; - userID = userIdUC; - } + UserID = UserID.Upper(); // Pass 1 - Determine how many columns there are. // Pass 2 - Allocate the CcolInf array and fill in @@ -1328,38 +1322,32 @@ CcolInf *wxDB::GetColumns(char *tableName[], char *userID) if (!colInf) break; // Mark the end of the array - strcpy(colInf[noCols].tableName, ""); - strcpy(colInf[noCols].colName, ""); + wxStrcpy(colInf[noCols].tableName, ""); + wxStrcpy(colInf[noCols].colName, ""); colInf[noCols].sqlDataType = 0; } // Loop through each table name int tbl; for (tbl = 0; tableName[tbl]; tbl++) { + TableName = tableName[tbl]; // Oracle table names are uppercase only, so force // the name to uppercase just in case programmer forgot to do this if (Dbms() == dbmsORACLE) - { - int i = 0; - for (char *p = tableName[tbl]; *p; p++) - tableNameUC[i++] = toupper(*p); - tableNameUC[i] = 0; - } - else - sprintf(tableNameUC,tableName[tbl]); + TableName = TableName.Upper(); SQLFreeStmt(hstmt, SQL_CLOSE); // MySQL and Access cannot accept a user name when looking up column names, so we // use the call below that leaves out the user name - if (strcmp(userID,"") && + if (wxStrcmp(UserID.GetData(),"") && Dbms() != dbmsMY_SQL && Dbms() != dbmsACCESS) { retcode = SQLColumns(hstmt, NULL, 0, // All qualifiers - (UCHAR *) userID, SQL_NTS, // Owner - (UCHAR *) tableNameUC, SQL_NTS, + (UCHAR *) UserID.GetData(), SQL_NTS, // Owner + (UCHAR *) TableName.GetData(), SQL_NTS, NULL, 0); // All columns } else @@ -1367,7 +1355,7 @@ CcolInf *wxDB::GetColumns(char *tableName[], char *userID) retcode = SQLColumns(hstmt, NULL, 0, // All qualifiers NULL, 0, // Owner - (UCHAR *) tableNameUC, SQL_NTS, + (UCHAR *) TableName.GetData(), SQL_NTS, NULL, 0); // All columns } if (retcode != SQL_SUCCESS) @@ -1379,8 +1367,8 @@ CcolInf *wxDB::GetColumns(char *tableName[], char *userID) SQLFreeStmt(hstmt, SQL_CLOSE); return(0); } - SQLBindCol(hstmt, 3, SQL_C_CHAR, (UCHAR*) tblName, DB_MAX_TABLE_NAME_LEN+1, &cb); - SQLBindCol(hstmt, 4, SQL_C_CHAR, (UCHAR*) colName, DB_MAX_COLUMN_NAME_LEN+1, &cb); + SQLBindCol(hstmt, 3, SQL_C_CHAR, (UCHAR*) tblName, DB_MAX_TABLE_NAME_LEN+1, &cb); + SQLBindCol(hstmt, 4, SQL_C_CHAR, (UCHAR*) colName, DB_MAX_COLUMN_NAME_LEN+1, &cb); SQLBindCol(hstmt, 5, SQL_C_SSHORT, (UCHAR*) &sqlDataType, 0, &cb); while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS) { @@ -1390,8 +1378,8 @@ CcolInf *wxDB::GetColumns(char *tableName[], char *userID) { if (colNo < noCols) // Some extra error checking to prevent memory overwrites { - strcpy(colInf[colNo].tableName, tblName); - strcpy(colInf[colNo].colName, colName); + wxStrcpy(colInf[colNo].tableName, tblName); + wxStrcpy(colInf[colNo].colName, colName); colInf[colNo].sqlDataType = sqlDataType; colNo++; } @@ -1417,9 +1405,9 @@ CcolInf *wxDB::GetColumns(char *tableName[], char *userID) /********** wxDB::Catalog() **********/ -bool wxDB::Catalog(char *userID, char *fileName) +bool wxDB::Catalog(const char *userID, const char *fileName) { - assert(fileName && strlen(fileName)); + assert(fileName && wxStrlen(fileName)); RETCODE retcode; SDWORD cb; @@ -1430,32 +1418,29 @@ bool wxDB::Catalog(char *userID, char *fileName) char typeName[30+1]; SWORD precision, length; + wxString UserID; + FILE *fp = fopen(fileName,"wt"); if (fp == NULL) return(FALSE); SQLFreeStmt(hstmt, SQL_CLOSE); - if (!userID || !strlen(userID)) - userID = uid; + if (!userID || !wxStrlen(userID)) + UserID = uid; + else + UserID = userID; - char userIdUC[80+1]; // Oracle user names may only be in uppercase, so force // the name to uppercase if (Dbms() == dbmsORACLE) - { - int i = 0; - for (char *p = userID; *p; p++) - userIdUC[i++] = toupper(*p); - userIdUC[i] = 0; - userID = userIdUC; - } + UserID = UserID.Upper(); - if (strcmp(userID,"")) + if (wxStrcmp(UserID.GetData(),"")) { retcode = SQLColumns(hstmt, NULL, 0, // All qualifiers - (UCHAR *) userID, SQL_NTS, // User specified + (UCHAR *) UserID.GetData(), SQL_NTS, // User specified NULL, 0, // All tables NULL, 0); // All columns } @@ -1482,12 +1467,12 @@ bool wxDB::Catalog(char *userID, char *fileName) SQLBindCol(hstmt, 8, SQL_C_SSHORT, (UCHAR*) &length, 0, &cb); char outStr[256]; - strcpy(tblNameSave,""); + wxStrcpy(tblNameSave,""); int cnt = 0; while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS) { - if (strcmp(tblName,tblNameSave)) + if (wxStrcmp(tblName,tblNameSave)) { if (cnt) fputs("\n", fp); @@ -1504,7 +1489,7 @@ bool wxDB::Catalog(char *userID, char *fileName) fputs("===================== ", fp); fputs("========= ", fp); fputs("=========\n", fp); - strcpy(tblNameSave,tblName); + wxStrcpy(tblNameSave,tblName); } sprintf(outStr, "%-32s %-32s (%04d)%-15s %9d %9d\n", tblName, colName, sqlDataType, typeName, precision, length); @@ -1534,72 +1519,64 @@ bool wxDB::Catalog(char *userID, char *fileName) // 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 // on the table. -bool wxDB::TableExists(char *tableName, char *userID, char *tablePath) +bool wxDB::TableExists(const char *tableName, const char *userID, const char *tablePath) { - assert(tableName && strlen(tableName)); + wxString UserID; + wxString TableName; + + assert(tableName && wxStrlen(tableName)); if (Dbms() == dbmsDBASE) { wxString dbName; - if (tablePath && strlen(tablePath)) + if (tablePath && wxStrlen(tablePath)) dbName.sprintf("%s/%s.dbf",tablePath,tableName); else dbName.sprintf("%s.dbf",tableName); - bool glt; - glt = wxFileExists(dbName.GetData()); - return glt; + + bool exists; + exists = wxFileExists(dbName.GetData()); + return exists; } - if (!userID || !strlen(userID)) - userID = uid; + if (!userID || !wxStrlen(userID)) + UserID = uid; + else + UserID = userID; - char userIdUC[80+1]; // Oracle user names may only be in uppercase, so force // the name to uppercase if (Dbms() == dbmsORACLE) - { - int i = 0; - for (char *p = userID; *p; p++) - userIdUC[i++] = toupper(*p); - userIdUC[i] = 0; - userID = userIdUC; - } + UserID = UserID.Upper(); - char tableNameUC[DB_MAX_TABLE_NAME_LEN+1]; + TableName = tableName; // Oracle table names are uppercase only, so force // the name to uppercase just in case programmer forgot to do this if (Dbms() == dbmsORACLE) - { - int i = 0; - for (char *p = tableName; *p; p++) - tableNameUC[i++] = toupper(*p); - tableNameUC[i] = 0; - } - else - sprintf(tableNameUC,tableName); + TableName = TableName.Upper(); SQLFreeStmt(hstmt, SQL_CLOSE); RETCODE retcode; // MySQL and Access cannot accept a user name when looking up table names, so we // use the call below that leaves out the user name - if (strcmp(userID,"") && + if (wxStrcmp(UserID,"") && Dbms() != dbmsMY_SQL && Dbms() != dbmsACCESS) { retcode = SQLTables(hstmt, - NULL, 0, // All qualifiers - (UCHAR *) userID, SQL_NTS, // All owners - (UCHAR FAR *)tableNameUC, SQL_NTS, - NULL, 0); // All table types + NULL, 0, // All qualifiers + (UCHAR *) UserID.GetData(), SQL_NTS, // All owners + (UCHAR FAR *)TableName.GetData(), SQL_NTS, + NULL, 0); // All table types } else { retcode = SQLTables(hstmt, - NULL, 0, // All qualifiers - NULL, 0, // All owners - (UCHAR FAR *)tableNameUC, SQL_NTS, - NULL, 0); // All table types + NULL, 0, // All qualifiers + NULL, 0, // All owners + (UCHAR FAR *)TableName.GetData(), SQL_NTS, + NULL, 0); // All table types } if (retcode != SQL_SUCCESS) return(DispAllErrors(henv, hdbc, hstmt)); @@ -1618,7 +1595,7 @@ bool wxDB::TableExists(char *tableName, char *userID, char *tablePath) /********** wxDB::SqlLog() **********/ -bool wxDB::SqlLog(enum sqlLog state, char *filename, bool append) +bool wxDB::SqlLog(enum sqlLog state, const char *filename, bool append) { assert(state == sqlLogON || state == sqlLogOFF); assert(state == sqlLogOFF || filename); @@ -1649,7 +1626,7 @@ bool wxDB::SqlLog(enum sqlLog state, char *filename, bool append) /********** wxDB::WriteSqlLog() **********/ -bool wxDB::WriteSqlLog(char *logMsg) +bool wxDB::WriteSqlLog(const char *logMsg) { assert(logMsg); @@ -1711,29 +1688,42 @@ bool wxDB::WriteSqlLog(char *logMsg) */ DBMS wxDB::Dbms(void) { - if (!strnicmp(dbInf.dbmsName,"Oracle",6)) - return(dbmsORACLE); - if (!stricmp(dbInf.dbmsName,"Adaptive Server Anywhere")) + wxChar baseName[25+1]; + + wxStrncpy(baseName,dbInf.dbmsName,25); + if (!wxStricmp(dbInf.dbmsName,"Adaptive Server Anywhere")) return(dbmsSYBASE_ASA); - if (!stricmp(dbInf.dbmsName,"SQL Server")) // Sybase Adaptive Server Enterprise + if (!wxStricmp(dbInf.dbmsName,"SQL Server")) // Sybase Adaptive Server return(dbmsSYBASE_ASE); - if (!stricmp(dbInf.dbmsName,"Microsoft SQL Server")) + if (!wxStricmp(dbInf.dbmsName,"Microsoft SQL Server")) return(dbmsMS_SQL_SERVER); - if (!stricmp(dbInf.dbmsName,"MySQL")) + if (!wxStricmp(dbInf.dbmsName,"MySQL")) return(dbmsMY_SQL); - if (!stricmp(dbInf.dbmsName,"PostgreSQL")) // v6.5.0 + if (!wxStricmp(dbInf.dbmsName,"PostgreSQL")) // v6.5.0 return(dbmsPOSTGRES); - if (!stricmp(dbInf.dbmsName,"ACCESS")) + + baseName[8] = 0; + if (!wxStricmp(baseName,"Informix")) + return(dbmsINFORMIX); + + baseName[6] = 0; + if (!wxStricmp(baseName,"Oracle")) + return(dbmsORACLE); + if (!wxStricmp(dbInf.dbmsName,"ACCESS")) return(dbmsACCESS); - if (!strnicmp(dbInf.dbmsName,"DBASE",5)) + if (!wxStricmp(dbInf.dbmsName,"MySQL")) + return(dbmsMY_SQL); + + baseName[5] = 0; + if (!wxStricmp(baseName,"DBASE")) return(dbmsDBASE); - return(dbmsUNIDENTIFIED); + return(dbmsUNIDENTIFIED); } // wxDB::Dbms() /********** GetDbConnection() **********/ -wxDB WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff) +wxDB WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors) { DbList *pList; @@ -1743,7 +1733,7 @@ wxDB WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff) { // The database connection must be for the same datasource // name and must currently not be in use. - if (pList->Free && (! strcmp(pDbStuff->Dsn, pList->Dsn))) // Found a free connection + if (pList->Free && (! wxStrcmp(pDbStuff->Dsn, pList->Dsn))) // Found a free connection { pList->Free = FALSE; return(pList->PtrDb); @@ -1771,8 +1761,8 @@ wxDB WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff) // Initialize new node in the linked list pList->PtrNext = 0; pList->Free = FALSE; - strcpy(pList->Dsn, pDbStuff->Dsn); - pList->PtrDb = new wxDB(pDbStuff->Henv); + wxStrcpy(pList->Dsn, pDbStuff->Dsn); + pList->PtrDb = new wxDB(pDbStuff->Henv,FwdOnlyCursors); // Connect to the datasource if (pList->PtrDb->Open(pDbStuff->Dsn, pDbStuff->Uid, pDbStuff->AuthStr)) @@ -1863,14 +1853,14 @@ bool SqlLog(enum sqlLog state, char *filename) } SQLLOGstate = state; - strcpy(SQLLOGfn,filename); + wxStrcpy(SQLLOGfn,filename); return(TRUE); } // SqlLog() /********** GetDataSource() **********/ -bool GetDataSource(HENV henv, char *Dsn, SWORD DsnMax, char *DsDesc, SWORD DsDescMax, +bool GetDataSource(HENV henv, const char *Dsn, SWORD DsnMax, const char *DsDesc, SWORD DsDescMax, UWORD direction) { SWORD cb;