grn_rc grn_ja_truncate(grn_ctx *ctx, grn_ja *ja) { grn_rc rc; char *path; unsigned int max_element_size; uint32_t flags; if ((path = (char *)grn_io_path(ja->io)) && *path != '\0') { if (!(path = GRN_STRDUP(path))) { ERR(GRN_NO_MEMORY_AVAILABLE, "cannot duplicate path."); return GRN_NO_MEMORY_AVAILABLE; } } else { path = NULL; } max_element_size = ja->header->max_element_size; flags = ja->header->flags; if ((rc = grn_io_close(ctx, ja->io))) { goto exit; } ja->io = NULL; if (path && (rc = grn_io_remove(ctx, path))) { goto exit; } if (!_grn_ja_create(ctx, ja, path, max_element_size, flags)) { rc = GRN_UNKNOWN_ERROR; } exit: if (path) { GRN_FREE(path); } return rc; }
grn_rc grn_dat_truncate(grn_ctx *ctx, grn_dat *dat) { if (!grn_dat_open_trie_if_needed(ctx, dat)) { return ctx->rc; } const grn::dat::Trie * const trie = static_cast<const grn::dat::Trie *>(dat->trie); if (!trie || !trie->max_key_id()) { return GRN_SUCCESS; } char trie_path[PATH_MAX]; grn_dat_generate_trie_path(grn_io_path(dat->io), trie_path, dat->header->file_id + 1); try { grn::dat::Trie().create(trie_path); } catch (const grn::dat::Exception &ex) { const grn_rc error_code = grn_dat_translate_error_code(ex.code()); ERR(error_code, "grn::dat::Trie::create failed"); return error_code; } ++dat->header->file_id; if (!grn_dat_open_trie_if_needed(ctx, dat)) { return ctx->rc; } return GRN_SUCCESS; }
grn_rc grn_ra_truncate(grn_ctx *ctx, grn_ra *ra) { grn_rc rc; char *path; unsigned int element_size; if ((path = (char *)grn_io_path(ra->io)) && *path != '\0') { if (!(path = GRN_STRDUP(path))) { ERR(GRN_NO_MEMORY_AVAILABLE, "cannot duplicate path."); return GRN_NO_MEMORY_AVAILABLE; } } else { path = NULL; } element_size = ra->header->element_size; if ((rc = grn_io_close(ctx, ra->io))) { goto exit; } ra->io = NULL; if (path && (rc = grn_io_remove(ctx, path))) { goto exit; } if (!_grn_ra_create(ctx, ra, path, element_size)) { rc = GRN_UNKNOWN_ERROR; } exit: if (path) { GRN_FREE(path); } return rc; }
grn_id grn_dat_add(grn_ctx *ctx, grn_dat *dat, const void *key, unsigned int key_size, void **, int *added) { if (!key_size) { return GRN_ID_NIL; } else if (!grn_dat_open_trie_if_needed(ctx, dat)) { return GRN_ID_NIL; } if (!dat->trie) { char trie_path[PATH_MAX]; grn_dat_generate_trie_path(grn_io_path(dat->io), trie_path, 1); grn::dat::Trie * const new_trie = new (std::nothrow) grn::dat::Trie; if (!new_trie) { MERR("new grn::dat::Trie failed"); return GRN_ID_NIL; } try { new_trie->create(trie_path); } catch (const grn::dat::Exception &ex) { ERR(grn_dat_translate_error_code(ex.code()), "grn::dat::Trie::create failed"); delete new_trie; return GRN_ID_NIL; } dat->trie = new_trie; dat->file_id = dat->header->file_id = 1; } grn::dat::Trie * const trie = static_cast<grn::dat::Trie *>(dat->trie); try { grn::dat::UInt32 key_pos; const bool res = trie->insert(key, key_size, &key_pos); if (added) { *added = res ? 1 : 0; } return trie->get_key(key_pos).id(); } catch (const grn::dat::SizeError &ex) { if (!grn_dat_rebuild_trie(ctx, dat)) { return GRN_ID_NIL; } grn::dat::Trie * const new_trie = static_cast<grn::dat::Trie *>(dat->trie); grn::dat::UInt32 key_pos; const bool res = new_trie->insert(key, key_size, &key_pos); if (added) { *added = res ? 1 : 0; } return new_trie->get_key(key_pos).id(); } catch (const grn::dat::Exception &ex) { ERR(grn_dat_translate_error_code(ex.code()), "grn::dat::Trie::insert failed"); return GRN_ID_NIL; } }