*************************************************/
/* Copyright (c) University of Cambridge 1995 - 2018 */
+/* Copyright (c) The Exim Maintainers 2020 */
/* See the file NOTICE for conditions of use and distribution. */
#include "../exim.h"
sqlite3 *db = NULL;
int ret;
-if ((ret = sqlite3_open(CCS filename, &db)) != 0)
+if (!filename || !*filename)
+ {
+ DEBUG(D_lookup) debug_printf_indent("Using sqlite_dbfile: %s\n", sqlite_dbfile);
+ filename = sqlite_dbfile;
+ }
+if (!filename || *filename != '/')
+ *errmsg = US"absolute file name expected for \"sqlite\" lookup";
+else if ((ret = sqlite3_open(CCS filename, &db)) != 0)
{
*errmsg = (void *)sqlite3_errmsg(db);
- debug_printf_indent("Error opening database: %s\n", *errmsg);
+ sqlite3_close(db);
+ db = NULL;
+ DEBUG(D_lookup) debug_printf_indent("Error opening database: %s\n", *errmsg);
}
-sqlite3_busy_timeout(db, 1000 * sqlite_lock_timeout);
+if (db)
+ sqlite3_busy_timeout(db, 1000 * sqlite_lock_timeout);
return db;
}
static int
sqlite_find(void * handle, const uschar * filename, const uschar * query,
- int length, uschar ** result, uschar ** errmsg, uint * do_cache)
+ int length, uschar ** result, uschar ** errmsg, uint * do_cache,
+ const uschar * opts)
{
int ret;
gstring * res = NULL;
-ret = sqlite3_exec(handle, CS query, sqlite_callback, &res, (char **)errmsg);
+ret = sqlite3_exec(handle, CS query, sqlite_callback, &res, CSS errmsg);
if (ret != SQLITE_OK)
{
debug_printf_indent("sqlite3_exec failed: %s\n", *errmsg);
}
static lookup_info _lookup_info = {
- US"sqlite", /* lookup name */
- lookup_absfilequery, /* query-style lookup, starts with file name */
- sqlite_open, /* open function */
- NULL, /* no check function */
- sqlite_find, /* find function */
- sqlite_close, /* close function */
- NULL, /* no tidy function */
- sqlite_quote, /* quoting function */
- sqlite_version_report /* version reporting */
+ .name = US"sqlite", /* lookup name */
+ .type = lookup_absfilequery, /* query-style lookup, starts with file name */
+ .open = sqlite_open, /* open function */
+ .check = NULL, /* no check function */
+ .find = sqlite_find, /* find function */
+ .close = sqlite_close, /* close function */
+ .tidy = NULL, /* no tidy function */
+ .quote = sqlite_quote, /* quoting function */
+ .version_report = sqlite_version_report /* version reporting */
};
#ifdef DYNLOOKUP