Add GREATEST(x, ...) to sqlite to support sqlcounter
[freeradius.git] / src / modules / rlm_sql / drivers / rlm_sql_sqlite / rlm_sql_sqlite.c
1 /*
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.
5  *
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.
10  *
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
14  */
15
16 /**
17  * $Id$
18  * @file rlm_sql_sqlite.c
19  * @brief SQLite driver.
20  *
21  * @copyright 2013 Network RADIUS SARL <info@networkradius.com>
22  * @copyright 2007 Apple Inc.
23  */
24
25 RCSID("$Id$")
26
27 #include <freeradius-devel/radiusd.h>
28
29 #include <fcntl.h>
30 #include <sys/stat.h>
31
32 #include <sqlite3.h>
33
34 #include "rlm_sql.h"
35 #include "config.h"
36
37 #define BOOTSTRAP_MAX (1048576 * 10)
38
39 /*
40  *      Allow us to use versions < 3.6.0 beta0
41  */
42 #ifndef SQLITE_OPEN_NOMUTEX
43 #  define SQLITE_OPEN_NOMUTEX 0
44 #endif
45
46 typedef struct rlm_sql_sqlite_conn {
47         sqlite3 *db;
48         sqlite3_stmt *statement;
49         int col_count;
50 } rlm_sql_sqlite_conn_t;
51
52 typedef struct rlm_sql_sqlite_config {
53         char const *filename;
54         char const *bootstrap;
55 } rlm_sql_sqlite_config_t;
56
57 static const CONF_PARSER driver_config[] = {
58         {"filename", PW_TYPE_FILE_OUTPUT | PW_TYPE_REQUIRED,
59          offsetof(rlm_sql_sqlite_config_t, filename), NULL, NULL},
60         {"bootstrap", PW_TYPE_FILE_INPUT,
61          offsetof(rlm_sql_sqlite_config_t, bootstrap), NULL, NULL},
62
63         {NULL, -1, 0, NULL, NULL}
64 };
65
66 static int sql_check_error(sqlite3 *db)
67 {
68         int error = sqlite3_errcode(db);
69         switch(error) {
70         /*
71          *      Not errors
72          */
73         case SQLITE_OK:
74         case SQLITE_DONE:
75         case SQLITE_ROW:
76                 return 0;
77         /*
78          *      User/transient errors
79          */
80         case SQLITE_ERROR:      /* SQL error or missing database */
81         case SQLITE_FULL:
82         case SQLITE_CONSTRAINT:
83         case SQLITE_MISMATCH:
84                 ERROR("rlm_sql_sqlite: Error (%d): %s", error, sqlite3_errmsg(db));
85
86                 return -1;
87                 break;
88
89         /*
90          *      Errors with the handle, that probably require reinitialisation
91          */
92         default:
93                 ERROR("rlm_sql_sqlite: Handle is unusable, error (%d): %s", error, sqlite3_errmsg(db));
94                 return RLM_SQL_RECONNECT;
95                 break;
96         }
97 }
98
99 #ifdef HAVE_SQLITE_V2_API
100 static int sql_loadfile(TALLOC_CTX *ctx, sqlite3 *db, char const *filename)
101 {
102         ssize_t len;
103         char *buffer;
104         char *p, *q, *s;
105         int cl;
106         FILE *f;
107         struct stat finfo;
108
109         int status;
110         sqlite3_stmt *statement;
111         char const *z_tail;
112
113         INFO("rlm_sql_sqlite: Executing SQL statements from file \"%s\"", filename);
114
115         f = fopen(filename, "r");
116         if (!f) {
117                 ERROR("rlm_sql_sqlite: Failed opening SQL file \"%s\": %s", filename,
118                        strerror(errno));
119
120                 return -1;
121         }
122
123         if (fstat(fileno(f), &finfo) < 0) {
124                 ERROR("rlm_sql_sqlite: Failed stating SQL file \"%s\": %s", filename,
125                        strerror(errno));
126
127                 fclose(f);
128
129                 return -1;
130         }
131
132         if (finfo.st_size > BOOTSTRAP_MAX) {
133                 too_big:
134                 ERROR("rlm_sql_sqlite: Size of SQL (%zu) file exceeds limit (%uk)",
135                        (size_t) finfo.st_size / 1024, BOOTSTRAP_MAX / 1024);
136
137                 fclose(f);
138
139                 return -1;
140         }
141
142         MEM(buffer = talloc_array(ctx, char, finfo.st_size + 1));
143         len = fread(buffer, sizeof(char), finfo.st_size + 1, f);
144         if (len > finfo.st_size) {
145                 talloc_free(buffer);
146                 goto too_big;
147         }
148
149         if (!len) {
150                 if (ferror(f)) {
151                         ERROR("rlm_sql_sqlite: Error reading SQL file: %s", strerror(errno));
152
153                         fclose(f);
154                         talloc_free(buffer);
155
156                         return -1;
157                 }
158
159                 DEBUG("rlm_sql_sqlite: Ignoring empty SQL file");
160
161                 fclose(f);
162                 talloc_free(buffer);
163
164                 return 0;
165         }
166
167         buffer[len] = '\0';
168         fclose(f);
169
170         /*
171          *      Check if input data is UTF-8.  Allow CR/LF \t, too.
172          */
173         for (p = buffer; p < (buffer + len); p += cl) {
174                 if (*p < ' ') {
175                         if ((*p != 0x0a) && (*p != 0x0d) && (*p != '\t')) break;
176                         cl = 1;
177                 } else {
178                         cl = fr_utf8_char((uint8_t *) p);
179                         if (!cl) break;
180                 }
181         }
182
183         if ((p - buffer) != len) {
184                 ERROR("rlm_sql_sqlite: Bootstrap file contains non-UTF8 char at offset %zu", p - buffer);
185                 talloc_free(buffer);
186                 return -1;
187         }
188
189         /*
190          *      Statement delimiter is ;\n
191          */
192         s = p = buffer;
193         while ((q = strchr(p, ';'))) {
194                 if (q[1] != '\n') {
195                         p = q + 1;
196                         continue;
197                 }
198
199                 *q = '\0';
200
201                 (void) sqlite3_prepare_v2(db, s, len, &statement, &z_tail);
202                 if (sql_check_error(db)) {
203                         talloc_free(buffer);
204                         return -1;
205                 }
206
207                 (void) sqlite3_step(statement);
208                 status = sql_check_error(db);
209
210                 (void) sqlite3_finalize(statement);
211                 if (status || sql_check_error(db)) {
212                         talloc_free(buffer);
213                         return -1;
214                 }
215
216                 p = s = q + 1;
217         }
218
219         talloc_free(buffer);
220         return 0;
221 }
222 #endif
223
224 static int mod_instantiate(CONF_SECTION *conf, rlm_sql_config_t *config)
225 {
226         rlm_sql_sqlite_config_t *driver;
227         int exists;
228
229         if (sqlite3_libversion_number() != SQLITE_VERSION_NUMBER) {
230                 DEBUG2("rlm_sql_sqlite: SQLite library version (%s) is different from the version the server was "
231                        "originally built against (%s), this may cause issues",
232                        sqlite3_libversion(), SQLITE_VERSION);
233         }
234
235         MEM(driver = config->driver = talloc_zero(config, rlm_sql_sqlite_config_t));
236
237         if (cf_section_parse(conf, driver, driver_config) < 0) {
238                 return -1;
239         }
240
241         INFO("rlm_sql_sqlite: SQLite library version: %s", sqlite3_libversion());
242         if (!driver->filename) {
243                 MEM(driver->filename = talloc_asprintf(driver, "%s/%s", radius_dir, config->sql_db));
244         }
245
246         exists = rad_file_exists(driver->filename);
247         if (exists < 0) {
248                 ERROR("rlm_sql_sqlite: Database exists, but couldn't be opened: %s", strerror(errno));
249
250                 return -1;
251         }
252
253         if (driver->bootstrap && !exists) {
254 #ifdef HAVE_SQLITE_V2_API
255                 int status;
256                 int ret;
257                 char *p;
258                 char *buff;
259                 sqlite3 *db = NULL;
260
261                 INFO("rlm_sql_sqlite: Database doesn't exist, creating it and loading schema");
262
263                 p = strrchr(driver->filename, '/');
264                 if (p) {
265                         size_t len = (p - driver->filename) + 1;
266
267                         buff = talloc_array(conf, char, len);
268                         strlcpy(buff, driver->filename, len);
269                 } else {
270                         MEM(buff = talloc_strdup(conf, driver->filename));
271                 }
272
273                 if (rad_mkdir(buff, 0700) < 0) {
274                         ERROR("rlm_sql_sqlite: Failed creating directory for SQLite database");
275
276                         talloc_free(buff);
277
278                         return -1;
279                 }
280
281                 talloc_free(buff);
282
283                 status = sqlite3_open_v2(driver->filename, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
284                 if (!db) {
285                         ERROR("rlm_sql_sqlite: Failed creating opening/creating SQLite database, error "
286                                "code (%u)", status);
287
288                         goto unlink;
289                 }
290
291                 if (sql_check_error(db)) {
292                         (void) sqlite3_close(db);
293
294                         goto unlink;
295                 }
296
297                 ret = sql_loadfile(conf, db, driver->bootstrap);
298
299                 status = sqlite3_close(db);
300                 if (status != SQLITE_OK) {
301                         ERROR("rlm_sql_sqlite: Error closing SQLite handle, error code (%u)", status);
302                         goto unlink;
303                 }
304
305                 if (ret < 0) {
306                         unlink:
307                         if (unlink(driver->filename) < 0) {
308                                 ERROR("rlm_sql_sqlite: Error removing partially initialised database: %s",
309                                        strerror(errno));
310                         }
311                         return -1;
312                 }
313 #else
314                 WDEBUG("rlm_sql_sqlite: sqlite3_open_v2() not available, cannot bootstrap database. "
315                        "Upgrade to SQLite >= 3.5.1 if you need this functionality");
316 #endif
317         }
318
319         return 0;
320 }
321
322 static int sql_socket_destructor(void *c)
323 {
324         int status = 0;
325         rlm_sql_sqlite_conn_t * conn = c;
326
327         DEBUG2("rlm_sql_sqlite: Socket destructor called, closing socket");
328
329         if (conn->db) {
330                 status = sqlite3_close(conn->db);
331                 if (status != SQLITE_OK) {
332                         WDEBUG("rlm_sql_sqlite: Got SQLite error code (%u) when closing socket", status);
333                 }
334         }
335
336         return 0;
337 }
338
339 static void _sql_greatest(sqlite3_context *ctx, int num_values, sqlite3_value **values)
340 {
341         int i;
342         sqlite3_int64 value, max = 0;
343
344         for (i = 0; i < num_values; i++) {
345                 value = sqlite3_value_int64(values[i]);
346                 if (value < max) {
347                         max = value;
348                 }
349         }
350
351         sqlite3_result_int64(ctx, max);
352 }
353
354 static sql_rcode_t sql_socket_init(rlm_sql_handle_t *handle, rlm_sql_config_t *config)
355 {
356         rlm_sql_sqlite_conn_t *conn;
357         rlm_sql_sqlite_config_t *driver = config->driver;
358
359         int status;
360
361         MEM(conn = handle->conn = talloc_zero(handle, rlm_sql_sqlite_conn_t));
362         talloc_set_destructor((void *) conn, sql_socket_destructor);
363
364         INFO("rlm_sql_sqlite: Opening SQLite database \"%s\"", driver->filename);
365
366 #ifdef HAVE_SQLITE_V2_API
367         status = sqlite3_open_v2(driver->filename, &(conn->db), SQLITE_OPEN_READWRITE | SQLITE_OPEN_NOMUTEX, NULL);
368 #else
369         status = sqlite3_open(driver->filename, &(conn->db));
370 #endif
371         if (!conn->db) {
372                 ERROR("rlm_sql_sqlite: Failed creating opening/creating SQLite database error code (%u)",
373                        status);
374
375                 return -1;
376         }
377
378         if (sql_check_error(conn->db)) {
379                 return -1;
380         }
381
382         /*
383          *      Enable extended return codes for extra debugging info.
384          */
385         status = sqlite3_extended_result_codes(conn->db, 1);
386
387         if (sql_check_error(conn->db)) {
388                 return -1;
389         }
390
391 #ifdef HAVE_SQLITE_V2_API
392         status = sqlite3_create_function_v2(conn->db, "GREATEST", -1, SQLITE_ANY, NULL,
393                                             _sql_greatest, NULL, NULL, NULL);
394 #else
395         status = sqlite3_create_function(conn->db, "GREATEST", -1, SQLITE_ANY, NULL,
396                                          _sql_greatest, NULL, NULL);
397 #endif
398         if (status != SQLITE_OK) {
399                 ERROR("rlm_sql_sqlite: Failed registering 'GREATEST' sql function: %s", sqlite3_errmsg(conn->db));
400         }
401
402         return 0;
403 }
404
405 static sql_rcode_t sql_select_query(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config, char const *query)
406 {
407         rlm_sql_sqlite_conn_t *conn = handle->conn;
408         char const *z_tail;
409
410 #ifdef HAVE_SQLITE_V2_API
411         (void) sqlite3_prepare_v2(conn->db, query, strlen(query), &conn->statement, &z_tail);
412 #else
413         (void) sqlite3_prepare(conn->db, query, strlen(query), &conn->statement, &z_tail);
414 #endif
415
416         conn->col_count = 0;
417
418         return sql_check_error(conn->db);
419 }
420
421
422 static sql_rcode_t sql_query(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config, char const *query)
423 {
424         int status;
425         rlm_sql_sqlite_conn_t *conn = handle->conn;
426         char const *z_tail;
427
428 #ifdef HAVE_SQLITE_V2_API
429         status = sqlite3_prepare_v2(conn->db, query, strlen(query), &conn->statement, &z_tail);
430 #else
431         status = sqlite3_prepare(conn->db, query, strlen(query), &conn->statement, &z_tail);
432 #endif
433         if (status != SQLITE_OK) {
434                 return sql_check_error(conn->db);
435         }
436
437         (void) sqlite3_step(conn->statement);
438
439         return sql_check_error(conn->db);
440 }
441
442 static sql_rcode_t sql_store_result(UNUSED rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
443 {
444         return 0;
445 }
446
447 static int sql_num_fields(rlm_sql_handle_t * handle, UNUSED rlm_sql_config_t *config)
448 {
449         rlm_sql_sqlite_conn_t *conn = handle->conn;
450
451         if (conn->statement) {
452                 return sqlite3_column_count(conn->statement);
453         }
454
455         return 0;
456 }
457
458 static int sql_num_rows(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
459 {
460         rlm_sql_sqlite_conn_t *conn = handle->conn;
461
462         if (conn->statement) {
463                 return sqlite3_data_count(conn->statement);
464         }
465
466         return 0;
467 }
468
469 static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, rlm_sql_config_t *config)
470 {
471         int status;
472         rlm_sql_sqlite_conn_t *conn = handle->conn;
473
474         int i = 0;
475
476         char **row;
477
478         /*
479          *      Executes the SQLite query and interates over the results
480          */
481         status = sqlite3_step(conn->statement);
482
483         /*
484          *      Error getting next row
485          */
486         if (sql_check_error(conn->db)) {
487                 return -1;
488         }
489
490         /*
491          *      No more rows to process (were done)
492          */
493         if (status == SQLITE_DONE) {
494                 return 1;
495         }
496
497         /*
498          *      We only need to do this once per result set, because
499          *      the number of columns won't change.
500          */
501         if (conn->col_count == 0) {
502                 conn->col_count = sql_num_fields(handle, config);
503                 if (conn->col_count == 0) {
504                         return -1;
505                 }
506         }
507
508         /*
509          *      Free the previous result (also gets called on finish_query)
510          */
511         talloc_free(handle->row);
512
513         MEM(row = handle->row = talloc_zero_array(handle->conn, char *, conn->col_count + 1));
514
515         for (i = 0; i < conn->col_count; i++) {
516                 switch (sqlite3_column_type(conn->statement, i)) {
517                 case SQLITE_INTEGER:
518                         MEM(row[i] = talloc_asprintf(row, "%d", sqlite3_column_int(conn->statement, i)));
519                         break;
520
521                 case SQLITE_FLOAT:
522                         MEM(row[i] = talloc_asprintf(row, "%f", sqlite3_column_double(conn->statement, i)));
523                         break;
524
525                 case SQLITE_TEXT:
526                         {
527                                 char const *p;
528                                 p = (char const *) sqlite3_column_text(conn->statement, i);
529
530                                 if (p) {
531                                         MEM(row[i] = talloc_strdup(row, p));
532                                 }
533                         }
534                         break;
535
536                 case SQLITE_BLOB:
537                         {
538                                 uint8_t const *p;
539                                 size_t len;
540
541                                 p = sqlite3_column_blob(conn->statement, i);
542                                 if (p) {
543                                         len = sqlite3_column_bytes(conn->statement, i);
544
545                                         MEM(row[i] = talloc_zero_array(row, char, len + 1));
546                                         memcpy(row[i], p, len);
547                                 }
548                         }
549                         break;
550
551                 default:
552                         break;
553                 }
554         }
555
556         return 0;
557 }
558
559 static sql_rcode_t sql_free_result(rlm_sql_handle_t *handle,
560                            UNUSED rlm_sql_config_t *config)
561 {
562         rlm_sql_sqlite_conn_t *conn = handle->conn;
563
564         if (conn->statement) {
565                 TALLOC_FREE(handle->row);
566
567                 (void) sqlite3_finalize(conn->statement);
568                 conn->statement = NULL;
569                 conn->col_count = 0;
570         }
571
572         /*
573          *      There's no point in checking the code returned by finalize
574          *      as it'll have already been encountered elsewhere in the code.
575          *
576          *      It's just the last error that occurred processing the
577          *      statement.
578          */
579         return 0;
580 }
581
582 static char const *sql_error(rlm_sql_handle_t *handle,
583                              UNUSED rlm_sql_config_t *config)
584 {
585         rlm_sql_sqlite_conn_t *conn = handle->conn;
586
587         if (conn->db) {
588                 return sqlite3_errmsg(conn->db);
589         }
590
591         return "Invalid handle";
592 }
593
594 static sql_rcode_t sql_finish_query(rlm_sql_handle_t *handle,
595                             UNUSED rlm_sql_config_t *config)
596 {
597         return sql_free_result(handle, config);
598 }
599
600 static int sql_affected_rows(rlm_sql_handle_t *handle,
601                              UNUSED rlm_sql_config_t *config)
602 {
603         rlm_sql_sqlite_conn_t *conn = handle->conn;
604
605         if (conn->db) {
606                 return sqlite3_changes(conn->db);
607         }
608
609         return -1;
610 }
611
612
613 /* Exported to rlm_sql */
614 rlm_sql_module_t rlm_sql_sqlite = {
615         "rlm_sql_sqlite",
616         mod_instantiate,
617         sql_socket_init,
618         sql_query,
619         sql_select_query,
620         sql_store_result,
621         sql_num_fields,
622         sql_num_rows,
623         sql_fetch_row,
624         sql_free_result,
625         sql_error,
626         sql_finish_query,
627         sql_finish_query,
628         sql_affected_rows
629 };