poldek: poldek/pkgdir/pkgdir.c, poldek/pkgdir/pkgdir_dirindex.c - ...
mis
mis at pld-linux.org
Wed Aug 23 21:52:47 CEST 2006
Author: mis Date: Wed Aug 23 19:52:47 2006 GMT
Module: poldek Tag: HEAD
---- Log message:
- auto-rebuild dirindex if it's broken or outdated
---- Files affected:
poldek/poldek/pkgdir:
pkgdir.c (1.45 -> 1.46) , pkgdir_dirindex.c (1.6 -> 1.7)
---- Diffs:
================================================================
Index: poldek/poldek/pkgdir/pkgdir.c
diff -u poldek/poldek/pkgdir/pkgdir.c:1.45 poldek/poldek/pkgdir/pkgdir.c:1.46
--- poldek/poldek/pkgdir/pkgdir.c:1.45 Sun Aug 20 20:14:58 2006
+++ poldek/poldek/pkgdir/pkgdir.c Wed Aug 23 21:52:42 2006
@@ -570,6 +570,23 @@
packages_score_ignore(pkgdir->pkgs, pkgdir->src->ign_patterns, 1);
}
+static void do_open_dirindex(struct pkgdir *pkgdir)
+{
+ /* XXX: a workaround - tndb cannon create empty files */
+ if (n_array_size(pkgdir->pkgs) == 0)
+ return;
+
+ pkgdir->dirindex = pkgdir_dirindex_open(pkgdir);
+
+ /* broken or outdated dirindex, shouldn't happen, but... */
+ if (pkgdir->dirindex == NULL) {
+ msgn(1, "Rebuilding %s's directory index...", pkgdir_idstr(pkgdir));
+ pkgdir_dirindex_create(pkgdir); /* rebuild, open removes index on fail*/
+ pkgdir->dirindex = pkgdir_dirindex_open(pkgdir);
+ }
+}
+
+
int pkgdir_load(struct pkgdir *pkgdir, tn_array *depdirs, unsigned ldflags)
{
tn_array *foreign_depdirs = NULL;
@@ -648,7 +665,7 @@
pkgdir->_ldflags = ldflags;
if (ldflags & PKGDIR_LD_DIRINDEX)
- pkgdir->dirindex = pkgdir_dirindex_open(pkgdir);
+ do_open_dirindex(pkgdir);
return rc;
}
================================================================
Index: poldek/poldek/pkgdir/pkgdir_dirindex.c
diff -u poldek/poldek/pkgdir/pkgdir_dirindex.c:1.6 poldek/poldek/pkgdir/pkgdir_dirindex.c:1.7
--- poldek/poldek/pkgdir/pkgdir_dirindex.c:1.6 Wed Aug 23 20:44:57 2006
+++ poldek/poldek/pkgdir/pkgdir_dirindex.c Wed Aug 23 21:52:42 2006
@@ -313,7 +313,8 @@
n_assert(n > 0);
n += n_snprintf(&path[n], size - n, "/dirindex-of-%s.tndb", pkgdir->type);
DBGF("result = %s\n", path);
-
+ n_assert(n > 0);
+
return n;
}
@@ -414,37 +415,34 @@
{
struct tndb *db;
char path[PATH_MAX];
- int i;
- tn_alloc *na;
- tn_hash *idmap, *keymap;
+ int i, rc = 0;
+ tn_alloc *na = NULL;
+ tn_hash *idmap = NULL, *keymap = NULL;
struct pkgdir_dirindex *dirindex = NULL;
- if (n_array_size(pkgdir->pkgs) == 0)
- return NULL;
-
+ n_assert(n_array_size(pkgdir->pkgs)); /* XXX: tndb w/o */
+
dirindex_path(path, sizeof(path), pkgdir);
+
msgn(2, "Opening directory index of %s...", pkgdir_idstr(pkgdir));
MEMINF("start");
-
+
+ rc = 0;
if ((db = tndb_open(path)) == NULL) {
logn(LOGERR, "%s: open failed", path);
- return NULL;
+ goto l_end;
}
if (!tndb_verify(db)) {
logn(LOGERR, _("%s: broken directory index"), path);
- tndb_unlink(db);
- tndb_close(db);
- return NULL;
+ goto l_end;
}
MEMINF("opened");
- if ((keymap = load_ids(db, n_array_size(pkgdir->pkgs))) == NULL) {
- tndb_unlink(db);
- tndb_close(db);
- return NULL;
- }
+ if ((keymap = load_ids(db, n_array_size(pkgdir->pkgs))) == NULL)
+ goto l_end;
+
MEMINF("keymap");
@@ -462,7 +460,11 @@
if (id)
n_hash_replace(idmap, id, pkg_link(pkg));
-
+ else {
+ logn(LOGERR, _("%s: outdated directory index"), path);
+ goto l_end;
+ }
+
key[0] = '_';
key[1] = KEY_REQDIR;
@@ -492,12 +494,32 @@
n_str_tokl_free(tl_save);
}
- n_hash_free(keymap);
+ rc = 1; /* success */
+l_end:
+ if (keymap)
+ n_hash_free(keymap);
+
+ if (rc) { /* OK */
+ dirindex = na->na_malloc(na, sizeof(*dirindex));
+ dirindex->db = db;
+ dirindex->na = na;
+ dirindex->idmap = idmap;
+
+ } else { /* ERR */
+ if (db == NULL) {
+ vf_unlink(path);
+ } else {
+ tndb_unlink(db);
+ tndb_close(db);
+ }
+
+ if (idmap)
+ n_hash_free(idmap);
+
+ if (na)
+ n_alloc_free(na);
+ }
- dirindex = na->na_malloc(na, sizeof(*dirindex));
- dirindex->db = db;
- dirindex->na = na;
- dirindex->idmap = idmap;
MEMINF("end");
return dirindex;
================================================================
---- CVS-web:
http://cvs.pld-linux.org/poldek/poldek/pkgdir/pkgdir.c?r1=1.45&r2=1.46&f=u
http://cvs.pld-linux.org/poldek/poldek/pkgdir/pkgdir_dirindex.c?r1=1.6&r2=1.7&f=u
More information about the pld-cvs-commit
mailing list