Switch to side-by-side view

--- a/src/rcldb/rcldb.cpp
+++ b/src/rcldb/rcldb.cpp
@@ -1,5 +1,5 @@
 #ifndef lint
-static char rcsid[] = "@(#$Id: rcldb.cpp,v 1.26 2005-04-04 13:18:46 dockes Exp $ (C) 2004 J.F.Dockes";
+static char rcsid[] = "@(#$Id: rcldb.cpp,v 1.27 2005-04-05 09:35:35 dockes Exp $ (C) 2004 J.F.Dockes";
 #endif
 #include <stdio.h>
 #include <sys/stat.h>
@@ -317,9 +317,17 @@
     splitter.text_to_words(noacc);
 
     newdocument.add_term("T" + doc.mimetype);
-    string pathterm  = doc.ipath.empty() ? 
-	"P" + fn : "P" + fn + "|" + doc.ipath;
+
+    string pathterm  = "P" + fn;
     newdocument.add_term(pathterm);
+
+    string uniterm;
+    if (!doc.ipath.empty()) {
+	uniterm  = "Q" + fn + "|" + doc.ipath;
+	newdocument.add_term(uniterm);
+    }
+
+
     const char *fnc = fn.c_str();
     
     // Document data record. omindex has the following nl separated fields:
@@ -342,7 +350,6 @@
     LOGDEB1(("Newdocument data: %s\n", record.c_str()));
     newdocument.set_data(record);
 
-
     time_t mtime = atol(doc.mtime.c_str());
     struct tm *tm = localtime(&mtime);
     char buf[9];
@@ -360,7 +367,8 @@
     // entry.
     try {
 	Xapian::docid did = 
-	    ndb->wdb.replace_document(pathterm, newdocument);
+	    ndb->wdb.replace_document(uniterm.empty() ? pathterm : uniterm, 
+				      newdocument);
 	if (did < ndb->updated.size()) {
 	    ndb->updated[did] = true;
 	    LOGDEB(("Rcl::Db::add: docid %d updated [%s , %s]\n", did, fnc,
@@ -385,33 +393,44 @@
 	return false;
     Native *ndb = (Native *)pdata;
 
+    // If no document exist with this path, we do need update
     string pathterm  = "P" + filename;
     if (!ndb->wdb.term_exists(pathterm)) {
-	pathterm += string("|") + "1";
-	if (!ndb->wdb.term_exists(pathterm)) {
-	    return true;
-	}
-    }
+	return true;
+    }
+
+    // Look for all documents with this path. Check the update time (once). 
+    // If the db is up to date, set the update flags for all documents
     Xapian::PostingIterator doc;
     try {
-	Xapian::PostingIterator did = ndb->wdb.postlist_begin(pathterm);
-	if (did == ndb->wdb.postlist_end(pathterm))
-	    return true;
-	Xapian::Document doc = ndb->wdb.get_document(*did);
-	string data = doc.get_data();
-	const char *cp = strstr(data.c_str(), "mtime=");
-	cp += 6;
-	long mtime = atol(cp);
-	if (mtime >= stp->st_mtime) {
+	Xapian::PostingIterator did0 = ndb->wdb.postlist_begin(pathterm);
+	for (Xapian::PostingIterator did = did0;
+	     did != ndb->wdb.postlist_end(pathterm); did++) {
+
+	    Xapian::Document doc = ndb->wdb.get_document(*did);
+
+	    // Check the date once. no need to look at the others if the
+	    // db needs updating.
+	    if (did == did0) {
+		string data = doc.get_data();
+		const char *cp = strstr(data.c_str(), "mtime=");
+		cp += 6;
+		long mtime = atol(cp);
+		if (mtime < stp->st_mtime) {
+		    // Db is not up to date. Let's index the file
+		    return true;
+		} 
+	    }
+
+	    // Db is up to date. Make a note that this document exists.
 	    if (*did < ndb->updated.size())
 		ndb->updated[*did] = true;
-	    return false;
-	} 
+	}
     } catch (...) {
 	return true;
     }
 
-    return true;
+    return false;
 }
 
 /// Compute name of stem db for given base database and language
@@ -582,7 +601,7 @@
 		ndb->wdb.delete_document(did);
 		LOGDEB(("Rcl::Db::purge: deleted document #%d\n", did));
 	    } catch (const Xapian::DocNotFoundError &) {
-		LOGDEB(("Rcl::Db::purge: document #%d not found\n", did));
+		LOGDEB2(("Rcl::Db::purge: document #%d not found\n", did));
 	    }
 	}
     }