Give access to the sqlite3 prepared statement API.

This commit is contained in:
JoelKatz
2013-01-27 23:41:15 -08:00
parent e8ac00e1a3
commit d522f04385
3 changed files with 151 additions and 1 deletions

View File

@@ -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<sqlite3_int64>(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<const char *>(sqlite3_column_text(statement, column));
}
const char* SqliteStatement::peekString(int column)
{
return reinterpret_cast<const char *>(sqlite3_column_text(statement, column));
}
uint32 SqliteStatement::getUInt32(int column)
{
return static_cast<uint32>(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

View File

@@ -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

View File

@@ -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