[Groonga-commit] groonga/groonga-gobject at 316f655 [master] Add Goonga expression escape functions

Back to archive index

Kouhei Sutou null+****@clear*****
Thu Jul 3 11:13:09 JST 2014


Kouhei Sutou	2014-07-03 11:13:09 +0900 (Thu, 03 Jul 2014)

  New Revision: 316f655063cdaa50b905146ec283d8e2663af96d
  https://github.com/groonga/groonga-gobject/commit/316f655063cdaa50b905146ec283d8e2663af96d

  Message:
    Add Goonga expression escape functions
    
      * ggrn_command_escape()
      * ggrn_command_escape_query()

  Modified files:
    groonga-gobject/ggrn-command.c
    groonga-gobject/ggrn-command.h
    test/test-command.c

  Modified: groonga-gobject/ggrn-command.c (+111 -0)
===================================================================
--- groonga-gobject/ggrn-command.c    2014-07-03 11:12:38 +0900 (f4da93a)
+++ groonga-gobject/ggrn-command.c    2014-07-03 11:13:09 +0900 (718ee46)
@@ -216,6 +216,117 @@ ggrn_command_add_argument(GGrnCommand *command,
 }
 
 /**
+ * ggrn_command_escape:
+ * @command: A #GGrnCommand.
+ * @value: The argument value.
+ * @target_characters: The characters to be escaped.
+ * @escape_character: The character to escape a character.
+ *
+ * Escapes @target_characters in @value by @escape_chracter.
+ *
+ * For example:
+ * |[
+ * gchar *escaped;
+ * escaped = ggrn_command_escape(command,
+ *                               "aA'\"()19",
+ *                               "'\"()",
+ *                               '\\');
+ * g_print("%s\n", escaped); // -> aA\'\"\(\)19
+ * g_free(escaped);
+ * ]|
+ *
+ * Returns: The escaped characters. It must be freed with
+ *   g_free() when no longer needed.
+ *
+ *   It returns %NULL for invalid input.
+ *
+ * Since: 1.0.1
+ */
+gchar *
+ggrn_command_escape(GGrnCommand *command,
+                    const gchar *value,
+                    const gchar *target_characters,
+                    char         escape_character)
+{
+    GGrnCommandPrivate *priv = GGRN_COMMAND_GET_PRIVATE(command);
+    grn_ctx *ctx;
+    grn_obj escaped_string;
+    gchar *escaped_value;
+    grn_rc rc;
+
+    ctx = _ggrn_context_get_ctx(priv->context);
+    GRN_TEXT_INIT(&escaped_string, 0);
+    rc = grn_expr_syntax_escape(ctx,
+                                value,
+                                strlen(value),
+                                target_characters,
+                                escape_character,
+                                &escaped_string);
+    if (rc != GRN_SUCCESS) {
+        GRN_OBJ_FIN(ctx, &escaped_string);
+        return NULL;
+    }
+
+    escaped_value = g_strndup(GRN_TEXT_VALUE(&escaped_string),
+                              GRN_TEXT_LEN(&escaped_string));
+    GRN_OBJ_FIN(ctx, &escaped_string);
+
+    return escaped_value;
+}
+
+/**
+ * ggrn_command_escape_query:
+ * @command: A #GGrnCommand.
+ * @query: The query argument value.
+ *
+ * Escapes [special characters of query
+ * syntax](http://groonga.org/docs/reference/grn_expr/query_syntax.html#escape)
+ * in @query.
+ *
+ * For example:
+ *
+ * |[
+ * gchar *escaped_query;
+ * escaped_query = ggrn_command_escape_query(command, "column:aA'\"()19");
+ * g_print("%s\n", escaped_query); // -> column\:aA'\"\(\)19
+ * g_free(escaped_query);
+ * ]|
+ *
+ * Returns: The escaped query. It must be freed with
+ *   g_free() when no longer needed.
+ *
+ *   It returns %NULL for invalid input.
+ *
+ * Since: 1.0.1
+ */
+gchar *
+ggrn_command_escape_query(GGrnCommand *command, const gchar *query)
+{
+    GGrnCommandPrivate *priv = GGRN_COMMAND_GET_PRIVATE(command);
+    grn_ctx *ctx;
+    grn_obj escaped_string;
+    gchar *escaped_value;
+    grn_rc rc;
+
+    ctx = _ggrn_context_get_ctx(priv->context);
+    GRN_TEXT_INIT(&escaped_string, 0);
+    rc = grn_expr_syntax_escape_query(ctx,
+                                      query,
+                                      strlen(query),
+                                      &escaped_string);
+    if (rc != GRN_SUCCESS) {
+        GRN_OBJ_FIN(ctx, &escaped_string);
+        return NULL;
+    }
+
+    escaped_value = g_strndup(GRN_TEXT_VALUE(&escaped_string),
+                              GRN_TEXT_LEN(&escaped_string));
+    GRN_OBJ_FIN(ctx, &escaped_string);
+
+    return escaped_value;
+}
+
+/**
  * ggrn_command_execute:
  * @command: A #GGrnCommand.
  *

  Modified: groonga-gobject/ggrn-command.h (+6 -0)
===================================================================
--- groonga-gobject/ggrn-command.h    2014-07-03 11:12:38 +0900 (d395420)
+++ groonga-gobject/ggrn-command.h    2014-07-03 11:13:09 +0900 (38e76d8)
@@ -62,6 +62,12 @@ GGrnCommand         *ggrn_command_new               (GGrnContext *context,
 void                 ggrn_command_add_argument      (GGrnCommand *command,
                                                      const gchar *name,
                                                      const gchar *value);
+gchar               *ggrn_command_escape            (GGrnCommand *command,
+                                                     const gchar *value,
+                                                     const gchar *target_characters,
+                                                     char         escape_character);
+gchar               *ggrn_command_escape_query      (GGrnCommand *command,
+                                                     const gchar *query);
 gchar               *ggrn_command_execute           (GGrnCommand *command);
 gchar               *ggrn_command_to_path           (GGrnCommand *command);
 gchar               *ggrn_command_to_command_line   (GGrnCommand *command);

  Modified: test/test-command.c (+26 -0)
===================================================================
--- test/test-command.c    2014-07-03 11:12:38 +0900 (22d8bb2)
+++ test/test-command.c    2014-07-03 11:13:09 +0900 (fae4070)
@@ -24,6 +24,8 @@
 
 #include <gcutter.h>
 
+CUT_EXPORT void test_escape(void);
+CUT_EXPORT void test_escape_query(void);
 CUT_EXPORT void data_to_path(void);
 CUT_EXPORT void test_to_path(gconstpointer data);
 CUT_EXPORT void data_to_command_line(void);
@@ -63,6 +65,30 @@ add_arguments(GHashTable *arguments)
 }
 
 void
+test_escape(void)
+{
+    gchar *escaped;
+
+    escaped = ggrn_command_escape(command,
+                                  "aA'\"()19",
+                                  "'\"()",
+                                  '\\');
+    cut_assert_equal_string_with_free("aA\\'\\\"\\(\\)19",
+                                      escaped);
+}
+
+void
+test_escape_query(void)
+{
+    gchar *escaped_query;
+
+    escaped_query = ggrn_command_escape_query(command,
+                                              "column:aA'\"()19");
+    cut_assert_equal_string_with_free("column\\:aA'\\\"\\(\\)19",
+                                      escaped_query);
+}
+
+void
 data_to_path(void)
 {
 #define ADD_DATA(label, expected, arguments)                            \
-------------- next part --------------
HTML����������������������������...
Download 



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