]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/db.cpp
applied patch 419155 (OLE x-compilation with mingw)
[wxWidgets.git] / src / common / db.cpp
index a58740df04d7435160625ebc94854f83d03803d3..218d94e777208d6711e9cbd55c1ec598056b6a24 100644 (file)
@@ -138,30 +138,34 @@ typedef struct
 /********** wxDbConnectInf Constructor - form 1 **********/
 wxDbConnectInf::wxDbConnectInf()
 {
 /********** wxDbConnectInf Constructor - form 1 **********/
 wxDbConnectInf::wxDbConnectInf()
 {
+    Henv = 0;
+    freeHenvOnDestroy = FALSE;
+
     Initialize();
 }  // Constructor
 
 
 /********** wxDbConnectInf Constructor - form 2 **********/
     Initialize();
 }  // Constructor
 
 
 /********** wxDbConnectInf Constructor - form 2 **********/
-wxDbConnectInf::wxDbConnectInf(HENV Henv, const wxString &Dsn, const wxString &UserID, 
-                       const wxString &Password, const wxString &DefaultDir,
-                       const wxString &FileType, const wxString &Description)
+wxDbConnectInf::wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &userID, 
+                       const wxString &password, const wxString &defaultDir,
+                       const wxString &fileType, const wxString &description)
 {
 {
-    wxASSERT(Dsn.Length());
+    Henv = 0;
+    freeHenvOnDestroy = FALSE;
 
     Initialize();
 
 
     Initialize();
 
-    if (Henv)
-        SetHenv(Henv);
+    if (henv)
+        SetHenv(henv);
     else
         AllocHenv();
 
     else
         AllocHenv();
 
-    SetDsn(Dsn);
-    SetUserID(UserID);
-    SetPassword(Password);
-    SetDescription(Description);
-    SetFileType(FileType);
-    SetDefaultDir(DefaultDir);
+    SetDsn(dsn);
+    SetUserID(userID);
+    SetPassword(password);
+    SetDescription(description);
+    SetFileType(fileType);
+    SetDefaultDir(defaultDir);
 }  // wxDbConnectInf Constructor
 
 
 }  // wxDbConnectInf Constructor
 
 
@@ -180,6 +184,9 @@ bool wxDbConnectInf::Initialize()
 {
     freeHenvOnDestroy = FALSE;
 
 {
     freeHenvOnDestroy = FALSE;
 
+    if (freeHenvOnDestroy && Henv)
+        FreeHenv();
+
     Henv = 0;
     Dsn[0] = 0;
     Uid[0] = 0;
     Henv = 0;
     Dsn[0] = 0;
     Uid[0] = 0;
@@ -251,6 +258,18 @@ void wxDbConnectInf::SetPassword(const wxString &password)
 
 /********** wxDbColFor Constructor **********/
 wxDbColFor::wxDbColFor()
 
 /********** wxDbColFor Constructor **********/
 wxDbColFor::wxDbColFor()
+{
+    Initialize();
+}  // wxDbColFor::wxDbColFor()
+
+
+wxDbColFor::~wxDbColFor()
+{
+}  // wxDbColFor::~wxDbColFor()
+
+
+/********** wxDbColFor::Initialize() **********/
+void wxDbColFor::Initialize()
 {
     s_Field.Empty();
     int i;
 {
     s_Field.Empty();
     int i;
@@ -264,12 +283,7 @@ wxDbColFor::wxDbColFor()
     i_dbDataType  = 0;
     i_sqlDataType = 0;
     Format(1,DB_DATA_TYPE_VARCHAR,0,0,0);  // the Function that does the work
     i_dbDataType  = 0;
     i_sqlDataType = 0;
     Format(1,DB_DATA_TYPE_VARCHAR,0,0,0);  // the Function that does the work
-}  // wxDbColFor::wxDbColFor()
-
-
-wxDbColFor::~wxDbColFor()
-{
-}  // wxDbColFor::~wxDbColFor()
+}  // wxDbColFor::Initialize()
 
 
 /********** wxDbColFor::Format() **********/
 
 
 /********** wxDbColFor::Format() **********/
@@ -306,6 +320,8 @@ int wxDbColFor::Format(int Nation, int dbDataType, SWORD sqlDataType,
             i_dbDataType = DB_DATA_TYPE_VARCHAR;
         if (i_sqlDataType == SQL_REAL)
             i_dbDataType = DB_DATA_TYPE_FLOAT;
             i_dbDataType = DB_DATA_TYPE_VARCHAR;
         if (i_sqlDataType == SQL_REAL)
             i_dbDataType = DB_DATA_TYPE_FLOAT;
+        if (i_sqlDataType == SQL_C_BINARY)
+            i_dbDataType = DB_DATA_TYPE_BLOB;
     }
 
     if ((i_dbDataType == DB_DATA_TYPE_INTEGER) && (i_sqlDataType == SQL_C_DOUBLE))
     }
 
     if ((i_dbDataType == DB_DATA_TYPE_INTEGER) && (i_sqlDataType == SQL_C_DOUBLE))
@@ -350,6 +366,9 @@ int wxDbColFor::Format(int Nation, int dbDataType, SWORD sqlDataType,
                 s_Field = wxT("%02d/%02d/%04d %02d:%02d:%02d.%03d");
             }
             break;
                 s_Field = wxT("%02d/%02d/%04d %02d:%02d:%02d.%03d");
             }
             break;
