static void command_schema_column_output_indexes(grn_ctx *ctx, grn_obj *column) { uint32_t i; grn_index_datum *index_data = NULL; uint32_t n_index_data = 0; if (column) { n_index_data = grn_column_get_all_index_data(ctx, column, NULL, 0); if (n_index_data > 0) { index_data = GRN_PLUGIN_MALLOC(ctx, sizeof(grn_index_datum) * n_index_data); if (!index_data) { GRN_PLUGIN_ERROR(ctx, GRN_NO_MEMORY_AVAILABLE, "[schema] failed to allocate memory for indexes"); return; } grn_column_get_all_index_data(ctx, column, index_data, n_index_data); } } grn_ctx_output_array_open(ctx, "indexes", n_index_data); for (i = 0; i < n_index_data; i++) { grn_obj *lexicon; grn_ctx_output_map_open(ctx, "index", 4); grn_ctx_output_cstr(ctx, "full_name"); command_schema_output_name(ctx, index_data[i].index); grn_ctx_output_cstr(ctx, "table"); lexicon = grn_ctx_at(ctx, index_data[i].index->header.domain); command_schema_output_name(ctx, lexicon); grn_ctx_output_cstr(ctx, "name"); command_schema_output_column_name(ctx, index_data[i].index); grn_ctx_output_cstr(ctx, "section"); grn_ctx_output_uint64(ctx, index_data[i].section); grn_ctx_output_map_close(ctx); } grn_ctx_output_array_close(ctx); if (index_data) { GRN_PLUGIN_FREE(ctx, index_data); } }
static mrb_value indexable_indexes(mrb_state *mrb, mrb_value self) { grn_ctx *ctx = (grn_ctx *)mrb->ud; grn_obj *object; grn_index_datum index_datum; grn_index_datum *index_data; int i, n_index_data; mrb_value mrb_indexes; object = DATA_PTR(self); n_index_data = grn_column_get_all_index_data(ctx, object, &index_datum, 1); if (n_index_data == 0) { return mrb_ary_new(mrb); } if (n_index_data == 1) { index_data = &index_datum; } else { index_data = GRN_MALLOCN(grn_index_datum, n_index_data); n_index_data = grn_column_get_all_index_data(ctx, object, index_data, n_index_data); } mrb_indexes = mrb_ary_new_capa(mrb, n_index_data); for (i = 0; i < n_index_data; i++) { grn_mrb_data *data; struct RClass *klass; mrb_value args[2]; data = &(ctx->impl->mrb); klass = mrb_class_get_under(mrb, data->module, "IndexInfo"); args[0] = grn_mrb_value_from_grn_obj(mrb, index_data[i].index); args[1] = mrb_fixnum_value(index_data[i].section); mrb_ary_push(mrb, mrb_indexes, mrb_obj_new(mrb, klass, 2, args)); } if (index_data != &index_datum) { GRN_FREE(index_data); } return mrb_indexes; }