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_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; }