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