mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 20:36:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			689 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			689 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* -*- c-basic-offset: 2 -*- */
 | 
						|
/*
 | 
						|
  Copyright(C) 2015-2017 Brazil
 | 
						|
 | 
						|
  This library is free software; you can redistribute it and/or
 | 
						|
  modify it under the terms of the GNU Lesser General Public
 | 
						|
  License version 2.1 as published by the Free Software Foundation.
 | 
						|
 | 
						|
  This library is distributed in the hope that it will be useful,
 | 
						|
  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
  Lesser General Public License for more details.
 | 
						|
 | 
						|
  You should have received a copy of the GNU Lesser General Public
 | 
						|
  License along with this library; if not, write to the Free Software
 | 
						|
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1335  USA
 | 
						|
*/
 | 
						|
 | 
						|
#include "grn.h"
 | 
						|
#include "grn_index_column.h"
 | 
						|
#include "grn_pat.h"
 | 
						|
#include "grn_dat.h"
 | 
						|
#include "grn_ii.h"
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_true(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!obj) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  switch (obj->header.type) {
 | 
						|
  case GRN_BULK :
 | 
						|
    switch (obj->header.domain) {
 | 
						|
    case GRN_DB_BOOL :
 | 
						|
      return GRN_BOOL_VALUE(obj);
 | 
						|
      break;
 | 
						|
    case GRN_DB_INT32 :
 | 
						|
      return GRN_INT32_VALUE(obj) != 0;
 | 
						|
      break;
 | 
						|
    case GRN_DB_UINT32 :
 | 
						|
      return GRN_UINT32_VALUE(obj) != 0;
 | 
						|
      break;
 | 
						|
    case GRN_DB_FLOAT : {
 | 
						|
      double float_value;
 | 
						|
      float_value = GRN_FLOAT_VALUE(obj);
 | 
						|
      return (float_value < -DBL_EPSILON ||
 | 
						|
              DBL_EPSILON < float_value);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    case GRN_DB_SHORT_TEXT :
 | 
						|
    case GRN_DB_TEXT :
 | 
						|
    case GRN_DB_LONG_TEXT :
 | 
						|
      return GRN_TEXT_LEN(obj) != 0;
 | 
						|
      break;
 | 
						|
    default :
 | 
						|
      return GRN_FALSE;
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  case GRN_VECTOR :
 | 
						|
    return GRN_TRUE;
 | 
						|
    break;
 | 
						|
  default :
 | 
						|
    return  GRN_FALSE;
 | 
						|
    break;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_builtin(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_id id;
 | 
						|
 | 
						|
  if (!obj) { return GRN_FALSE; }
 | 
						|
 | 
						|
  id = grn_obj_id(ctx, obj);
 | 
						|
  return grn_id_is_builtin(ctx, id);
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_bulk(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!obj) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return obj->header.type == GRN_BULK;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_text_family_bulk(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!grn_obj_is_bulk(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return GRN_TYPE_IS_TEXT_FAMILY(obj->header.domain);
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_table(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_bool is_table = GRN_FALSE;
 | 
						|
 | 
						|
  if (!obj) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  switch (obj->header.type) {
 | 
						|
  case GRN_TABLE_NO_KEY :
 | 
						|
  case GRN_TABLE_HASH_KEY :
 | 
						|
  case GRN_TABLE_PAT_KEY :
 | 
						|
  case GRN_TABLE_DAT_KEY :
 | 
						|
    is_table = GRN_TRUE;
 | 
						|
  default :
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  return is_table;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_column(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_bool is_column = GRN_FALSE;
 | 
						|
 | 
						|
  if (!obj) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  switch (obj->header.type) {
 | 
						|
  case GRN_COLUMN_FIX_SIZE :
 | 
						|
  case GRN_COLUMN_VAR_SIZE :
 | 
						|
  case GRN_COLUMN_INDEX :
 | 
						|
    is_column = GRN_TRUE;
 | 
						|
  default :
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  return is_column;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_scalar_column(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!grn_obj_is_column(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return (obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_SCALAR;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_vector_column(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!grn_obj_is_column(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return ((obj->header.type == GRN_COLUMN_VAR_SIZE) &&
 | 
						|
          ((obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) ==
 | 
						|
           GRN_OBJ_COLUMN_VECTOR));
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_weight_vector_column(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!grn_obj_is_vector_column(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return (obj->header.flags & GRN_OBJ_WITH_WEIGHT) == GRN_OBJ_WITH_WEIGHT;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_reference_column(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_obj *range;
 | 
						|
 | 
						|
  if (!grn_obj_is_column(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  range = grn_ctx_at(ctx, grn_obj_get_range(ctx, obj));
 | 
						|
  if (!range) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  switch (range->header.type) {
 | 
						|
  case GRN_TABLE_HASH_KEY:
 | 
						|
  case GRN_TABLE_PAT_KEY:
 | 
						|
  case GRN_TABLE_DAT_KEY:
 | 
						|
  case GRN_TABLE_NO_KEY:
 | 
						|
    return GRN_TRUE;
 | 
						|
  default:
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_data_column(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!grn_obj_is_column(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return obj->header.type == GRN_COLUMN_FIX_SIZE ||
 | 
						|
    obj->header.type == GRN_COLUMN_VAR_SIZE;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_index_column(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!grn_obj_is_column(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return obj->header.type == GRN_COLUMN_INDEX;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_accessor(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!obj) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return obj->header.type == GRN_ACCESSOR;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_key_accessor(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_accessor *accessor;
 | 
						|
 | 
						|
  if (!grn_obj_is_accessor(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  accessor = (grn_accessor *)obj;
 | 
						|
  if (accessor->next) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return accessor->action == GRN_ACCESSOR_GET_KEY;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_type(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!obj) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return obj->header.type == GRN_TYPE;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_text_family_type(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!grn_obj_is_type(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return GRN_TYPE_IS_TEXT_FAMILY(grn_obj_id(ctx, obj));
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_proc(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!obj) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return obj->header.type == GRN_PROC;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_tokenizer_proc(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_proc *proc;
 | 
						|
 | 
						|
  if (!grn_obj_is_proc(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  proc = (grn_proc *)obj;
 | 
						|
  return proc->type == GRN_PROC_TOKENIZER;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_function_proc(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_proc *proc;
 | 
						|
 | 
						|
  if (!grn_obj_is_proc(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  proc = (grn_proc *)obj;
 | 
						|
  return proc->type == GRN_PROC_FUNCTION;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_selector_proc(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_proc *proc;
 | 
						|
 | 
						|
  if (!grn_obj_is_function_proc(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  proc = (grn_proc *)obj;
 | 
						|
  return proc->callbacks.function.selector != NULL;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_selector_only_proc(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_proc *proc;
 | 
						|
 | 
						|
  if (!grn_obj_is_selector_proc(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  proc = (grn_proc *)obj;
 | 
						|
  return proc->funcs[PROC_INIT] == NULL;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_normalizer_proc(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_proc *proc;
 | 
						|
 | 
						|
  if (!grn_obj_is_proc(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  proc = (grn_proc *)obj;
 | 
						|
  return proc->type == GRN_PROC_NORMALIZER;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_token_filter_proc(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_proc *proc;
 | 
						|
 | 
						|
  if (!grn_obj_is_proc(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  proc = (grn_proc *)obj;
 | 
						|
  return proc->type == GRN_PROC_TOKEN_FILTER;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_scorer_proc(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_proc *proc;
 | 
						|
 | 
						|
  if (!grn_obj_is_proc(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  proc = (grn_proc *)obj;
 | 
						|
  return proc->type == GRN_PROC_SCORER;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_window_function_proc(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_proc *proc;
 | 
						|
 | 
						|
  if (!grn_obj_is_proc(ctx, obj)) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  proc = (grn_proc *)obj;
 | 
						|
  return proc->type == GRN_PROC_WINDOW_FUNCTION;
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_is_expr(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  if (!obj) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  return obj->header.type == GRN_EXPR;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
grn_db_reindex(grn_ctx *ctx, grn_obj *db)
 | 
						|
{
 | 
						|
  grn_table_cursor *cursor;
 | 
						|
  grn_id id;
 | 
						|
 | 
						|
  cursor = grn_table_cursor_open(ctx, db,
 | 
						|
                                 NULL, 0, NULL, 0,
 | 
						|
                                 0, -1,
 | 
						|
                                 GRN_CURSOR_BY_ID);
 | 
						|
  if (!cursor) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  while ((id = grn_table_cursor_next(ctx, cursor)) != GRN_ID_NIL) {
 | 
						|
    grn_obj *object;
 | 
						|
 | 
						|
    object = grn_ctx_at(ctx, id);
 | 
						|
    if (!object) {
 | 
						|
      ERRCLR(ctx);
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    switch (object->header.type) {
 | 
						|
    case GRN_TABLE_HASH_KEY :
 | 
						|
    case GRN_TABLE_PAT_KEY :
 | 
						|
    case GRN_TABLE_DAT_KEY :
 | 
						|
      grn_obj_reindex(ctx, object);
 | 
						|
      break;
 | 
						|
    default:
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    grn_obj_unlink(ctx, object);
 | 
						|
 | 
						|
    if (ctx->rc != GRN_SUCCESS) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  grn_table_cursor_close(ctx, cursor);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
grn_table_reindex(grn_ctx *ctx, grn_obj *table)
 | 
						|
{
 | 
						|
  grn_hash *columns;
 | 
						|
 | 
						|
  columns = grn_hash_create(ctx, NULL, sizeof(grn_id), 0,
 | 
						|
                            GRN_OBJ_TABLE_HASH_KEY | GRN_HASH_TINY);
 | 
						|
  if (!columns) {
 | 
						|
    ERR(GRN_NO_MEMORY_AVAILABLE,
 | 
						|
        "[table][reindex] failed to create a table to store columns");
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  if (grn_table_columns(ctx, table, "", 0, (grn_obj *)columns) > 0) {
 | 
						|
    grn_id *key;
 | 
						|
    GRN_HASH_EACH(ctx, columns, id, &key, NULL, NULL, {
 | 
						|
      grn_obj *column = grn_ctx_at(ctx, *key);
 | 
						|
      if (column && column->header.type == GRN_COLUMN_INDEX) {
 | 
						|
        grn_obj_reindex(ctx, column);
 | 
						|
      }
 | 
						|
    });
 | 
						|
  }
 | 
						|
  grn_hash_close(ctx, columns);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
grn_data_column_reindex(grn_ctx *ctx, grn_obj *data_column)
 | 
						|
{
 | 
						|
  grn_hook *hooks;
 | 
						|
 | 
						|
  for (hooks = DB_OBJ(data_column)->hooks[GRN_HOOK_SET];
 | 
						|
       hooks;
 | 
						|
       hooks = hooks->next) {
 | 
						|
    grn_obj_default_set_value_hook_data *data = (void *)GRN_NEXT_ADDR(hooks);
 | 
						|
    grn_obj *target = grn_ctx_at(ctx, data->target);
 | 
						|
    if (target->header.type != GRN_COLUMN_INDEX) {
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
    grn_obj_reindex(ctx, target);
 | 
						|
    if (ctx->rc != GRN_SUCCESS) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
grn_rc
 | 
						|
grn_obj_reindex(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  GRN_API_ENTER;
 | 
						|
 | 
						|
  if (!obj) {
 | 
						|
    ERR(GRN_INVALID_ARGUMENT, "[object][reindex] object must not be NULL");
 | 
						|
    GRN_API_RETURN(ctx->rc);
 | 
						|
  }
 | 
						|
 | 
						|
  switch (obj->header.type) {
 | 
						|
  case GRN_DB :
 | 
						|
    grn_db_reindex(ctx, obj);
 | 
						|
    break;
 | 
						|
  case GRN_TABLE_HASH_KEY :
 | 
						|
  case GRN_TABLE_PAT_KEY :
 | 
						|
  case GRN_TABLE_DAT_KEY :
 | 
						|
    grn_table_reindex(ctx, obj);
 | 
						|
    break;
 | 
						|
  case GRN_COLUMN_FIX_SIZE :
 | 
						|
  case GRN_COLUMN_VAR_SIZE :
 | 
						|
    grn_data_column_reindex(ctx, obj);
 | 
						|
    break;
 | 
						|
  case GRN_COLUMN_INDEX :
 | 
						|
    grn_index_column_rebuild(ctx, obj);
 | 
						|
    break;
 | 
						|
  default :
 | 
						|
    {
 | 
						|
      grn_obj type_name;
 | 
						|
      GRN_TEXT_INIT(&type_name, 0);
 | 
						|
      grn_inspect_type(ctx, &type_name, obj->header.type);
 | 
						|
      ERR(GRN_INVALID_ARGUMENT,
 | 
						|
          "[object][reindex] object must be TABLE_HASH_KEY, "
 | 
						|
          "TABLE_PAT_KEY, TABLE_DAT_KEY or COLUMN_INDEX: <%.*s>",
 | 
						|
          (int)GRN_TEXT_LEN(&type_name),
 | 
						|
          GRN_TEXT_VALUE(&type_name));
 | 
						|
      GRN_OBJ_FIN(ctx, &type_name);
 | 
						|
      GRN_API_RETURN(ctx->rc);
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  GRN_API_RETURN(ctx->rc);
 | 
						|
}
 | 
						|
 | 
						|
const char *
 | 
						|
grn_obj_type_to_string(uint8_t type)
 | 
						|
{
 | 
						|
  switch (type) {
 | 
						|
  case GRN_VOID :
 | 
						|
    return "void";
 | 
						|
  case GRN_BULK :
 | 
						|
    return "bulk";
 | 
						|
  case GRN_PTR :
 | 
						|
    return "ptr";
 | 
						|
  case GRN_UVECTOR :
 | 
						|
    return "uvector";
 | 
						|
  case GRN_PVECTOR :
 | 
						|
    return "pvector";
 | 
						|
  case GRN_VECTOR :
 | 
						|
    return "vector";
 | 
						|
  case GRN_MSG :
 | 
						|
    return "msg";
 | 
						|
  case GRN_QUERY :
 | 
						|
    return "query";
 | 
						|
  case GRN_ACCESSOR :
 | 
						|
    return "accessor";
 | 
						|
  case GRN_SNIP :
 | 
						|
    return "snip";
 | 
						|
  case GRN_PATSNIP :
 | 
						|
    return "patsnip";
 | 
						|
  case GRN_STRING :
 | 
						|
    return "string";
 | 
						|
  case GRN_CURSOR_TABLE_HASH_KEY :
 | 
						|
    return "cursor:table:hash_key";
 | 
						|
  case GRN_CURSOR_TABLE_PAT_KEY :
 | 
						|
    return "cursor:table:pat_key";
 | 
						|
  case GRN_CURSOR_TABLE_DAT_KEY :
 | 
						|
    return "cursor:table:dat_key";
 | 
						|
  case GRN_CURSOR_TABLE_NO_KEY :
 | 
						|
    return "cursor:table:no_key";
 | 
						|
  case GRN_CURSOR_COLUMN_INDEX :
 | 
						|
    return "cursor:column:index";
 | 
						|
  case GRN_CURSOR_COLUMN_GEO_INDEX :
 | 
						|
    return "cursor:column:geo_index";
 | 
						|
  case GRN_CURSOR_CONFIG :
 | 
						|
    return "cursor:config";
 | 
						|
  case GRN_TYPE :
 | 
						|
    return "type";
 | 
						|
  case GRN_PROC :
 | 
						|
    return "proc";
 | 
						|
  case GRN_EXPR :
 | 
						|
    return "expr";
 | 
						|
  case GRN_TABLE_HASH_KEY :
 | 
						|
    return "table:hash_key";
 | 
						|
  case GRN_TABLE_PAT_KEY :
 | 
						|
    return "table:pat_key";
 | 
						|
  case GRN_TABLE_DAT_KEY :
 | 
						|
    return "table:dat_key";
 | 
						|
  case GRN_TABLE_NO_KEY :
 | 
						|
    return "table:no_key";
 | 
						|
  case GRN_DB :
 | 
						|
    return "db";
 | 
						|
  case GRN_COLUMN_FIX_SIZE :
 | 
						|
    return "column:fix_size";
 | 
						|
  case GRN_COLUMN_VAR_SIZE :
 | 
						|
    return "column:var_size";
 | 
						|
  case GRN_COLUMN_INDEX :
 | 
						|
    return "column:index";
 | 
						|
  default :
 | 
						|
    return "unknown";
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
grn_bool
 | 
						|
grn_obj_name_is_column(grn_ctx *ctx, const char *name, int name_len)
 | 
						|
{
 | 
						|
  if (!name) {
 | 
						|
    return GRN_FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  if (name_len < 0) {
 | 
						|
    name_len = strlen(name);
 | 
						|
  }
 | 
						|
 | 
						|
  return memchr(name, GRN_DB_DELIMITER, name_len) != NULL;
 | 
						|
}
 | 
						|
 | 
						|
grn_io *
 | 
						|
grn_obj_get_io(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  grn_io *io = NULL;
 | 
						|
 | 
						|
  if (!obj) {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  if (obj->header.type == GRN_DB) {
 | 
						|
    obj = ((grn_db *)obj)->keys;
 | 
						|
  }
 | 
						|
 | 
						|
  switch (obj->header.type) {
 | 
						|
  case GRN_TABLE_PAT_KEY :
 | 
						|
    io = ((grn_pat *)obj)->io;
 | 
						|
    break;
 | 
						|
  case GRN_TABLE_DAT_KEY :
 | 
						|
    io = ((grn_dat *)obj)->io;
 | 
						|
    break;
 | 
						|
  case GRN_TABLE_HASH_KEY :
 | 
						|
    io = ((grn_hash *)obj)->io;
 | 
						|
    break;
 | 
						|
  case GRN_TABLE_NO_KEY :
 | 
						|
    io = ((grn_array *)obj)->io;
 | 
						|
    break;
 | 
						|
  case GRN_COLUMN_VAR_SIZE :
 | 
						|
    io = ((grn_ja *)obj)->io;
 | 
						|
    break;
 | 
						|
  case GRN_COLUMN_FIX_SIZE :
 | 
						|
    io = ((grn_ra *)obj)->io;
 | 
						|
    break;
 | 
						|
  case GRN_COLUMN_INDEX :
 | 
						|
    io = ((grn_ii *)obj)->seg;
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  return io;
 | 
						|
}
 | 
						|
 | 
						|
size_t
 | 
						|
grn_obj_get_disk_usage(grn_ctx *ctx, grn_obj *obj)
 | 
						|
{
 | 
						|
  size_t usage = 0;
 | 
						|
 | 
						|
  GRN_API_ENTER;
 | 
						|
 | 
						|
  if (!obj) {
 | 
						|
    ERR(GRN_INVALID_ARGUMENT, "[object][disk-usage] object must not be NULL");
 | 
						|
    GRN_API_RETURN(0);
 | 
						|
  }
 | 
						|
 | 
						|
  switch (obj->header.type) {
 | 
						|
  case GRN_DB :
 | 
						|
    {
 | 
						|
      grn_db *db = (grn_db *)obj;
 | 
						|
      usage = grn_obj_get_disk_usage(ctx, db->keys);
 | 
						|
      if (db->specs) {
 | 
						|
        usage += grn_obj_get_disk_usage(ctx, (grn_obj *)(db->specs));
 | 
						|
      }
 | 
						|
      usage += grn_obj_get_disk_usage(ctx, (grn_obj *)(db->config));
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  case GRN_TABLE_DAT_KEY :
 | 
						|
    usage = grn_dat_get_disk_usage(ctx, (grn_dat *)obj);
 | 
						|
    break;
 | 
						|
  case GRN_COLUMN_INDEX :
 | 
						|
    usage = grn_ii_get_disk_usage(ctx, (grn_ii *)obj);
 | 
						|
    break;
 | 
						|
  default :
 | 
						|
    {
 | 
						|
      grn_io *io;
 | 
						|
      io = grn_obj_get_io(ctx, obj);
 | 
						|
      if (io) {
 | 
						|
        usage = grn_io_get_disk_usage(ctx, io);
 | 
						|
      }
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  GRN_API_RETURN(usage);
 | 
						|
}
 |