[SF#789459] Add support for connection strings. The patch originally submitted was not comprehensive enough to use for the connection caching, so a significant number of additional changes were added to support opening a connection with a connection string

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27241 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
George Tasker
2004-05-12 19:41:03 +00:00
parent 28b22cccde
commit 0907ea9c58
4 changed files with 228 additions and 88 deletions

View File

@@ -274,16 +274,25 @@ enum wxODBC_ERRORS
#define SQL_MAX_AUTHSTR_LEN MAXNAME #define SQL_MAX_AUTHSTR_LEN MAXNAME
#endif #endif
#ifndef SQL_MAX_CONNECTSTR_LEN
// There does not seem to be a standard for this, so I am
// defaulting to the value that MS recommends
#define SQL_MAX_CONNECTSTR_LEN 1024
#endif
class WXDLLIMPEXP_ODBC wxDbConnectInf class WXDLLIMPEXP_ODBC wxDbConnectInf
{ {
private: private:
bool freeHenvOnDestroy; bool freeHenvOnDestroy;
bool useConnectionStr;
public: public:
HENV Henv; HENV Henv;
wxChar Dsn[SQL_MAX_DSN_LENGTH+1]; // Data Source Name wxChar Dsn[SQL_MAX_DSN_LENGTH+1]; // Data Source Name
wxChar Uid[SQL_MAX_USER_NAME_LEN+1]; // User ID wxChar Uid[SQL_MAX_USER_NAME_LEN+1]; // User ID
wxChar AuthStr[SQL_MAX_AUTHSTR_LEN+1]; // Authorization string (password) wxChar AuthStr[SQL_MAX_AUTHSTR_LEN+1]; // Authorization string (password)
wxChar ConnectionStr[SQL_MAX_CONNECTSTR_LEN+1]; // Connection string (password)
wxString Description; // Not sure what the max length is wxString Description; // Not sure what the max length is
wxString FileType; // Not sure what the max length is wxString FileType; // Not sure what the max length is
@@ -316,6 +325,9 @@ class WXDLLIMPEXP_ODBC wxDbConnectInf
const wxChar *GetAuthStr() { return AuthStr; }; const wxChar *GetAuthStr() { return AuthStr; };
const wxChar *GetPassword() { return AuthStr; }; const wxChar *GetPassword() { return AuthStr; };
const wxChar *GetConnectionStr() { return ConnectionStr; };
bool UseConnectionStr() { return useConnectionStr; };
const wxChar *GetDescription() { return Description; }; const wxChar *GetDescription() { return Description; };
const wxChar *GetFileType() { return FileType; }; const wxChar *GetFileType() { return FileType; };
const wxChar *GetDefaultDir() { return DefaultDir; }; const wxChar *GetDefaultDir() { return DefaultDir; };
@@ -330,6 +342,8 @@ class WXDLLIMPEXP_ODBC wxDbConnectInf
void SetPassword(const wxString &password); void SetPassword(const wxString &password);
void SetAuthStr(const wxString &authstr) { SetPassword(authstr); }; void SetAuthStr(const wxString &authstr) { SetPassword(authstr); };
void SetConnectionStr(const wxString &connectStr);
void SetDescription(const wxString &desc) { Description = desc; }; void SetDescription(const wxString &desc) { Description = desc; };
void SetFileType(const wxString &fileType) { FileType = fileType; }; void SetFileType(const wxString &fileType) { FileType = fileType; };
void SetDefaultDir(const wxString &defDir) { DefaultDir = defDir; }; void SetDefaultDir(const wxString &defDir) { DefaultDir = defDir; };
@@ -472,21 +486,25 @@ class WXDLLIMPEXP_ODBC wxDb
private: private:
bool dbIsOpen; bool dbIsOpen;
bool dbIsCached; // Was connection created by caching functions bool dbIsCached; // Was connection created by caching functions
bool dbOpenedWithConnectionString; // Was the database connection opened with a connection string
wxString dsn; // Data source name wxString dsn; // Data source name
wxString uid; // User ID wxString uid; // User ID
wxString authStr; // Authorization string (password) wxString authStr; // Authorization string (password)
wxString inConnectionStr; // Connection string used to connect to the database
wxString outConnectionStr;// Connection string returned by the database when a connection is successfully opened
FILE *fpSqlLog; // Sql Log file pointer FILE *fpSqlLog; // Sql Log file pointer
wxDbSqlLogState sqlLogState; // On or Off wxDbSqlLogState sqlLogState; // On or Off
bool fwdOnlyCursors; bool fwdOnlyCursors;
wxDBMS dbmsType; // Type of datasource - i.e. Oracle, dBase, SQLServer, etc wxDBMS dbmsType; // Type of datasource - i.e. Oracle, dBase, SQLServer, etc
// Private member functions // Private member functions
bool getDbInfo(bool failOnDataTypeUnsupported = TRUE); bool getDbInfo(bool failOnDataTypeUnsupported=TRUE);
bool getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo); bool getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo);
bool setConnectionOptions(void); bool setConnectionOptions(void);
void logError(const wxString &errMsg, const wxString &SQLState); void logError(const wxString &errMsg, const wxString &SQLState);
const wxChar *convertUserID(const wxChar *userID, wxString &UserID); const wxChar *convertUserID(const wxChar *userID, wxString &UserID);
void initialize(); void initialize();
bool open(bool failOnDataTypeUnsupported=TRUE);
#if !wxODBC_BACKWARD_COMPATABILITY #if !wxODBC_BACKWARD_COMPATABILITY
// ODBC handles // ODBC handles
@@ -598,6 +616,7 @@ public:
~wxDb(); ~wxDb();
// Data Source Name, User ID, Password and whether open should fail on data type not supported // Data Source Name, User ID, Password and whether open should fail on data type not supported
bool Open(const wxString& inConnectStr, bool failOnDataTypeUnsupported=TRUE);
bool Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported=TRUE); bool Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported=TRUE);
bool Open(wxDbConnectInf *dbConnectInf, bool failOnDataTypeUnsupported=TRUE); bool Open(wxDbConnectInf *dbConnectInf, bool failOnDataTypeUnsupported=TRUE);
bool Open(wxDb *copyDb); // pointer to a wxDb whose connection info should be copied rather than re-queried bool Open(wxDb *copyDb); // pointer to a wxDb whose connection info should be copied rather than re-queried
@@ -627,7 +646,10 @@ public:
const wxString &GetDatasourceName(void){return dsn;} const wxString &GetDatasourceName(void){return dsn;}
const wxString &GetUsername(void) {return uid;} const wxString &GetUsername(void) {return uid;}
const wxString &GetPassword(void) {return authStr;} const wxString &GetPassword(void) {return authStr;}
const wxString &GetConnectionInStr(void) {return inConnectionStr;}
const wxString &GetConnectionOutStr(void) {return outConnectionStr;}
bool IsOpen(void) {return dbIsOpen;} bool IsOpen(void) {return dbIsOpen;}
bool OpenedWithConnectionString(void) {return dbOpenedWithConnectionString;}
HENV GetHENV(void) {return henv;} HENV GetHENV(void) {return henv;}
HDBC GetHDBC(void) {return hdbc;} HDBC GetHDBC(void) {return hdbc;}
HSTMT GetHSTMT(void) {return hstmt;} HSTMT GetHSTMT(void) {return hstmt;}
@@ -685,6 +707,7 @@ struct wxDbList
wxString Dsn; // Data Source Name wxString Dsn; // Data Source Name
wxString Uid; // User ID wxString Uid; // User ID
wxString AuthStr; // Authorization string (password) wxString AuthStr; // Authorization string (password)
wxString ConnectionStr; // Connection string used instead of DSN
wxDb *PtrDb; // Pointer to the wxDb object wxDb *PtrDb; // Pointer to the wxDb object
bool Free; // Is item free or in use? bool Free; // Is item free or in use?
wxDbList *PtrNext; // Pointer to next item in the list wxDbList *PtrNext; // Pointer to next item in the list

