about summary refs log tree commit diff
path: root/src/db.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/db.cc')
-rw-r--r--src/db.cc57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/db.cc b/src/db.cc
index b33591c8b20d..89cee32ba4a9 100644
--- a/src/db.cc
+++ b/src/db.cc
@@ -73,6 +73,40 @@ bool queryDB(const string & filename, const string & dbname,
 }
 
 
+bool queryListDB(const string & filename, const string & dbname,
+    const string & key, Strings & data)
+{
+    string d;
+
+    if (!queryDB(filename, dbname, key, d))
+        return false;
+
+    string::iterator it = d.begin();
+    
+    while (it != d.end()) {
+
+        if (it + 4 > d.end())
+            throw Error(format("short db entry: `%1%'") % d);
+        
+        unsigned int len;
+        len = (unsigned char) *it++;
+        len |= ((unsigned char) *it++) << 8;
+        len |= ((unsigned char) *it++) << 16;
+        len |= ((unsigned char) *it++) << 24;
+        
+        if (it + len > d.end())
+            throw Error(format("short db entry: `%1%'") % d);
+
+        string s;
+        while (len--) s += *it++;
+
+        data.push_back(s);
+    }
+
+    return true;
+}
+
+
 void setDB(const string & filename, const string & dbname,
     const string & key, const string & data)
 {
@@ -85,6 +119,29 @@ void setDB(const string & filename, const string & dbname,
 }
 
 
+void setListDB(const string & filename, const string & dbname,
+    const string & key, const Strings & data)
+{
+    string d;
+    
+    for (Strings::const_iterator it = data.begin();
+         it != data.end(); it++)
+    {
+        string s = *it;
+        unsigned int len = s.size();
+
+        d += len & 0xff;
+        d += (len >> 8) & 0xff;
+        d += (len >> 16) & 0xff;
+        d += (len >> 24) & 0xff;
+        
+        d += s;
+    }
+
+    setDB(filename, dbname, key, d);
+}
+
+
 void delDB(const string & filename, const string & dbname,
     const string & key)
 {