]> pd.if.org Git - zpackage/commitdiff
added db initialization and version detection
authorNathan Wagner <nw@hydaspes.if.org>
Sat, 17 Sep 2016 18:14:25 +0000 (13:14 -0500)
committerNathan Wagner <nw@hydaspes.if.org>
Sat, 17 Sep 2016 18:14:25 +0000 (13:14 -0500)
lib/zpm.c

index 011dba77234f2f4099709d407484a8a73e448618..7be8c1e2914da7b9b8a9a905e5d05a8ff3f23314 100644 (file)
--- a/lib/zpm.c
+++ b/lib/zpm.c
@@ -189,11 +189,94 @@ int zpm_rollback(struct zpm *z) {
        return 1;
 }
 
+int zpm_db_set_pragma(struct zpm *db, int pragma, int value) {
+       int rc;
+       char *sql;
+       sqlite3_stmt *s;
+
+       switch (pragma) {
+               case 1: sql = "pragma application_id = ?;"; break;
+               case 2: sql = "pragma user_version = ?;"; break;
+               default: return -1; break;
+       }
+
+       rc = sqlite3_prepare_v2(db->db, sql, -1, &s, 0);
+
+       if (rc != SQLITE_OK) {
+               SQLERROR(sqlite3_errmsg(db->db));
+               return -1;
+       }
+
+       sqlite3_bind_int(s, 1, value);
+       if (rc != SQLITE_OK) {
+               SQLERROR(sqlite3_errmsg(db->db));
+               fprintf(stderr, "cant bind pragma value\n");
+               sqlite3_finalize(s);
+               return -1;
+       }
+       rc = sqlite3_step(s);
+       if (rc != SQLITE_DONE) {
+               SQLERROR(sqlite3_errmsg(db->db));
+               fprintf(stderr, "cant set pragma\n");
+               sqlite3_finalize(s);
+               return -1;
+       }
+
+       sqlite3_finalize(s);
+       return value;
+}
+
+int zpm_db_pragma(struct zpm *db, int pragma) {
+       int rc;
+       int value = -1;
+       char *sql = 0;
+       sqlite3_stmt *s;
+
+       switch (pragma) {
+               case 1: sql = "pragma application_id;"; break;
+               case 2: sql = "pragma user_version;"; break;
+               default: return -1; break;
+       }
+
+       rc = sqlite3_prepare_v2(db->db, sql, -1, &s, 0);
+
+       if (rc != SQLITE_OK) {
+               SQLERROR(sqlite3_errmsg(db->db));
+               fprintf(stderr, "%s, errnum = %d\n", sqlite3_errmsg(db->db), rc);
+               /* TODO just abort? */
+               return -1;
+       }
+
+       rc = sqlite3_step(s);
+       if (rc == SQLITE_ROW) {
+               value = sqlite3_column_int(s, 0);
+       }
+
+       sqlite3_finalize(s);
+       return value;
+}
+
+static
+#include "newdb.c"
+
+int zpm_db_initialize(struct zpm *pkg) {
+       fprintf(stderr, "initializing zpm database\n");
+       switch (sqlite3_exec(pkg->db, createdb, (int (*)(void *,int,char **,char **))0, NULL, NULL)) {
+               case SQLITE_OK: break;
+               default:
+                       SQLERROR(sqlite3_errmsg(pkg->db));
+                       return 0;
+                       break;
+       }
+       return 1;
+}
+
 /* NULL?  Create? */
 int zpm_open(struct zpm *pkg, char *path) {
        int rc;
        char *errstr = 0;
        sqlite3 *db = 0;
+       int appid, dbver;
 
        pkg->db = 0;
        pkg->path = 0;
@@ -202,14 +285,38 @@ int zpm_open(struct zpm *pkg, char *path) {
        pkg->pkgname = 0;
        pkg->installed = 0;
 
-       /* TODO some way to determine if the DB is newly created ? */
-       /* could check for tables, if there are any, then check version, etc */
        rc = sqlite3_open(path, &db);
        if (rc) {
                SQLERROR(sqlite3_errmsg(db));
                sqlite3_close(db);
                return 0;
        }
+       pkg->db   = db;
+       pkg->path = dupstr(path);
+
+       appid = zpm_db_pragma(pkg, 1);
+       dbver = zpm_db_pragma(pkg, 2);
+
+       fprintf(stderr, "db appid = %x, dbver = %d\n", appid, dbver);
+       switch (appid) {
+               case 0: if (!zpm_db_initialize(pkg)) {
+                               sqlite3_close(db);
+                               return 1;
+                       };
+                       break;
+               case 0x5a504442: break;
+               default:
+                       fprintf(stderr, "unknown database type\n");
+                       sqlite3_close(db);
+                       return 0;
+                       break;
+       }
+       if (dbver > 1) {
+               fprintf(stderr, "version %d zpm db detected, this program only works with version 1 databases\n", dbver);
+                       sqlite3_close(db);
+                       return 0;
+       }
+
        sqlite3_exec(pkg->db, "pragma foreign_keys = ON;", NULL, NULL, &errstr);
        if (errstr) {
                fprintf(stderr, "sqlite foreign key error: %s\n", errstr);
@@ -218,8 +325,6 @@ int zpm_open(struct zpm *pkg, char *path) {
                return 0;
        }
 
-       pkg->path = dupstr(path);
-       pkg->db   = db;
 
        /* TODO if this is a new database, create structures */
 
@@ -373,7 +478,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
        /* TODO check null */
        sqlite3 *db = pkg->db;
 
-       rc = sqlite3_prepare(db, "select size, content is not null from files where hash = ?", -1, &ifile,0);
+       rc = sqlite3_prepare_v2(db, "select size, content is not null from files where hash = ?", -1, &ifile,0);
        if (rc != SQLITE_OK) {
                SQLERROR(sqlite3_errmsg(db));
                return 0;