1 #define _POSIX_C_SOURCE 2
13 fprintf(stderr, "zpm-findpkg [-I] [-s <status> ...] [-S <status>] [package]\n");
16 static int prow(void *f, int ncols, char **vals, char **cols) {
21 fprintf(stderr, "sqlite can't get column names\n");
23 for (i=3;i<ncols;i++) {
24 if (i>3) fprintf(out, "\t");
25 fprintf(out, "%s", vals[i]);
32 void parse_package(char *pstr, char *name, char *ver, int *rel) {
37 /* string - ver - rel */
38 /* rel is all digits */
40 * ^(.+)-([0-9][^-]*)-([\d+])$
43 * The main problem in parsing is that the package name itself
44 * can contain a '-', so you can't just split on '-'
45 * Also, the version can be just digits.
48 /* everything up to the first '-' is in the name */
50 if (*pstr == '-' && isdigit(*(pstr+1))) {
62 while (*pstr && *pstr != '-') {
77 int main(int ac, char **av){
80 char *dbfile, *pkgstr;
81 char *select = "select package, version, release, package||'-'||version||'-'||release as pkgid from packages";
82 char *group = "group by package having max( version||'-'||release collate vercmp) order by length(package), package, version||'-'||release collate vercmp";
89 dbfile = getenv("ZPMDB");
91 query = sqlite3_str_new(NULL);
92 include = sqlite3_str_new(NULL);
93 exclude = sqlite3_str_new(NULL);
95 while ((opt = getopt(ac, av, "f:s:S:I")) != -1) {
97 case 'f': dbfile = optarg; break;
98 case 's': sqlite3_str_appendf(include,",%Q", optarg);
100 case 'S': sqlite3_str_appendf(exclude,",%Q", optarg);
102 case 'I': sqlite3_str_appendall(include,",'installed'");
113 fprintf(stderr, "must specify db\n");
117 /* given a package name, get the packages */
118 /* no package name, get all */
121 fprintf(stderr, "opening db %s\n", dbfile);
124 if (zpm_open(&pkg, dbfile)) {
126 char *excludes, *includes;
128 excludes = sqlite3_str_value(exclude);
129 includes = sqlite3_str_value(include);
131 sqlite3_str_appendall(query, " ");
132 sqlite3_str_appendall(query, select);
133 sqlite3_str_appendall(query, " where true");
136 sqlite3_str_appendf(query, " and status in (%s)", includes+1);
139 sqlite3_str_appendf(query, " and status not in (%s)", excludes+1);
149 parse_package(pkgstr, package, version, &release);
151 sqlite3_str_appendf(query, " and package = %Q",
155 sqlite3_str_appendf(query, " and version = %Q",
159 sqlite3_str_appendf(query, " and release = %d",
164 sqlite3_str_appendall(query, " ");
165 sqlite3_str_appendall(query, group);
166 sqlite3_str_appendall(query, ";");
168 sql = sqlite3_str_value(query);
171 fprintf(stderr, "q: %s\n", sql);
173 zpm_exec(&pkg, sql, prow, stdout, &errmsg);
175 fprintf(stderr, "unable to form database query\n");
179 return found ? 0 : 1;