+                 case DB_DATA_TYPE_BLOB:
+            s_Field.Printf(wxT("Unable to format(%d)-SQL(%d)"),dbDataType,sqlDataType);        //
+                               break;
         default:
             s_Field.Printf(wxT("Unknown Format(%d)-SQL(%d)"),dbDataType,sqlDataType);        //
             break;
         default:
             s_Field.Printf(wxT("Unknown Format(%d)-SQL(%d)"),dbDataType,sqlDataType);        //
             break;
@@ -358,8 +377,24 @@ int wxDbColFor::Format(int Nation, int dbDataType, SWORD sqlDataType,
 }  // wxDbColFor::Format()
 
 
 }  // wxDbColFor::Format()
 
 
+
 /********** wxDbColInf Constructor **********/
 wxDbColInf::wxDbColInf()
 /********** wxDbColInf Constructor **********/
 wxDbColInf::wxDbColInf()
+{
+    Initialize();
+}  // wxDbColInf::wxDbColInf()
+
+
+/********** wxDbColInf Destructor ********/
+wxDbColInf::~wxDbColInf()
+{
+    if (pColFor)
+        delete pColFor;
+    pColFor = NULL;
+}  // wxDbColInf::~wxDbColInf()
+
+
+bool wxDbColInf::Initialize()
 {
     catalog[0]      = 0;
     schema[0]       = 0;
 {
     catalog[0]      = 0;
     schema[0]       = 0;
@@ -379,26 +414,15 @@ wxDbColInf::wxDbColInf()
     FkCol           = 0;
     FkTableName[0]  = 0;
     pColFor         = NULL;
     FkCol           = 0;
     FkTableName[0]  = 0;
     pColFor         = NULL;
-}  // wxDbColInf::wxDbColInf()
 
 
-
-/********** wxDbColInf Destructor ********/
-wxDbColInf::~wxDbColInf()
-{
-    if (pColFor)
-        delete pColFor;
-    pColFor = NULL;
-}  // wxDbColInf::~wxDbColInf()
+    return TRUE;
+}  // wxDbColInf::Initialize()
 
 
 /********** wxDbTableInf Constructor ********/
 wxDbTableInf::wxDbTableInf()
 {
 
 
 /********** wxDbTableInf Constructor ********/
 wxDbTableInf::wxDbTableInf()
 {
-    tableName[0]    = 0;
-    tableType[0]    = 0;
-    tableRemarks[0] = 0;
-    numCols         = 0;
-    pColInf         = NULL;
+    Initialize();
 }  // wxDbTableInf::wxDbTableInf()
 
 
 }  // wxDbTableInf::wxDbTableInf()
 
 
@@ -411,14 +435,23 @@ wxDbTableInf::~wxDbTableInf()
 }  // wxDbTableInf::~wxDbTableInf()
 
 
 }  // wxDbTableInf::~wxDbTableInf()
 
 
+bool wxDbTableInf::Initialize()
+{
+    tableName[0]    = 0;
+    tableType[0]    = 0;
+    tableRemarks[0] = 0;
+    numCols         = 0;
+    pColInf         = NULL;
+
+    return TRUE;
+}  // wxDbTableInf::Initialize()
+
+
 /********** wxDbInf Constructor *************/
 wxDbInf::wxDbInf()
 {
 /********** wxDbInf Constructor *************/
 wxDbInf::wxDbInf()
 {
-    catalog[0]      = 0;
-    schema[0]       = 0;
-    numTables       = 0;
-    pTableInf       = NULL;
-}  // wxDbInf::wxDbFor()
+    Initialize();
+}  // wxDbInf::wxDbInf()
 
 
 /********** wxDbInf Destructor *************/
 
 
 /********** wxDbInf Destructor *************/
