164 lines
5.6 KiB
C++
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];
|
|
}
|