diff --git a/src/qtgui/guiutils.cpp b/src/qtgui/guiutils.cpp index fcfe62f8..6879b3f9 100644 --- a/src/qtgui/guiutils.cpp +++ b/src/qtgui/guiutils.cpp @@ -41,7 +41,7 @@ RclConfig *theconfig; const char *PrefsPack::dfltResListFormat = "" "
%L  %S   %T
" - "%M %D    %U %i
" + "%M %D    %U %i
" "%A %K
" ; @@ -290,10 +290,16 @@ void rwSettings(bool writing) prefs.allExtraDbs.end(), dbdir) != prefs.allExtraDbs.end()) continue; - if (!Rcl::Db::testDbDir(dbdir)) { + bool stripped; + if (!Rcl::Db::testDbDir(dbdir, &stripped)) { LOGERR(("Not a xapian index: [%s]\n", dbdir.c_str())); continue; } + if (stripped != o_index_stripchars) { + LOGERR(("Incompatible character stripping: [%s]\n", + dbdir.c_str())); + continue; + } prefs.allExtraDbs.push_back(dbdir); } } @@ -305,8 +311,11 @@ void rwSettings(bool writing) // actually there: useful for removable volumes. for (list::iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end();) { - if (!Rcl::Db::testDbDir(*it)) { - LOGINFO(("Not a xapian index: [%s]\n", it->c_str())); + bool stripped; + if (!Rcl::Db::testDbDir(*it, &stripped) || + stripped != o_index_stripchars) { + LOGINFO(("Not a Xapian index or char stripping differs: [%s]\n", + it->c_str())); it = prefs.activeExtraDbs.erase(it); } else { it++; @@ -327,8 +336,11 @@ void rwSettings(bool writing) prefs.activeExtraDbs.end(), dbdir) != prefs.activeExtraDbs.end()) continue; - if (!Rcl::Db::testDbDir(dbdir)) { - LOGERR(("Not a xapian index: [%s]\n", dbdir.c_str())); + bool strpd; + if (!Rcl::Db::testDbDir(dbdir, &strpd) || + strpd != o_index_stripchars) { + LOGERR(("Not a Xapian dir or diff. char stripping: [%s]\n", + dbdir.c_str())); continue; } prefs.activeExtraDbs.push_back(dbdir); diff --git a/src/qtgui/uiprefs_w.cpp b/src/qtgui/uiprefs_w.cpp index ff6c8a84..ef467336 100644 --- a/src/qtgui/uiprefs_w.cpp +++ b/src/qtgui/uiprefs_w.cpp @@ -533,11 +533,18 @@ void UIPrefsDialog::addExtraDbPB_clicked() LOGDEB(("ExtraDbDial: got: [%s]\n", dbdir.c_str())); path_catslash(dbdir); - if (!Rcl::Db::testDbDir(dbdir)) { + bool stripped; + if (!Rcl::Db::testDbDir(dbdir, &stripped)) { QMessageBox::warning(0, "Recoll", tr("The selected directory does not appear to be a Xapian index")); return; } + if (o_index_stripchars != stripped) { + QMessageBox::warning(0, "Recoll", + tr("Cant add index with different case/diacritics" + " stripping option")); + return; + } if (samedir(dbdir, theconfig->getDbDir())) { QMessageBox::warning(0, "Recoll", tr("This is the main/local index!")); diff --git a/src/rcldb/rcldb.cpp b/src/rcldb/rcldb.cpp index a381740f..e333161c 100644 --- a/src/rcldb/rcldb.cpp +++ b/src/rcldb/rcldb.cpp @@ -856,18 +856,29 @@ size_t Db::whatDbIdx(const Doc& doc) return doc.xdocid % (m_extraDbs.size()+1); } -bool Db::testDbDir(const string &dir) +bool Db::testDbDir(const string &dir, bool *stripped_p) { string aerr; + bool mstripped = true; LOGDEB(("Db::testDbDir: [%s]\n", dir.c_str())); try { Xapian::Database db(dir); + // If we have terms with a leading ':' it's an + // unstripped index + Xapian::TermIterator term = db.allterms_begin(":"); + if (term == db.allterms_end()) + mstripped = true; + else + mstripped = false; } XCATCHERROR(aerr); if (!aerr.empty()) { LOGERR(("Db::Open: error while trying to open database " "from [%s]: %s\n", dir.c_str(), aerr.c_str())); return false; } + if (stripped_p) + *stripped_p = mstripped; + return true; } diff --git a/src/rcldb/rcldb.h b/src/rcldb/rcldb.h index 61f350e9..5a2b9312 100644 --- a/src/rcldb/rcldb.h +++ b/src/rcldb/rcldb.h @@ -301,8 +301,9 @@ class Db { * other: order of database in add_database() sequence. */ size_t whatDbIdx(const Doc& doc); + /** Tell if directory seems to hold xapian db */ - static bool testDbDir(const string &dir); + static bool testDbDir(const string &dir, bool *stripped = 0); /** Return the index terms that match the input string * Expansion is performed either with either wildcard or regexp processing