"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;
"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;
"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;
}
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;
}
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);