X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=lib%2Ffindpkg.c;h=6ea843cbecad5f39d6d5d280055734f23702a78e;hb=c907b8ec08b06a4a256fd12b79b4bcf5088fbb19;hp=cbf70042c413baa4671a36005b83f6987d1459f3;hpb=86d8fda79c6b83f5b1790388d9e419d999232d45;p=zpackage diff --git a/lib/findpkg.c b/lib/findpkg.c index cbf7004..6ea843c 100644 --- a/lib/findpkg.c +++ b/lib/findpkg.c @@ -8,6 +8,7 @@ #include "zpm.h" #include "sqlite3.h" +#include "lib/jsw/jsw_atree.h" #define DMARK fprintf(stderr, "mark %s %s:%d\n", __FILE__, __func__, __LINE__) @@ -34,11 +35,102 @@ void zpm_sqlite_error(struct zpm *zpm) { zpm->errmsg = strdup((const char *)sqlite3_errmsg(zpm->db)); } +char *zpm_findlib(struct zpm *zpm, char *soname, char *where) { + char *select = "select pkgid, package, version, release from packagefiles_status join elflibraries on file = hash"; + char *group = "order by package, version collate vercmp desc, cast(release as integer)"; + sqlite3_str *sql; + char *query, *pkgid = 0; + + /* null pkgstr find "best" package + * best is shortest complete package if any are complete + * shortest incomplete if any are incomplete + * where more than one version is in those sets, best is + * latest as determined by vercmp + */ + + sql = sqlite3_str_new(zpm->db); + + sqlite3_str_appendall(sql, select); + sqlite3_str_appendf(sql, " where soname = %Q", soname); + + if (where) { + sqlite3_str_appendall(sql, " and "); + sqlite3_str_appendall(sql, where); + } + + sqlite3_str_appendall(sql, " "); + sqlite3_str_appendall(sql, group); + sqlite3_str_appendall(sql, " limit 1;"); + + if (sqlite3_str_errcode(sql)) { + zpm->error = 1; + sqlite3_free(sqlite3_str_finish(sql)); + return 0; + } + + query = sqlite3_str_finish(sql); + + pkgid = zpm_db_string(zpm, query);; + + sqlite3_free(query); + + return pkgid; +} + +int zpm_libraries_needed(struct zpm *zpm, char *pkgid, jsw_atree_t *list) { + char *pkglibsneeded = "\ + with pkglibs as (\ + select distinct EN.needed as soname, PF.pkgid\ + from elfneeded EN\ + join packagefiles_pkgid PF on PF.hash = EN.file\ + ),\ + pkgprovides as (\ + select distinct EL.soname, PF.pkgid\ + from elflibraries EL\ + join packagefiles_pkgid PF on PF.hash = EL.file\ + )\ + select distinct PL.soname, PP.soname is not null as selfsatisfied\ + from pkglibs PL\ + left join pkgprovides PP on PL.pkgid = PP.pkgid and PL.soname = PP.soname\ + where PL.pkgid = %Q\ + "; + + sqlite3_stmt *st; + int count = 0; + int rv; + + st = zpm_dbquery(zpm, pkglibsneeded, pkgid); + + while ((rv = sqlite3_step(st)) == SQLITE_ROW) { + char *soname; + int self; + + soname = (char *)sqlite3_column_text(st, 0); + /* TODO check and skip self sats */ + self = sqlite3_column_int(st,1); + if (self) { + continue; + } + count++; + + /* if it's in needed, we've already looked at this one */ + if (list && !jsw_afind(list, soname)) { + jsw_ainsert(list, soname); + } + } + + sqlite3_finalize(st); + return count; +} + char *zpm_findpkg(struct zpm *zpm, char *pkgstr, char *where) { char *select = "select pkgid, package, version, release from packages_pkgid"; +#if 0 char *group = "group by package having max( version||'-'||release collate vercmp) order by length(package), package, version||'-'||release collate vercmp"; - -// char *order = "order by package, version collate vercmp, cast(release as integer)"; +#else + char *group = "order by package, version collate vercmp desc, cast(release as integer)"; + //group = "order by package, version , cast(release as integer)"; +#endif sqlite3_str *sql; char *query, *pkgid = 0;