Esempio n. 1
0
/*
 * call-seq:
 *   column.local_name
 *
 * テーブル名を除いたカラム名を返す。
 *
 *   items = Groonga::Array.create(:name => "Items")
 *   title = items.define_column("title", "ShortText")
 *   title.name # => "Items.title"
 *   title.local_name # => "title"
 */
static VALUE
rb_grn_column_get_local_name (VALUE self)
{
    RbGrnColumn *rb_grn_column;
    grn_ctx *context = NULL;
    grn_obj *column;
    VALUE rb_name;
    char *name;
    int name_size;

    rb_grn_column = SELF(self);
    rb_grn_object_deconstruct(RB_GRN_OBJECT(rb_grn_column), &column, &context,
			      NULL, NULL,
			      NULL, NULL);
    name_size = grn_column_name(context, column, NULL, 0);
    if (name_size == 0)
	return Qnil;

    name = xmalloc(name_size);
    grn_column_name(context, column, name, name_size);
    rb_name = rb_str_new(name, name_size);
    xfree(name);

    return rb_name;
}
Esempio n. 2
0
static void
command_schema_output_column_name(grn_ctx *ctx, grn_obj *column)
{
  char name[GRN_TABLE_MAX_KEY_SIZE];
  unsigned int name_size;
  name_size = grn_column_name(ctx, column, name, GRN_TABLE_MAX_KEY_SIZE);
  grn_ctx_output_str(ctx, name, name_size);
}
Esempio n. 3
0
/* grn_ts_writer_expand() expands a wildcard. */
static grn_rc
grn_ts_writer_expand(grn_ctx *ctx, grn_ts_writer *writer,
                     grn_obj *table, grn_ts_str str)
{
  grn_rc rc = GRN_SUCCESS;
  grn_hash_cursor *cursor;
  grn_hash *hash = grn_hash_create(ctx, NULL, sizeof(grn_ts_id), 0,
                                   GRN_OBJ_TABLE_HASH_KEY | GRN_HASH_TINY);
  if (!hash) {
    return GRN_INVALID_ARGUMENT;
  }
  grn_table_columns(ctx, table, str.ptr, str.size - 1, (grn_obj *)hash);
  if (ctx->rc != GRN_SUCCESS) {
    return ctx->rc;
  }
  cursor = grn_hash_cursor_open(ctx, hash, NULL, 0, NULL, 0, 0, -1, 0);
  if (!cursor) {
    rc = GRN_INVALID_ARGUMENT;
  } else {
    while (grn_hash_cursor_next(ctx, cursor) != GRN_ID_NIL) {
      char name_buf[GRN_TABLE_MAX_KEY_SIZE];
      size_t name_size;
      grn_obj *column;
      grn_ts_id *column_id;
      if (!grn_hash_cursor_get_key(ctx, cursor, (void **)&column_id)) {
        rc = GRN_INVALID_ARGUMENT;
        break;
      }
      column = grn_ctx_at(ctx, *column_id);
      if (!column) {
        rc = GRN_INVALID_ARGUMENT;
        break;
      }
      name_size = grn_column_name(ctx, column, name_buf, sizeof(name_buf));
      grn_obj_unlink(ctx, column);
      rc = grn_vector_add_element(ctx, &writer->name_buf,
                                  name_buf, name_size, 0, GRN_DB_TEXT);
      if (rc != GRN_SUCCESS) {
        break;
      }
    }
    grn_hash_cursor_close(ctx, cursor);
  }
  grn_hash_close(ctx, hash);
  return rc;
}
Esempio n. 4
0
static grn_id
resolve_source_id (grn_ctx *context, grn_obj *column, grn_id range_id,
                   VALUE rb_source)
{
    grn_id source_id;

    if (CBOOL2RVAL(rb_obj_is_kind_of(rb_source, rb_cInteger))) {
        source_id = NUM2UINT(rb_source);
    } else {
        grn_obj *source;
        grn_bool need_source_unlink = GRN_FALSE;

        if (TYPE(rb_source) == T_STRING) {
            grn_obj *table;
            const char *name;
            const char *dot_point;
            int length;

            table = grn_ctx_at(context, grn_obj_get_range(context, column));
            name = StringValueCStr(rb_source);
            length = RSTRING_LEN(rb_source);
            dot_point = strstr(name, ".");
            if (dot_point) {
                char table_name[4096];
                int table_name_length;

                table_name_length = grn_obj_name(context, table,
                                                 table_name, sizeof(table_name));
                table_name[table_name_length] = '\0';
                if (strncmp(table_name, name, dot_point - name) != 0) {
                    rb_raise(rb_eArgError,
                             "wrong table's column: <%s>: "
                             "expected table: <%s>",
                             name, table_name);
                }
                length -= (dot_point - name) + 1;
                name = dot_point + 1;
            }
            source = grn_obj_column(context, table, name, length);
            need_source_unlink = GRN_TRUE;
        } else {
            source = RVAL2GRNOBJECT(rb_source, &context);
        }
        rb_grn_context_check(context, rb_source);
        if (source->header.type == GRN_ACCESSOR) {
            char name[256];
            int length;
            length = grn_column_name(context, source, name, sizeof(name));
            name[length] = '\0';
            if (strcmp(name, "_key") != 0) {
                rb_raise(rb_eArgError,
                         "source accessor must be '_key': <%s>", name);
            }
            source_id = range_id;
        } else {
            source_id = grn_obj_id(context, source);
        }
        if (need_source_unlink) {
            grn_obj_unlink(context, source);
        }
    }

    return source_id;
}
Esempio n. 5
0
static int
print_columninfo(grn_ctx *ctx, grn_obj *column, grn_obj *buf, grn_content_type otype)
{
    grn_id id;
    char *type, name[GRN_TABLE_MAX_KEY_SIZE];
    const char *path;
    int name_len;

    switch (column->header.type) {
    case GRN_COLUMN_FIX_SIZE:
        type = "\"fix\"";
        break;
    case GRN_COLUMN_VAR_SIZE:
        type = "\"var\"";
        break;
    case GRN_COLUMN_INDEX:
        type = "\"index\"";
        break;
    default:
        GRN_LOG(ctx, GRN_LOG_NOTICE, "invalid header type %d\n", column->header.type);
        return 0;
    }

    id = grn_obj_id(ctx, column);
    name_len = grn_column_name(ctx, column, name, GRN_TABLE_MAX_KEY_SIZE);
    path = grn_obj_path(ctx, column);

    switch (otype) {
    case GRN_CONTENT_TSV:
        grn_text_itoa(ctx, buf, id);
        GRN_TEXT_PUTC(ctx, buf, '\t');
        grn_text_esc(ctx, buf, name, name_len);
        GRN_TEXT_PUTC(ctx, buf, '\t');
        grn_text_esc(ctx, buf, path, GRN_STRLEN(path));
        GRN_TEXT_PUTC(ctx, buf, '\t');
        GRN_TEXT_PUTS(ctx, buf, type);
        GRN_TEXT_PUTC(ctx, buf, '\t');
        grn_text_itoa(ctx, buf, column->header.flags);
        GRN_TEXT_PUTC(ctx, buf, '\t');
        grn_text_itoa(ctx, buf, column->header.domain);
        /* TODO: flags to str, domain to str */
        break;
    case GRN_CONTENT_JSON:
        GRN_TEXT_PUTC(ctx, buf, '[');
        grn_text_itoa(ctx, buf, id);
        GRN_TEXT_PUTC(ctx, buf, ',');
        grn_text_esc(ctx, buf, name, name_len);
        GRN_TEXT_PUTC(ctx, buf, ',');
        grn_text_esc(ctx, buf, path, GRN_STRLEN(path));
        GRN_TEXT_PUTC(ctx, buf, ',');
        GRN_TEXT_PUTS(ctx, buf, type);
        GRN_TEXT_PUTC(ctx, buf, ',');
        grn_text_itoa(ctx, buf, column->header.flags);
        GRN_TEXT_PUTC(ctx, buf, ',');
        grn_text_itoa(ctx, buf, column->header.domain);
        /* TODO: flags to str, domain to str */
        GRN_TEXT_PUTC(ctx, buf, ']');
        break;
    }
    return 1;
}
Esempio n. 6
0
static void
command_schema_column_command_collect_arguments(grn_ctx *ctx,
                                             grn_obj *table,
                                             grn_obj *column,
                                             grn_obj *arguments)
{
#define ADD(name_, value_)                              \
  grn_vector_add_element(ctx, arguments,                \
                         name_, strlen(name_),          \
                         0, GRN_DB_TEXT);               \
  grn_vector_add_element(ctx, arguments,                \
                         value_, strlen(value_),        \
                         0, GRN_DB_TEXT)

#define ADD_OBJECT_NAME(name_, object_) do {                    \
    char object_name[GRN_TABLE_MAX_KEY_SIZE];                   \
    unsigned int object_name_size;                              \
    object_name_size = grn_obj_name(ctx, object_,               \
                                    object_name,                \
                                    GRN_TABLE_MAX_KEY_SIZE);    \
    object_name[object_name_size] = '\0';                       \
    ADD(name_, object_name);                                    \
  } while (GRN_FALSE)

  ADD_OBJECT_NAME("table", table);
  {
    char column_name[GRN_TABLE_MAX_KEY_SIZE];
    unsigned int column_name_size;
    column_name_size = grn_column_name(ctx, column,
                                       column_name, GRN_TABLE_MAX_KEY_SIZE);
    column_name[column_name_size] = '\0';
    ADD("name", column_name);
  }

  {
    grn_obj flags;
    GRN_TEXT_INIT(&flags, 0);
    grn_dump_column_create_flags(ctx,
                                 column->header.flags & ~GRN_OBJ_PERSISTENT,
                                 &flags);
    GRN_TEXT_PUTC(ctx, &flags, '\0');
    ADD("flags", GRN_TEXT_VALUE(&flags));
    GRN_OBJ_FIN(ctx, &flags);
  }

  {
    grn_obj *value_type;

    value_type = grn_ctx_at(ctx, grn_obj_get_range(ctx, column));
    ADD_OBJECT_NAME("type", value_type);
  }

  if (column->header.type == GRN_COLUMN_INDEX) {
    grn_obj source_ids;
    unsigned int n_ids;

    GRN_RECORD_INIT(&source_ids, GRN_OBJ_VECTOR, GRN_ID_NIL);
    grn_obj_get_info(ctx, column, GRN_INFO_SOURCE, &source_ids);

    n_ids = GRN_BULK_VSIZE(&source_ids) / sizeof(grn_id);
    if (n_ids > 0) {
      grn_obj sources;
      unsigned int i;

      GRN_TEXT_INIT(&sources, 0);
      for (i = 0; i < n_ids; i++) {
        grn_id source_id;
        grn_obj *source;
        char name[GRN_TABLE_MAX_KEY_SIZE];
        unsigned int name_size;

        source_id = GRN_RECORD_VALUE_AT(&source_ids, i);
        source = grn_ctx_at(ctx, source_id);

        if (grn_obj_is_table(ctx, source)) {
          grn_strcpy(name, GRN_TABLE_MAX_KEY_SIZE, "_key");
          name_size = strlen(name);
        } else {
          name_size = grn_column_name(ctx, source, name, GRN_TABLE_MAX_KEY_SIZE);
        }
        if (i > 0) {
          GRN_TEXT_PUTC(ctx, &sources, ',');
        }
        GRN_TEXT_PUT(ctx, &sources, name, name_size);
      }
      GRN_TEXT_PUTC(ctx, &sources, '\0');
      ADD("sources", GRN_TEXT_VALUE(&sources));
      GRN_OBJ_FIN(ctx, &sources);
    }
    GRN_OBJ_FIN(ctx, &source_ids);
  }

#undef ADD_OBJECT_NAME
#undef ADD
}