File indexing completed on 2024-04-28 03:51:53
0001 /* 0002 This file is part of the KDE Baloo Project 0003 SPDX-FileCopyrightText: 2013-2015 Vishesh Handa <vhanda@kde.org> 0004 0005 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0006 */ 0007 0008 #include <QCoreApplication> 0009 #include <QCommandLineParser> 0010 #include <QCommandLineOption> 0011 #include <QFileInfo> 0012 #include <QTextStream> 0013 #include <QElapsedTimer> 0014 0015 #include <KAboutData> 0016 #include <KLocalizedString> 0017 0018 #include "query.h" 0019 0020 #include <iostream> 0021 0022 int main(int argc, char* argv[]) 0023 { 0024 QCoreApplication app(argc, argv); 0025 0026 KAboutData aboutData(QStringLiteral("Baloo"), 0027 i18n("Baloo Search"), 0028 QStringLiteral(PROJECT_VERSION), 0029 i18n("A tool to search through the files indexed by Baloo"), 0030 KAboutLicense::GPL); 0031 aboutData.addAuthor(i18n("Vishesh Handa"), QString(), QStringLiteral("vhanda@kde.org")); 0032 0033 KAboutData::setApplicationData(aboutData); 0034 0035 QCommandLineParser parser; 0036 parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("l") << QStringLiteral("limit"), 0037 i18n("The maximum number of results"), 0038 i18n("limit"))); 0039 parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("o") << QStringLiteral("offset"), 0040 i18n("Offset from which to start the search"), 0041 i18n("offset"))); 0042 parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("t") << QStringLiteral("type"), 0043 i18n("Type of data to be searched"), 0044 i18n("typeStr"))); 0045 parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("d") << QStringLiteral("directory"), 0046 i18n("Limit search to specified directory"), 0047 i18n("directory"))); 0048 parser.addOption(QCommandLineOption({QStringLiteral("i"), QStringLiteral("id")}, 0049 i18n("Show document IDs"))); 0050 parser.addOption(QCommandLineOption({QStringLiteral("s"), QStringLiteral("sort")}, 0051 i18n("Sorting criteria"), QStringLiteral("auto|time|none"), QStringLiteral("auto"))); 0052 parser.addPositionalArgument(i18n("query"), i18n("List of words to query for")); 0053 parser.addHelpOption(); 0054 parser.addVersionOption(); 0055 parser.process(app); 0056 0057 int queryLimit = -1; 0058 int offset = 0; 0059 QString typeStr; 0060 bool showDocumentId = parser.isSet(QStringLiteral("id")); 0061 0062 QStringList args = parser.positionalArguments(); 0063 if (args.isEmpty()) { 0064 parser.showHelp(1); 0065 } 0066 0067 if (parser.isSet(QStringLiteral("type"))) { 0068 typeStr = parser.value(QStringLiteral("type")); 0069 } 0070 if (parser.isSet(QStringLiteral("limit"))) { 0071 queryLimit = parser.value(QStringLiteral("limit")).toInt(); 0072 } 0073 if (parser.isSet(QStringLiteral("offset"))) { 0074 offset = parser.value(QStringLiteral("offset")).toInt(); 0075 } 0076 const Baloo::Query::SortingOption orderBy = [&parser]() { 0077 auto val = parser.value(QStringLiteral("sort")); 0078 if (val == QStringLiteral("auto")) { 0079 return Baloo::Query::SortAuto; 0080 } else if (val == QStringLiteral("time")) { 0081 return Baloo::Query::SortAuto; 0082 } else if (val == QStringLiteral("none")) { 0083 return Baloo::Query::SortNone; 0084 } else { 0085 parser.showHelp(1); 0086 } 0087 }(); 0088 0089 QString queryStr = args.join(QLatin1Char(' ')); 0090 0091 Baloo::Query query; 0092 query.addType(typeStr); 0093 query.setSearchString(queryStr); 0094 query.setLimit(queryLimit); 0095 query.setOffset(offset); 0096 query.setSortingOption(orderBy); 0097 0098 if (parser.isSet(QStringLiteral("directory"))) { 0099 QString folderName = parser.value(QStringLiteral("directory")); 0100 const QFileInfo fi(folderName); 0101 if (!fi.isDir()) { 0102 std::cerr << qPrintable(i18n("%1 is not a valid directory", folderName)) << std::endl; 0103 return 1; 0104 } 0105 while (folderName.endsWith(QLatin1Char('/')) && (folderName.size() > 1)) { 0106 folderName.chop(1); 0107 } 0108 auto canonicalPath = fi.canonicalFilePath(); 0109 if (canonicalPath != folderName) { 0110 std::cerr << qPrintable(i18n("Using canonical path '%1' for '%2'", canonicalPath, folderName)) << std::endl; 0111 } 0112 query.setIncludeFolder(canonicalPath); 0113 } 0114 0115 QElapsedTimer timer; 0116 timer.start(); 0117 0118 Baloo::ResultIterator iter = query.exec(); 0119 while (iter.next()) { 0120 const QString filePath = iter.filePath(); 0121 if (showDocumentId) { 0122 std::cout << iter.documentId().constData() << " "; 0123 } 0124 std::cout << qPrintable(filePath) << std::endl; 0125 } 0126 std::cerr << qPrintable(i18n("Elapsed: %1 msecs", timer.nsecsElapsed() / 1000000.0)) << std::endl; 0127 0128 return 0; 0129 }