#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 (?,?,?)";
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;
- pkg->pkgid = 0;
- pkg->errmsg = 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) {
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;
}
);
}
-/* 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;