Files
Work/sql/SQLSTMT.CPP
2024-08-07 09:16:27 -04:00

164 lines
5.6 KiB
C++

#include <sql/sqlstmt.hpp>
#include <sql/sqlerror.hpp>
#include <sql/sqlbind.hpp>
#include <common/block.hpp>
SQLStatement::SQLStatement(void)
: mIsOkay(FALSE), mhStatement(FALSE)
{
}
SQLStatement::SQLStatement(SQLDb &someSQLDb,SQLBind &sqlBind)
: mIsOkay(FALSE), mhStatement(FALSE), mSQLDb(someSQLDb)
{
sqlBind.getColumnData(mSQLColumnData);
open();
}
SQLStatement::SQLStatement(SQLDb &someSQLDb)
: mIsOkay(FALSE), mhStatement(FALSE), mSQLDb(someSQLDb)
{
open();
}
SQLStatement::~SQLStatement()
{
close();
}
SQLStatement &SQLStatement::operator=(const SQLDb &someSQLDb)
{
close();
mSQLDb=someSQLDb;
open();
return *this;
}
BOOL SQLStatement::executeDirect(const String &sqlStatementString)
{
RETCODE sqlReturn;
if(!isOkay())return FALSE;
sqlReturn=SQLExecDirect(mhStatement,(UCHAR*)(LPSTR)(String&)sqlStatementString,SQL_NTS);
if(SQL_SUCCESS!=sqlReturn&&SQL_SUCCESS_WITH_INFO!=sqlReturn)
{SQLErr sqlError;sqlError.sqlErr(*this);return FALSE;}
for(int index=0;index<mSQLColumnData.size();index++)
::SQLBindCol(mhStatement,(UWORD)(index+1),(SWORD)mSQLColumnData[index].type(),(PTR)(BYTE*)mSQLColumnData[index].sqlData(),(SDWORD)mSQLColumnData[index].size(),(SDWORD FAR*)mSQLColumnData[index].resultLength());
return TRUE;
}
BOOL SQLStatement::executeDirect(const String &sqlStatementString,String &strResult)
{
RETCODE sqlReturn;
if(!isOkay())return FALSE;
sqlReturn=SQLExecDirect(mhStatement,(UCHAR*)(LPSTR)(String&)sqlStatementString,SQL_NTS);
if(SQL_SUCCESS!=sqlReturn&&SQL_SUCCESS_WITH_INFO!=sqlReturn)
{
SQLErr sqlError;
sqlError.sqlErr(*this,strResult);
return FALSE;
}
for(int index=0;index<mSQLColumnData.size();index++)
::SQLBindCol(mhStatement,(UWORD)(index+1),(SWORD)mSQLColumnData[index].type(),(PTR)(BYTE*)mSQLColumnData[index].sqlData(),(SDWORD)mSQLColumnData[index].size(),(SDWORD FAR*)mSQLColumnData[index].resultLength());
return TRUE;
}
WORD SQLStatement::fetch(bool silent)const
{
RETCODE sqlReturn;
if(!isOkay()||!mSQLColumnData.size())return FALSE;
sqlReturn=::SQLFetch(mhStatement);
if(SQL_SUCCESS!=sqlReturn&&SQL_SUCCESS_WITH_INFO!=sqlReturn)return FALSE;
if(SQL_SUCCESS_WITH_INFO==sqlReturn&&!silent){SQLErr sqlError;sqlError.sqlErr(*this);}
return TRUE;
}
int SQLStatement::rowCount(void)const
{
SQLINTEGER rows(0);
if(!isOkay())return rows;
::SQLRowCount(mhStatement,&rows);
return rows;
}
WORD SQLStatement::tables(String database,String owner,String name,String type)
{
RETCODE sqlReturn;
if(!isOkay())return FALSE;
if(database.isNull()&&owner.isNull()&&name.isNull()&&type.isNull())type="TABLE";
sqlReturn=::SQLTables(mhStatement,(BYTE*)0,SQL_NTS,(BYTE*)0,SQL_NTS,(BYTE*)0,SQL_NTS,(BYTE*)(LPSTR)type,SQL_NTS);
if(SQL_SUCCESS!=sqlReturn&&SQL_SUCCESS_WITH_INFO!=sqlReturn)return FALSE;
for(int index=0;index<mSQLColumnData.size();index++)
::SQLBindCol(mhStatement,(UWORD)(index+1),(SWORD)mSQLColumnData[index].type(),(PTR)(BYTE*)mSQLColumnData[index].sqlData(),(SDWORD)mSQLColumnData[index].size(),(SDWORD FAR*)mSQLColumnData[index].resultLength());
return TRUE;
}
WORD SQLStatement::cancel(void)const
{
RETCODE sqlReturn;
if(!isOkay())return FALSE;
sqlReturn=::SQLCancel(mhStatement);
if(SQL_SUCCESS!=sqlReturn&&SQL_SUCCESS_WITH_INFO!=sqlReturn)return FALSE;
return TRUE;
}
WORD SQLStatement::sqlResults(void)
{
RETCODE sqlReturn;
SWORD numCols;
SWORD colNameLength;
SWORD sqlDataType;
SWORD scaleCol;
SWORD nullAllowed;
DWORD colPrecision;
char strColName[MaxColName];
mSQLColumnData.remove();
sqlReturn=::SQLNumResultCols(mhStatement,&numCols);
if(SQL_SUCCESS!=sqlReturn&&SQL_SUCCESS_WITH_INFO!=sqlReturn)return FALSE;
for(int colIndex=0;colIndex<numCols;colIndex++)
{
sqlReturn=::SQLDescribeCol(mhStatement,colIndex+1,(BYTE*)strColName,sizeof(strColName)-1,&colNameLength,&sqlDataType,&colPrecision,&scaleCol,&nullAllowed);
if(SQL_SUCCESS!=sqlReturn&&SQL_SUCCESS_WITH_INFO!=sqlReturn)break;
if(-1==sqlDataType)
{
String strDebug;
strDebug=String("Encountered bad type for column '")+String(strColName)+String("', skipping column.\n");
::OutputDebugString(strDebug);
continue;
}
if(SQLData::SQLDataLongVarBinary==(SQLData::DataType)sqlDataType)colPrecision=MaxImageLength;
SQLData sqlData(colPrecision+1,(SQLData::DataType)sqlDataType);
sqlData.sqlData().disposition(PointerDisposition::Assume);
mSQLColumnData.insert(&sqlData);
DWORD colIndex(mSQLColumnData.size()-1);
if(SQLData::SQLDataVarChar==(SQLData::DataType)sqlDataType)sqlDataType=(int)SQLData::SQLDataCChar;
else if(SQLData::SQLDataLongVarChar==(SQLData::DataType)sqlDataType)sqlDataType=(int)SQLData::SQLDataCChar;
else if(SQLData::SQLDataLongVarBinary==(SQLData::DataType)sqlDataType)sqlDataType=(int)SQL_C_BINARY; //SQLData::SQLDataCChar;
else if(SQLData::SQLDataFloat==(SQLData::DataType)sqlDataType)sqlDataType=(int)SQLData::SQLDataCFloat;
mSQLColumnData[colIndex].sqlData().disposition(PointerDisposition::Delete);
mSQLColumnData[colIndex].size(colPrecision+1);
mSQLColumnData[colIndex].type((SQLData::DataType)sqlDataType);
mSQLColumnData[colIndex].name(strColName);
BYTE *ptrData=(BYTE*)mSQLColumnData[colIndex].sqlData();
sqlReturn=::SQLBindCol(mhStatement,(UWORD)(colIndex+1),(SWORD)mSQLColumnData[colIndex].type(),ptrData,(SDWORD)mSQLColumnData[colIndex].size(),(SDWORD FAR*)mSQLColumnData[colIndex].resultLength());
if(SQL_SUCCESS_WITH_INFO!=sqlReturn&&SQL_SUCCESS!=sqlReturn)break;
}
return (SQL_SUCCESS==sqlReturn||SQL_SUCCESS_WITH_INFO==sqlReturn);
}
SQLData &SQLStatement::operator[](const String &strNameData)
{
for(int index=0;index<size();index++)
{
SQLData &sqlData=mSQLColumnData[index];
if(strNameData==sqlData.name())return sqlData;
}
throw SQLColumnNotFound();
return mSQLColumnData[0];
}