--- a
+++ b/src/index/fsindexer.h
@@ -0,0 +1,108 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#ifndef _fsindexer_h_included_
+#define _fsindexer_h_included_
+/* @(#$Id: $ (C) 2009 J.F.Dockes */
+
+#include "fstreewalk.h"
+#include "rcldb.h"
+
+class DbIxStatusUpdater;
+
+/** Index selected parts of the file system
+
+Tree indexing: we inherits FsTreeWalkerCB so that, the processone()
+method is called by the file-system tree walk code for each file and
+directory. We keep all state needed while indexing, and finally call
+the methods to purge the db of stale entries and create the stemming
+databases.
+
+Single file(s) indexing: there are also calls to index or purge lists of files.
+No database purging or stem db updating in this case.
+*/
+class FsIndexer : public FsTreeWalkerCB {
+ public:
+ /** Constructor does nothing but store parameters
+ *
+ * @param cnf Configuration data
+ * @param updfunc Status updater callback
+ */
+ FsIndexer(RclConfig *cnf, DbIxStatusUpdater *updfunc = 0)
+ : m_config(cnf), m_db(cnf), m_updater(updfunc)
+ {
+ m_havelocalfields = m_config->hasNameAnywhere("localfields");
+ }
+
+ virtual ~FsIndexer();
+
+ /** Top level file system tree index method for updating a
+ given database.
+
+ The list is supposed to have all the filename space for the
+ db, and we shall purge entries for non-existing files at the
+ end. We create the temporary directory, open the database,
+ then call a file system walk for each top-level directory.
+ When walking is done, we create the stem databases and close
+ the main db.
+ */
+ bool indexTrees(bool resetbefore, std::list<string> *topdirs);
+
+ /** Index a list of files. No db cleaning or stemdb updating */
+ bool indexFiles(const std::list<string> &files);
+
+ /** Purge a list of files. */
+ bool purgeFiles(const std::list<string> &files);
+
+ /** Stemming reset to config: create needed, delete unconfigured */
+ bool createStemmingDatabases();
+
+ /** Create stem database for given language */
+ bool createStemDb(const string &lang);
+
+ /** Create misspelling expansion dictionary if aspell i/f is available */
+ bool createAspellDict();
+
+ /** Tree walker callback method */
+ FsTreeWalker::Status
+ processone(const string &, const struct stat *, FsTreeWalker::CbFlag);
+
+ /** Return my db dir */
+ string getDbDir() {return m_config->getDbDir();}
+
+ /** List possible stemmer names */
+ static list<string> getStemmerNames();
+
+ private:
+ FsTreeWalker m_walker;
+ RclConfig *m_config;
+ Rcl::Db m_db;
+ string m_tmpdir;
+ DbIxStatusUpdater *m_updater;
+
+ // The configuration can set attribute fields to be inherited by
+ // all files in a file system area. Ie: set "apptag = thunderbird"
+ // inside ~/.thunderbird. The boolean is set at init to avoid
+ // further wasteful processing if no local fields are set.
+ bool m_havelocalfields;
+ map<string, string> m_localfields;
+
+ bool init(bool rst = false, bool rdonly = false);
+ void localfieldsfromconf();
+ void setlocalfields(Rcl::Doc& doc);
+};
+
+#endif /* _fsindexer_h_included_ */