summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-09-22 14:25:42 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-09-22 14:25:42 +0000
commit6ef42fd11ac54d5f560fb84921a1cf3f372849e0 (patch)
tree0b6c8cb7a6d2f8fddcd0cb00475f27b9a3c3c0b4 /crawl-ref/source
parentfaa6d08c428ad8280f84707fa8d4586440b98631 (diff)
downloadcrawl-ref-6ef42fd11ac54d5f560fb84921a1cf3f372849e0.tar.gz
crawl-ref-6ef42fd11ac54d5f560fb84921a1cf3f372849e0.zip
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
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/sqldbm.cc62
-rw-r--r--crawl-ref/source/sqldbm.h9
2 files changed, 69 insertions, 2 deletions
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<std::string> SQL_DBM::firstkey()
+{
+ if (init_iterator() != SQLITE_OK)
+ {
+ std::auto_ptr<std::string> result;
+ return (result);
+ }
+
+ return nextkey();
+}
+
+std::auto_ptr<std::string> SQL_DBM::nextkey()
+{
+ std::auto_ptr<std::string> 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<std::string> (SQL_DBM::*key)())
+{
+ std::auto_ptr<std::string> 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 <sys/types.h>
+#include <memory>
#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<std::string> firstkey();
+ std::auto_ptr<std::string> 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);