X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=zpm-findpkg.c;h=4ee3f120e9131d84efd401fd5c9b9dd1b8ce6981;hb=4b448fbc77510c589cc7f367c05bef63acc07858;hp=68baecad2d6889040ba0788f63eab836bdd7453d;hpb=324303554d33d5a3643fa73ec53c5c41e71cd54a;p=zpackage diff --git a/zpm-findpkg.c b/zpm-findpkg.c index 68baeca..4ee3f12 100644 --- a/zpm-findpkg.c +++ b/zpm-findpkg.c @@ -1,61 +1,86 @@ +#define _POSIX_C_SOURCE 2 + #include #include -#include "zpm.h" +#include +#include -static int prow(void *f, int ncols, char **vals, char **cols) { - FILE *out = f; - int i; +#include "zpm.h" - cols = 0; /* suppress warning */ - for (i=3;i3) fprintf(out, "\t"); - fprintf(out, "%s", vals[i]); - } - fprintf(out, "\n"); - return 0; +void usage(void) { + fprintf(stderr, "zpm-findpkg [-I] [-s ...] [-S ] [package]\n"); } int main(int ac, char **av){ - struct zpm pkg; - char *select = "select package, version, release, package||'-'||version||'-'||release as pkgid from packages"; - char *group = "group by package having max( version||'-'||release collate vercmp) order by length(package), package, version||'-'||release collate vercmp"; + int opt, argn; + struct zpm zpm; + char *dbfile = 0, *pkgstr = 0, *pkgid = 0; -// char *select = "select package, version, release, package||'-'||version||'-'||release as pkgid from packages"; -// char *order = "order by package, version collate vercmp, cast(release as integer)"; - char sql[2048]; + char *sql; + sqlite3_str *include; + sqlite3_str *exclude; + sqlite3_str *query; - if (ac < 2) { - fprintf(stderr, "usage: db path\n"); + dbfile = getenv("ZPMDB"); + if (!dbfile) { + dbfile = "/var/lib/zpm/local.db"; + } + + include = sqlite3_str_new(NULL); + exclude = sqlite3_str_new(NULL); + + while ((opt = getopt(ac, av, "f:s:S:I")) != -1) { + switch (opt) { + case 'f': dbfile = optarg; break; + case 's': sqlite3_str_appendf(include,",%Q", optarg); + break; + case 'S': sqlite3_str_appendf(exclude,",%Q", optarg); + break; + case 'I': sqlite3_str_appendall(include,",'installed'"); + break; + default: + usage(); + exit(EXIT_FAILURE); + break; + } + } + argn = optind; + + if (!dbfile) { + fprintf(stderr, "must specify db\n"); return 1; } - /* this is really just read env */ - zpm_readopts(&pkg, ac, av); + query = sqlite3_str_new(NULL); - /* given a package name, get the packages */ - /* no package name, get all */ + if (zpm_open(&zpm, dbfile)) { + char *excludes, *includes; - if (zpm_open(&pkg, av[1])) { - char *errmsg; -// char where[1024] = ""; + excludes = sqlite3_str_value(exclude); + includes = sqlite3_str_value(include); - /* TODO allow more args to nail down version and release */ - if (ac >= 3) { - sprintf(sql, "%s where package = '%s' %s;", - select, av[2], group); - } else { - sprintf(sql, "%s %s;", select, group); + if (includes) { + sqlite3_str_appendf(query, "status in (%s)", includes+1); + } + if (excludes) { + sqlite3_str_appendf(query, "%sstatus not in (%s)", + includes ? " and " : "", + excludes+1); } - /* install a collation function */ - zpm_addvercmp(&pkg); - /* sqlite seems to need the columns in the result to - * do the sort right */ -// zpm_exec(&pkg, "select package, version, release, package||'-'||version||'-'||release as pkgid from packages order by package, version collate vercmp, cast(release as integer)", prow, stdout, &errmsg); -// fprintf(stdout, "\n"); + if (ac >= argn) { + pkgstr = av[argn]; + } - zpm_exec(&pkg, sql, prow, stdout, &errmsg); + sql = sqlite3_str_value(query); + + pkgid = zpm_findpkg(&zpm, pkgstr, sql); + + sqlite3_free(sql); + if (pkgid) { + printf("%s\n", pkgid); + } + zpm_close(&zpm); } - zpm_close(&pkg); - return 0; + return pkgid ? 0 : 1; }