gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [gnunet] 02/02: add transactions to namestore plugin API


From: gnunet
Subject: [GNUnet-SVN] [gnunet] 02/02: add transactions to namestore plugin API
Date: Sun, 15 Apr 2018 20:45:56 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository gnunet.

commit 47a9a3c95de2dfadc431d34c1dc079d35d3d6d18
Author: Christian Grothoff <address@hidden>
AuthorDate: Sun Apr 15 20:45:44 2018 +0200

    add transactions to namestore plugin API
---
 src/include/gnunet_namestore_plugin.h     | 31 ++++++++++-
 src/namestore/plugin_namestore_flat.c     | 93 ++++++++++++++++++++++---------
 src/namestore/plugin_namestore_postgres.c | 79 +++++++++++++++++++++++++-
 src/namestore/plugin_namestore_sqlite.c   | 44 +++++++++++++++
 src/pq/pq_exec.c                          |  1 -
 5 files changed, 220 insertions(+), 28 deletions(-)

diff --git a/src/include/gnunet_namestore_plugin.h 
b/src/include/gnunet_namestore_plugin.h
index 11f16b97a..d1c68cd23 100644
--- a/src/include/gnunet_namestore_plugin.h
+++ b/src/include/gnunet_namestore_plugin.h
@@ -88,7 +88,7 @@ struct GNUNET_NAMESTORE_PluginFunctions
                    const char *label,
                    unsigned int rd_count,
                    const struct GNUNET_GNSRECORD_Data *rd);
-  
+
   /**
    * Lookup records in the datastore for which we are the authority.
    *
@@ -145,6 +145,35 @@ struct GNUNET_NAMESTORE_PluginFunctions
                   void *iter_cls);
 
 
+  /**
+   * Start a transaction.
+   *
+   * @param cls closure
+   * @return #GNUNET_OK on success, #GNUNET_NO if transactions are not 
supported,
+   *         #GNUNET_SYSERR on internal errors
+   */
+  int
+  (*begin_transaction) (void *cls);
+
+
+  /**
+   * Try to commit a transaction.
+   *
+   * @param cls closure
+   * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
+   */
+  int
+  (*commit_transaction) (void *cls);
+
+
+  /**
+   * Rollback a transaction.
+   *
+   * @param cls closure
+   */
+  void
+  (*rollback_transaction) (void *cls);
+
 };
 
 