View File

@@ -109,6 +109,7 @@ private:
const wxString &qryTblName, bool qryOnly, const wxString &tblPath); const wxString &qryTblName, bool qryOnly, const wxString &tblPath);
void cleanup(); void cleanup();
void setCbValueForColumn(int columnIndex);
bool bindParams(bool forUpdate); // called by the other 'bind' functions bool bindParams(bool forUpdate); // called by the other 'bind' functions
bool bindInsertParams(void); bool bindInsertParams(void);
bool bindUpdateParams(void); bool bindUpdateParams(void);

View File

@@ -167,10 +167,13 @@ bool wxDbConnectInf::Initialize()
Dsn[0] = 0; Dsn[0] = 0;
Uid[0] = 0; Uid[0] = 0;
AuthStr[0] = 0; AuthStr[0] = 0;
ConnectionStr[0] = 0;
Description.Empty(); Description.Empty();
FileType.Empty(); FileType.Empty();
DefaultDir.Empty(); DefaultDir.Empty();
useConnectionStr = FALSE;
return TRUE; return TRUE;
} // wxDbConnectInf::Initialize() } // wxDbConnectInf::Initialize()
@@ -219,7 +222,7 @@ void wxDbConnectInf::SetDsn(const wxString &dsn)
void wxDbConnectInf::SetUserID(const wxString &uid) void wxDbConnectInf::SetUserID(const wxString &uid)
{ {
wxASSERT(uid.Length() < sizeof(Uid)); wxASSERT(uid.Length() < sizeof(Uid));
wxStrcpy(Uid,uid); wxStrcpy(Uid, uid);
} // wxDbConnectInf::SetUserID() } // wxDbConnectInf::SetUserID()
@@ -227,9 +230,17 @@ void wxDbConnectInf::SetPassword(const wxString &password)
{ {
wxASSERT(password.Length() < sizeof(AuthStr)); wxASSERT(password.Length() < sizeof(AuthStr));
wxStrcpy(AuthStr,password); wxStrcpy(AuthStr, password);
} // wxDbConnectInf::SetPassword() } // wxDbConnectInf::SetPassword()
void wxDbConnectInf::SetConnectionStr(const wxString &connectStr)
{
wxASSERT(connectStr.Length() < sizeof(ConnectionStr));
useConnectionStr = wxStrlen(connectStr) > 0;
wxStrcpy(ConnectionStr, connectStr);
} // wxDbConnectInf::SetConnectionStr()
/********** wxDbColFor Constructor **********/ /********** wxDbColFor Constructor **********/
@@ -540,6 +551,7 @@ void wxDb::initialize()
// Mark database as not open as of yet // Mark database as not open as of yet
dbIsOpen = FALSE; dbIsOpen = FALSE;
dbIsCached = FALSE; dbIsCached = FALSE;
dbOpenedWithConnectionString = FALSE;
} // wxDb::initialize() } // wxDb::initialize()
@@ -575,41 +587,8 @@ const wxChar *wxDb::convertUserID(const wxChar *userID, wxString &UserID)
} // wxDb::convertUserID() } // wxDb::convertUserID()
/********** wxDb::Open() **********/ bool wxDb::open(bool failOnDataTypeUnsupported)
bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported)
{ {
wxASSERT(Dsn.Length());
dsn = Dsn;
uid = Uid;
authStr = AuthStr;
RETCODE retcode;
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
if (retcode == SQL_SUCCESS)
cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
else
cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
#else
wxUnusedVar( retcode );
#endif
}
// Connect to the data source
retcode = SQLConnect(hdbc, (SQLTCHAR FAR *) dsn.c_str(), SQL_NTS,
(SQLTCHAR FAR *) uid.c_str(), SQL_NTS,
(SQLTCHAR FAR *) authStr.c_str(), SQL_NTS);
if ((retcode != SQL_SUCCESS) &&
(retcode != SQL_SUCCESS_WITH_INFO))
return(DispAllErrors(henv, hdbc));
/* /*
If using Intersolv branded ODBC drivers, this is the place where you would substitute If using Intersolv branded ODBC drivers, this is the place where you would substitute
your branded driver license information your branded driver license information
@@ -769,22 +748,62 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
// Completed Successfully // Completed Successfully
return(TRUE); return(TRUE);
}
} // wxDb::Open() bool wxDb::Open(const wxString& inConnectStr, bool failOnDataTypeUnsupported)
bool wxDb::Open(wxDbConnectInf *dbConnectInf, bool failOnDataTypeUnsupported)
{ {
return Open(dbConnectInf->GetDsn(), dbConnectInf->GetUserID(), wxASSERT(inConnectStr.Length());
dbConnectInf->GetPassword(), failOnDataTypeUnsupported); dsn = "";
} // wxDb::Open() uid = "";
authStr = "";
RETCODE retcode;
bool wxDb::Open(wxDb *copyDb) 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
if (retcode == SQL_SUCCESS)
cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
else
cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
#endif
}
// Connect to the data source
UCHAR outConnectBuffer[SQL_MAX_CONNECTSTR_LEN+1]; // MS recommends at least 1k buffer
short outConnectBufferLen;
inConnectionStr = inConnectStr;
retcode = SQLDriverConnect(hdbc, NULL, (UCHAR FAR *)inConnectionStr.c_str(),
inConnectionStr.Length(), (UCHAR FAR *)outConnectBuffer,
sizeof(outConnectBuffer), &outConnectBufferLen, SQL_DRIVER_COMPLETE );
if ((retcode != SQL_SUCCESS) &&
(retcode != SQL_SUCCESS_WITH_INFO))
return(DispAllErrors(henv, hdbc));
outConnectBuffer[outConnectBufferLen] = 0;
outConnectionStr = outConnectBuffer;
dbOpenedWithConnectionString = TRUE;
return open(failOnDataTypeUnsupported);
}
/********** wxDb::Open() **********/
bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported)
{ {
dsn = copyDb->GetDatasourceName(); wxASSERT(Dsn.Length());
uid = copyDb->GetUsername(); dsn = Dsn;
authStr = copyDb->GetPassword(); uid = Uid;
authStr = AuthStr;
inConnectionStr = "";
outConnectionStr = "";
RETCODE retcode; RETCODE retcode;
@@ -809,7 +828,84 @@ bool wxDb::Open(wxDb *copyDb)
(SQLTCHAR FAR *) uid.c_str(), SQL_NTS, (SQLTCHAR FAR *) uid.c_str(), SQL_NTS,
(SQLTCHAR FAR *) authStr.c_str(), SQL_NTS); (SQLTCHAR FAR *) authStr.c_str(), SQL_NTS);
if (retcode == SQL_ERROR) if ((retcode != SQL_SUCCESS) &&
(retcode != SQL_SUCCESS_WITH_INFO))
return(DispAllErrors(henv, hdbc));
return open(failOnDataTypeUnsupported);
} // wxDb::Open()
bool wxDb::Open(wxDbConnectInf *dbConnectInf, bool failOnDataTypeUnsupported)
{
wxASSERT(dbConnectInf);
// Use the connection string if one is present
if (dbConnectInf->UseConnectionStr())
return Open(GetConnectionInStr(), failOnDataTypeUnsupported);
else
return Open(dbConnectInf->GetDsn(), dbConnectInf->GetUserID(),
dbConnectInf->GetPassword(), failOnDataTypeUnsupported);
} // wxDb::Open()
bool wxDb::Open(wxDb *copyDb)
{
dsn = copyDb->GetDatasourceName();
uid = copyDb->GetUsername();
authStr = copyDb->GetPassword();
inConnectionStr = copyDb->GetConnectionInStr();
outConnectionStr = copyDb->GetConnectionOutStr();
RETCODE retcode;
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
if (retcode == SQL_SUCCESS)
cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
else
cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
#else
wxUnusedVar( retcode );
#endif
}
if (copyDb->OpenedWithConnectionString())
{
// Connect to the data source
UCHAR outConnectBuffer[SQL_MAX_CONNECTSTR_LEN+1];
short outConnectBufferLen;
inConnectionStr = copyDb->GetConnectionInStr();
retcode = SQLDriverConnect(hdbc, NULL, (UCHAR FAR *)inConnectionStr.c_str(),
inConnectionStr.Length(), (UCHAR FAR *)outConnectBuffer,
sizeof(outConnectBuffer), &outConnectBufferLen, SQL_DRIVER_COMPLETE);
if ((retcode != SQL_SUCCESS) &&
(retcode != SQL_SUCCESS_WITH_INFO))
return(DispAllErrors(henv, hdbc));
outConnectBuffer[outConnectBufferLen] = 0;
outConnectionStr = outConnectBuffer;
dbOpenedWithConnectionString = TRUE;
}
else
{
// Connect to the data source
retcode = SQLConnect(hdbc, (SQLTCHAR FAR *) dsn.c_str(), SQL_NTS,
(SQLTCHAR FAR *) uid.c_str(), SQL_NTS,
(SQLTCHAR FAR *) authStr.c_str(), SQL_NTS);
}
if ((retcode != SQL_SUCCESS) &&
(retcode != SQL_SUCCESS_WITH_INFO))
return(DispAllErrors(henv, hdbc)); return(DispAllErrors(henv, hdbc));
/* /*
@@ -1100,10 +1196,6 @@ bool wxDb::getDbInfo(bool failOnDataTypeUnsupported)
retcode = SQLGetInfo(hdbc, SQL_OUTER_JOINS, (UCHAR*) dbInf.outerJoins, 2, &cb); retcode = SQLGetInfo(hdbc, SQL_OUTER_JOINS, (UCHAR*) dbInf.outerJoins, 2, &cb);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
{ {
// TODO: BugTracker# 785080 : fails with mysql 4 on linux - edr
// TODO: dbInf.outerJoins[0]='N';
// TODO: dbInf.outerJoins[1]='\x0';
DispAllErrors(henv, hdbc); DispAllErrors(henv, hdbc);
if (failOnDataTypeUnsupported) if (failOnDataTypeUnsupported)
return FALSE; return FALSE;
@@ -1112,10 +1204,6 @@ bool wxDb::getDbInfo(bool failOnDataTypeUnsupported)
retcode = SQLGetInfo(hdbc, SQL_PROCEDURES, (UCHAR*) dbInf.procedureSupport, 2, &cb); retcode = SQLGetInfo(hdbc, SQL_PROCEDURES, (UCHAR*) dbInf.procedureSupport, 2, &cb);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
{ {
// TODO: BugTracker# 785080 : fails with mysql 4 on linux - edr
// TODO: dbInf.procedureSupport[0]='N';
// TODO: dbInf.procedureSupport[1]='\x0';
DispAllErrors(henv, hdbc); DispAllErrors(henv, hdbc);
if (failOnDataTypeUnsupported) if (failOnDataTypeUnsupported)
return FALSE; return FALSE;
@@ -1124,10 +1212,6 @@ bool wxDb::getDbInfo(bool failOnDataTypeUnsupported)
retcode = SQLGetInfo(hdbc, SQL_ACCESSIBLE_TABLES, (UCHAR*) dbInf.accessibleTables, 2, &cb); retcode = SQLGetInfo(hdbc, SQL_ACCESSIBLE_TABLES, (UCHAR*) dbInf.accessibleTables, 2, &cb);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
{ {
// TODO: BugTracker# 785080 : fails with mysql 4 on linux - edr
// TODO: dbInf.accessibleTables[0]='N';
// TODO: dbInf.accessibleTables[1]='\x0';
DispAllErrors(henv, hdbc); DispAllErrors(henv, hdbc);
if (failOnDataTypeUnsupported) if (failOnDataTypeUnsupported)
return FALSE; return FALSE;
@@ -1160,10 +1244,6 @@ bool wxDb::getDbInfo(bool failOnDataTypeUnsupported)
retcode = SQLGetInfo(hdbc, SQL_ODBC_SQL_OPT_IEF, (UCHAR*) dbInf.supportIEF, 2, &cb); retcode = SQLGetInfo(hdbc, SQL_ODBC_SQL_OPT_IEF, (UCHAR*) dbInf.supportIEF, 2, &cb);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
{ {
// TODO: BugTracker# 785080 : fails with mysql 4 on linux - edr
// TODO: dbInf.supportIEF[0]='N';
// TODO: dbInf.supportIEF[1]='\x0';
DispAllErrors(henv, hdbc); DispAllErrors(henv, hdbc);
if (failOnDataTypeUnsupported) if (failOnDataTypeUnsupported)
return FALSE; return FALSE;
@@ -3793,17 +3873,42 @@ wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnly
// The database connection must be for the same datasource // The database connection must be for the same datasource
// name and must currently not be in use. // name and must currently not be in use.
if (pList->Free && if (pList->Free &&
(pList->PtrDb->FwdOnlyCursors() == FwdOnlyCursors) && (pList->PtrDb->FwdOnlyCursors() == FwdOnlyCursors))
(!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn))) // Found a free connection
{ {
pList->Free = FALSE; if (pDbConfig->UseConnectionStr())
return(pList->PtrDb); {
if (pList->PtrDb->OpenedWithConnectionString() &&
(!wxStrcmp(pDbConfig->GetConnectionStr(), pList->ConnectionStr)))
{
// Found a free connection
pList->Free = FALSE;
return(pList->PtrDb);
}
}
else
{
if (!pList->PtrDb->OpenedWithConnectionString() &&
(!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn)))
{
// Found a free connection
pList->Free = FALSE;
return(pList->PtrDb);
}
}
} }
if (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn) && if (pDbConfig->UseConnectionStr())
!wxStrcmp(pDbConfig->GetUserID(), pList->Uid) && {
!wxStrcmp(pDbConfig->GetPassword(), pList->AuthStr)) if (!wxStrcmp(pDbConfig->GetConnectionStr(), pList->ConnectionStr))
matchingDbConnection = pList->PtrDb; matchingDbConnection = pList->PtrDb;
}
else
{
if (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn) &&
!wxStrcmp(pDbConfig->GetUserID(), pList->Uid) &&
!wxStrcmp(pDbConfig->GetPassword(), pList->AuthStr))
matchingDbConnection = pList->PtrDb;
}
} }
// No available connections. A new connection must be made and // No available connections. A new connection must be made and
@@ -3825,18 +3930,28 @@ wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnly
} }
// Initialize new node in the linked list // Initialize new node in the linked list
pList->PtrNext = 0; pList->PtrNext = 0;
pList->Free = FALSE; pList->Free = FALSE;
pList->Dsn = pDbConfig->GetDsn(); pList->Dsn = pDbConfig->GetDsn();
pList->Uid = pDbConfig->GetUserID(); pList->Uid = pDbConfig->GetUserID();
pList->AuthStr = pDbConfig->GetPassword(); pList->AuthStr = pDbConfig->GetPassword();
pList->ConnectionStr = pDbConfig->GetConnectionStr();
pList->PtrDb = new wxDb(pDbConfig->GetHenv(), FwdOnlyCursors); pList->PtrDb = new wxDb(pDbConfig->GetHenv(), FwdOnlyCursors);
bool opened; bool opened;
if (!matchingDbConnection) if (!matchingDbConnection)
opened = pList->PtrDb->Open(pDbConfig->GetDsn(), pDbConfig->GetUserID(), pDbConfig->GetPassword()); {
if (pDbConfig->UseConnectionStr())
{
opened = pList->PtrDb->Open(pDbConfig->GetConnectionStr());
}
else
{
opened = pList->PtrDb->Open(pDbConfig->GetDsn(), pDbConfig->GetUserID(), pDbConfig->GetPassword());
}
}
else else
opened = pList->PtrDb->Open(matchingDbConnection); opened = pList->PtrDb->Open(matchingDbConnection);
@@ -3844,7 +3959,7 @@ wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnly
if (opened) if (opened)
{ {
pList->PtrDb->setCached(TRUE); // Prevent a user from deleting a cached connection pList->PtrDb->setCached(TRUE); // Prevent a user from deleting a cached connection
pList->PtrDb->SetSqlLogging(SQLLOGstate,SQLLOGfn,TRUE); pList->PtrDb->SetSqlLogging(SQLLOGstate, SQLLOGfn, TRUE);
return(pList->PtrDb); return(pList->PtrDb);
} }
else // Unable to connect, destroy list item else // Unable to connect, destroy list item
@@ -3852,11 +3967,12 @@ wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnly
if (pList->PtrPrev) if (pList->PtrPrev)
pList->PtrPrev->PtrNext = 0; pList->PtrPrev->PtrNext = 0;
else else
PtrBegDbList = 0; // Empty list again PtrBegDbList = 0; // Empty list again
pList->PtrDb->CommitTrans(); // Commit any open transactions on wxDb object
pList->PtrDb->Close(); // Close the wxDb object pList->PtrDb->CommitTrans(); // Commit any open transactions on wxDb object
delete pList->PtrDb; // Deletes the wxDb object pList->PtrDb->Close(); // Close the wxDb object
delete pList; // Deletes the linked list object delete pList->PtrDb; // Deletes the wxDb object
delete pList; // Deletes the linked list object
return(0); return(0);
} }

View File

@@ -410,7 +410,7 @@ ODBC 3.0 says to use this form
/***************************** PRIVATE FUNCTIONS *****************************/ /***************************** PRIVATE FUNCTIONS *****************************/
bool wxDbTable::setCbValueForColumn(int columnIndex) void wxDbTable::setCbValueForColumn(int columnIndex)
{ {
switch(colDefs[columnIndex].DbDataType) switch(colDefs[columnIndex].DbDataType)
{ {
@@ -2535,7 +2535,7 @@ bool wxDbTable::SetColNull(UWORD colNo, bool set)
if (set) // Blank out the values in the member variable if (set) // Blank out the values in the member variable
ClearMemberVar(colNo, FALSE); // Must call with FALSE here, or infinite recursion will happen ClearMemberVar(colNo, FALSE); // Must call with FALSE here, or infinite recursion will happen
setCbValueForColumn(i); setCbValueForColumn(colNo);
return(TRUE); return(TRUE);
} }
@@ -2561,7 +2561,7 @@ bool wxDbTable::SetColNull(const wxString &colName, bool set)
if (set) // Blank out the values in the member variable if (set) // Blank out the values in the member variable
ClearMemberVar(colNo,FALSE); // Must call with FALSE here, or infinite recursion will happen ClearMemberVar(colNo,FALSE); // Must call with FALSE here, or infinite recursion will happen
setCbValueForColumn(i); setCbValueForColumn(colNo);
return(TRUE); return(TRUE);
} }