[Groonga-commit] groonga/groonga at 5cdf4c2 [master] Add grn_expr_syntax_escape()

Back to archive index

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����������������������������...
下載 



More information about the Groonga-commit mailing list
Back to archive index