From 80f6f8fd47d300a72c360111c99f6abbbb1343a8 Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Fri, 27 Jan 2023 20:25:40 +0200 Subject: [PATCH] lib-sql: driver-sqlite - Handle CANTOPEN like READONLY Older SQLite will not use READONLY. --- src/lib-sql/driver-sqlite.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/lib-sql/driver-sqlite.c b/src/lib-sql/driver-sqlite.c index 039ad4c2f7..a194f09161 100644 --- a/src/lib-sql/driver-sqlite.c +++ b/src/lib-sql/driver-sqlite.c @@ -240,7 +240,7 @@ static void driver_sqlite_result_log(const struct sql_result *result, const char db->rc); i_fatal_status(FATAL_OUTOFMEM, SQL_QUERY_FINISHED_FMT"%s", query, duration, suffix); - } else if (db->rc == SQLITE_READONLY) { + } else if (db->rc == SQLITE_READONLY || db->rc == SQLITE_CANTOPEN) { const char *eacces_err = eacces_error_get("write", db->dbfile); suffix = t_strconcat(": ", eacces_err, NULL); e->add_str("error", eacces_err); @@ -465,10 +465,19 @@ static const char *driver_sqlite_result_get_error(struct sql_result *_result) if (db->connected) { const char *err = sqlite3_errmsg(db->sqlite); - if (db->rc == SQLITE_READONLY) + if (db->rc == SQLITE_READONLY || db->rc == SQLITE_CANTOPEN) err = t_strconcat(err, ": ", eacces_error_get("write", db->dbfile), NULL); return err; + } else if (db->rc == SQLITE_CANTOPEN) { + struct stat st; + const char *err; + if (stat(db->dbfile, &st) == -1 && errno == ENOENT) { + err = eacces_error_get_creating("creat", db->dbfile); + } else { + err = eacces_error_get("open", db->dbfile); + } + return t_strconcat("Cannot connect to database: ", err, NULL); } else { return "Cannot connect to database"; } -- 2.47.3