]> git.ipfire.org Git - pakfire.git/commitdiff
db: Wrap erasing packages into a transaction, too
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 9 Dec 2021 16:16:06 +0000 (16:16 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 9 Dec 2021 16:16:06 +0000 (16:16 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/db.c

index 9deaca54e7f6724705602d53db57cd350ab05215..8f24e0f587b37795377e5ad3ba37fed4814827bc 100644 (file)
@@ -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;
 }