diff --git a/src/common/rclconfig.cpp b/src/common/rclconfig.cpp index 9ce91572..2681ccac 100644 --- a/src/common/rclconfig.cpp +++ b/src/common/rclconfig.cpp @@ -49,10 +49,13 @@ using namespace std; #include "readfile.h" #include "fstreewalk.h" +// Static, logically const, RclConfig members are initialized once from the +// first object build during process initialization. #ifndef RCL_INDEX_STRIPCHARS // We default to a case- and diacritics-less index for now bool o_index_stripchars = true; #endif +string RclConfig::o_localecharset; bool ParamStale::needrecompute() { @@ -107,8 +110,6 @@ bool RclConfig::isDefaultConfig() const return !defaultconf.compare(specifiedconf); } -string RclConfig::o_localecharset; - RclConfig::RclConfig(const string *argcnf) { zeroMe(); diff --git a/src/qtgui/uiprefs_w.cpp b/src/qtgui/uiprefs_w.cpp index 46f0d2a3..c17f003c 100644 --- a/src/qtgui/uiprefs_w.cpp +++ b/src/qtgui/uiprefs_w.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include "recoll.h" #include "guiutils.h" @@ -445,6 +446,19 @@ void UIPrefsDialog::delExtraDbPB_clicked() } } +static bool samedir(const string& dir1, const string& dir2) +{ + struct stat st1, st2; + if (stat(dir1.c_str(), &st1)) + return false; + if (stat(dir2.c_str(), &st2)) + return false; + if (st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino) { + return true; + } + return false; +} + /** * Browse to add another index. * We do a textual comparison to check for duplicates, except for @@ -453,13 +467,27 @@ void UIPrefsDialog::delExtraDbPB_clicked() void UIPrefsDialog::addExtraDbPB_clicked() { QString input = myGetFileName(true, - tr("Select xapian index directory " - "(ie: /home/buddy/.recoll/xapiandb)")); + tr("Select recoll config directory or " + "xapian index directory " + "(e.g.: /home/me/.recoll or " + "/home/me/.recoll/xapiandb)")); if (input.isEmpty()) return; - string dbdir = (const char *)input.toLocal8Bit(); + if (access(path_cat(dbdir, "recoll.conf").c_str(), 0) == 0) { + // Chosen dir is config dir. + RclConfig conf(&dbdir); + dbdir = conf.getDbDir(); + if (dbdir.empty()) { + QMessageBox::warning( + 0, "Recoll", tr("The selected directory looks like a Recoll " + "configuration directory but the configuration " + "could not be read")); + return; + } + } + LOGDEB(("ExtraDbDial: got: [%s]\n", dbdir.c_str())); path_catslash(dbdir); if (!Rcl::Db::testDbDir(dbdir)) { @@ -467,42 +495,25 @@ void UIPrefsDialog::addExtraDbPB_clicked() tr("The selected directory does not appear to be a Xapian index")); return; } - struct stat st1, st2; - stat(dbdir.c_str(), &st1); - string rcldbdir = theconfig->getDbDir(); - stat(rcldbdir.c_str(), &st2); - path_catslash(rcldbdir); - - if (st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino) { + if (samedir(dbdir, theconfig->getDbDir())) { QMessageBox::warning(0, "Recoll", tr("This is the main/local index!")); return; } - // For some reason, finditem (which we used to use to detect duplicates - // here) does not work anymore here: qt 4.6.3 - QListitems = - idxLV->findItems (input, Qt::MatchFixedString|Qt::MatchCaseSensitive); - if (!items.empty()) { - QMessageBox::warning(0, "Recoll", - tr("The selected directory is already in the index list")); - return; - } -#if 0 - string nv = (const char *)input.toLocal8Bit(); - QListViewItemIterator it(idxLV); - while (it.current()) { - QCheckListItem *item = (QCheckListItem *)it.current(); - string ov = (const char *)item->text().toLocal8Bit(); - if (!ov.compare(nv)) { - QMessageBox::warning(0, "Recoll", - tr("The selected directory is already in the index list")); + for (int i = 0; i < idxLV->count(); i++) { + QListWidgetItem *item = idxLV->item(i); + string existingdir = (const char *)item->text().toLocal8Bit(); + if (samedir(dbdir, existingdir)) { + QMessageBox::warning( + 0, "Recoll", tr("The selected directory is already in the " + "index list")); return; } - ++it; } -#endif - QListWidgetItem *item = new QListWidgetItem(input, idxLV); + + QListWidgetItem *item = + new QListWidgetItem(QString::fromLocal8Bit(dbdir.c_str()), idxLV); item->setCheckState(Qt::Checked); idxLV->sortItems(); } diff --git a/src/sampleconf/fields b/src/sampleconf/fields index fd1a319d..a1bf95aa 100644 --- a/src/sampleconf/fields +++ b/src/sampleconf/fields @@ -112,7 +112,11 @@ url = dc:identifier xesam:url # Section to define translations from extended file attribute names to # field names. xattr use must be enabled at compile time for this to be # used. Enter translations as "xattrname = fieldname". Case matters. - +# The values from the extended attributes will extend, not replace, the +# data found from equivalent fields inside the document. As an example, the +# following would map a quite plausible "tags" extended attribute into the +# "keywords" field. +tags = keywords ######################## # Sections reserved for specific filters follow