From: Michael Tremer Date: Wed, 22 Sep 2021 15:49:29 +0000 (+0000) Subject: db: Serialize the package digest X-Git-Tag: 0.9.28~934 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9103ba95ff9f10578ae587e3b8f887c03fab080a;p=pakfire.git db: Serialize the package digest Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index 48b63a43d..1a489963c 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -244,8 +244,7 @@ static int pakfire_db_create_schema(struct pakfire_db* db) { "filename TEXT, " "size INTEGER, " "inst_size INTEGER, " - "digest_sha512 TEXT, " - "digest_sha256 TEXT, " + "digest TEXT, " "license TEXT, " "summary TEXT, " "description TEXT, " @@ -666,6 +665,52 @@ static void pakfire_db_add_userinstalled(struct pakfire* pakfire, const char* na queue_push2(&pool->pooljobs, SOLVER_USERINSTALLED|SOLVER_SOLVABLE_NAME, id); } +static const struct pakfire_digest { + enum pakfire_digests type; + const char* prefix; +} pakfire_digests[] = { + { PAKFIRE_DIGEST_SHA512, "sha512:" }, + { PAKFIRE_DIGEST_SHA256, "sha256:" }, + { PAKFIRE_DIGEST_NONE, NULL }, +}; + +static char* pakfire_db_pack_digest(enum pakfire_digests type, const char* hexdigest) { + char* s = NULL; + int r; + + for (const struct pakfire_digest* digest = pakfire_digests; digest->type; digest++) { + if (digest->type == type) { + r = asprintf(&s, "%s%s", digest->prefix, hexdigest); + if (r < 0) + return NULL; + + return s; + } + } + + return NULL; +} + +static const char* pakfire_db_unpack_digest(const char* hexdigest, enum pakfire_digests* type) { + *type = PAKFIRE_DIGEST_NONE; + + // Don't do anything for empty input + if (!hexdigest || !*hexdigest) + return NULL; + + for (const struct pakfire_digest* digest = pakfire_digests; digest->type; digest++) { + if (pakfire_string_startswith(hexdigest, digest->prefix)) { + *type = digest->type; + + // Return the beginning of the hexdigest + return hexdigest + strlen(digest->prefix); + } + } + + // No match + return NULL; +} + static int pakfire_db_add_dependencies(struct pakfire_db* db, unsigned long id, struct pakfire_package* pkg) { sqlite3_stmt* stmt = NULL; int r = 1; @@ -1003,6 +1048,7 @@ END: int pakfire_db_add_package(struct pakfire_db* db, struct pakfire_package* pkg, struct pakfire_archive* archive, int userinstalled) { sqlite3_stmt* stmt = NULL; + char* digest = NULL; int r; // Begin a new transaction @@ -1011,9 +1057,9 @@ int pakfire_db_add_package(struct pakfire_db* db, goto ROLLBACK; const char* sql = "INSERT INTO packages(name, evr, arch, groups, filename, size, " - "inst_size, digest_sha512, digest_sha256, license, summary, description, uuid, " + "inst_size, digest, license, summary, description, uuid, " "vendor, build_host, build_time, installed, repository, userinstalled) " - "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, ?, ?)"; + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, ?, ?)"; // Prepare the statement r = sqlite3_prepare_v2(db->handle, sql, strlen(sql), &stmt, NULL); @@ -1096,33 +1142,25 @@ int pakfire_db_add_package(struct pakfire_db* db, goto ROLLBACK; } - enum pakfire_digests digest = PAKFIRE_DIGEST_NONE; + enum pakfire_digests digest_type = PAKFIRE_DIGEST_NONE; - const char* hexdigest = pakfire_package_get_hexdigest(pkg, &digest); - switch (digest) { - case PAKFIRE_DIGEST_SHA512: - r = sqlite3_bind_text(stmt, 8, hexdigest, -1, NULL); - if (r) { - ERROR(db->pakfire, "Could not bind digest_sha512: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; - } - break; - - case PAKFIRE_DIGEST_SHA256: - r = sqlite3_bind_text(stmt, 9, hexdigest, -1, NULL); - if (r) { - ERROR(db->pakfire, "Could not bind digest_sha256: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; - } + const char* hexdigest = pakfire_package_get_hexdigest(pkg, &digest_type); + if (hexdigest) { + digest = pakfire_db_pack_digest(digest_type, hexdigest); + if (!digest) + goto ROLLBACK; - case PAKFIRE_DIGEST_NONE: - break; + 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; + } } // Bind license const char* license = pakfire_package_get_license(pkg); - r = sqlite3_bind_text(stmt, 10, license, -1, NULL); + 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; @@ -1131,7 +1169,7 @@ int pakfire_db_add_package(struct pakfire_db* db, // Bind summary const char* summary = pakfire_package_get_summary(pkg); - r = sqlite3_bind_text(stmt, 11, summary, -1, NULL); + 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; @@ -1140,7 +1178,7 @@ int pakfire_db_add_package(struct pakfire_db* db, // Bind description const char* description = pakfire_package_get_description(pkg); - r = sqlite3_bind_text(stmt, 12, description, -1, NULL); + 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; @@ -1149,7 +1187,7 @@ int pakfire_db_add_package(struct pakfire_db* db, // Bind uuid const char* uuid = pakfire_package_get_uuid(pkg); - r = sqlite3_bind_text(stmt, 13, uuid, -1, NULL); + 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; @@ -1158,7 +1196,7 @@ int pakfire_db_add_package(struct pakfire_db* db, // Bind vendor const char* vendor = pakfire_package_get_vendor(pkg); - r = sqlite3_bind_text(stmt, 14, vendor, -1, NULL); + 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; @@ -1167,7 +1205,7 @@ int pakfire_db_add_package(struct pakfire_db* db, // Bind build_host const char* build_host = pakfire_package_get_build_host(pkg); - r = sqlite3_bind_text(stmt, 15, build_host, -1, NULL); + 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; @@ -1176,7 +1214,7 @@ int pakfire_db_add_package(struct pakfire_db* db, // Bind build_time time_t build_time = pakfire_package_get_build_time(pkg); - r = sqlite3_bind_int64(stmt, 16, 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; @@ -1188,19 +1226,19 @@ int pakfire_db_add_package(struct pakfire_db* db, const char* repo_name = pakfire_repo_get_name(repo); pakfire_repo_unref(repo); - r = sqlite3_bind_text(stmt, 17, repo_name, -1, NULL); + r = sqlite3_bind_text(stmt, 16, repo_name, -1, NULL); if (r) goto ROLLBACK; // No repository? } else { - r = sqlite3_bind_null(stmt, 17); + r = sqlite3_bind_null(stmt, 16); if (r) goto ROLLBACK; } // installed by the user? - r = sqlite3_bind_int(stmt, 18, userinstalled); + r = sqlite3_bind_int(stmt, 17, userinstalled); if (r) { ERROR(db->pakfire, "Could not bind userinstalled: %s\n", sqlite3_errmsg(db->handle)); goto ROLLBACK; @@ -1250,6 +1288,8 @@ int pakfire_db_add_package(struct pakfire_db* db, ROLLBACK: if (stmt) sqlite3_finalize(stmt); + if (digest) + free(digest); pakfire_db_rollback(db); @@ -1426,73 +1466,72 @@ static int pakfire_db_load_package(struct pakfire_db* db, struct pakfire_repo* r pakfire_package_set_installsize(pkg, size); } - // Digest SHA512 - const char* digest_sha512 = (const char*)sqlite3_column_text(stmt, 8); - if (digest_sha512) { - pakfire_package_set_hexdigest(pkg, PAKFIRE_DIGEST_SHA512, digest_sha512); - } + // Digest + const char* digest = (const char*)sqlite3_column_text(stmt, 8); + if (digest) { + enum pakfire_digests digest_type = PAKFIRE_DIGEST_NONE; - // Digest SHA256 - const char* digest_sha256 = (const char*)sqlite3_column_text(stmt, 9); - if (digest_sha256) { - pakfire_package_set_hexdigest(pkg, PAKFIRE_DIGEST_SHA256, digest_sha256); + // Unpack digest + const char* hexdigest = pakfire_db_unpack_digest(digest, &digest_type); + if (hexdigest) + pakfire_package_set_hexdigest(pkg, digest_type, hexdigest); } // License - const char* license = (const char*)sqlite3_column_text(stmt, 10); + const char* license = (const char*)sqlite3_column_text(stmt, 9); if (license) { pakfire_package_set_license(pkg, license); } // Summary - const char* summary = (const char*)sqlite3_column_text(stmt, 11); + const char* summary = (const char*)sqlite3_column_text(stmt, 10); if (summary) { pakfire_package_set_summary(pkg, summary); } // Description - const char* description = (const char*)sqlite3_column_text(stmt, 12); + const char* description = (const char*)sqlite3_column_text(stmt, 11); if (description) { pakfire_package_set_description(pkg, description); } // UUID - const char* uuid = (const char*)sqlite3_column_text(stmt, 13); + const char* uuid = (const char*)sqlite3_column_text(stmt, 12); if (uuid) { pakfire_package_set_uuid(pkg, uuid); } // Vendor - const char* vendor = (const char*)sqlite3_column_text(stmt, 14); + const char* vendor = (const char*)sqlite3_column_text(stmt, 13); if (vendor) { pakfire_package_set_vendor(pkg, vendor); } // Build Host - const char* build_host = (const char*)sqlite3_column_text(stmt, 15); + const char* build_host = (const char*)sqlite3_column_text(stmt, 14); if (build_host) { pakfire_package_set_build_host(pkg, build_host); } // Build Time - time_t build_time = sqlite3_column_int64(stmt, 16); + time_t build_time = sqlite3_column_int64(stmt, 15); if (build_time) { pakfire_package_set_build_time(pkg, build_time); } // Install Time - time_t install_time = sqlite3_column_int64(stmt, 17); + time_t install_time = sqlite3_column_int64(stmt, 16); if (install_time) { pakfire_package_set_install_time(pkg, install_time); } // installed by user? - int userinstalled = sqlite3_column_int(stmt, 18); + int userinstalled = sqlite3_column_int(stmt, 17); if (userinstalled) pakfire_db_add_userinstalled(db->pakfire, name); // Files - const char* files = (const char*)sqlite3_column_text(stmt, 19); + const char* files = (const char*)sqlite3_column_text(stmt, 18); if (files) { r = pakfire_package_set_filelist_from_string(pkg, files); if (r) @@ -1505,15 +1544,15 @@ static int pakfire_db_load_package(struct pakfire_db* db, struct pakfire_repo* r unsigned int field; void (*func)(struct pakfire_package* pkg, const char* dep); } dependencies[] = { - { 20, pakfire_package_add_provides }, - { 21, pakfire_package_add_prerequires }, - { 22, pakfire_package_add_requires }, - { 23, pakfire_package_add_conflicts }, - { 24, pakfire_package_add_obsoletes }, - { 25, pakfire_package_add_recommends }, - { 26, pakfire_package_add_suggests }, - { 27, pakfire_package_add_supplements }, - { 28, pakfire_package_add_enhances }, + { 19, pakfire_package_add_provides }, + { 20, pakfire_package_add_prerequires }, + { 21, pakfire_package_add_requires }, + { 22, pakfire_package_add_conflicts }, + { 23, pakfire_package_add_obsoletes }, + { 24, pakfire_package_add_recommends }, + { 25, pakfire_package_add_suggests }, + { 26, pakfire_package_add_supplements }, + { 27, pakfire_package_add_enhances }, { 0, NULL }, }; @@ -1550,7 +1589,7 @@ int pakfire_db_load(struct pakfire_db* db, struct pakfire_repo* repo) { const char* sql = "SELECT " "name, evr, arch, id, groups, filename, size, inst_size, " - "digest_sha512, digest_sha256, license, summary, description, uuid, vendor, " + "digest, license, summary, description, uuid, vendor, " "build_host, build_time, strftime('%s', installed) AS installed, userinstalled, " "(" "SELECT group_concat(path, '\n') FROM files WHERE files.pkg = packages.id"