From be13fb0871a85e0ab3c6c274f836eef375a78497 Mon Sep 17 00:00:00 2001 From: Nathan Wagner Date: Fri, 21 Sep 2018 09:04:28 +0000 Subject: [PATCH] remove foreign key from elf tables The tables need to be able to be populated even if the file content isn't available. cleanup elf info setting --- db.sql | 6 ++---- lib/zpm.c | 63 ++++++++++++++++--------------------------------------- 2 files changed, 20 insertions(+), 49 deletions(-) diff --git a/db.sql b/db.sql index e1565e6..816cbe5 100644 --- a/db.sql +++ b/db.sql @@ -209,8 +209,7 @@ without rowid -- and just hash, not package? create table elflibraries ( file text primary key, - soname text, - foreign key (file) references files on delete cascade + soname text ) without rowid ; @@ -218,8 +217,7 @@ without rowid create table elfneeded ( file text, needed text, -- soname of dependency - primary key (file, needed), - foreign key (file) references files on delete cascade + primary key (file, needed) ) without rowid ; diff --git a/lib/zpm.c b/lib/zpm.c index ebe8909..004b7d3 100644 --- a/lib/zpm.c +++ b/lib/zpm.c @@ -500,7 +500,7 @@ int zpm_extract(struct zpm *pkg, char *hash, char *path, int mode) { return 1; } -static sqlite3_stmt *run_for_hash(sqlite3 *db, char *sql, char *hash) { +static int run_for_hash(sqlite3 *db, char *sql, char *hash) { int rc; sqlite3_stmt *ifile; @@ -513,10 +513,17 @@ static sqlite3_stmt *run_for_hash(sqlite3 *db, char *sql, char *hash) { /* hash, filename */ sqlite3_bind_text(ifile, 1, hash, 64, SQLITE_STATIC); + do { + rc = sqlite3_step(ifile); + } while (rc == SQLITE_ROW); + + sqlite3_finalize(ifile); - return ifile; + return rc == SQLITE_DONE; } +#define SQLERP(db, msg) fprintf(stderr, "%s: %s\n", msg, sqlite3_errmsg(db)) + static int set_elf_info(sqlite3 *db, char *hash, char *content, size_t length) { if (length >= sizeof (Elf64_Ehdr) && libelf_iself(content)) { char *strtab; @@ -527,54 +534,21 @@ static int set_elf_info(sqlite3 *db, char *hash, char *content, size_t length) { sqlite3_stmt *ifile; int rc; - /* go ahead and set up elf information now */ /* clear existing for this hash */ - ifile = run_for_hash(db, "delete from elfinfo where file = ?", hash); - do { - rc = sqlite3_step(ifile); -#if 0 - if (rc == SQLITE_ROW) { - int nc; - fprintf(stderr, "delete row has %d columns: ", sqlite3_column_count(ifile)); - nc = sqlite3_column_count(ifile); - for (i = 0; i < nc; i++) { - char *r; - r = sqlite3_column_text(ifile, i); - fprintf(stderr, ", %s", r); - } - fprintf(stderr, "\n"); - } -#endif - } while (rc == SQLITE_ROW); - if (rc != SQLITE_DONE) { - SQLERROR(sqlite3_errmsg(db)); - sqlite3_finalize(ifile); - fprintf(stderr, "error clearing elf info: %d\n", rc); + if (!run_for_hash(db, "delete from elfinfo where file = ?", hash)) { + SQLERP(db, "error clearing elf info"); return 0; } - sqlite3_finalize(ifile); - ifile = run_for_hash(db, "delete from elflibraries where file = ?", hash); - do { - rc = sqlite3_step(ifile); - } while (rc == SQLITE_ROW); - if (rc != SQLITE_DONE) { - SQLERROR(sqlite3_errmsg(db)); - sqlite3_finalize(ifile); - fprintf(stderr, "error clearing elf library: %d\n", rc); + + if (!run_for_hash(db, "delete from elflibraries where file = ?", hash)) { + SQLERP(db, "error clearing elf library"); return 0; } - sqlite3_finalize(ifile); - ifile = run_for_hash(db, "delete from elfneeded where file = ?", hash); - do { - rc = sqlite3_step(ifile); - } while (rc == SQLITE_ROW); - if (rc != SQLITE_DONE) { - SQLERROR(sqlite3_errmsg(db)); - sqlite3_finalize(ifile); - fprintf(stderr, "error clearing elf needed\n"); + + if (!run_for_hash(db, "delete from elfneeded where file = ?", hash)) { + SQLERP(db, "error clearing elf needed"); return 0; } - sqlite3_finalize(ifile); hdr = libelf_header(content); /* if lib, set soname */ @@ -638,9 +612,8 @@ static int set_elf_info(sqlite3 *db, char *hash, char *content, size_t length) { #endif rc = sqlite3_step(ifile); if (rc != SQLITE_DONE) { - SQLERROR(sqlite3_errmsg(db)); + SQLERP(db, "error setting needed library"); sqlite3_finalize(ifile); - fprintf(stderr, "error setting needed library\n"); return 0; } sqlite3_reset(ifile); -- 2.40.0