-fix
[oweals/gnunet.git] / src / datastore / plugin_datastore_template.c
index 6439bc019b163a6c8627b8ad404574b982b2dff6..174d3d255469c248956ae3c472928311cd5ff25c 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet
 /*
      This file is part of GNUnet
-     (C) 2009 Christian Grothoff (and other contributing authors)
+     (C) 2009, 2011 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
  */
 
 #include "platform.h"
  */
 
 #include "platform.h"
-#include "plugin_datastore.h"
+#include "gnunet_datastore_plugin.h"
 
 
 /**
  * Context for all functions in this plugin.
  */
 
 
 /**
  * Context for all functions in this plugin.
  */
-struct Plugin 
+struct Plugin
 {
   /**
    * Our execution environment.
 {
   /**
    * Our execution environment.
@@ -47,7 +47,8 @@ struct Plugin
  * @param cls our "struct Plugin*"
  * @return number of bytes used on disk
  */
  * @param cls our "struct Plugin*"
  * @return number of bytes used on disk
  */
-static unsigned long long template_plugin_get_size (void *cls)
+static unsigned long long
+template_plugin_estimate_size (void *cls)
 {
   GNUNET_break (0);
   return 0;
 {
   GNUNET_break (0);
   return 0;
@@ -64,20 +65,17 @@ static unsigned long long template_plugin_get_size (void *cls)
  * @param type type of the content
  * @param priority priority of the content
  * @param anonymity anonymity-level for the content
  * @param type type of the content
  * @param priority priority of the content
  * @param anonymity anonymity-level for the content
+ * @param replication replication-level for the content
  * @param expiration expiration time for the content
  * @param msg set to error message
  * @return GNUNET_OK on success
  */
 static int
  * @param expiration expiration time for the content
  * @param msg set to error message
  * @return GNUNET_OK on success
  */
 static int
-template_plugin_put (void *cls,
-                  const GNUNET_HashCode * key,
-                  uint32_t size,
-                  const void *data,
-                  uint32_t type,
-                  uint32_t priority,
-                  uint32_t anonymity,
-                    struct GNUNET_TIME_Absolute expiration,
-                    char **msg)
+template_plugin_put (void *cls, const GNUNET_HashCode * key, uint32_t size,
+                     const void *data, enum GNUNET_BLOCK_Type type,
+                     uint32_t priority, uint32_t anonymity,
+                     uint32_t replication,
+                     struct GNUNET_TIME_Absolute expiration, char **msg)
 {
   GNUNET_break (0);
   *msg = GNUNET_strdup ("not implemented");
 {
   GNUNET_break (0);
   *msg = GNUNET_strdup ("not implemented");
@@ -86,30 +84,11 @@ template_plugin_put (void *cls,
 
 
 /**
 
 
 /**
- * Function invoked on behalf of a "PluginIterator"
- * asking the database plugin to call the iterator
- * with the next item.
- *
- * @param next_cls whatever argument was given
- *        to the PluginIterator as "next_cls".
- * @param end_it set to GNUNET_YES if we
- *        should terminate the iteration early
- *        (iterator should be still called once more
- *         to signal the end of the iteration).
- */
-static void 
-template_plugin_next_request (void *next_cls,
-                      int end_it)
-{
-  GNUNET_break (0);
-}
-
-
-/**
- * Iterate over the results for a particular key
- * in the datastore.
+ * Get one of the results for a particular key in the datastore.
  *
  * @param cls closure
  *
  * @param cls closure
+ * @param offset offset of the result (modulo num-results);
+ *               specific ordering does not matter for the offset
  * @param key maybe NULL (to match all entries)
  * @param vhash hash of the value, maybe NULL (to
  *        match all values that have the right key).
  * @param key maybe NULL (to match all entries)
  * @param vhash hash of the value, maybe NULL (to
  *        match all values that have the right key).
@@ -118,16 +97,52 @@ template_plugin_next_request (void *next_cls,
  *        there may be!
  * @param type entries of which type are relevant?
  *     Use 0 for any type.
  *        there may be!
  * @param type entries of which type are relevant?
  *     Use 0 for any type.
- * @param iter function to call on each matching value;
- *        will be called once with a NULL value at the end
- * @param iter_cls closure for iter
+ * @param proc function to call on each matching value;
+ *        will be called with NULL if nothing matches
+ * @param proc_cls closure for proc
  */
 static void
  */
 static void
-template_plugin_get (void *cls,
-                    const GNUNET_HashCode * key,
-                    const GNUNET_HashCode * vhash,
-                    uint32_t type,
-                    PluginIterator iter, void *iter_cls)
+template_plugin_get_key (void *cls, uint64_t offset,
+                         const GNUNET_HashCode * key,
+                         const GNUNET_HashCode * vhash,
+                         enum GNUNET_BLOCK_Type type, PluginDatumProcessor proc,
+                         void *proc_cls)
+{
+  GNUNET_break (0);
+}
+
+
+
+/**
+ * Get a random item for replication.  Returns a single, not expired,
+ * random item from those with the highest replication counters.  The
+ * item's replication counter is decremented by one IF it was positive
+ * before.  Call 'proc' with all values ZERO or NULL if the datastore
+ * is empty.
+ *
+ * @param cls closure
+ * @param proc function to call the value (once only).
+ * @param proc_cls closure for proc
+ */
+static void
+template_plugin_get_replication (void *cls, PluginDatumProcessor proc,
+                                 void *proc_cls)
+{
+  GNUNET_break (0);
+}
+
+
+/**
+ * Get a random item for expiration.  Call 'proc' with all values ZERO
+ * or NULL if the datastore is empty.
+ *
+ * @param cls closure
+ * @param proc function to call the value (once only).
+ * @param proc_cls closure for proc
+ */
+static void
+template_plugin_get_expiration (void *cls, PluginDatumProcessor proc,
+                                void *proc_cls)
 {
   GNUNET_break (0);
 }
 {
   GNUNET_break (0);
 }
@@ -157,10 +172,8 @@ template_plugin_get (void *cls,
  * @return GNUNET_OK on success
  */
 static int
  * @return GNUNET_OK on success
  */
 static int
-template_plugin_update (void *cls,
-                       uint64_t uid,
-                       int delta, struct GNUNET_TIME_Absolute expire,
-                       char **msg)
+template_plugin_update (void *cls, uint64_t uid, int delta,
+                        struct GNUNET_TIME_Absolute expire, char **msg)
 {
   GNUNET_break (0);
   *msg = GNUNET_strdup ("not implemented");
 {
   GNUNET_break (0);
   *msg = GNUNET_strdup ("not implemented");
@@ -169,109 +182,21 @@ template_plugin_update (void *cls,
 
 
 /**
 
 
 /**
- * Select a subset of the items in the datastore and call
- * the given iterator for each of them.
- *
- * @param cls our "struct Plugin*"
- * @param type entries of which type should be considered?
- *        Use 0 for any type.
- * @param iter function to call on each matching value;
- *        will be called once with a NULL value at the end
- * @param iter_cls closure for iter
- */
-static void
-template_plugin_iter_low_priority (void *cls,
-                                  uint32_t type,
-                                  PluginIterator iter,
-                                  void *iter_cls)
-{
-  GNUNET_break (0);
-}
-
-
-
-/**
- * Select a subset of the items in the datastore and call
- * the given iterator for each of them.
+ * Call the given processor on an item with zero anonymity.
  *
  * @param cls our "struct Plugin*"
  *
  * @param cls our "struct Plugin*"
+ * @param offset offset of the result (modulo num-results);
+ *               specific ordering does not matter for the offset
  * @param type entries of which type should be considered?
  *        Use 0 for any type.
  * @param type entries of which type should be considered?
  *        Use 0 for any type.
- * @param iter function to call on each matching value;
- *        will be called once with a NULL value at the end
- * @param iter_cls closure for iter
+ * @param proc function to call on each matching value;
+ *        will be called  with NULL if no value matches
+ * @param proc_cls closure for proc
  */
 static void
  */
 static void
-template_plugin_iter_zero_anonymity (void *cls,
-                       uint32_t type,
-                       PluginIterator iter,
-                       void *iter_cls)
-{
-  GNUNET_break (0);
-}
-
-
-
-/**
- * Select a subset of the items in the datastore and call
- * the given iterator for each of them.
- *
- * @param cls our "struct Plugin*"
- * @param type entries of which type should be considered?
- *        Use 0 for any type.
- * @param iter function to call on each matching value;
- *        will be called once with a NULL value at the end
- * @param iter_cls closure for iter
- */
-static void
-template_plugin_iter_ascending_expiration (void *cls,
-                       uint32_t type,
-                       PluginIterator iter,
-                       void *iter_cls)
-{
-  GNUNET_break (0);
-}
-
-
-
-/**
- * Select a subset of the items in the datastore and call
- * the given iterator for each of them.
- *
- * @param cls our "struct Plugin*"
- * @param type entries of which type should be considered?
- *        Use 0 for any type.
- * @param iter function to call on each matching value;
- *        will be called once with a NULL value at the end
- * @param iter_cls closure for iter
- */
-static void
-template_plugin_iter_migration_order (void *cls,
-                       uint32_t type,
-                       PluginIterator iter,
-                       void *iter_cls)
-{
-  GNUNET_break (0);
-}
-
-
-
-/**
- * Select a subset of the items in the datastore and call
- * the given iterator for each of them.
- *
- * @param cls our "struct Plugin*"
- * @param type entries of which type should be considered?
- *        Use 0 for any type.
- * @param iter function to call on each matching value;
- *        will be called once with a NULL value at the end
- * @param iter_cls closure for iter
- */
-static void
-template_plugin_iter_all_now (void *cls,
-                       uint32_t type,
-                       PluginIterator iter,
-                       void *iter_cls)
+template_plugin_get_zero_anonymity (void *cls, uint64_t offset,
+                                    enum GNUNET_BLOCK_Type type,
+                                    PluginDatumProcessor proc, void *proc_cls)
 {
   GNUNET_break (0);
 }
 {
   GNUNET_break (0);
 }
@@ -280,7 +205,7 @@ template_plugin_iter_all_now (void *cls,
 /**
  * Drop database.
  */
 /**
  * Drop database.
  */
-static void 
+static void
 template_plugin_drop (void *cls)
 {
   GNUNET_break (0);
 template_plugin_drop (void *cls)
 {
   GNUNET_break (0);
@@ -304,19 +229,16 @@ libgnunet_plugin_datastore_template_init (void *cls)
   plugin->env = env;
   api = GNUNET_malloc (sizeof (struct GNUNET_DATASTORE_PluginFunctions));
   api->cls = plugin;
   plugin->env = env;
   api = GNUNET_malloc (sizeof (struct GNUNET_DATASTORE_PluginFunctions));
   api->cls = plugin;
-  api->get_size = &template_plugin_get_size;
+  api->estimate_size = &template_plugin_estimate_size;
   api->put = &template_plugin_put;
   api->put = &template_plugin_put;
-  api->next_request = &template_plugin_next_request;
-  api->get = &template_plugin_get;
   api->update = &template_plugin_update;
   api->update = &template_plugin_update;
-  api->iter_low_priority = &template_plugin_iter_low_priority;
-  api->iter_zero_anonymity = &template_plugin_iter_zero_anonymity;
-  api->iter_ascending_expiration = &template_plugin_iter_ascending_expiration;
-  api->iter_migration_order = &template_plugin_iter_migration_order;
-  api->iter_all_now = &template_plugin_iter_all_now;
+  api->get_key = &template_plugin_get_key;
+  api->get_replication = &template_plugin_get_replication;
+  api->get_expiration = &template_plugin_get_expiration;
+  api->get_zero_anonymity = &template_plugin_get_zero_anonymity;
   api->drop = &template_plugin_drop;
   api->drop = &template_plugin_drop;
-  GNUNET_log_from (GNUNET_ERROR_TYPE_INFO,
-                   "template", _("Template database running\n"));
+  GNUNET_log_from (GNUNET_ERROR_TYPE_INFO, "template",
+                   _("Template database running\n"));
   return api;
 }
 
   return api;
 }