]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: db: Add scriptlets
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 30 Jan 2021 17:36:43 +0000 (17:36 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 30 Jan 2021 17:36:43 +0000 (17:36 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/db.c
src/libpakfire/include/pakfire/scriptlet.h
src/libpakfire/scriptlet.c

index 39609632b7b46e444c1cfd3bbabaa5d151c7f48f..ff72704f6688676a0f48816ee23f02bee6cb61e9 100644 (file)
@@ -312,7 +312,7 @@ static int pakfire_db_create_schema(struct pakfire_db* db) {
                "CREATE TABLE IF NOT EXISTS scriptlets("
                        "id             INTEGER PRIMARY KEY, "
                        "pkg            INTEGER, "
-                       "action         TEXT, "
+                       "type           TEXT, "
                        "scriptlet      TEXT, "
                        "FOREIGN KEY (pkg) REFERENCES packages(id)"
                ")");
@@ -790,6 +790,76 @@ END:
        return r;
 }
 
+static int pakfire_db_add_scriptlets(struct pakfire_db* db, unsigned long id, PakfireArchive archive) {
+       sqlite3_stmt* stmt = NULL;
+       int r = 1;
+
+       struct pakfire_scriptlet_type* scriptlet_type = PAKFIRE_SCRIPTLET_TYPES;
+       struct pakfire_scriptlet* scriptlet;
+
+       const char* sql = "INSERT INTO scriptlets(pkg, type, scriptlet) VALUES(?, ?, ?)";
+
+       // Prepare the statement
+       r = sqlite3_prepare_v2(db->handle, sql, -1, &stmt, NULL);
+       if (r) {
+               ERROR(db->pakfire, "Could not prepare SQL statement: %s: %s\n",
+                       sql, sqlite3_errmsg(db->handle));
+               goto END;
+       }
+
+       while (scriptlet_type->type) {
+               // Fetch the scriptlet
+               scriptlet = pakfire_archive_get_scriptlet(archive, scriptlet_type->type);
+
+               // Go to next one if the archive does not have a scriptlet of the given type
+               if (!scriptlet) {
+                       scriptlet_type++;
+                       continue;
+               }
+
+               // Bind package ID
+               r = sqlite3_bind_int64(stmt, 1, id);
+               if (r) {
+                       ERROR(db->pakfire, "Could not bind id: %s\n", sqlite3_errmsg(db->handle));
+                       goto END;
+               }
+
+               // Bind handle
+               r = sqlite3_bind_text(stmt, 2, scriptlet_type->handle, -1, NULL);
+               if (r) {
+                       ERROR(db->pakfire, "Could not bind type: %s\n", sqlite3_errmsg(db->handle));
+                       goto END;
+               }
+
+               // Bind scriptlet
+               r = sqlite3_bind_text(stmt, 3, scriptlet->data, scriptlet->size, NULL);
+               if (r) {
+                       ERROR(db->pakfire, "Could not bind scriptlet: %s\n", sqlite3_errmsg(db->handle));
+                       goto END;
+               }
+
+               // Execute query
+               do {
+                       r = sqlite3_step(stmt);
+               } while (r == SQLITE_BUSY);
+
+               // Reset bound values
+               sqlite3_reset(stmt);
+
+               scriptlet_type++;
+       }
+
+       // All okay
+       r = 0;
+
+END:
+       if (stmt)
+               sqlite3_finalize(stmt);
+
+       return r;
+}
+
+
 PAKFIRE_EXPORT int pakfire_db_add_package(struct pakfire_db* db,
                PakfirePackage pkg, PakfireArchive archive) {
        sqlite3_stmt* stmt = NULL;
@@ -1012,6 +1082,11 @@ PAKFIRE_EXPORT int pakfire_db_add_package(struct pakfire_db* db,
        if (r)
                goto ROLLBACK;
 
+       // 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)
index 75cf8c1ac10948ee7b91eee001e3b57e552d5d7c..e572f097a26cee9d559cc4c9731542a9efde60ca 100644 (file)
@@ -32,17 +32,27 @@ typedef enum _pakfire_script_types {
        PAKFIRE_SCRIPTLET_PREIN,
        PAKFIRE_SCRIPTLET_PREUN,
        PAKFIRE_SCRIPTLET_PREUP,
-       PAKFIRE_SCRIPTLET_PRETRANSIN,
-       PAKFIRE_SCRIPTLET_PRETRANSUN,
-       PAKFIRE_SCRIPTLET_PRETRANSUP,
        PAKFIRE_SCRIPTLET_POSTIN,
        PAKFIRE_SCRIPTLET_POSTUN,
        PAKFIRE_SCRIPTLET_POSTUP,
+       PAKFIRE_SCRIPTLET_PRETRANSIN,
+       PAKFIRE_SCRIPTLET_PRETRANSUN,
+       PAKFIRE_SCRIPTLET_PRETRANSUP,
        PAKFIRE_SCRIPTLET_POSTTRANSIN,
        PAKFIRE_SCRIPTLET_POSTTRANSUN,
        PAKFIRE_SCRIPTLET_POSTTRANSUP,
 } pakfire_scriptlet_type;
 
+#define NUM_PAKFIRE_SCRIPTLET_TYPES 13
+
+struct pakfire_scriptlet_type {
+       pakfire_scriptlet_type type;
+       const char* filename;
+       const char* handle;
+};
+
+struct pakfire_scriptlet_type PAKFIRE_SCRIPTLET_TYPES[NUM_PAKFIRE_SCRIPTLET_TYPES + 1];
+
 struct pakfire_scriptlet {
        pakfire_scriptlet_type type;
        void* data;
@@ -53,6 +63,7 @@ struct pakfire_scriptlet* pakfire_scriptlet_create(Pakfire pakfire);
 void pakfire_scriptlet_free(struct pakfire_scriptlet* scriptlet);
 
 pakfire_scriptlet_type pakfire_scriptlet_type_from_filename(const char* filename);
+const char* pakfire_scriptlet_handle_from_type(pakfire_scriptlet_type type);
 
 #endif
 
index 1ca4b6e1a91b65c0e99219b3a2fd34fb71b3b82c..1f0166c7bd1a7bc55a25fbf02e27a132fa0dae9c 100644 (file)
 #include <pakfire/scriptlet.h>
 #include <pakfire/types.h>
 
+struct pakfire_scriptlet_type PAKFIRE_SCRIPTLET_TYPES[NUM_PAKFIRE_SCRIPTLET_TYPES + 1] = {
+       { PAKFIRE_SCRIPTLET_PREIN,       "scriptlets/prein",       "prein" },
+       { PAKFIRE_SCRIPTLET_PREUN,       "scriptlets/preun",       "preun" },
+       { PAKFIRE_SCRIPTLET_PREUP,       "scriptlets/preup",       "preup" },
+       { PAKFIRE_SCRIPTLET_POSTIN,      "scriptlets/postin",      "postin" },
+       { PAKFIRE_SCRIPTLET_POSTUN,      "scriptlets/postun",      "postun" },
+       { PAKFIRE_SCRIPTLET_POSTUP,      "scriptlets/postup",      "postup" },
+       { PAKFIRE_SCRIPTLET_PRETRANSIN,  "scriptlets/pretransin",  "pretransin" },
+       { PAKFIRE_SCRIPTLET_PRETRANSUN,  "scriptlets/pretransun",  "pretransun" },
+       { PAKFIRE_SCRIPTLET_PRETRANSUP,  "scriptlets/pretransup",  "pretransup" },
+       { PAKFIRE_SCRIPTLET_POSTTRANSIN, "scriptlets/posttransin", "posttransin" },
+       { PAKFIRE_SCRIPTLET_POSTTRANSUN, "scriptlets/posttransun", "posttransun" },
+       { PAKFIRE_SCRIPTLET_POSTTRANSUP, "scriptlets/posttransup", "posttransup" },
+       { PAKFIRE_SCRIPTLET_UNDEFINED,   NULL,                     NULL },
+};
+
 struct pakfire_scriptlet* pakfire_scriptlet_create(Pakfire pakfire) {
        struct pakfire_scriptlet* scriptlet = calloc(1, sizeof(*scriptlet));
        if (!scriptlet)
@@ -43,82 +59,26 @@ void pakfire_scriptlet_free(struct pakfire_scriptlet* scriptlet) {
 }
 
 pakfire_scriptlet_type pakfire_scriptlet_type_from_filename(const char* filename) {
-       if (strcmp(filename, "scriptlets/prein") == 0)
-               return PAKFIRE_SCRIPTLET_PREIN;
-
-       else if (strcmp(filename, "scriptlets/preun") == 0)
-               return PAKFIRE_SCRIPTLET_PREUN;
-
-       else if (strcmp(filename, "scriptlets/preup") == 0)
-               return PAKFIRE_SCRIPTLET_PREUP;
-
-       else if (strcmp(filename, "scriptlets/postin") == 0)
-               return PAKFIRE_SCRIPTLET_POSTIN;
-
-       else if (strcmp(filename, "scriptlets/postun") == 0)
-               return PAKFIRE_SCRIPTLET_POSTUN;
-
-       else if (strcmp(filename, "scriptlets/postup") == 0)
-               return PAKFIRE_SCRIPTLET_POSTUP;
-
-       else if (strcmp(filename, "scriptlets/pretransin") == 0)
-               return PAKFIRE_SCRIPTLET_PRETRANSIN;
-
-       else if (strcmp(filename, "scriptlets/pretransun") == 0)
-               return PAKFIRE_SCRIPTLET_PRETRANSUN;
-
-       else if (strcmp(filename, "scriptlets/pretransup") == 0)
-               return PAKFIRE_SCRIPTLET_PRETRANSUP;
-
-       else if (strcmp(filename, "scriptlets/posttransin") == 0)
-               return PAKFIRE_SCRIPTLET_POSTTRANSIN;
+       struct pakfire_scriptlet_type* t = PAKFIRE_SCRIPTLET_TYPES;
 
-       else if (strcmp(filename, "scriptlets/posttransun") == 0)
-               return PAKFIRE_SCRIPTLET_POSTTRANSUN;
+       while (t->type) {
+               if (strcmp(t->filename, filename) == 0)
+                       return t->type;
 
-       else if (strcmp(filename, "scriptlets/posttransup") == 0)
-               return PAKFIRE_SCRIPTLET_POSTTRANSUP;
+               t++;
+       }
 
        return PAKFIRE_SCRIPTLET_UNDEFINED;
 }
 
-static const char* pakfire_step_script_filename(pakfire_scriptlet_type script) {
-       switch (script) {
-               case PAKFIRE_SCRIPTLET_PREIN:
-                       return "scriptlets/prein";
-
-               case PAKFIRE_SCRIPTLET_PREUN:
-                       return "scriptlets/preun";
-
-               case PAKFIRE_SCRIPTLET_PREUP:
-                       return "scriptlets/preup";
-
-               case PAKFIRE_SCRIPTLET_PRETRANSIN:
-                       return "scriptlets/pretansin";
-
-               case PAKFIRE_SCRIPTLET_PRETRANSUN:
-                       return "scriptlets/pretransun";
-
-               case PAKFIRE_SCRIPTLET_PRETRANSUP:
-                       return "scriptlets/pretransup";
-
-               case PAKFIRE_SCRIPTLET_POSTIN:
-                       return "scriptlets/postin";
-
-               case PAKFIRE_SCRIPTLET_POSTUN:
-                       return "scriptlets/postun";
-
-               case PAKFIRE_SCRIPTLET_POSTUP:
-                       return "scriptlets/postup";
-
-               case PAKFIRE_SCRIPTLET_POSTTRANSIN:
-                       return "scriptlets/posttransin";
+const char* pakfire_scriptlet_handle_from_type(pakfire_scriptlet_type type) {
+       struct pakfire_scriptlet_type* t = PAKFIRE_SCRIPTLET_TYPES;
 
-               case PAKFIRE_SCRIPTLET_POSTTRANSUN:
-                       return "scriptlets/posttransun";
+       while (t->type) {
+               if (t->type == type)
+                       return t->handle;
 
-               case PAKFIRE_SCRIPTLET_POSTTRANSUP:
-                       return "scriptlets/posttransup";
+               t++;
        }
 
        return NULL;