[Groonga-commit] groonga/groonga at 98e1ba1 [master] html_untag: support cast for HTML argument

Back to archive index

Kouhei Sutou null+****@clear*****
Wed Jun 26 18:27:54 JST 2013


Kouhei Sutou	2013-06-26 18:27:54 +0900 (Wed, 26 Jun 2013)

  New Revision: 98e1ba1d7703e97266ecb822ce53e0c466cb482e
  https://github.com/groonga/groonga/commit/98e1ba1d7703e97266ecb822ce53e0c466cb482e

  Message:
    html_untag: support cast for HTML argument

  Added files:
    test/command/suite/select/function/html_untag/cast.expected
    test/command/suite/select/function/html_untag/cast.test
  Modified files:
    lib/proc.c

  Modified: lib/proc.c (+32 -6)
===================================================================
--- lib/proc.c    2013-06-26 18:22:24 +0900 (8a8b5d8)
+++ lib/proc.c    2013-06-26 18:27:54 +0900 (9670ca6)
@@ -4015,7 +4015,9 @@ static grn_obj *
 func_html_untag(grn_ctx *ctx, int nargs, grn_obj **args,
                 grn_user_data *user_data)
 {
-  grn_obj *html;
+  grn_obj *html_arg;
+  int html_arg_domain;
+  grn_obj html;
   grn_obj *text;
   const char *html_raw;
   int i, length;
@@ -4026,16 +4028,38 @@ func_html_untag(grn_ctx *ctx, int nargs, grn_obj **args,
     return NULL;
   }
 
-  /* TODO: type check */
-  html = args[0];
+  html_arg = args[0];
+  html_arg_domain = html_arg->header.domain;
+  switch (html_arg_domain) {
+  case GRN_DB_SHORT_TEXT :
+  case GRN_DB_TEXT :
+  case GRN_DB_LONG_TEXT :
+    GRN_VALUE_VAR_SIZE_INIT(&html, GRN_OBJ_DO_SHALLOW_COPY, html_arg_domain);
+    GRN_TEXT_SET(ctx, &html, GRN_TEXT_VALUE(html_arg), GRN_TEXT_LEN(html_arg));
+    break;
+  default :
+    GRN_TEXT_INIT(&html, 0);
+    if (grn_obj_cast(ctx, html_arg, &html, GRN_FALSE)) {
+      grn_obj inspected;
+      GRN_TEXT_INIT(&inspected, 0);
+      grn_inspect(ctx, &inspected, html_arg);
+      ERR(GRN_INVALID_ARGUMENT, "failed to cast to text: <%.*s>",
+          (int)GRN_TEXT_LEN(&inspected), GRN_TEXT_VALUE(&inspected));
+      GRN_OBJ_FIN(ctx, &inspected);
+      GRN_OBJ_FIN(ctx, &html);
+      return NULL;
+    }
+    break;
+  }
 
-  text = GRN_PROC_ALLOC(html->header.domain, 0);
+  text = GRN_PROC_ALLOC(html.header.domain, 0);
   if (!text) {
+    GRN_OBJ_FIN(ctx, &html);
     return NULL;
   }
 
-  html_raw = GRN_TEXT_VALUE(html);
-  length = GRN_TEXT_LEN(html);
+  html_raw = GRN_TEXT_VALUE(&html);
+  length = GRN_TEXT_LEN(&html);
   for (i = 0; i < length; i++) {
     switch (html_raw[i]) {
     case '<' :
@@ -4052,6 +4076,8 @@ func_html_untag(grn_ctx *ctx, int nargs, grn_obj **args,
     }
   }
 
+  GRN_OBJ_FIN(ctx, &html);
+
   return text;
 }
 

  Added: test/command/suite/select/function/html_untag/cast.expected (+11 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/html_untag/cast.expected    2013-06-26 18:27:54 +0900 (0c4052b)
@@ -0,0 +1,11 @@
+table_create Entries TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Entries id COLUMN_SCALAR Int32
+[[0,0.0,0.0],true]
+load --table Entries
+[
+{"id": 29}
+]
+[[0,0.0,0.0],1]
+select Entries   --output_columns "html_untag(id)"   --command_version 2
+[[0,0.0,0.0],[[[1],[["html_untag","null"]],["29"]]]]

  Added: test/command/suite/select/function/html_untag/cast.test (+11 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/html_untag/cast.test    2013-06-26 18:27:54 +0900 (80cfeec)
@@ -0,0 +1,11 @@
+table_create Entries TABLE_NO_KEY
+column_create Entries id COLUMN_SCALAR Int32
+
+load --table Entries
+[
+{"id": 29}
+]
+
+select Entries \
+  --output_columns "html_untag(id)" \
+  --command_version 2
-------------- next part --------------
HTML����������������������������...
Download 



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