From: Michael Tremer Date: Sun, 7 Feb 2021 17:39:55 +0000 (+0000) Subject: db: Implement removing packages X-Git-Tag: 0.9.28~1285^2~786 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=432a328a6b53d2872d3f0c73ff276df4de428768;p=pakfire.git db: Implement removing packages Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index 78fff8d1a..2c0290336 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -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; } diff --git a/tests/libpakfire/db.c b/tests/libpakfire/db.c index 5aede44c6..1a12745b8 100644 --- a/tests/libpakfire/db.c +++ b/tests/libpakfire/db.c @@ -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);