Switch to side-by-side view

--- a/src/index/recollindex.cpp
+++ b/src/index/recollindex.cpp
@@ -1,139 +1,13 @@
 #ifndef lint
-static char rcsid[] = "@(#$Id: recollindex.cpp,v 1.7 2005-01-29 15:41:11 dockes Exp $ (C) 2004 J.F.Dockes";
+static char rcsid[] = "@(#$Id: recollindex.cpp,v 1.8 2005-01-31 14:31:09 dockes Exp $ (C) 2004 J.F.Dockes";
 #endif
 
-#include <sys/stat.h>
+#include <stdio.h>
+#include <signal.h>
 
-#include <strings.h>
+#include "indexer.h"
 
-#include <iostream>
-#include <list>
-#include <map>
-
-#include "pathut.h"
-#include "conftree.h"
-#include "rclconfig.h"
-#include "fstreewalk.h"
-#include "mimetype.h"
-#include "rcldb.h"
-#include "readfile.h"
-#include "indexer.h"
-#include "csguess.h"
-#include "transcode.h"
-#include "mimehandler.h"
-#include "debuglog.h"
-
-using namespace std;
-
-
-/**
- * Bunch holder for data used while indexing a directory tree
- */
-class DirIndexer {
-    FsTreeWalker walker;
-    RclConfig *config;
-    list<string> *topdirs;
-    string dbdir;
-    Rcl::Db db;
- public:
-    DirIndexer(RclConfig *cnf, const string &dbd, list<string> *top) 
-	: config(cnf), topdirs(top), dbdir(dbd)
-    { }
-
-    friend FsTreeWalker::Status 
-      indexfile(void *, const std::string &, const struct stat *, 
-		FsTreeWalker::CbFlag);
-
-    bool index();
-};
-
-bool DirIndexer::index()
-{
-    if (!db.open(dbdir, Rcl::Db::DbUpd)) {
-	LOGERR(("DirIndexer::index: error opening database in %s\n", 
-		dbdir.c_str()));
-	return false;
-    }
-    for (list<string>::const_iterator it = topdirs->begin();
-	 it != topdirs->end(); it++) {
-	LOGDEB(("DirIndexer::index: Indexing %s into %s\n", it->c_str(), 
-		dbdir.c_str()));
-	if (walker.walk(*it, indexfile, this) != FsTreeWalker::FtwOk) {
-	    LOGERR(("DirIndexer::index: error while indexing %s\n", 
-		    it->c_str()));
-	    db.close();
-	    return false;
-	}
-    }
-    db.purge();
-    if (!db.close()) {
-	LOGERR(("DirIndexer::index: error closing database in %s\n", 
-		dbdir.c_str()));
-	return false;
-    }
-    return true;
-}
-
-/** 
- * This function gets called for every file and directory found by the
- * tree walker. It checks with the db if the file has changed and needs to
- * be reindexed. If so, it calls an appropriate handler depending on the mime
- * type, which is responsible for populating an Rcl::Doc.
- * Accent and majuscule handling are performed by the db module when doing
- * the actual indexing work.
- */
-FsTreeWalker::Status 
-indexfile(void *cdata, const std::string &fn, const struct stat *stp, 
-	  FsTreeWalker::CbFlag flg)
-{
-    DirIndexer *me = (DirIndexer *)cdata;
-
-    if (flg == FsTreeWalker::FtwDirEnter || 
-	flg == FsTreeWalker::FtwDirReturn) {
-	me->config->setKeyDir(fn);
-	return FsTreeWalker::FtwOk;
-    }
-
-    string mime = mimetype(fn, me->config->getMimeMap());
-    if (mime.length() == 0) {
-	LOGDEB(("indexfile: (no mime) [%s]\n", fn.c_str()));
-	// No mime type ?? pass on.
-	return FsTreeWalker::FtwOk;
-    }
-
-    LOGDEB(("indexfile: %s [%s]\n", mime.c_str(), fn.c_str()));
-
-    // Look for appropriate handler
-    MimeHandlerFunc fun = getMimeHandler(mime, me->config->getMimeConf());
-    if (!fun) {
-	// No handler for this type, for now :(
-	return FsTreeWalker::FtwOk;
-    }
-
-    if (!me->db.needUpdate(fn, stp))
-	return FsTreeWalker::FtwOk;
-
-    // Turn file into a document. The document has fields for title, body 
-    // etc.,  all text converted to utf8
-    Rcl::Doc doc;
-    if (!fun(me->config, fn,  mime, doc))
-	return FsTreeWalker::FtwOk;
-
-    // Set up common fields:
-    doc.mimetype = mime;
-    char ascdate[20];
-    sprintf(ascdate, "%ld", long(stp->st_mtime));
-    doc.mtime = ascdate;
-
-    // Set up xapian document, add postings and misc fields, 
-    // add to or update database.
-    if (!me->db.add(fn, doc))
-	return FsTreeWalker::FtwError;
-
-    return FsTreeWalker::FtwOk;
-}
-
-DirIndexer *indexer;
+ConfIndexer *indexer;
 
 static void cleanup()
 {
@@ -161,61 +35,11 @@
 	signal(SIGTERM, sigcleanup);
 
     RclConfig config;
-    if (!config.ok())
-	cerr << "Config could not be built" << endl;
-
-    ConfTree *conf = config.getConfig();
-
-    // Retrieve the list of directories to be indexed.
-    string topdirs;
-    if (conf->get("topdirs", topdirs, "") == 0) {
-	cerr << "No top directories in configuration" << endl;
+    if (!config.ok()) {
+	fprintf(stderr, "Config could not be built\n");
 	exit(1);
     }
-
-    // Group the directories by database: it is important that all
-    // directories for a database be indexed at once so that deleted
-    // file cleanup works 
-    vector<string> tdl; // List of directories to be indexed
-    if (!ConfTree::stringToStrings(topdirs, tdl)) {
-	cerr << "Parse error for directory list" << endl;
-	exit(1);
-    }
-
-    vector<string>::iterator dirit;
-    map<string, list<string> > dbmap;
-    map<string, list<string> >::iterator dbit;
-    for (dirit = tdl.begin(); dirit != tdl.end(); dirit++) {
-	string db;
-	if (conf->get("dbdir", db, *dirit) == 0) {
-	    cerr << "No database directory in configuration for " 
-		 << *dirit << endl;
-	    exit(1);
-	}
-	dbit = dbmap.find(db);
-	if (dbit == dbmap.end()) {
-	    list<string> l;
-	    l.push_back(*dirit);
-	    dbmap[db] = l;
-	} else {
-	    dbit->second.push_back(*dirit);
-	}
-    }
-
-    for (dbit = dbmap.begin(); dbit != dbmap.end(); dbit++) {
-	cout << dbit->first << " -> ";
-	list<string>::const_iterator dit;
-	for (dit = dbit->second.begin(); dit != dbit->second.end(); dit++) {
-	    cout << *dit << " ";
-	}
-	cout << endl;
-	indexer = new DirIndexer(&config, dbit->first, &dbit->second);
-	if (!indexer->index()) {
-	    delete indexer;
-	    indexer = 0;
-	    exit(1);
-	}
-	delete indexer;
-	indexer = 0;
-    }
+    indexer = new ConfIndexer(&config);
+    
+    exit(!indexer->index());
 }