// Created: 9.96
// RCS-ID: $Id$
// Copyright: (c) 1996 Remstar International, Inc.
-// Licence: wxWindows licence, plus:
-// Notice: This class library and its intellectual design are free of charge for use,
-// modification, enhancement, debugging under the following conditions:
-// 1) These classes may only be used as part of the implementation of a
-// wxWindows-based application
-// 2) All enhancements and bug fixes are to be submitted back to the wxWindows
-// user groups free of all charges for use with the wxWindows library.
-// 3) These classes may not be distributed as part of any other class library,
-// DLL, text (written or electronic), other than a complete distribution of
-// the wxWindows GUI development toolkit.
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
/*
Dsn[0] = 0;
Uid[0] = 0;
AuthStr[0] = 0;
+ ConnectionStr[0] = 0;
Description.Empty();
FileType.Empty();
DefaultDir.Empty();
+ useConnectionStr = FALSE;
+
return TRUE;
} // wxDbConnectInf::Initialize()
void wxDbConnectInf::SetUserID(const wxString &uid)
{
wxASSERT(uid.Length() < sizeof(Uid));
- wxStrcpy(Uid,uid);
+ wxStrcpy(Uid, uid);
} // wxDbConnectInf::SetUserID()
{
wxASSERT(password.Length() < sizeof(AuthStr));
- wxStrcpy(AuthStr,password);
+ wxStrcpy(AuthStr, password);
} // wxDbConnectInf::SetPassword()
+void wxDbConnectInf::SetConnectionStr(const wxString &connectStr)
+{
+ wxASSERT(connectStr.Length() < sizeof(ConnectionStr));
+
+ useConnectionStr = wxStrlen(connectStr) > 0;
+
+ wxStrcpy(ConnectionStr, connectStr);
+} // wxDbConnectInf::SetConnectionStr()
/********** wxDbColFor Constructor **********/
// Mark database as not open as of yet
dbIsOpen = FALSE;
dbIsCached = FALSE;
+ dbOpenedWithConnectionString = FALSE;
} // wxDb::initialize()
} // wxDb::convertUserID()
-/********** wxDb::Open() **********/
-bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported)
+bool wxDb::open(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
your branded driver license information
// Completed Successfully
return(TRUE);
+}
+
+bool wxDb::Open(const wxString& inConnectStr, bool failOnDataTypeUnsupported)
+{
+ wxASSERT(inConnectStr.Length());
+ dsn = wxT("");
+ uid = wxT("");
+ authStr = wxT("");
+
+ 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
+ SQLTCHAR outConnectBuffer[SQL_MAX_CONNECTSTR_LEN+1]; // MS recommends at least 1k buffer
+ short outConnectBufferLen;
+
+ inConnectionStr = inConnectStr;
+
+ retcode = SQLDriverConnect(hdbc, NULL, (SQLTCHAR FAR *)inConnectionStr.c_str(),
+ inConnectionStr.Length(), (SQLTCHAR 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)
+{
+ wxASSERT(Dsn.Length());
+ dsn = Dsn;
+ uid = Uid;
+ authStr = AuthStr;
+
+ inConnectionStr = wxT("");
+ outConnectionStr = wxT("");
+
+ 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));
+
+ return open(failOnDataTypeUnsupported);
} // wxDb::Open()
bool wxDb::Open(wxDbConnectInf *dbConnectInf, bool failOnDataTypeUnsupported)
{
- return Open(dbConnectInf->GetDsn(), dbConnectInf->GetUserID(),
- dbConnectInf->GetPassword(), 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();
+ dsn = copyDb->GetDatasourceName();
+ uid = copyDb->GetUsername();
+ authStr = copyDb->GetPassword();
+ inConnectionStr = copyDb->GetConnectionInStr();
+ outConnectionStr = copyDb->GetConnectionOutStr();
RETCODE 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 (copyDb->OpenedWithConnectionString())
+ {
+ // Connect to the data source
+ SQLTCHAR outConnectBuffer[SQL_MAX_CONNECTSTR_LEN+1];
+ short outConnectBufferLen;
+
+ inConnectionStr = copyDb->GetConnectionInStr();
+
+ retcode = SQLDriverConnect(hdbc, NULL, (SQLTCHAR FAR *)inConnectionStr.c_str(),
+ inConnectionStr.Length(), (SQLTCHAR FAR *)outConnectBuffer,
+ sizeof(outConnectBuffer), &outConnectBufferLen, SQL_DRIVER_COMPLETE);
- if (retcode == SQL_ERROR)
+ 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));
/*
retcode = SQLGetInfo(hdbc, SQL_OUTER_JOINS, (UCHAR*) dbInf.outerJoins, 2, &cb);
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);
if (failOnDataTypeUnsupported)
return FALSE;
retcode = SQLGetInfo(hdbc, SQL_PROCEDURES, (UCHAR*) dbInf.procedureSupport, 2, &cb);
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);
if (failOnDataTypeUnsupported)
return FALSE;
retcode = SQLGetInfo(hdbc, SQL_ACCESSIBLE_TABLES, (UCHAR*) dbInf.accessibleTables, 2, &cb);
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);
if (failOnDataTypeUnsupported)
return FALSE;
retcode = SQLGetInfo(hdbc, SQL_ODBC_SQL_OPT_IEF, (UCHAR*) dbInf.supportIEF, 2, &cb);
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);
if (failOnDataTypeUnsupported)
return FALSE;
#ifdef __WXDEBUG__
wxTablesInUse *tiu;
- wxNode *pNode;
+ wxList::compatibility_iterator pNode;
pNode = TablesInUse.GetFirst();
wxString s,s2;
while (pNode)
#ifdef __WXDEBUG__
default:
wxString errMsg;
- errMsg.Printf(wxT("SQL Data type %d currently not supported by wxWindows"), colInf[colNo].sqlDataType);
+ errMsg.Printf(wxT("SQL Data type %d currently not supported by wxWidgets"), colInf[colNo].sqlDataType);
wxLogDebug(errMsg,wxT("ODBC DEBUG MESSAGE"));
#endif
}
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
break;
+ GetData(3,SQL_C_CHAR, (UCHAR *) tblName, DB_MAX_TABLE_NAME_LEN+1, &cb);
+ GetData(4,SQL_C_CHAR, (UCHAR *) colName, DB_MAX_COLUMN_NAME_LEN+1,&cb);
+ GetData(5,SQL_C_SSHORT,(UCHAR *)&sqlDataType, 0, &cb);
+ GetData(6,SQL_C_CHAR, (UCHAR *) typeName, sizeof(typeName), &cb);
+ GetData(7,SQL_C_SLONG, (UCHAR *)&precision, 0, &cb);
+ GetData(8,SQL_C_SLONG, (UCHAR *)&length, 0, &cb);
+
if (wxStrcmp(tblName, tblNameSave.c_str()))
{
if (cnt)
tblNameSave = tblName;
}
- GetData(3,SQL_C_CHAR, (UCHAR *) tblName, DB_MAX_TABLE_NAME_LEN+1, &cb);
- GetData(4,SQL_C_CHAR, (UCHAR *) colName, DB_MAX_COLUMN_NAME_LEN+1,&cb);
- GetData(5,SQL_C_SSHORT,(UCHAR *)&sqlDataType, 0, &cb);
- GetData(6,SQL_C_CHAR, (UCHAR *) typeName, sizeof(typeName), &cb);
- GetData(7,SQL_C_SLONG, (UCHAR *)&precision, 0, &cb);
- GetData(8,SQL_C_SLONG, (UCHAR *)&length, 0, &cb);
-
outStr.Printf(wxT("%-32s %-32s (%04d)%-15s %9ld %9ld\n"),
tblName, colName, sqlDataType, typeName, precision, length);
if (wxFputs(outStr.c_str(), fp) == EOF)
// The database connection must be for the same datasource
// name and must currently not be in use.
if (pList->Free &&
- (pList->PtrDb->FwdOnlyCursors() == FwdOnlyCursors) &&
- (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn))) // Found a free connection
+ (pList->PtrDb->FwdOnlyCursors() == FwdOnlyCursors))
{
- pList->Free = FALSE;
- return(pList->PtrDb);
+ if (pDbConfig->UseConnectionStr())
+ {
+ 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) &&
- !wxStrcmp(pDbConfig->GetUserID(), pList->Uid) &&
- !wxStrcmp(pDbConfig->GetPassword(), pList->AuthStr))
- matchingDbConnection = pList->PtrDb;
+ if (pDbConfig->UseConnectionStr())
+ {
+ if (!wxStrcmp(pDbConfig->GetConnectionStr(), pList->ConnectionStr))
+ 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
}
// Initialize new node in the linked list
- pList->PtrNext = 0;
- pList->Free = FALSE;
- pList->Dsn = pDbConfig->GetDsn();
- pList->Uid = pDbConfig->GetUserID();
- pList->AuthStr = pDbConfig->GetPassword();
+ pList->PtrNext = 0;
+ pList->Free = FALSE;
+ pList->Dsn = pDbConfig->GetDsn();
+ pList->Uid = pDbConfig->GetUserID();
+ pList->AuthStr = pDbConfig->GetPassword();
+ pList->ConnectionStr = pDbConfig->GetConnectionStr();
pList->PtrDb = new wxDb(pDbConfig->GetHenv(), FwdOnlyCursors);
bool opened;
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
opened = pList->PtrDb->Open(matchingDbConnection);
if (opened)
{
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);
}
else // Unable to connect, destroy list item
if (pList->PtrPrev)
pList->PtrPrev->PtrNext = 0;
else
- PtrBegDbList = 0; // Empty list again
- pList->PtrDb->CommitTrans(); // Commit any open transactions on wxDb object
- pList->PtrDb->Close(); // Close the wxDb object
- delete pList->PtrDb; // Deletes the wxDb object
- delete pList; // Deletes the linked list object
+ PtrBegDbList = 0; // Empty list again
+
+ pList->PtrDb->CommitTrans(); // Commit any open transactions on wxDb object
+ pList->PtrDb->Close(); // Close the wxDb object
+ delete pList->PtrDb; // Deletes the wxDb object
+ delete pList; // Deletes the linked list object
return(0);
}