emacs-diffs
[Top][All Lists]
Advanced

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

scratch/sqlite 2df01b7 3/3: We don't need to precompute the columns


From: Lars Ingebrigtsen
Subject: scratch/sqlite 2df01b7 3/3: We don't need to precompute the columns
Date: Tue, 7 Dec 2021 00:00:46 -0500 (EST)

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

    We don't need to precompute the columns
---
 src/lisp.h   |  1 -
 src/sqlite.c | 36 +++++++++++++++++-------------------
 2 files changed, 17 insertions(+), 20 deletions(-)

diff --git a/src/lisp.h b/src/lisp.h
index c669dbc..0ce1b09 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -2574,7 +2574,6 @@ xmint_pointer (Lisp_Object a)
 struct Lisp_Sqlite
 {
   union vectorlike_header header;
-  Lisp_Object columns;
   void *db;
   void *stmt;
   void (*finalizer) (void *);
diff --git a/src/sqlite.c b/src/sqlite.c
index 8bc9af2..cdfc97b 100644
--- a/src/sqlite.c
+++ b/src/sqlite.c
@@ -42,15 +42,14 @@ sqlite_free (void *arg)
 }
 
 static Lisp_Object
-make_sqlite (bool is_statement, void *db, void *stmt, Lisp_Object columns)
+make_sqlite (bool is_statement, void *db, void *stmt)
 {
   struct Lisp_Sqlite *ptr
-    = ALLOCATE_ZEROED_PSEUDOVECTOR (struct Lisp_Sqlite, columns, PVEC_SQLITE);
+    = ALLOCATE_PLAIN_PSEUDOVECTOR (struct Lisp_Sqlite, PVEC_SQLITE);
   ptr->is_statement = is_statement;
   ptr->finalizer = sqlite_free;
   ptr->db = db;
   ptr->stmt = stmt;
-  ptr->columns = columns;
   ptr->eof = false;
   return make_lisp_ptr (ptr, Lisp_Vectorlike);
 }
@@ -79,7 +78,7 @@ If FILE is nil, an in-memory database will be opened instead. 
 */)
   if (ret != SQLITE_OK)
     return Qnil;
 
-  return make_sqlite (false, sdb, NULL, Qnil);
+  return make_sqlite (false, sdb, NULL);
 }
 
 /* Bind values in a statement like
@@ -261,6 +260,17 @@ row_to_value (sqlite3_stmt *stmt)
   return Fnreverse (values);
 }
 
+static Lisp_Object
+column_names (sqlite3_stmt *stmt)
+{
+  Lisp_Object columns = Qnil;
+  int count = sqlite3_column_count (stmt);
+  for (int i = 0; i < count; ++i)
+    columns = Fcons (build_string (sqlite3_column_name (stmt, i)), columns);
+
+  return Fnreverse (columns);
+}
+
 DEFUN ("sqlite-select", Fsqlite_select, Ssqlite_select, 2, 4, 0,
        doc: /* Select data from the database DB that matches QUERY.
 If VALUES is non-nil, they are values that will be interpolated into a
@@ -308,21 +318,9 @@ which means that we return a set object that can be 
queried with
        }
     }
 
-  /* Get the field names.  */
-  Lisp_Object columns = Qnil;
-  if (EQ (return_type, Qset)
-      || EQ (return_type, Qfull))
-    {
-      int count = sqlite3_column_count (stmt);
-      for (int i = 0; i < count; ++i)
-       columns = Fcons (build_string (sqlite3_column_name (stmt, i)), columns);
-
-      columns = Fnreverse (columns);
-    }
-
   if (EQ (return_type, Qset))
     {
-      retval = make_sqlite (true, db, stmt, columns);
+      retval = make_sqlite (true, db, stmt);
       goto exit;
     }
 
@@ -332,7 +330,7 @@ which means that we return a set object that can be queried 
with
     data = Fcons (row_to_value (stmt), data);
 
   if (EQ (return_type, Qfull))
-    retval = Fcons (columns, Fnreverse (data));
+    retval = Fcons (column_names (stmt), Fnreverse (data));
   else
     retval = Fnreverse (data);
   sqlite3_finalize (stmt);
@@ -423,7 +421,7 @@ DEFUN ("sqlite-columns", Fsqlite_columns, Ssqlite_columns, 
1, 1, 0,
   if (!XSQLITE (set)->is_statement)
     xsignal1 (Qerror, build_string ("Invalid set object"));
 
-  return XSQLITE (set)->columns;
+  return column_names (XSQLITE (set)->stmt);
 }
 
 DEFUN ("sqlite-more-p", Fsqlite_more_p, Ssqlite_more_p, 1, 1, 0,



reply via email to

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