diff --git a/src/cpp/database/SqliteDatabase.cpp b/src/cpp/database/SqliteDatabase.cpp index e760d6903..de3dbab2d 100644 --- a/src/cpp/database/SqliteDatabase.cpp +++ b/src/cpp/database/SqliteDatabase.cpp @@ -238,4 +238,107 @@ void SqliteDatabase::runWal() } } +SqliteStatement::SqliteStatement(SqliteDatabase* db, const char *sql) +{ + assert(db); + int j = sqlite3_prepare_v2(db->peekConnection(), sql, strlen(sql) + 1, &statement, NULL); + if (j != SQLITE_OK) + throw j; +} + +SqliteStatement::~SqliteStatement() +{ + sqlite3_finalize(statement); +} + +sqlite3_stmt* SqliteStatement::peekStatement() +{ + return statement; +} + +int SqliteStatement::bind(int position, const void *data, int length) +{ + return sqlite3_bind_blob(statement, position, data, length, SQLITE_TRANSIENT); +} + +int SqliteStatement::bindStatic(int position, const void *data, int length) +{ + return sqlite3_bind_blob(statement, position, data, length, SQLITE_STATIC); +} + +int SqliteStatement::bind(int position, uint32 value) +{ + return sqlite3_bind_int64(statement, position, static_cast(value)); +} + +int SqliteStatement::bind(int position, const std::string& value) +{ + return sqlite3_bind_text(statement, position, value.data(), value.size(), SQLITE_TRANSIENT); +} + +int SqliteStatement::bindStatic(int position, const std::string& value) +{ + return sqlite3_bind_text(statement, position, value.data(), value.size(), SQLITE_TRANSIENT); +} + +int SqliteStatement::bind(int position) +{ + return sqlite3_bind_null(statement, position); +} + +int SqliteStatement::size(int column) +{ + return sqlite3_column_bytes(statement, column); +} + +const void* SqliteStatement::getBlob(int column) +{ + return sqlite3_column_blob(statement, column); +} + +std::string SqliteStatement::getString(int column) +{ + return reinterpret_cast(sqlite3_column_text(statement, column)); +} + +const char* SqliteStatement::peekString(int column) +{ + return reinterpret_cast(sqlite3_column_text(statement, column)); +} + +uint32 SqliteStatement::getUInt32(int column) +{ + return static_cast(sqlite3_column_int64(statement, column)); +} + +int64 SqliteStatement::getInt64(int column) +{ + return sqlite3_column_int64(statement, column); +} + +int SqliteStatement::step() +{ + return sqlite3_step(statement); +} + +int SqliteStatement::reset() +{ + return sqlite3_reset(statement); +} + +bool SqliteStatement::isOk(int j) +{ + return j == SQLITE_OK; +} + +bool SqliteStatement::isDone(int j) +{ + return j == SQLITE_DONE; +} + +bool SqliteStatement::isRow(int j) +{ + return j == SQLITE_ROW; +} + // vim:ts=4 diff --git a/src/cpp/database/SqliteDatabase.h b/src/cpp/database/SqliteDatabase.h index 9b99bbf11..e860c6144 100644 --- a/src/cpp/database/SqliteDatabase.h +++ b/src/cpp/database/SqliteDatabase.h @@ -52,9 +52,52 @@ public: sqlite3* peekConnection() { return mConnection; } virtual bool setupCheckpointing(); + virtual SqliteDatabase* getSqliteDB() { return this; } void runWal(); void doHook(const char *db, int walSize); }; +class SqliteStatement +{ +private: + SqliteStatement(const SqliteStatement&); // no implementation + SqliteStatement& operator=(const SqliteStatement&); // no implementation + +protected: + sqlite3_stmt* statement; + +public: + SqliteStatement(SqliteDatabase* db, const char *statement); + ~SqliteStatement(); + + sqlite3_stmt* peekStatement(); + + int bind(int position, const void *data, int length); + int bindStatic(int position, const void *data, int length); + + int bind(int position, uint32 value); + + int bind(int position, const std::string& value); + + int bindStatic(int position, const std::string& value); + + int bind(int position); + + int size(int column); + + const void* getBlob(int column); + std::string getString(int column); + const char* peekString(int column); + uint32 getUInt32(int column); + int64 getInt64(int column); + + int step(); + int reset(); + + bool isOk(int); + bool isDone(int); + bool isRow(int); +}; + // vim:ts=4 diff --git a/src/cpp/database/database.h b/src/cpp/database/database.h index 7f9199529..aaad8ac48 100644 --- a/src/cpp/database/database.h +++ b/src/cpp/database/database.h @@ -16,6 +16,9 @@ /* this maintains the connection to the database */ + +class SqliteDatabase; + class Database { protected: @@ -83,7 +86,8 @@ public: // float getSingleDBValueFloat(const char* sql); // char* getSingleDBValueStr(const char* sql, std::string& retStr); - virtual bool setupCheckpointing() { return false; } + virtual bool setupCheckpointing() { return false; } + virtual SqliteDatabase* getSqliteDB() { return NULL; } }; #endif