#include "wx/object.h"
#include "wx/list.h"
#include "wx/utils.h"
- #if wxUSE_GUI
- #include "wx/msgdlg.h"
- #endif
#include "wx/log.h"
#endif
#include "wx/filefn.h"
#include "wx/db.h"
-WXDLLEXPORT_DATA(wxDbList*) PtrBegDbList = 0;
+// DLL options compatibility check:
+#include "wx/app.h"
+WX_CHECK_BUILD_OPTIONS("wxODBC")
+
+WXDLLIMPEXP_DATA_ODBC(wxDbList*) PtrBegDbList = 0;
wxChar const *SQL_LOG_FILENAME = wxT("sqllog.txt");
UserID.Empty();
// dBase does not use user names, and some drivers fail if you try to pass one
- if (Dbms() == dbmsDBASE)
+ if ( Dbms() == dbmsDBASE
+ || Dbms() == dbmsXBASE_SEQUITER )
UserID.Empty();
// Oracle user names may only be in uppercase, so force
/********** wxDb::Open() **********/
-bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr)
+bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported)
{
wxASSERT(Dsn.Length());
dsn = Dsn;
if (!getDataTypeInfo(SQL_FLOAT,typeInfFloat))
if (!getDataTypeInfo(SQL_DECIMAL,typeInfFloat))
if (!getDataTypeInfo(SQL_NUMERIC,typeInfFloat))
- return(FALSE);
+ {
+ if (failOnDataTypeUnsupported)
+ return(FALSE);
+ }
else
typeInfFloat.FsqlType = SQL_NUMERIC;
else
// If SQL_INTEGER is not supported, use the floating point
// data type to store integers as well as floats
if (!getDataTypeInfo(typeInfFloat.FsqlType, typeInfInteger))
- return(FALSE);
+ {
+ if (failOnDataTypeUnsupported)
+ return(FALSE);
+ }
else
typeInfInteger.FsqlType = typeInfFloat.FsqlType;
}
typeInfInteger.FsqlType = SQL_INTEGER;
// Date/Time
- if (Dbms() != dbmsDBASE)
- {
- if (!getDataTypeInfo(SQL_TIMESTAMP,typeInfDate))
- return(FALSE);
- else
- typeInfDate.FsqlType = SQL_TIMESTAMP;
- }
- else
+ if (!getDataTypeInfo(SQL_TIMESTAMP,typeInfDate))
{
if (!getDataTypeInfo(SQL_DATE,typeInfDate))
- return(FALSE);
+ {
+#ifdef SQL_DATETIME
+ if (getDataTypeInfo(SQL_DATETIME,typeInfDate))
+ {
+ typeInfDate.FsqlType = SQL_TIME;
+ }
+ else
+#endif // SQL_DATETIME defined
+ {
+ if (failOnDataTypeUnsupported)
+ return(FALSE);
+ }
+ }
else
typeInfDate.FsqlType = SQL_DATE;
}
+ else
+ typeInfDate.FsqlType = SQL_TIMESTAMP;
+
if (!getDataTypeInfo(SQL_LONGVARBINARY, typeInfBlob))
{
if (!getDataTypeInfo(SQL_VARBINARY,typeInfBlob))
- return(FALSE);
+ {
+ if (failOnDataTypeUnsupported)
+ return(FALSE);
+ }
else
typeInfBlob.FsqlType = SQL_VARBINARY;
}
// Get information about the data type specified
if (SQLGetTypeInfo(hstmt, fSqlType) != SQL_SUCCESS)
return(DispAllErrors(henv, hdbc, hstmt));
+
// Fetch the record
- if ((retcode = SQLFetch(hstmt)) != SQL_SUCCESS)
+ retcode = SQLFetch(hstmt);
+ if (retcode != SQL_SUCCESS)
{
#ifdef DBDEBUG_CONSOLE
if (retcode == SQL_NO_DATA_FOUND)
}
wxChar typeName[DB_TYPE_NAME_LEN+1];
+
// Obtain columns from the record
if (SQLGetData(hstmt, 1, SQL_C_CHAR, (UCHAR*) typeName, DB_TYPE_NAME_LEN, &cbRet) != SQL_SUCCESS)
return(DispAllErrors(henv, hdbc, hstmt));
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 %9d %9d\n"),
+ outStr.Printf(wxT("%-32s %-32s (%04d)%-15s %9ld %9ld\n"),
tblName, colName, sqlDataType, typeName, precision, length);
if (fputs(outStr.c_str(), fp) == EOF)
{
if (!wxStricmp(baseName,wxT("DBASE")))
return((wxDBMS)(dbmsType = dbmsDBASE));
+ if (!wxStricmp(baseName,wxT("xBase")))
+ return((wxDBMS)(dbmsType = dbmsXBASE_SEQUITER));
+
+ if (!wxStricmp(baseName,wxT("MySQL")))
+ return((wxDBMS)(dbmsType = dbmsMY_SQL));
+
baseName[3] = 0;
if (!wxStricmp(baseName,wxT("DB2")))
return((wxDBMS)(dbmsType = dbmsDBASE));
case dbmsPOSTGRES :
case dbmsACCESS :
case dbmsDBASE :
+ case dbmsXBASE_SEQUITER :
default :
alterSlashModify = "MODIFY";
break;
}
// create the SQL statement
- sqlStmt.Printf(wxT("ALTER TABLE \"%s\" \"%s\" \"%s\" %s"), tableName.c_str(), alterSlashModify.c_str(),
+ if ( Dbms() == dbmsMY_SQL )
+ {
+ sqlStmt.Printf(wxT("ALTER TABLE %s %s %s %s"), tableName.c_str(), alterSlashModify.c_str(),
columnName.c_str(), dataTypeName.c_str());
+ }
+ else
+ {
+ sqlStmt.Printf(wxT("ALTER TABLE \"%s\" \"%s\" \"%s\" %s"), tableName.c_str(), alterSlashModify.c_str(),
+ columnName.c_str(), dataTypeName.c_str());
+ }
// For varchars only, append the size of the column
- if (dataType == DB_DATA_TYPE_VARCHAR)
+ if (dataType == DB_DATA_TYPE_VARCHAR &&
+ (Dbms() != dbmsMY_SQL || dataTypeName != "text"))
{
wxString s;
- s.Printf(wxT("(%d)"), columnLength);
+ s.Printf(wxT("(%lu)"), columnLength);
sqlStmt += s;
}
/********** wxDbGetConnection() **********/
-wxDb WXDLLEXPORT *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCursors)
+wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCursors)
{
wxDbList *pList;
/********** wxDbFreeConnection() **********/
-bool WXDLLEXPORT wxDbFreeConnection(wxDb *pDb)
+bool WXDLLIMPEXP_ODBC wxDbFreeConnection(wxDb *pDb)
{
wxDbList *pList;
/********** wxDbCloseConnections() **********/
-void WXDLLEXPORT wxDbCloseConnections(void)
+void WXDLLIMPEXP_ODBC wxDbCloseConnections(void)
{
wxDbList *pList, *pNext;
/********** wxDbConnectionsInUse() **********/
-int WXDLLEXPORT wxDbConnectionsInUse(void)
+int WXDLLIMPEXP_ODBC wxDbConnectionsInUse(void)
{
wxDbList *pList;
int cnt = 0;
/********** wxDbLogExtendedErrorMsg() **********/
// DEBUG ONLY function
-const wxChar WXDLLEXPORT *wxDbLogExtendedErrorMsg(const wxChar *userText,
+const wxChar* WXDLLIMPEXP_ODBC wxDbLogExtendedErrorMsg(const wxChar *userText,
wxDb *pDb,
const wxChar *ErrFile,
int ErrLine)
return wxDbGetDataSource(henv, Dsn, DsnMax, DsDesc, DsDescMax, direction);
}
/***** DEPRECATED: use wxDbGetConnection() *****/
-wxDb WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors)
+wxDb WXDLLIMPEXP_ODBC *GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors)
{
return wxDbGetConnection((wxDbConnectInf *)pDbStuff, FwdOnlyCursors);
}
/***** DEPRECATED: use wxDbFreeConnection() *****/
-bool WXDLLEXPORT FreeDbConnection(wxDb *pDb)
+bool WXDLLIMPEXP_ODBC FreeDbConnection(wxDb *pDb)
{
return wxDbFreeConnection(pDb);
}
/***** DEPRECATED: use wxDbCloseConnections() *****/
-void WXDLLEXPORT CloseDbConnections(void)
+void WXDLLIMPEXP_ODBC CloseDbConnections(void)
{
wxDbCloseConnections();
}
/***** DEPRECATED: use wxDbConnectionsInUse() *****/
-int WXDLLEXPORT NumberDbConnectionsInUse(void)
+int WXDLLIMPEXP_ODBC NumberDbConnectionsInUse(void)
{
return wxDbConnectionsInUse();
}