grn_ra * grn_ra_open(grn_ctx *ctx, const char *path) { grn_io *io; int n_elm, w_elm; grn_ra *ra = NULL; struct grn_ra_header *header; io = grn_io_open(ctx, path, grn_io_auto); if (!io) { return NULL; } header = grn_io_header(io); if (grn_io_get_type(io) != GRN_COLUMN_FIX_SIZE) { ERR(GRN_INVALID_FORMAT, "file type unmatch"); grn_io_close(ctx, io); return NULL; } if (!(ra = GRN_GMALLOC(sizeof(grn_ra)))) { grn_io_close(ctx, io); return NULL; } n_elm = GRN_RA_SEGMENT_SIZE / header->element_size; for (w_elm = 22; (1 << w_elm) > n_elm; w_elm--); GRN_DB_OBJ_SET_TYPE(ra, GRN_COLUMN_FIX_SIZE); ra->io = io; ra->header = header; ra->element_mask = n_elm - 1; ra->element_width = w_elm; return ra; }
grn_obj * grn_type_create(grn_ctx *ctx, const char *name, unsigned int name_size, grn_obj_flags flags, unsigned int size) { grn_id id; struct _grn_type *res = NULL; grn_obj *db; if (!ctx || !ctx->impl || !(db = ctx->impl->db)) { ERR(GRN_INVALID_ARGUMENT, "db not initialized"); return NULL; } GRN_API_ENTER; if (grn_db_check_name(ctx, name, name_size)) { GRN_DB_CHECK_NAME_ERR("[type][create]", name, name_size); GRN_API_RETURN(NULL); } if (!GRN_DB_P(db)) { ERR(GRN_INVALID_ARGUMENT, "invalid db assigned"); GRN_API_RETURN(NULL); } id = grn_obj_register(ctx, db, name, name_size); if (id && (res = GRN_MALLOC(sizeof(grn_db_obj)))) { GRN_DB_OBJ_SET_TYPE(res, GRN_TYPE); res->obj.header.flags = flags; res->obj.header.domain = GRN_ID_NIL; GRN_TYPE_SIZE(&res->obj) = size; if (grn_db_obj_init(ctx, db, id, DB_OBJ(res))) { // grn_obj_delete(ctx, db, id); GRN_FREE(res); GRN_API_RETURN(NULL); } } GRN_API_RETURN((grn_obj *)res); }
grn_ja * grn_ja_create(grn_ctx *ctx, const char *path, unsigned int max_element_size, uint32_t flags) { int i; grn_io *io; grn_ja *ja = NULL; struct grn_ja_header *header; io = grn_io_create(ctx, path, sizeof(struct grn_ja_header), JA_SEGMENT_SIZE, JA_N_DSEGMENTS, grn_io_auto, GRN_IO_EXPIRE_SEGMENT); if (!io) { return NULL; } grn_io_set_type(io, GRN_COLUMN_VAR_SIZE); header = grn_io_header(io); header->curr_pos = JA_SEGMENT_SIZE; header->flags = flags; for (i = 0; i < JA_N_ESEGMENTS; i++) { header->esegs[i] = JA_ESEG_VOID; } if (!(ja = GRN_GMALLOC(sizeof(grn_ja)))) { grn_io_close(ctx, io); return NULL; } GRN_DB_OBJ_SET_TYPE(ja, GRN_COLUMN_VAR_SIZE); ja->io = io; ja->header = header; header->max_element_size = max_element_size; SEGMENTS_EINFO_ON(ja, 0, 0); header->esegs[0] = 0; return ja; }
grn_ra * grn_ra_create(grn_ctx *ctx, const char *path, unsigned int element_size) { grn_io *io; int max_segments, n_elm, w_elm; grn_ra *ra = NULL; struct grn_ra_header *header; unsigned actual_size; if (element_size > GRN_RA_SEGMENT_SIZE) { GRN_LOG(ctx, GRN_LOG_ERROR, "element_size too large (%d)", element_size); return NULL; } for (actual_size = 1; actual_size < element_size; actual_size *= 2) ; max_segments = ((GRN_ID_MAX + 1) / GRN_RA_SEGMENT_SIZE) * actual_size; io = grn_io_create(ctx, path, sizeof(struct grn_ra_header), GRN_RA_SEGMENT_SIZE, max_segments, grn_io_auto, GRN_IO_EXPIRE_SEGMENT); if (!io) { return NULL; } header = grn_io_header(io); grn_io_set_type(io, GRN_COLUMN_FIX_SIZE); header->element_size = actual_size; if (!(ra = GRN_GMALLOC(sizeof(grn_ra)))) { grn_io_close(ctx, io); return NULL; } n_elm = GRN_RA_SEGMENT_SIZE / header->element_size; for (w_elm = 22; (1 << w_elm) > n_elm; w_elm--); GRN_DB_OBJ_SET_TYPE(ra, GRN_COLUMN_FIX_SIZE); ra->io = io; ra->header = header; ra->element_mask = n_elm - 1; ra->element_width = w_elm; return ra; }
grn_ra * grn_ra_create(grn_ctx *ctx, const char *path, unsigned int element_size) { grn_ra *ra = NULL; if (!(ra = GRN_GMALLOC(sizeof(grn_ra)))) { return NULL; } GRN_DB_OBJ_SET_TYPE(ra, GRN_COLUMN_FIX_SIZE); if (!_grn_ra_create(ctx, ra, path, element_size)) { GRN_FREE(ra); return NULL; } return ra; }
grn_ja * grn_ja_create(grn_ctx *ctx, const char *path, unsigned int max_element_size, uint32_t flags) { grn_ja *ja = NULL; if (!(ja = GRN_GMALLOC(sizeof(grn_ja)))) { return NULL; } GRN_DB_OBJ_SET_TYPE(ja, GRN_COLUMN_VAR_SIZE); if (!_grn_ja_create(ctx, ja, path, max_element_size, flags)) { GRN_FREE(ja); return NULL; } return ja; }
grn_ja * grn_ja_open(grn_ctx *ctx, const char *path) { grn_io *io; grn_ja *ja = NULL; struct grn_ja_header *header; io = grn_io_open(ctx, path, grn_io_auto); if (!io) { return NULL; } header = grn_io_header(io); if (grn_io_get_type(io) != GRN_COLUMN_VAR_SIZE) { ERR(GRN_INVALID_FORMAT, "file type unmatch"); grn_io_close(ctx, io); return NULL; } if (!(ja = GRN_GMALLOC(sizeof(grn_ja)))) { grn_io_close(ctx, io); return NULL; } GRN_DB_OBJ_SET_TYPE(ja, GRN_COLUMN_VAR_SIZE); ja->io = io; ja->header = header; return ja; }
grn_snip * grn_snip_open(grn_ctx *ctx, int flags, unsigned int width, unsigned int max_results, const char *defaultopentag, unsigned int defaultopentag_len, const char *defaultclosetag, unsigned int defaultclosetag_len, grn_snip_mapping *mapping) { int copy_tag; grn_snip *ret = NULL; if (!(ret = GRN_MALLOC(sizeof(grn_snip)))) { GRN_LOG(ctx, GRN_LOG_ALERT, "grn_snip allocation failed on grn_snip_open"); return NULL; } if (max_results > MAX_SNIP_RESULT_COUNT || max_results == 0) { GRN_LOG(ctx, GRN_LOG_WARNING, "max_results is invalid on grn_snip_open"); GRN_FREE(ret); return NULL; } GRN_API_ENTER; ret->encoding = ctx->encoding; ret->flags = flags; ret->width = width; ret->max_results = max_results; ret->defaultopentag = NULL; ret->defaultclosetag = NULL; copy_tag = flags & GRN_SNIP_COPY_TAG; if (grn_snip_set_default_tag(ctx, &(ret->defaultopentag), &(ret->defaultopentag_len), defaultopentag, defaultopentag_len, copy_tag)) { GRN_FREE(ret); GRN_API_RETURN(NULL); } if (grn_snip_set_default_tag(ctx, &(ret->defaultclosetag), &(ret->defaultclosetag_len), defaultclosetag, defaultclosetag_len, copy_tag)) { if (copy_tag && ret->defaultopentag) { GRN_FREE((void *)ret->defaultopentag); } GRN_FREE(ret); GRN_API_RETURN(NULL); } ret->cond_len = 0; ret->mapping = mapping; ret->nstr = NULL; ret->tag_count = 0; ret->snip_count = 0; if (ret->flags & GRN_SNIP_NORMALIZE) { ret->normalizer = GRN_NORMALIZER_AUTO; } else { ret->normalizer = NULL; } GRN_DB_OBJ_SET_TYPE(ret, GRN_SNIP); { grn_obj *db; grn_id id; db = grn_ctx_db(ctx); id = grn_obj_register(ctx, db, NULL, 0); DB_OBJ(ret)->header.domain = GRN_ID_NIL; DB_OBJ(ret)->range = GRN_ID_NIL; grn_db_obj_init(ctx, db, id, DB_OBJ(ret)); } GRN_API_RETURN(ret); }