X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/942e67c3a36319dbdb32df86a50b475c05900197..d43088ee78dca3fc64f9d419b184844eb72384da:/src/common/db.cpp diff --git a/src/common/db.cpp b/src/common/db.cpp index a58740df04..523da04b94 100644 --- a/src/common/db.cpp +++ b/src/common/db.cpp @@ -138,30 +138,34 @@ typedef struct /********** wxDbConnectInf Constructor - form 1 **********/ wxDbConnectInf::wxDbConnectInf() { + Henv = 0; + freeHenvOnDestroy = FALSE; + 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(); - if (Henv) - SetHenv(Henv); + if (henv) + SetHenv(henv); 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 @@ -180,6 +184,9 @@ bool wxDbConnectInf::Initialize() { freeHenvOnDestroy = FALSE; + if (freeHenvOnDestroy && Henv) + FreeHenv(); + Henv = 0; Dsn[0] = 0; Uid[0] = 0; @@ -251,6 +258,18 @@ void wxDbConnectInf::SetPassword(const wxString &password) /********** wxDbColFor Constructor **********/ wxDbColFor::wxDbColFor() +{ + Initialize(); +} // wxDbColFor::wxDbColFor() + + +wxDbColFor::~wxDbColFor() +{ +} // wxDbColFor::~wxDbColFor() + + +/********** wxDbColFor::Initialize() **********/ +void wxDbColFor::Initialize() { 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 -} // wxDbColFor::wxDbColFor() - - -wxDbColFor::~wxDbColFor() -{ -} // wxDbColFor::~wxDbColFor() +} // wxDbColFor::Initialize() /********** 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; + if (i_sqlDataType == SQL_C_BINARY) + i_dbDataType = DB_DATA_TYPE_BLOB; } 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; + 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; @@ -358,8 +377,24 @@ int wxDbColFor::Format(int Nation, int dbDataType, SWORD sqlDataType, } // wxDbColFor::Format() + /********** 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; @@ -379,26 +414,15 @@ wxDbColInf::wxDbColInf() 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() { - tableName[0] = 0; - tableType[0] = 0; - tableRemarks[0] = 0; - numCols = 0; - pColInf = NULL; + Initialize(); } // wxDbTableInf::wxDbTableInf() @@ -411,14 +435,23 @@ 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() { - catalog[0] = 0; - schema[0] = 0; - numTables = 0; - pTableInf = NULL; -} // wxDbInf::wxDbFor() + Initialize(); +} // wxDbInf::wxDbInf() /********** wxDbInf Destructor *************/ @@ -430,18 +463,32 @@ 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::wxDb(HENV &aHenv, bool FwdOnlyCursors) +wxDb::wxDb(const HENV &aHenv, bool FwdOnlyCursors) { // Copy the HENV into the db class henv = aHenv; fwdOnlyCursors = FwdOnlyCursors; - Initialize(); + + initialize(); } // 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 @@ -454,11 +501,11 @@ void wxDb::Initialize() 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++) - wxStrcpy(errorList[i], wxT("")); + wxStrcpy(errorList[i], wxEmptyString); // Init typeInf structures typeInfVarchar.TypeName.Empty(); @@ -485,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; @@ -497,7 +550,7 @@ void wxDb::Initialize() // Mark database as not open as of yet dbIsOpen = FALSE; -} // wxDb::Initialize() +} // wxDb::initialize() /********** 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 - SQLSetConnectOption(hdbc, 1041, (UDWORD) wxT("")); - SQLSetConnectOption(hdbc, 1042, (UDWORD) wxT("")); + SQLSetConnectOption(hdbc, 1041, (UDWORD) wxEmptyString); + SQLSetConnectOption(hdbc, 1042, (UDWORD) wxEmptyString); */ // 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 // - // 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 @@ -648,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)) @@ -694,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 + typeInfInteger.FsqlType = SQL_VARBINARY; + } + else + typeInfInteger.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 @@ -708,6 +773,13 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt } // 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(); @@ -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 - SQLSetConnectOption(hdbc, 1041, (UDWORD) wxT("")); - SQLSetConnectOption(hdbc, 1042, (UDWORD) wxT("")); + SQLSetConnectOption(hdbc, 1041, (UDWORD) wxEmptyString); + SQLSetConnectOption(hdbc, 1042, (UDWORD) wxEmptyString); */ // Mark database as open @@ -819,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 @@ -2051,8 +2131,8 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) 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 @@ -2135,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++; } } @@ -2208,8 +2289,8 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh 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; } @@ -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; - 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 @@ -2306,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++; } @@ -2398,8 +2481,8 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) 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 ... @@ -2461,8 +2544,8 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh 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; } @@ -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_BINARY: + colInf[colNo].dbDataType = DB_DATA_TYPE_BLOB; + break; #ifdef __WXDEBUG__ default: wxString errMsg; @@ -3384,6 +3470,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; } @@ -3491,7 +3580,7 @@ wxDb WXDLLEXPORT *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCurso 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;