From 6919c53fd2584020b83faf9908a249bbec964a0e Mon Sep 17 00:00:00 2001
From: George Tasker <gtasker@allenbrook.com>
Date: Thu, 25 Nov 1999 15:54:04 +0000
Subject: [PATCH] Added "const" to the (char *) type params that should have
 been const params.  Cleaned up code surrounding the upper casing (or not
 uppercasing) user names and table names for specific databases.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4690 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 src/common/db.cpp      | 155 ++++++------
 src/common/dbtable.cpp | 531 +++++++++++++++++++++--------------------
 2 files changed, 335 insertions(+), 351 deletions(-)

diff --git a/src/common/db.cpp b/src/common/db.cpp
index 38dd746a33..5dfd9ce512 100644
--- a/src/common/db.cpp
+++ b/src/common/db.cpp
@@ -184,12 +184,12 @@ 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 DBDEBUG_CONSOLE
+#ifdef DBDEBUG_CONSOLE
 		if (retcode == SQL_SUCCESS)
 			cout << "SQLSetConnectOption(CURSOR_LIB) successful" << endl;
 		else
 			cout << "SQLSetConnectOption(CURSOR_LIB) failed" << endl;
-	#endif
+#endif
 
 #endif
 
@@ -875,7 +875,7 @@ void wxDB::DispNextError(void)
 } // wxDB::DispNextError()
 
 /********** wxDB::logError() **********/
-void wxDB::logError(char *errMsg, char *SQLState)
+void wxDB::logError(const char *errMsg, const char *SQLState)
 {
 	assert(errMsg && wxStrlen(errMsg));
 
@@ -902,7 +902,7 @@ void wxDB::logError(char *errMsg, char *SQLState)
 }  // wxDB::logError()
 
 /**********wxDB::TranslateSqlState()  **********/
-int wxDB::TranslateSqlState(char *SQLState)
+int wxDB::TranslateSqlState(const char *SQLState)
 {
 	if (!wxStrcmp(SQLState, "01000"))
 		return(DB_ERR_GENERAL_WARNING);
@@ -1089,7 +1089,7 @@ int wxDB::TranslateSqlState(char *SQLState)
 }  // wxDB::TranslateSqlState()
 	
 /**********  wxDB::Grant() **********/
-bool wxDB::Grant(int privileges, char *tableName, char *userList)
+bool wxDB::Grant(int privileges, const char *tableName, const char *userList)
 {
 	char sqlStmt[DB_MAX_STATEMENT_LEN];
 
@@ -1141,7 +1141,7 @@ bool wxDB::Grant(int privileges, char *tableName, char *userList)
 }  // wxDB::Grant()
 
 /********** wxDB::CreateView() **********/