diff --git a/src/namestore/plugin_namestore_flat.c 
b/src/namestore/plugin_namestore_flat.c
index 024fc34f2..170adb49e 100644
--- a/src/namestore/plugin_namestore_flat.c
+++ b/src/namestore/plugin_namestore_flat.c
@@ -383,7 +383,7 @@ static void
 database_shutdown (struct Plugin *plugin)
 {
   struct GNUNET_DISK_FileHandle *fh;
-  
+
   fh = GNUNET_DISK_file_open (plugin->fn,
                               GNUNET_DISK_OPEN_CREATE |
                               GNUNET_DISK_OPEN_TRUNCATE |
@@ -418,11 +418,11 @@ database_shutdown (struct Plugin *plugin)
  * @return #GNUNET_OK on success, else #GNUNET_SYSERR
  */
 static int
-namestore_store_records (void *cls,
-                         const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
-                         const char *label,
-                         unsigned int rd_count,
-                         const struct GNUNET_GNSRECORD_Data *rd)
+namestore_flat_store_records (void *cls,
+                              const struct GNUNET_CRYPTO_EcdsaPrivateKey 
*zone_key,
+                              const char *label,
+                              unsigned int rd_count,
+                              const struct GNUNET_GNSRECORD_Data *rd)
 {
   struct Plugin *plugin = cls;
   uint64_t rvalue;
@@ -488,11 +488,11 @@ namestore_store_records (void *cls,
  * @return #GNUNET_OK on success, else #GNUNET_SYSERR
  */
 static int
-namestore_lookup_records (void *cls,
-                          const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
-                          const char *label,
-                          GNUNET_NAMESTORE_RecordIterator iter,
-                          void *iter_cls)
+namestore_flat_lookup_records (void *cls,
+                               const struct GNUNET_CRYPTO_EcdsaPrivateKey 
*zone,
+                               const char *label,
+                               GNUNET_NAMESTORE_RecordIterator iter,
+                               void *iter_cls)
 {
   struct Plugin *plugin = cls;
   struct FlatFileEntry *entry;
@@ -571,11 +571,11 @@ iterate_zones (void *cls,
  * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, 
#GNUNET_SYSERR on error
  */
 static int
-namestore_iterate_records (void *cls,
-                           const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
-                           uint64_t offset,
-                           GNUNET_NAMESTORE_RecordIterator iter,
-                          void *iter_cls)
+namestore_flat_iterate_records (void *cls,
+                                const struct GNUNET_CRYPTO_EcdsaPrivateKey 
*zone,
+                                uint64_t offset,
+                                GNUNET_NAMESTORE_RecordIterator iter,
+                                void *iter_cls)
 {
   struct Plugin *plugin = cls;
 
@@ -641,11 +641,11 @@ zone_to_name (void *cls,
  * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, 
#GNUNET_SYSERR on error
  */
 static int
-namestore_zone_to_name (void *cls,
-                        const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
-                        const struct GNUNET_CRYPTO_EcdsaPublicKey *value_zone,
-                        GNUNET_NAMESTORE_RecordIterator iter,
-                       void *iter_cls)
+namestore_flat_zone_to_name (void *cls,
+                             const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+                             const struct GNUNET_CRYPTO_EcdsaPublicKey 
*value_zone,
+                             GNUNET_NAMESTORE_RecordIterator iter,
+                             void *iter_cls)
 {
   struct Plugin *plugin = cls;
 
@@ -667,6 +667,46 @@ namestore_zone_to_name (void *cls,
 
 
 /**
+ * Start a transaction.
+ *
+ * @param cls closure
+ * @return #GNUNET_OK on success, #GNUNET_NO if transactions are not supported,
+ *         #GNUNET_SYSERR on internal errors
+ */
+static int
+namestore_flat_begin_transaction (void *cls)
+{
+  return GNUNET_NO;
+}
+
+
+/**
+ * Try to commit a transaction.
+ *
+ * @param cls closure
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
+ */
+static int
+namestore_flat_commit_transaction (void *cls)
+{
+  GNUNET_break (0);
+  return GNUNET_SYSERR;
+}
+
+
+/**
+ * Rollback a transaction.
+ *
+ * @param cls closure
+ */
+static void
+namestore_flat_rollback_transaction (void *cls)
+{
+  GNUNET_break (0);
+}
+
+
+/**
  * Entry point for the plugin.
  *
  * @param cls the "struct GNUNET_NAMESTORE_PluginEnvironment*"
@@ -692,10 +732,13 @@ libgnunet_plugin_namestore_flat_init (void *cls)
   }
   api = GNUNET_new (struct GNUNET_NAMESTORE_PluginFunctions);
   api->cls = &plugin;
-  api->store_records = &namestore_store_records;
-  api->iterate_records = &namestore_iterate_records;
-  api->zone_to_name = &namestore_zone_to_name;
-  api->lookup_records = &namestore_lookup_records;
+  api->store_records = &namestore_flat_store_records;
+  api->iterate_records = &namestore_flat_iterate_records;
+  api->zone_to_name = &namestore_flat_zone_to_name;
+  api->lookup_records = &namestore_flat_lookup_records;
+  api->begin_transaction = &namestore_flat_begin_transaction;
+  api->commit_transaction = &namestore_flat_commit_transaction;
+  api->rollback_transaction = &namestore_flat_rollback_transaction;
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               _("flat file database running\n"));
   return api;
diff --git a/src/namestore/plugin_namestore_postgres.c 
b/src/namestore/plugin_namestore_postgres.c
index 4828cb190..378a88f51 100644
--- a/src/namestore/plugin_namestore_postgres.c
+++ b/src/namestore/plugin_namestore_postgres.c
@@ -243,7 +243,7 @@ namestore_postgres_store_records (void *cls,
                                              data_size,
                                              data);
     if ( (ret < 0) ||
-        (data_size != (size_t) ret) )        
+        (data_size != (size_t) ret) )
     {
       GNUNET_break (0);
       return GNUNET_SYSERR;
@@ -518,6 +518,80 @@ database_shutdown (struct Plugin *plugin)
 
 
 /**
+ * Start a transaction.
+ *
+ * @param cls closure
+ * @return #GNUNET_OK on success, #GNUNET_NO if transactions are not supported,
+ *         #GNUNET_SYSERR on internal errors
+ */
+static int
+namestore_postgres_begin_transaction (void *cls)
+{
+  struct Plugin *plugin = cls;
+  PGresult *result;
+  ExecStatusType ex;
+
+  result = PQexec (plugin->dbh,
+                   "START TRANSACTION ISOLATION LEVEL SERIALIZABLE");
+  if (PGRES_COMMAND_OK !=
+      (ex = PQresultStatus (result)))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Failed to start transaction (%s): %s\n",
+                PQresStatus (ex),
+                PQerrorMessage (plugin->dbh));
+    GNUNET_break (0);
+    PQclear (result);
+    return GNUNET_SYSERR;
+  }
+  PQclear (result);
+  return GNUNET_OK;
+}
+
+
+/**
+ * Try to commit a transaction.
+ *
+ * @param cls closure
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
+ */
+static int
+namestore_postgres_commit_transaction (void *cls)
+{
+  struct Plugin *plugin = cls;
+  PGresult *result;
+  ExecStatusType status;
+  int ret;
+
+  result = PQexec (plugin->dbh,
+                   "COMMIT");
+  status = PQresultStatus (result);
+  ret = (PGRES_COMMAND_OK == status) ? GNUNET_OK : GNUNET_SYSERR;
+  PQclear (result);
+  return ret;
+}
+
+
+/**
+ * Rollback a transaction.
+ *
+ * @param cls closure
+ */
+static void
+namestore_postgres_rollback_transaction (void *cls)
+{
+  struct Plugin *plugin = cls;
+  PGresult *result;
+
+  result = PQexec (plugin->dbh,
+                   "ROLLBACK");
+  GNUNET_break (PGRES_COMMAND_OK ==
+                PQresultStatus (result));
+  PQclear (result);
+}
+
+
+/**
  * Entry point for the plugin.
  *
  * @param cls the `struct GNUNET_NAMESTORE_PluginEnvironment*`
@@ -545,6 +619,9 @@ libgnunet_plugin_namestore_postgres_init (void *cls)
   api->iterate_records = &namestore_postgres_iterate_records;
   api->zone_to_name = &namestore_postgres_zone_to_name;
   api->lookup_records = &namestore_postgres_lookup_records;
+  api->begin_transaction = &namestore_postgres_begin_transaction;
+  api->commit_transaction = &namestore_postgres_commit_transaction;
+  api->rollback_transaction = &namestore_postgres_rollback_transaction;
   LOG (GNUNET_ERROR_TYPE_INFO,
        "Postgres namestore plugin running\n");
   return api;
diff --git a/src/namestore/plugin_namestore_sqlite.c 
b/src/namestore/plugin_namestore_sqlite.c
index 5ad84688c..1ebb6bfc7 100644
--- a/src/namestore/plugin_namestore_sqlite.c
+++ b/src/namestore/plugin_namestore_sqlite.c
@@ -773,6 +773,47 @@ namestore_sqlite_zone_to_name (void *cls,
 
 
 /**
+ * Start a transaction.
+ *
+ * @param cls closure
+ * @return #GNUNET_OK on success, #GNUNET_NO if transactions are not supported,
+ *         #GNUNET_SYSERR on internal errors
+ */
+static int
+namestore_sqlite_begin_transaction (void *cls)
+{
+  return GNUNET_NO;
+}
+
+
+/**
+ * Try to commit a transaction.
+ *
+ * @param cls closure
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
+ */
+static int
+namestore_sqlite_commit_transaction (void *cls)
+{
+  GNUNET_break (0);
+  return GNUNET_SYSERR;
+}
+
+
+/**
+ * Rollback a transaction.
+ *
+ * @param cls closure
+ */
+static void
+namestore_sqlite_rollback_transaction (void *cls)
+{
+  GNUNET_break (0);
+}
+
+
+
+/**
  * Entry point for the plugin.
  *
  * @param cls the "struct GNUNET_NAMESTORE_PluginEnvironment*"
@@ -800,6 +841,9 @@ libgnunet_plugin_namestore_sqlite_init (void *cls)
   api->iterate_records = &namestore_sqlite_iterate_records;
   api->zone_to_name = &namestore_sqlite_zone_to_name;
   api->lookup_records = &namestore_sqlite_lookup_records;
+  api->begin_transaction = &namestore_sqlite_begin_transaction;
+  api->commit_transaction = &namestore_sqlite_commit_transaction;
+  api->rollback_transaction = &namestore_sqlite_rollback_transaction;
   LOG (GNUNET_ERROR_TYPE_INFO,
        _("Sqlite database running\n"));
   return api;
diff --git a/src/pq/pq_exec.c b/src/pq/pq_exec.c
index 1e5e4eb76..eacc1f2b3 100644
--- a/src/pq/pq_exec.c
+++ b/src/pq/pq_exec.c
@@ -79,7 +79,6 @@ GNUNET_PQ_exec_statements (PGconn *connection,
 
     result = PQexec (connection,
                      es[i].sql);
-
     if ( (GNUNET_NO == es[i].ignore_errors) &&
          (PGRES_COMMAND_OK != PQresultStatus (result)) )
     {

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]