]> git.ipfire.org Git - pakfire.git/commitdiff
db: Implement removing packages
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 7 Feb 2021 17:39:55 +0000 (17:39 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 7 Feb 2021 17:39:55 +0000 (17:39 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/db.c
tests/libpakfire/db.c

index 78fff8d1afa9a94ebdf3ddc2f22853c6ee99a2e0..2c02903364e5f00688cd73ee12c4845c91cf0294 100644 (file)
@@ -272,7 +272,7 @@ static int pakfire_db_create_schema(struct pakfire_db* db) {
                        "pkg            INTEGER, "
                        "type           TEXT, "
                        "dependency     TEXT, "
-                       "FOREIGN KEY (pkg) REFERENCES packages(id)"
+                       "FOREIGN KEY (pkg) REFERENCES packages(id) ON DELETE CASCADE"
                ")");
        if (r)
                return r;
@@ -298,7 +298,7 @@ static int pakfire_db_create_schema(struct pakfire_db* db) {
                        "hash1          TEXT, "
                        "mtime          INTEGER, "
                        "capabilities   TEXT, "
-                       "FOREIGN KEY (pkg) REFERENCES packages(id)"
+                       "FOREIGN KEY (pkg) REFERENCES packages(id) ON DELETE CASCADE"
                ")");
        if (r)
                return 1;
@@ -315,7 +315,7 @@ static int pakfire_db_create_schema(struct pakfire_db* db) {
                        "pkg            INTEGER, "
                        "type           TEXT, "
                        "scriptlet      TEXT, "
-                       "FOREIGN KEY (pkg) REFERENCES packages(id)"
+                       "FOREIGN KEY (pkg) REFERENCES packages(id) ON DELETE CASCADE"
                ")");
        if (r)
                return 1;
@@ -1232,5 +1232,48 @@ ROLLBACK:
 }
 
 PAKFIRE_EXPORT int pakfire_db_remove_package(struct pakfire_db* db, PakfirePackage pkg) {
-       return 0; // TODO
+       sqlite3_stmt* stmt = NULL;
+       int r = 1;
+
+       // Fetch the package's UUID
+       const char* uuid = pakfire_package_get_uuid(pkg);
+       if (!uuid) {
+               ERROR(db->pakfire, "Package has no UUID\n");
+               goto ERROR;
+       }
+
+       r = sqlite3_prepare_v2(db->handle,
+               "DELETE FROM packages WHERE uuid = ?", -1, &stmt, NULL);
+       if (r) {
+               ERROR(db->pakfire, "Could not prepare SQL statement: %s\n",
+                       sqlite3_errmsg(db->handle));
+               goto ERROR;
+       }
+
+       // Bind UUID
+       r = sqlite3_bind_text(stmt, 1, uuid, -1, NULL);
+       if (r) {
+               ERROR(db->pakfire, "Could not bind uuid: %s\n", sqlite3_errmsg(db->handle));
+               return 1;
+       }
+
+       // Execute query
+       do {
+               r = sqlite3_step(stmt);
+       } while (r == SQLITE_BUSY);
+
+       // Check if we have been successful
+       if (r != SQLITE_DONE) {
+               ERROR(db->pakfire, "Could not delete package %s\n", uuid);
+               r = 1;
+               goto ERROR;
+       }
+
+       r = 0;
+
+ERROR:
+       if (stmt)
+               sqlite3_finalize(stmt);
+
+       return r;
 }
index 5aede44c6bef71587ad7ad6d8784129307b17bc5..1a12745b8f3b8b0c97f5d1d99ddd1961520c5344 100644 (file)
@@ -93,6 +93,14 @@ static int test_add_package(const struct test* t) {
        packages = pakfire_db_packages(db);
        ASSERT(packages == 1);
 
+       // Remove the package again
+       r = pakfire_db_remove_package(db, pkg);
+       ASSERT(r == 0);
+
+       // No packages should be installed any more
+       packages = pakfire_db_packages(db);
+       ASSERT(packages == 0);
+
        // Cleanup
        pakfire_archive_unref(archive);
        pakfire_db_unref(db);