[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
scratch/sqlite 1e1fa9b: Firm up sqlite object checking and add sqlite-cl
From: |
Lars Ingebrigtsen |
Subject: |
scratch/sqlite 1e1fa9b: Firm up sqlite object checking and add sqlite-close |
Date: |
Tue, 7 Dec 2021 20:36:55 -0500 (EST) |
branch: scratch/sqlite
commit 1e1fa9ba9573ee082e50b3f0092f16454b5ab05c
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
Firm up sqlite object checking and add sqlite-close
---
src/sqlite.c | 49 ++++++++++++++++++++++++++++++++----------------
test/src/sqlite-tests.el | 11 +++++++++++
2 files changed, 44 insertions(+), 16 deletions(-)
diff --git a/src/sqlite.c b/src/sqlite.c
index e93f399..5932952 100644
--- a/src/sqlite.c
+++ b/src/sqlite.c
@@ -65,6 +65,18 @@ make_sqlite (bool is_statement, void *db, void *stmt, char
*name)
return make_lisp_ptr (ptr, Lisp_Vectorlike);
}
+static void
+check_sqlite (Lisp_Object db, bool is_statement)
+{
+ CHECK_SQLITE (db);
+ if (is_statement && !XSQLITE (db)->is_statement)
+ xsignal1 (Qerror, build_string ("Invalid set object"));
+ else if (!is_statement && XSQLITE (db)->is_statement)
+ xsignal1 (Qerror, build_string ("Invalid database object"));
+ if (!XSQLITE (db)->db)
+ xsignal1 (Qerror, build_string ("Database closed"));
+}
+
static int db_count = 0;
DEFUN ("sqlite-open", Fsqlite_open, Ssqlite_open, 0, 1, 0,
@@ -103,6 +115,16 @@ If FILE is nil, an in-memory database will be opened
instead. */)
return make_sqlite (false, sdb, NULL, name);
}
+DEFUN ("sqlite-close", Fsqlite_close, Ssqlite_close, 1, 1, 0,
+ doc: /* Close the database DB. */)
+ (Lisp_Object db)
+{
+ check_sqlite (db, false);
+ sqlite3_close (XSQLITE (db)->db);
+ XSQLITE (db)->db = NULL;
+ return Qnil;
+}
+
/* Bind values in a statement like
"insert into foo values (?, ?, ?)". */
static const char *
@@ -170,7 +192,7 @@ executing a statement like
The number of affected rows is returned. */)
(Lisp_Object db, Lisp_Object query, Lisp_Object values)
{
- CHECK_SQLITE (db);
+ check_sqlite (db, false);
CHECK_STRING (query);
if (!(NILP (values) || CONSP (values) || VECTORP (values)))
xsignal1 (Qerror, build_string ("VALUES must be a list or a vector"));
@@ -298,8 +320,9 @@ which means that we return a set object that can be queried
with
(Lisp_Object db, Lisp_Object query, Lisp_Object values,
Lisp_Object return_type)
{
- CHECK_SQLITE (db);
+ check_sqlite (db, false);
CHECK_STRING (query);
+
if (!(NILP (values) || CONSP (values) || VECTORP (values)))
xsignal1 (Qerror, build_string ("VALUES must be a list or a vector"));
@@ -370,7 +393,7 @@ DEFUN ("sqlite-transaction", Fsqlite_transaction,
Ssqlite_transaction, 1, 1, 0,
doc: /* Start a transaction in DB. */)
(Lisp_Object db)
{
- CHECK_SQLITE (db);
+ check_sqlite (db, false);
return sqlite_exec (XSQLITE (db)->db, "begin");
}
@@ -378,7 +401,7 @@ DEFUN ("sqlite-commit", Fsqlite_commit, Ssqlite_commit, 1,
1, 0,
doc: /* Commit a transaction in DB. */)
(Lisp_Object db)
{
- CHECK_SQLITE (db);
+ check_sqlite (db, false);
return sqlite_exec (XSQLITE (db)->db, "commit");
}
@@ -386,7 +409,7 @@ DEFUN ("sqlite-rollback", Fsqlite_rollback,
Ssqlite_rollback, 1, 1, 0,
doc: /* Roll back a transaction in DB. */)
(Lisp_Object db)
{
- CHECK_SQLITE (db);
+ check_sqlite (db, false);
return sqlite_exec (XSQLITE (db)->db, "rollback");
}
@@ -396,7 +419,7 @@ DEFUN ("sqlite-load-extension", Fsqlite_load_extension,
MODULE should be the file name of an SQlite module .so file. */)
(Lisp_Object db, Lisp_Object module)
{
- CHECK_SQLITE (db);
+ check_sqlite (db, false);
CHECK_STRING (module);
sqlite3 *sdb = XSQLITE (db)->db;
@@ -410,9 +433,7 @@ DEFUN ("sqlite-next", Fsqlite_next, Ssqlite_next, 1, 1, 0,
doc: /* Return the next result set from SET. */)
(Lisp_Object set)
{
- CHECK_SQLITE (set);
- if (!XSQLITE (set)->is_statement)
- xsignal1 (Qerror, build_string ("Invalid set object"));
+ check_sqlite (set, true);
int ret = sqlite3_step (XSQLITE (set)->stmt);
if (ret != SQLITE_ROW && ret != SQLITE_OK && ret != SQLITE_DONE)
@@ -431,10 +452,7 @@ DEFUN ("sqlite-columns", Fsqlite_columns, Ssqlite_columns,
1, 1, 0,
doc: /* Return the column names of SET. */)
(Lisp_Object set)
{
- CHECK_SQLITE (set);
- if (!XSQLITE (set)->is_statement)
- xsignal1 (Qerror, build_string ("Invalid set object"));
-
+ check_sqlite (set, true);
return column_names (XSQLITE (set)->stmt);
}
@@ -442,9 +460,7 @@ DEFUN ("sqlite-more-p", Fsqlite_more_p, Ssqlite_more_p, 1,
1, 0,
doc: /* Say whether there's any further results in SET. */)
(Lisp_Object set)
{
- CHECK_SQLITE (set);
- if (!XSQLITE (set)->is_statement)
- xsignal1 (Qerror, build_string ("Invalid set object"));
+ check_sqlite (set, true);
if (XSQLITE (set)->eof)
return Qnil;
@@ -481,6 +497,7 @@ syms_of_sqlite (void)
{
#ifdef HAVE_SQLITE3
defsubr (&Ssqlite_open);
+ defsubr (&Ssqlite_close);
defsubr (&Ssqlite_execute);
defsubr (&Ssqlite_select);
defsubr (&Ssqlite_transaction);
diff --git a/test/src/sqlite-tests.el b/test/src/sqlite-tests.el
index 65853a6..3fffa01 100644
--- a/test/src/sqlite-tests.el
+++ b/test/src/sqlite-tests.el
@@ -161,4 +161,15 @@
(should (sqlite-select db1 "select * from test6"))
(should-not (sqlite-select db2 "select * from test6"))))
+(ert-deftest sqlite-close-dbs ()
+ (skip-unless (sqlite-available-p))
+ (let (db)
+ (setq db (sqlite-open))
+ (sqlite-execute
+ db "create table if not exists test6 (col1 text, col2 number)")
+ (sqlite-execute db "insert into test6 values (?, ?)" '("foo" 2))
+ (should (sqlite-select db "select * from test6"))
+ (sqlite-close db)
+ (should-error (sqlite-select db "select * from test6"))))
+
;;; sqlite-tests.el ends here
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- scratch/sqlite 1e1fa9b: Firm up sqlite object checking and add sqlite-close,
Lars Ingebrigtsen <=