]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/nfsdcltrack/sqlite.c
nfsdcltrack: break out a function to open the database handle
[nfs-utils.git] / utils / nfsdcltrack / sqlite.c
index c19af7e19e3dd8a3514d0c594fea7fcaf4a3ef08..bac678980938f9ff7438a2459c11ab3fb04946b5 100644 (file)
@@ -90,24 +90,15 @@ mkdir_if_not_exist(const char *dirname)
        return ret;
 }
 
-/*
- * Open the "main" database, and attempt to initialize it by creating the
- * parameters table and inserting the schema version into it. Ignore any errors
- * from that, and then attempt to select the version out of it again. If the
- * version appears wrong, then assume that the DB is corrupt or has been
- * upgraded, and return an error. If all of that works, then attempt to create
- * the "clients" table.
- */
+/* Open the database and set up the database handle for it */
 int
-sqlite_maindb_init(const char *topdir)
+sqlite_prepare_dbh(const char *topdir)
 {
        int ret;
-       char *err = NULL;
-       sqlite3_stmt *stmt = NULL;
 
-       ret = mkdir_if_not_exist(topdir);
-       if (ret)
-               return ret;
+       /* Do nothing if the database handle is already set up */
+       if (dbh)
+               return 0;
 
        ret = snprintf(buf, PATH_MAX - 1, "%s/main.sqlite", topdir);
        if (ret < 0)
@@ -118,15 +109,43 @@ sqlite_maindb_init(const char *topdir)
        ret = sqlite3_open(buf, &dbh);
        if (ret != SQLITE_OK) {
                xlog(L_ERROR, "Unable to open main database: %d", ret);
+               dbh = NULL;
                return ret;
        }
 
        ret = sqlite3_busy_timeout(dbh, CLD_SQLITE_BUSY_TIMEOUT);
        if (ret != SQLITE_OK) {
                xlog(L_ERROR, "Unable to set sqlite busy timeout: %d", ret);
-               goto out_err;
+               sqlite3_close(dbh);
+               dbh = NULL;
        }
 
+       return ret;
+}
+
+/*
+ * Open the "main" database, and attempt to initialize it by creating the
+ * parameters table and inserting the schema version into it. Ignore any errors
+ * from that, and then attempt to select the version out of it again. If the
+ * version appears wrong, then assume that the DB is corrupt or has been
+ * upgraded, and return an error. If all of that works, then attempt to create
+ * the "clients" table.
+ */
+int
+sqlite_maindb_init(const char *topdir)
+{
+       int ret;
+       char *err = NULL;
+       sqlite3_stmt *stmt = NULL;
+
+       ret = mkdir_if_not_exist(topdir);
+       if (ret)
+               return ret;
+
+       ret = sqlite_prepare_dbh(topdir);
+       if (ret)
+               return ret;
+
        /* Try to create table */
        ret = sqlite3_exec(dbh, "CREATE TABLE IF NOT EXISTS parameters "
                                "(key TEXT PRIMARY KEY, value TEXT);",