X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=lib%2Fzpm.c;h=ebe89096bfa91f0ee88728b78088761f141ece3f;hb=9bc9fdb39d33fff1c2e08d8d0c45c959b49a0909;hp=68d6fb9aabd44d134fc83ffa8145118e0b93a23b;hpb=0ac06dd73a92022079bbd0d4eb770d2c6202c23c;p=zpackage diff --git a/lib/zpm.c b/lib/zpm.c index 68d6fb9..ebe8909 100644 --- 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,64 +272,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; } @@ -370,32 +418,6 @@ 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) { - char *ev; - - if (!pkg) { - 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); - } - - /* 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; @@ -611,7 +633,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 +654,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 +669,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 +684,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 +707,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 +730,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 +751,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 +791,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 +804,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 +813,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 +821,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 +829,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 +837,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 +859,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 */ }