-bool wxDB::CreateView(char *viewName, char *colList, char *pSqlStmt, bool attemptDrop)
+bool wxDB::CreateView(const char *viewName, const char *colList, const char *pSqlStmt, bool attemptDrop)
 {
 	char sqlStmt[DB_MAX_STATEMENT_LEN];
 
@@ -1174,7 +1174,7 @@ bool wxDB::CreateView(char *viewName, char *colList, char *pSqlStmt, bool attemp
 }  // wxDB::CreateView()
 
 /********** wxDB::DropView()  **********/
-bool wxDB::DropView(char *viewName)
+bool wxDB::DropView(const char *viewName)
 {
 	// NOTE: This function returns TRUE if the View does not exist, but
 	//       only for identified databases.  Code will need to be added
@@ -1218,7 +1218,7 @@ bool wxDB::DropView(char *viewName)
 
 
 /********** wxDB::ExecSql()  **********/
-bool wxDB::ExecSql(char *pSqlStmt)
+bool wxDB::ExecSql(const char *pSqlStmt)
 {
 	SQLFreeStmt(hstmt, SQL_CLOSE);
 	if (SQLExecDirect(hstmt, (UCHAR FAR *) pSqlStmt, SQL_NTS) == SQL_SUCCESS)
@@ -1278,36 +1278,34 @@ bool wxDB::GetData(UWORD colNo, SWORD cType, PTR pData, SDWORD maxLen, SDWORD FA
  *				delete [] colInf;
  *			}
  */
-CcolInf *wxDB::GetColumns(char *tableName[], char *userID)
+CcolInf *wxDB::GetColumns(char *tableName[], const char *userID)
 {
-	UINT noCols = 0;
-	UINT colNo = 0;
+	UINT     noCols = 0;
+	UINT     colNo  = 0;
 	CcolInf *colInf = 0;
-	RETCODE retcode;
-	SDWORD cb;
-	char tblName[DB_MAX_TABLE_NAME_LEN+1];
-	char colName[DB_MAX_COLUMN_NAME_LEN+1];
-	SWORD sqlDataType;
-	char userIdUC[80+1];
-	char tableNameUC[DB_MAX_TABLE_NAME_LEN+1];
+
+	RETCODE  retcode;
+	SDWORD   cb;
+	char     tblName[DB_MAX_TABLE_NAME_LEN+1];
+	char     colName[DB_MAX_COLUMN_NAME_LEN+1];
+	SWORD    sqlDataType;
+
+	wxString UserID;
+	wxString TableName;
 
 	if (!userID || !wxStrlen(userID))
-		userID = uid;
+		UserID = uid;
+	else
+		UserID = userID;
 
 	// dBase does not use user names, and some drivers fail if you try to pass one
 	if (Dbms() == dbmsDBASE)
-		userID = "";
+		UserID = "";
 
 	// Oracle user names may only be in uppercase, so force 
 	// the name to uppercase
 	if (Dbms() == dbmsORACLE)
-	{
-		int i = 0;
-		for (char *p = userID; *p; p++)
-			userIdUC[i++] = toupper(*p);
-		userIdUC[i] = 0;
-		userID = userIdUC;
-	}
+		UserID = UserID.Upper();
 
 	// Pass 1 - Determine how many columns there are.
 	// Pass 2 - Allocate the CcolInf array and fill in
@@ -1332,30 +1330,24 @@ CcolInf *wxDB::GetColumns(char *tableName[], char *userID)
 		int tbl;
 		for (tbl = 0; tableName[tbl]; tbl++)
 		{
+			TableName = tableName[tbl];
 			// Oracle table names are uppercase only, so force 
 			// the name to uppercase just in case programmer forgot to do this
 			if (Dbms() == dbmsORACLE)
-			{
-				int i = 0;
-				for (char *p = tableName[tbl]; *p; p++)
-					tableNameUC[i++] = toupper(*p);
-				tableNameUC[i] = 0;
-			}
-			else
-				sprintf(tableNameUC,tableName[tbl]);
+				TableName = TableName.Upper();
 
 			SQLFreeStmt(hstmt, SQL_CLOSE);
 
 			// MySQL and Access cannot accept a user name when looking up column names, so we
 			// use the call below that leaves out the user name
-			if (wxStrcmp(userID,"") &&
+			if (wxStrcmp(UserID.GetData(),"") &&
 				 Dbms() != dbmsMY_SQL &&
 				 Dbms() != dbmsACCESS)
 			{
 				retcode = SQLColumns(hstmt,
 											NULL, 0,											// All qualifiers
-											(UCHAR *) userID, SQL_NTS,					// Owner
-											(UCHAR *) tableNameUC, SQL_NTS,
+											(UCHAR *) UserID.GetData(), SQL_NTS,	// Owner
+											(UCHAR *) TableName.GetData(), SQL_NTS,
 											NULL, 0);										// All columns
 			}
 			else
@@ -1363,7 +1355,7 @@ CcolInf *wxDB::GetColumns(char *tableName[], char *userID)
 				retcode = SQLColumns(hstmt,
 											NULL, 0,											// All qualifiers
 											NULL, 0,											// Owner
-											(UCHAR *) tableNameUC, SQL_NTS,
+											(UCHAR *) TableName.GetData(), SQL_NTS,
 											NULL, 0);										// All columns
 			}
 			if (retcode != SQL_SUCCESS)
@@ -1375,8 +1367,8 @@ CcolInf *wxDB::GetColumns(char *tableName[], char *userID)
 				SQLFreeStmt(hstmt, SQL_CLOSE);
 				return(0);
 			}
-			SQLBindCol(hstmt, 3, SQL_C_CHAR,   (UCHAR*) tblName,      DB_MAX_TABLE_NAME_LEN+1,  &cb);
-			SQLBindCol(hstmt, 4, SQL_C_CHAR,   (UCHAR*) colName,      DB_MAX_COLUMN_NAME_LEN+1, &cb);
+			SQLBindCol(hstmt, 3, SQL_C_CHAR,   (UCHAR*)  tblName,      DB_MAX_TABLE_NAME_LEN+1,  &cb);
+			SQLBindCol(hstmt, 4, SQL_C_CHAR,   (UCHAR*)  colName,      DB_MAX_COLUMN_NAME_LEN+1, &cb);
 			SQLBindCol(hstmt, 5, SQL_C_SSHORT, (UCHAR*) &sqlDataType, 0,                        &cb);
 			while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS)
 			{
@@ -1413,7 +1405,7 @@ CcolInf *wxDB::GetColumns(char *tableName[], char *userID)
 
 
 /********** wxDB::Catalog() **********/
-bool wxDB::Catalog(char *userID, char *fileName)
+bool wxDB::Catalog(const char *userID, const char *fileName)
 {
 	assert(fileName && wxStrlen(fileName));
 
@@ -1426,6 +1418,8 @@ bool wxDB::Catalog(char *userID, char *fileName)
 	char		typeName[30+1];
 	SWORD		precision, length;
 
+	wxString UserID;
+
 	FILE *fp = fopen(fileName,"wt");
 	if (fp == NULL)
 		return(FALSE);
@@ -1433,25 +1427,20 @@ bool wxDB::Catalog(char *userID, char *fileName)
 	SQLFreeStmt(hstmt, SQL_CLOSE);
 
 	if (!userID || !wxStrlen(userID))
-		userID = uid;
+		UserID = uid;
+	else
+		UserID = userID;
 
-	char userIdUC[80+1];
 	// Oracle user names may only be in uppercase, so force 
 	// the name to uppercase
 	if (Dbms() == dbmsORACLE)
-	{
-		int i = 0;
-		for (char *p = userID; *p; p++)
-			userIdUC[i++] = toupper(*p);
-		userIdUC[i] = 0;
-		userID = userIdUC;
-	}
+		UserID = UserID.Upper();
 
-	if (wxStrcmp(userID,""))
+	if (wxStrcmp(UserID.GetData(),""))
 	{
 		retcode = SQLColumns(hstmt,
 									NULL, 0,											// All qualifiers
-									(UCHAR *) userID, SQL_NTS,					// User specified
+									(UCHAR *) UserID.GetData(), SQL_NTS,	// User specified
 									NULL, 0,											// All tables
 									NULL, 0);										// All columns
 	}
@@ -1530,8 +1519,11 @@ bool wxDB::Catalog(char *userID, char *fileName)
 // 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
 // on the table.
-bool wxDB::TableExists(char *tableName, char *userID, char *tablePath)
+bool wxDB::TableExists(const char *tableName, const char *userID, const char *tablePath)
 {
+	wxString UserID;
+	wxString TableName;
+
 	assert(tableName && wxStrlen(tableName));
 
 	if (Dbms() == dbmsDBASE)
@@ -1541,61 +1533,50 @@ bool wxDB::TableExists(char *tableName, char *userID, char *tablePath)
 			dbName.sprintf("%s/%s.dbf",tablePath,tableName);
 		else
 			dbName.sprintf("%s.dbf",tableName);
-		bool glt;
-		glt = wxFileExists(dbName.GetData());
-		return glt;
+
+		bool exists;
+		exists = wxFileExists(dbName.GetData());
+		return exists;
 	}
 
 	if (!userID || !wxStrlen(userID))
-		userID = uid;
+		UserID = uid;
+	else
+		UserID = userID;
 
-	char userIdUC[80+1];
 	// Oracle user names may only be in uppercase, so force 
 	// the name to uppercase
 	if (Dbms() == dbmsORACLE)
-	{
-		int i = 0;
-		for (char *p = userID; *p; p++)
-			userIdUC[i++] = toupper(*p);
-		userIdUC[i] = 0;
-		userID = userIdUC;
-	}
+		UserID = UserID.Upper();
 
-	char tableNameUC[DB_MAX_TABLE_NAME_LEN+1];
+	TableName = tableName;
 	// Oracle table names are uppercase only, so force 
 	// the name to uppercase just in case programmer forgot to do this
 	if (Dbms() == dbmsORACLE)
-	{
-		int i = 0;
-		for (char *p = tableName; *p; p++)
-			tableNameUC[i++] = toupper(*p);
-		tableNameUC[i] = 0;
-	}
-	else
-		sprintf(tableNameUC,tableName);
+		TableName = TableName.Upper();
 
 	SQLFreeStmt(hstmt, SQL_CLOSE);
 	RETCODE retcode;
 
 	// MySQL and Access cannot accept a user name when looking up table names, so we
 	// use the call below that leaves out the user name
-	if (wxStrcmp(userID,"") &&
+	if (wxStrcmp(UserID,"") &&
 		 Dbms() != dbmsMY_SQL &&
 		 Dbms() != dbmsACCESS)
 	{
 		retcode = SQLTables(hstmt,
-								  NULL, 0,										// All qualifiers
-								  (UCHAR *) userID, SQL_NTS,				// All owners
-								  (UCHAR FAR *)tableNameUC, SQL_NTS,
-								  NULL, 0);										// All table types
+								  NULL, 0,												// All qualifiers
+								  (UCHAR *) UserID.GetData(), SQL_NTS,			// All owners
+								  (UCHAR FAR *)TableName.GetData(), SQL_NTS,
+								  NULL, 0);												// All table types
 	}
 	else
 	{
 		retcode = SQLTables(hstmt,
-								  NULL, 0,										// All qualifiers
-								  NULL, 0,										// All owners
-								  (UCHAR FAR *)tableNameUC, SQL_NTS,
-								  NULL, 0);										// All table types
+								  NULL, 0,												// All qualifiers
+								  NULL, 0,												// All owners
+								  (UCHAR FAR *)TableName.GetData(), SQL_NTS,
+								  NULL, 0);												// All table types
 	}
 	if (retcode != SQL_SUCCESS)
 		return(DispAllErrors(henv, hdbc, hstmt));
@@ -1614,7 +1595,7 @@ bool wxDB::TableExists(char *tableName, char *userID, char *tablePath)
 
 
 /********** wxDB::SqlLog() **********/
-bool wxDB::SqlLog(enum sqlLog state, char *filename, bool append)
+bool wxDB::SqlLog(enum sqlLog state, const char *filename, bool append)
 {
 	assert(state == sqlLogON  || state == sqlLogOFF);
 	assert(state == sqlLogOFF || filename);
@@ -1645,7 +1626,7 @@ bool wxDB::SqlLog(enum sqlLog state, char *filename, bool append)
 
 
 /********** wxDB::WriteSqlLog() **********/
-bool wxDB::WriteSqlLog(char *logMsg)
+bool wxDB::WriteSqlLog(const char *logMsg)
 {
 	assert(logMsg);
 
@@ -1877,7 +1858,7 @@ bool SqlLog(enum sqlLog state, char *filename)
 }  // SqlLog()
 
 /********** GetDataSource() **********/
-bool GetDataSource(HENV henv, char *Dsn, SWORD DsnMax, char *DsDesc, SWORD DsDescMax,
+bool GetDataSource(HENV henv, const char *Dsn, SWORD DsnMax, const char *DsDesc, SWORD DsDescMax,
 						 UWORD direction)
 {
 	SWORD cb;
diff --git a/src/common/dbtable.cpp b/src/common/dbtable.cpp
index 0a674fd7cb..1e603781ed 100644
--- a/src/common/dbtable.cpp
+++ b/src/common/dbtable.cpp
@@ -102,7 +102,7 @@ ULONG lastTableID = 0;
 
 /********** wxTable::wxTable() **********/
 wxTable::wxTable(wxDB *pwxDB, const char *tblName, const int nCols,
-					const char *qryTblName, bool qryOnly, char *tblPath)
+					const char *qryTblName, bool qryOnly, const char *tblPath)
 {
 	pDb					= pwxDB;					// Pointer to the wxDB object
 	henv					= 0;
@@ -309,6 +309,250 @@ wxTable::~wxTable()
 
 }  // wxTable::~wxTable()
 
+/***************************** PRIVATE FUNCTIONS *****************************/
+
+/********** wxTable::bindInsertParams() **********/
+bool wxTable::bindInsertParams(void)
+{
+	assert(!queryOnly);
+	if (queryOnly)
+		return(FALSE);
+
+	SWORD   fSqlType	= 0;
+	UDWORD  precision	= 0;
+	SWORD   scale		= 0;
+
+	// Bind each column (that can be inserted) of the table to a parameter marker
+	int i;
+	for (i = 0; i < noCols; i++)
+	{
+		if (! colDefs[i].InsertAllowed)
+			continue;
+		switch(colDefs[i].DbDataType)
+		{
+		case DB_DATA_TYPE_VARCHAR:
+			fSqlType = pDb->typeInfVarchar.FsqlType;
+			precision = colDefs[i].SzDataObj;
+			scale = 0;
+			colDefs[i].CbValue = SQL_NTS;
+			break;
+		case DB_DATA_TYPE_INTEGER:
+			fSqlType = pDb->typeInfInteger.FsqlType;
+			precision = pDb->typeInfInteger.Precision;
+			scale = 0;
+			colDefs[i].CbValue = 0;
+			break;
+		case DB_DATA_TYPE_FLOAT:
+			fSqlType = pDb->typeInfFloat.FsqlType;
+			precision = pDb->typeInfFloat.Precision;
+			scale = pDb->typeInfFloat.MaximumScale;
+			// SQL Sybase Anywhere v5.5 returned a negative number for the
+			// MaxScale.  This caused ODBC to kick out an error on ibscale.
+			// I check for this here and set the scale = precision.
+			//if (scale < 0)
+			//	scale = (short) precision;
+			colDefs[i].CbValue = 0;
+			break;
+		case DB_DATA_TYPE_DATE:
+			fSqlType = pDb->typeInfDate.FsqlType;
+			precision = pDb->typeInfDate.Precision;
+			scale = 0;
+			colDefs[i].CbValue = 0;
+			break;
+		}
+		// Null values
+		if (colDefs[i].Null)
+		{
+			colDefs[i].CbValue = SQL_NULL_DATA;
+			colDefs[i].Null = FALSE;
+		}
+		if (SQLBindParameter(hstmtInsert, i+1, SQL_PARAM_INPUT, colDefs[i].SqlCtype,
+									fSqlType, precision, scale, (UCHAR*) colDefs[i].PtrDataObj, 
+									precision+1,&colDefs[i].CbValue) != SQL_SUCCESS)
+			return(pDb->DispAllErrors(henv, hdbc, hstmtInsert));
+	}
+
+	// Completed successfully
+	return(TRUE);
+
+}  // wxTable::bindInsertParams()
+
+/********** wxTable::bindUpdateParams() **********/
+bool wxTable::bindUpdateParams(void)
+{
+	assert(!queryOnly);
+	if (queryOnly)
+		return(FALSE);
+
+	SWORD   fSqlType	= 0;
+	UDWORD  precision	= 0;
+	SWORD   scale		= 0;
+	
+	// Bind each UPDATEABLE column of the table to a parameter marker
+	int i,colNo;
+	for (i = 0, colNo = 1; i < noCols; i++)
+	{
+		if (! colDefs[i].Updateable)
+			continue;
+		switch(colDefs[i].DbDataType)
+		{
+		case DB_DATA_TYPE_VARCHAR:
+			fSqlType = pDb->typeInfVarchar.FsqlType;
+			precision = colDefs[i].SzDataObj;
+			scale = 0;
+			colDefs[i].CbValue = SQL_NTS;
+			break;
+		case DB_DATA_TYPE_INTEGER:
+			fSqlType = pDb->typeInfInteger.FsqlType;
+			precision = pDb->typeInfInteger.Precision;
+			scale = 0;
+			colDefs[i].CbValue = 0;
+			break;
+		case DB_DATA_TYPE_FLOAT:
+			fSqlType = pDb->typeInfFloat.FsqlType;
+			precision = pDb->typeInfFloat.Precision;
+			scale = pDb->typeInfFloat.MaximumScale;
+			// SQL Sybase Anywhere v5.5 returned a negative number for the
+			// MaxScale.  This caused ODBC to kick out an error on ibscale.
+			// I check for this here and set the scale = precision.
+			//if (scale < 0)
+			// scale = (short) precision;
+			colDefs[i].CbValue = 0;
+			break;
+		case DB_DATA_TYPE_DATE:
+			fSqlType = pDb->typeInfDate.FsqlType;
+			precision = pDb->typeInfDate.Precision;
+			scale = 0;
+			colDefs[i].CbValue = 0;
+			break;
+		}
+		if (SQLBindParameter(hstmtUpdate, colNo++, SQL_PARAM_INPUT, colDefs[i].SqlCtype,
+									fSqlType, precision, scale, (UCHAR*) colDefs[i].PtrDataObj, 
+									precision+1, &colDefs[i].CbValue) != SQL_SUCCESS)
+			return(pDb->DispAllErrors(henv, hdbc, hstmtUpdate));
+	}
+
+	// Completed successfully
+	return(TRUE);
+
+}  // wxTable::bindUpdateParams()
+
+/********** wxTable::bindCols() **********/
+bool wxTable::bindCols(HSTMT cursor)
+{
+	static SDWORD  cb;
+	
+	// Bind each column of the table to a memory address for fetching data
+	int i;
+	for (i = 0; i < noCols; i++)
+	{
+		if (SQLBindCol(cursor, i+1, colDefs[i].SqlCtype, (UCHAR*) colDefs[i].PtrDataObj,
+							colDefs[i].SzDataObj, &cb) != SQL_SUCCESS)
+			return(pDb->DispAllErrors(henv, hdbc, cursor));
+	}
+
+	// Completed successfully
+	return(TRUE);
+
+}  // wxTable::bindCols()
+
+/********** wxTable::getRec() **********/
+bool wxTable::getRec(UWORD fetchType)
+{
+	RETCODE retcode;
+
+#if !wxODBC_FWD_ONLY_CURSORS
+
+	// Fetch the NEXT, PREV, FIRST or LAST record, depending on fetchType
+	UDWORD  cRowsFetched;
+	UWORD   rowStatus;
+
+//	if ((retcode = SQLExtendedFetch(hstmt, fetchType, 0, &cRowsFetched, &rowStatus)) != SQL_SUCCESS)
+   retcode = SQLExtendedFetch(hstmt, fetchType, 0, &cRowsFetched, &rowStatus);
+   if (retcode  != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+		if (retcode == SQL_NO_DATA_FOUND)
+			return(FALSE);
+		else
+			return(pDb->DispAllErrors(henv, hdbc, hstmt));
+#else
+
+	// Fetch the next record from the record set
+	retcode = SQLFetch(hstmt);
+	if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+	{
+		if (retcode == SQL_NO_DATA_FOUND)
+			return(FALSE);
+		else
+			return(pDb->DispAllErrors(henv, hdbc, hstmt));
+	}
+#endif
+
+	// Completed successfully
+	return(TRUE);
+
+}  // wxTable::getRec()
+
+/********** wxTable::execDelete() **********/
+bool wxTable::execDelete(const char *pSqlStmt)
+{
+	// Execute the DELETE statement
+	if (SQLExecDirect(hstmtDelete, (UCHAR FAR *) pSqlStmt, SQL_NTS) != SQL_SUCCESS)
+		return(pDb->DispAllErrors(henv, hdbc, hstmtDelete));
+
+	// Record deleted successfully
+	return(TRUE);
+
+}  // wxTable::execDelete()
+
+/********** wxTable::execUpdate() **********/
+bool wxTable::execUpdate(const char *pSqlStmt)
+{
+	// Execute the UPDATE statement
+	if (SQLExecDirect(hstmtUpdate, (UCHAR FAR *) pSqlStmt, SQL_NTS) != SQL_SUCCESS)
+		return(pDb->DispAllErrors(henv, hdbc, hstmtUpdate));
+
+	// Record deleted successfully
+	return(TRUE);
+
+}  // wxTable::execUpdate()
+
+/********** wxTable::query() **********/
+bool wxTable::query(int queryType, bool forUpdate, bool distinct, char *pSqlStmt)
+{
+	char sqlStmt[DB_MAX_STATEMENT_LEN];
+
+	// Set the selectForUpdate member variable
+	if (forUpdate)
+		// The user may wish to select for update, but the DBMS may not be capable
+		selectForUpdate = CanSelectForUpdate();
+	else
+		selectForUpdate = FALSE;
+
+	// Set the SQL SELECT string
+	if (queryType != DB_SELECT_STATEMENT)				// A select statement was not passed in,
+	{																// so generate a select statement.
+		GetSelectStmt(sqlStmt, queryType, distinct);
+		pDb->WriteSqlLog(sqlStmt);
+	}
+
+	// Make sure the cursor is closed first
+	if (! CloseCursor(hstmt))
+		return(FALSE);
+
+	// Execute the SQL SELECT statement
+	int retcode;
+
+	retcode = SQLExecDirect(hstmt, (UCHAR FAR *) (queryType == DB_SELECT_STATEMENT ? pSqlStmt : sqlStmt), SQL_NTS);
+	if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+		return(pDb->DispAllErrors(henv, hdbc, hstmt));
+
+	// Completed successfully
+	return(TRUE);
+
+}  // wxTable::query()
+
+
+
 /********** wxTable::Open() **********/
 bool wxTable::Open(void)
 {
@@ -416,41 +660,6 @@ bool wxTable::QueryOnKeyFields(bool forUpdate, bool distinct)
 
 }  // wxTable::QueryOnKeyFields()
 
-/********** wxTable::query() **********/
-bool wxTable::query(int queryType, bool forUpdate, bool distinct, char *pSqlStmt)
-{
-	char sqlStmt[DB_MAX_STATEMENT_LEN];
-
-	// Set the selectForUpdate member variable
-	if (forUpdate)
-		// The user may wish to select for update, but the DBMS may not be capable
-		selectForUpdate = CanSelectForUpdate();
-	else
-		selectForUpdate = FALSE;
-
-	// Set the SQL SELECT string
-	if (queryType != DB_SELECT_STATEMENT)				// A select statement was not passed in,
-	{																// so generate a select statement.
-		GetSelectStmt(sqlStmt, queryType, distinct);
-		pDb->WriteSqlLog(sqlStmt);
-	}
-
-	// Make sure the cursor is closed first
-	if (! CloseCursor(hstmt))
-		return(FALSE);
-
-	// Execute the SQL SELECT statement
-	int retcode;
-
-	retcode = SQLExecDirect(hstmt, (UCHAR FAR *) (queryType == DB_SELECT_STATEMENT ? pSqlStmt : sqlStmt), SQL_NTS);
-	if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
-		return(pDb->DispAllErrors(henv, hdbc, hstmt));
-
-	// Completed successfully
-	return(TRUE);
-
-}  // wxTable::query()
-
 /********** wxTable::GetSelectStmt() **********/
 void wxTable::GetSelectStmt(char *pSqlStmt, int typeOfSelect, bool distinct)
 {
@@ -560,42 +769,6 @@ void wxTable::GetSelectStmt(char *pSqlStmt, int typeOfSelect, bool distinct)
 
 }  // wxTable::GetSelectStmt()
 
-/********** wxTable::getRec() **********/
-bool wxTable::getRec(UWORD fetchType)
-{
-	RETCODE retcode;
-
-#if !wxODBC_FWD_ONLY_CURSORS
-
-	// Fetch the NEXT, PREV, FIRST or LAST record, depending on fetchType
-	UDWORD  cRowsFetched;
-	UWORD   rowStatus;
-
-//	if ((retcode = SQLExtendedFetch(hstmt, fetchType, 0, &cRowsFetched, &rowStatus)) != SQL_SUCCESS)
-   retcode = SQLExtendedFetch(hstmt, fetchType, 0, &cRowsFetched, &rowStatus);
-   if (retcode  != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
-		if (retcode == SQL_NO_DATA_FOUND)
-			return(FALSE);
-		else
-			return(pDb->DispAllErrors(henv, hdbc, hstmt));
-#else
-
-	// Fetch the next record from the record set
-	retcode = SQLFetch(hstmt);
-	if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
-	{
-		if (retcode == SQL_NO_DATA_FOUND)
-			return(FALSE);
-		else
-			return(pDb->DispAllErrors(henv, hdbc, hstmt));
-	}
-#endif
-
-	// Completed successfully
-	return(TRUE);
-
-}  // wxTable::getRec()
-
 /********** wxTable::GetRowNum() **********/
 UWORD wxTable::GetRowNum(void)
 {
@@ -612,151 +785,6 @@ UWORD wxTable::GetRowNum(void)
 
 }  // wxTable::GetRowNum()
 
-/********** wxTable::bindInsertParams() **********/
-bool wxTable::bindInsertParams(void)
-{
-	assert(!queryOnly);
-	if (queryOnly)
-		return(FALSE);
-
-	SWORD   fSqlType	= 0;
-	UDWORD  precision	= 0;
-	SWORD   scale		= 0;
-
-	// Bind each column (that can be inserted) of the table to a parameter marker
-	int i;
-	for (i = 0; i < noCols; i++)
-	{
-		if (! colDefs[i].InsertAllowed)
-			continue;
-		switch(colDefs[i].DbDataType)
-		{
-		case DB_DATA_TYPE_VARCHAR:
-			fSqlType = pDb->typeInfVarchar.FsqlType;
-			precision = colDefs[i].SzDataObj;
-			scale = 0;
-			colDefs[i].CbValue = SQL_NTS;
-			break;
-		case DB_DATA_TYPE_INTEGER:
-			fSqlType = pDb->typeInfInteger.FsqlType;
-			precision = pDb->typeInfInteger.Precision;
-			scale = 0;
-			colDefs[i].CbValue = 0;
-			break;
-		case DB_DATA_TYPE_FLOAT:
-			fSqlType = pDb->typeInfFloat.FsqlType;
-			precision = pDb->typeInfFloat.Precision;
-			scale = pDb->typeInfFloat.MaximumScale;
-			// SQL Sybase Anywhere v5.5 returned a negative number for the
-			// MaxScale.  This caused ODBC to kick out an error on ibscale.
-			// I check for this here and set the scale = precision.
-			//if (scale < 0)
-			//	scale = (short) precision;
-			colDefs[i].CbValue = 0;
-			break;
-		case DB_DATA_TYPE_DATE:
-			fSqlType = pDb->typeInfDate.FsqlType;
-			precision = pDb->typeInfDate.Precision;
-			scale = 0;
-			colDefs[i].CbValue = 0;
-			break;
-		}
-		// Null values
-		if (colDefs[i].Null)
-		{
-			colDefs[i].CbValue = SQL_NULL_DATA;
-			colDefs[i].Null = FALSE;
-		}
-		if (SQLBindParameter(hstmtInsert, i+1, SQL_PARAM_INPUT, colDefs[i].SqlCtype,
-									fSqlType, precision, scale, (UCHAR*) colDefs[i].PtrDataObj, 
-									precision+1,&colDefs[i].CbValue) != SQL_SUCCESS)
-			return(pDb->DispAllErrors(henv, hdbc, hstmtInsert));
-	}
-
-	// Completed successfully
-	return(TRUE);
-
-}  // wxTable::bindInsertParams()
-
-/********** wxTable::bindUpdateParams() **********/
-bool wxTable::bindUpdateParams(void)
-{
-	assert(!queryOnly);
-	if (queryOnly)
-		return(FALSE);
-
-	SWORD   fSqlType	= 0;
-	UDWORD  precision	= 0;
-	SWORD   scale		= 0;
-	
-	// Bind each UPDATEABLE column of the table to a parameter marker
-	int i,colNo;
-	for (i = 0, colNo = 1; i < noCols; i++)
-	{
-		if (! colDefs[i].Updateable)
-			continue;
-		switch(colDefs[i].DbDataType)
-		{
-		case DB_DATA_TYPE_VARCHAR:
-			fSqlType = pDb->typeInfVarchar.FsqlType;
-			precision = colDefs[i].SzDataObj;
-			scale = 0;
-			colDefs[i].CbValue = SQL_NTS;
-			break;
-		case DB_DATA_TYPE_INTEGER:
-			fSqlType = pDb->typeInfInteger.FsqlType;
-			precision = pDb->typeInfInteger.Precision;
-			scale = 0;
-			colDefs[i].CbValue = 0;
-			break;
-		case DB_DATA_TYPE_FLOAT:
-			fSqlType = pDb->typeInfFloat.FsqlType;
-			precision = pDb->typeInfFloat.Precision;
-			scale = pDb->typeInfFloat.MaximumScale;
-			// SQL Sybase Anywhere v5.5 returned a negative number for the
-			// MaxScale.  This caused ODBC to kick out an error on ibscale.
-			// I check for this here and set the scale = precision.
-			//if (scale < 0)
-			// scale = (short) precision;
-			colDefs[i].CbValue = 0;
-			break;
-		case DB_DATA_TYPE_DATE:
-			fSqlType = pDb->typeInfDate.FsqlType;
-			precision = pDb->typeInfDate.Precision;
-			scale = 0;
-			colDefs[i].CbValue = 0;
-			break;
-		}
-		if (SQLBindParameter(hstmtUpdate, colNo++, SQL_PARAM_INPUT, colDefs[i].SqlCtype,
-									fSqlType, precision, scale, (UCHAR*) colDefs[i].PtrDataObj, 
-									precision+1, &colDefs[i].CbValue) != SQL_SUCCESS)
-			return(pDb->DispAllErrors(henv, hdbc, hstmtUpdate));
-	}
-
-	// Completed successfully
-	return(TRUE);
-
-}  // wxTable::bindUpdateParams()
-
-/********** wxTable::bindCols() **********/
-bool wxTable::bindCols(HSTMT cursor)
-{
-	static SDWORD  cb;
-	
-	// Bind each column of the table to a memory address for fetching data
-	int i;
-	for (i = 0; i < noCols; i++)
-	{
-		if (SQLBindCol(cursor, i+1, colDefs[i].SqlCtype, (UCHAR*) colDefs[i].PtrDataObj,
-							colDefs[i].SzDataObj, &cb) != SQL_SUCCESS)
-			return(pDb->DispAllErrors(henv, hdbc, cursor));
-	}
-
-	// Completed successfully
-	return(TRUE);
-
-}  // wxTable::bindCols()
-
 /********** wxTable::CloseCursor() **********/
 bool wxTable::CloseCursor(HSTMT cursor)
 {
@@ -971,7 +999,7 @@ bool wxTable::DropTable()
 }  // wxTable::DropTable()
 
 /********** wxTable::CreateIndex() **********/
-bool wxTable::CreateIndex(char * idxName, bool unique, int noIdxCols, CidxDef *pIdxDefs, bool attemptDrop)
+bool wxTable::CreateIndex(const char * idxName, bool unique, int noIdxCols, CidxDef *pIdxDefs, bool attemptDrop)
 {
 	char sqlStmt[DB_MAX_STATEMENT_LEN];
 
@@ -1038,7 +1066,7 @@ bool wxTable::CreateIndex(char * idxName, bool unique, int noIdxCols, CidxDef *p
 }  // wxTable::CreateIndex()
 
 /********** wxTable::DropIndex() **********/
-bool wxTable::DropIndex(char * idxName)
+bool wxTable::DropIndex(const char * idxName)
 {
 	// NOTE: This function returns TRUE if the Index does not exist, but
 	//       only for identified databases.  Code will need to be added
@@ -1121,19 +1149,6 @@ int wxTable::Insert(void)
 
 }  // wxTable::Insert()
 
-/********** wxTable::Update(pSqlStmt) **********/
-bool wxTable::Update(char *pSqlStmt)
-{
-	assert(!queryOnly);
-	if (queryOnly)
-		return(FALSE);
-
-	pDb->WriteSqlLog(pSqlStmt);
-
-	return(execUpdate(pSqlStmt));
-
-}  // wxTable::Update(pSqlStmt)
-
 /********** wxTable::Update() **********/
 bool wxTable::Update(void)
 {
@@ -1157,8 +1172,21 @@ bool wxTable::Update(void)
 
 }  // wxTable::Update()
 
+/********** wxTable::Update(pSqlStmt) **********/
+bool wxTable::Update(const char *pSqlStmt)
+{
+	assert(!queryOnly);
+	if (queryOnly)
+		return(FALSE);
+
+	pDb->WriteSqlLog(pSqlStmt);
+
+	return(execUpdate(pSqlStmt));
+
+}  // wxTable::Update(pSqlStmt)
+
 /********** wxTable::UpdateWhere() **********/
-bool wxTable::UpdateWhere(char *pWhereClause)
+bool wxTable::UpdateWhere(const char *pWhereClause)
 {
 	assert(!queryOnly);
 	if (queryOnly)
@@ -1200,7 +1228,7 @@ bool wxTable::Delete(void)
 }  // wxTable::Delete()
 
 /********** wxTable::DeleteWhere() **********/
-bool wxTable::DeleteWhere(char *pWhereClause)
+bool wxTable::DeleteWhere(const char *pWhereClause)
 {
 	assert(!queryOnly);
 	if (queryOnly)
@@ -1237,32 +1265,8 @@ bool wxTable::DeleteMatching(void)
 
 }  // wxTable::DeleteMatching()
 
-/********** wxTable::execDelete() **********/
-bool wxTable::execDelete(char *pSqlStmt)
-{
-	// Execute the DELETE statement
-	if (SQLExecDirect(hstmtDelete, (UCHAR FAR *) pSqlStmt, SQL_NTS) != SQL_SUCCESS)
-		return(pDb->DispAllErrors(henv, hdbc, hstmtDelete));
-
-	// Record deleted successfully
-	return(TRUE);
-
-}  // wxTable::execDelete()
-
-/********** wxTable::execUpdate() **********/
-bool wxTable::execUpdate(char *pSqlStmt)
-{
-	// Execute the UPDATE statement
-	if (SQLExecDirect(hstmtUpdate, (UCHAR FAR *) pSqlStmt, SQL_NTS) != SQL_SUCCESS)
-		return(pDb->DispAllErrors(henv, hdbc, hstmtUpdate));
-
-	// Record deleted successfully
-	return(TRUE);
-
-}  // wxTable::execUpdate()
-
 /********** wxTable::GetUpdateStmt() **********/
-void wxTable::GetUpdateStmt(char *pSqlStmt, int typeOfUpd, char *pWhereClause)
+void wxTable::GetUpdateStmt(char *pSqlStmt, int typeOfUpd, const char *pWhereClause)
 {
 	assert(!queryOnly);
 	if (queryOnly)
@@ -1323,11 +1327,10 @@ void wxTable::GetUpdateStmt(char *pSqlStmt, int typeOfUpd, char *pWhereClause)
 		wxStrcat(pSqlStmt, pWhereClause);
 		break;
 	}
-
 }  // GetUpdateStmt()
 
 /********** wxTable::GetDeleteStmt() **********/
-void wxTable::GetDeleteStmt(char *pSqlStmt, int typeOfDel, char *pWhereClause)
+void wxTable::GetDeleteStmt(char *pSqlStmt, int typeOfDel, const char *pWhereClause)
 {
 	assert(!queryOnly);
 	if (queryOnly)
@@ -1392,7 +1395,7 @@ void wxTable::GetDeleteStmt(char *pSqlStmt, int typeOfDel, char *pWhereClause)
  *       They are not included as part of the where clause.
  */
 
-void wxTable::GetWhereClause(char *pWhereClause, int typeOfWhere, char *qualTableName)
+void wxTable::GetWhereClause(char *pWhereClause, int typeOfWhere, const char *qualTableName)
 {
 	bool moreThanOneColumn = FALSE;
 	char colValue[255];
@@ -1585,7 +1588,7 @@ bool wxTable::SetQueryTimeout(UDWORD nSeconds)
 }  // wxTable::SetQueryTimeout()
 
 /********** wxTable::SetColDefs() **********/
-void wxTable::SetColDefs (int index, char *fieldName, int dataType, void *pData,
+void wxTable::SetColDefs (int index, const char *fieldName, int dataType, void *pData,
 								 int cType, int size, bool keyField, bool upd,
 								 bool insAllow, bool derivedCol)
 {
@@ -1769,7 +1772,7 @@ bool wxTable::SetNull(int colNo)
 }  // wxTable::SetNull(UINT colNo)
 
 /********** wxTable::SetNull(char *colName) **********/
-bool wxTable::SetNull(char *colName)
+bool wxTable::SetNull(const char *colName)
 {
 	int i;
 	for (i = 0; i < noCols; i++)
-- 
2.47.2