2 * This program is is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License, version 2 if the
4 * License as published by the Free Software Foundation.
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
11 * You should have received a copy of the GNU General Public License
12 * along with this program; if not, write to the Free Software
13 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 * @file rlm_sql_sqlite.c
19 * @brief SQLite driver.
21 * @copyright 2013 Network RADIUS SARL <info@networkradius.com>
22 * @copyright 2007 Apple Inc.
27 #include <freeradius-devel/radiusd.h>
37 #define BOOTSTRAP_MAX (1048576 * 10)
40 * Allow us to use versions < 3.6.0 beta0
42 #ifndef SQLITE_OPEN_NOMUTEX
43 # define SQLITE_OPEN_NOMUTEX 0
46 #ifndef HAVE_SQLITE3_INT64
47 typedef sqlite3_int64 sqlite_int64
50 typedef struct rlm_sql_sqlite_conn {
52 sqlite3_stmt *statement;
54 } rlm_sql_sqlite_conn_t;
56 typedef struct rlm_sql_sqlite_config {
58 } rlm_sql_sqlite_config_t;
60 static const CONF_PARSER driver_config[] = {
61 { "filename", FR_CONF_OFFSET(PW_TYPE_FILE_OUTPUT | PW_TYPE_REQUIRED, rlm_sql_sqlite_config_t, filename), NULL },
63 {NULL, -1, 0, NULL, NULL}
66 static int sql_check_error(sqlite3 *db)
68 int error = sqlite3_errcode(db);
78 * User/transient errors
80 case SQLITE_ERROR: /* SQL error or missing database */
82 case SQLITE_CONSTRAINT:
88 * Errors with the handle, that probably require reinitialisation
91 ERROR("rlm_sql_sqlite: Handle is unusable, error (%d): %s", error, sqlite3_errmsg(db));
92 return RLM_SQL_RECONNECT;
97 #ifdef HAVE_SQLITE3_OPEN_V2
98 static int sql_loadfile(TALLOC_CTX *ctx, sqlite3 *db, char const *filename)
108 sqlite3_stmt *statement;
111 INFO("rlm_sql_sqlite: Executing SQL statements from file \"%s\"", filename);
113 f = fopen(filename, "r");
115 ERROR("rlm_sql_sqlite: Failed opening SQL file \"%s\": %s", filename,
121 if (fstat(fileno(f), &finfo) < 0) {
122 ERROR("rlm_sql_sqlite: Failed stating SQL file \"%s\": %s", filename,
130 if (finfo.st_size > BOOTSTRAP_MAX) {
132 ERROR("rlm_sql_sqlite: Size of SQL (%zu) file exceeds limit (%uk)",
133 (size_t) finfo.st_size / 1024, BOOTSTRAP_MAX / 1024);
140 MEM(buffer = talloc_array(ctx, char, finfo.st_size + 1));
141 len = fread(buffer, sizeof(char), finfo.st_size + 1, f);
142 if (len > finfo.st_size) {
149 ERROR("rlm_sql_sqlite: Error reading SQL file: %s", fr_syserror(errno));
157 DEBUG("rlm_sql_sqlite: Ignoring empty SQL file");
169 * Check if input data is UTF-8. Allow CR/LF \t, too.
171 for (p = buffer; p < (buffer + len); p += cl) {
173 if ((*p != 0x0a) && (*p != 0x0d) && (*p != '\t')) break;
176 cl = fr_utf8_char((uint8_t *) p);
181 if ((p - buffer) != len) {
182 ERROR("rlm_sql_sqlite: Bootstrap file contains non-UTF8 char at offset %zu", p - buffer);
188 * Statement delimiter is ;\n
191 while ((q = strchr(p, ';'))) {
199 #ifdef HAVE_SQLITE3_PREPARE_V2
200 (void) sqlite3_prepare_v2(db, s, len, &statement, &z_tail);
202 (void) sqlite3_prepare(db, s, len, &>statement, &z_tail);
204 if (sql_check_error(db)) {
209 (void) sqlite3_step(statement);
210 status = sql_check_error(db);
212 (void) sqlite3_finalize(statement);
213 if (status || sql_check_error(db)) {
226 static int mod_instantiate(CONF_SECTION *conf, rlm_sql_config_t *config)
228 static bool version_done;
231 rlm_sql_sqlite_config_t *driver;
237 if (sqlite3_libversion_number() != SQLITE_VERSION_NUMBER) {
238 WARN("rlm_sql_sqlite: libsqlite version changed since the server was built");
239 WARN("rlm_sql_sqlite: linked: %s built: %s", sqlite3_libversion(), SQLITE_VERSION);
241 INFO("rlm_sql_sqlite: libsqlite version: %s", sqlite3_libversion());
244 MEM(driver = config->driver = talloc_zero(config, rlm_sql_sqlite_config_t));
245 if (cf_section_parse(conf, driver, driver_config) < 0) {
248 if (!driver->filename) {
249 MEM(driver->filename = talloc_typed_asprintf(driver, "%s/%s", get_radius_dir(), config->sql_db));
252 if (stat(driver->filename, &buf) == 0) {
254 } else if (errno == ENOENT) {
257 ERROR("rlm_sql_sqlite: Database exists, but couldn't be opened: %s", fr_syserror(errno));
261 if (cf_pair_find(conf, "bootstrap") && !exists) {
262 # ifdef HAVE_SQLITE3_OPEN_V2
270 INFO("rlm_sql_sqlite: Database doesn't exist, creating it and loading schema");
272 p = strrchr(driver->filename, '/');
274 size_t len = (p - driver->filename) + 1;
276 buff = talloc_array(conf, char, len);
277 strlcpy(buff, driver->filename, len);
279 MEM(buff = talloc_typed_strdup(conf, driver->filename));
282 ret = rad_mkdir(buff, 0700);
285 ERROR("rlm_sql_sqlite: Failed creating directory for SQLite database: %s", fr_syserror(errno));
290 status = sqlite3_open_v2(driver->filename, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
292 # ifdef HAVE_SQLITE3_ERRSTR
293 ERROR("rlm_sql_sqlite: Failed creating opening/creating SQLite database: %s",
294 sqlite3_errstr(status));
296 ERROR("rlm_sql_sqlite: Failed creating opening/creating SQLite database, got code (%i)",
303 if (sql_check_error(db)) {
304 (void) sqlite3_close(db);
310 * Execute multiple bootstrap SQL files in order
312 for (cp = cf_pair_find(conf, "bootstrap");
314 cp = cf_pair_find_next(conf, cp, "bootstrap")) {
315 p = cf_pair_value(cp);
318 ret = sql_loadfile(conf, db, p);
319 if (ret < 0) goto unlink;
322 status = sqlite3_close(db);
323 if (status != SQLITE_OK) {
325 * Safer to use sqlite3_errstr here, just in case the handle is in a weird state
327 # ifdef HAVE_SQLITE3_ERRSTR
328 ERROR("rlm_sql_sqlite: Error closing SQLite handle: %s", sqlite3_errstr(status));
330 ERROR("rlm_sql_sqlite: Error closing SQLite handle, got code (%i)", status);
338 if ((unlink(driver->filename) < 0) && (errno != ENOENT)) {
339 ERROR("rlm_sql_sqlite: Error removing partially initialised database: %s",
345 WARN("rlm_sql_sqlite: sqlite3_open_v2() not available, cannot bootstrap database. "
346 "Upgrade to SQLite >= 3.5.1 if you need this functionality");
353 static int _sql_socket_destructor(rlm_sql_sqlite_conn_t *conn)
357 DEBUG2("rlm_sql_sqlite: Socket destructor called, closing socket");
360 status = sqlite3_close(conn->db);
361 if (status != SQLITE_OK) {
362 WARN("rlm_sql_sqlite: Got SQLite error code (%u) when closing socket", status);
369 static void _sql_greatest(sqlite3_context *ctx, int num_values, sqlite3_value **values)
372 sqlite3_int64 value, max = 0;
374 for (i = 0; i < num_values; i++) {
375 value = sqlite3_value_int64(values[i]);
381 sqlite3_result_int64(ctx, max);
384 static sql_rcode_t sql_socket_init(rlm_sql_handle_t *handle, rlm_sql_config_t *config)
386 rlm_sql_sqlite_conn_t *conn;
387 rlm_sql_sqlite_config_t *driver = config->driver;
391 MEM(conn = handle->conn = talloc_zero(handle, rlm_sql_sqlite_conn_t));
392 talloc_set_destructor(conn, _sql_socket_destructor);
394 INFO("rlm_sql_sqlite: Opening SQLite database \"%s\"", driver->filename);
395 #ifdef HAVE_SQLITE3_OPEN_V2
396 status = sqlite3_open_v2(driver->filename, &(conn->db), SQLITE_OPEN_READWRITE | SQLITE_OPEN_NOMUTEX, NULL);
398 status = sqlite3_open(driver->filename, &(conn->db));
401 #ifdef HAVE_SQLITE3_ERRSTR
402 ERROR("rlm_sql_sqlite: Failed creating opening/creating SQLite: %s", sqlite3_errstr(status));
404 ERROR("rlm_sql_sqlite: Failed creating opening/creating SQLite database error code (%i)",
411 if (sql_check_error(conn->db)) {
416 * Enable extended return codes for extra debugging info.
418 #ifdef HAVE_SQLITE3_EXTENDED_RESULT_CODES
419 (void) sqlite3_extended_result_codes(conn->db, 1);
421 if (sql_check_error(conn->db)) {
425 #ifdef HAVE_SQLITE3_CREATE_FUNCTION_V2
426 status = sqlite3_create_function_v2(conn->db, "GREATEST", -1, SQLITE_ANY, NULL,
427 _sql_greatest, NULL, NULL, NULL);
429 status = sqlite3_create_function(conn->db, "GREATEST", -1, SQLITE_ANY, NULL,
430 _sql_greatest, NULL, NULL);
432 if (status != SQLITE_OK) {
433 ERROR("rlm_sql_sqlite: Failed registering 'GREATEST' sql function: %s", sqlite3_errmsg(conn->db));
439 static sql_rcode_t sql_select_query(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config, char const *query)
441 rlm_sql_sqlite_conn_t *conn = handle->conn;
444 #ifdef HAVE_SQLITE3_PREPARE_V2
445 (void) sqlite3_prepare_v2(conn->db, query, strlen(query), &conn->statement, &z_tail);
447 (void) sqlite3_prepare(conn->db, query, strlen(query), &conn->statement, &z_tail);
452 return sql_check_error(conn->db);
456 static sql_rcode_t sql_query(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config, char const *query)
459 rlm_sql_sqlite_conn_t *conn = handle->conn;
462 #ifdef HAVE_SQLITE3_PREPARE_V2
463 status = sqlite3_prepare_v2(conn->db, query, strlen(query), &conn->statement, &z_tail);
465 status = sqlite3_prepare(conn->db, query, strlen(query), &conn->statement, &z_tail);
467 if (status != SQLITE_OK) {
468 return sql_check_error(conn->db);
471 (void) sqlite3_step(conn->statement);
473 return sql_check_error(conn->db);
476 static sql_rcode_t sql_store_result(UNUSED rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
481 static int sql_num_fields(rlm_sql_handle_t * handle, UNUSED rlm_sql_config_t *config)
483 rlm_sql_sqlite_conn_t *conn = handle->conn;
485 if (conn->statement) {
486 return sqlite3_column_count(conn->statement);
492 static int sql_num_rows(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
494 rlm_sql_sqlite_conn_t *conn = handle->conn;
496 if (conn->statement) {
497 return sqlite3_data_count(conn->statement);
503 static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, rlm_sql_config_t *config)
506 rlm_sql_sqlite_conn_t *conn = handle->conn;
513 * Executes the SQLite query and interates over the results
515 status = sqlite3_step(conn->statement);
518 * Error getting next row
520 if (sql_check_error(conn->db)) {
525 * No more rows to process (were done)
527 if (status == SQLITE_DONE) {
532 * We only need to do this once per result set, because
533 * the number of columns won't change.
535 if (conn->col_count == 0) {
536 conn->col_count = sql_num_fields(handle, config);
537 if (conn->col_count == 0) {
543 * Free the previous result (also gets called on finish_query)
545 talloc_free(handle->row);
547 MEM(row = handle->row = talloc_zero_array(handle->conn, char *, conn->col_count + 1));
549 for (i = 0; i < conn->col_count; i++) {
550 switch (sqlite3_column_type(conn->statement, i)) {
552 MEM(row[i] = talloc_typed_asprintf(row, "%d", sqlite3_column_int(conn->statement, i)));
556 MEM(row[i] = talloc_typed_asprintf(row, "%f", sqlite3_column_double(conn->statement, i)));
562 p = (char const *) sqlite3_column_text(conn->statement, i);
565 MEM(row[i] = talloc_typed_strdup(row, p));
575 p = sqlite3_column_blob(conn->statement, i);
577 len = sqlite3_column_bytes(conn->statement, i);
579 MEM(row[i] = talloc_zero_array(row, char, len + 1));
580 memcpy(row[i], p, len);
593 static sql_rcode_t sql_free_result(rlm_sql_handle_t *handle,
594 UNUSED rlm_sql_config_t *config)
596 rlm_sql_sqlite_conn_t *conn = handle->conn;
598 if (conn->statement) {
599 TALLOC_FREE(handle->row);
601 (void) sqlite3_finalize(conn->statement);
602 conn->statement = NULL;
607 * There's no point in checking the code returned by finalize
608 * as it'll have already been encountered elsewhere in the code.
610 * It's just the last error that occurred processing the
616 static char const *sql_error(rlm_sql_handle_t *handle,
617 UNUSED rlm_sql_config_t *config)
619 rlm_sql_sqlite_conn_t *conn = handle->conn;
622 return sqlite3_errmsg(conn->db);
625 return "Invalid handle";
628 static sql_rcode_t sql_finish_query(rlm_sql_handle_t *handle,
629 UNUSED rlm_sql_config_t *config)
631 return sql_free_result(handle, config);
634 static int sql_affected_rows(rlm_sql_handle_t *handle,
635 UNUSED rlm_sql_config_t *config)
637 rlm_sql_sqlite_conn_t *conn = handle->conn;
640 return sqlite3_changes(conn->db);
647 /* Exported to rlm_sql */
648 rlm_sql_module_t rlm_sql_sqlite = {
649 .name = "rlm_sql_sqlite",
650 .mod_instantiate = mod_instantiate,
651 .sql_socket_init = sql_socket_init,
652 .sql_query = sql_query,
653 .sql_select_query = sql_select_query,
654 .sql_store_result = sql_store_result,
655 .sql_num_fields = sql_num_fields,
656 .sql_num_rows = sql_num_rows,
657 .sql_affected_rows = sql_affected_rows,
658 .sql_fetch_row = sql_fetch_row,
659 .sql_free_result = sql_free_result,
660 .sql_error = sql_error,
661 .sql_finish_query = sql_finish_query,
662 .sql_finish_select_query = sql_finish_query