@@ -430,18 +463,32 @@ wxDbInf::~wxDbInf()
 }  // wxDbInf::~wxDbInf()
 
 
 }  // wxDbInf::~wxDbInf()
 
 
+/********** wxDbInf::Initialize() *************/
+bool wxDbInf::Initialize()
+{
+    catalog[0]      = 0;
+    schema[0]       = 0;
+    numTables       = 0;
+    pTableInf       = NULL;
+
+    return TRUE;
+}  // wxDbInf::Initialize()
+
+
 /********** wxDb Constructors **********/
 /********** wxDb Constructors **********/
-wxDb::wxDb(HENV &aHenv, bool FwdOnlyCursors)
+wxDb::wxDb(const HENV &aHenv, bool FwdOnlyCursors)
 {
     // Copy the HENV into the db class
     henv = aHenv;
     fwdOnlyCursors = FwdOnlyCursors;
 {
     // Copy the HENV into the db class
     henv = aHenv;
     fwdOnlyCursors = FwdOnlyCursors;
-    Initialize();
+
+    initialize();
 } // wxDb::wxDb()
 
 
 } // wxDb::wxDb()
 
 
-/********** wxDb::Initialize() **********/
-void wxDb::Initialize()
+/********** PRIVATE! wxDb::initialize PRIVATE! **********/
+/********** wxDb::initialize() **********/
+void wxDb::initialize()
 /*
  * Private member function that sets all wxDb member variables to
  * known values at creation of the wxDb
 /*
  * Private member function that sets all wxDb member variables to
  * known values at creation of the wxDb
@@ -454,11 +501,11 @@ void wxDb::Initialize()
     nTables       = 0;
     dbmsType      = dbmsUNIDENTIFIED;
 
     nTables       = 0;
     dbmsType      = dbmsUNIDENTIFIED;
 
-    wxStrcpy(sqlState,wxT(""));
-    wxStrcpy(errorMsg,wxT(""));
+    wxStrcpy(sqlState,wxEmptyString);
+    wxStrcpy(errorMsg,wxEmptyString);
     nativeError = cbErrorMsg = 0;
     for (i = 0; i < DB_MAX_ERROR_HISTORY; i++)
     nativeError = cbErrorMsg = 0;
     for (i = 0; i < DB_MAX_ERROR_HISTORY; i++)
-        wxStrcpy(errorList[i], wxT(""));
+        wxStrcpy(errorList[i], wxEmptyString);
 
     // Init typeInf structures
     typeInfVarchar.TypeName.Empty();
 
     // Init typeInf structures
     typeInfVarchar.TypeName.Empty();
@@ -485,6 +532,12 @@ void wxDb::Initialize()
     typeInfDate.CaseSensitive = 0;
     typeInfDate.MaximumScale  = 0;
 
     typeInfDate.CaseSensitive = 0;
     typeInfDate.MaximumScale  = 0;
 
+    typeInfBlob.TypeName.Empty();
+    typeInfBlob.FsqlType      = 0;
+    typeInfBlob.Precision     = 0;
+    typeInfBlob.CaseSensitive = 0;
+    typeInfBlob.MaximumScale  = 0;
+
     // Error reporting is turned OFF by default
     silent = TRUE;
 
     // Error reporting is turned OFF by default
     silent = TRUE;
 
@@ -497,7 +550,7 @@ void wxDb::Initialize()
 
     // Mark database as not open as of yet
     dbIsOpen = FALSE;
 
     // Mark database as not open as of yet
     dbIsOpen = FALSE;
-}  // wxDb::Initialize()
+}  // wxDb::initialize()
 
 
 /********** PRIVATE! wxDb::convertUserID PRIVATE! **********/
 
 
 /********** PRIVATE! wxDb::convertUserID PRIVATE! **********/
@@ -577,8 +630,8 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
     If using Intersolv branded ODBC drivers, this is the place where you would substitute
     your branded driver license information
 
     If using Intersolv branded ODBC drivers, this is the place where you would substitute
     your branded driver license information
 
