/* * _table_ の _key_ に対応するカラム _name_ の値を設定する。 * _key_ に対応するレコードがない場合は新しく作成される。 * * @overload set_column_value(key, name, value) * @overload set_column_value(id, name, value, {:id=>true}) */ static VALUE rb_grn_table_key_support_set_column_value (int argc, VALUE *argv, VALUE self) { grn_id id; VALUE rb_key, rb_id_or_key, rb_name, rb_value, rb_options; rb_scan_args(argc, argv, "31", &rb_id_or_key, &rb_name, &rb_value, &rb_options); if (!NIL_P(rb_options)) { VALUE rb_option_id; rb_grn_scan_options(rb_options, "id", &rb_option_id, NULL); if (RVAL2CBOOL(rb_option_id)) { VALUE rb_id = rb_id_or_key; return rb_grn_table_set_column_value(self, rb_id, rb_name, rb_value); } } rb_key = rb_id_or_key; id = rb_grn_table_key_support_add_raw(self, rb_key, NULL); if (id == GRN_ID_NIL) { rb_raise(rb_eGrnError, "failed to add record: %s", rb_grn_inspect(rb_ary_new_from_args(4, self, rb_key, rb_name, rb_value))); } return rb_grn_table_set_column_value_raw(self, id, rb_name, rb_value); }
/* * _table_ の _key_ に対応するカラム _column_name_ の値を設定する。 * _key_ に対応するレコードがない場合は新しく作成される。 * * 0.9.0から値ではなくカラムの値を設定するようになった。 * * @overload []=(key, values) * @param [::Hash] values * keyに対応させるカラムの値。{ :column_name => value, ... }の形で設定する。 */ static VALUE rb_grn_table_key_support_array_set (VALUE self, VALUE rb_key, VALUE rb_values) { grn_id id; SetValueData data; grn_ctx *context; grn_obj *table; rb_grn_table_key_support_deconstruct(SELF(self), &table, &context, NULL, NULL, NULL, NULL, NULL, NULL, NULL); id = rb_grn_table_key_support_add_raw(self, rb_key, NULL); if (id == GRN_ID_NIL) { rb_raise(rb_eGrnError, "failed to add record: %s", rb_grn_inspect(rb_ary_new_from_args(3, self, rb_key, rb_values))); } data.self = self; data.id = id; data.table = table; data.rb_grn_object.context = context; rb_iterate(rb_each, rb_values, set_value, (VALUE)&data); return Qnil; }
static VALUE application_initialize(VALUE self, VALUE args) { if (rb_thread_main() != rb_thread_current()) { rb_raise(rb_eThreadError, "Initializing QML::Application outside the main thread"); } application_t *data; TypedData_Get_Struct(self, application_t, &data_type, data); if (rb_type(args) != T_ARRAY) { rb_raise(rb_eTypeError, "Expected Array"); } args = rb_ary_concat(rb_ary_new_from_args(1, rb_argv0), args); int argc = RARRAY_LEN(args); char **argv = malloc(argc * sizeof(char *)); for (int i = 0; i < argc; ++i) { VALUE arg = RARRAY_AREF(args, i); argv[i] = rb_string_value_cstr(&arg); } data->application = qmlbind_application_new(argc, argv); return self; }
static void rb_gtk3_spin_button_input(RGClosureCallData *data) { InputData input_data; VALUE args; args = rb_ary_new_from_args(1, GVAL2RVAL(&(data->param_values[0]))); if (!NIL_P(data->extra_args)) { rb_ary_concat(args, data->extra_args); } input_data.data = data; input_data.args = args; input_data.new_value = g_value_get_pointer(&(data->param_values[1])); rb_rescue(rb_gtk3_spin_button_input_body, (VALUE)&input_data, rb_gtk3_spin_button_input_rescue, (VALUE)&input_data); }
VALUE rb_resolve_feature_path(VALUE klass, VALUE fname) { VALUE path; int found; VALUE sym; fname = rb_get_path_check(fname, 0); path = rb_str_encode_ospath(fname); found = search_required(path, &path, 0, no_feature_p); switch (found) { case 'r': sym = ID2SYM(rb_intern("rb")); break; case 's': sym = ID2SYM(rb_intern("so")); break; default: load_failed(fname); } return rb_ary_new_from_args(2, sym, path); }
static VALUE rg_fetch_pos(VALUE self, VALUE rb_match_reference) { gint start_pos = 0; gint end_pos = 0; gboolean fetched = FALSE; switch (TYPE(rb_match_reference)) { case RUBY_T_FIXNUM: { gint match_num; match_num = NUM2INT(rb_match_reference); fetched = g_match_info_fetch_pos(_SELF(self), match_num, &start_pos, &end_pos); } break; case RUBY_T_STRING: case RUBY_T_SYMBOL: { const gchar *match_name; match_name = RVAL2CSTR_ACCEPT_SYMBOL(rb_match_reference); fetched = g_match_info_fetch_named_pos(_SELF(self), match_name, &start_pos, &end_pos); } break; default: rb_raise(rb_eArgError, "Expected a String, a Symbol or an Integer"); break; } if (!fetched) { return Qnil; } return rb_ary_new_from_args(2, INT2NUM(start_pos), INT2NUM(end_pos)); }
/* * _expression_ から {Groonga::Snippet} を生成する。 _tags_ には * キーワードの前後に挿入するタグの配列を以下のような形式で指定 * する。 * * <pre> * !!!ruby * [ * ["キーワード前に挿入する文字列1", "キーワード後に挿入する文字列1"], * ["キーワード前に挿入する文字列2", "キーワード後に挿入する文字列2"], * # ..., * ] * </pre> * * もし、1つのスニペットの中に _tags_ で指定したタグより多くの * キーワードが含まれている場合は、以下のように、また、先頭 * のタグから順番に使われる。 * * <pre> * !!!ruby * expression.parse("Ruby groonga 検索") * tags = [["<tag1>", "</tag1>"], ["<tag2>", "</tag2>"]] * snippet = expression.snippet(tags) * p snippet.execute("Rubyでgroonga使って全文検索、高速検索。") * # => ["<tag1>Ruby</tag1>で<tag2>groonga</tag2>" * # => "使って全文<tag1>検索</tag1>、高速<tag2>検索</tag2>。"] * </pre> * * @overload snippet(tags, options) * @param tags [Array<string>] キーワードの前後に挿入するタグの配列 * (詳細は上記を参照) * @param options [::Hash] The name and value * pairs. Omitted names are initialized as the default value. * @option options :normalize (false) * キーワード文字列・スニペット元の文字列を正規化するかど * うか。省略した場合は +false+ で正規化しない。 * @option options :skip_leading_spaces (false) * 先頭の空白を無視するかどうか。省略した場合は +false+ で無 * 視しない。 * @option options :width (100) * スニペット文字列の長さ。省略した場合は100文字。 * @option options :max_results (3) * 生成するスニペットの最大数。省略した場合は3。 * @option options :html_escape (false) * スニペット内の +<+, +>+, +&+, +"+ をHTMLエスケープするか * どうか。省略した場合は +false+ で、HTMLエスケープしない。 * @return [Groonga::Snippet] */ static VALUE rb_grn_expression_snippet (int argc, VALUE *argv, VALUE self) { grn_ctx *context = NULL; grn_obj *expression; grn_obj *snippet; VALUE options; VALUE rb_normalize, rb_skip_leading_spaces; VALUE rb_width, rb_max_results, rb_tags; VALUE rb_html_escape; VALUE *rb_tag_values; VALUE related_object; unsigned int i; int flags = GRN_SNIP_COPY_TAG; unsigned int width = 100; unsigned int max_results = 3; unsigned int n_tags = 0; char **open_tags = NULL; unsigned int *open_tag_lengths = NULL; char **close_tags = NULL; unsigned int *close_tag_lengths = NULL; grn_snip_mapping *mapping = NULL; rb_grn_expression_deconstruct(SELF(self), &expression, &context, NULL, NULL, NULL, NULL, NULL); rb_scan_args(argc, argv, "11", &rb_tags, &options); rb_grn_scan_options(options, "normalize", &rb_normalize, "skip_leading_spaces", &rb_skip_leading_spaces, "width", &rb_width, "max_results", &rb_max_results, "html_escape", &rb_html_escape, NULL); if (TYPE(rb_tags) != T_ARRAY) { rb_raise(rb_eArgError, "tags should be " "[\"open_tag\", \"close_tag\"] or " "[[\"open_tag1\", \"close_tag1\"], ...]: %s", rb_grn_inspect(rb_tags)); } if (TYPE(RARRAY_PTR(rb_tags)[0]) == T_STRING) { rb_tags = rb_ary_new_from_args(1, rb_tags); } rb_tag_values = RARRAY_PTR(rb_tags); n_tags = RARRAY_LEN(rb_tags); open_tags = ALLOCA_N(char *, n_tags); open_tag_lengths = ALLOCA_N(unsigned int, n_tags); close_tags = ALLOCA_N(char *, n_tags); close_tag_lengths = ALLOCA_N(unsigned int, n_tags); for (i = 0; i < n_tags; i++) { VALUE *tag_pair; if (TYPE(rb_tag_values[i]) != T_ARRAY || RARRAY_LEN(rb_tag_values[i]) != 2) { rb_raise(rb_eArgError, "tags should be " "[\"open_tag\", \"close_tag\"] or" "[[\"open_tag1\", \"close_tag1\"], ...]: %s", rb_grn_inspect(rb_tags)); } tag_pair = RARRAY_PTR(rb_tag_values[i]); open_tags[i] = StringValuePtr(tag_pair[0]); open_tag_lengths[i] = RSTRING_LEN(tag_pair[0]); close_tags[i] = StringValuePtr(tag_pair[1]); close_tag_lengths[i] = RSTRING_LEN(tag_pair[1]); } if (RVAL2CBOOL(rb_normalize)) flags |= GRN_SNIP_NORMALIZE; if (RVAL2CBOOL(rb_skip_leading_spaces)) flags |= GRN_SNIP_SKIP_LEADING_SPACES; if (!NIL_P(rb_width)) width = NUM2UINT(rb_width); if (!NIL_P(rb_max_results)) max_results = NUM2UINT(rb_max_results); if (RVAL2CBOOL(rb_html_escape)) mapping = (grn_snip_mapping *)-1; snippet = grn_expr_snip(context, expression, flags, width, max_results, n_tags, (const char **)open_tags, open_tag_lengths, (const char **)close_tags, close_tag_lengths, mapping); related_object = rb_ary_new_from_args(2, self, rb_ary_new_from_values(argc, argv)); rb_grn_context_check(context, related_object); return GRNOBJECT2RVAL(Qnil, context, snippet, GRN_TRUE); }
/* * 文字列 _query_ をパースする。 * @overload parse(query, options={}) * @param [String] query パースする文字列 * @param [::Hash] options The name and value * pairs. Omitted names are initialized as the default value. * @option options :default_column * "column_name:hoge"ではなく"hoge"のようにcolumn_nameが指 * 定されない条件の検索対象となるカラムを指定する。 * @option options :default_operator (Groonga::Operator::AND) * "+"や"OR"で繋がれず、ただ列挙された複数の条件があった時、 * _expression_ 全体として各レコードをヒットとみなすかの論理 * 条件を指定する。省略した場合はGroonga::Operator::AND。 * * - Groonga::Operator::OR := * レコードはいずれかの条件にマッチすればいい。 =: * - Groonga::Operator::AND := * レコードは全ての条件にマッチしなければならない。 =: * - Groonga::Operator::AND_NOT := * 最初の条件にレコードはマッチし、残りの条件にレコードは * マッチしてはならない。 =: * * @option options :default_mode (Groonga::Operator::MATCH) * 検索時のモードを指定する。省略した場合はGroonga::Operator::MATCH。 * (FIXME: モードによってどういう動作になるかを書く。) * @option options :syntax (:query) * _query_ の構文を指定する。指定可能な値は以下の通り。省略 * した場合は +:query+ 。 * * - +:query+ := * 「文字列1 OR 文字列2」で「"文字列1"あるいは"文字列2" * にマッチという検索エンジンで利用できるような構文を使 * う。 * 参考: "Groongaのクエリ構文のドキュメント":http://groonga.org/ja/docs/reference/grn_expr/query_syntax.html =: * - +nil+ := * +:query+と同様 =: * - +:script+ := * 「[カラム名] == [値]」というようにECMAScript風の構文を使う。 * 参考: "Groongaのscript構文のドキュメント":http://groonga.org/ja/docs/reference/grn_expr/script_syntax.html =: * @option options :allow_pragma * _query_ の構文に query を用いているとき( +:syntax+ * オプション参照)、「*E-1」というようにクエリの先頭で * pragmaを利用できるようにする。script構文を用いている * ときはこのオプションを利用できない。 * * デフォルトではプラグマを利用できる。 * * 参考: "Groongaのクエリ構文のドキュメント":http://groonga.org/ja/docs/reference/grn_expr/query_syntax.html * @option options :allow_column * _query_ の構文にqueryを用いているとき( +:syntax+ オプショ * ン参照)、「カラム名:値」というようにカラム名を指定した * 条件式を利用できるようにする。script構文を用いていると * きはこのオプションを利用できない。 * * デフォルトではカラム名を指定した条件式を利用できる。 * * 参考: "Groongaのクエリ構文のドキュメント":http://groonga.org/ja/docs/reference/grn_expr/query_syntax.html * @option options :allow_update * _query_ の構文にscriptを用いているとき( +:syntax+ オプショ * ン参照)、「カラム名 = 値」というように更新操作を利用で * きるようにする。query構文を用いているときはこのオプショ * ンを利用できない。 * * デフォルトでは更新操作を利用できる。 * * 参考: "Groongaのクエリ構文のドキュメント":http://groonga.org/ja/docs/reference/grn_expr/query_syntax.html */ static VALUE rb_grn_expression_parse (int argc, VALUE *argv, VALUE self) { grn_ctx *context = NULL; grn_obj *expression, *default_column; grn_bool default_column_is_created = GRN_FALSE; grn_operator default_operator = GRN_OP_AND; grn_operator default_mode = GRN_OP_MATCH; grn_rc rc; char *query = NULL; unsigned query_size = 0; grn_expr_flags flags = 0; VALUE options, rb_query, rb_default_column, rb_default_operator; VALUE rb_default_mode, rb_syntax; VALUE rb_allow_pragma, rb_allow_column, rb_allow_update, rb_allow_leading_not; VALUE exception = Qnil; rb_scan_args(argc, argv, "11", &rb_query, &options); rb_grn_scan_options(options, "default_column", &rb_default_column, "default_operator", &rb_default_operator, "default_mode", &rb_default_mode, "syntax", &rb_syntax, "allow_pragma", &rb_allow_pragma, "allow_column", &rb_allow_column, "allow_update", &rb_allow_update, "allow_leading_not", &rb_allow_leading_not, NULL); query = StringValuePtr(rb_query); query_size = RSTRING_LEN(rb_query); rb_grn_expression_deconstruct(SELF(self), &expression, &context, NULL, NULL, NULL, NULL, NULL); if (NIL_P(rb_default_column)) { default_column = NULL; } else if (RVAL2CBOOL(rb_obj_is_kind_of(rb_default_column, rb_cGrnObject))) { default_column = RVAL2GRNOBJECT(rb_default_column, &context); } else { default_column = RVAL2GRNBULK(rb_default_column, context, NULL); default_column_is_created = GRN_TRUE; } if (!NIL_P(rb_default_mode)) default_mode = RVAL2GRNOPERATOR(rb_default_mode); if (!NIL_P(rb_default_operator)) default_operator = RVAL2GRNSETOPERATOR(rb_default_operator); if (NIL_P(rb_syntax) || rb_grn_equal_option(rb_syntax, "query")) { flags = GRN_EXPR_SYNTAX_QUERY; } else if (rb_grn_equal_option(rb_syntax, "script")) { flags = GRN_EXPR_SYNTAX_SCRIPT; } else { rb_raise(rb_eArgError, "syntax should be one of " "[nil, :query, :script]: %s", rb_grn_inspect(rb_syntax)); } if (NIL_P(rb_allow_pragma)) { if (!(flags & GRN_EXPR_SYNTAX_SCRIPT)) flags |= GRN_EXPR_ALLOW_PRAGMA; } else { if ((flags & GRN_EXPR_SYNTAX_SCRIPT)) rb_raise(rb_eArgError, ":allow_pragma isn't allowed in script syntax"); if (RVAL2CBOOL(rb_allow_pragma)) flags |= GRN_EXPR_ALLOW_PRAGMA; } if (NIL_P(rb_allow_column)) { if (!(flags & GRN_EXPR_SYNTAX_SCRIPT)) flags |= GRN_EXPR_ALLOW_COLUMN; } else { if ((flags & GRN_EXPR_SYNTAX_SCRIPT)) rb_raise(rb_eArgError, ":allow_column isn't allowed in script syntax"); if (RVAL2CBOOL(rb_allow_column)) flags |= GRN_EXPR_ALLOW_COLUMN; } if (NIL_P(rb_allow_update)) { flags |= GRN_EXPR_ALLOW_UPDATE; } else { if (RVAL2CBOOL(rb_allow_update)) flags |= GRN_EXPR_ALLOW_UPDATE; } if (!NIL_P(rb_allow_leading_not)) { if (RVAL2CBOOL(rb_allow_leading_not)) flags |= GRN_EXPR_ALLOW_LEADING_NOT; } rc = grn_expr_parse(context, expression, query, query_size, default_column, default_mode, default_operator, flags); if (rc != GRN_SUCCESS) { VALUE related_object; related_object = rb_ary_new_from_args(2, self, rb_ary_new_from_values(argc, argv)); exception = rb_grn_context_to_exception(context, related_object); } if (default_column_is_created) grn_obj_unlink(context, default_column); if (!NIL_P(exception)) rb_exc_raise(exception); return Qnil; }
static VALUE array_spec_rb_ary_new_from_args(VALUE self, VALUE first, VALUE second, VALUE third) { return rb_ary_new_from_args(3, first, second, third); }