// will overwrite the errors of the previously destroyed wxDb object in
// this variable. NOTE: This occurs during a CLOSE, not a FREEing of the
// connection
-wxChar DBerrorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN];
+wxChar DBerrorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN+1];
// This type defines the return row-struct form
// Initialize the ODBC Environment for Database Operations
if (SQLAllocEnv(&Henv) != SQL_SUCCESS)
{
- wxLogDebug(wxT("A problem occured while trying to get a connection to the data source"));
+ wxLogDebug(wxT("A problem occurred while trying to get a connection to the data source"));
return false;
}
if (i_dbDataType == 0) // Filter unsupported dbDataTypes
{
- if ((i_sqlDataType == SQL_VARCHAR) || (i_sqlDataType == SQL_LONGVARCHAR))
+ if ((i_sqlDataType == SQL_VARCHAR)
+#if wxUSE_UNICODE
+ #if defined(SQL_WCHAR)
+ || (i_sqlDataType == SQL_WCHAR)
+ #endif
+ #if defined(SQL_WVARCHAR)
+ || (i_sqlDataType == SQL_WVARCHAR)
+ #endif
+#endif
+ || (i_sqlDataType == SQL_LONGVARCHAR))
i_dbDataType = DB_DATA_TYPE_VARCHAR;
if ((i_sqlDataType == SQL_C_DATE) || (i_sqlDataType == SQL_C_TIMESTAMP))
i_dbDataType = DB_DATA_TYPE_DATE;
if (i_sqlDataType == SQL_C_BIT)
i_dbDataType = DB_DATA_TYPE_INTEGER;
if (i_sqlDataType == SQL_NUMERIC)
- i_dbDataType = DB_DATA_TYPE_VARCHAR;
+ i_dbDataType = DB_DATA_TYPE_VARCHAR; // glt - ??? is this right?
if (i_sqlDataType == SQL_REAL)
i_dbDataType = DB_DATA_TYPE_FLOAT;
if (i_sqlDataType == SQL_C_BINARY)
|| Dbms() == dbmsXBASE_SEQUITER )
UserID.Empty();
- // Oracle user names may only be in uppercase, so force
- // the name to uppercase
- if (Dbms() == dbmsORACLE)
+ // Some databases require user names to be specified in uppercase,
+ // so force the name to uppercase
+ if ((Dbms() == dbmsORACLE) ||
+ (Dbms() == dbmsMAXDB))
UserID = UserID.Upper();
return UserID.c_str();
bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported)
{
- int iIndex;
+ size_t iIndex;
// These are the possible SQL types we check for use against the datasource we are connected
// to for the purpose of determining which data type to use for the basic character strings
// column types
//
- // NOTE: The first type in this enumeration that is determined to be supported by the
+ // NOTE: The first type in this enumeration that is determined to be supported by the
// datasource/driver is the one that will be used.
SWORD PossibleSqlCharTypes[] = {
#if wxUSE_UNICODE && defined(SQL_WVARCHAR)
// to for the purpose of determining which data type to use for the basic non-floating point
// column types
//
- // NOTE: The first type in this enumeration that is determined to be supported by the
+ // NOTE: The first type in this enumeration that is determined to be supported by the
// datasource/driver is the one that will be used.
SWORD PossibleSqlIntegerTypes[] = {
SQL_INTEGER
// to for the purpose of determining which data type to use for the basic floating point number
// column types
//
- // NOTE: The first type in this enumeration that is determined to be supported by the
+ // NOTE: The first type in this enumeration that is determined to be supported by the
// datasource/driver is the one that will be used.
SWORD PossibleSqlFloatTypes[] = {
SQL_DOUBLE,
// These are the possible SQL types we check for use agains the datasource we are connected
// to for the purpose of determining which data type to use for the date/time column types
//
- // NOTE: The first type in this enumeration that is determined to be supported by the
+ // NOTE: The first type in this enumeration that is determined to be supported by the
// datasource/driver is the one that will be used.
SWORD PossibleSqlDateTypes[] = {
SQL_TIMESTAMP,
// These are the possible SQL types we check for use agains the datasource we are connected
// to for the purpose of determining which data type to use for the BLOB column types.
//
- // NOTE: The first type in this enumeration that is determined to be supported by the
+ // NOTE: The first type in this enumeration that is determined to be supported by the
// datasource/driver is the one that will be used.
SWORD PossibleSqlBlobTypes[] = {
SQL_LONGVARBINARY,
if (!getDbInfo(failOnDataTypeUnsupported))
return false;
- // --------------- Varchar - (Variable length character string) ---------------
- for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlCharTypes) &&
+ // --------------- Varchar - (Variable length character string) ---------------
+ for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlCharTypes) &&
!getDataTypeInfo(PossibleSqlCharTypes[iIndex], typeInfVarchar); ++iIndex)
{}
else if (failOnDataTypeUnsupported)
return false;
- // --------------- Float ---------------
- for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlFloatTypes) &&
+ // --------------- Float ---------------
+ for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlFloatTypes) &&
!getDataTypeInfo(PossibleSqlFloatTypes[iIndex], typeInfFloat); ++iIndex)
{}
return false;
// --------------- Integer -------------
- for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlIntegerTypes) &&
+ for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlIntegerTypes) &&
!getDataTypeInfo(PossibleSqlIntegerTypes[iIndex], typeInfInteger); ++iIndex)
{}
typeInfInteger.FsqlType = typeInfFloat.FsqlType;
}
- // --------------- Date/Time ---------------
- for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlDateTypes) &&
+ // --------------- Date/Time ---------------
+ for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlDateTypes) &&
!getDataTypeInfo(PossibleSqlDateTypes[iIndex], typeInfDate); ++iIndex)
{}
else if (failOnDataTypeUnsupported)
return false;
- // --------------- BLOB ---------------
- for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlBlobTypes) &&
+ // --------------- BLOB ---------------
+ for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlBlobTypes) &&
!getDataTypeInfo(PossibleSqlBlobTypes[iIndex], typeInfBlob); ++iIndex)
{}
bool wxDb::Open(const wxString& inConnectStr, bool failOnDataTypeUnsupported)
{
wxASSERT(inConnectStr.Length());
+ return Open(inConnectStr, NULL, failOnDataTypeUnsupported);
+}
+
+bool wxDb::Open(const wxString& inConnectStr, SQLHWND parentWnd, bool failOnDataTypeUnsupported)
+{
dsn = wxT("");
uid = wxT("");
authStr = wxT("");
inConnectionStr = inConnectStr;
- retcode = SQLDriverConnect(hdbc, NULL, (SQLTCHAR FAR *)inConnectionStr.c_str(),
+ retcode = SQLDriverConnect(hdbc, parentWnd, (SQLTCHAR FAR *)inConnectionStr.c_str(),
(SWORD)inConnectionStr.Length(), (SQLTCHAR FAR *)outConnectBuffer,
sizeof(outConnectBuffer), &outConnectBufferLen, SQL_DRIVER_COMPLETE );
/*
* This function is called internally whenever an error condition prevents the user's
* request from being executed. This function will query the datasource as to the
- * actual error(s) that just occured on the previous request of the datasource.
+ * actual error(s) that just occurred on the previous request of the datasource.
*
* The function will retrieve each error condition from the datasource and
* Printf the codes/text values into a string which it then logs via logError().
* If in DBDEBUG_CONSOLE mode, the constructed string will be displayed in the console
* window and program execution will be paused until the user presses a key.
*
- * This function always returns a false, so that functions which call this function
+ * This function always returns false, so that functions which call this function
* can have a line like "return (DispAllErrors(henv, hdbc));" to indicate the failure
- * of the users request, so that the calling code can then process the error msg log
+ * of the user's request, so that the calling code can then process the error message log.
*/
{
wxString odbcErrMsg;
-#ifdef __VMS
- while (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, (SQLINTEGER *) &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
-#else
- while (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, (long*) &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
-#endif
+ while (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
{
odbcErrMsg.Printf(wxT("SQL State = %s\nNative Error Code = %li\nError Message = %s\n"), sqlState, nativeError, errorMsg);
logError(odbcErrMsg, sqlState);
/********** wxDb::GetNextError() **********/
bool wxDb::GetNextError(HENV aHenv, HDBC aHdbc, HSTMT aHstmt)
{
-#ifdef __VMS
- if (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, (SQLINTEGER *) &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
-#else
- if (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, (long*) &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
-#endif
+ if (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
return true;
else
return false;
if (++pLast == DB_MAX_ERROR_HISTORY)
{
int i;
- for (i = 0; i < DB_MAX_ERROR_HISTORY; i++)
+ for (i = 0; i < DB_MAX_ERROR_HISTORY-1; i++)
wxStrcpy(errorList[i], errorList[i+1]);
pLast--;
}
switch (Sdword)
{
+#if wxUSE_UNICODE
+ #if defined(SQL_WCHAR)
+ case SQL_WCHAR:
+ #endif
+ #if defined(SQL_WVARCHAR)
+ case SQL_WVARCHAR:
+ #endif
+#endif
case SQL_VARCHAR:
case SQL_CHAR:
pColInf[colNum].dbDataType = DB_DATA_TYPE_VARCHAR;
* 1) The last array element of the tableName[] argument must be zero (null).
* This is how the end of the array is detected.
* 2) This function returns an array of wxDbColInf structures. If no columns
- * were found, or an error occured, this pointer will be zero (null). THE
+ * were found, or an error occurred, this pointer will be zero (null). THE
* CALLING FUNCTION IS RESPONSIBLE FOR DELETING THE MEMORY RETURNED WHEN IT
* IS FINISHED WITH IT. i.e.
*
NULL, 0); // All columns
}
if (retcode != SQL_SUCCESS)
- { // Error occured, abort
+ { // Error occurred, abort
DispAllErrors(henv, hdbc, hstmt);
if (colInf)
delete [] colInf;
}
}
if (retcode != SQL_NO_DATA_FOUND)
- { // Error occured, abort
+ { // Error occurred, abort
DispAllErrors(henv, hdbc, hstmt);
if (colInf)
delete [] colInf;
NULL, 0); // All columns
}
if (retcode != SQL_SUCCESS)
- { // Error occured, abort
+ { // Error occurred, abort
DispAllErrors(henv, hdbc, hstmt);
if (colInf)
delete [] colInf;
}
}
if (retcode != SQL_NO_DATA_FOUND)
- { // Error occured, abort
+ { // Error occurred, abort
DispAllErrors(henv, hdbc, hstmt);
if (colInf)
delete [] colInf;
/*
BJO 20000503
These are tentative new GetColumns members which should be more database
- independant and which always returns the columns in the order they were
+ independent and which always returns the columns in the order they were
created.
- The first one (wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const
NULL, 0); // All columns
}
if (retcode != SQL_SUCCESS)
- { // Error occured, abort
+ { // Error occurred, abort
DispAllErrors(henv, hdbc, hstmt);
if (colInf)
delete [] colInf;
// Get the intern datatype
switch (colInf[colNo].sqlDataType)
{
+#if wxUSE_UNICODE
+ #if defined(SQL_WCHAR)
+ case SQL_WCHAR:
+ #endif
+ #if defined(SQL_WVARCHAR)
+ case SQL_WVARCHAR:
+ #endif
+#endif
case SQL_VARCHAR:
case SQL_CHAR:
colInf[colNo].dbDataType = DB_DATA_TYPE_VARCHAR;
}
}
if (retcode != SQL_NO_DATA_FOUND)
- { // Error occured, abort
+ { // Error occurred, abort
DispAllErrors(henv, hdbc, hstmt);
if (colInf)
delete [] colInf;
NULL, 0); // All columns
}
if (retcode != SQL_SUCCESS)
- { // Error occured, abort
+ { // Error occurred, abort
DispAllErrors(henv, hdbc, hstmt);
SQLFreeStmt(hstmt, SQL_CLOSE);
return(-1);
noCols++;
if (retcode != SQL_NO_DATA_FOUND)
- { // Error occured, abort
+ { // Error occurred, abort
DispAllErrors(henv, hdbc, hstmt);
SQLFreeStmt(hstmt, SQL_CLOSE);
return(-1);
* -- : uses SQLTables and fills pTableInf; ------
* -- : pColInf is set to NULL and numCols to 0; ------
* -- : returns pDbInf (wxDbInf) ------
- * -- - if unsuccesfull (pDbInf == NULL) ------
+ * -- - if unsuccessful (pDbInf == NULL) ------
* -- : pColInf can be filled with GetColumns(..); ------
* -- : numCols can be filled with GetColumnCount(..); ------
* ---------------------------------------------------------------------
wxChar typeName[30+1];
SDWORD precision, length;
- FILE *fp = wxFopen(fileName.fn_str(),wxT("wt"));
+ FILE *fp = wxFopen(fileName.c_str(),wxT("wt"));
if (fp == NULL)
return false;
{
if (fpSqlLog == 0)
{
- fpSqlLog = wxFopen(filename.fn_str(), (append ? wxT("at") : wxT("wt")));
+ fpSqlLog = wxFopen(filename.c_str(), (append ? wxT("at") : wxT("wt")));
if (fpSqlLog == NULL)
return false;
}
return((wxDBMS)(dbmsType = dbmsXBASE_SEQUITER));
if (!wxStricmp(baseName,wxT("MySQL")))
return((wxDBMS)(dbmsType = dbmsMY_SQL));
+ if (!wxStricmp(baseName,wxT("MaxDB")))
+ return((wxDBMS)(dbmsType = dbmsMAXDB));
baseName[3] = 0;
if (!wxStricmp(baseName,wxT("DB2")))
// embedded nulls in strings
setupStr.Printf(wxT("DSN=%s%cDescription=%s%cDefaultDir=%s%c"),dsn,2,description,2,defDir,2);
- // Replace the separator from above with the '\0' seperator needed
+ // Replace the separator from above with the '\0' separator needed
// by the SQLConfigDataSource() function
int k;
do
********************************************************************
*
* The following functions are all DEPRECATED and are included for
- * backward compatability reasons only
+ * backward compatibility reasons only
*
********************************************************************
********************************************************************/