1/* Copyright (C) 2024 Boris Vassilev <boris.vassilev@gmail.com> 2 3This program is free software: you can redistribute it and/or modify 4it under the terms of the GNU General Public License as published by 5the Free Software Foundation, either version 3 of the License, or 6(at your option) any later version. 7 8This program is distributed in the hope that it will be useful, 9but WITHOUT ANY WARRANTY; without even the implied warranty of 10MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11GNU General Public License for more details. 12 13You should have received a copy of the GNU General Public License 14along with this program. If not, see <https://www.gnu.org/licenses/>. 15*/ 16:- module(sqlite, [ 17 sqlite_version/1, 18 sqlite_open/3, 19 sqlite_close/1, 20 sqlite_prepare/3, 21 sqlite_bind/2, 22 sqlite_reset/1, 23 sqlite_sql/2, 24 sqlite_expanded_sql/2, 25 sqlite_column_names/2, 26 sqlite_finalize/1, 27 sqlite_eval/1, 28 sqlite_eval/2, 29 sqlite_eval/4 ]).
69:- use_foreign_library(foreign(swiplite)). 70:- use_module(library(dcg/basics)). 71 72:- multifile prolog:error_message//1. 73 74prologerror_message(sqlite_error(Caller, Code, Str, Message)) --> 75 [ '[~s] (~d) ~s - ~s'-[Caller, Code, Str, Message] ]. 76prologerror_message(swiplite_error(Caller, Message)) --> 77 [ '[~s] ~s'-[Caller, Message] ].
83sqlite_version(V) :- 84 setup_call_cleanup(sqlite_open('', DB, [memory(true)]), 85 setup_call_cleanup(sqlite_prepare(DB, "select sqlite_version()", S), 86 sqlite_eval(S, row(V0)), 87 sqlite_finalize(S)), 88 sqlite_close(DB)), 89 atom_string(V, V0). 90 91:- predicate_options(sqlite_open/3, 3, 92 [ mode(oneof([read,write,create])), 93 memory(boolean), 94 threaded(oneof([single,multi,serialized])) 95 ]).
The options are used to set the flags
argument in the call to
sqlite3_open_v2()
.
The following options are recognized:
Value | Corresponding flags |
read (default) | SQLITE_OPEN_READONLY |
write | SQLITE_OPEN_READWRITE |
create | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
Value | Corresponding flags |
false (default) | (empty) |
true | SQLITE_OPEN_MEMORY |
Value | Corresponding flags |
single (default) | (empty) |
multi | SQLITE_OPEN_NOMUTEX |
serialized = | SQLITE_OPEN_FULLMUTEX |
The UTF-8 encoded text in SQL is parsed up to the first nul, or
up to the end of the first SQL statement. SQL parameters are
initially all set to NULL
. Anonymous variables are not allowed.
If ?NNN parameters are used, they must be numbered
starting from 1, without any gaps.
The term in Bind_values must be named "bv
" (bind values).
Use an empty list []
to set a variable to NULL
.
?- sqlite_prepare(DB, "Select ?1, ?2", S), sqlite_bind(S, bv('a', [])), sqlite_expanded_sql(S, E). E = "Select 'a', NULL".
Each term in the Bind_values argument is used to set the variable with the same index in the SQL statement; both start counting at 1.
In addition to using the empty list to represent SQL NULL
:
double
.SELECT
statement
For a SELECT
statement, the result is a flat term
cols(column_1, column_2, ...)
.
If the prepared statement does not have a result set with columns
in it, Column_names is unified with cols()
.
For example, CREATE
or INSERT
statements must be
evaluated using sqlite_eval/1, while a SELECT
needs
either sqlite_eval/2 or sqlite_eval/4.
Statement is reset automatically upon success.
SELECT
statement with exactly one row in the result set
Statement is reset automatically upon success.
When N is a free variable, fetch all rows of the result set and unify N with the number of rows.
Otherwise, fetch up to N result rows in R.
R and T form a difference list. When there are no more results
in the result set, T is unified with the empty list []
.
A statement evaluated with sqlite_eval/4 must be explictly
reset using sqlite_reset/1 after all rows in the result set have
been fetched. Until it is reset, consecutive calls will unify N
with 0 and both R and T with the empty list []
.
Prolog bindings for SQLite
This module provides partial access to the C-language interface of SQLite.
It exposes the database connection object
sqlite3
and the prepared statement objectsqlite3_stmt
, along with some of the essential functions using these objects. Please refer to the SQLite documentation and the implementation inc/swiplite.c
when using this library. To make it easier to find the relevant docs, I have tried to consistently provide links.Most of the predicates in this module are as close as possible in naming and semantics to the corresponding functions in the C interface. One exception is sqlite_bind/2, which converts values from Prolog terms to corresponding SQLite column datatype. Similarly, sqlite_eval/1, sqlite_eval/2, and sqlite_eval/4 wrap the necessary calls to
sqlite3_step()
and convert the results ofSELECT
queries to Prolog terms.The database connection and prepared statement objects are represented in SWI-Prolog as blobs. They are garbage collected, but finalizing a statement or closing a database connection (and, alternatively, not doing it) have reprecussions, especially for long-running programs. The code in this library uses exclusively the
*_v2
versions of the SQLite C interface. In particular:> The
sqlite3_close_v2()
interface > is intended for use with host languages that are garbage > collected, and where the order in which destructors are called is > arbitrary. */