]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Run scriptlets from database
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 7 Feb 2021 18:30:19 +0000 (18:30 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 7 Feb 2021 18:30:19 +0000 (18:30 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c
src/libpakfire/db.c
src/libpakfire/include/pakfire/db.h
src/libpakfire/include/pakfire/scriptlet.h
src/libpakfire/scriptlet.c
src/libpakfire/step.c

index 4c34b8592a825fdb2f27ee4eeee3d3e0684083eb..b2a1a6d9794066129ef249733ecfa178f76f263b 100644 (file)
@@ -508,7 +508,7 @@ static int pakfire_archive_parse_entry_checksums(PakfireArchive archive,
 static int pakfire_archive_parse_entry_scriptlet(PakfireArchive archive,
                struct archive* a, struct archive_entry* e, const char* filename) {
        // Allocate a scriptlet
-       struct pakfire_scriptlet* scriptlet = pakfire_scriptlet_create(archive->pakfire);
+       struct pakfire_scriptlet* scriptlet = pakfire_scriptlet_create(archive->pakfire, NULL, 0);
        if (!scriptlet)
                return -ENOMEM;
 
index 36c85409d3b06df3320d36b7200f64879add185f..bb1db554da6f82b032bedf61d4851b84abd31766 100644 (file)
@@ -923,7 +923,7 @@ static int pakfire_db_add_scriptlets(struct pakfire_db* db, unsigned long id, Pa
        sqlite3_stmt* stmt = NULL;
        int r = 1;
 
-       struct pakfire_scriptlet_type* scriptlet_type = PAKFIRE_SCRIPTLET_TYPES;
+       const struct pakfire_scriptlet_type* scriptlet_type = PAKFIRE_SCRIPTLET_TYPES;
        struct pakfire_scriptlet* scriptlet;
 
        const char* sql = "INSERT INTO scriptlets(pkg, type, scriptlet) VALUES(?, ?, ?)";
@@ -1282,3 +1282,70 @@ ERROR:
 
        return r;
 }
+
+struct pakfire_scriptlet* pakfire_db_get_scriptlet(struct pakfire_db* db,
+               PakfirePackage pkg, pakfire_scriptlet_type type) {
+       struct pakfire_scriptlet* scriptlet = NULL;
+       sqlite3_stmt* stmt = NULL;
+       int r = 1;
+
+       // Fetch the package's UUID
+       const char* uuid = pakfire_package_get_uuid(pkg);
+       if (!uuid) {
+               ERROR(db->pakfire, "Package has no UUID\n");
+               goto ERROR;
+       }
+
+       const char* sql = "SELECT scriptlet.scriptlet FROM packages \
+               JOIN scriptlets ON packages.id = scriptlets.pkg \
+               WHERE packages.uuid = ? AND scriptlets.type = ?";
+
+       r = sqlite3_prepare_v2(db->handle, sql, strlen(sql), &stmt, NULL);
+       if (r) {
+               ERROR(db->pakfire, "Could not prepare SQL statement: %s %s\n",
+                       sql, sqlite3_errmsg(db->handle));
+               goto ERROR;
+       }
+
+       // Bind UUID
+       r = sqlite3_bind_text(stmt, 1, uuid, -1, NULL);
+       if (r) {
+               ERROR(db->pakfire, "Could not bind uuid: %s\n", sqlite3_errmsg(db->handle));
+               goto ERROR;
+       }
+
+       // Bind type
+       const char* handle = pakfire_scriptlet_handle_from_type(type);
+       if (!handle)
+               goto ERROR;
+
+       r = sqlite3_bind_text(stmt, 2, handle, -1, NULL);
+       if (r) {
+               ERROR(db->pakfire, "Could not bind type: %s\n", sqlite3_errmsg(db->handle));
+               goto ERROR;
+       }
+
+       DEBUG(db->pakfire, "Searching for scriptlet for package %s of type %s\n", uuid, handle);
+
+       // Execute query
+       do {
+               r = sqlite3_step(stmt);
+       } while (r == SQLITE_BUSY);
+
+       // We have some payload
+       if (r == SQLITE_ROW) {
+               const void* data = sqlite3_column_blob(stmt, 1);
+               ssize_t size = sqlite3_column_bytes(stmt, 1);
+
+               // Create a scriptlet object
+               scriptlet = pakfire_scriptlet_create(db->pakfire, data, size);
+               if (!scriptlet)
+                       goto ERROR;
+       }
+
+ERROR:
+       if (stmt)
+               sqlite3_finalize(stmt);
+
+       return scriptlet;
+}
index 7c03321969cf022bfa766ab59815c936dbf84b04..b10301929f8e4ec2949870d909cde44c16947c09 100644 (file)
@@ -44,4 +44,13 @@ ssize_t pakfire_db_packages(struct pakfire_db* db);
 int pakfire_db_add_package(struct pakfire_db* db, PakfirePackage pkg, PakfireArchive archive);
 int pakfire_db_remove_package(struct pakfire_db* db, PakfirePackage pkg);
 
+#ifdef PAKFIRE_PRIVATE
+
+#include <pakfire/scriptlet.h>
+
+struct pakfire_scriptlet* pakfire_db_get_scriptlet(
+       struct pakfire_db* db, PakfirePackage pkg, pakfire_scriptlet_type type);
+
+#endif
+
 #endif /* PAKFIRE_DB_H */
index 4e2f8a7eacf7a0c947c2073a745fc6be21de5399..dcaea631238a5bedcdf3ba0903a313b859d5c60d 100644 (file)
@@ -59,7 +59,7 @@ struct pakfire_scriptlet {
        size_t size;
 };
 
-struct pakfire_scriptlet* pakfire_scriptlet_create(Pakfire pakfire);
+struct pakfire_scriptlet* pakfire_scriptlet_create(Pakfire pakfire, const void* data, size_t size);
 void pakfire_scriptlet_free(struct pakfire_scriptlet* scriptlet);
 
 pakfire_scriptlet_type pakfire_scriptlet_type_from_filename(const char* filename);
index 2fd43b884fccd2e55bf89f669db1f052504ac7e4..542b8cc5494024742868d5536b0bd0b445923929 100644 (file)
@@ -41,13 +41,36 @@ const struct pakfire_scriptlet_type PAKFIRE_SCRIPTLET_TYPES[NUM_PAKFIRE_SCRIPTLE
        { PAKFIRE_SCRIPTLET_UNDEFINED,   NULL,                     NULL },
 };
 
-struct pakfire_scriptlet* pakfire_scriptlet_create(Pakfire pakfire) {
+static int pakfire_scriptlet_set(struct pakfire_scriptlet* scriptlet, const void* data, size_t size) {
+       if (scriptlet->data)
+               free(scriptlet->data);
+
+       // Allocate space for data
+       scriptlet->data = malloc(size);
+       if (!scriptlet->data)
+               return 1;
+
+       // Copy data
+       memcpy(scriptlet->data, data, size);
+
+       return 0;
+}
+
+struct pakfire_scriptlet* pakfire_scriptlet_create(Pakfire pakfire, const void* data, size_t size) {
        struct pakfire_scriptlet* scriptlet = calloc(1, sizeof(*scriptlet));
        if (!scriptlet)
                return NULL;
 
        DEBUG(pakfire, "Allocated scriptlet at %p\n", scriptlet);
 
+       if (data && size) {
+               int r = pakfire_scriptlet_set(scriptlet, data, size);
+               if (r) {
+                       pakfire_scriptlet_free(scriptlet);
+                       return NULL;
+               }
+       }
+
        return scriptlet;
 };
 
index 03edf5ec6d25f2048050539dd9ebc4c7ba43b038..33fa1d97c16049963413725caf437bf49f68965e 100644 (file)
@@ -301,9 +301,17 @@ out:
        return r;
 }
 
-static int pakfire_step_run_script(PakfireStep step, pakfire_scriptlet_type type) {
-       // Fetch scriptlet from archive
-       struct pakfire_scriptlet* scriptlet = pakfire_archive_get_scriptlet(step->archive, type);
+static int pakfire_step_run_script(PakfireStep step,
+               struct pakfire_db* db, pakfire_scriptlet_type type) {
+       struct pakfire_scriptlet* scriptlet = NULL;
+
+       // Fetch scriptlet from archive if possible
+       if (step->archive)
+               scriptlet = pakfire_archive_get_scriptlet(step->archive, type);
+       else
+               scriptlet = pakfire_db_get_scriptlet(db, step->package, type);
+
+       // Nothing to do if there are no scriptlets
        if (!scriptlet)
                return 0;
 
@@ -382,17 +390,17 @@ PAKFIRE_EXPORT int pakfire_step_run(PakfireStep step,
                        switch (type) {
                                case PAKFIRE_STEP_INSTALL:
                                case PAKFIRE_STEP_REINSTALL:
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_PRETRANSIN);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_PRETRANSIN);
                                        break;
 
                                case PAKFIRE_STEP_UPGRADE:
                                case PAKFIRE_STEP_DOWNGRADE:
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_PRETRANSUP);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_PRETRANSUP);
                                        break;
 
                                case PAKFIRE_STEP_ERASE:
                                case PAKFIRE_STEP_OBSOLETE:
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_PRETRANSUN);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_PRETRANSUN);
                                        break;
 
                                case PAKFIRE_STEP_IGNORE:
@@ -405,17 +413,17 @@ PAKFIRE_EXPORT int pakfire_step_run(PakfireStep step,
                        switch (type) {
                                case PAKFIRE_STEP_INSTALL:
                                case PAKFIRE_STEP_REINSTALL:
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_POSTTRANSIN);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_POSTTRANSIN);
                                        break;
 
                                case PAKFIRE_STEP_UPGRADE:
                                case PAKFIRE_STEP_DOWNGRADE:
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_POSTTRANSUP);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_POSTTRANSUP);
                                        break;
 
                                case PAKFIRE_STEP_ERASE:
                                case PAKFIRE_STEP_OBSOLETE:
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_POSTTRANSUN);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_POSTTRANSUN);
                                        break;
 
                                case PAKFIRE_STEP_IGNORE:
