From: Michael Tremer Date: Sat, 30 Jan 2021 17:36:43 +0000 (+0000) Subject: libpakfire: db: Add scriptlets X-Git-Tag: 0.9.28~1285^2~794 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=265f539aca58e336e50e58c451a05cb84a1e2a0c;p=pakfire.git libpakfire: db: Add scriptlets Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index 39609632b..ff72704f6 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -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) diff --git a/src/libpakfire/include/pakfire/scriptlet.h b/src/libpakfire/include/pakfire/scriptlet.h index 75cf8c1ac..e572f097a 100644 --- a/src/libpakfire/include/pakfire/scriptlet.h +++ b/src/libpakfire/include/pakfire/scriptlet.h @@ -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 diff --git a/src/libpakfire/scriptlet.c b/src/libpakfire/scriptlet.c index 1ca4b6e1a..1f0166c7b 100644 --- a/src/libpakfire/scriptlet.c +++ b/src/libpakfire/scriptlet.c @@ -25,6 +25,22 @@ #include #include +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;