#include "SqliteDatabase.h" #include "sqlite3.h" #include #include #include using namespace std; SqliteDatabase::SqliteDatabase(const char* host) : Database(host,"","") { mConnection=NULL; mCurrentStmt=NULL; } void SqliteDatabase::connect() { int rc = sqlite3_open(mHost.c_str(), &mConnection); if( rc ) { cout << "Can't open database: " << mHost << " " << rc << endl; sqlite3_close(mConnection); } } void SqliteDatabase::disconnect() { sqlite3_finalize(mCurrentStmt); sqlite3_close(mConnection); } // returns true if the query went ok bool SqliteDatabase::executeSQL(const char* sql, bool fail_ok) { sqlite3_finalize(mCurrentStmt); int rc=sqlite3_prepare_v2(mConnection,sql,-1,&mCurrentStmt,NULL); if( rc!=SQLITE_OK ) { if(!fail_ok) { cout << "SQL Perror:" << rc << endl; #ifdef DEBUG cout << "Statement: " << sql << endl; cout << "Error: " << sqlite3_errmsg(mConnection) << endl; #endif } return(false); } rc=sqlite3_step(mCurrentStmt); if(rc==SQLITE_ROW) { mMoreRows=true; }else if(rc==SQLITE_DONE) { mMoreRows=false; }else { mMoreRows=false; if(!fail_ok) { cout << "SQL Serror:" << rc << endl; #ifdef DEBUG cout << "Statement: " << sql << endl; cout << "Error: " << sqlite3_errmsg(mConnection) << endl; #endif } return(false); } return(true); } // tells you how many rows were changed by an update or insert int SqliteDatabase::getNumRowsAffected() { // TODO: SqliteDatabase::getNumRowsAffected() return(0); } int SqliteDatabase::getLastInsertID() { return(sqlite3_last_insert_rowid(mConnection)); } // returns false if there are no results bool SqliteDatabase::startIterRows() { mColNameTable.clear(); mColNameTable.resize(sqlite3_column_count(mCurrentStmt)); for(unsigned n=0; n SqliteDatabase::getBinary(int colIndex) { const unsigned char* blob = reinterpret_cast(sqlite3_column_blob(mCurrentStmt, colIndex)); size_t iSize = sqlite3_column_bytes(mCurrentStmt, colIndex); std::vector vucResult; vucResult.resize(iSize); std::copy(blob, blob+iSize, vucResult.begin()); return vucResult; } uint64 SqliteDatabase::getBigInt(int colIndex) { return(sqlite3_column_int64(mCurrentStmt, colIndex)); } /* http://www.sqlite.org/lang_expr.html BLOB literals are string literals containing hexadecimal data and preceded by a single "x" or "X" character. For example: X'53514C697465' */ void SqliteDatabase::escape(const unsigned char* start, int size, std::string& retStr) { retStr="X'"; char buf[3]; for(int n=0; n