]> pd.if.org Git - zpackage/blobdiff - zpm-findpkg.c
change findpkg to use -f option
[zpackage] / zpm-findpkg.c
index 95085d5590f3516ba21911189a2f3c5696cd40a8..3fd608c56327f5ed1653fb6fbbbef31811b18c79 100644 (file)
@@ -1,11 +1,18 @@
+#define _POSIX_C_SOURCE 2 
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <ctype.h>
+#include <unistd.h>
 
 #include "zpm.h"
 
 static int found = 0;
 
+void usage(void) {
+       fprintf(stderr, "zpm-findpkg [-I] [-s <status> ...] [-S <status>] [package]\n");
+}
+
 static int prow(void *f, int ncols, char **vals, char **cols) {
        FILE *out = f;
        int i;
@@ -68,60 +75,105 @@ void parse_package(char *pstr, char *name, char *ver, int *rel) {
 }
 
 int main(int ac, char **av){
+       int opt;
        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;
-       }
+       char *sql;
+       sqlite3_str *include;
+       sqlite3_str *exclude;
+       sqlite3_str *query;
 
        dbfile = getenv("ZPMDB");
 
-       if (ac > 1) {
-               dbfile = av[1];
+       query = sqlite3_str_new(NULL);
+       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;
+               }
+       }
+       int argn = optind;
+
+       if (!dbfile) {
+               fprintf(stderr, "must specify db\n");
+               return 1;
        }
 
        /* given a package name, get the packages */
        /* no package name, get all */
 
+#ifdef DEBUG
+       fprintf(stderr, "opening db %s\n", dbfile);
+#endif
+
        if (zpm_open(&pkg, dbfile)) {
                char *errmsg;
+               char *excludes, *includes;
 
-               if (ac >= 2) {
+               excludes = sqlite3_str_value(exclude);
+               includes = sqlite3_str_value(include);
+
+               sqlite3_str_appendall(query, " ");
+               sqlite3_str_appendall(query, select);
+               sqlite3_str_appendall(query, " where true");
+
+               if (includes) {
+                       sqlite3_str_appendf(query, " and status in (%s)", includes+1);
+               }
+               if (excludes) {
+                       sqlite3_str_appendf(query, " and status not in (%s)", excludes+1);
+               }
+
+               if (ac >= argn) {
                        int release;
                        char version[32];
                        char package[32];
 
-                       pkgstr = av[2];
+                       pkgstr = av[argn];
 
                        parse_package(pkgstr, package, version, &release);
+                       if (*package != 0) {
+                               sqlite3_str_appendf(query, " and package = %Q",
+                                               package);
+                       }
+                       if (*version != 0) {
+                               sqlite3_str_appendf(query, " and version = %Q",
+                                               version);
+                       }
                        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);
+                               sqlite3_str_appendf(query, " and release = %d",
+                                               release);
                        }
-               } else {
-                       sprintf(sql, "%s %s;", select, group);
                }
 
-               zpm_exec(&pkg, sql, prow, stdout, &errmsg);
+               sqlite3_str_appendall(query, " ");
+               sqlite3_str_appendall(query, group);
+               sqlite3_str_appendall(query, ";");
+
+               sql = sqlite3_str_value(query);
+               if (sql) {
+#ifdef DEBUG
+                       fprintf(stderr, "q: %s\n", sql);
+#endif
+                       zpm_exec(&pkg, sql, prow, stdout, &errmsg);
+               } else {
+                       fprintf(stderr, "unable to form database query\n");
+               }
        }
        zpm_close(&pkg);
        return found ? 0 : 1;