curdir=$(shell pwd)
 
-ZPKGBIN=zpm-addfile zpm-extract zpm-init zpm-vercmp zpm-stat zpm-hash
+ZPKGBIN=zpm-addfile zpm-extract zpm-init zpm-vercmp zpm-stat zpm-hash \
+       zpm-findpkg
+
 def: programs
 d:
        printf '%s\n' $(LZMAOBJ)
 test: $(ZPKGBIN)
        PATH=$(curdir)/t:$(curdir):$(PATH) prove -e '' t/*.t
 
-programs: elftype soname zpm-soneed zpm-addfile zpm-extract zpm-init zpm-vercmp
+programs: elftype soname zpm-soneed zpm-addfile zpm-extract zpm-init \
+       zpm-vercmp zpm-findpkg
 
 uncompress: uncompress.o 
        $(CC) $(CFLAGS) -o $@ $+ -llzma
 zpm-extract: zpm-extract.o libzpm.a
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< -lzpm -lelf
 
+zpm-findpkg: zpm-findpkg.o libzpm.a
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< -lzpm -lelf
+
 newdb.c: db.sql
        echo "char createdb[] = {" > $@
        xxd -i < $< >> $@
 
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+#include "zpm.h"
+
+static int prow(void *f, int ncols, char **vals, char **cols) {
+       FILE *out = f;
+       int i;
+
+       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;
+}
+
+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";
+
+//     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;
+       }
+
+       /* this is really just read env */
+       zpm_readopts(&pkg, ac, av);
+
+       /* 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) {
+                       sprintf(sql, "%s where package = '%s' %s;",
+                                       select, av[2], group);
+               } else {
+                       sprintf(sql, "%s %s;", select, group);
+               }
+
+               /* 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");  
+
+               zpm_exec(&pkg, sql, prow, stdout, &errmsg);
+       }
+       zpm_close(&pkg);
+       return 0;
+}