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