]> pd.if.org Git - zpackage/blobdiff - zpm-findpkg.c
implement trust on first use
[zpackage] / zpm-findpkg.c
index a376fae07e3a655b02023301c1790956995a29e0..4ee3f120e9131d84efd401fd5c9b9dd1b8ce6981 100644 (file)
+#define _POSIX_C_SOURCE 2 
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <ctype.h>
+#include <unistd.h>
 
 #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;i<ncols;i++) {
-               if (i>3) fprintf(out, "\t");
-               fprintf(out, "%s", vals[i]);
-       }
-       fprintf(out, "\n");
-       return 0;
+void usage(void) {
+       fprintf(stderr, "zpm-findpkg [-I] [-s <status> ...] [-S <status>] [package]\n");
 }
 
-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++;
+int main(int ac, char **av){
+       int opt, argn;
+       struct zpm zpm;
+       char *dbfile = 0, *pkgstr = 0, *pkgid = 0;
+
+       char *sql;
+       sqlite3_str *include;
+       sqlite3_str *exclude;
+       sqlite3_str *query;
+
+       dbfile = getenv("ZPMDB");
+       if (!dbfile) {
+               dbfile = "/var/lib/zpm/local.db";
        }
-       while (*pstr && *pstr != '-') {
-               if (ver) {
-                       *ver++ = *pstr;
+
+       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;
                }
-               pstr++;
        }
-       if (ver) *ver = 0;
-       if (*pstr == '-') {
-               pstr++;
-       }
-       if (rel && *pstr) {
-               *rel = atoi(pstr);
+       argn = optind;
+
+       if (!dbfile) {
+               fprintf(stderr, "must specify db\n");
+               return 1;
        }
-}
 
-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";
+       query = sqlite3_str_new(NULL);
 
-//     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 (zpm_open(&zpm, dbfile)) {
+               char *excludes, *includes;
 
-       if (ac < 2) {
-               fprintf(stderr, "usage: db path\n");
-               return 1;
-       }
+               excludes = sqlite3_str_value(exclude);
+               includes = sqlite3_str_value(include);
 
-       /* 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) {
-                       int release;
-                       char version[32];
-                       char package[32];
-
-                       parse_package(av[2], 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);
+               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);
+               }
+
+               if (ac >= argn) {
+                       pkgstr = av[argn];
                }
 
-               /* 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");  
+               sql = sqlite3_str_value(query);
 
-               zpm_exec(&pkg, sql, prow, stdout, &errmsg);
+               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;
 }