-    SQLSetConnectOption(hdbc, 1041, (UDWORD) wxT(""));
-    SQLSetConnectOption(hdbc, 1042, (UDWORD) wxT(""));
+    SQLSetConnectOption(hdbc, 1041, (UDWORD) wxEmptyString);
+    SQLSetConnectOption(hdbc, 1042, (UDWORD) wxEmptyString);
 */
 
     // Mark database as open
 */
 
     // Mark database as open
@@ -599,7 +652,7 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
     // Query the data source regarding data type information
 
     //
     // Query the data source regarding data type information
 
     //
-    // The way I determined which SQL data types to use was by calling SQLGetInfo
+    // The way it was determined which SQL data types to use was by calling SQLGetInfo
     // for all of the possible SQL data types to see which ones were supported.  If
     // a type is not supported, the SQLFetch() that's called from getDataTypeInfo()
     // fails with SQL_NO_DATA_FOUND.  This is ugly because I'm sure the three SQL data
     // for all of the possible SQL data types to see which ones were supported.  If
     // a type is not supported, the SQLFetch() that's called from getDataTypeInfo()
     // fails with SQL_NO_DATA_FOUND.  This is ugly because I'm sure the three SQL data
@@ -648,7 +701,6 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
 
     // Float
     if (!getDataTypeInfo(SQL_DOUBLE,typeInfFloat))
 
     // Float
     if (!getDataTypeInfo(SQL_DOUBLE,typeInfFloat))
-
         if (!getDataTypeInfo(SQL_REAL,typeInfFloat))
             if (!getDataTypeInfo(SQL_FLOAT,typeInfFloat))
                 if (!getDataTypeInfo(SQL_DECIMAL,typeInfFloat))
         if (!getDataTypeInfo(SQL_REAL,typeInfFloat))
             if (!getDataTypeInfo(SQL_FLOAT,typeInfFloat))
                 if (!getDataTypeInfo(SQL_DECIMAL,typeInfFloat))
@@ -694,11 +746,24 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
             typeInfDate.FsqlType = SQL_DATE;
     }
 
             typeInfDate.FsqlType = SQL_DATE;
     }
 
+    if (!getDataTypeInfo(SQL_LONGVARBINARY, typeInfBlob))
+    {
+        if (!getDataTypeInfo(SQL_VARBINARY,typeInfBlob))
+            return(FALSE);
+        else
+            typeInfBlob.FsqlType = SQL_VARBINARY;
+    }
+    else
+        typeInfBlob.FsqlType = SQL_LONGVARBINARY;
+
+//typeInfBlob.TypeName = "BLOB";
+
 #ifdef DBDEBUG_CONSOLE
     cout << wxT("VARCHAR DATA TYPE: ") << typeInfVarchar.TypeName << endl;
     cout << wxT("INTEGER DATA TYPE: ") << typeInfInteger.TypeName << endl;
     cout << wxT("FLOAT   DATA TYPE: ") << typeInfFloat.TypeName << endl;
     cout << wxT("DATE    DATA TYPE: ") << typeInfDate.TypeName << endl;
 #ifdef DBDEBUG_CONSOLE
     cout << wxT("VARCHAR DATA TYPE: ") << typeInfVarchar.TypeName << endl;
     cout << wxT("INTEGER DATA TYPE: ") << typeInfInteger.TypeName << endl;
     cout << wxT("FLOAT   DATA TYPE: ") << typeInfFloat.TypeName << endl;
     cout << wxT("DATE    DATA TYPE: ") << typeInfDate.TypeName << endl;
+    cout << wxT("BLOB    DATA TYPE: ") << typeInfBlob.TypeName << endl;
     cout << endl;
 #endif
 
     cout << endl;
 #endif
 
@@ -708,6 +773,13 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
 } // wxDb::Open()
 
 
 } // wxDb::Open()
 
 
