emacs-diffs
[Top][All Lists]
Advanced

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

scratch/sqlite a397185: Change sqlite_execute to only do a single statem


From: Lars Ingebrigtsen
Subject: scratch/sqlite a397185: Change sqlite_execute to only do a single statement
Date: Tue, 7 Dec 2021 16:00:23 -0500 (EST)

branch: scratch/sqlite
commit a3971858b59fccb3c1dfdecae956f053ec563ad6
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Change sqlite_execute to only do a single statement
---
 src/sqlite.c | 75 ++++++++++++++++++++++++++----------------------------------
 1 file changed, 33 insertions(+), 42 deletions(-)

diff --git a/src/sqlite.c b/src/sqlite.c
index 5b728b7..ad2bbcd 100644
--- a/src/sqlite.c
+++ b/src/sqlite.c
@@ -162,8 +162,6 @@ executing a statement like
 
    insert into foo values (?, ?, ...)
 
-QUERY can include several statements, separated by a semicolon.
-
 The number of affected rows is returned.  */)
   (Lisp_Object db, Lisp_Object query, Lisp_Object values)
 {
@@ -173,60 +171,53 @@ The number of affected rows is returned.  */)
     xsignal1 (Qerror, build_string ("VALUES must be a list or a vector"));
 
   sqlite3 *sdb = XSQLITE (db)->db;
-  char *sql, *tail;
   Lisp_Object retval = Qnil;
   const char *errmsg = NULL;
+  Lisp_Object encoded;
+  sqlite3_stmt *stmt = NULL;
 
-  char *top = xmalloc (SBYTES (query) + 1);
-  if (top == NULL)
-    return Qnil;
-
-  memcpy (top, SSDATA (query), SBYTES (query) + 1);
-  tail = top;
+  if (STRING_MULTIBYTE (query))
+    encoded = encode_string_utf_8 (query, Qnil, 0, Qt, Qt);
+  else
+    encoded = query;
 
-  while (*(sql = tail) != '\0')
+  /* We only execute the first statement -- if there's several
+     (separated by a semicolon), the subsequent statements won't be
+     done.  */
+  int ret = sqlite3_prepare_v2 (sdb, SSDATA (encoded), -1, &stmt, NULL);
+  if (ret != SQLITE_OK)
     {
-      sqlite3_stmt *stmt = NULL;
-      int ret = sqlite3_prepare_v2 (sdb, sql, -1, &stmt, (const char**)&tail);
-      /* FIXME: Same values for each statement? */
-      if (!NILP (values)) {
-       const char *err = bind_values (sdb, stmt, values);
-       if (err != NULL)
-         {
-           errmsg = err;
-           goto exit;
-         }
-      }
-
-      if (ret != SQLITE_OK)
+      if (stmt != NULL)
        {
-         if (stmt != NULL)
-           {
-             sqlite3_finalize (stmt);
-             sqlite3_reset (stmt);
-           }
-
-         errmsg = sqlite3_errmsg (sdb);
-         goto exit;
+         sqlite3_finalize (stmt);
+         sqlite3_reset (stmt);
        }
 
-      if (stmt == NULL)
-       continue;
+      errmsg = sqlite3_errmsg (sdb);
+      goto exit;
+    }
 
-      ret = sqlite3_step (stmt);
-      sqlite3_finalize (stmt);
-      if (ret != SQLITE_OK && ret != SQLITE_DONE)
-       {
-         errmsg = sqlite3_errmsg (sdb);
-         goto exit;
-       }
+  /* Bind ? values.  */
+  if (!NILP (values)) {
+    const char *err = bind_values (sdb, stmt, values);
+    if (err != NULL)
+      {
+       errmsg = err;
+       goto exit;
+      }
+  }
+
+  ret = sqlite3_step (stmt);
+  sqlite3_finalize (stmt);
+  if (ret != SQLITE_OK && ret != SQLITE_DONE)
+    {
+      errmsg = sqlite3_errmsg (sdb);
+      goto exit;
     }
 
   retval = make_fixnum (sqlite3_changes (sdb));
 
  exit:
-  xfree (top);
-
   if (errmsg != NULL)
     xsignal1 (Qerror, build_string (errmsg));
 



reply via email to

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