From: Michael Tremer Date: Wed, 31 Aug 2022 10:35:40 +0000 (+0000) Subject: db: Store all file digests X-Git-Tag: 0.9.28~356 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a384536993a4f7bf1546310f8ef490542bcbac25;p=pakfire.git db: Store all file digests Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index 4635b6fa7..1c1e5038e 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -409,20 +409,24 @@ static int pakfire_db_create_schema(struct pakfire_db* db) { // Create files table r = pakfire_db_execute(db, "CREATE TABLE IF NOT EXISTS files(" - "id INTEGER PRIMARY KEY, " - "path TEXT, " - "pkg INTEGER, " - "size INTEGER, " - "config INTEGER, " - "datafile INTEGER, " - "mode INTEGER, " - "user TEXT, " - "'group' TEXT, " - "ctime INTEGER, " - "mtime INTEGER, " - "capabilities TEXT, " - "digest_sha512 BLOB, " - "digest_sha256 BLOB, " + "id INTEGER PRIMARY KEY, " + "path TEXT, " + "pkg INTEGER, " + "size INTEGER, " + "config INTEGER, " + "datafile INTEGER, " + "mode INTEGER, " + "user TEXT, " + "'group' TEXT, " + "ctime INTEGER, " + "mtime INTEGER, " + "capabilities TEXT, " + "digest_sha2_512 BLOB, " + "digest_sha2_256 BLOB, " + "digest_blake2b512 BLOB, " + "digest_blake2s256 BLOB, " + "digest_sha3_512 BLOB, " + "digest_sha3_256 BLOB, " "FOREIGN KEY (pkg) REFERENCES packages(id) ON DELETE CASCADE" ")"); if (r) @@ -962,6 +966,22 @@ END: return r; } +static int pakfire_db_bind_digest(struct pakfire_db* db, sqlite3_stmt* stmt, const int field, + struct pakfire_file* file, const enum pakfire_digest_types type) { + const unsigned char* digest = NULL; + size_t length = 0; + + // Fetch the digest + digest = pakfire_file_get_digest(file, type, &length); + + // If this digest isn't set, just bind NULL + if (!digest) + return sqlite3_bind_null(stmt, field); + + // Otherwise bind the data blob + return sqlite3_bind_blob(stmt, field, digest, length, NULL); +} + static int pakfire_db_add_files(struct pakfire_db* db, unsigned long id, struct pakfire_archive* archive) { sqlite3_stmt* stmt = NULL; int r = 1; @@ -979,9 +999,28 @@ static int pakfire_db_add_files(struct pakfire_db* db, unsigned long id, struct goto END; } - const char* sql = "INSERT INTO files(pkg, path, size, config, datafile, mode, " - "user, 'group', ctime, mtime, capabilities, digest_sha512, digest_sha256) " - "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + const char* sql = + "INSERT INTO " + " files(" + "pkg, " + "path, " + "size, " + "config, " + "datafile, " + "mode, " + "user, " + "'group', " + "ctime, " + "mtime, " + "capabilities, " + "digest_sha2_512, " + "digest_sha2_256, " + "digest_blake2b512, " + "digest_blake2s256, " + "digest_sha3_512, " + "digest_sha3_256" + ") " + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; // Prepare the statement r = sqlite3_prepare_v2(db->handle, sql, strlen(sql), &stmt, NULL); @@ -1096,35 +1135,55 @@ static int pakfire_db_add_files(struct pakfire_db* db, unsigned long id, struct goto END; } - const unsigned char* sha512_digest = NULL; - size_t sha512_length = 0; + // SHA2-512 Digest + r = pakfire_db_bind_digest(db, stmt, 12, file, PAKFIRE_DIGEST_SHA2_512); + if (r) { + ERROR(db->pakfire, "Could not bind SHA2-512 digest: %s\n", + sqlite3_errmsg(db->handle)); + pakfire_file_unref(file); + goto END; + } - // SHA-512 Digest - sha512_digest = pakfire_file_get_digest(file, PAKFIRE_DIGEST_SHA2_512, &sha512_length); - if (sha512_digest) { - r = sqlite3_bind_blob(stmt, 12, sha512_digest, sha512_length, NULL); - } else { - r = sqlite3_bind_null(stmt, 12); + // SHA2-256 Digest + r = pakfire_db_bind_digest(db, stmt, 13, file, PAKFIRE_DIGEST_SHA2_256); + if (r) { + ERROR(db->pakfire, "Could not bind SHA2-256 digest: %s\n", + sqlite3_errmsg(db->handle)); + pakfire_file_unref(file); + goto END; } + + // BLAKE2b512 Digest + r = pakfire_db_bind_digest(db, stmt, 14, file, PAKFIRE_DIGEST_BLAKE2B512); if (r) { - ERROR(db->pakfire, "Could not bind SHA-512 digest: %s\n", + ERROR(db->pakfire, "Could not bind BLAKE2b512 digest: %s\n", sqlite3_errmsg(db->handle)); pakfire_file_unref(file); goto END; } - const unsigned char* sha256_digest = NULL; - size_t sha256_length = 0; + // BLAKE2s256 Digest + r = pakfire_db_bind_digest(db, stmt, 15, file, PAKFIRE_DIGEST_BLAKE2S256); + if (r) { + ERROR(db->pakfire, "Could not bind BLAKE2s256 digest: %s\n", + sqlite3_errmsg(db->handle)); + pakfire_file_unref(file); + goto END; + } - // SHA-256 Digest - sha256_digest = pakfire_file_get_digest(file, PAKFIRE_DIGEST_SHA2_256, &sha256_length); - if (sha256_digest) { - r = sqlite3_bind_blob(stmt, 13, sha256_digest, sha256_length, NULL); - } else { - r = sqlite3_bind_null(stmt, 13); + // SHA3-512 Digest + r = pakfire_db_bind_digest(db, stmt, 16, file, PAKFIRE_DIGEST_SHA3_512); + if (r) { + ERROR(db->pakfire, "Could not bind SHA3-512 digest: %s\n", + sqlite3_errmsg(db->handle)); + pakfire_file_unref(file); + goto END; } + + // SHA3-256 Digest + r = pakfire_db_bind_digest(db, stmt, 17, file, PAKFIRE_DIGEST_SHA3_256); if (r) { - ERROR(db->pakfire, "Could not bind SHA-256 digest: %s\n", + ERROR(db->pakfire, "Could not bind SHA3-256 digest: %s\n", sqlite3_errmsg(db->handle)); pakfire_file_unref(file); goto END; @@ -2119,16 +2178,36 @@ static int pakfire_db_load_file(struct pakfire_db* db, struct pakfire_filelist* if (mtime) pakfire_file_set_mtime(file, mtime); - // SHA-512 Digest + // SHA2-512 Digest r = pakfire_db_load_file_digest(db, file, stmt, PAKFIRE_DIGEST_SHA2_512, 7); if (r) goto ERROR; - // SHA-256 Digest + // SHA2-256 Digest r = pakfire_db_load_file_digest(db, file, stmt, PAKFIRE_DIGEST_SHA2_256, 8); if (r) goto ERROR; + // BLAKE2b512 Digest + r = pakfire_db_load_file_digest(db, file, stmt, PAKFIRE_DIGEST_BLAKE2B512, 9); + if (r) + goto ERROR; + + // BLAKE2s256 Digest + r = pakfire_db_load_file_digest(db, file, stmt, PAKFIRE_DIGEST_BLAKE2S256, 10); + if (r) + goto ERROR; + + // SHA3-512 Digest + r = pakfire_db_load_file_digest(db, file, stmt, PAKFIRE_DIGEST_SHA3_512, 11); + if (r) + goto ERROR; + + // SHA3-256 Digest + r = pakfire_db_load_file_digest(db, file, stmt, PAKFIRE_DIGEST_SHA3_256, 12); + if (r) + goto ERROR; + // Append the file to the filelist r = pakfire_filelist_append(filelist, file); if (r) @@ -2155,8 +2234,12 @@ int pakfire_db_filelist(struct pakfire_db* db, struct pakfire_filelist** filelis "'group', " "ctime, " "mtime, " - "digest_sha512, " - "digest_sha256 " + "digest_sha2_512, " + "digest_sha2_256, " + "digest_blake2b512, " + "digest_blake2s256, " + "digest_sha3_512, " + "digest_sha3_256 " "FROM files " "ORDER BY path" ";";