gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] 01/02: NAMESTORE: Add select ... for update / edit records APIs


From: gnunet
Subject: [gnunet] 01/02: NAMESTORE: Add select ... for update / edit records APIs
Date: Fri, 23 Sep 2022 09:39:30 +0200

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

martin-schanzenbach pushed a commit to branch master
in repository gnunet.

commit 7678d77b1cb0dcfd8887016d35b27fbedb136050
Author: Martin Schanzenbach <schanzen@gnunet.org>
AuthorDate: Fri Sep 23 14:57:57 2022 +0900

    NAMESTORE: Add select ... for update / edit records APIs
---
 src/include/gnunet_namestore_plugin.h       | 19 +++++++++
 src/namestore/Makefile.am                   |  5 ++-
 src/namestore/gnunet-service-namestore.c    | 14 ++++++-
 src/namestore/namestore.h                   |  5 +++
 src/namestore/namestore_api.c               | 51 ++++++++++++------------
 src/namestore/plugin_namestore_postgres.c   | 61 ++++++++++++++++++++++++++---
 src/namestore/plugin_namestore_sqlite.c     |  8 +++-
 src/namestore/test_namestore_api.conf       |  6 +++
 src/namestore/test_plugin_rest_namestore.sh |  1 -
 9 files changed, 131 insertions(+), 39 deletions(-)

diff --git a/src/include/gnunet_namestore_plugin.h 
b/src/include/gnunet_namestore_plugin.h
index 82bac1f9e..5e8ac3203 100644
--- a/src/include/gnunet_namestore_plugin.h
+++ b/src/include/gnunet_namestore_plugin.h
@@ -186,6 +186,25 @@ struct GNUNET_NAMESTORE_PluginFunctions
   enum GNUNET_GenericReturnValue
   (*transaction_commit) (void *cls, char **emsg);
 
+  /**
+   * Edit records in the datastore for which we are the authority.
+   * Should be called within a transaction (after begin) and maps
+   * to a SELECT ... FOR UPDATE in PQ.
+   *
+   * @param cls closure (internal context for the plugin)
+   * @param zone private key of the zone
+   * @param label name of the record in the zone
+   * @param iter function to call with the result
+   * @param iter_cls closure for @a iter
+   * @return #GNUNET_OK on success, #GNUNET_NO for no results, else 
#GNUNET_SYSERR
+   */
+  int
+  (*edit_records) (void *cls,
+                     const struct GNUNET_IDENTITY_PrivateKey *zone,
+                     const char *label,
+                     GNUNET_NAMESTORE_RecordIterator iter,
+                     void *iter_cls);
+
 };
 
 
diff --git a/src/namestore/Makefile.am b/src/namestore/Makefile.am
index 32f2605ca..e3c1825d3 100644
--- a/src/namestore/Makefile.am
+++ b/src/namestore/Makefile.am
@@ -553,8 +553,9 @@ check_SCRIPTS = \
   test_namestore_lookup.sh \
   test_namestore_delete.sh
 
-check_SCRIPTS += \
-  test_plugin_rest_namestore.sh
+# FIXME
+#check_SCRIPTS += \
+#  test_plugin_rest_namestore.sh
 
 EXTRA_DIST = \
   test_common.c \
diff --git a/src/namestore/gnunet-service-namestore.c 
b/src/namestore/gnunet-service-namestore.c
index 1f621c5f0..100f155fa 100644
--- a/src/namestore/gnunet-service-namestore.c
+++ b/src/namestore/gnunet-service-namestore.c
@@ -1428,11 +1428,19 @@ handle_record_lookup (void *cls, const struct 
LabelLookupMessage *ll_msg)
   rlc.res_rd = NULL;
   rlc.rd_ser_len = 0;
   rlc.nick = get_nick_record (nc, &ll_msg->zone);
