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