#include #include #include #include "zpm.h" static int found = 0; 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"); found++; return 0; } void parse_package(char *pstr, char *name, char *ver, int *rel) { if (name) *name = 0; if (ver) *ver = 0; if (rel) *rel = -1; /* string - ver - rel */ /* rel is all digits */ /* possible forms: * ^(.+)-([0-9][^-]*)-([\d+])$ * ^(.+)-([0-9][^-]*)$ * ^(.+)$ * The main problem in parsing is that the package name itself * can contain a '-', so you can't just split on '-' * Also, the version can be just digits. */ /* everything up to the first '-' is in the name */ while (*pstr) { if (*pstr == '-' && isdigit(*(pstr+1))) { break; } if (name) { *name++ = *pstr; } pstr++; } if (name) *name = 0; if (*pstr == '-') { pstr++; } while (*pstr && *pstr != '-') { if (ver) { *ver++ = *pstr; } pstr++; } if (ver) *ver = 0; if (*pstr == '-') { pstr++; } if (rel && *pstr) { *rel = atoi(pstr); } } int main(int ac, char **av){ struct zpm pkg; char *dbfile, *pkgstr; 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; } dbfile = getenv("ZPMDB"); if (ac > 1) { dbfile = av[1]; } /* given a package name, get the packages */ /* no package name, get all */ if (zpm_open(&pkg, dbfile)) { char *errmsg; if (ac >= 2) { int release; char version[32]; char package[32]; pkgstr = av[2]; parse_package(pkgstr, package, version, &release); if (release != -1) { /* all three */ sprintf(sql, "%s where package = '%s' and version = " "'%s' and release = %d %s;", select, package, version, release, group); } else if (*version != 0) { sprintf(sql, "%s where package = '%s' and version = " "'%s' %s;", select, package, version, group); } else { sprintf(sql, "%s where package = '%s' %s;", select, av[2], group); } } else { sprintf(sql, "%s %s;", select, group); } zpm_exec(&pkg, sql, prow, stdout, &errmsg); } zpm_close(&pkg); return found ? 0 : 1; }