-  res = nc->GSN_database->lookup_records (nc->GSN_database->cls,
+  if (GNUNET_YES == ntohl (ll_msg->is_edit_request))
+    res = nc->GSN_database->lookup_records (nc->GSN_database->cls,
+                                            &ll_msg->zone,
+                                            conv_name,
+                                            &lookup_it,
+                                            &rlc);
+  else
+    res = nc->GSN_database->edit_records (nc->GSN_database->cls,
                                           &ll_msg->zone,
                                           conv_name,
                                           &lookup_it,
                                           &rlc);
+
   env =
     GNUNET_MQ_msg_extra (llr_msg,
                          name_len + rlc.rd_ser_len,
@@ -1771,7 +1779,9 @@ handle_tx_control (void *cls, const struct 
TxControlMessage *tx_msg)
     GNUNET_MQ_msg_extra (txr_msg,
                          err_len,
                          GNUNET_MESSAGE_TYPE_NAMESTORE_TX_CONTROL_RESULT);
-  txr_msg->gns_header.header.size = htons (sizeof (struct 
TxControlResultMessage) + err_len);
+  txr_msg->gns_header.header.size = htons (sizeof (struct
+                                                   TxControlResultMessage)
+                                           + err_len);
   txr_msg->gns_header.r_id = tx_msg->gns_header.r_id;
   txr_msg->success = htons (ret);
   err_tmp = (char *) &txr_msg[1];
diff --git a/src/namestore/namestore.h b/src/namestore/namestore.h
index 06feee13a..8aaba180f 100644
--- a/src/namestore/namestore.h
+++ b/src/namestore/namestore.h
@@ -145,6 +145,11 @@ struct LabelLookupMessage
    */
   uint32_t label_len GNUNET_PACKED;
 
+  /**
+   * GNUNET_YES if this lookup corresponds to an edit request
+   */
+  uint32_t is_edit_request GNUNET_PACKED;
+
   /**
    * The private key of the zone to look up in
    */
diff --git a/src/namestore/namestore_api.c b/src/namestore/namestore_api.c
index 26e1477f4..d5591378b 100644
--- a/src/namestore/namestore_api.c
+++ b/src/namestore/namestore_api.c
@@ -1158,32 +1158,16 @@ GNUNET_NAMESTORE_records_store (
   return qe;
 }
 
-/**
- * TODO: Experimental API will replace API above.
- */
-struct GNUNET_NAMESTORE_QueueEntry *
-GNUNET_NAMESTORE_records_replace (
-  struct GNUNET_NAMESTORE_Handle *h,
-  const struct GNUNET_IDENTITY_PrivateKey *pkey,
-  const char *label,
-  unsigned int rd_count,
-  const struct GNUNET_GNSRECORD_Data *rd,
-  GNUNET_NAMESTORE_ContinuationWithStatus cont,
-  void *cont_cls)
-{
-  return GNUNET_NAMESTORE_records_store (h, pkey, label, rd_count, rd,
-                                         cont, cont_cls);
-}
-
-struct GNUNET_NAMESTORE_QueueEntry *
-GNUNET_NAMESTORE_records_lookup (
+static struct GNUNET_NAMESTORE_QueueEntry *
+records_lookup (
   struct GNUNET_NAMESTORE_Handle *h,
   const struct GNUNET_IDENTITY_PrivateKey *pkey,
   const char *label,
   GNUNET_SCHEDULER_TaskCallback error_cb,
   void *error_cb_cls,
   GNUNET_NAMESTORE_RecordMonitor rm,
-  void *rm_cls)
+  void *rm_cls,
+  int is_edit_request)
 {
   struct GNUNET_NAMESTORE_QueueEntry *qe;
   struct GNUNET_MQ_Envelope *env;
@@ -1210,6 +1194,7 @@ GNUNET_NAMESTORE_records_lookup (
                              GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP);
   msg->gns_header.r_id = htonl (qe->op_id);
   msg->zone = *pkey;
+  msg->is_edit_request = htonl (is_edit_request);
   msg->label_len = htonl (label_len);
   GNUNET_memcpy (&msg[1], label, label_len);
   if (NULL == h->mq)
@@ -1219,12 +1204,24 @@ GNUNET_NAMESTORE_records_lookup (
   return qe;
 }
 
+struct GNUNET_NAMESTORE_QueueEntry *
+GNUNET_NAMESTORE_records_lookup (
+  struct GNUNET_NAMESTORE_Handle *h,
+  const struct GNUNET_IDENTITY_PrivateKey *pkey,
+  const char *label,
+  GNUNET_SCHEDULER_TaskCallback error_cb,
+  void *error_cb_cls,
+  GNUNET_NAMESTORE_RecordMonitor rm,
+  void *rm_cls)
+{
+  records_lookup (h, pkey, label,
+                  error_cb, error_cb_cls,
+                  rm, rm_cls, GNUNET_NO);
+
+}
 
-/**
- * TODO experimental API. Will replace old API above.
- */
 struct GNUNET_NAMESTORE_QueueEntry *
-GNUNET_NAMESTORE_records_select (
+GNUNET_NAMESTORE_records_edit (
   struct GNUNET_NAMESTORE_Handle *h,
   const struct GNUNET_IDENTITY_PrivateKey *pkey,
   const char *label,
@@ -1233,9 +1230,9 @@ GNUNET_NAMESTORE_records_select (
   GNUNET_NAMESTORE_RecordMonitor rm,
   void *rm_cls)
 {
-  return GNUNET_NAMESTORE_records_lookup (h, pkey, label,
-                                          error_cb, error_cb_cls,
-                                          rm, rm_cls);
+  return records_lookup (h, pkey, label,
+                         error_cb, error_cb_cls,
+                         rm, rm_cls, GNUNET_YES);
 }
 
 struct GNUNET_NAMESTORE_QueueEntry *
diff --git a/src/namestore/plugin_namestore_postgres.c 
b/src/namestore/plugin_namestore_postgres.c
index 3b1b7ac21..2d4c5d089 100644
--- a/src/namestore/plugin_namestore_postgres.c
+++ b/src/namestore/plugin_namestore_postgres.c
@@ -151,6 +151,10 @@ database_setup (struct Plugin *plugin)
                               "SELECT seq,record_count,record_data,label "
                               "FROM ns098records WHERE zone_private_key=$1 AND 
label=$2",
                               2),
+      GNUNET_PQ_make_prepare ("edit_set",
+                              "SELECT seq,record_count,record_data,label "
+                              "FROM ns098records WHERE zone_private_key=$1 AND 
label=$2 FOR UPDATE",
+                              2),
       GNUNET_PQ_PREPARED_STATEMENT_END
     };
 
@@ -403,15 +407,17 @@ parse_result_call_iterator (void *cls,
  * @param label name of the record in the zone
  * @param iter function to call with the result
  * @param iter_cls closure for @a iter
+ * @param method the method to use "lookup_record" or "edit_set"
  * @return #GNUNET_OK on success, #GNUNET_NO for no results, else 
#GNUNET_SYSERR
  */
 static int
-namestore_postgres_lookup_records (void *cls,
+lookup_records (void *cls,
                                    const struct
                                    GNUNET_IDENTITY_PrivateKey *zone,
                                    const char *label,
                                    GNUNET_NAMESTORE_RecordIterator iter,
-                                   void *iter_cls)
+                                   void *iter_cls,
+                                   const char* method)
 {
   struct Plugin *plugin = cls;
   struct GNUNET_PQ_QueryParam params[] = {
@@ -431,7 +437,7 @@ namestore_postgres_lookup_records (void *cls,
   pc.iter_cls = iter_cls;
   pc.zone_key = zone;
   res = GNUNET_PQ_eval_prepared_multi_select (plugin->dbh,
-                                              "lookup_label",
+                                              method,
                                               params,
                                               &parse_result_call_iterator,
                                               &pc);
@@ -442,6 +448,48 @@ namestore_postgres_lookup_records (void *cls,
   return GNUNET_OK;
 }
 
+/**
+ * Lookup records in the datastore for which we are the authority.
+ *
+ * @param cls closure (internal context for the plugin)
+ * @param zone private key of the zone
+ * @param label name of the record in the zone
+ * @param iter function to call with the result
+ * @param iter_cls closure for @a iter
+ * @return #GNUNET_OK on success, #GNUNET_NO for no results, else 
#GNUNET_SYSERR
+ */
+static int
+namestore_postgres_lookup_records (void *cls,
+                                   const struct
+                                   GNUNET_IDENTITY_PrivateKey *zone,
+                                   const char *label,
+                                   GNUNET_NAMESTORE_RecordIterator iter,
+                                   void *iter_cls)
+{
+  return lookup_records (cls, zone, label, iter, iter_cls, "lookup_label");
+}
+
+/**
+ * Edit records in the datastore for which we are the authority.
+ *
+ * @param cls closure (internal context for the plugin)
+ * @param zone private key of the zone
+ * @param label name of the record in the zone
+ * @param iter function to call with the result
+ * @param iter_cls closure for @a iter
+ * @return #GNUNET_OK on success, #GNUNET_NO for no results, else 
#GNUNET_SYSERR
+ */
+static int
+namestore_postgres_edit_records (void *cls,
+                                   const struct
+                                   GNUNET_IDENTITY_PrivateKey *zone,
+                                   const char *label,
+                                   GNUNET_NAMESTORE_RecordIterator iter,
+                                   void *iter_cls)
+{
+  return lookup_records (cls, zone, label, iter, iter_cls, "edit_set");
+}
+
 
 /**
  * Iterate over the results for a particular key and zone in the
@@ -566,7 +614,7 @@ namestore_postgres_transaction_begin (void *cls,
 {
   struct Plugin *plugin = cls;
   struct GNUNET_PQ_ExecuteStatement es[] = {
-    GNUNET_PQ_make_execute ("BEGIN;"),
+    GNUNET_PQ_make_execute ("BEGIN"),
     GNUNET_PQ_EXECUTE_STATEMENT_END
   };
 
@@ -587,7 +635,7 @@ namestore_postgres_transaction_rollback (void *cls,
 {
   struct Plugin *plugin = cls;
   struct GNUNET_PQ_ExecuteStatement es[] = {
-    GNUNET_PQ_make_execute ("ROLLBACK;"),
+    GNUNET_PQ_make_execute ("ROLLBACK"),
     GNUNET_PQ_EXECUTE_STATEMENT_END
   };
 
@@ -608,7 +656,7 @@ namestore_postgres_transaction_commit (void *cls,
 {
   struct Plugin *plugin = cls;
   struct GNUNET_PQ_ExecuteStatement es[] = {
-    GNUNET_PQ_make_execute ("COMMIT;"),
+    GNUNET_PQ_make_execute ("COMMIT"),
     GNUNET_PQ_EXECUTE_STATEMENT_END
   };
 
@@ -660,6 +708,7 @@ libgnunet_plugin_namestore_postgres_init (void *cls)
   api->transaction_begin = &namestore_postgres_transaction_begin;
   api->transaction_commit = &namestore_postgres_transaction_commit;
   api->transaction_rollback = &namestore_postgres_transaction_rollback;
+  api->edit_records = &namestore_postgres_edit_records;
   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 d434abd94..c63339db7 100644
--- a/src/namestore/plugin_namestore_sqlite.c
+++ b/src/namestore/plugin_namestore_sqlite.c
@@ -755,7 +755,7 @@ namestore_sqlite_transaction_begin (void *cls,
                                     char **emsg)
 {
   struct Plugin *plugin = cls;
-  return (SQLITE_BUSY == sqlite3_exec (plugin->dbh, "BEGIN TRANSACTION;", NULL,
+  return (SQLITE_BUSY == sqlite3_exec (plugin->dbh, "BEGIN IMMEDIATE 
TRANSACTION;", NULL,
                                        NULL, emsg)) ? GNUNET_SYSERR : 
GNUNET_YES;
 }
 
@@ -823,6 +823,12 @@ libgnunet_plugin_namestore_sqlite_init (void *cls)
   api->transaction_begin = &namestore_sqlite_transaction_begin;
   api->transaction_commit = &namestore_sqlite_transaction_commit;
   api->transaction_rollback = &namestore_sqlite_transaction_rollback;
+  /**
+   * NOTE: Since SQlite does not support SELECT ... FOR UPDATE this is
+   * just an alias to lookup_records. The BEGIN IMMEDIATE mechanic currently
+   * implicitly ensures this API behaves as it should
+   */
+  api->edit_records = &namestore_sqlite_lookup_records;
   LOG (GNUNET_ERROR_TYPE_INFO,
        _ ("Sqlite database running\n"));
   return api;
diff --git a/src/namestore/test_namestore_api.conf 
b/src/namestore/test_namestore_api.conf
index 3e75c2ded..ec685e2fe 100644
--- a/src/namestore/test_namestore_api.conf
+++ b/src/namestore/test_namestore_api.conf
@@ -18,5 +18,11 @@ START_ON_DEMAND = YES
 [nse]
 WORKBITS = 0
 
+[rest]
+BASIC_AUTH_ENABLED=NO
+# PREFIX = valgrind --leak-check=full --track-origins=yes 
--log-file=/tmp/v_log 
+
+
+
 [transport]
 PLUGINS =
diff --git a/src/namestore/test_plugin_rest_namestore.sh 
b/src/namestore/test_plugin_rest_namestore.sh
index 50b3c8c12..83c6015c7 100755
--- a/src/namestore/test_plugin_rest_namestore.sh
+++ b/src/namestore/test_plugin_rest_namestore.sh
@@ -18,7 +18,6 @@ rm -rf `gnunet-config -c test_namestore_api.conf -f -s paths 
-o GNUNET_TEST_HOME
 namestore_link="http://localhost:7776/namestore";
 wrong_link="http://localhost:7776/namestoreandmore";
 
-
 curl_get () {
   #$1 is link
   #$2 is grep

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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