diff options
-rw-r--r-- | doc/protocol.xml | 5 | ||||
-rw-r--r-- | src/command/StickerCommands.cxx | 4 | ||||
-rw-r--r-- | src/sticker/Match.hxx | 12 | ||||
-rw-r--r-- | src/sticker/StickerDatabase.cxx | 18 |
4 files changed, 39 insertions, 0 deletions
diff --git a/doc/protocol.xml b/doc/protocol.xml index e5567c91f..d56b09fdd 100644 --- a/doc/protocol.xml +++ b/doc/protocol.xml @@ -2155,6 +2155,11 @@ OK <para> Searches for stickers with the given value. </para> + + <para> + Other supported operators are: + "<function><</function>", "<function>></function>" + </para> </listitem> </varlistentry> </variablelist> diff --git a/src/command/StickerCommands.cxx b/src/command/StickerCommands.cxx index 07bed032e..fce53e162 100644 --- a/src/command/StickerCommands.cxx +++ b/src/command/StickerCommands.cxx @@ -155,6 +155,10 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args) if (strcmp(op_s, "=") == 0) op = StickerOperator::EQUALS; + else if (strcmp(op_s, "<") == 0) + op = StickerOperator::LESS_THAN; + else if (strcmp(op_s, ">") == 0) + op = StickerOperator::GREATER_THAN; else { command_error(client, ACK_ERROR_ARG, "bad operator"); diff --git a/src/sticker/Match.hxx b/src/sticker/Match.hxx index 6165ffb84..a10a3a805 100644 --- a/src/sticker/Match.hxx +++ b/src/sticker/Match.hxx @@ -32,6 +32,18 @@ enum class StickerOperator { * exists. */ EQUALS, + + /** + * Matches if a sticker with the specified name exists with a + * value smaller than the specified one. + */ + LESS_THAN, + + /** + * Matches if a sticker with the specified name exists with a + * value bigger than the specified one. + */ + GREATER_THAN, }; #endif diff --git a/src/sticker/StickerDatabase.cxx b/src/sticker/StickerDatabase.cxx index bd809c1d3..df6dc22dd 100644 --- a/src/sticker/StickerDatabase.cxx +++ b/src/sticker/StickerDatabase.cxx @@ -44,6 +44,8 @@ enum sticker_sql { STICKER_SQL_DELETE_VALUE, STICKER_SQL_FIND, STICKER_SQL_FIND_VALUE, + STICKER_SQL_FIND_LT, + STICKER_SQL_FIND_GT, }; static const char *const sticker_sql[] = { @@ -64,6 +66,12 @@ static const char *const sticker_sql[] = { //[STICKER_SQL_FIND_VALUE] = "SELECT uri,value FROM sticker WHERE type=? AND uri LIKE (? || '%') AND name=? AND value=?", + + //[STICKER_SQL_FIND_LT] = + "SELECT uri,value FROM sticker WHERE type=? AND uri LIKE (? || '%') AND name=? AND value<?", + + //[STICKER_SQL_FIND_GT] = + "SELECT uri,value FROM sticker WHERE type=? AND uri LIKE (? || '%') AND name=? AND value>?", }; static const char sticker_sql_create[] = @@ -392,6 +400,16 @@ BindFind(const char *type, const char *base_uri, const char *name, return BindAllOrNull(error, sticker_stmt[STICKER_SQL_FIND_VALUE], type, base_uri, name, value); + + case StickerOperator::LESS_THAN: + return BindAllOrNull(error, + sticker_stmt[STICKER_SQL_FIND_LT], + type, base_uri, name, value); + + case StickerOperator::GREATER_THAN: + return BindAllOrNull(error, + sticker_stmt[STICKER_SQL_FIND_GT], + type, base_uri, name, value); } assert(false); |