#include #include #include "zpm.h" static int prow(void *f, int ncols, char **vals, char **cols) { FILE *out = f; int i; if (cols == 0) { fprintf(stderr, "sqlite can't get column names\n"); } for (i=3;i3) fprintf(out, "\t"); fprintf(out, "%s", vals[i]); } fprintf(out, "\n"); return 0; } 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"; // 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]; if (ac < 2) { fprintf(stderr, "usage: db path\n"); return 1; } /* this is really just read env */ zpm_readopts(&pkg, ac, av); /* given a package name, get the packages */ /* no package name, get all */ if (zpm_open(&pkg, av[1])) { char *errmsg; // char where[1024] = ""; /* 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); } /* 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"); zpm_exec(&pkg, sql, prow, stdout, &errmsg); } zpm_close(&pkg); return 0; }