1
0
Fork 0
mirror of https://github.com/KingDuckZ/dindexer.git synced 2025-08-09 13:59:50 +00:00

Enable searching by glob in locate command.

This commit is contained in:
King_DuckZ 2016-05-12 20:49:11 +02:00
parent 253af1a3ad
commit fde1355653
3 changed files with 11 additions and 19 deletions

View file

@ -9,12 +9,14 @@ add_executable(${PROJECT_NAME}
target_include_directories(${PROJECT_NAME} target_include_directories(${PROJECT_NAME}
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/.. PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..
PRIVATE ${CMAKE_SOURCE_DIR}/lib/glob2regex/include
) )
target_link_libraries(${PROJECT_NAME} target_link_libraries(${PROJECT_NAME}
PRIVATE ${bare_name}-if PRIVATE ${bare_name}-if
PRIVATE ${bare_name}-common PRIVATE ${bare_name}-common
PRIVATE ${bare_name}-machinery PRIVATE ${bare_name}-machinery
PRIVATE glob2regex
) )
string(REPLACE "${bare_name}-" "" ACTION_NAME "${PROJECT_NAME}") string(REPLACE "${bare_name}-" "" ACTION_NAME "${PROJECT_NAME}")

View file

@ -20,6 +20,7 @@
#include "dindexer-common/settings.hpp" #include "dindexer-common/settings.hpp"
#include "dindexerConfig.h" #include "dindexerConfig.h"
#include "hash.hpp" #include "hash.hpp"
#include "glob2regex/glob2regex.hpp"
#include <iostream> #include <iostream>
#include <ciso646> #include <ciso646>
#include <iterator> #include <iterator>
@ -81,7 +82,8 @@ int main (int parArgc, char* parArgv[]) {
results = din::locate_in_db(settings.db, hash); results = din::locate_in_db(settings.db, hash);
} }
else { else {
results = din::locate_in_db(settings.db, vm["substring"].as<std::string>(), not not vm.count("case-insensitive")); const auto search_regex = g2r::convert(vm["substring"].as<std::string>());
results = din::locate_in_db(settings.db, search_regex, not not vm.count("case-insensitive"));
} }
std::copy(results.begin(), results.end(), std::ostream_iterator<din::LocatedItem>(std::cout, "\n")); std::copy(results.begin(), results.end(), std::ostream_iterator<din::LocatedItem>(std::cout, "\n"));
} }

View file

@ -19,8 +19,6 @@
#include "pq/connection.hpp" #include "pq/connection.hpp"
#include "dindexer-machinery/tiger.hpp" #include "dindexer-machinery/tiger.hpp"
#include <utility> #include <utility>
#include <sstream>
#include <boost/utility/string_ref.hpp>
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
@ -73,27 +71,17 @@ namespace din {
} //unnamed namespace } //unnamed namespace
std::vector<LocatedItem> locate_in_db (const dinlib::SettingsDB& parDB, const std::string& parSearch, bool parCaseInsensitive) { std::vector<LocatedItem> locate_in_db (const dinlib::SettingsDB& parDB, const std::string& parSearch, bool parCaseInsensitive) {
using boost::string_ref;
namespace ba = boost::algorithm;
auto conn = make_pq_conn(parDB); auto conn = make_pq_conn(parDB);
const auto clean_string_with_quotes = conn.escaped_literal(parSearch); const auto clean_string_with_quotes = conn.escaped_literal(parSearch);
const auto clean_string = string_ref(clean_string_with_quotes).substr(1, clean_string_with_quotes.size() - 2);
std::ostringstream oss; const std::string search_regex = (parCaseInsensitive ? "(?i)" : "") + parSearch;
oss << "SELECT \"path\",\"id\",\"group_id\" FROM \"files\" WHERE "; const std::string query =
if (parCaseInsensitive) { std::string("SELECT \"path\",\"id\",\"group_id\" FROM \"files\" WHERE \"path\" ~ $1 LIMIT ") +
std::string lower(clean_string); boost::lexical_cast<std::string>(g_max_results) +
ba::to_lower(lower); ";";
oss << "LOWER(\"path\") LIKE '%" << lower << "%' ";
}
else {
oss << "\"path\" LIKE '%" << clean_string << "%' ";
}
oss << "LIMIT " << g_max_results << ';';
auto result = conn.query(oss.str()); auto result = conn.query(query, search_regex);
return file_result_to_vec(std::move(result)); return file_result_to_vec(std::move(result));
} }