Semi-Blind fixes for trying to handle different versions of MySQL and MySQL windows drivers

Hopefully better handling of DATE type fields
New parameter added to optionally not have database connections fail if a basic data type (like DATE) is not reported as supported by the datasource


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14722 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
George Tasker
2002-03-22 13:43:15 +00:00
parent b58a1455e1
commit e25cdb868f
3 changed files with 47 additions and 18 deletions

View File

@@ -591,7 +591,8 @@ public:
wxDb(const HENV &aHenv, bool FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS); wxDb(const HENV &aHenv, bool FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS);
~wxDb(); ~wxDb();
bool Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr); // Data Source Name, User ID, Password // Data Source Name, User ID, Password and whether open should fail on data type not supported
bool Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported=TRUE);
bool Open(wxDbConnectInf *dbConnectInf); bool Open(wxDbConnectInf *dbConnectInf);
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
void Close(void); void Close(void);

View File

@@ -575,7 +575,7 @@ const wxChar *wxDb::convertUserID(const wxChar *userID, wxString &UserID)
/********** wxDb::Open() **********/ /********** 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()); wxASSERT(Dsn.Length());
dsn = Dsn; dsn = Dsn;
@@ -686,7 +686,10 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
if (!getDataTypeInfo(SQL_FLOAT,typeInfFloat)) if (!getDataTypeInfo(SQL_FLOAT,typeInfFloat))
if (!getDataTypeInfo(SQL_DECIMAL,typeInfFloat)) if (!getDataTypeInfo(SQL_DECIMAL,typeInfFloat))
if (!getDataTypeInfo(SQL_NUMERIC,typeInfFloat)) if (!getDataTypeInfo(SQL_NUMERIC,typeInfFloat))
return(FALSE); {
if (failOnDataTypeUnsupported)
return(FALSE);
}
else else
typeInfFloat.FsqlType = SQL_NUMERIC; typeInfFloat.FsqlType = SQL_NUMERIC;
else else
@@ -704,7 +707,10 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
// If SQL_INTEGER is not supported, use the floating point // If SQL_INTEGER is not supported, use the floating point
// data type to store integers as well as floats // data type to store integers as well as floats
if (!getDataTypeInfo(typeInfFloat.FsqlType, typeInfInteger)) if (!getDataTypeInfo(typeInfFloat.FsqlType, typeInfInteger))
return(FALSE); {
if (failOnDataTypeUnsupported)
return(FALSE);
}
else else
typeInfInteger.FsqlType = typeInfFloat.FsqlType; typeInfInteger.FsqlType = typeInfFloat.FsqlType;
} }
@@ -712,25 +718,32 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
typeInfInteger.FsqlType = SQL_INTEGER; typeInfInteger.FsqlType = SQL_INTEGER;
// Date/Time // Date/Time
if (Dbms() != dbmsDBASE) if (!getDataTypeInfo(SQL_TIMESTAMP,typeInfDate))
{
if (!getDataTypeInfo(SQL_TIMESTAMP,typeInfDate))
return(FALSE);
else
typeInfDate.FsqlType = SQL_TIMESTAMP;
}
else
{ {
if (!getDataTypeInfo(SQL_DATE,typeInfDate)) if (!getDataTypeInfo(SQL_DATE,typeInfDate))
return(FALSE); {
if (!getDataTypeInfo(SQL_DATETIME,typeInfDate))
{
if (failOnDataTypeUnsupported)
return(FALSE);
}
else
typeInfDate.FsqlType = SQL_TIME;
}
else else
typeInfDate.FsqlType = SQL_DATE; typeInfDate.FsqlType = SQL_DATE;
} }
else
typeInfDate.FsqlType = SQL_TIMESTAMP;
if (!getDataTypeInfo(SQL_LONGVARBINARY, typeInfBlob)) if (!getDataTypeInfo(SQL_LONGVARBINARY, typeInfBlob))
{ {
if (!getDataTypeInfo(SQL_VARBINARY,typeInfBlob)) if (!getDataTypeInfo(SQL_VARBINARY,typeInfBlob))
return(FALSE); {
if (failOnDataTypeUnsupported)
return(FALSE);
}
else else
typeInfBlob.FsqlType = SQL_VARBINARY; typeInfBlob.FsqlType = SQL_VARBINARY;
} }
@@ -1286,8 +1299,10 @@ bool wxDb::getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo)
// Get information about the data type specified // Get information about the data type specified
if (SQLGetTypeInfo(hstmt, fSqlType) != SQL_SUCCESS) if (SQLGetTypeInfo(hstmt, fSqlType) != SQL_SUCCESS)
return(DispAllErrors(henv, hdbc, hstmt)); return(DispAllErrors(henv, hdbc, hstmt));
// Fetch the record // Fetch the record
if ((retcode = SQLFetch(hstmt)) != SQL_SUCCESS) retcode = SQLFetch(hstmt);
if (retcode != SQL_SUCCESS)
{ {
#ifdef DBDEBUG_CONSOLE #ifdef DBDEBUG_CONSOLE
if (retcode == SQL_NO_DATA_FOUND) if (retcode == SQL_NO_DATA_FOUND)
@@ -1299,6 +1314,7 @@ bool wxDb::getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo)
} }
wxChar typeName[DB_TYPE_NAME_LEN+1]; wxChar typeName[DB_TYPE_NAME_LEN+1];
// Obtain columns from the record // Obtain columns from the record
if (SQLGetData(hstmt, 1, SQL_C_CHAR, (UCHAR*) typeName, DB_TYPE_NAME_LEN, &cbRet) != SQL_SUCCESS) if (SQLGetData(hstmt, 1, SQL_C_CHAR, (UCHAR*) typeName, DB_TYPE_NAME_LEN, &cbRet) != SQL_SUCCESS)
return(DispAllErrors(henv, hdbc, hstmt)); return(DispAllErrors(henv, hdbc, hstmt));
@@ -3478,6 +3494,9 @@ wxDBMS wxDb::Dbms(void)
if (!wxStricmp(baseName,wxT("DBASE"))) if (!wxStricmp(baseName,wxT("DBASE")))
return((wxDBMS)(dbmsType = dbmsDBASE)); return((wxDBMS)(dbmsType = dbmsDBASE));
if (!wxStricmp(baseName,wxT("MySQL")))
return((wxDBMS)(dbmsType = dbmsMY_SQL));
baseName[3] = 0; baseName[3] = 0;
if (!wxStricmp(baseName,wxT("DB2"))) if (!wxStricmp(baseName,wxT("DB2")))
return((wxDBMS)(dbmsType = dbmsDBASE)); return((wxDBMS)(dbmsType = dbmsDBASE));
@@ -3552,7 +3571,8 @@ bool wxDb::ModifyColumn(const wxString &tableName, const wxString &columnName,
columnName.c_str(), dataTypeName.c_str()); columnName.c_str(), dataTypeName.c_str());
// For varchars only, append the size of the column // 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; wxString s;
s.Printf(wxT("(%d)"), columnLength); s.Printf(wxT("(%d)"), columnLength);

View File

@@ -1384,7 +1384,8 @@ bool wxDbTable::CreateTable(bool attemptDrop)
break; break;
} }
// For varchars, append the size of the string // For varchars, append the size of the string
if (colDefs[i].DbDataType == DB_DATA_TYPE_VARCHAR)// || if (colDefs[i].DbDataType == DB_DATA_TYPE_VARCHAR &&
(pDb->Dbms() != dbmsMY_SQL || pDb->GetTypeInfVarchar().TypeName != "text"))// ||
// colDefs[i].DbDataType == DB_DATA_TYPE_BLOB) // colDefs[i].DbDataType == DB_DATA_TYPE_BLOB)
{ {
wxString s; wxString s;
@@ -1456,7 +1457,14 @@ bool wxDbTable::CreateTable(bool attemptDrop)
if (j++) // Multi part key, comma separate names if (j++) // Multi part key, comma separate names
sqlStmt += wxT(","); sqlStmt += wxT(",");
sqlStmt += pDb->SQLColumnName(colDefs[i].ColName); sqlStmt += pDb->SQLColumnName(colDefs[i].ColName);
// sqlStmt += colDefs[i].ColName;
if (pDb->Dbms() == dbmsMY_SQL &&
colDefs[i].DbDataType == DB_DATA_TYPE_VARCHAR)
{
wxString s;
s.Printf(wxT("(%d)"), colDefs[i].SzDataObj);
sqlStmt += s;
}
} }
} }
sqlStmt += wxT(")"); sqlStmt += wxT(")");