/* * call-seq: * new(path) * open(path) * * インデックスのオープン。 * * === Argument * path [String] :: インデックスファイル名 * * === Return * Senna::Index オブジェクト * * === Exception * Senna::Error:: インデックスのオープンに失敗した */ static VALUE index_open(int argc, VALUE *argv, VALUE klass) { VALUE path, opt; VALUE key_size = Qnil; char *s_path; sen_index *indexp; VALUE obj; int _key_size; struct index_data *data; rb_scan_args(argc, argv, "11", &path, &opt); Check_SafeStr(path); if (!NIL_P(opt)) { Check_Type(opt, T_HASH); key_size = rb_hash_aref(opt, ID2SYM(rb_intern("key_size"))); } s_path = RSTRING_PTR(path); if ((indexp = sen_index_open(s_path)) == NULL) senna_error(0, "cannot open: %s: %s", s_path, strerror(errno)); obj = Data_Make_Struct(klass, struct index_data, 0, free_index, data); data->closed = 0; data->indexp = indexp; sen_index_info(indexp, &_key_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if (!NIL_P(key_size)) { int ks; if (key_size == rb_cInteger) ks = sizeof(long); else { ks = NIL_P(key_size) ? 0 : NUM2INT(key_size); key_size = Qnil; } if (ks != _key_size) senna_error(0, "key_size mismatch: %d != %d", ks, _key_size); } rb_iv_set(obj, "key_size", INT2NUM(_key_size)); rb_iv_set(obj, "key_type", key_size); return obj; }