]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: db: Add foreign keys to tables
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 22 Jan 2021 13:03:53 +0000 (13:03 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 22 Jan 2021 13:03:53 +0000 (13:03 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/db.c

index 94948002bd046c09e202914558ece3d619b8ddc0..96f684505d737a8e27437b287fdeafdd2fc91b6f 100644 (file)
@@ -264,7 +264,8 @@ static int pakfire_db_create_schema(struct pakfire_db* db) {
                "CREATE TABLE IF NOT EXISTS dependencies("
                        "pkg            INTEGER, "
                        "type           TEXT, "
-                       "dependency     TEXT"
+                       "dependency     TEXT, "
+                       "FOREIGN KEY (pkg) REFERENCES packages(id)"
                ")");
        if (r)
                return r;
@@ -289,7 +290,8 @@ static int pakfire_db_create_schema(struct pakfire_db* db) {
                        "'group'        TEXT, "
                        "hash1          TEXT, "
                        "mtime          INTEGER, "
-                       "capabilities   TEXT"
+                       "capabilities   TEXT, "
+                       "FOREIGN KEY (pkg) REFERENCES packages(id)"
                ")");
        if (r)
                return 1;
@@ -305,7 +307,8 @@ static int pakfire_db_create_schema(struct pakfire_db* db) {
                        "id             INTEGER PRIMARY KEY, "
                        "pkg            INTEGER, "
                        "action         TEXT, "
-                       "scriptlet      TEXT"
+                       "scriptlet      TEXT, "
+                       "FOREIGN KEY (pkg) REFERENCES packages(id)"
                ")");
        if (r)
                return 1;
@@ -318,6 +321,14 @@ static int pakfire_db_create_schema(struct pakfire_db* db) {
        return 0;
 }
 
+static int pakfire_db_migrate_to_schema_8(struct pakfire_db* db) {
+       // Add foreign keys
+       // TODO sqlite doesn't support adding foreign keys to existing tables and so we would
+       // need to recreate the whole table and rename it afterwards. Annoying.
+
+       return 0;
+}
+
 static int pakfire_db_migrate_schema(struct pakfire_db* db) {
        int r;
 
@@ -337,6 +348,14 @@ static int pakfire_db_migrate_schema(struct pakfire_db* db) {
                                db->schema = CURRENT_SCHEMA;
                                break;
 
+                       case 7:
+                               r = pakfire_db_migrate_to_schema_8(db);
+                               if (r)
+                                       goto ROLLBACK;
+
+                               db->schema++;
+                               break;
+
                        default:
                                ERROR(db->pakfire, "Cannot migrate database from schema %d\n", db->schema);
                                goto ROLLBACK;
@@ -367,6 +386,9 @@ static int pakfire_db_setup(struct pakfire_db* db) {
        // Setup logging
        sqlite3_config(SQLITE_CONFIG_LOG, logging_callback, db->pakfire);
 
+       // Enable foreign keys
+       pakfire_db_execute(db, "PRAGMA foreign_keys = ON");
+
        // Make LIKE case-sensitive
        pakfire_db_execute(db, "PRAGMA case_sensitive_like = ON");