Fixed incorrect creation of the pColFor instances (per Roger Gammans patches). This fixes surious crashes with large database systems, and significantly increases the speed of the application when idntifying all datasource tables.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10364 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
George Tasker
2001-05-28 12:02:51 +00:00
parent 66080691b1
commit 412394b831

View File

@@ -227,21 +227,23 @@ bool BrowserDB::OnGetNext(int Cols,int Quiet)
for (i=0;i<Cols;i++) for (i=0;i<Cols;i++)
{ {
strcpy((cl_BrowserDB+i)->tableName,"-E->"); strcpy((cl_BrowserDB+i)->tableName,"-E->");
i_dbDataType = (cl_BrowserDB->pColFor+i)->i_dbDataType; i_dbDataType = (cl_BrowserDB+i)->pColFor->i_dbDataType;
if (i_dbDataType == 0) // Filter unsupported dbDataTypes if (i_dbDataType == 0) // Filter unsupported dbDataTypes
{ {
if (((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_VARCHAR) || ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_LONGVARCHAR)) if (((cl_BrowserDB+i)->pColFor->i_sqlDataType == SQL_VARCHAR) ||
((cl_BrowserDB+i)->pColFor->i_sqlDataType == SQL_LONGVARCHAR))
i_dbDataType = DB_DATA_TYPE_VARCHAR; i_dbDataType = DB_DATA_TYPE_VARCHAR;
if ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_C_DATE) if ((cl_BrowserDB+i)->pColFor->i_sqlDataType == SQL_C_DATE)
i_dbDataType = DB_DATA_TYPE_DATE; i_dbDataType = DB_DATA_TYPE_DATE;
if ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_C_BIT) if ((cl_BrowserDB+i)->pColFor->i_sqlDataType == SQL_C_BIT)
i_dbDataType = DB_DATA_TYPE_INTEGER; i_dbDataType = DB_DATA_TYPE_INTEGER;
if ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_NUMERIC) if ((cl_BrowserDB+i)->pColFor->i_sqlDataType == SQL_NUMERIC)
i_dbDataType = DB_DATA_TYPE_VARCHAR; i_dbDataType = DB_DATA_TYPE_VARCHAR;
if ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_REAL) if ((cl_BrowserDB+i)->pColFor->i_sqlDataType == SQL_REAL)
i_dbDataType = DB_DATA_TYPE_FLOAT; i_dbDataType = DB_DATA_TYPE_FLOAT;
} }
if ((i_dbDataType == DB_DATA_TYPE_INTEGER) && ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_C_DOUBLE)) if ((i_dbDataType == DB_DATA_TYPE_INTEGER) &&
((cl_BrowserDB+i)->pColFor->i_sqlDataType == SQL_C_DOUBLE))
{ // DBASE Numeric { // DBASE Numeric
i_dbDataType = DB_DATA_TYPE_FLOAT; i_dbDataType = DB_DATA_TYPE_FLOAT;
} }
@@ -249,31 +251,31 @@ bool BrowserDB::OnGetNext(int Cols,int Quiet)
{ {
case DB_DATA_TYPE_VARCHAR: case DB_DATA_TYPE_VARCHAR:
strcpy(s_temp,""); strcpy(s_temp,"");
if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB->pColFor+i)->i_dbDataType,&s_temp,sizeof(s_temp), &cb)) if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB+i)->pColFor->i_dbDataType,&s_temp,sizeof(s_temp), &cb))
{ {
Temp0.Printf(_("\n-E-> BrowserDB::OnGetNext - ODBC-Error with GetNext of >%s<.\n-E-> "),(cl_BrowserDB+i)->tableName); Temp0.Printf(_("\n-E-> BrowserDB::OnGetNext - ODBC-Error with GetNext of >%s<.\n-E-> "),(cl_BrowserDB+i)->tableName);
Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__);
wxLogMessage(Temp0); wxLogMessage(Temp0);
} }
Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,s_temp); Temp0.Printf((cl_BrowserDB+i)->pColFor->s_Field,s_temp);
strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str());
break; break;
case DB_DATA_TYPE_INTEGER: case DB_DATA_TYPE_INTEGER:
l_temp = 0; l_temp = 0;
if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB->pColFor+i)->i_sqlDataType,&l_temp,sizeof(l_temp), &cb)) if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB+i)->pColFor->i_sqlDataType,&l_temp,sizeof(l_temp), &cb))
{ {
Temp0.Printf(_("\n-E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n-E-> ")); Temp0.Printf(_("\n-E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n-E-> "));
Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__);
} }
else else
{ {
Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,l_temp); Temp0.Printf((cl_BrowserDB+i)->pColFor->s_Field,l_temp);
strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str());
} }
break; break;
case DB_DATA_TYPE_FLOAT: case DB_DATA_TYPE_FLOAT:
f_temp = 0; f_temp = 0;
if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB->pColFor+i)->i_sqlDataType,&f_temp,sizeof(f_temp), &cb)) if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB+i)->pColFor->i_sqlDataType,&f_temp,sizeof(f_temp), &cb))
{ {
Temp0.Printf(_("\n-E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n-E-> ")); Temp0.Printf(_("\n-E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n-E-> "));
Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__);
@@ -281,13 +283,13 @@ bool BrowserDB::OnGetNext(int Cols,int Quiet)
} }
else else
{ {
Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,f_temp); Temp0.Printf((cl_BrowserDB+i)->pColFor->s_Field,f_temp);
strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str());
} }
break; break;
case DB_DATA_TYPE_DATE: case DB_DATA_TYPE_DATE:
t_temp.day = t_temp.month = t_temp.year = t_temp.hour = t_temp.minute = t_temp.second = t_temp.fraction = 0; t_temp.day = t_temp.month = t_temp.year = t_temp.hour = t_temp.minute = t_temp.second = t_temp.fraction = 0;
if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB->pColFor+i)->i_sqlDataType,&t_temp,sizeof(t_temp), &cb)) if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB+i)->pColFor->i_sqlDataType,&t_temp,sizeof(t_temp), &cb))
{ {
Temp0.Printf(_("\n-E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n-E-> ")); Temp0.Printf(_("\n-E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n-E-> "));
Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__);
@@ -295,23 +297,23 @@ bool BrowserDB::OnGetNext(int Cols,int Quiet)
else else
{ {
// i_Nation = 0 = timestamp , 1=EU, 2=UK, 3=International, 4=US // i_Nation = 0 = timestamp , 1=EU, 2=UK, 3=International, 4=US
if (((cl_BrowserDB->pColFor+i)->i_Nation == 0) || // TS YYYY-MM-DD if (((cl_BrowserDB+i)->pColFor->i_Nation == 0) || // TS YYYY-MM-DD
((cl_BrowserDB->pColFor+i)->i_Nation == 3)) // IT YYYY-MM-DD ((cl_BrowserDB+i)->pColFor->i_Nation == 3)) // IT YYYY-MM-DD
{ {
Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,t_temp.year,t_temp.month,t_temp.day, Temp0.Printf((cl_BrowserDB+i)->pColFor->s_Field,t_temp.year,t_temp.month,t_temp.day,
t_temp.hour, t_temp.minute, t_temp.second, t_temp.fraction); t_temp.hour, t_temp.minute, t_temp.second, t_temp.fraction);
strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str());
} }
if (((cl_BrowserDB->pColFor+i)->i_Nation == 1) || // EU DD.MM.YYYY if (((cl_BrowserDB+i)->pColFor->i_Nation == 1) || // EU DD.MM.YYYY
((cl_BrowserDB->pColFor+i)->i_Nation == 2)) // UK DD/MM/YYYY ((cl_BrowserDB+i)->pColFor->i_Nation == 2)) // UK DD/MM/YYYY
{ {
Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,t_temp.day,t_temp.month,t_temp.year, Temp0.Printf((cl_BrowserDB+i)->pColFor->s_Field,t_temp.day,t_temp.month,t_temp.year,
t_temp.hour, t_temp.minute, t_temp.second, t_temp.fraction); t_temp.hour, t_temp.minute, t_temp.second, t_temp.fraction);
strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str());
} }
if ((cl_BrowserDB->pColFor+i)->i_Nation == 3) // US MM/DD/YYYY if ((cl_BrowserDB+i)->pColFor->i_Nation == 3) // US MM/DD/YYYY
{ {
Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,t_temp.month,t_temp.day,t_temp.year, Temp0.Printf((cl_BrowserDB+i)->pColFor->s_Field,t_temp.month,t_temp.day,t_temp.year,
t_temp.hour, t_temp.minute, t_temp.second, t_temp.fraction); t_temp.hour, t_temp.minute, t_temp.second, t_temp.fraction);
strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str());
} }
@@ -322,11 +324,11 @@ bool BrowserDB::OnGetNext(int Cols,int Quiet)
if (AnzError <= 100) if (AnzError <= 100)
{ {
Temp0 = (cl_BrowserDB+i)->colName; Temp0 = (cl_BrowserDB+i)->colName;
wxLogMessage(_("-E-> BrowserDB::OnGetNext - DB_DATA_TYPE_?? (%d) in Col(%s)"),(cl_BrowserDB->pColFor+i)->i_dbDataType,Temp0.c_str()); wxLogMessage(_("-E-> BrowserDB::OnGetNext - DB_DATA_TYPE_?? (%d) in Col(%s)"),(cl_BrowserDB+i)->pColFor->i_dbDataType,Temp0.c_str());
} }
else else
return TRUE; return TRUE;
Temp0.Printf(_("-E-> unknown Format(%d) - sql(%d)"),(cl_BrowserDB->pColFor+i)->i_dbDataType,(cl_BrowserDB->pColFor+i)->i_sqlDataType); Temp0.Printf(_("-E-> unknown Format(%d) - sql(%d)"),(cl_BrowserDB+i)->pColFor->i_dbDataType,(cl_BrowserDB+i)->pColFor->i_sqlDataType);
strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str());
break; break;
}; // switch }; // switch
@@ -412,11 +414,17 @@ wxDbColInf* BrowserDB::OnGetColumns(char *tableName, UWORD numCols, int Quiet)
int i; int i;
strcpy(UName,UserName); strcpy(UName,UserName);
cl_BrowserDB = db_BrowserDB->GetColumns(tableName,&numCols,UName); cl_BrowserDB = db_BrowserDB->GetColumns(tableName,&numCols,UName);
cl_BrowserDB->pColFor = new wxDbColFor[numCols]; // cl_BrowserDB->pColFor = new wxDbColFor[numCols];
for (i=0;i<numCols;i++) for (i=0;i<numCols;i++)
{ {
(cl_BrowserDB->pColFor+i)->Format(1,(cl_BrowserDB+i)->dbDataType,(cl_BrowserDB+i)->sqlDataType, // (cl_BrowserDB->pColFor+i)->Format(1,(cl_BrowserDB+i)->dbDataType,(cl_BrowserDB+i)->sqlDataType,
(cl_BrowserDB+i)->columnSize, (cl_BrowserDB+i)->decimalDigits); // (cl_BrowserDB+i)->columnSize, (cl_BrowserDB+i)->decimalDigits);
(cl_BrowserDB+i)->pColFor = new wxDbColFor;
(cl_BrowserDB+i)->pColFor->Format(1,
(cl_BrowserDB+i)->dbDataType,
(cl_BrowserDB+i)->sqlDataType,
(cl_BrowserDB+i)->columnSize,
(cl_BrowserDB+i)->decimalDigits);
} }
return cl_BrowserDB; return cl_BrowserDB;
} }