"CREATE TABLE IF NOT EXISTS scriptlets("
"id INTEGER PRIMARY KEY, "
"pkg INTEGER, "
- "action TEXT, "
+ "type TEXT, "
"scriptlet TEXT, "
"FOREIGN KEY (pkg) REFERENCES packages(id)"
")");
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;
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)
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;
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
#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)
}
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;