}
char *zpm_findlib(struct zpm *zpm, char *soname, char *where) {
- char *select = "select pkgid, package, version, release from packagefiles_status join elflibraries on file = hash";
- char *group = "order by package, version collate vercmp desc, cast(release as integer)";
sqlite3_str *sql;
char *query, *pkgid = 0;
+char *select = "select printf('%%s-%%s-%%s',P.package,P.version,P.release) as pkgid, P.package, P.version, P.release\
+ from packagefiles PF\
+ join elflibraries EL on EL.file = PF.hash\
+ join packages P on P.package = PF.package and P.version = PF.version and P.release = PF.release";
+ char *order = "order by P.package, P.version, cast(P.release as integer)";
+
/* null pkgstr find "best" package
* best is shortest complete package if any are complete
* shortest incomplete if any are incomplete
sql = sqlite3_str_new(zpm->db);
sqlite3_str_appendall(sql, select);
- sqlite3_str_appendf(sql, " where soname = %Q", soname);
+ sqlite3_str_appendf(sql, " where P.hash is not null and EL.soname = %Q", soname);
if (where) {
sqlite3_str_appendall(sql, " and ");
}
sqlite3_str_appendall(sql, " ");
- sqlite3_str_appendall(sql, group);
+ sqlite3_str_appendall(sql, order);
sqlite3_str_appendall(sql, " limit 1;");
if (sqlite3_str_errcode(sql)) {
# garbage collect a package database
# flags to skip phases
+# -C clear all phases
+# -n dry run
+# -a all phases
+# default is failed packages, orphaned elf, vacuum
+#
+# phases
+# -cC remove command history by date
+# -dD remove dry run
+# -eE remove orphaned elf
+# -fF remove failed
+# -hH fix file content hash
+# -hH remove install history by date
+# -lL remove old logs, given by date
+# -nN remove acked notes
+# -oO remove outdated packages, unless preserved
+# -pP remove history for removed packages
+# -rR remove orphaned rows in files table packagefiles, notes, scripts, ...
+# -rR remove removed packages, unless preserved
+# -vV compactify the database file
+
db=${1:-${ZPMDB:-/var/lib/zpm/local.db}}
if [ -z "$db" ]; then
struct zpm *zpmdb;
glob_t repos;
int matchallpkgfile;
+ int verbose;
};
char *pathcat(char *dir, char *path) {
return NULL;
}
- pkgid = zpm_findpkg(&pkgfile, pkgstr, "hash is not null");
+ pkgid = zpm_findpkg(&pkgfile, pkgstr, NULL);
zpm_close(&pkgfile);
return pkgid;
return NULL;
}
- pkgid = zpm_findlib(&pkgfile, soname, "hash is not null");
+ pkgid = zpm_findlib(&pkgfile, soname, NULL);
if (pkgfile.error) {
fprintf(stderr, "sql error: %s\n", pkgfile.errmsg);
}
if (opt->localdb) {
installed = zpm_findlib(opt->zpmdb, soname, "status = 'installed'");
if (installed) {
+ if (opt->verbose > 1) {
+ fprintf(stderr, "library %s installed via %s\n", soname, installed);
+ }
/* we're done, the lib is installed */
return 2;
}
}
for (i = 0; i < opt->repos.gl_pathc; i++) {
+ if (opt->verbose > 1) {
+ fprintf(stderr, "checking %s for %s\n", opt->repos.gl_pathv[i], soname);
+ }
found = checkfileforlib(soname, opt->repos.gl_pathv[i]);
if (found) {
+ if (opt->verbose > 1) {
+ fprintf(stderr, "found %s\n", found);
+ }
rv = zpm_vercmp(found, latest);
if (rv == 1) {
latest = found;
free(pkgfile);
pkgfile = strdup(opt->repos.gl_pathv[i]);
}
+ } else if (opt->verbose > 1) {
+ fprintf(stderr, "not found\n");
}
}
int found;
struct pkgloc pkginfo;
+ if (opts->verbose > 1) {
+ fprintf(stderr, "checking for %s\n", soname);
+ }
/* if it's in checked_libs, we've already looked at this one */
if (jsw_afind(checked_libs, soname)) {
+ if (opts->verbose > 1) {
+ fprintf(stderr, "already checked for %s\n", soname);
+ }
continue;
}
*/
int output = 1;
- while ((option = getopt(ac, av, "ljqPRDp:r:d:M")) != -1) {
+ while ((option = getopt(ac, av, "ljqPRDvp:r:d:M")) != -1) {
switch (option) {
case 'l': findlibs = 1; break;
case 'j': json = 1; break;
case 'R': opt.repodir = 0; break;
case 'D': opt.localdb = 0; break;
case 'M': opt.matchallpkgfile = 1; break;
+ case 'v': opt.verbose++; break;
default:
exit(EXIT_FAILURE);
break;
return 3;
}
+ if (opt.verbose > 1) {
+ unsigned int i;
+ fprintf(stderr, "globs:");
+ for (i = 0; i < opt.repos.gl_pathc; i++) {
+ fprintf(stderr, " %s", opt.repos.gl_pathv[i]);
+ }
+ fprintf(stderr, "\n");
+ }
+
packages = jsw_hnew(ac,NULL,(cmp_f)strcmp,(keydup_f)strdup,
(itemdup_f)strdup,free,free);
check = jsw_hnew(ac,NULL,(cmp_f)strcmp,(keydup_f)strdup,