void QHelpDBReader::linksForKeyword(const QString &keyword, const QStringList &filterAttributes, QMap<QString, QUrl> &linkMap) const { if (!m_query) return; QString query; if (filterAttributes.isEmpty()) { query = QString(QLatin1String("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'")).arg(quote(keyword)); } else if (m_useAttributesCache) { query = QString(QLatin1String("SELECT d.Title, f.Name, e.Name, d.Name, a.Anchor, a.Id " "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'")) .arg(quote(keyword)); m_query->exec(query); while (m_query->next()) { if (m_indicesCache.contains(m_query->value(5).toInt())) { linkMap.insertMulti(m_query->value(0).toString(), buildQUrl(m_query->value(1).toString(), m_query->value(2).toString(), m_query->value(3).toString(), m_query->value(4).toString())); } } return; } else { query = QString(QLatin1String("SELECT d.Title, f.Name, e.Name, d.Name, a.Anchor " "FROM IndexTable a, IndexFilterTable b, FilterAttributeTable c, " "FileNameTable d, FolderTable e, NamespaceTable f " "WHERE a.FileId=d.FileId AND d.FolderId=e.Id " "AND a.NamespaceId=f.Id AND b.IndexId=a.Id AND b.FilterAttributeId=c.Id " "AND a.Name='%1' AND c.Name='%2'")).arg(quote(keyword)) .arg(quote(filterAttributes.first())); for (int i=1; i<filterAttributes.count(); ++i) { query.append(QString(QLatin1String(" INTERSECT SELECT d.Title, f.Name, e.Name, d.Name, a.Anchor " "FROM IndexTable a, IndexFilterTable b, FilterAttributeTable c, " "FileNameTable d, FolderTable e, NamespaceTable f " "WHERE a.FileId=d.FileId AND d.FolderId=e.Id " "AND a.NamespaceId=f.Id AND b.IndexId=a.Id AND b.FilterAttributeId=c.Id " "AND a.Name='%1' AND c.Name='%2'")).arg(quote(keyword)) .arg(quote(filterAttributes.at(i)))); } } QString title; m_query->exec(query); while (m_query->next()) { title = m_query->value(0).toString(); if (title.isEmpty()) // generate a title + corresponding path title = keyword + QLatin1String(" : ") + m_query->value(3).toString(); linkMap.insertMulti(title, buildQUrl(m_query->value(1).toString(), m_query->value(2).toString(), m_query->value(3).toString(), m_query->value(4).toString())); } }
// This should go into Qt 4.8 once we start using it for Qt Creator QMap<QString, QUrl> HelpManager::linksForKeyword(const QString &key) { QMap<QString, QUrl> links; if (d->m_needsSetup) return links; const QLatin1String sqlite("QSQLITE"); const QLatin1String name("HelpManager::linksForKeyword"); DbCleaner cleaner(name); QSqlDatabase db = QSqlDatabase::addDatabase(sqlite, name); if (db.driver() && db.driver()->lastError().type() == QSqlError::NoError) { const QStringList ®isteredDocs = d->m_helpEngine->registeredDocumentations(); foreach (const QString &nameSpace, registeredDocs) { db.setDatabaseName(d->m_helpEngine->documentationFileName(nameSpace)); 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())); } } } }
QUrl QHelpDBReader::urlOfPath(const QString &relativePath) const { QUrl url; if (!m_query) return url; m_query->exec(QLatin1String("SELECT a.Name, b.Name FROM NamespaceTable a, " "FolderTable b WHERE a.id=b.NamespaceId and a.Id=1")); if (m_query->next()) { QString rp = relativePath; QString anchor; int i = rp.indexOf(QLatin1Char('#')); if (i > -1) { rp = relativePath.left(i); anchor = relativePath.mid(i+1); } url = buildQUrl(m_query->value(0).toString(), m_query->value(1).toString(), rp, anchor); } return url; }