/* * call-seq: * create(path, option=>value, ...) * * インデックスファイルの作成。 * * 有効な option: * :key_size [Integer] :: キーのサイズ (default: 0) * :flags [Integer] :: 次のフラグを「|」で連結したもの。Senna::Index::NORMALIZE, Senna::Index::SPLIT_ALPHA, Senna::Index::SPLIT_DIGIT, Senna::Index::SPLIT_SYMBOL, Senna::Index::NGRAM, Senna::Index::DELIMITED. (default: 0) * :initial_n_segments [Integer] :: 初期バッファサイズ (default: 0) * :encoding [Integer] :: 次のいずれか。Senna::ENC_DEFAULT(default), Senna::ENC_NONE, Senna::ENC_EUC_JP, Senna::ENC_UTF8, Senna::ENC_SJIS * * === Argument * path [String] :: インデックスファイル名 * * === Return * Senna::Index オブジェクト * * === Exception * Senna::Error:: インデックスの作成に失敗した */ static VALUE index_create(int argc, VALUE *argv, VALUE klass) { VALUE path, opt; VALUE key_size=Qnil, flags, initial_n_segments, encoding; char *s_path; int _key_size=0, _flags=0, _initial_n_segments=0; sen_encoding _encoding=sen_enc_default; sen_index *indexp; VALUE obj; struct index_data *data; rb_scan_args(argc, argv, "11", &path, &opt); Check_SafeStr(path); s_path = RSTRING_PTR(path); if (!NIL_P(opt)) { Check_Type(opt, T_HASH); key_size = rb_hash_aref(opt, ID2SYM(rb_intern("key_size"))); if (key_size == rb_cInteger) _key_size = sizeof(long); else { _key_size = NIL_P(key_size) ? 0 : NUM2INT(key_size); key_size = Qnil; } flags = rb_hash_aref(opt, ID2SYM(rb_intern("flags"))); _flags = NIL_P(flags) ? 0 : NUM2INT(flags); initial_n_segments = rb_hash_aref(opt, ID2SYM(rb_intern("initial_n_segments"))); _initial_n_segments = NIL_P(initial_n_segments) ? 0 : NUM2INT(initial_n_segments); encoding = rb_hash_aref(opt, ID2SYM(rb_intern("encoding"))); _encoding = NIL_P(encoding) ? sen_enc_default : NUM2INT(encoding); } indexp = sen_index_create(s_path, _key_size, _flags, _initial_n_segments, _encoding); if (indexp == NULL) senna_error(0, "cannot create: %s: %s", s_path, strerror(errno)); obj = Data_Make_Struct(klass, struct index_data, 0, free_index, data); data->closed = 0; data->indexp = indexp; rb_iv_set(obj, "key_size", INT2NUM(_key_size)); rb_iv_set(obj, "key_type", key_size); return obj; }