/*
* 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;
}