Allow wildcards in file names to search for images, fixes #697

This commit is contained in:
emeric
2025-08-05 22:33:03 +02:00
parent 9ae425a800
commit 35ba66099f
16 changed files with 142 additions and 26 deletions
+1 -1
View File
@@ -23,7 +23,7 @@
namespace lms::db::utils
{
std::string escapeLikeKeyword(std::string_view keyword)
std::string escapeForLikeKeyword(std::string_view keyword)
{
return core::stringUtils::escapeString(keyword, "%_", escapeChar);
}
+1 -1
View File
@@ -38,7 +38,7 @@ namespace lms::db::utils
{
#define ESCAPE_CHAR_STR "\\"
static inline constexpr char escapeChar{ '\\' };
std::string escapeLikeKeyword(std::string_view keywords);
std::string escapeForLikeKeyword(std::string_view keywords);
Wt::WDateTime normalizeDateTime(const Wt::WDateTime& dateTime);
+2 -2
View File
@@ -106,13 +106,13 @@ namespace lms::db
for (const std::string_view keyword : params.keywords)
{
clauses.push_back("a.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'");
query.bind("%" + utils::escapeLikeKeyword(keyword) + "%");
query.bind("%" + utils::escapeForLikeKeyword(keyword) + "%");
}
for (const std::string_view keyword : params.keywords)
{
sortClauses.push_back("a.sort_name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'");
query.bind("%" + utils::escapeLikeKeyword(keyword) + "%");
query.bind("%" + utils::escapeForLikeKeyword(keyword) + "%");
}
query.where("(" + core::stringUtils::joinStrings(clauses, " AND ") + ") OR (" + core::stringUtils::joinStrings(sortClauses, " AND ") + ")");
+1 -1
View File
@@ -40,7 +40,7 @@ namespace lms::db
auto query{ session.getDboSession()->query<Wt::Dbo::ptr<Directory>>("SELECT d FROM directory d") };
for (std::string_view keyword : params.keywords)
query.where("d.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeLikeKeyword(keyword) + "%");
query.where("d.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeForLikeKeyword(keyword) + "%");
if (params.artist.isValid()
|| params.release.isValid()
+14 -1
View File
@@ -43,7 +43,20 @@ namespace lms::db
if (params.directory.isValid())
query.where("i.directory_id = ?").bind(params.directory);
if (!params.fileStem.empty())
query.where("i.stem = ? COLLATE NOCASE").bind(params.fileStem);
{
// if contains a wildcard, replace by % for LIKE
if (params.processWildcardsInFileStem.value() && params.fileStem.find('*') != std::string::npos)
{
std::string fileStem{ params.fileStem };
utils::escapeForLikeKeyword(fileStem);
std::replace(std::begin(fileStem), std::end(fileStem), '*', '%');
query.where("i.stem LIKE ? COLLATE NOCASE ESCAPE '" ESCAPE_CHAR_STR "'").bind(fileStem);
}
else
{
query.where("i.stem = ? COLLATE NOCASE").bind(params.fileStem);
}
}
return query;
}
+4 -4
View File
@@ -100,13 +100,13 @@ namespace lms::db
for (const std::string_view keyword : params.keywords)
{
clauses.push_back("a.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'");
query.bind("%" + utils::escapeLikeKeyword(keyword) + "%");
query.bind("%" + utils::escapeForLikeKeyword(keyword) + "%");
}
for (const std::string_view keyword : params.keywords)
{
sortClauses.push_back("a.sort_name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'");
query.bind("%" + utils::escapeLikeKeyword(keyword) + "%");
query.bind("%" + utils::escapeForLikeKeyword(keyword) + "%");
}
query.where("(" + core::stringUtils::joinStrings(clauses, " AND ") + ") OR (" + core::stringUtils::joinStrings(sortClauses, " AND ") + ")");
@@ -169,7 +169,7 @@ namespace lms::db
}
for (std::string_view keyword : params.keywords)
query.where("r.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeLikeKeyword(keyword) + "%");
query.where("r.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeForLikeKeyword(keyword) + "%");
return query;
}
@@ -227,7 +227,7 @@ namespace lms::db
}
for (std::string_view keyword : params.keywords)
query.where("t.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeLikeKeyword(keyword) + "%");
query.where("t.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeForLikeKeyword(keyword) + "%");
return query;
}
+1 -1
View File
@@ -125,7 +125,7 @@ namespace lms::db
query.where("r.name = ?").bind(params.name);
for (std::string_view keyword : params.keywords)
query.where("r.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeLikeKeyword(keyword) + "%");
query.where("r.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeForLikeKeyword(keyword) + "%");
if (params.starringUser.isValid())
{
+1 -1
View File
@@ -61,7 +61,7 @@ namespace lms::db
assert(params.keywords.empty() || params.name.empty());
for (std::string_view keyword : params.keywords)
query.where("t.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeLikeKeyword(keyword) + "%");
query.where("t.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeForLikeKeyword(keyword) + "%");
if (!params.name.empty())
query.where("t.name = ?").bind(params.name);
+1 -1
View File
@@ -57,7 +57,7 @@ namespace lms::db
}
for (std::string_view keyword : params.keywords)
query.where("t_l.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeLikeKeyword(keyword) + "%");
query.where("t_l.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeForLikeKeyword(keyword) + "%");
if (params.filters.mediaLibrary.isValid()
|| params.filters.label.isValid()