From: Aki Tuomi Date: Thu, 9 Oct 2025 09:53:26 +0000 (+0300) Subject: lib-sql: driver-sqlite - Extract connection error handling to driver_sqlite_connect_e... X-Git-Tag: 2.4.2~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0df1ef4cc3f0f64c7ea37d9a4390044599feeb8c;p=thirdparty%2Fdovecot%2Fcore.git lib-sql: driver-sqlite - Extract connection error handling to driver_sqlite_connect_error() --- diff --git a/src/lib-sql/driver-sqlite.c b/src/lib-sql/driver-sqlite.c index f50a22b0e5..8942f81fdc 100644 --- a/src/lib-sql/driver-sqlite.c +++ b/src/lib-sql/driver-sqlite.c @@ -109,10 +109,40 @@ static void driver_sqlite_disconnect(struct sql_db *_db) db->connected = FALSE; } +static const char *driver_sqlite_connect_error(struct sqlite_db *db) +{ + const char *err; + + switch (db->connect_rc) { + /* Should not end here with OK */ + case SQLITE_OK: + i_unreached(); + case SQLITE_CANTOPEN: + case SQLITE_PERM: + if (db->connect_errno == ENOENT) + err = eacces_error_get_creating("creat", db->set->path); + else if (db->connect_errno == EACCES) + err = eacces_error_get("open", db->set->path); + else { + err = t_strdup_printf("open(%s) failed: %s", + db->set->path, + strerror(db->connect_errno)); + } + break; + case SQLITE_NOMEM: + i_fatal_status(FATAL_OUTOFMEM, "open(%s) failed: %s", + db->set->path, sqlite3_errstr(db->connect_rc)); + default: + err = t_strdup_printf("open(%s) failed: %s", db->set->path, + sqlite3_errstr(db->connect_rc)); + break; + } + return err; +} + static int driver_sqlite_connect(struct sql_db *_db) { struct sqlite_db *db = container_of(_db, struct sqlite_db, api); - const char *err; /* this is default for sqlite_open */ int flags; @@ -134,29 +164,10 @@ static int driver_sqlite_connect(struct sql_db *_db) db->connected = TRUE; sqlite3_busy_timeout(db->sqlite, sqlite_busy_timeout); return 1; - case SQLITE_READONLY: - case SQLITE_CANTOPEN: - case SQLITE_PERM: - if (db->connect_errno == ENOENT) - err = eacces_error_get_creating("creat", db->set->path); - else if (db->connect_errno == EACCES) - err = eacces_error_get("open", db->set->path); - else { - err = t_strdup_printf("open(%s) failed: %s", - db->set->path, - strerror(db->connect_errno)); - } - i_free(_db->last_connect_error); - _db->last_connect_error = i_strdup(err); - e_error(_db->event, "%s", err); - break; - case SQLITE_NOMEM: - i_fatal_status(FATAL_OUTOFMEM, "open(%s) failed: %s", - db->set->path, sqlite3_errstr(db->connect_rc)); default: i_free(_db->last_connect_error); - _db->last_connect_error = i_strdup_printf("open(%s) failed: %s", db->set->path, - sqlite3_errstr(db->connect_rc)); + _db->last_connect_error = + i_strdup(driver_sqlite_connect_error(db)); e_error(_db->event, "%s", _db->last_connect_error); break; }