]> pd.if.org Git - zpackage/blobdiff - zpm-findpkg.c
implement trust on first use
[zpackage] / zpm-findpkg.c
index 68baecad2d6889040ba0788f63eab836bdd7453d..4ee3f120e9131d84efd401fd5c9b9dd1b8ce6981 100644 (file)
@@ -1,61 +1,86 @@
+#define _POSIX_C_SOURCE 2 
+
 #include <stdlib.h>
 #include <stdio.h>
-#include "zpm.h"
+#include <ctype.h>
+#include <unistd.h>
 
-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;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");
 }
 
 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;
 }