1/*
2 This file is part of the KDE Baloo Project
3 SPDX-FileCopyrightText: 2013-2015 Vishesh Handa <vhanda@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
6*/
7
8#include <QCoreApplication>
9#include <QCommandLineParser>
10#include <QCommandLineOption>
11#include <QFileInfo>
12#include <QTextStream>
13#include <QElapsedTimer>
14
15#include <KAboutData>
16#include <KLocalizedString>
17
18#include "query.h"
19
20#include <iostream>
21
22int main(int argc, char* argv[])
23{
24 QCoreApplication app(argc, argv);
25
26 KAboutData aboutData(QStringLiteral("Baloo"),
27 i18n("Baloo Search"),
28 QStringLiteral(PROJECT_VERSION),
29 i18n("A tool to search through the files indexed by Baloo"),
30 KAboutLicense::GPL);
31 aboutData.addAuthor(i18n("Vishesh Handa"), task: QString(), QStringLiteral("vhanda@kde.org"));
32
33 KAboutData::setApplicationData(aboutData);
34
35 QCommandLineParser parser;
36 parser.addOption(commandLineOption: QCommandLineOption(QStringList() << QStringLiteral("l") << QStringLiteral("limit"),
37 i18n("The maximum number of results"),
38 i18n("limit")));
39 parser.addOption(commandLineOption: QCommandLineOption(QStringList() << QStringLiteral("o") << QStringLiteral("offset"),
40 i18n("Offset from which to start the search"),
41 i18n("offset")));
42 parser.addOption(commandLineOption: QCommandLineOption(QStringList() << QStringLiteral("t") << QStringLiteral("type"),
43 i18n("Type of data to be searched"),
44 i18n("typeStr")));
45 parser.addOption(commandLineOption: QCommandLineOption(QStringList() << QStringLiteral("d") << QStringLiteral("directory"),
46 i18n("Limit search to specified directory"),
47 i18n("directory")));
48 parser.addOption(commandLineOption: QCommandLineOption({QStringLiteral("i"), QStringLiteral("id")},
49 i18n("Show document IDs")));
50 parser.addOption(commandLineOption: QCommandLineOption({QStringLiteral("s"), QStringLiteral("sort")},
51 i18n("Sorting criteria"), QStringLiteral("auto|time|none"), QStringLiteral("auto")));
52 parser.addPositionalArgument(i18n("query"), i18n("List of words to query for"));
53 parser.addHelpOption();
54 parser.addVersionOption();
55 parser.process(app);
56
57 int queryLimit = -1;
58 int offset = 0;
59 QString typeStr;
60 bool showDocumentId = parser.isSet(QStringLiteral("id"));
61
62 QStringList args = parser.positionalArguments();
63 if (args.isEmpty()) {
64 parser.showHelp(exitCode: 1);
65 }
66
67 if (parser.isSet(QStringLiteral("type"))) {
68 typeStr = parser.value(QStringLiteral("type"));
69 }
70 if (parser.isSet(QStringLiteral("limit"))) {
71 queryLimit = parser.value(QStringLiteral("limit")).toInt();
72 }
73 if (parser.isSet(QStringLiteral("offset"))) {
74 offset = parser.value(QStringLiteral("offset")).toInt();
75 }
76 const Baloo::Query::SortingOption orderBy = [&parser]() {
77 auto val = parser.value(QStringLiteral("sort"));
78 if (val == QStringLiteral("auto")) {
79 return Baloo::Query::SortAuto;
80 } else if (val == QStringLiteral("time")) {
81 return Baloo::Query::SortAuto;
82 } else if (val == QStringLiteral("none")) {
83 return Baloo::Query::SortNone;
84 } else {
85 parser.showHelp(exitCode: 1);
86 }
87 }();
88
89 QString queryStr = args.join(sep: QLatin1Char(' '));
90
91 Baloo::Query query;
92 query.addType(type: typeStr);
93 query.setSearchString(queryStr);
94 query.setLimit(queryLimit);
95 query.setOffset(offset);
96 query.setSortingOption(orderBy);
97
98 if (parser.isSet(QStringLiteral("directory"))) {
99 QString folderName = parser.value(QStringLiteral("directory"));
100 const QFileInfo fi(folderName);
101 if (!fi.isDir()) {
102 std::cerr << qPrintable(i18n("%1 is not a valid directory", folderName)) << std::endl;
103 return 1;
104 }
105 while (folderName.endsWith(c: QLatin1Char('/')) && (folderName.size() > 1)) {
106 folderName.chop(n: 1);
107 }
108 auto canonicalPath = fi.canonicalFilePath();
109 if (canonicalPath != folderName) {
110 std::cerr << qPrintable(i18n("Using canonical path '%1' for '%2'", canonicalPath, folderName)) << std::endl;
111 }
112 query.setIncludeFolder(canonicalPath);
113 }
114
115 QElapsedTimer timer;
116 timer.start();
117
118 Baloo::ResultIterator iter = query.exec();
119 while (iter.next()) {
120 const QString filePath = iter.filePath();
121 if (showDocumentId) {
122 std::cout << iter.documentId().constData() << " ";
123 }
124 std::cout << qPrintable(filePath) << std::endl;
125 }
126 std::cerr << qPrintable(i18n("Elapsed: %1 msecs", timer.nsecsElapsed() / 1000000.0)) << std::endl;
127
128 return 0;
129}
130

source code of baloo/src/tools/baloosearch/main.cpp