#endif
#ifndef HAVE_SQLITE3_INT64
-typedef sqlite3_int64 sqlite_int64
+typedef sqlite_int64 sqlite3_int64;
#endif
typedef struct rlm_sql_sqlite_conn {
static const CONF_PARSER driver_config[] = {
{ "filename", FR_CONF_OFFSET(PW_TYPE_FILE_OUTPUT | PW_TYPE_REQUIRED, rlm_sql_sqlite_config_t, filename), NULL },
{ "busy_timeout", FR_CONF_OFFSET(PW_TYPE_INTEGER, rlm_sql_sqlite_config_t, busy_timeout), "200" },
- {NULL, -1, 0, NULL, NULL}
+ CONF_PARSER_TERMINATOR
};
/** Convert an sqlite status code to an sql_rcode_t
*/
if ((status != SQLITE_OK) && (status != hstatus)) {
#ifdef HAVE_SQLITE3_ERRSTR
- ERROR("rlm_sql_sqlite: %s: code 0x%x (%i): %s", p, status, status, sqlite3_errstr(status));
+ ERROR("rlm_sql_sqlite: %s: Code 0x%04x (%i): %s", p, status, status, sqlite3_errstr(status));
#else
- ERROR("rlm_sql_sqlite: %s: code 0x%x (%i)", p, status, status);
+ ERROR("rlm_sql_sqlite: %s: Code 0x%04x (%i)", p, status, status);
#endif
}
- if (hstatus != SQLITE_OK) ERROR("rlm_sql_sqlite: %s: code 0x%x (%i): %s",
+ if (hstatus != SQLITE_OK) ERROR("rlm_sql_sqlite: %s: Code 0x%04x (%i): %s",
p, hstatus, hstatus, sqlite3_errmsg(db));
}
static int sql_loadfile(TALLOC_CTX *ctx, sqlite3 *db, char const *filename)
{
ssize_t len;
- int line = 0;
+ int statement_cnt = 0;
char *buffer;
char *p, *q, *s;
int cl;
if ((*p != 0x0a) && (*p != 0x0d) && (*p != '\t')) break;
cl = 1;
} else {
- cl = fr_utf8_char((uint8_t *) p);
+ cl = fr_utf8_char((uint8_t *) p, -1);
if (!cl) break;
}
}
while ((q = strchr(p, ';'))) {
if (q[1] != '\n') {
p = q + 1;
- line++;
+ statement_cnt++;
continue;
}
#ifdef HAVE_SQLITE3_PREPARE_V2
status = sqlite3_prepare_v2(db, s, len, &statement, &z_tail);
#else
- status = sqlite3_prepare(db, s, len, &>statement, &z_tail);
+ status = sqlite3_prepare(db, s, len, &statement, &z_tail);
#endif
if (sql_check_error(db, status) != RLM_SQL_OK) {
- sql_print_error(db, status, "[%i] Error preparing statement", line);
+ sql_print_error(db, status, "Failed preparing statement %i", statement_cnt);
talloc_free(buffer);
return -1;
}
status = sqlite3_step(statement);
if (sql_check_error(db, status) != RLM_SQL_OK) {
- sql_print_error(db, status, "[%i] Error executing statement", line);
+ sql_print_error(db, status, "Failed executing statement %i", statement_cnt);
sqlite3_finalize(statement);
talloc_free(buffer);
return -1;
status = sqlite3_finalize(statement);
if (sql_check_error(db, status) != RLM_SQL_OK) {
- sql_print_error(db, status, "[%i] Error finalizing statement", line);
+ sql_print_error(db, status, "Failed finalizing statement %i", statement_cnt);
talloc_free(buffer);
return -1;
}
- line++;
+ statement_cnt++;
p = s = q + 1;
}
INFO("rlm_sql_sqlite: Opening SQLite database \"%s\"", driver->filename);
#ifdef HAVE_SQLITE3_OPEN_V2
status = sqlite3_open_v2(driver->filename, &(conn->db), SQLITE_OPEN_READWRITE | SQLITE_OPEN_NOMUTEX, NULL);
+ sqlite3_busy_timeout( conn->db, 200); /*wait up to 200 ms for db locks*/
#else
+
status = sqlite3_open(driver->filename, &(conn->db));
#endif
char **row;
+ TALLOC_FREE(handle->row);
+
/*
* Executes the SQLite query and interates over the results
*/
/*
* No more rows to process (were done)
*/
- if (status == SQLITE_DONE) {
- return 1;
- }
+ if (status == SQLITE_DONE) return RLM_SQL_NO_MORE_ROWS;
/*
* We only need to do this once per result set, because
if (conn->col_count == 0) return RLM_SQL_ERROR;
}
- /*
- * Free the previous result (also gets called on finish_query)
- */
- talloc_free(handle->row);
-
MEM(row = handle->row = talloc_zero_array(handle->conn, char *, conn->col_count + 1));
for (i = 0; i < conn->col_count; i++) {
}
}
- return 0;
+ return RLM_SQL_OK;
}
static sql_rcode_t sql_free_result(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
* It's just the last error that occurred processing the
* statement.
*/
- return 0;
+ return RLM_SQL_OK;
}
/** Retrieves any errors associated with the connection handle
{
rlm_sql_sqlite_conn_t *conn = handle->conn;
- if (conn->db) {
- return sqlite3_changes(conn->db);
- }
+ if (conn->db) return sqlite3_changes(conn->db);
return -1;
}