Kouhei Sutou
null+****@clear*****
Fri Aug 9 16:27:53 JST 2013
Kouhei Sutou 2013-08-09 16:27:53 +0900 (Fri, 09 Aug 2013) New Revision: 5cdf4c2fa9d3fba7d1211c1c9b2d155e4184d512 https://github.com/groonga/groonga/commit/5cdf4c2fa9d3fba7d1211c1c9b2d155e4184d512 Message: Add grn_expr_syntax_escape() It is generic escape function. We can customize what is escaped and what character is used for escaping. Modified files: doc/source/reference/api/grn_expr.txt include/groonga.h lib/expr.c Modified: doc/source/reference/api/grn_expr.txt (+39 -0) =================================================================== --- doc/source/reference/api/grn_expr.txt 2013-08-09 16:26:25 +0900 (9473ed2) +++ doc/source/reference/api/grn_expr.txt 2013-08-09 16:27:53 +0900 (8793c69) @@ -26,3 +26,42 @@ Example ------- TODO... + +Reference +--------- + +.. c:function:: grn_rc grn_expr_syntax_escape(grn_ctx *ctx, const char *string, int string_size, const char *target_characters, char escape_character, grn_obj *escaped_string) + + Escapes ``target_characters`` in ``string`` by ``escape_character``. + + :param ctx: Its encoding must be the same encoding of ``string``. + It is used for allocating buffer for ``escaped_string``. + :param string: String expression representation. + :param string_size: The byte size of ``string``. ``-1`` means ``string`` + is NULL terminated string. + :param target_characters: NULL terminated escape target characters. + For example, ``"+-><~*()\"\\:"`` is + ``target_characters`` for + :doc:`/reference/grn_expr/query_syntax`. + :param escape_character: The character to use escape a character in + ``target_characters``. For example, ``\\`` + (backslash) is ``escaped_character`` for + :doc:`/reference/grn_expr/query_syntax`. + :param escaped_string: The output of escaped ``string``. It should be + text typed bulk. + :return: ``GRN_SUCCESS`` on success, not ``GRN_SUCCESS`` on error. + +.. c:function:: grn_rc grn_expr_syntax_escape_query(grn_ctx *ctx, const char *query, int query_size, grn_obj *escaped_query) + + Escapes special characters in + :doc:`/reference/grn_expr/query_syntax`. + + :param ctx: Its encoding must be the same encoding of ``query``. + It is used for allocating buffer for ``escaped_query``. + :param query: String expression representation in + :doc:`/reference/grn_expr/query_syntax`. + :param query_size: The byte size of ``query``. ``-1`` means ``query`` + is NULL terminated string. + :param escaped_query: The output of escaped ``query``. It should be + text typed bulk. + :return: ``GRN_SUCCESS`` on success, not ``GRN_SUCCESS`` on error. Modified: include/groonga.h (+5 -0) =================================================================== --- include/groonga.h 2013-08-09 16:26:25 +0900 (fbe1f4f) +++ include/groonga.h 2013-08-09 16:27:53 +0900 (2d4f815) @@ -2321,6 +2321,11 @@ GRN_API grn_obj *grn_expr_append_const_int(grn_ctx *ctx, grn_obj *expr, int i, grn_operator op, int nargs); GRN_API grn_rc grn_expr_append_op(grn_ctx *ctx, grn_obj *expr, grn_operator op, int nargs); +GRN_API grn_rc grn_expr_syntax_escape(grn_ctx *ctx, + const char *query, int query_size, + const char *target_characters, + char escape_character, + grn_obj *escaped_query); GRN_API grn_rc grn_expr_syntax_escape_query(grn_ctx *ctx, const char *query, int query_size, grn_obj *escaped_query); Modified: lib/expr.c (+40 -29) =================================================================== --- lib/expr.c 2013-08-09 16:26:25 +0900 (94623d2) +++ lib/expr.c 2013-08-09 16:27:53 +0900 (27178b0) @@ -6489,54 +6489,42 @@ grn_column_filter(grn_ctx *ctx, grn_obj *column, } grn_rc -grn_expr_syntax_escape_query(grn_ctx *ctx, const char *query, int query_size, - grn_obj *escaped_query) +grn_expr_syntax_escape(grn_ctx *ctx, const char *string, int string_size, + const char *target_characters, + char escape_character, + grn_obj *escaped_string) { grn_rc rc = GRN_SUCCESS; - const char *current, *query_end; + const char *current, *string_end; - if (!query) { + if (!string) { return GRN_INVALID_ARGUMENT; } GRN_API_ENTER; - if (query_size < 0) { - query_size = strlen(query); + if (string_size < 0) { + string_size = strlen(string); } - query_end = query + query_size; + string_end = string + string_size; - current = query; - while (current < query_end) { + current = string; + while (current < string_end) { unsigned int char_size; - char_size = grn_charlen(ctx, current, query_end); + char_size = grn_charlen(ctx, current, string_end); switch (char_size) { case 0 : - /* query includes malformed multibyte character. */ + /* string includes malformed multibyte character. */ return GRN_INVALID_ARGUMENT; break; case 1 : - switch (*current) { - case GRN_QUERY_AND : - case GRN_QUERY_AND_NOT : - case GRN_QUERY_ADJ_INC : - case GRN_QUERY_ADJ_DEC : - case GRN_QUERY_ADJ_NEG : - case GRN_QUERY_PREFIX : - case GRN_QUERY_PARENL : - case GRN_QUERY_PARENR : - case GRN_QUERY_QUOTEL : - case GRN_QUERY_ESCAPE : - case GRN_QUERY_COLUMN : - GRN_TEXT_PUTC(ctx, escaped_query, GRN_QUERY_ESCAPE); - break; - default: - break; + if (strchr(target_characters, *current)) { + GRN_TEXT_PUTC(ctx, escaped_string, escape_character); } - GRN_TEXT_PUT(ctx, escaped_query, current, char_size); + GRN_TEXT_PUT(ctx, escaped_string, current, char_size); current += char_size; break; default : - GRN_TEXT_PUT(ctx, escaped_query, current, char_size); + GRN_TEXT_PUT(ctx, escaped_string, current, char_size); current += char_size; break; } @@ -6544,3 +6532,26 @@ grn_expr_syntax_escape_query(grn_ctx *ctx, const char *query, int query_size, GRN_API_RETURN(rc); } + +grn_rc +grn_expr_syntax_escape_query(grn_ctx *ctx, const char *query, int query_size, + grn_obj *escaped_query) +{ + const char target_characters[] = { + GRN_QUERY_AND, + GRN_QUERY_AND_NOT, + GRN_QUERY_ADJ_INC, + GRN_QUERY_ADJ_DEC, + GRN_QUERY_ADJ_NEG, + GRN_QUERY_PREFIX, + GRN_QUERY_PARENL, + GRN_QUERY_PARENR, + GRN_QUERY_QUOTEL, + GRN_QUERY_ESCAPE, + GRN_QUERY_COLUMN, + '\0', + }; + return grn_expr_syntax_escape(ctx, query, query_size, + target_characters, GRN_QUERY_ESCAPE, + escaped_query); +} -------------- next part -------------- HTML����������������������������... 下載