📄 cppsqlite3.cpp
字号:
}
const char* CppSQLite3Query::fieldName(int nCol)
{
checkVM();
if (nCol < 0 || nCol > mnCols-1)
{
throw CppSQLite3Exception(CPPSQLITE_ERROR,
"Invalid field index requested",
DONT_DELETE_MSG);
}
return sqlite3_column_name(mpVM, nCol);
}
const char* CppSQLite3Query::fieldDeclType(int nCol)
{
checkVM();
if (nCol < 0 || nCol > mnCols-1)
{
throw CppSQLite3Exception(CPPSQLITE_ERROR,
"Invalid field index requested",
DONT_DELETE_MSG);
}
return sqlite3_column_decltype(mpVM, nCol);
}
int CppSQLite3Query::fieldDataType(int nCol)
{
checkVM();
if (nCol < 0 || nCol > mnCols-1)
{
throw CppSQLite3Exception(CPPSQLITE_ERROR,
"Invalid field index requested",
DONT_DELETE_MSG);
}
return sqlite3_column_type(mpVM, nCol);
}
bool CppSQLite3Query::eof()
{
checkVM();
return mbEof;
}
void CppSQLite3Query::nextRow()
{
checkVM();
int nRet = sqlite3_step(mpVM);
if (nRet == SQLITE_DONE)
{
// no rows
mbEof = true;
}
else if (nRet == SQLITE_ROW)
{
// more rows, nothing to do
}
else
{
nRet = sqlite3_finalize(mpVM);
mpVM = 0;
const char* szError = sqlite3_errmsg(mpDB);
throw CppSQLite3Exception(nRet,
(char*)szError,
DONT_DELETE_MSG);
}
}
void CppSQLite3Query::finalize()
{
if (mpVM && mbOwnVM)
{
int nRet = sqlite3_finalize(mpVM);
mpVM = 0;
if (nRet != SQLITE_OK)
{
const char* szError = sqlite3_errmsg(mpDB);
throw CppSQLite3Exception(nRet, (char*)szError, DONT_DELETE_MSG);
}
}
}
void CppSQLite3Query::checkVM()
{
if (mpVM == 0)
{
throw CppSQLite3Exception(CPPSQLITE_ERROR,
"Null Virtual Machine pointer",
DONT_DELETE_MSG);
}
}
////////////////////////////////////////////////////////////////////////////////
CppSQLite3Table::CppSQLite3Table()
{
mpaszResults = 0;
mnRows = 0;
mnCols = 0;
mnCurrentRow = 0;
}
CppSQLite3Table::CppSQLite3Table(const CppSQLite3Table& rTable)
{
mpaszResults = rTable.mpaszResults;
// Only one object can own the results
const_cast<CppSQLite3Table&>(rTable).mpaszResults = 0;
mnRows = rTable.mnRows;
mnCols = rTable.mnCols;
mnCurrentRow = rTable.mnCurrentRow;
}
CppSQLite3Table::CppSQLite3Table(char** paszResults, int nRows, int nCols)
{
mpaszResults = paszResults;
mnRows = nRows;
mnCols = nCols;
mnCurrentRow = 0;
}
CppSQLite3Table::~CppSQLite3Table()
{
try
{
finalize();
}
catch (...)
{
}
}
CppSQLite3Table& CppSQLite3Table::operator=(const CppSQLite3Table& rTable)
{
try
{
finalize();
}
catch (...)
{
}
mpaszResults = rTable.mpaszResults;
// Only one object can own the results
const_cast<CppSQLite3Table&>(rTable).mpaszResults = 0;
mnRows = rTable.mnRows;
mnCols = rTable.mnCols;
mnCurrentRow = rTable.mnCurrentRow;
return *this;
}
void CppSQLite3Table::finalize()
{
if (mpaszResults)
{
sqlite3_free_table(mpaszResults);
mpaszResults = 0;
}
}
int CppSQLite3Table::numFields()
{
checkResults();
return mnCols;
}
int CppSQLite3Table::numRows()
{
checkResults();
return mnRows;
}
const char* CppSQLite3Table::fieldValue(int nField)
{
checkResults();
if (nField < 0 || nField > mnCols-1)
{
throw CppSQLite3Exception(CPPSQLITE_ERROR,
"Invalid field index requested",
DONT_DELETE_MSG);
}
int nIndex = (mnCurrentRow*mnCols) + mnCols + nField;
return mpaszResults[nIndex];
}
const char* CppSQLite3Table::fieldValue(const char* szField)
{
checkResults();
if (szField)
{
for (int nField = 0; nField < mnCols; nField++)
{
if (strcmp(szField, mpaszResults[nField]) == 0)
{
int nIndex = (mnCurrentRow*mnCols) + mnCols + nField;
return mpaszResults[nIndex];
}
}
}
throw CppSQLite3Exception(CPPSQLITE_ERROR,
"Invalid field name requested",
DONT_DELETE_MSG);
}
int CppSQLite3Table::getIntField(int nField, int nNullValue/*=0*/)
{
if (fieldIsNull(nField))
{
return nNullValue;
}
else
{
return atoi(fieldValue(nField));
}
}
int CppSQLite3Table::getIntField(const char* szField, int nNullValue/*=0*/)
{
if (fieldIsNull(szField))
{
return nNullValue;
}
else
{
return atoi(fieldValue(szField));
}
}
double CppSQLite3Table::getFloatField(int nField, double fNullValue/*=0.0*/)
{
if (fieldIsNull(nField))
{
return fNullValue;
}
else
{
return atof(fieldValue(nField));
}
}
double CppSQLite3Table::getFloatField(const char* szField, double fNullValue/*=0.0*/)
{
if (fieldIsNull(szField))
{
return fNullValue;
}
else
{
return atof(fieldValue(szField));
}
}
const char* CppSQLite3Table::getStringField(int nField, const char* szNullValue/*=""*/)
{
if (fieldIsNull(nField))
{
return szNullValue;
}
else
{
return fieldValue(nField);
}
}
const char* CppSQLite3Table::getStringField(const char* szField, const char* szNullValue/*=""*/)
{
if (fieldIsNull(szField))
{
return szNullValue;
}
else
{
return fieldValue(szField);
}
}
bool CppSQLite3Table::fieldIsNull(int nField)
{
checkResults();
return (fieldValue(nField) == 0);
}
bool CppSQLite3Table::fieldIsNull(const char* szField)
{
checkResults();
return (fieldValue(szField) == 0);
}
const char* CppSQLite3Table::fieldName(int nCol)
{
checkResults();
if (nCol < 0 || nCol > mnCols-1)
{
throw CppSQLite3Exception(CPPSQLITE_ERROR,
"Invalid field index requested",
DONT_DELETE_MSG);
}
return mpaszResults[nCol];
}
void CppSQLite3Table::setRow(int nRow)
{
checkResults();
if (nRow < 0 || nRow > mnRows-1)
{
throw CppSQLite3Exception(CPPSQLITE_ERROR,
"Invalid row index requested",
DONT_DELETE_MSG);
}
mnCurrentRow = nRow;
}
void CppSQLite3Table::checkResults()
{
if (mpaszResults == 0)
{
throw CppSQLite3Exception(CPPSQLITE_ERROR,
"Null Results pointer",
DONT_DELETE_MSG);
}
}
////////////////////////////////////////////////////////////////////////////////
CppSQLite3Statement::CppSQLite3Statement()
{
mpDB = 0;
mpVM = 0;
}
CppSQLite3Statement::CppSQLite3Statement(const CppSQLite3Statement& rStatement)
{
mpDB = rStatement.mpDB;
mpVM = rStatement.mpVM;
// Only one object can own VM
const_cast<CppSQLite3Statement&>(rStatement).mpVM = 0;
}
CppSQLite3Statement::CppSQLite3Statement(sqlite3* pDB, sqlite3_stmt* pVM)
{
mpDB = pDB;
mpVM = pVM;
}
CppSQLite3Statement::~CppSQLite3Statement()
{
try
{
finalize();
}
catch (...)
{
}
}
CppSQLite3Statement& CppSQLite3Statement::operator=(const CppSQLite3Statement& rStatement)
{
mpDB = rStatement.mpDB;
mpVM = rStatement.mpVM;
// Only one object can own VM
const_cast<CppSQLite3Statement&>(rStatement).mpVM = 0;
return *this;
}
int CppSQLite3Statement::execDML()
{
checkDB();
checkVM();
const char* szError=0;
int nRet = sqlite3_step(mpVM);
if (nRet == SQLITE_DONE)
{
int nRowsChanged = sqlite3_changes(mpDB);
nRet = sqlite3_reset(mpVM);
if (nRet != SQLITE_OK)
{
szError = sqlite3_errmsg(mpDB);
throw CppSQLite3Exception(nRet, (char*)szError, DONT_DELETE_MSG);
}
return nRowsChanged;
}
else
{
nRet = sqlite3_reset(mpVM);
szError = sqlite3_errmsg(mpDB);
throw CppSQLite3Exception(nRet, (char*)szError, DONT_DELETE_MSG);
}
}
CppSQLite3Query CppSQLite3Statement::execQuery()
{
checkDB();
checkVM();
int nRet = sqlite3_step(mpVM);
if (nRet == SQLITE_DONE)
{
// no rows
return CppSQLite3Query(mpDB, mpVM, true/*eof*/, false);
}
else if (nRet == SQLITE_ROW)
{
// at least 1 row
return CppSQLite3Query(mpDB, mpVM, false/*eof*/, false);
}
else
{
nRet = sqlite3_reset(mpVM);
const char* szError = sqlite3_errmsg(mpDB);
throw CppSQLite3Exception(nRet, (char*)szError, DONT_DELETE_MSG);
}
}
void CppSQLite3Statement::bind(int nParam, const char* szValue)
{
checkVM();
int nRes = sqlite3_bind_text(mpVM, nParam, szValue, -1, SQLITE_TRANSIENT);
if (nRes != SQLITE_OK)
{
throw CppSQLite3Exception(nRes,
"Error binding string param",
DONT_DELETE_MSG);
}
}
void CppSQLite3Statement::bind(int nParam, const int nValue)
{
checkVM();
int nRes = sqlite3_bind_int(mpVM, nParam, nValue);
if (nRes != SQLITE_OK)
{
throw CppSQLite3Exception(nRes,
"Error binding int param",
DONT_DELETE_MSG);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -