From 6ef42fd11ac54d5f560fb84921a1cf3f372849e0 Mon Sep 17 00:00:00 2001 From: dshaligram Date: Sat, 22 Sep 2007 14:25:42 +0000 Subject: Implemented SQLite fronts for dbm_firstkey and dbm_nextkey to fix trunk build on Windows. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2180 c06c8d41-db1a-0410-9941-cceddc491573 --- crawl-ref/source/sqldbm.cc | 62 ++++++++++++++++++++++++++++++++++++++++++++-- crawl-ref/source/sqldbm.h | 9 +++++++ 2 files changed, 69 insertions(+), 2 deletions(-) (limited to 'crawl-ref/source') diff --git a/crawl-ref/source/sqldbm.cc b/crawl-ref/source/sqldbm.cc index 7a6956f08c..af68fbbc62 100644 --- a/crawl-ref/source/sqldbm.cc +++ b/crawl-ref/source/sqldbm.cc @@ -15,7 +15,7 @@ SQL_DBM::SQL_DBM(const std::string &dbname, bool do_open) : error(), errc(SQLITE_OK), db(NULL), s_insert(NULL), - s_query(NULL), dbfile(dbname) + s_query(NULL), s_iterator(NULL), dbfile(dbname) { if (do_open && !dbfile.empty()) open(); @@ -95,6 +95,7 @@ void SQL_DBM::close() sqlite3_exec(db, "COMMIT;", NULL, NULL, NULL); finalise_query(&s_insert); finalise_query(&s_query); + finalise_query(&s_iterator); sqlite3_close(db); db = NULL; } @@ -145,12 +146,45 @@ std::string SQL_DBM::query(const std::string &key) return (res); } +std::auto_ptr SQL_DBM::firstkey() +{ + if (init_iterator() != SQLITE_OK) + { + std::auto_ptr result; + return (result); + } + + return nextkey(); +} + +std::auto_ptr SQL_DBM::nextkey() +{ + std::auto_ptr result; + if (s_iterator) + { + int err = SQLITE_OK; + if ((err = ec(sqlite3_step(s_iterator))) == SQLITE_ROW) + result.reset( + new std::string( + (const char *) sqlite3_column_text(s_iterator, 0) )); + else + sqlite3_reset(s_iterator); + } + return (result); +} + int SQL_DBM::init_query() { return s_query? SQLITE_OK : prepare_query(&s_query, "SELECT value FROM dbm WHERE key = ?"); } +int SQL_DBM::init_iterator() +{ + return s_iterator? SQLITE_OK : + prepare_query(&s_iterator, "SELECT key FROM dbm"); +} + int SQL_DBM::finalise_query(sqlite3_stmt **q) { if (!*q) @@ -179,7 +213,7 @@ sql_datum::sql_datum() : dptr(NULL), dsize(0), need_free(false) } sql_datum::sql_datum(const std::string &s) : dptr(NULL), dsize(s.length()), - need_free(false) + need_free(false) { if ((dptr = new char [dsize])) { @@ -269,6 +303,30 @@ sql_datum dbm_fetch(SQL_DBM *db, const sql_datum &key) return sql_datum(ans); } +static sql_datum dbm_key( + SQL_DBM *db, + std::auto_ptr (SQL_DBM::*key)()) +{ + std::auto_ptr res = (db->*key)(); + if (res.get()) + return sql_datum(*res.get()); + else + { + sql_datum dummy; + return dummy; + } +} + +sql_datum dbm_firstkey(SQL_DBM *db) +{ + return dbm_key(db, &SQL_DBM::firstkey); +} + +sql_datum dbm_nextkey(SQL_DBM *db) +{ + return dbm_key(db, &SQL_DBM::nextkey); +} + int dbm_store(SQL_DBM *db, const sql_datum &key, const sql_datum &value, int) { int err = db->insert(key.to_str(), value.to_str()); diff --git a/crawl-ref/source/sqldbm.h b/crawl-ref/source/sqldbm.h index 7cf8faac8a..8a4130cd8c 100644 --- a/crawl-ref/source/sqldbm.h +++ b/crawl-ref/source/sqldbm.h @@ -6,6 +6,7 @@ #ifdef USE_SQLITE_DBM #include +#include #if defined(DOS) || defined(WIN32CONSOLE) #define SQLITE_INT64_TYPE int @@ -55,6 +56,10 @@ public: int open(const std::string &db = ""); void close(); + + std::auto_ptr firstkey(); + std::auto_ptr nextkey(); + std::string query(const std::string &key); int insert(const std::string &key, const std::string &value); @@ -66,6 +71,7 @@ private: int finalise_query(sqlite3_stmt **query); int prepare_query(sqlite3_stmt **query, const char *sql); int init_query(); + int init_iterator(); int init_insert(); int init_schema(); int ec(int err); @@ -74,6 +80,7 @@ private: sqlite3 *db; sqlite3_stmt *s_insert; sqlite3_stmt *s_query; + sqlite3_stmt *s_iterator; std::string dbfile; }; @@ -81,6 +88,8 @@ SQL_DBM *dbm_open(const char *filename, int open_mode, int permissions); int dbm_close(SQL_DBM *db); sql_datum dbm_fetch(SQL_DBM *db, const sql_datum &key); +sql_datum dbm_firstkey(SQL_DBM *db); +sql_datum dbm_nextkey(SQL_DBM *db); int dbm_store(SQL_DBM *db, const sql_datum &key, const sql_datum &value, int overwrite); -- cgit v1.2.3-54-g00ecf