Skip to content
Snippets Groups Projects
Commit 19b75e91 authored by kh1's avatar kh1
Browse files

Fix broken link for key implementation since last changes to the filter.

The links have been taken before from the model, now we need to get
them out of the help files, since the help eninge core does not provide
(yet) such functionality. Also return a sensible amount of hits for the
first character, limited for now to 300 for speed reasons.

Reviewed-by: ck
parent e072f1c7
No related branches found
No related tags found
No related merge requests found
...@@ -50,19 +50,36 @@ using namespace Help::Internal; ...@@ -50,19 +50,36 @@ using namespace Help::Internal;
Q_DECLARE_METATYPE(ILocatorFilter*); Q_DECLARE_METATYPE(ILocatorFilter*);
static const char linksForKeyQuery[] = "SELECT d.Title, f.Name, e.Name, "
"d.Name, a.Anchor FROM IndexTable a, FileNameTable d, FolderTable e, "
"NamespaceTable f WHERE a.FileId=d.FileId AND d.FolderId=e.Id AND "
"a.NamespaceId=f.Id AND a.Name='%1'";
// -- HelpIndexFilter::HelpFileReader // -- HelpIndexFilter::HelpFileReader
class HelpIndexFilter::HelpFileReader class HelpIndexFilter::HelpFileReader
{ {
struct dbCleaner {
dbCleaner(const QString &dbName)
: name(dbName) {}
~dbCleaner() {
QSqlDatabase::removeDatabase(name);
}
QString name;
};
public: public:
HelpFileReader(); HelpFileReader();
~HelpFileReader(); ~HelpFileReader();
public: public:
void updateHelpFiles(); void updateHelpFiles();
QList<FilterEntry> matchesFor(const QString &entry, ILocatorFilter *locator); QMap<QString, QUrl> linksForKey(const QString &key);
QList<FilterEntry> matchesFor(const QString &entry, ILocatorFilter *locator,
int maxHits = INT_MAX);
private: private:
QIcon m_icon;
bool m_initialized; bool m_initialized;
QStringList m_helpFiles; QStringList m_helpFiles;
}; };
...@@ -70,6 +87,7 @@ private: ...@@ -70,6 +87,7 @@ private:
HelpIndexFilter::HelpFileReader::HelpFileReader() HelpIndexFilter::HelpFileReader::HelpFileReader()
: m_initialized(false) : m_initialized(false)
{ {
m_icon = QIcon(QLatin1String(":/help/images/bookmark.png"));
} }
HelpIndexFilter::HelpFileReader::~HelpFileReader() HelpIndexFilter::HelpFileReader::~HelpFileReader()
...@@ -96,8 +114,55 @@ void HelpIndexFilter::HelpFileReader::updateHelpFiles() ...@@ -96,8 +114,55 @@ void HelpIndexFilter::HelpFileReader::updateHelpFiles()
QSqlDatabase::removeDatabase(id); QSqlDatabase::removeDatabase(id);
} }
QUrl buildQUrl(const QString &nameSpace, const QString &folder,
const QString &relFileName, const QString &anchor)
{
QUrl url;
url.setScheme(QLatin1String("qthelp"));
url.setAuthority(nameSpace);
url.setPath(folder + QLatin1Char('/') + relFileName);
url.setFragment(anchor);
return url;
}
QMap<QString, QUrl>HelpIndexFilter::HelpFileReader::linksForKey(const QString &key)
{
if (!m_initialized) {
updateHelpFiles();
m_initialized = true;
}
QMap<QString, QUrl> links;
const QLatin1String sqlite("QSQLITE");
const QLatin1String name("HelpIndexFilter::HelpFileReader::linksForKey");
dbCleaner cleaner(name);
QSqlDatabase db = QSqlDatabase::addDatabase(sqlite, name);
if (db.driver() && db.driver()->lastError().type() == QSqlError::NoError) {
foreach(const QString &file, m_helpFiles) {
if (!QFile::exists(file))
continue;
db.setDatabaseName(file);
if (db.open()) {
QSqlQuery query = QSqlQuery(db);
query.setForwardOnly(true);
query.exec(QString::fromLatin1(linksForKeyQuery).arg(key));
while (query.next()) {
QString title = query.value(0).toString();
if (title.isEmpty()) // generate a title + corresponding path
title = key + QLatin1String(" : ") + query.value(3).toString();
links.insertMulti(title, buildQUrl(query.value(1).toString(),
query.value(2).toString(), query.value(3).toString(),
query.value(4).toString()));
}
}
}
}
return links;
}
QList<FilterEntry> HelpIndexFilter::HelpFileReader::matchesFor(const QString &id, QList<FilterEntry> HelpIndexFilter::HelpFileReader::matchesFor(const QString &id,
ILocatorFilter *locator) ILocatorFilter *locator, int maxHits)
{ {
if (!m_initialized) { if (!m_initialized) {
updateHelpFiles(); updateHelpFiles();
...@@ -107,31 +172,30 @@ QList<FilterEntry> HelpIndexFilter::HelpFileReader::matchesFor(const QString &id ...@@ -107,31 +172,30 @@ QList<FilterEntry> HelpIndexFilter::HelpFileReader::matchesFor(const QString &id
QList<FilterEntry> entries; QList<FilterEntry> entries;
const QLatin1String sqlite("QSQLITE"); const QLatin1String sqlite("QSQLITE");
const QLatin1String name("HelpIndexFilter::HelpFileReader::matchesFor"); const QLatin1String name("HelpIndexFilter::HelpFileReader::matchesFor");
foreach(const QString &file, m_helpFiles) {
if (!QFile::exists(file)) dbCleaner cleaner(name);
continue; QSqlDatabase db = QSqlDatabase::addDatabase(sqlite, name);
{ if (db.driver() && db.driver()->lastError().type() == QSqlError::NoError) {
QSqlDatabase db = QSqlDatabase::addDatabase(sqlite, name); foreach(const QString &file, m_helpFiles) {
if (db.driver() if (!QFile::exists(file))
&& db.driver()->lastError().type() == QSqlError::NoError) { continue;
db.setDatabaseName(file); db.setDatabaseName(file);
if (db.open()) { if (db.open()) {
QSqlQuery query = QSqlQuery(db); QSqlQuery query = QSqlQuery(db);
query.setForwardOnly(true); query.setForwardOnly(true);
query.exec(QString::fromLatin1("SELECT DISTINCT Name FROM " query.exec(QString::fromLatin1("SELECT DISTINCT Name FROM "
"IndexTable WHERE Name LIKE '%%1%'").arg(id)); "IndexTable WHERE Name LIKE '%%1%'").arg(id));
while (query.next()) { while (query.next()) {
const QString &key = query.value(0).toString(); const QString &key = query.value(0).toString();
if (!key.isEmpty()) { if (!key.isEmpty()) {
// NOTE: do not use an icon since it is really slow entries.append(FilterEntry(locator, key, QVariant(),
entries.append(FilterEntry(locator, key, QVariant(), m_icon));
QIcon())); if (entries.count() == maxHits)
} return entries;
} }
} }
} }
} }
QSqlDatabase::removeDatabase(name);
} }
return entries; return entries;
} }
...@@ -176,18 +240,18 @@ ILocatorFilter::Priority HelpIndexFilter::priority() const ...@@ -176,18 +240,18 @@ ILocatorFilter::Priority HelpIndexFilter::priority() const
QList<FilterEntry> HelpIndexFilter::matchesFor(const QString &entry) QList<FilterEntry> HelpIndexFilter::matchesFor(const QString &entry)
{ {
if (entry.length() < 2) if (entry.length() < 2)
return QList<FilterEntry>(); return m_fileReader->matchesFor(entry, this, 300);
return m_fileReader->matchesFor(entry, this); return m_fileReader->matchesFor(entry, this);
} }
void HelpIndexFilter::accept(FilterEntry selection) const void HelpIndexFilter::accept(FilterEntry selection) const
{ {
const QHelpEngineCore &engine = HelpManager::helpEngineCore(); const QString &key = selection.displayName;
QMap<QString, QUrl> links = engine.linksForIdentifier(selection.displayName); const QMap<QString, QUrl> &links = m_fileReader->linksForKey(key);
if (links.size() == 1) { if (links.size() == 1) {
emit linkActivated(links.begin().value()); emit linkActivated(links.begin().value());
} else if (!links.isEmpty()) { } else if (!links.isEmpty()) {
emit linksActivated(links, selection.displayName); emit linksActivated(links, key);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment