mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-16 17:24:23 +00:00
Add 'sqlite-execute-batch' command
This command is similar to 'sqlite-execute' except that it executes multiple statements in exchange for not accepting any arguments. (Bug#70145) * src/sqlite.c (Fsqlite_execute_batch): New function. * test/src/sqlite-tests.el (sqlite-multiple-statements): Add smoke test for 'sqlite-execute-batch'. * etc/NEWS: Mention new command 'sqlite-execute-batch'. * doc/lispref/text.texi (Database): Document the new command.
This commit is contained in:
parent
7fbafb9d95
commit
23ef989935
4 changed files with 53 additions and 0 deletions
|
|
@ -5414,6 +5414,14 @@ called @var{gif}, you have to mark it specially to let
|
|||
|
||||
@end defun
|
||||
|
||||
@defun sqlite-execute-batch db statements
|
||||
Execute the @acronym{SQL} @var{statements}. @var{statements} is a
|
||||
string containing 0 or more @acronym{SQL} statements. This command
|
||||
might be useful when we want to execute multiple @acronym{DDL}
|
||||
statements.
|
||||
|
||||
@end defun
|
||||
|
||||
@defun sqlite-select db query &optional values return-type
|
||||
Select some data from @var{db} and return them. For instance:
|
||||
|
||||
|
|
|
|||
7
etc/NEWS
7
etc/NEWS
|
|
@ -484,6 +484,13 @@ When visiting a script that invokes 'env -S INTERPRETER ARGS...' in
|
|||
its shebang line, Emacs will now skip over 'env -S' and deduce the
|
||||
major mode based on the interpreter after 'env -S'.
|
||||
|
||||
+++
|
||||
** New command 'sqlite-execute-batch'.
|
||||
This command lets the user execute multiple SQL commands in one
|
||||
command. It is useful when the user wants to evaluate an entire SQL
|
||||
file.
|
||||
|
||||
+++
|
||||
|
||||
* Editing Changes in Emacs 30.1
|
||||
|
||||
|
|
|
|||
12
src/sqlite.c
12
src/sqlite.c
|
|
@ -646,6 +646,17 @@ sqlite_exec (sqlite3 *sdb, const char *query)
|
|||
return Qt;
|
||||
}
|
||||
|
||||
DEFUN ("sqlite-execute-batch", Fsqlite_execute_batch, Ssqlite_execute_batch, 2, 2, 0,
|
||||
doc: /* Execute multiple SQL statements in DB.
|
||||
Query is a string containing 0 or more SQL statements. */)
|
||||
(Lisp_Object db, Lisp_Object query)
|
||||
{
|
||||
check_sqlite (db, false);
|
||||
CHECK_STRING (query);
|
||||
Lisp_Object encoded = encode_string(query);
|
||||
return sqlite_exec (XSQLITE (db)->db, SSDATA (encoded));
|
||||
}
|
||||
|
||||
DEFUN ("sqlite-transaction", Fsqlite_transaction, Ssqlite_transaction, 1, 1, 0,
|
||||
doc: /* Start a transaction in DB. */)
|
||||
(Lisp_Object db)
|
||||
|
|
@ -866,6 +877,7 @@ syms_of_sqlite (void)
|
|||
defsubr (&Ssqlite_close);
|
||||
defsubr (&Ssqlite_execute);
|
||||
defsubr (&Ssqlite_select);
|
||||
defsubr (&Ssqlite_execute_batch);
|
||||
defsubr (&Ssqlite_transaction);
|
||||
defsubr (&Ssqlite_commit);
|
||||
defsubr (&Ssqlite_rollback);
|
||||
|
|
|
|||
|
|
@ -261,4 +261,30 @@
|
|||
'("Joe" "Doe"))
|
||||
'((1 "Joe")))))))
|
||||
|
||||
(ert-deftest sqlite-multiple-statements ()
|
||||
(skip-unless (sqlite-available-p))
|
||||
(let ((db (sqlite-open nil))
|
||||
(query (with-temp-buffer
|
||||
(insert "-- -*- sql-product: sqlite -*-
|
||||
|
||||
-- I 💘 emojis
|
||||
|
||||
CREATE TABLE settings (
|
||||
name TEXT NOT NULL,
|
||||
value TEXT,
|
||||
section TEXT NOT NULL,
|
||||
PRIMARY KEY (section, name)
|
||||
);
|
||||
|
||||
CREATE TABLE tags📎 (
|
||||
name TEXT PRIMARY KEY NOT NULL
|
||||
);
|
||||
|
||||
-- CREATE TABLE todo_states (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
|
||||
")
|
||||
(buffer-string))))
|
||||
(sqlite-execute-batch db query)
|
||||
(should (equal '(("settings") ("tags📎"))
|
||||
(sqlite-select db "select name from sqlite_master where type = 'table' and name not like 'sqlite_%' order by name")))))
|
||||
|
||||
;;; sqlite-tests.el ends here
|
||||
|
|
|
|||
Loading…
Reference in a new issue