NAME
sqlbox_close —
close a database
LIBRARY
library “sqlbox”
SYNOPSIS
#include
<stdint.h>
#include <sqlbox.h>
int
sqlbox_close(struct sqlbox *box,
size_t id);
DESCRIPTION
Close a database with the database id as
returned from sqlbox_open(3). If id is zero, the last-opened
database is used. The caller must have a role capable of opening and closing
the given database source. Once closed, subsequent calls to
sqlbox_close()
with the same identifier will fail.
If
sqlbox_close()
is not explicitly called, the database will be implicitly closed at
sqlbox_free(3). This
is not considered an error, as a common usage pattern is a role with
permission opening the database, shedding its role, then the close being
relegated to the full destruction of the box.
SQLite3 Implementation
The database is closed with sqlite3_close(3).
RETURN VALUES
sqlbox_close() returns zero if
communication with box fails. Otherwise, it returns
non-zero on success.
If closing the database fails (not open or does not exist, statements not finalised, a transaction still open), subsequent box access will fail. Use sqlbox_ping(3) to check explicitly.
If sqlbox_close() fails,
box is no longer accessible beyond
sqlbox_ping(3) and
sqlbox_free(3).
EXAMPLES
To simply open and close an in-memory database:
struct sqlbox *p;
struct sqlbox_src srcs[] = {
{ .fname = (char *)":memory:",
.mode = SQLBOX_SRC_RWC },
};
struct sqlbox_cfg cfg;
size_t id;
memset(&cfg, 0, sizeof(struct sqlbox_cfg));
cfg.msg.func_short = warnx;
cfg.srcs.srcsz = 1;
cfg.srcs.srcs = srcs;
if ((p = sqlbox_alloc(&cfg)) == NULL)
errx(EXIT_FAILURE, "sqlbox_alloc");
if (!(id = sqlbox_open(p, 0)))
errx(EXIT_FAILURE, "sqlbox_open");
/* Perform work... */
if (!sqlbox_close(p, id))
errx(EXIT_FAILURE, "sqlbox_close");
sqlbox_free(p);
To let sqlbox_free(3) handle closing the database for role-shedding:
struct sqlbox *p;
struct sqlbox_src srcs[] = {
{ .fname = (char *)":memory:",
.mode = SQLBOX_SRC_RWC },
};
struct sqlbox_role roles[] = {
{ .roles = (size_t[]){ 0, 1 },
.rolesz = 2,
.stmtsz = 0,
.srcs = (size_t[]){ 0 },
.srcsz = 1 },
{ .rolesz = 0,
.stmtsz = 0,
.srcsz = 0 }
};
struct sqlbox_cfg cfg;
size_t id;
memset(&cfg, 0, sizeof(struct sqlbox_cfg));
cfg.msg.func_short = warnx;
cfg.srcs.srcsz = 1;
cfg.srcs.srcs = srcs;
cfg.roles.roles = roles;
cfg.roles.rolesz = 2;
cfg.roles.defrole = 0;
if ((p = sqlbox_alloc(&cfg)) == NULL)
errx(EXIT_FAILURE, "sqlbox_alloc");
if (!(id = sqlbox_open(p, 0)))
errx(EXIT_FAILURE, "sqlbox_open");
if (!sqlbox_role(p, 1))
errx(EXIT_FAILURE, "sqlbox_role");
/* Perform work... */
sqlbox_free(p);
In the last example, the default role is able to transition into the new role, which is not able to close the database.