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 }