summaryrefslogtreecommitdiff
path: root/src/sqlite/SQLiteWrapper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sqlite/SQLiteWrapper.cpp')
-rw-r--r--src/sqlite/SQLiteWrapper.cpp258
1 files changed, 258 insertions, 0 deletions
diff --git a/src/sqlite/SQLiteWrapper.cpp b/src/sqlite/SQLiteWrapper.cpp
new file mode 100644
index 00000000..6c7c45ad
--- /dev/null
+++ b/src/sqlite/SQLiteWrapper.cpp
@@ -0,0 +1,258 @@
+/*
+ SQLiteWrapper.cpp
+
+ Copyright (C) 2004 René Nyffenegger
+
+ This source code is provided 'as-is', without any express or implied
+ warranty. In no event will the author be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this source code must not be misrepresented; you must not
+ claim that you wrote the original source code. If you use this source code
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original source code.
+
+ 3. This notice may not be removed or altered from any source distribution.
+
+ René Nyffenegger rene.nyffenegger@adp-gmbh.ch
+
+*/
+
+#include "SQLiteWrapper.h"
+
+SQLiteWrapper::SQLiteWrapper() : db_(0) {
+}
+
+bool SQLiteWrapper::Open(std::string const& db_file) {
+ if (sqlite3_open(db_file.c_str(), &db_) != SQLITE_OK) {
+ return false;
+ }
+ return true;
+}
+
+bool SQLiteWrapper::SelectStmt(std::string const& stmt, ResultTable& res) {
+ char *errmsg;
+ int ret;
+
+ res.reset();
+
+ ret = sqlite3_exec(db_, stmt.c_str(), SelectCallback, static_cast<void*> (&res), &errmsg);
+
+ if (ret != SQLITE_OK) {
+ return false;
+ }
+ return true;
+// if (ret != SQLITE_OK) {
+// std::cout << stmt << " [" << errmsg << "]" << std::endl;
+// }
+}
+
+// TODO parameter p_col_names
+int SQLiteWrapper::SelectCallback(void *p_data, int num_fields, char **p_fields, char** /*p_col_names*/) {
+ ResultTable* res = reinterpret_cast<ResultTable*>(p_data);
+
+ ResultRecord record;
+
+ for(int i=0; i < num_fields; i++) {
+ record.fields_.push_back(p_fields[i]);
+ }
+
+ res->records_.push_back(record);
+
+ return 0;
+}
+
+SQLiteStatement* SQLiteWrapper::Statement(std::string const& statement) {
+ SQLiteStatement* stmt;
+ try {
+ stmt = new SQLiteStatement(statement, db_);
+ return stmt;
+ }
+ catch (const char* e) {
+ return 0;
+ }
+}
+
+SQLiteStatement::SQLiteStatement(std::string const& statement, sqlite3* db) {
+ if ( sqlite3_prepare(
+ db,
+ statement.c_str(), // stmt
+ -1, // If than zero, then stmt is read up to the first nul terminator
+ &stmt_,
+ 0 // Pointer to unused portion of stmt
+ )
+ != SQLITE_OK) {
+ throw sqlite3_errmsg(db);
+ }
+
+ if (!stmt_) {
+ throw "stmt_ is 0";
+ }
+}
+
+SQLiteStatement::~SQLiteStatement() {
+}
+
+SQLiteStatement::SQLiteStatement() :
+ stmt_ (0)
+{
+}
+
+bool SQLiteStatement::Bind(int pos_zero_indexed, std::string const& value) {
+ if (sqlite3_bind_text (
+ stmt_,
+ pos_zero_indexed+1, // Index of wildcard
+ value.c_str(),
+ value.length(), // length of text
+ SQLITE_TRANSIENT // SQLITE_TRANSIENT: SQLite makes its own copy
+ )
+ != SQLITE_OK) {
+ return false;
+ }
+ return true;
+}
+
+bool SQLiteStatement::Bind(int pos_zero_indexed, double value) {
+ if (sqlite3_bind_double(
+ stmt_,
+ pos_zero_indexed+1, // Index of wildcard
+ value
+ )
+ != SQLITE_OK) {
+ return false;
+ }
+ return true;
+}
+
+bool SQLiteStatement::Bind(int pos_zero_indexed, int value) {
+ if (sqlite3_bind_int(
+ stmt_,
+ pos_zero_indexed+1, // Index of wildcard
+ value
+ )
+ != SQLITE_OK) {
+ return false;
+ }
+ return true;
+}
+
+bool SQLiteStatement::BindNull(int pos_zero_indexed) {
+ if (sqlite3_bind_null(
+ stmt_,
+ pos_zero_indexed+1 // Index of wildcard
+ )
+ != SQLITE_OK) {
+ return false;
+ }
+ return true;
+}
+
+bool SQLiteStatement::Execute() {
+ int rc = sqlite3_step(stmt_);
+ if (rc == SQLITE_BUSY) {
+ //::MessageBox(0, "SQLITE_BUSY", 0, 0);
+ return false;
+ }
+ if (rc == SQLITE_ERROR) {
+ //::MessageBox(0, "SQLITE_ERROR", 0, 0);
+ return false;
+ }
+ if (rc == SQLITE_MISUSE) {
+ //::MessageBox(0, "SQLITE_ERROR", 0, 0);
+ return false;
+ }
+ if (rc != SQLITE_DONE) {
+ //sqlite3_reset(stmt_);
+ return false;
+ }
+ sqlite3_reset(stmt_);
+ return true;
+}
+
+SQLiteStatement::dataType SQLiteStatement::DataType(int pos_zero_indexed) {
+ return dataType(sqlite3_column_type(stmt_, pos_zero_indexed));
+}
+
+int SQLiteStatement::ValueInt(int pos_zero_indexed) {
+ return sqlite3_column_int(stmt_, pos_zero_indexed);
+}
+
+std::string SQLiteStatement::ValueString(int pos_zero_indexed) {
+ return std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt_, pos_zero_indexed)));
+}
+
+bool SQLiteStatement::RestartSelect() {
+ sqlite3_reset(stmt_);
+ return true;
+}
+
+bool SQLiteStatement::Reset() {
+ int rc = sqlite3_step(stmt_);
+
+ sqlite3_reset(stmt_);
+
+ if (rc == SQLITE_ROW) return true;
+ return false;
+}
+
+bool SQLiteStatement::NextRow() {
+ int rc = sqlite3_step(stmt_);
+
+ if (rc == SQLITE_ROW ) {
+ return true;
+ }
+ if (rc == SQLITE_DONE ) {
+ sqlite3_reset(stmt_);
+ return false;
+ }
+ else if (rc == SQLITE_MISUSE) {
+ //::MessageBox(0, "SQLiteStatement::NextRow SQLITE_MISUSE", 0, 0);
+ }
+ else if (rc == SQLITE_BUSY ) {
+ //::MessageBox(0, "SQLiteStatement::NextRow SQLITE_BUSY", 0, 0);
+ }
+ else if (rc == SQLITE_ERROR ) {
+ //::MessageBox(0, "SQLiteStatement::NextRow SQLITE_ERROR", 0, 0);
+ }
+ return false;
+}
+
+bool SQLiteWrapper::DirectStatement(std::string const& stmt) {
+ char *errmsg;
+ int ret;
+
+ ret = sqlite3_exec(db_, stmt.c_str(), 0, 0, &errmsg);
+
+ if(ret != SQLITE_OK) {
+ return false;
+ }
+ return true;
+
+ //if(ret != SQLITE_OK) {
+ // std::cout << stmt << " [" << errmsg << "]" << std::endl;
+ //}
+}
+
+std::string SQLiteWrapper::LastError() {
+ return sqlite3_errmsg(db_);
+}
+
+bool SQLiteWrapper::Begin() {
+ return DirectStatement("begin");
+}
+
+bool SQLiteWrapper::Commit() {
+ return DirectStatement("commit");
+}
+
+bool SQLiteWrapper::Rollback() {
+ return DirectStatement("rollback");
+}
+