]> pd.if.org Git - zpackage/blob - zpm-findpkg.c
use ZPMDB as package database if needed
[zpackage] / zpm-findpkg.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <ctype.h>
4
5 #include "zpm.h"
6
7 static int found = 0;
8
9 static int prow(void *f, int ncols, char **vals, char **cols) {
10         FILE *out = f;
11         int i;
12
13         if (cols == 0) {
14                 fprintf(stderr, "sqlite can't get column names\n");
15         }
16         for (i=3;i<ncols;i++) {
17                 if (i>3) fprintf(out, "\t");
18                 fprintf(out, "%s", vals[i]);
19         }
20         fprintf(out, "\n");
21         found++;
22         return 0;
23 }
24
25 void parse_package(char *pstr, char *name, char *ver, int *rel) {
26         if (name) *name = 0;
27         if (ver) *ver = 0;
28         if (rel) *rel = -1;
29
30         /* string - ver - rel */
31         /* rel is all digits */
32         /* possible forms:
33          * ^(.+)-([0-9][^-]*)-([\d+])$
34          * ^(.+)-([0-9][^-]*)$
35          * ^(.+)$
36          * The main problem in parsing is that the package name itself
37          * can contain a '-', so you can't just split on '-'
38          * Also, the version can be just digits.
39          */
40
41         /* everything up to the first '-' is in the name */
42         while (*pstr) {
43                 if (*pstr == '-' && isdigit(*(pstr+1))) {
44                         break;
45                 }
46                 if (name) {
47                         *name++ = *pstr;
48                 }
49                 pstr++;
50         }
51         if (name) *name = 0;
52         if (*pstr == '-') {
53                 pstr++;
54         }
55         while (*pstr && *pstr != '-') {
56                 if (ver) {
57                         *ver++ = *pstr;
58                 }
59                 pstr++;
60         }
61         if (ver) *ver = 0;
62         if (*pstr == '-') {
63                 pstr++;
64         }
65         if (rel && *pstr) {
66                 *rel = atoi(pstr);
67         }
68 }
69
70 int main(int ac, char **av){
71         struct zpm pkg;
72         char *dbfile, *pkgstr;
73         char *select = "select package, version, release, package||'-'||version||'-'||release as pkgid from packages";
74         char *group = "group by package having max( version||'-'||release collate vercmp) order by length(package), package, version||'-'||release collate vercmp";
75
76 //      char *select = "select package, version, release, package||'-'||version||'-'||release as pkgid from packages";
77 //      char *order = "order by package, version collate vercmp, cast(release as integer)";
78         char sql[2048];
79
80         if (ac < 2) {
81                 fprintf(stderr, "usage: db path\n");
82                 return 1;
83         }
84
85         dbfile = getenv("ZPMDB");
86
87         if (ac > 1) {
88                 dbfile = av[1];
89         }
90
91         /* given a package name, get the packages */
92         /* no package name, get all */
93
94         if (zpm_open(&pkg, dbfile)) {
95                 char *errmsg;
96
97                 if (ac >= 2) {
98                         int release;
99                         char version[32];
100                         char package[32];
101
102                         pkgstr = av[2];
103
104                         parse_package(pkgstr, package, version, &release);
105                         if (release != -1) {
106                                 /* all three */
107                         sprintf(sql, "%s where package = '%s' and version = "
108                                         "'%s' and release = %d %s;", select,
109                                         package, version, release, group);
110                         } else if (*version != 0) {
111                         sprintf(sql, "%s where package = '%s' and version = "
112                                         "'%s' %s;", select,
113                                         package, version, group);
114
115                         } else {
116
117                         sprintf(sql, "%s where package = '%s' %s;",
118                                         select, av[2], group);
119                         }
120                 } else {
121                         sprintf(sql, "%s %s;", select, group);
122                 }
123
124                 zpm_exec(&pkg, sql, prow, stdout, &errmsg);
125         }
126         zpm_close(&pkg);
127         return found ? 0 : 1;
128 }