]> pd.if.org Git - zpackage/commitdiff
remove foreign key from elf tables
authorNathan Wagner <nw@hydaspes.if.org>
Fri, 21 Sep 2018 09:04:28 +0000 (09:04 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Mon, 24 Sep 2018 10:40:18 +0000 (10:40 +0000)
The tables need to be able to be populated even if the file content
isn't available.

cleanup elf info setting

db.sql
lib/zpm.c

diff --git a/db.sql b/db.sql
index e1565e69aee73f8b6541b84522b8b058122e31cc..816cbe55e6e5f43562cffb693160c6cc9525a182 100644 (file)
--- 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
 ;
index ebe89096bfa91f0ee88728b78088761f141ece3f..004b7d393e4f9765c05680ef4ec211e2235d6dd7 100644 (file)
--- 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);