// 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, "
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
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
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
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
if (r) {
ERROR(db->pakfire, "Could not bind groups: %s\n", sqlite3_errmsg(db->handle));
free(groups);
- goto ROLLBACK;
+ goto ERROR;
}
free(groups);
} else {
r = sqlite3_bind_null(stmt, 4);
if (r)
- goto ROLLBACK;
+ goto ERROR;
}
// Bind filename
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
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
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;
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;
}
}
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
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
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
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
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
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
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
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
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;
}
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
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;
}