]> pd.if.org Git - zpackage/blobdiff - lib/zpm.c
cleanup sqlite references
[zpackage] / lib / zpm.c
index 011dba77234f2f4099709d407484a8a73e448618..96c355415e23ccf293993fc8a7ab0a013b7ee1e7 100644 (file)
--- a/lib/zpm.c
+++ b/lib/zpm.c
@@ -6,6 +6,7 @@
 #include <sys/mman.h>
 #include <unistd.h>
 #include <fcntl.h>
+#include <errno.h>
 
 #include "zpm.h"
 
@@ -189,11 +190,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 +286,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 +326,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 */
 
@@ -304,7 +410,7 @@ int zpm_extract(struct zpm *pkg, char *hash, char *path, int mode) {
        }
        //fwrite(xzdata, blobsize, 1, stdout);
 
-       fprintf(stderr, "uncompressing %d bytes at %p, expect %lld\n", blobsize, xzdata, (long long int)size);
+       //fprintf(stderr, "uncompressing %d bytes at %p, expect %lld\n", blobsize, xzdata, (long long int)size);
        uncompresslzma(xzdata, blobsize, out);
        fclose(out);
 
@@ -342,19 +448,23 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
        /* mmap the file */
        fd = open(path, O_RDONLY);
        if (fd == -1) {
+               fprintf(stderr, "%s can't open %s: %s\n", __FUNCTION__, path,strerror(errno));
                return 0;
        }
        if (fstat(fd, &sbuf) == -1) {
+               fprintf(stderr, "%s can't fstat %s: %s\n", __FUNCTION__, path,strerror(errno));
                return 0;
        }
        /* not a regular file? */
        if (!S_ISREG(sbuf.st_mode)) {
                /* TODO this is ok, just stored differently */
+               fprintf(stderr, "%s non-regular files unsupported %s\n", __FUNCTION__, path);
                return 0;
        }
 
        content = mmap(0, sbuf.st_size, PROT_READ,MAP_PRIVATE, fd, 0);
        if (!content) {
+               fprintf(stderr, "%s can't mmap %s: %s\n", __FUNCTION__, path,strerror(errno));
                return 0;
        }
 
@@ -368,12 +478,11 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
        hash[64] = 0;
        fprintf(stderr, "file %s: %s\n", path, hash);
 
-
        /* prepare and bind */
        /* 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;