+bool wxDb::Open(wxDbConnectInf *dbConnectInf)
+{
+    return Open(dbConnectInf->GetDsn(), dbConnectInf->GetUserID(),
+                dbConnectInf->GetPassword());
+}  // wxDb::Open()
+
+
 bool wxDb::Open(wxDb *copyDb)
 {
     dsn        = copyDb->GetDatasourceName();
 bool wxDb::Open(wxDb *copyDb)
 {
     dsn        = copyDb->GetDatasourceName();
@@ -742,8 +814,8 @@ bool wxDb::Open(wxDb *copyDb)
     If using Intersolv branded ODBC drivers, this is the place where you would substitute
     your branded driver license information
 
     If using Intersolv branded ODBC drivers, this is the place where you would substitute
     your branded driver license information
 
-    SQLSetConnectOption(hdbc, 1041, (UDWORD) wxT(""));
-    SQLSetConnectOption(hdbc, 1042, (UDWORD) wxT(""));
+    SQLSetConnectOption(hdbc, 1041, (UDWORD) wxEmptyString);
+    SQLSetConnectOption(hdbc, 1042, (UDWORD) wxEmptyString);
 */
 
     // Mark database as open
 */
 
     // Mark database as open
@@ -819,11 +891,19 @@ bool wxDb::Open(wxDb *copyDb)
     typeInfDate.CaseSensitive    = copyDb->typeInfDate.CaseSensitive;
     typeInfDate.MaximumScale     = copyDb->typeInfDate.MaximumScale;
 
     typeInfDate.CaseSensitive    = copyDb->typeInfDate.CaseSensitive;
     typeInfDate.MaximumScale     = copyDb->typeInfDate.MaximumScale;
 
+    // Blob
+    typeInfBlob.FsqlType         = copyDb->typeInfBlob.FsqlType;
+    typeInfBlob.TypeName         = copyDb->typeInfBlob.TypeName;
+    typeInfBlob.Precision        = copyDb->typeInfBlob.Precision;
+    typeInfBlob.CaseSensitive    = copyDb->typeInfBlob.CaseSensitive;
+    typeInfBlob.MaximumScale     = copyDb->typeInfBlob.MaximumScale;
+
 #ifdef DBDEBUG_CONSOLE
     cout << wxT("VARCHAR DATA TYPE: ") << typeInfVarchar.TypeName << endl;
     cout << wxT("INTEGER DATA TYPE: ") << typeInfInteger.TypeName << endl;
     cout << wxT("FLOAT   DATA TYPE: ") << typeInfFloat.TypeName << endl;
     cout << wxT("DATE    DATA TYPE: ") << typeInfDate.TypeName << endl;
 #ifdef DBDEBUG_CONSOLE
     cout << wxT("VARCHAR DATA TYPE: ") << typeInfVarchar.TypeName << endl;
     cout << wxT("INTEGER DATA TYPE: ") << typeInfInteger.TypeName << endl;
     cout << wxT("FLOAT   DATA TYPE: ") << typeInfFloat.TypeName << endl;
     cout << wxT("DATE    DATA TYPE: ") << typeInfDate.TypeName << endl;
+    cout << wxT("BLOB    DATA TYPE: ") << typeInfBlob.TypeName << endl;
     cout << endl;
 #endif
 
     cout << endl;
 #endif
 
@@ -1856,7 +1936,7 @@ bool wxDb::GetData(UWORD colNo, SWORD cType, PTR pData, SDWORD maxLen, SDWORD FA
 
 
 /********** wxDb::GetKeyFields() **********/
 
 
 /********** wxDb::GetKeyFields() **********/
-int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, int noCols)
+int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCols)
 {
     wxChar       szPkTable[DB_MAX_TABLE_NAME_LEN+1];  /* Primary key table name */
     wxChar       szFkTable[DB_MAX_TABLE_NAME_LEN+1];  /* Foreign key table name */
 {
     wxChar       szPkTable[DB_MAX_TABLE_NAME_LEN+1];  /* Primary key table name */
     wxChar       szFkTable[DB_MAX_TABLE_NAME_LEN+1];  /* Foreign key table name */
@@ -1866,7 +1946,7 @@ int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, int noCols
     wxChar       szFkCol[DB_MAX_COLUMN_NAME_LEN+1];   /* Foreign key column     */
     SQLRETURN    retcode;
     SDWORD       cb;
     wxChar       szFkCol[DB_MAX_COLUMN_NAME_LEN+1];   /* Foreign key column     */
     SQLRETURN    retcode;
     SDWORD       cb;
-    int          i;
+    SWORD        i;
     wxString     tempStr;
     /*
      * -----------------------------------------------------------------------
     wxString     tempStr;
     /*
      * -----------------------------------------------------------------------
@@ -2024,8 +2104,8 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID)
  *       to avoid undesired unbinding of columns.
  */
 {
  *       to avoid undesired unbinding of columns.
  */
 {
-    int      noCols = 0;
-    int      colNo  = 0;
+    UWORD          noCols = 0;
+    UWORD               colNo  = 0;
     wxDbColInf *colInf = 0;
 
     RETCODE  retcode;
     wxDbColInf *colInf = 0;
 
     RETCODE  retcode;
@@ -2051,8 +2131,8 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID)
             if (!colInf)
                 break;
             // Mark the end of the array
             if (!colInf)
                 break;
             // Mark the end of the array
-            wxStrcpy(colInf[noCols].tableName,wxT(""));
-            wxStrcpy(colInf[noCols].colName,wxT(""));
+            wxStrcpy(colInf[noCols].tableName,wxEmptyString);
+            wxStrcpy(colInf[noCols].colName,wxEmptyString);
             colInf[noCols].sqlDataType = 0;
         }
         // Loop through each table name
             colInf[noCols].sqlDataType = 0;
         }
         // Loop through each table name
@@ -2135,13 +2215,14 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID)
 #endif
                             colInf[colNo].dbDataType = DB_DATA_TYPE_VARCHAR;
                         }
 #endif
                             colInf[colNo].dbDataType = DB_DATA_TYPE_VARCHAR;
                         }