@@ -428,7 +436,7 @@ PAKFIRE_EXPORT int pakfire_step_run(PakfireStep step,
                        switch (type) {
                                case PAKFIRE_STEP_INSTALL:
                                case PAKFIRE_STEP_REINSTALL:
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_PREIN);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_PREIN);
                                        if (r)
                                                break;
 
@@ -440,12 +448,12 @@ PAKFIRE_EXPORT int pakfire_step_run(PakfireStep step,
                                        if (r)
                                                break;
 
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_POSTIN);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_POSTIN);
                                        break;
 
                                case PAKFIRE_STEP_UPGRADE:
                                case PAKFIRE_STEP_DOWNGRADE:
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_PREUP);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_PREUP);
                                        if (r)
                                                break;
 
@@ -457,12 +465,12 @@ PAKFIRE_EXPORT int pakfire_step_run(PakfireStep step,
                                        if (r)
                                                break;
 
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_POSTUP);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_POSTUP);
                                        break;
 
                                case PAKFIRE_STEP_ERASE:
                                case PAKFIRE_STEP_OBSOLETE:
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_PREUN);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_PREUN);
                                        if (r)
                                                break;
 
@@ -474,7 +482,7 @@ PAKFIRE_EXPORT int pakfire_step_run(PakfireStep step,
                                        if (r)
                                                break;
 
-                                       r = pakfire_step_run_script(step, PAKFIRE_SCRIPTLET_POSTUN);
+                                       r = pakfire_step_run_script(step, db, PAKFIRE_SCRIPTLET_POSTUN);
                                        break;
 
                                case PAKFIRE_STEP_IGNORE: