emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] externals/pq ae8f1a33ac 45/63: Make PQreset available as pq:reset


From: ELPA Syncer
Subject: [elpa] externals/pq ae8f1a33ac 45/63: Make PQreset available as pq:reset.
Date: Mon, 14 Feb 2022 23:24:26 -0500 (EST)

branch: externals/pq
commit ae8f1a33acfbcc1ccda9361c24a638826285eeb3
Author: Andreas Seltenreich <seltenreich@gmx.de>
Commit: Andreas Seltenreich <seltenreich@gmx.de>

    Make PQreset available as pq:reset.
---
 pq.c    | 25 +++++++++++++++++++++++++
 test.el | 14 ++++++++++++--
 2 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/pq.c b/pq.c
index 9694ec1994..ed4c2fc108 100644
--- a/pq.c
+++ b/pq.c
@@ -233,6 +233,27 @@ Fpq_escape (emacs_env *env, ptrdiff_t nargs, emacs_value 
args[], void *data)
   return result;
 }
 
+static emacs_value
+Fpq_reset (emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data)
+{
+  if (!env->is_not_nil(env, args[0]))
+    return Qnil;
+  PGconn *conn = env->get_user_ptr(env, args[0]);
+
+  PQreset(conn);
+
+  if (PQstatus(conn) != CONNECTION_OK) {
+    const char *errmsg = PQerrorMessage(conn);
+    emacs_value errstring = env->make_string(env, errmsg, strlen(errmsg));
+    emacs_value Qpq_error = env->intern (env, "error");
+
+    env->non_local_exit_signal(env, Qpq_error, errstring);
+    return Qnil;
+  }
+
+  return Qt;
+}
+
 /* Bind NAME to FUN.  */
 static void
 bind_function (emacs_env *env, const char *name, emacs_value Sfun)
@@ -288,6 +309,10 @@ emacs_module_init (struct emacs_runtime *ert)
        "Perform identifier value quoting on STRING for CONN.",
        PQescapeIdentifier);
 
+  DEFUN("pq:reset", Fpq_reset, 1, 1,
+       "Resets the communication channel to the server behind CONN.",
+       NULL);
+
 #undef DEFUN
 
   Qnil = env->intern (env, "nil");
diff --git a/test.el b/test.el
index eea673faa6..6be47b4d2f 100644
--- a/test.el
+++ b/test.el
@@ -38,8 +38,9 @@
 (ert-deftest pq-garbage-collect-test ()
   (let ((conn (pq:connectdb *conninfo*)))
     (garbage-collect)
-    (sleep-for 0.1)
+    (sleep-for 0.2)
     (setq conn (pq:connectdb *conninfo*)
+         conn (pq:connectdb *conninfo*)
          conn (pq:connectdb *conninfo*)
          conn (pq:connectdb *conninfo*)
          conn (pq:connectdb *conninfo*)
@@ -53,7 +54,7 @@
             conn
             "select count(1) from pg_stat_activity where application_name = 
'emacs'"))))
       (garbage-collect)
-      (sleep-for 0.1)
+      (sleep-for 0.2)
       (should
        (<
        (car
@@ -70,6 +71,15 @@
     (should-error (pq:query conn "select * from"))
     (should-error (pq:query conn "select $1::text"))))
 
+(ert-deftest pq-reset-connection-test ()
+  (let ((testconn (pq:connectdb *conninfo*))
+       (ctlconn (pq:connectdb *conninfo*)))
+    (let ((victim (car (pq:query testconn "select pg_backend_pid()"))))
+      (pq:query ctlconn "select pg_terminate_backend($1)" victim))
+    (should-error (pq:query testconn "select 1"))
+    (pq:reset testconn)
+    (pq:query testconn "select 1")))
+
 (ert-deftest pq-notice-receiver-test ()
   (let ((conn (pq:connectdb *conninfo*)))
     (pq:query conn "set client_min_messages to notice")



reply via email to

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