]> pd.if.org Git - zpackage/blobdiff - lib/zpm.c
use stage instead of phase in script_hash
[zpackage] / lib / zpm.c
index 68d6fb9aabd44d134fc83ffa8145118e0b93a23b..9eb69c286b568e01708bbb707cb36f8434ebeee4 100644 (file)
--- a/lib/zpm.c
+++ b/lib/zpm.c
@@ -284,64 +284,124 @@ int zpm_db_initialize(struct zpm *pkg) {
        return 1;
 }
 
-/* NULL?  Create? */
-int zpm_open(struct zpm *pkg, char *path) {
-       int rc;
+
+/* assumes pkg->db is set */
+static int setupdb(struct zpm *zpm) {
        char *errstr = 0;
-       sqlite3 *db = 0;
        int appid, dbver;
 
-       pkg->db = 0;
-       pkg->path = 0;
-       pkg->version = 0;
-       pkg->release = 0;
-       pkg->pkgname = 0;
-       pkg->installed = 0;
+       zpm->error = 0;
+
+       appid = zpm_db_pragma(zpm, 1);
+       dbver = zpm_db_pragma(zpm, 2);
+
+       if (appid != 0x5a504442) {
+               fprintf(stderr, "unknown database type\n");
+               zpm->error = 1;
+               return 0;
+       }
+
+       if (dbver > 1) {
+               fprintf(stderr, "version %d zpm db detected, this program only works with version 1 databases\n", dbver);
+               zpm->error = 1;
+               return 0;
+       }
+
+       sqlite3_exec(zpm->db, "pragma foreign_keys = ON;", NULL, NULL, &errstr);
+
+       if (errstr) {
+               free(zpm->errmsg);
+               zpm->errmsg = strdup(errstr);
+               fprintf(stderr, "sqlite foreign key error: %s\n", errstr);
+               sqlite3_free(errstr);
+               zpm->error = 1;
+               return 0;
+       }
+
+       /* TODO add vercmp */
+
+       return 1;
+}
+
+struct zpm *zpm_clearmem(struct zpm *zpm) {
+       if (!zpm) {
+               zpm = malloc(sizeof *zpm);
+       }
+
+       if (zpm) {
+               *zpm = (struct zpm){0};
+       }
+
+       return zpm;
+}
+
+int zpm_init(struct zpm *pkg, char *path) {
+       int rc;
+       sqlite3 *db = 0;
+       int appid;
+
+       zpm_clearmem(pkg);
 
-       rc = sqlite3_open(path, &db);
+       rc = sqlite3_open_v2(path, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
        if (rc) {
                SQLERROR(sqlite3_errmsg(db));
                sqlite3_close(db);
                return 0;
        }
        pkg->db   = db;
-       pkg->path = dupstr(path);
+       pkg->path = strdup(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;
+               case 0x5a504442:
+                       /* already initialized */
+                       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);
-               sqlite3_free(errstr);
+       if (!setupdb(pkg)) {
                sqlite3_close(db);
+               pkg->db = 0;
                return 0;
        }
 
+       return 1;
+}
+
+int zpm_open(struct zpm *zpm, char *path) {
+       int rc;
+       sqlite3 *db = 0;
+
+       zpm_clearmem(zpm);
+
+       rc = sqlite3_open_v2(path, &db, SQLITE_OPEN_READWRITE, NULL);
+       if (rc) {
+               SQLERROR(sqlite3_errmsg(db));
+               sqlite3_close(db);
+               zpm->error = 1;
+               fprintf(stderr, "path = %s\n", path);
+               return 0;
+       }
+       zpm->db   = db;
+       zpm->path = strdup(path);
 
-       /* TODO if this is a new database, create structures */
+       if (!setupdb(zpm)) {
+               sqlite3_close(db);
+               zpm->db = 0;
+               zpm->error = 1;
+               return 0;
+       }
 
-       /* get a package. what if more than one? what if none? */
        return 1;
 }
 
@@ -371,24 +431,29 @@ int zpm_addvercmp(struct zpm *pkg) {
 }
 
 /* set package struct variables, database, environment, then command line */
-int zpm_readopts(struct zpm *pkg, int ac, char **av) {
+int zpm_readopts(struct zpm *zpm, int ac, char **av) {
        char *ev;
+       struct zpm_package *pkg;
 
-       if (!pkg) {
+       if (!zpm) {
                return -1;
        }
 
-       ev = getenv("ZPMPACKAGE");
-       if (ev) {
-               pkg->pkgname = dupstr(ev);
-       }
-       ev = getenv("ZPMPKGREL");
-       if (ev) {
-               pkg->release = strtol(ev, 0, 0);
-       }
-       ev = getenv("ZPMPKGVER");
-       if (ev) {
-               pkg->version = dupstr(ev);
+               pkg = zpm->current_package;
+
+       if (pkg) {
+               ev = getenv("ZPMPACKAGE");
+               if (ev) {
+                       pkg->name = dupstr(ev);
+               }
+               ev = getenv("ZPMPKGREL");
+               if (ev) {
+                       pkg->release = strtol(ev, 0, 0);
+               }
+               ev = getenv("ZPMPKGVER");
+               if (ev) {
+                       pkg->version = dupstr(ev);
+               }
        }
 
        /* now, parse the options, return optind so the caller can adjust if needed */
@@ -611,7 +676,9 @@ static int set_elf_info(sqlite3 *db, char *hash, char *content, size_t length) {
                                        need = strtab + dyn->d_un.d_val;
                                        if (strlen(need) == 0) continue;
                                        sqlite3_bind_text(ifile,2,need,strlen(need),SQLITE_STATIC);
+#if 0
                                        fprintf(stderr, "%s needs %s\n", hash, need);
+#endif
                                        rc = sqlite3_step(ifile);
                                        if (rc != SQLITE_DONE) {
                                                SQLERROR(sqlite3_errmsg(db));
@@ -630,7 +697,7 @@ static int set_elf_info(sqlite3 *db, char *hash, char *content, size_t length) {
 }
 
 #if 1
-int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
+int zpm_import(struct zpm *zpm, char *path, uint32_t flags, char *hash) {
        int fd;
        void *content;
        struct stat sbuf;
@@ -645,7 +712,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
        size_t outlen = 0;
        void *outbuf;
 
-       if (!pkg || !pkg->db || !path) {
+       if (!zpm || !zpm->db || !path) {
                return 0;
        }
 
@@ -660,12 +727,12 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
        /* mmap the file */
        fd = open(path, O_RDONLY);
        if (fd == -1) {
-               pkg->error = errno;
+               zpm->error = errno;
                fprintf(stderr, "%s can't open %s: %s\n", __FUNCTION__, path,strerror(errno));
                return 0;
        }
        if (fstat(fd, &sbuf) == -1) {
-               pkg->error = errno;
+               zpm->error = errno;
                fprintf(stderr, "%s can't fstat %s: %s\n", __FUNCTION__, path,strerror(errno));
                return 0;
        }
@@ -683,14 +750,14 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
                }
                /* TODO this is ok, just stored differently */
                fprintf(stderr, "%s can't import %s file: %s\n", __FUNCTION__, ftype, path);
-               pkg->error = EINVAL;
+               zpm->error = EINVAL;
                return 0;
        }
 
        content = mmap(0, sbuf.st_size, PROT_READ,MAP_PRIVATE, fd, 0);
        close(fd);
        if (!content) {
-               pkg->error = errno;
+               zpm->error = errno;
                fprintf(stderr, "%s can't mmap %s: %s\n", __FUNCTION__, path,strerror(errno));
                return 0;
        }
@@ -706,7 +773,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
        //fprintf(stderr, "file %s: %s\n", path, hash);
 
        /* TODO check null */
-       sqlite3 *db = pkg->db;
+       sqlite3 *db = zpm->db;
 
        /* prepare and bind */
 
@@ -727,7 +794,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
                if (rc != SQLITE_ROW) {
                        /* didn't find a row */
                        SQLERROR(sqlite3_errmsg(db));
-                       zpm_rollback(pkg);
+                       zpm_rollback(zpm);
                munmap(content, sbuf.st_size);
                        return 0;
                }
@@ -767,7 +834,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
 
                /* start a transaction */
                // do that outside of here 
-               //zpm_begin(pkg);
+               //zpm_begin(zpm);
 
                /* insert */
                if (haverow) {
@@ -780,7 +847,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
                if (rc != SQLITE_OK) {
                        SQLERROR(sqlite3_errmsg(db));
                        fprintf(stderr, "cant prepare data\n");
-                       zpm_rollback(pkg);
+                       zpm_rollback(zpm);
                munmap(content, sbuf.st_size);
                        return 0;
                }
@@ -789,7 +856,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
                if (rc != SQLITE_OK) {
                        SQLERROR(sqlite3_errmsg(db));
                        fprintf(stderr, "cant bind size\n");
-                       zpm_rollback(pkg);
+                       zpm_rollback(zpm);
                munmap(content, sbuf.st_size);
                        return 0;
                }
@@ -797,7 +864,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
                if (rc != SQLITE_OK) {
                        SQLERROR(sqlite3_errmsg(db));
                        fprintf(stderr, "cant bind content\n");
-                       zpm_rollback(pkg);
+                       zpm_rollback(zpm);
                munmap(content, sbuf.st_size);
                        return 0;
                }
@@ -805,7 +872,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
                if (rc != SQLITE_OK) {
                        SQLERROR(sqlite3_errmsg(db));
                        fprintf(stderr, "cant bind hash\n");
-                       zpm_rollback(pkg);
+                       zpm_rollback(zpm);
                munmap(content, sbuf.st_size);
                        return 0;
                }
@@ -813,20 +880,20 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
                if (rc != SQLITE_DONE) {
                        SQLERROR(sqlite3_errmsg(db));
                        sqlite3_finalize(ifile);
-                       zpm_rollback(pkg);
+                       zpm_rollback(zpm);
                munmap(content, sbuf.st_size);
                        return 0;
                }
                sqlite3_finalize(ifile);
 
                /* commit */
-               //zpm_commit(pkg);
+               //zpm_commit(zpm);
 
                /* don't need the original file now */
 
        }
 
-       if (!set_elf_info(pkg->db, hash, content, sbuf.st_size)) {
+       if (!set_elf_info(zpm->db, hash, content, sbuf.st_size)) {
                fprintf(stderr, "setting elf info failed\n");
                munmap(content, sbuf.st_size);
                return 0;
@@ -835,7 +902,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) {
        munmap(content, sbuf.st_size);
 
        /* if package and not nopackage flag, add to package */
-       if (pkg->pkgname && (!ZPM_NOPACKAGE)) {
+       if (zpm->current_package->name && (!ZPM_NOPACKAGE)) {
                /* TODO */
        }