-                        else if (!wxStricmp(typeInfInteger.TypeName,colInf[colNo].typeName))
+                        else if (!wxStricmp(typeInfInteger.TypeName, colInf[colNo].typeName))
                             colInf[colNo].dbDataType = DB_DATA_TYPE_INTEGER;
                             colInf[colNo].dbDataType = DB_DATA_TYPE_INTEGER;
-                        else if (!wxStricmp(typeInfFloat.TypeName,colInf[colNo].typeName))
+                        else if (!wxStricmp(typeInfFloat.TypeName, colInf[colNo].typeName))
                             colInf[colNo].dbDataType = DB_DATA_TYPE_FLOAT;
                             colInf[colNo].dbDataType = DB_DATA_TYPE_FLOAT;
-                        else if (!wxStricmp(typeInfDate.TypeName,colInf[colNo].typeName))
+                        else if (!wxStricmp(typeInfDate.TypeName, colInf[colNo].typeName))
                             colInf[colNo].dbDataType = DB_DATA_TYPE_DATE;
                             colInf[colNo].dbDataType = DB_DATA_TYPE_DATE;
-
+                        else if (!wxStricmp(typeInfBlob.TypeName, colInf[colNo].typeName))
+                            colInf[colNo].dbDataType = DB_DATA_TYPE_BLOB;
                         colNo++;
                     }
                 }
                         colNo++;
                     }
                 }
@@ -2165,7 +2246,7 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID)
 
 /********** wxDb::GetColumns() **********/
 
 
 /********** wxDb::GetColumns() **********/
 
-wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxChar *userID)
+wxDbColInf *wxDb::GetColumns(const wxString &tableName, UWORD *numCols, const wxChar *userID)
 //
 // Same as the above GetColumns() function except this one gets columns
 // only for a single table, and if 'numCols' is not NULL, the number of
 //
 // Same as the above GetColumns() function except this one gets columns
 // only for a single table, and if 'numCols' is not NULL, the number of
@@ -2181,8 +2262,8 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
 //       to avoid undesired unbinding of columns.
 
 {
 //       to avoid undesired unbinding of columns.
 
 {
-    int       noCols = 0;
-    int       colNo  = 0;
+    UWORD       noCols = 0;
+    UWORD       colNo  = 0;
     wxDbColInf *colInf = 0;
 
     RETCODE  retcode;
     wxDbColInf *colInf = 0;
 
     RETCODE  retcode;
@@ -2208,8 +2289,8 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
             if (!colInf)
                 break;
             // Mark the end of the array
             if (!colInf)
                 break;
             // Mark the end of the array
-            wxStrcpy(colInf[noCols].tableName, wxT(""));
-            wxStrcpy(colInf[noCols].colName, wxT(""));
+            wxStrcpy(colInf[noCols].tableName, wxEmptyString);
+            wxStrcpy(colInf[noCols].colName, wxEmptyString);
             colInf[noCols].sqlDataType  = 0;
         }
 
             colInf[noCols].sqlDataType  = 0;
         }
 
@@ -2292,7 +2373,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
 
                     // Determine the wxDb data type that is used to represent the native data type of this data source
                     colInf[colNo].dbDataType = 0;
 
                     // Determine the wxDb data type that is used to represent the native data type of this data source
                     colInf[colNo].dbDataType = 0;
