From: Michael Tremer Date: Thu, 9 Dec 2021 16:16:06 +0000 (+0000) Subject: db: Wrap erasing packages into a transaction, too X-Git-Tag: 0.9.28~817 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=687961c33788d892bf63f1bce2c72eed11283d06;p=pakfire.git db: Wrap erasing packages into a transaction, too Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index 9deaca54e..8f24e0f58 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -1130,7 +1130,7 @@ int pakfire_db_add_package(struct pakfire_db* db, // Begin a new transaction r = pakfire_db_begin_transaction(db); if (r) - goto ROLLBACK; + goto ERROR; const char* sql = "INSERT INTO packages(name, evr, arch, groups, filename, size, " "inst_size, digest, license, summary, description, uuid, " @@ -1142,7 +1142,7 @@ int pakfire_db_add_package(struct pakfire_db* db, if (r != SQLITE_OK) { ERROR(db->pakfire, "Could not prepare SQL statement: %s: %s\n", sql, sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind name @@ -1151,7 +1151,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_text(stmt, 1, name, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind name: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind evr @@ -1160,7 +1160,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_text(stmt, 2, evr, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind evr: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind arch @@ -1169,7 +1169,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_text(stmt, 3, arch, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind arch: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind groups @@ -1179,7 +1179,7 @@ int pakfire_db_add_package(struct pakfire_db* db, if (r) { ERROR(db->pakfire, "Could not bind groups: %s\n", sqlite3_errmsg(db->handle)); free(groups); - goto ROLLBACK; + goto ERROR; } free(groups); @@ -1188,7 +1188,7 @@ int pakfire_db_add_package(struct pakfire_db* db, } else { r = sqlite3_bind_null(stmt, 4); if (r) - goto ROLLBACK; + goto ERROR; } // Bind filename @@ -1197,7 +1197,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_text(stmt, 5, filename, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind filename: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind size @@ -1206,7 +1206,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_int64(stmt, 6, size); if (r) { ERROR(db->pakfire, "Could not bind size: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind installed size @@ -1215,7 +1215,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_int64(stmt, 7, inst_size); if (r) { ERROR(db->pakfire, "Could not bind inst_size: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } enum pakfire_digests digest_type = PAKFIRE_DIGEST_NONE; @@ -1224,12 +1224,12 @@ int pakfire_db_add_package(struct pakfire_db* db, if (hexdigest) { digest = pakfire_db_pack_digest(digest_type, hexdigest); if (!digest) - goto ROLLBACK; + goto ERROR; r = sqlite3_bind_text(stmt, 8, digest, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind digest: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } } @@ -1239,7 +1239,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_text(stmt, 9, license, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind license: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind summary @@ -1248,7 +1248,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_text(stmt, 10, summary, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind summary: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind description @@ -1257,7 +1257,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_text(stmt, 11, description, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind description: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind uuid @@ -1266,7 +1266,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_text(stmt, 12, uuid, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind uuid: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind vendor @@ -1275,7 +1275,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_text(stmt, 13, vendor, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind vendor: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind build_host @@ -1284,7 +1284,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_text(stmt, 14, build_host, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind build_host: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind build_time @@ -1293,7 +1293,7 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_int64(stmt, 15, build_time); if (r) { ERROR(db->pakfire, "Could not bind build_time: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Bind repository name @@ -1304,20 +1304,20 @@ int pakfire_db_add_package(struct pakfire_db* db, r = sqlite3_bind_text(stmt, 16, repo_name, -1, NULL); if (r) - goto ROLLBACK; + goto ERROR; // No repository? } else { r = sqlite3_bind_null(stmt, 16); if (r) - goto ROLLBACK; + goto ERROR; } // installed by the user? r = sqlite3_bind_int(stmt, 17, userinstalled); if (r) { ERROR(db->pakfire, "Could not bind userinstalled: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + goto ERROR; } // Run query @@ -1328,58 +1328,57 @@ int pakfire_db_add_package(struct pakfire_db* db, if (r != SQLITE_DONE) { ERROR(db->pakfire, "Could not add package to database: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + r = 1; + goto ERROR; } // Save package ID unsigned long packages_id = sqlite3_last_insert_rowid(db->handle); - // This is done - r = sqlite3_finalize(stmt); - if (r == SQLITE_OK) - stmt = NULL; - // Add dependencies r = pakfire_db_add_dependencies(db, packages_id, pkg); if (r) - goto ROLLBACK; + goto ERROR; // Add files r = pakfire_db_add_files(db, packages_id, archive); if (r) - goto ROLLBACK; + goto ERROR; // Add scriptlets r = pakfire_db_add_scriptlets(db, packages_id, archive); if (r) - goto ROLLBACK; - - // All done, commit! - r = pakfire_db_commit(db); - if (r) - goto ROLLBACK; - - return 0; + goto ERROR; -ROLLBACK: +ERROR: if (stmt) sqlite3_finalize(stmt); if (digest) free(digest); - pakfire_db_rollback(db); + // Commit or rollback + if (r) + pakfire_db_rollback(db); + else + r = pakfire_db_commit(db); - return 1; + return r; } int pakfire_db_remove_package(struct pakfire_db* db, struct pakfire_package* pkg) { sqlite3_stmt* stmt = NULL; int r = 1; + // Begin a new transaction + r = pakfire_db_begin_transaction(db); + if (r) + goto ERROR; + // Fetch the package's UUID const char* uuid = pakfire_package_get_uuid(pkg); if (!uuid) { ERROR(db->pakfire, "Package has no UUID\n"); + r = 1; goto ERROR; } @@ -1395,7 +1394,7 @@ int pakfire_db_remove_package(struct pakfire_db* db, struct pakfire_package* pkg 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; + goto ERROR; } // Execute query @@ -1410,12 +1409,19 @@ int pakfire_db_remove_package(struct pakfire_db* db, struct pakfire_package* pkg goto ERROR; } + // All done r = 0; ERROR: if (stmt) sqlite3_finalize(stmt); + // Commit or rollback + if (r) + pakfire_db_rollback(db); + else + r = pakfire_db_commit(db); + return r; }