]> pd.if.org Git - zpackage/blobdiff - lib/zpm.c
add error checks to foreach_path
[zpackage] / lib / zpm.c
index 3abbc37d5d07f87ebbe5836dcfd1c2c700d6e634..ebe89096bfa91f0ee88728b78088761f141ece3f 100644 (file)
--- a/lib/zpm.c
+++ b/lib/zpm.c
@@ -114,18 +114,6 @@ void uncompresslzma(void *buf, size_t bufsize, FILE *out);
 #define SQLERROR(x) fprintf(stderr, "%s %d: %s\n", __func__, __LINE__, (x))
 #endif
 
-static char *dupstr(char *s) {
-       size_t n;
-       char *d;
-
-       n = strlen(s);
-       d = malloc(n+1);
-       if (d) {
-               d = strcpy(d, s);
-       }
-       return d;
-}
-
 #if 0
 int zpm_newpkg(struct zpm *z, char *base, char *version, int release) {
        char *sql = "insert or ignore into packages (package,version,release) values (?,?,?)";
@@ -284,16 +272,63 @@ 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->current_package = 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_v2(path, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
        if (rc) {
@@ -302,43 +337,59 @@ int zpm_open(struct zpm *pkg, char *path) {
                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);
 
-       /* TODO if this is a new database, create structures */
+       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);
+
+       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;
 }
 
@@ -367,37 +418,6 @@ int zpm_addvercmp(struct zpm *pkg) {
                        );
 }
 
-/* set package struct variables, database, environment, then command line */
-int zpm_readopts(struct zpm *zpm, int ac, char **av) {
-       char *ev;
-       struct zpm_package *pkg;
-
-       if (!zpm) {
-               return -1;
-       }
-
-               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 */
-
-       return av ? ac : 1;
-}
-
 int zpm_extract(struct zpm *pkg, char *hash, char *path, int mode) {
        int rc;