/* * Remove any entry from the cache which has a data field of `pkg'. * Return value: * 1: everything ok * 0: error */ int pkgdb_remove_pkg(const char *pkg) { DBT data; DBT key; int type; int ret; int cc; char cachename[MaxPathSize]; if (pkgdbp == NULL) { return 0; } (void) _pkgdb_getPKGDB_FILE(cachename, sizeof(cachename)); cc = strlen(pkg); for (ret = 1, type = R_FIRST; (*pkgdbp->seq)(pkgdbp, &key, &data, type) == 0 ; type = R_NEXT) { if ((cc + 1) == data.size && strncmp(data.data, pkg, cc) == 0) { if (Verbose) { printf("Removing file `%s' from %s\n", (char *)key.data, cachename); } switch ((*pkgdbp->del)(pkgdbp, &key, 0)) { case -1: warn("Error removing `%s' from %s", (char *)key.data, cachename); ret = 0; break; case 1: warn("Key `%s' not present in %s", (char *)key.data, cachename); ret = 0; break; } } } return ret; }
/* * Open the pkg-database * Return value: * 1: everything ok * 0: error */ int pkgdb_open(int mode) { BTREEINFO info; char cachename[MaxPathSize]; /* try our btree format first */ info.flags = 0; info.cachesize = 2*1024*1024; info.maxkeypage = 0; info.minkeypage = 0; info.psize = 4096; info.compare = NULL; info.prefix = NULL; info.lorder = 0; pkgdbp = (DB *) dbopen(_pkgdb_getPKGDB_FILE(cachename, sizeof(cachename)), (mode == ReadOnly) ? O_RDONLY : O_RDWR | O_CREAT, 0644, DB_BTREE, (void *) &info); return (pkgdbp != NULL); }
static void rebuild(void) { char cachename[MaxPathSize]; int pkgcnt, filecnt; pkgcnt = 0; filecnt = 0; (void) _pkgdb_getPKGDB_FILE(cachename, sizeof(cachename)); if (unlink(cachename) != 0 && errno != ENOENT) err(EXIT_FAILURE, "unlink %s", cachename); setbuf(stdout, NULL); iterate_pkg_db(add_pkg, &filecnt); printf("\n"); printf("Stored %d file%s from %d package%s in %s.\n", filecnt, filecnt == 1 ? "" : "s", pkgcnt, pkgcnt == 1 ? "" : "s", cachename); }