fixing calculation of Bloom filter size that was too large by 1024x because it was...
[oweals/gnunet.git] / src / datastore / plugin_datastore_sqlite.c
index 4a66c44ca38e09a0afa1193d2194684910f99688..765c7f34adb4132399c32964bd20d0092b1de04d 100644 (file)
@@ -31,7 +31,7 @@
 /**
  * Enable or disable logging debug messages.
  */
-#define DEBUG_SQLITE GNUNET_NO
+#define DEBUG_SQLITE GNUNET_EXTRA_LOGGING
 
 /**
  * We allocate items on the stack at times.  To prevent a stack
@@ -325,33 +325,42 @@ database_setup (const struct GNUNET_CONFIGURATION_Handle *cfg,
         &plugin->updRepl) != SQLITE_OK) ||
       (sq_prepare
        (plugin->dbh,
-        "SELECT type,prio,anonLevel,expire,hash,value,_ROWID_ "
-        "FROM gn090 INDEXED BY idx_repl_rvalue " "WHERE repl=?2 AND"
-        "      (rvalue>=?1 OR"
-        "        NOT EXISTS (SELECT 1 FROM gn090 INDEXED BY idx_repl_rvalue WHERE repl=?2 AND rvalue>=?1 LIMIT 1))"
-        "     ORDER BY rvalue ASC" "     LIMIT 1",
-        &plugin->selRepl) != SQLITE_OK) ||
-      (sq_prepare
-       (plugin->dbh,
-        "SELECT MAX(repl) " "FROM gn090 INDEXED BY idx_repl_rvalue",
-        &plugin->maxRepl) != SQLITE_OK) ||
+        "SELECT type,prio,anonLevel,expire,hash,value,_ROWID_ " "FROM gn090 "
+#if SQLITE_VERSION_NUMBER >= 3007000
+        "INDEXED BY idx_repl_rvalue "
+#endif
+        "WHERE repl=?2 AND " " (rvalue>=?1 OR "
+        "  NOT EXISTS (SELECT 1 FROM gn090 "
+#if SQLITE_VERSION_NUMBER >= 3007000
+        "INDEXED BY idx_repl_rvalue "
+#endif
+        "WHERE repl=?2 AND rvalue>=?1 LIMIT 1) ) "
+        "ORDER BY rvalue ASC LIMIT 1", &plugin->selRepl) != SQLITE_OK) ||
+      (sq_prepare (plugin->dbh, "SELECT MAX(repl) FROM gn090"
+#if SQLITE_VERSION_NUMBER >= 3007000
+                   " INDEXED BY idx_repl_rvalue"
+#endif
+                   "", &plugin->maxRepl) != SQLITE_OK) ||
       (sq_prepare
        (plugin->dbh,
-        "SELECT type,prio,anonLevel,expire,hash,value,_ROWID_ "
-        "FROM gn090 INDEXED BY idx_expire"
-        " WHERE NOT EXISTS (SELECT 1 FROM gn090 WHERE expire < ?1 LIMIT 1) OR (expire < ?1) "
-        " ORDER BY expire ASC LIMIT 1", &plugin->selExpi) != SQLITE_OK) ||
+        "SELECT type,prio,anonLevel,expire,hash,value,_ROWID_ " "FROM gn090 "
+#if SQLITE_VERSION_NUMBER >= 3007000
+        "INDEXED BY idx_expire "
+#endif
+        "WHERE NOT EXISTS (SELECT 1 FROM gn090 WHERE expire < ?1 LIMIT 1) OR (expire < ?1) "
+        "ORDER BY expire ASC LIMIT 1", &plugin->selExpi) != SQLITE_OK) ||
       (sq_prepare
        (plugin->dbh,
-        "SELECT type,prio,anonLevel,expire,hash,value,_ROWID_ "
-        "FROM gn090 INDEXED BY idx_anon_type_hash "
+        "SELECT type,prio,anonLevel,expire,hash,value,_ROWID_ " "FROM gn090 "
+#if SQLITE_VERSION_NUMBER >= 3007000
+        "INDEXED BY idx_anon_type_hash "
+#endif
         "WHERE (anonLevel = 0 AND type=?1) "
         "ORDER BY hash DESC LIMIT 1 OFFSET ?2",
         &plugin->selZeroAnon) != SQLITE_OK) ||
       (sq_prepare
        (plugin->dbh,
-        "INSERT INTO gn090 (repl, type, prio, "
-        "anonLevel, expire, rvalue, hash, vhash, value) "
+        "INSERT INTO gn090 (repl, type, prio, anonLevel, expire, rvalue, hash, vhash, value) "
         "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
         &plugin->insertContent) != SQLITE_OK) ||
       (sq_prepare
@@ -1075,6 +1084,43 @@ sqlite_plugin_get_expiration (void *cls, PluginDatumProcessor proc,
 }
 
 
+
+/**
+ * Get all of the keys in the datastore.
+ *
+ * @param cls closure
+ * @param proc function to call on each key
+ * @param proc_cls closure for proc
+ */
+static void
+sqlite_plugin_get_keys (void *cls,
+                       PluginKeyProcessor proc,
+                       void *proc_cls)
+{
+  struct Plugin *plugin = cls;
+  const GNUNET_HashCode *key;
+  sqlite3_stmt *stmt;
+  int ret;
+
+  GNUNET_assert (proc != NULL);
+  if (sq_prepare (plugin->dbh, "SELECT hash FROM gn090", &stmt) != SQLITE_OK)
+  {
+    LOG_SQLITE (plugin, NULL, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+               "sqlite_prepare");
+    return;
+  }
+  while (SQLITE_ROW == (ret = sqlite3_step (stmt)))
+  {
+    key = sqlite3_column_blob (stmt, 1);
+    if (sizeof (GNUNET_HashCode) == sqlite3_column_bytes (stmt, 1))
+      proc (proc_cls, key, 1);
+  }
+  if (SQLITE_DONE != ret)
+    LOG_SQLITE (plugin, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite_step");
+  sqlite3_finalize (stmt);
+}
+
+
 /**
  * Drop database.
  *
@@ -1168,6 +1214,7 @@ libgnunet_plugin_datastore_sqlite_init (void *cls)
   api->get_replication = &sqlite_plugin_get_replication;
   api->get_expiration = &sqlite_plugin_get_expiration;
   api->get_zero_anonymity = &sqlite_plugin_get_zero_anonymity;
+  api->get_keys = &sqlite_plugin_get_keys;
   api->drop = &sqlite_plugin_drop;
   GNUNET_log_from (GNUNET_ERROR_TYPE_INFO, "sqlite",
                    _("Sqlite database running\n"));