X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/da99271dcbfc8ab3da4ad18393e6b7b57b7428bf..7d88e2447eefd4660060a7e40cdff40db467753d:/src/common/db.cpp diff --git a/src/common/db.cpp b/src/common/db.cpp index e15a0f6e1c..218d94e777 100644 --- a/src/common/db.cpp +++ b/src/common/db.cpp @@ -150,8 +150,6 @@ wxDbConnectInf::wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &u const wxString &password, const wxString &defaultDir, const wxString &fileType, const wxString &description) { - wxASSERT(dsn.Length()); - Henv = 0; freeHenvOnDestroy = FALSE; @@ -322,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; + if (i_sqlDataType == SQL_C_BINARY) + i_dbDataType = DB_DATA_TYPE_BLOB; } if ((i_dbDataType == DB_DATA_TYPE_INTEGER) && (i_sqlDataType == SQL_C_DOUBLE)) @@ -366,6 +366,9 @@ int wxDbColFor::Format(int Nation, int dbDataType, SWORD sqlDataType, 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; @@ -529,6 +532,12 @@ void wxDb::initialize() 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; @@ -643,7 +652,7 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt // 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 @@ -692,7 +701,6 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt // Float if (!getDataTypeInfo(SQL_DOUBLE,typeInfFloat)) - if (!getDataTypeInfo(SQL_REAL,typeInfFloat)) if (!getDataTypeInfo(SQL_FLOAT,typeInfFloat)) if (!getDataTypeInfo(SQL_DECIMAL,typeInfFloat)) @@ -738,11 +746,24 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt 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; + cout << wxT("BLOB DATA TYPE: ") << typeInfBlob.TypeName << endl; cout << endl; #endif @@ -870,11 +891,19 @@ bool wxDb::Open(wxDb *copyDb) 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; + cout << wxT("BLOB DATA TYPE: ") << typeInfBlob.TypeName << endl; cout << endl; #endif @@ -1907,7 +1936,7 @@ bool wxDb::GetData(UWORD colNo, SWORD cType, PTR pData, SDWORD maxLen, SDWORD FA /********** 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 */ @@ -1917,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; - int i; + SWORD i; wxString tempStr; /* * ----------------------------------------------------------------------- @@ -2075,8 +2104,8 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) * to avoid undesired unbinding of columns. */ { - int noCols = 0; - int colNo = 0; + UWORD noCols = 0; + UWORD colNo = 0; wxDbColInf *colInf = 0; RETCODE retcode; @@ -2186,13 +2215,14 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) #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; - else if (!wxStricmp(typeInfFloat.TypeName,colInf[colNo].typeName)) + else if (!wxStricmp(typeInfFloat.TypeName, colInf[colNo].typeName)) 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; - + else if (!wxStricmp(typeInfBlob.TypeName, colInf[colNo].typeName)) + colInf[colNo].dbDataType = DB_DATA_TYPE_BLOB; colNo++; } } @@ -2216,7 +2246,7 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) /********** 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 @@ -2232,8 +2262,8 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh // to avoid undesired unbinding of columns. { - int noCols = 0; - int colNo = 0; + UWORD noCols = 0; + UWORD colNo = 0; wxDbColInf *colInf = 0; RETCODE retcode; @@ -2343,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; - 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 @@ -2357,12 +2387,14 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh 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; - else if (!wxStricmp(typeInfFloat.TypeName,colInf[colNo].typeName)) + else if (!wxStricmp(typeInfFloat.TypeName, colInf[colNo].typeName)) 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; + else if (!wxStricmp(typeInfBlob.TypeName, colInf[colNo].typeName)) + colInf[colNo].dbDataType = DB_DATA_TYPE_BLOB; colNo++; } @@ -2415,7 +2447,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh typedef struct { - int noCols; + UWORD noCols; wxDbColInf *colInf; } _TableColumns; @@ -2426,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. - int noCols = 0; + UWORD noCols = 0; // How many tables ? int tbl; @@ -2485,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. { - SWORD noCols = 0; - int colNo = 0; + UWORD noCols = 0; + UWORD colNo = 0; wxDbColInf *colInf = 0; RETCODE retcode; @@ -2620,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_BINARY: + colInf[colNo].dbDataType = DB_DATA_TYPE_BLOB; + break; #ifdef __WXDEBUG__ default: wxString errMsg; @@ -2727,7 +2762,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh /********** 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 @@ -2743,7 +2778,7 @@ int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID) * to avoid undesired unbinding of columns. */ { - int noCols = 0; + UWORD noCols = 0; RETCODE retcode; @@ -3137,8 +3172,9 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons wxString TableName; - wxString UserID; + wxString UserID,Schema; convertUserID(userID,UserID); + convertUserID(schema,Schema); TableName = tableName; // Oracle and Interbase table names are uppercase only, so force @@ -3149,18 +3185,23 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons 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 - 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 *)schema, SQL_NTS, // Schema + NULL, 0, // Schema (UCHAR FAR *)TableName.c_str(), SQL_NTS); } @@ -3435,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_BLOB : + dataTypeName = typeInfBlob.TypeName; + break; default: return FALSE; }