gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] 02/02: DB load API change


From: gnunet
Subject: [gnunet] 02/02: DB load API change
Date: Fri, 17 Jan 2020 02:29:52 +0100

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

grothoff pushed a commit to branch master
in repository gnunet.

commit 4353432b97bdc03ce31f11dfd1ff3e30cf0106af
Author: Christian Grothoff <address@hidden>
AuthorDate: Fri Jan 17 02:26:21 2020 +0100

    DB load API change
---
 src/include/gnunet_disk_lib.h |  1 -
 src/include/gnunet_os_lib.h   |  2 +-
 src/include/gnunet_pq_lib.h   | 22 +++++++----
 src/pq/pq.h                   |  5 +++
 src/pq/pq_connect.c           | 92 ++++++++++++++++++++++++++++++++++++++-----
 src/util/os_priority.c        |  2 +-
 6 files changed, 104 insertions(+), 20 deletions(-)

diff --git a/src/include/gnunet_disk_lib.h b/src/include/gnunet_disk_lib.h
index 9376a1059..b79be5f70 100644
--- a/src/include/gnunet_disk_lib.h
+++ b/src/include/gnunet_disk_lib.h
@@ -413,7 +413,6 @@ GNUNET_DISK_pipe (int blocking_read,
  * @param blocking_read creates an asynchronous pipe for reading if set to 
#GNUNET_NO
  * @param blocking_write creates an asynchronous pipe for writing if set to 
#GNUNET_NO
  * @param fd an array of two fd values. One of them may be -1 for read-only or 
write-only pipes
- *
  * @return handle to the new pipe, NULL on error
  */
 struct GNUNET_DISK_PipeHandle *
diff --git a/src/include/gnunet_os_lib.h b/src/include/gnunet_os_lib.h
index 50e9a4c92..a6188c1ca 100644
--- a/src/include/gnunet_os_lib.h
+++ b/src/include/gnunet_os_lib.h
@@ -597,7 +597,7 @@ GNUNET_OS_command_run (GNUNET_OS_LineProcessor proc,
 
 
 /**
- * Retrieve the status of a process, waiting on it if dead.
+ * Retrieve the status of a process.
  * Nonblocking version.
  *
  * @param proc pointer to process structure
diff --git a/src/include/gnunet_pq_lib.h b/src/include/gnunet_pq_lib.h
index 2aea77b7f..8b32a9265 100644
--- a/src/include/gnunet_pq_lib.h
+++ b/src/include/gnunet_pq_lib.h
@@ -708,15 +708,22 @@ GNUNET_PQ_exec_statements (struct GNUNET_PQ_Context *db,
 
 
 /**
- * Create a connection to the Postgres database using @a config_str
- * for the configuration.  Initialize logging via GNUnet's log
- * routines and disable Postgres's logger.  Also ensures that the
- * statements in @a es are executed whenever we (re)connect to the
- * database, and that the prepared statements in @a ps are "ready".
- * If statements in @es fail that were created with
- * #GNUNET_PQ_make_execute(), then the entire operation fails.
+ * Create a connection to the Postgres database using @a config_str for the
+ * configuration.  Initialize logging via GNUnet's log routines and disable
+ * Postgres's logger.  Also ensures that the statements in @a load_path and @a
+ * es are executed whenever we (re)connect to the database, and that the
+ * prepared statements in @a ps are "ready".  If statements in @es fail that
+ * were created with #GNUNET_PQ_make_execute(), then the entire operation
+ * fails.
+ *
+ * In @a load_path, a list of "$XXXX.sql" files is expected where $XXXX
+ * must be a sequence of contiguous integer values starting at 0000.
+ * These files are then loaded in sequence using "psql $config_str" before
+ * running statements from @e es.  The directory is inspected again on
+ * reconnect.
  *
  * @param config_str configuration to use
+ * @param load_path path to directory with SQL transactions to run, can be NULL
  * @param es #GNUNET_PQ_PREPARED_STATEMENT_END-terminated
  *            array of statements to execute upon EACH connection, can be NULL
  * @param ps array of prepared statements to prepare, can be NULL
@@ -724,6 +731,7 @@ GNUNET_PQ_exec_statements (struct GNUNET_PQ_Context *db,
  */
 struct GNUNET_PQ_Context *
 GNUNET_PQ_connect (const char *config_str,
+                   const char *load_path,
                    const struct GNUNET_PQ_ExecuteStatement *es,
                    const struct GNUNET_PQ_PreparedStatement *ps);
 
diff --git a/src/pq/pq.h b/src/pq/pq.h
index b30f4f0d4..91a890bcb 100644
--- a/src/pq/pq.h
+++ b/src/pq/pq.h
@@ -52,6 +52,11 @@ struct GNUNET_PQ_Context
    * Configuration to use to connect to the DB.
    */
   char *config_str;
+
+  /**
+   * Path to load SQL files from.
+   */
+  char *load_path;
 };
 
 #endif
diff --git a/src/pq/pq_connect.c b/src/pq/pq_connect.c
index 7d9a524b3..5ade12a3e 100644
--- a/src/pq/pq_connect.c
+++ b/src/pq/pq_connect.c
@@ -64,19 +64,22 @@ pq_notice_processor_cb (void *arg,
 
 
 /**
- * Create a connection to the Postgres database using @a config_str
- * for the configuration.  Initialize logging via GNUnet's log
- * routines and disable Postgres's logger.  Also ensures that the
- * statements in @a es are executed whenever we (re)connect to the
- * database, and that the prepared statements in @a ps are "ready".
- * If statements in @es fail that were created with
- * #GNUNET_PQ_make_execute(), then the entire operation fails.
+ * Create a connection to the Postgres database using @a config_str for the
+ * configuration.  Initialize logging via GNUnet's log routines and disable
+ * Postgres's logger.  Also ensures that the statements in @a load_path and @a
+ * es are executed whenever we (re)connect to the database, and that the
+ * prepared statements in @a ps are "ready".  If statements in @es fail that
+ * were created with #GNUNET_PQ_make_execute(), then the entire operation
+ * fails.
  *
- * The caller MUST ensure that @a es and @a ps remain allocated and
- * initialized in memory until #GNUNET_PQ_disconnect() is called,
- * as they may be needed repeatedly and no copy will be made.
+ * In @a load_path, a list of "$XXXX.sql" files is expected where $XXXX
+ * must be a sequence of contiguous integer values starting at 0000.
+ * These files are then loaded in sequence using "psql $config_str" before
+ * running statements from @e es.  The directory is inspected again on
+ * reconnect.
  *
  * @param config_str configuration to use
+ * @param load_path path to directory with SQL transactions to run, can be NULL
  * @param es #GNUNET_PQ_PREPARED_STATEMENT_END-terminated
  *            array of statements to execute upon EACH connection, can be NULL
  * @param ps array of prepared statements to prepare, can be NULL
@@ -84,6 +87,7 @@ pq_notice_processor_cb (void *arg,
  */
 struct GNUNET_PQ_Context *
 GNUNET_PQ_connect (const char *config_str,
+                   const char *load_path,
                    const struct GNUNET_PQ_ExecuteStatement *es,
                    const struct GNUNET_PQ_PreparedStatement *ps)
 {
@@ -100,6 +104,8 @@ GNUNET_PQ_connect (const char *config_str,
 
   db = GNUNET_new (struct GNUNET_PQ_Context);
   db->config_str = GNUNET_strdup (config_str);
+  if (NULL != load_path)
+    db->load_path = GNUNET_strdup (load_path);
   if (0 != elen)
   {
     db->es = GNUNET_new_array (elen + 1,
@@ -175,6 +181,62 @@ GNUNET_PQ_reconnect (struct GNUNET_PQ_Context *db)
   PQsetNoticeProcessor (db->conn,
                         &pq_notice_processor_cb,
                         db);
+  if (NULL != db->load_path)
+  {
+    size_t slen = strlen (db->load_path) + 10;
+
+    for (unsigned int i = 0; i<10000; i++)
+    {
+      char buf[slen];
+      struct GNUNET_OS_Process *psql;
+      enum GNUNET_OS_ProcessStatusType type;
+      unsigned long code;
+
+      GNUNET_snprintf (buf,
+                       sizeof (buf),
+                       "%s/%u.sql",
+                       db->load_path,
+                       i);
+      if (GNUNET_YES !=
+          GNUNET_DISK_file_test (buf))
+        break; /* We are done */
+      psql = GNUNET_OS_start_process (GNUNET_NO,
+                                      GNUNET_OS_INHERIT_STD_ERR,
+                                      NULL,
+                                      NULL,
+                                      NULL,
+                                      "psql",
+                                      db->config_str,
+                                      "-f",
+                                      buf,
+                                      "-q",
+                                      NULL);
+      if (NULL == psql)
+      {
+        GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
+                                  "exec",
+                                  "psql");
+        PQfinish (db->conn);
+        db->conn = NULL;
+        return;
+      }
+      GNUNET_assert (GNUNET_OK ==
+                     GNUNET_OS_process_wait_status (psql,
+                                                    &type,
+                                                    &code));
+      GNUNET_OS_process_destroy (psql);
+      if ( (GNUNET_OS_PROCESS_EXITED != type) ||
+           (0 != code) )
+      {
+        GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
+                                  "psql",
+                                  buf);
+        PQfinish (db->conn);
+        db->conn = NULL;
+        return;
+      }
+    }
+  }
   if ( (NULL != db->es) &&
        (GNUNET_OK !=
         GNUNET_PQ_exec_statements (db,
@@ -221,6 +283,7 @@ GNUNET_PQ_connect_with_cfg (const struct 
GNUNET_CONFIGURATION_Handle *cfg,
 {
   struct GNUNET_PQ_Context *db;
   char *conninfo;
+  char *load_path;
 
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_string (cfg,
@@ -228,9 +291,17 @@ GNUNET_PQ_connect_with_cfg (const struct 
GNUNET_CONFIGURATION_Handle *cfg,
                                              "CONFIG",
                                              &conninfo))
     conninfo = NULL;
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_string (cfg,
+                                             section,
+                                             "SQL_PATH",
+                                             &load_path))
+    load_path = NULL;
   db = GNUNET_PQ_connect (conninfo == NULL ? "" : conninfo,
+                          load_path,
                           es,
                           ps);
+  GNUNET_free_non_null (load_path);
   GNUNET_free_non_null (conninfo);
   return db;
 }
@@ -247,6 +318,7 @@ GNUNET_PQ_disconnect (struct GNUNET_PQ_Context *db)
 {
   GNUNET_free_non_null (db->es);
   GNUNET_free_non_null (db->ps);
+  GNUNET_free_non_null (db->load_path);
   PQfinish (db->conn);
   GNUNET_free (db);
 }
diff --git a/src/util/os_priority.c b/src/util/os_priority.c
index d93e0d44f..722aac872 100644
--- a/src/util/os_priority.c
+++ b/src/util/os_priority.c
@@ -951,7 +951,7 @@ process_status (struct GNUNET_OS_Process *proc,
 
 
 /**
- * Retrieve the status of a process, waiting on it if dead.
+ * Retrieve the status of a process.
  * Nonblocking version.
  *
  * @param proc process ID

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



reply via email to

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