Updated the Remstar ODBC files, got the db sample compiling; added Freq and SubString

to wxString


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1283 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
1998-12-30 17:40:53 +00:00
parent aaa38880c4
commit 1fc5dd6f8e
13 changed files with 804 additions and 585 deletions

View File

@@ -5,6 +5,8 @@
// source such as opening and closing the data source.
// Author: Doug Card
// Modified by:
// Mods: Dec, 1998: Added support for SQL statement logging and database
// cataloging
// Created: 9.96
// RCS-ID: $Id$
// Copyright: (c) 1996 Remstar International, Inc.
@@ -20,17 +22,17 @@
// the wxWindows GUI development toolkit.
///////////////////////////////////////////////////////////////////////////////
/*
// SYNOPSIS START
// SYNOPSIS STOP
*/
#ifdef __GNUG__
#pragma implementation "db.h"
#endif
/*
#ifdef _CONSOLE
// SYNOPSIS START
// SYNOPSIS STOP
*/
/*
#ifdef DBDEBUG_CONSOLE
#include <iostream.h>
#endif
*/
@@ -47,11 +49,10 @@
#if wxUSE_ODBC
#include <wx/db.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "wx/db.h"
DbList *PtrBegDbList = 0;
@@ -59,6 +60,9 @@ DbList *PtrBegDbList = 0;
wxDB::wxDB(HENV &aHenv)
{
int i;
fpSqlLog = 0; // Sql Log file pointer
sqlLogState = sqlLogOFF; // By default, logging is turned off
strcpy(sqlState,"");
strcpy(errorMsg,"");
@@ -112,7 +116,7 @@ wxDB::wxDB(HENV &aHenv)
/********** wxDB::Open() **********/
bool wxDB::Open(char *Dsn, char *Uid, char *AuthStr)
{
assert(Dsn);
assert(Dsn && strlen(Dsn));
dsn = Dsn;
uid = Uid;
authStr = AuthStr;
@@ -125,7 +129,7 @@ bool wxDB::Open(char *Dsn, char *Uid, char *AuthStr)
// specified before the connection is made.
retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED);
#ifdef _CONSOLE
#ifdef DBDEBUG_CONSOLE
if (retcode == SQL_SUCCESS)
cout << "SQLSetConnectOption(CURSOR_LIB) successful" << endl;
else
@@ -240,7 +244,7 @@ bool wxDB::Open(char *Dsn, char *Uid, char *AuthStr)
else
typeInfDate.FsqlType = SQL_TIMESTAMP;
#ifdef _CONSOLE
#ifdef DBDEBUG_CONSOLE
cout << "VARCHAR DATA TYPE: " << typeInfVarchar.TypeName << endl;
cout << "INTEGER DATA TYPE: " << typeInfInteger.TypeName << endl;
cout << "FLOAT DATA TYPE: " << typeInfFloat.TypeName << endl;
@@ -262,7 +266,7 @@ bool wxDB::setConnectionOptions(void)
SQLSetConnectOption(hdbc, SQL_OPT_TRACE, SQL_OPT_TRACE_OFF);
// Display the connection options to verify them
#ifdef _CONSOLE
#ifdef DBDEBUG_CONSOLE
long l;
cout << ">>>>> CONNECTION OPTIONS <<<<<<" << endl;
@@ -394,7 +398,7 @@ bool wxDB::getDbInfo(void)
if (SQLGetInfo(hdbc, SQL_LOGIN_TIMEOUT, &dbInf.loginTimeout, sizeof(dbInf.loginTimeout), &cb) != SQL_SUCCESS)
return(DispAllErrors(henv, hdbc));
#ifdef _CONSOLE
#ifdef DBDEBUG_CONSOLE
cout << ">>>>> DATA SOURCE INFORMATION <<<<<" << endl;
cout << "SERVER Name: " << dbInf.serverName << endl;
cout << "DBMS Name: " << dbInf.dbmsName << "; DBMS Version: " << dbInf.dbmsVer << endl;
@@ -612,7 +616,7 @@ bool wxDB::getDataTypeInfo(SWORD fSqlType, SqlTypeInfo &structSQLTypeInfo)
// Fetch the record
if ((retcode = SQLFetch(hstmt)) != SQL_SUCCESS)
{
#ifdef _CONSOLE
#ifdef DBDEBUG_CONSOLE
if (retcode == SQL_NO_DATA_FOUND)
cout << "SQL_NO_DATA_FOUND fetching inf. about data type." << endl;
#endif
@@ -647,6 +651,13 @@ bool wxDB::getDataTypeInfo(SWORD fSqlType, SqlTypeInfo &structSQLTypeInfo)
/********** wxDB::Close() **********/
void wxDB::Close(void)
{
// Close the Sql Log file
if (fpSqlLog)
{
fclose(fpSqlLog);
fpSqlLog = 0; //glt
}
// Free statement handle
if (dbIsOpen)
{
@@ -699,7 +710,7 @@ bool wxDB::DispAllErrors(HENV aHenv, HDBC aHdbc, HSTMT aHstmt)
logError(odbcErrMsg, sqlState);
if (!silent)
{
#ifdef _CONSOLE
#ifdef DBDEBUG_CONSOLE
// When run in console mode, use standard out to display errors.
cout << odbcErrMsg << endl;
cout << "Press any key to continue..." << endl;
@@ -733,7 +744,7 @@ void wxDB::DispNextError(void)
if (silent)
return;
#ifdef _CONSOLE
#ifdef DBDEBUG_CONSOLE
// When run in console mode, use standard out to display errors.
cout << odbcErrMsg << endl;
cout << "Press any key to continue..." << endl;
@@ -994,10 +1005,12 @@ bool wxDB::Grant(int privileges, char *tableName, char *userList)
strcat(sqlStmt, " TO ");
strcat(sqlStmt, userList);
#ifdef _CONSOLE
#ifdef DBDEBUG_CONSOLE
cout << endl << sqlStmt << endl;
#endif
WriteSqlLog(sqlStmt);
return(ExecSql(sqlStmt));
} // wxDB::Grant()
@@ -1025,7 +1038,9 @@ bool wxDB::CreateView(char *viewName, char *colList, char *pSqlStmt)
}
}
#ifdef _CONSOLE
WriteSqlLog(sqlStmt);
#ifdef DBDEBUG_CONSOLE
cout << endl << sqlStmt << endl;
#endif
@@ -1043,7 +1058,9 @@ bool wxDB::CreateView(char *viewName, char *colList, char *pSqlStmt)
strcat(sqlStmt, " AS ");
strcat(sqlStmt, pSqlStmt);
#ifdef _CONSOLE
WriteSqlLog(sqlStmt);
#ifdef DBDEBUG_CONSOLE
cout << sqlStmt << endl;
#endif
@@ -1161,6 +1178,101 @@ CcolInf *wxDB::GetColumns(char *tableName[])
} // wxDB::GetColumns()
/********** wxDB::Catalog() **********/
bool wxDB::Catalog(char *userID, char *fileName)
{
assert(userID && strlen(userID));
assert(fileName && strlen(fileName));
RETCODE retcode;
SDWORD cb;
char tblName[DB_MAX_TABLE_NAME_LEN+1];
char tblNameSave[DB_MAX_TABLE_NAME_LEN+1];
char colName[DB_MAX_COLUMN_NAME_LEN+1];
SWORD sqlDataType;
char typeName[16];
SWORD precision, length;
FILE *fp = fopen(fileName,"wt");
if (fp == NULL)
return(FALSE);
SQLFreeStmt(hstmt, SQL_CLOSE);
int i = 0;
char userIdUC[81];
for (char *p = userID; *p; p++)
userIdUC[i++] = toupper(*p);
userIdUC[i] = 0;
retcode = SQLColumns(hstmt,
NULL, 0, // All qualifiers
(UCHAR *) userIdUC, SQL_NTS, // User specified
NULL, 0, // All tables
NULL, 0); // All columns
if (retcode != SQL_SUCCESS)
{
DispAllErrors(henv, hdbc, hstmt);
fclose(fp);
return(FALSE);
}
SQLBindCol(hstmt, 3, SQL_C_CHAR, tblName, DB_MAX_TABLE_NAME_LEN+1, &cb);
SQLBindCol(hstmt, 4, SQL_C_CHAR, colName, DB_MAX_COLUMN_NAME_LEN+1, &cb);
SQLBindCol(hstmt, 5, SQL_C_SSHORT, &sqlDataType, 0, &cb);
SQLBindCol(hstmt, 6, SQL_C_CHAR, typeName, 16, &cb);
SQLBindCol(hstmt, 7, SQL_C_SSHORT, &precision, 0, &cb);
SQLBindCol(hstmt, 8, SQL_C_SSHORT, &length, 0, &cb);
char outStr[256];
strcpy(tblNameSave,"");
int cnt = 0;
while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS)
{
if (strcmp(tblName,tblNameSave))
{
if (cnt)
fputs("\n", fp);
fputs("================================ ", fp);
fputs("================================ ", fp);
fputs("===================== ", fp);
fputs("========= ", fp);
fputs("=========\n", fp);
sprintf(outStr, "%-32s %-32s %-21s %9s %9s\n",
"TABLE NAME", "COLUMN NAME", "DATA TYPE", "PRECISION", "LENGTH");
fputs(outStr, fp);
fputs("================================ ", fp);
fputs("================================ ", fp);
fputs("===================== ", fp);
fputs("========= ", fp);
fputs("=========\n", fp);
strcpy(tblNameSave,tblName);
}
sprintf(outStr, "%-32s %-32s (%04d)%-15s %9d %9d\n",
tblName, colName, sqlDataType, typeName, precision, length);
if (fputs(outStr, fp) == EOF)
{
fclose(fp);
return(FALSE);
}
cnt++;
}
if (retcode != SQL_NO_DATA_FOUND)
{
DispAllErrors(henv, hdbc, hstmt);
fclose(fp);
return(FALSE);
}
SQLFreeStmt(hstmt, SQL_CLOSE);
fclose(fp);
return(TRUE);
} // wxDB::Catalog()
// Table name can refer to a table, view, alias or synonym. Returns true
// if the object exists in the database. This function does not indicate
// whether or not the user has privleges to query or perform other functions
@@ -1190,6 +1302,54 @@ bool wxDB::TableExists(char *tableName)
} // wxDB::TableExists()
/********** wxDB::SqlLog() **********/
bool wxDB::SqlLog(enum sqlLog state, char *filename, bool append)
{
assert(state == sqlLogON || state == sqlLogOFF);
assert(state == sqlLogOFF || filename);
if (state == sqlLogON)
{
if (fpSqlLog == 0)
{
fpSqlLog = fopen(filename, (append ? "at" : "wt"));
if (fpSqlLog == NULL)
return(FALSE);
}
}
else // sqlLogOFF
{
if (fpSqlLog)
{
if (fclose(fpSqlLog))
return(FALSE);
fpSqlLog = 0;
}
}
sqlLogState = state;
return(TRUE);
} // wxDB::SqlLog()
/********** wxDB::WriteSqlLog() **********/
bool wxDB::WriteSqlLog(char *logMsg)
{
assert(logMsg);
if (fpSqlLog == 0 || sqlLogState == sqlLogOFF)
return(FALSE);
if (fputs("\n", fpSqlLog) == EOF) return(FALSE);
if (fputs(logMsg, fpSqlLog) == EOF) return(FALSE);
if (fputs("\n", fpSqlLog) == EOF) return(FALSE);
return(TRUE);
} // wxDB::WriteSqlLog()
/********** GetDbConnection() **********/
wxDB *GetDbConnection(DbStuff *pDbStuff)
{
@@ -1319,4 +1479,5 @@ bool GetDataSource(HENV henv, char *Dsn, SWORD DsnMax, char *DsDesc, SWORD DsDes
} // GetDataSource()
#endif
// wxUSE_ODBC
// wxUSE_ODBC