From: Michael Tremer Date: Sat, 6 Feb 2021 17:05:03 +0000 (+0000) Subject: db: Import dependencies X-Git-Tag: 0.9.28~1285^2~793 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1fb2b526436baab9a506e442b839e1047059fd05;p=pakfire.git db: Import dependencies Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index ff72704f6..f4769c3dd 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -625,6 +626,103 @@ PAKFIRE_EXPORT int pakfire_db_check(struct pakfire_db* db) { return 0; } +static int pakfire_db_add_dependencies(struct pakfire_db* db, unsigned long id, PakfirePackage pkg) { + sqlite3_stmt* stmt = NULL; + int r = 1; + + const char* sql = "INSERT INTO dependencies(pkg, type, dependency) 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; + } + + const struct __relation { + const char* type; + PakfireRelationList (*func)(PakfirePackage); + } relations[] = { + { "provides", pakfire_package_get_provides }, + { "prerequires", pakfire_package_get_prerequires }, + { "requires", pakfire_package_get_requires }, + { "conflicts", pakfire_package_get_conflicts }, + { "obsoletes", pakfire_package_get_obsoletes }, + { "recommends", pakfire_package_get_recommends }, + { "suggests", pakfire_package_get_suggests }, + { NULL, NULL }, + }; + + for (const struct __relation* relation = relations; relation->type; relation++) { + PakfireRelationList list = relation->func(pkg); + if (!list) + continue; + + for (int i = 0; i < pakfire_relationlist_count(list); i++) { + PakfireRelation rel = pakfire_relationlist_get_clone(list, i); + if (!rel) + goto END; + + char* dependency = pakfire_relation_str(rel); + if (!dependency) { + pakfire_relation_unref(rel); + r = 1; + goto END; + } + + // 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)); + pakfire_relation_unref(rel); + goto END; + } + + // Bind type + r = sqlite3_bind_text(stmt, 2, relation->type, -1, NULL); + if (r) { + ERROR(db->pakfire, "Could not bind type: %s\n", + sqlite3_errmsg(db->handle)); + pakfire_relation_unref(rel); + goto END; + } + + // Bind dependency + r = sqlite3_bind_text(stmt, 3, dependency, -1, NULL); + if (r) { + ERROR(db->pakfire, "Could not bind dependency: %s\n", + sqlite3_errmsg(db->handle)); + pakfire_relation_unref(rel); + goto END; + } + + // Execute query + do { + r = sqlite3_step(stmt); + } while (r == SQLITE_BUSY); + + pakfire_relation_unref(rel); + free(dependency); + + // Reset bound values + sqlite3_reset(stmt); + } + + pakfire_relationlist_unref(list); + } + + // All okay + r = 0; + +END: + if (stmt) + sqlite3_finalize(stmt); + + return r; +} + static int pakfire_db_add_files(struct pakfire_db* db, unsigned long id, PakfireArchive archive) { sqlite3_stmt* stmt = NULL; int r = 1; @@ -859,7 +957,6 @@ END: return r; } - PAKFIRE_EXPORT int pakfire_db_add_package(struct pakfire_db* db, PakfirePackage pkg, PakfireArchive archive) { sqlite3_stmt* stmt = NULL; @@ -1077,6 +1174,11 @@ PAKFIRE_EXPORT int pakfire_db_add_package(struct pakfire_db* db, if (r == SQLITE_OK) stmt = NULL; + // Add dependencies + r = pakfire_db_add_dependencies(db, packages_id, pkg); + if (r) + goto ROLLBACK; + // Add files r = pakfire_db_add_files(db, packages_id, archive); if (r)