-                    if (!wxStricmp(typeInfVarchar.TypeName,colInf[colNo].typeName))
+                    if (!wxStricmp(typeInfVarchar.TypeName, colInf[colNo].typeName))
                     {
 #ifdef _IODBC_
                         // IODBC does not return a correct columnSize, so we set
                     {
 #ifdef _IODBC_
                         // IODBC does not return a correct columnSize, so we set
@@ -2306,12 +2387,14 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
 
                         colInf[colNo].dbDataType = DB_DATA_TYPE_VARCHAR;
                     }
 
                         colInf[colNo].dbDataType = DB_DATA_TYPE_VARCHAR;
                     }
-                    else if (!wxStricmp(typeInfInteger.TypeName,colInf[colNo].typeName))
+                    else if (!wxStricmp(typeInfInteger.TypeName, colInf[colNo].typeName))
                         colInf[colNo].dbDataType = DB_DATA_TYPE_INTEGER;
                         colInf[colNo].dbDataType = DB_DATA_TYPE_INTEGER;
-                    else if (!wxStricmp(typeInfFloat.TypeName,colInf[colNo].typeName))
+                    else if (!wxStricmp(typeInfFloat.TypeName, colInf[colNo].typeName))
                         colInf[colNo].dbDataType = DB_DATA_TYPE_FLOAT;
                         colInf[colNo].dbDataType = DB_DATA_TYPE_FLOAT;
-                    else if (!wxStricmp(typeInfDate.TypeName,colInf[colNo].typeName))
+                    else if (!wxStricmp(typeInfDate.TypeName, colInf[colNo].typeName))
                         colInf[colNo].dbDataType = DB_DATA_TYPE_DATE;
                         colInf[colNo].dbDataType = DB_DATA_TYPE_DATE;
+                    else if (!wxStricmp(typeInfBlob.TypeName, colInf[colNo].typeName))
+                        colInf[colNo].dbDataType = DB_DATA_TYPE_BLOB;
 
                     colNo++;
                 }
 
                     colNo++;
                 }
@@ -2364,7 +2447,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
 
 typedef struct
 {
 
 typedef struct
 {
-    int noCols;
+    UWORD noCols;
     wxDbColInf *colInf;
 } _TableColumns;
 
     wxDbColInf *colInf;
 } _TableColumns;
 
@@ -2375,7 +2458,7 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID)
     // The last array element of the tableName[] argument must be zero (null).
     // This is how the end of the array is detected.
 
     // The last array element of the tableName[] argument must be zero (null).
     // This is how the end of the array is detected.
 
-    int noCols = 0;
+    UWORD noCols = 0;
 
     // How many tables ?
     int tbl;
 
     // How many tables ?
     int tbl;
@@ -2398,8 +2481,8 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID)
     wxDbColInf *colInf = new wxDbColInf[noCols+1];
 
     // Mark the end of the array
     wxDbColInf *colInf = new wxDbColInf[noCols+1];
 
     // Mark the end of the array
-    wxStrcpy(colInf[noCols].tableName, wxT(""));
-    wxStrcpy(colInf[noCols].colName, wxT(""));
+    wxStrcpy(colInf[noCols].tableName, wxEmptyString);
+    wxStrcpy(colInf[noCols].colName, wxEmptyString);
     colInf[noCols].sqlDataType  = 0;
 
     // Merge ...
     colInf[noCols].sqlDataType  = 0;
 
     // Merge ...
@@ -2434,8 +2517,8 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
 //       by this function.  This function should use its own wxDb instance
 //       to avoid undesired unbinding of columns.
 {
 //       by this function.  This function should use its own wxDb instance
 //       to avoid undesired unbinding of columns.
 {
-    SWORD       noCols = 0;
-    int         colNo  = 0;
+    UWORD       noCols = 0;
+    UWORD       colNo  = 0;
     wxDbColInf *colInf = 0;
 
     RETCODE  retcode;
     wxDbColInf *colInf = 0;
 
     RETCODE  retcode;
@@ -2461,8 +2544,8 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
             if (!colInf)
                 break;
             // Mark the end of the array
             if (!colInf)
                 break;
             // Mark the end of the array
-            wxStrcpy(colInf[noCols].tableName, wxT(""));
-            wxStrcpy(colInf[noCols].colName, wxT(""));
+            wxStrcpy(colInf[noCols].tableName, wxEmptyString);
+            wxStrcpy(colInf[noCols].colName, wxEmptyString);
             colInf[noCols].sqlDataType = 0;
         }
 
             colInf[noCols].sqlDataType = 0;
         }
 
