Firebird DB support added. Basic testing is done, and appears to work fully. Need real users to test the additions please
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31157 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
856e0fa454
commit
215a0070c1
@ -460,7 +460,8 @@ enum wxDBMS
|
||||
dbmsDB2,
|
||||
dbmsINTERBASE,
|
||||
dbmsPERVASIVE_SQL,
|
||||
dbmsXBASE_SEQUITER
|
||||
dbmsXBASE_SEQUITER,
|
||||
dbmsFIREBIRD
|
||||
};
|
||||
|
||||
|
||||
|
@ -2493,6 +2493,7 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID)
|
||||
// Oracle and Interbase table names are uppercase only, so force
|
||||
// the name to uppercase just in case programmer forgot to do this
|
||||
if ((Dbms() == dbmsORACLE) ||
|
||||
(Dbms() == dbmsFIREBIRD) ||
|
||||
(Dbms() == dbmsINTERBASE))
|
||||
TableName = TableName.Upper();
|
||||
|
||||
@ -2648,6 +2649,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, UWORD *numCols, const wx
|
||||
// Oracle and Interbase table names are uppercase only, so force
|
||||
// the name to uppercase just in case programmer forgot to do this
|
||||
if ((Dbms() == dbmsORACLE) ||
|
||||
(Dbms() == dbmsFIREBIRD) ||
|
||||
(Dbms() == dbmsINTERBASE))
|
||||
TableName = TableName.Upper();
|
||||
|
||||
@ -2903,6 +2905,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
|
||||
// Oracle and Interbase table names are uppercase only, so force
|
||||
// the name to uppercase just in case programmer forgot to do this
|
||||
if ((Dbms() == dbmsORACLE) ||
|
||||
(Dbms() == dbmsFIREBIRD) ||
|
||||
(Dbms() == dbmsINTERBASE))
|
||||
TableName = TableName.Upper();
|
||||
|
||||
@ -3142,6 +3145,7 @@ int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID)
|
||||
// Oracle and Interbase table names are uppercase only, so force
|
||||
// the name to uppercase just in case programmer forgot to do this
|
||||
if ((Dbms() == dbmsORACLE) ||
|
||||
(Dbms() == dbmsFIREBIRD) ||
|
||||
(Dbms() == dbmsINTERBASE))
|
||||
TableName = TableName.Upper();
|
||||
|
||||
@ -3350,6 +3354,7 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName)
|
||||
if (!UserID.empty() &&
|
||||
Dbms() != dbmsMY_SQL &&
|
||||
Dbms() != dbmsACCESS &&
|
||||
Dbms() != dbmsFIREBIRD &&
|
||||
Dbms() != dbmsINTERBASE &&
|
||||
Dbms() != dbmsMS_SQL_SERVER)
|
||||
{
|
||||
@ -3470,6 +3475,7 @@ bool wxDb::TableExists(const wxString &tableName, const wxChar *userID, const wx
|
||||
// Oracle and Interbase table names are uppercase only, so force
|
||||
// the name to uppercase just in case programmer forgot to do this
|
||||
if ((Dbms() == dbmsORACLE) ||
|
||||
(Dbms() == dbmsFIREBIRD) ||
|
||||
(Dbms() == dbmsINTERBASE))
|
||||
TableName = TableName.Upper();
|
||||
|
||||
@ -3483,6 +3489,7 @@ bool wxDb::TableExists(const wxString &tableName, const wxChar *userID, const wx
|
||||
Dbms() != dbmsACCESS &&
|
||||
Dbms() != dbmsMS_SQL_SERVER &&
|
||||
Dbms() != dbmsDB2 &&
|
||||
Dbms() != dbmsFIREBIRD &&
|
||||
Dbms() != dbmsINTERBASE &&
|
||||
Dbms() != dbmsPERVASIVE_SQL)
|
||||
{
|
||||
@ -3541,6 +3548,7 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons
|
||||
// Oracle and Interbase table names are uppercase only, so force
|
||||
// the name to uppercase just in case programmer forgot to do this
|
||||
if ((Dbms() == dbmsORACLE) ||
|
||||
(Dbms() == dbmsFIREBIRD) ||
|
||||
(Dbms() == dbmsINTERBASE))
|
||||
TableName = TableName.Upper();
|
||||
|
||||
@ -3785,8 +3793,18 @@ wxDBMS wxDb::Dbms(void)
|
||||
if (dbmsType != dbmsUNIDENTIFIED)
|
||||
return(dbmsType);
|
||||
|
||||
#ifdef DBDEBUG_CONSOLE
|
||||
// When run in console mode, use standard out to display errors.
|
||||
cout << "Database connecting to: " << dbInf.dbmsName << endl;
|
||||
cout << wxT("Press any key to continue...") << endl;
|
||||
getchar();
|
||||
#endif // DBDEBUG_CONSOLE
|
||||
|
||||
wxLogDebug(wxT("Database connecting to: "));
|
||||
wxLogDebug(dbInf.dbmsName);
|
||||
|
||||
wxChar baseName[25+1];
|
||||
wxStrncpy(baseName,dbInf.dbmsName,25);
|
||||
wxStrncpy(baseName, dbInf.dbmsName, 25);
|
||||
baseName[25] = 0;
|
||||
|
||||
// RGG 20001025 : add support for Interbase
|
||||
@ -3829,6 +3847,9 @@ wxDBMS wxDb::Dbms(void)
|
||||
if (!wxStricmp(baseName,wxT("Informix")))
|
||||
return((wxDBMS)(dbmsType = dbmsINFORMIX));
|
||||
|
||||
if (!wxStricmp(baseName,wxT("Firebird")))
|
||||
return((wxDBMS)(dbmsType = dbmsFIREBIRD));
|
||||
|
||||
baseName[6] = 0;
|
||||
if (!wxStricmp(baseName,wxT("Oracle")))
|
||||
return((wxDBMS)(dbmsType = dbmsORACLE));
|
||||
|
@ -170,6 +170,11 @@ bool wxDbTable::initialize(wxDb *pwxDb, const wxString &tblName, const UWORD num
|
||||
return false;
|
||||
|
||||
tableName = tblName; // Table Name
|
||||
if ((pDb->Dbms() == dbmsORACLE) ||
|
||||
(pDb->Dbms() == dbmsFIREBIRD) ||
|
||||
(pDb->Dbms() == dbmsINTERBASE))
|
||||
tableName = tableName.Upper();
|
||||
|
||||
if (tblPath.Length())
|
||||
tablePath = tblPath; // Table Path - used for dBase files
|
||||
else
|
||||
@ -180,6 +185,11 @@ bool wxDbTable::initialize(wxDb *pwxDb, const wxString &tblName, const UWORD num
|
||||
else
|
||||
queryTableName = tblName;
|
||||
|
||||
if ((pDb->Dbms() == dbmsORACLE) ||
|
||||
(pDb->Dbms() == dbmsFIREBIRD) ||
|
||||
(pDb->Dbms() == dbmsINTERBASE))
|
||||
queryTableName = queryTableName.Upper();
|
||||
|
||||
pDb->incrementTableCount();
|
||||
|
||||
wxString s;
|
||||
@ -778,7 +788,7 @@ bool wxDbTable::Open(bool checkPrivileges, bool checkTableExists)
|
||||
// Unfortunately this optimization doesn't seem to be
|
||||
// reliable!
|
||||
if (// *(pDb->dbInf.accessibleTables) == 'N' &&
|
||||
!pDb->TablePrivileges(tableName,wxT("SELECT"), pDb->GetUsername(), pDb->GetUsername(), tablePath))
|
||||
!pDb->TablePrivileges(tableName, wxT("SELECT"), pDb->GetUsername(), pDb->GetUsername(), tablePath))
|
||||
s = wxT("Connecting user does not have sufficient privileges to access this table.\n");
|
||||
}
|
||||
|
||||
@ -1469,6 +1479,7 @@ bool wxDbTable::CreateTable(bool attemptDrop)
|
||||
pDb->Dbms() == dbmsMY_SQL ||
|
||||
pDb->Dbms() == dbmsSYBASE_ASE ||
|
||||
pDb->Dbms() == dbmsINTERBASE ||
|
||||
pDb->Dbms() == dbmsFIREBIRD ||
|
||||
pDb->Dbms() == dbmsMS_SQL_SERVER)
|
||||
{
|
||||
if (colDefs[i].KeyField)
|
||||
@ -1498,6 +1509,7 @@ bool wxDbTable::CreateTable(bool attemptDrop)
|
||||
case dbmsSYBASE_ASA:
|
||||
case dbmsSYBASE_ASE:
|
||||
case dbmsMY_SQL:
|
||||
case dbmsFIREBIRD:
|
||||
{
|
||||
// MySQL goes out on this one. We also declare the relevant key NON NULL above
|
||||
sqlStmt += wxT(",PRIMARY KEY (");
|
||||
@ -1746,6 +1758,7 @@ bool wxDbTable::CreateIndex(const wxString &idxName, bool unique, UWORD noIdxCol
|
||||
|
||||
// Postgres and SQL Server 7 do not support the ASC/DESC keywords for index columns
|
||||
if (!((pDb->Dbms() == dbmsMS_SQL_SERVER) && (wxStrncmp(pDb->dbInf.dbmsVer,_T("07"),2)==0)) &&
|
||||
!(pDb->Dbms() == dbmsFIREBIRD) &&
|
||||
!(pDb->Dbms() == dbmsPOSTGRES))
|
||||
{
|
||||
if (pIdxDefs[i].Ascending)
|
||||
@ -1770,7 +1783,8 @@ bool wxDbTable::CreateIndex(const wxString &idxName, bool unique, UWORD noIdxCol
|
||||
#endif
|
||||
|
||||
// Execute the CREATE INDEX statement
|
||||
if (SQLExecDirect(hstmt, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS)
|
||||
RETCODE retcode = SQLExecDirect(hstmt, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS);
|
||||
if (retcode != SQL_SUCCESS)
|
||||
{
|
||||
pDb->DispAllErrors(henv, hdbc, hstmt);
|
||||
pDb->RollbackTrans();
|
||||
@ -1820,8 +1834,8 @@ bool wxDbTable::DropIndex(const wxString &idxName)
|
||||
#ifdef DBDEBUG_CONSOLE
|
||||
cout << endl << sqlStmt.c_str() << endl;
|
||||
#endif
|
||||
|
||||
if (SQLExecDirect(hstmt, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS)
|
||||
RETCODE retcode = SQLExecDirect(hstmt, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS);
|
||||
if (retcode != SQL_SUCCESS)
|
||||
{
|
||||
// Check for "Index not found" error and ignore
|
||||
pDb->GetNextError(henv, hdbc, hstmt);
|
||||
@ -1831,7 +1845,8 @@ bool wxDbTable::DropIndex(const wxString &idxName)
|
||||
if (!((pDb->Dbms() == dbmsSYBASE_ASA && !wxStrcmp(pDb->sqlState,wxT("42000"))) || // v5.x (and lower?)
|
||||
(pDb->Dbms() == dbmsSYBASE_ASE && !wxStrcmp(pDb->sqlState,wxT("37000"))) ||
|
||||
(pDb->Dbms() == dbmsMS_SQL_SERVER && !wxStrcmp(pDb->sqlState,wxT("S1000"))) ||
|
||||
(pDb->Dbms() == dbmsINTERBASE && !wxStrcmp(pDb->sqlState,wxT("S1000"))) ||
|
||||
(pDb->Dbms() == dbmsINTERBASE && !wxStrcmp(pDb->sqlState,wxT("S1000"))) ||
|
||||
(pDb->Dbms() == dbmsFIREBIRD && !wxStrcmp(pDb->sqlState,wxT("HY000"))) ||
|
||||
(pDb->Dbms() == dbmsSYBASE_ASE && !wxStrcmp(pDb->sqlState,wxT("S0002"))) || // Base table not found
|
||||
(pDb->Dbms() == dbmsMY_SQL && !wxStrcmp(pDb->sqlState,wxT("42S12"))) || // tested by Christopher Ludwik Marino-Cebulski using v3.23.21beta
|
||||
(pDb->Dbms() == dbmsPOSTGRES && !wxStrcmp(pDb->sqlState,wxT("08S01")))
|
||||
@ -1903,7 +1918,7 @@ int wxDbTable::Insert(void)
|
||||
|
||||
// Insert the record by executing the already prepared insert statement
|
||||
RETCODE retcode;
|
||||
retcode=SQLExecute(hstmtInsert);
|
||||
retcode = SQLExecute(hstmtInsert);
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO &&
|
||||
retcode != SQL_NEED_DATA)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user