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);
+
+ 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;
}
sqlite3 *db;
char *path; /* path to db file */
int error;
+ char *errmsg;
+ char *pkgid;
struct zpm_package *current_package;
};
struct zpm_package {
struct zpm *zpm;
+ struct jsw_hash *ht;
+
+ /* char pointers are just pointers into the hash table */
+ /* integers/times and such are passed through atoi */
+ /* tags and licenses are trees, NULL if not fetched */
char *name;
char *version;
int release;
char *id;
- char *tags;
+ /* null if tags not collected */
+ //struct zpm_tree *tags;
char *description;
char *architecture;
char *url;
- char *status;
- char *licenses;
- char *package;
+ char *status; /* integer code ? */
+ //struct zpm_tree *licenses;
time_t build_time;
time_t install_time;
char checksum[ZPM_HASH_STRLEN+1];
+ struct zpm_package *next;
};
+int zpm_parse_package(char *pstr, char *name, char *ver, int *rel);
+char *zpm_findpkg(struct zpm *zpm, char *pkgstr);
+int zpm_quote(char *value, char *dest, size_t n);
+
struct zpm_file {
char path[ZPM_PATH_MAX];
int mode;
- char tags[64];
+ //struct zpm_tree *tags;
char owner[32];
char group[32];
time_t mtime;
struct zpm_file *next; /* so you can make a linked list */
};
-
-/* NULL? Create? */
int zpm_open(struct zpm *pkg, char *path);
+int zpm_init(struct zpm *pkg, char *path);
int zpm_pkgname(char *base, char *version, int release); /* construct a package file name */
/* flags for preserving mode, owner, etc */
int (*callback)(void *f, int ncols, char **vals, char **cols),
void *data, char **errmsg);
+int zpm_script_hash(struct zpm *zpm, char *pkgstr, char *phase, char *hash);
+
+sqlite3_stmt *zpm_dbquery(struct zpm *zpm, char *query, ...);
#endif