@@ -2569,6 +2652,9 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
                         case SQL_DATE:
                             colInf[colNo].dbDataType = DB_DATA_TYPE_DATE;
                             break;
                         case SQL_DATE:
                             colInf[colNo].dbDataType = DB_DATA_TYPE_DATE;
                             break;
+                        case SQL_BINARY:
+                            colInf[colNo].dbDataType = DB_DATA_TYPE_BLOB;
+                            break;
 #ifdef __WXDEBUG__
                         default:
                             wxString errMsg;
 #ifdef __WXDEBUG__
                         default:
                             wxString errMsg;
@@ -2676,7 +2762,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
 
 
 /********** wxDb::GetColumnCount() **********/
 
 
 /********** wxDb::GetColumnCount() **********/
-int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID)
+UWORD wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID)
 /*
  * Returns a count of how many columns are in a table.
  * If an error occurs in computing the number of columns
 /*
  * Returns a count of how many columns are in a table.
  * If an error occurs in computing the number of columns
@@ -2692,7 +2778,7 @@ int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID)
  *       to avoid undesired unbinding of columns.
  */
 {
  *       to avoid undesired unbinding of columns.
  */
 {
-    int      noCols = 0;
+    UWORD    noCols = 0;
 
     RETCODE  retcode;
 
 
     RETCODE  retcode;
 
@@ -3086,8 +3172,9 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons
 
     wxString TableName;
 
 
     wxString TableName;
 
-    wxString UserID;
+    wxString UserID,Schema;
     convertUserID(userID,UserID);
     convertUserID(userID,UserID);
+    convertUserID(schema,Schema);
 
     TableName = tableName;
     // Oracle and Interbase table names are uppercase only, so force
 
     TableName = tableName;
     // Oracle and Interbase table names are uppercase only, so force
@@ -3098,18 +3185,23 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons
 
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
 
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
-    if (!schema)
+    // Some databases cannot accept a user name when looking up table names,
+    // so we use the call below that leaves out the user name
+    if (!Schema.IsEmpty() &&
+        Dbms() != dbmsMY_SQL &&
+        Dbms() != dbmsACCESS &&
+        Dbms() != dbmsMS_SQL_SERVER)
     {
         retcode = SQLTablePrivileges(hstmt,
                                      NULL, 0,                                    // Catalog
     {
         retcode = SQLTablePrivileges(hstmt,
                                      NULL, 0,                                    // Catalog
-                                     NULL, 0,                                    // Schema
+                                     (UCHAR FAR *)Schema.c_str(), SQL_NTS,               // Schema
                                      (UCHAR FAR *)TableName.c_str(), SQL_NTS);
     }
     else
     {
         retcode = SQLTablePrivileges(hstmt,
                                      NULL, 0,                                    // Catalog
                                      (UCHAR FAR *)TableName.c_str(), SQL_NTS);
     }
     else
     {
         retcode = SQLTablePrivileges(hstmt,
                                      NULL, 0,                                    // Catalog
-                                     (UCHAR FAR *)schema, SQL_NTS,               // Schema
+                                     NULL, 0,                                    // Schema
                                      (UCHAR FAR *)TableName.c_str(), SQL_NTS);
     }
 
                                      (UCHAR FAR *)TableName.c_str(), SQL_NTS);
     }
 
@@ -3384,6 +3476,9 @@ bool wxDb::ModifyColumn(const wxString &tableName, const wxString &columnName,
            case DB_DATA_TYPE_DATE :
                    dataTypeName = typeInfDate.TypeName;
                    break;
            case DB_DATA_TYPE_DATE :
                    dataTypeName = typeInfDate.TypeName;
                    break;
+           case DB_DATA_TYPE_BLOB :
+                   dataTypeName = typeInfBlob.TypeName;
+                   break;
            default:
                    return FALSE;
        }
            default:
                    return FALSE;
        }
@@ -3491,7 +3586,7 @@ wxDb WXDLLEXPORT *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCurso
     pList->Uid      = pDbConfig->GetUserID();
     pList->AuthStr  = pDbConfig->GetPassword();
 
     pList->Uid      = pDbConfig->GetUserID();
     pList->AuthStr  = pDbConfig->GetPassword();
 
-    pList->PtrDb = new wxDb((HENV)pDbConfig->GetHenvAddress(),FwdOnlyCursors);
+    pList->PtrDb = new wxDb(pDbConfig->GetHenv(), FwdOnlyCursors);
 
     bool opened = FALSE;
 
 
     bool opened = FALSE;