]> git.ipfire.org Git - pakfire.git/commitdiff
db: Store all file digests
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Aug 2022 10:35:40 +0000 (10:35 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Aug 2022 10:35:40 +0000 (10:35 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/db.c

index 4635b6fa7cb33d9f1a79d3e11183cff2d5f7ca90..1c1e5038e18b4c8f756092fe1cc533e2dda80dc7 100644 (file)
@@ -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"
                ";";