35 #define NEXT_ADDR(p) (((byte *)(p)) + sizeof(*(p)))
37 #define GRN_TABLE_GROUPED (0x01<<0)
38 #define GRN_TABLE_IS_GROUPED(table)\
39 ((table)->header.impl_flags & GRN_TABLE_GROUPED)
40 #define GRN_TABLE_GROUPED_ON(table)\
41 ((table)->header.impl_flags |= GRN_TABLE_GROUPED)
43 #define WITH_NORMALIZE(table,key,key_size,block) do {\
44 if ((table)->normalizer && key && key_size > 0) {\
46 if ((nstr = grn_string_open(ctx, key, key_size,\
47 (table)->normalizer, 0))) {\
49 unsigned int key_size;\
50 grn_string_get_normalized(ctx, nstr, &key, &key_size, NULL);\
52 grn_obj_close(ctx, nstr);\
59 #define REPORT_CAST_ERROR(column, range, element) do {\
61 char column_name[GRN_TABLE_MAX_KEY_SIZE];\
62 int column_name_size;\
63 char range_name[GRN_TABLE_MAX_KEY_SIZE];\
65 GRN_TEXT_INIT(&inspected, 0);\
66 grn_inspect(ctx, &inspected, element);\
67 column_name_size = grn_obj_name(ctx, column, column_name,\
68 GRN_TABLE_MAX_KEY_SIZE);\
69 range_name_size = grn_obj_name(ctx, range, range_name,\
70 GRN_TABLE_MAX_KEY_SIZE);\
71 ERR(GRN_INVALID_ARGUMENT, "<%.*s>: failed to cast to <%.*s>: <%.*s>",\
72 column_name_size, column_name,\
73 range_name_size, range_name,\
74 (int)GRN_TEXT_LEN(&inspected), GRN_TEXT_VALUE(&inspected));\
75 GRN_OBJ_FIN(ctx, &inspected);\
79 grn_table_add_v_inline(
grn_ctx *ctx,
grn_obj *table,
const void *key,
int key_size,
80 void **value,
int *added);
93 gen_pathname(
const char *path,
char *
buffer,
int fno)
95 size_t len = strlen(path);
96 memcpy(buffer, path, len);
100 buffer[len + 8] =
'\0';
107 is_text_object(
grn_obj *
object)
130 unsigned int original_size = 0;
137 if (original_size > max_size && is_text_object(
object)) {
158 if (!path || strlen(path) <=
PATH_MAX - 14) {
162 if (getenv(
"GRN_DB_KEY")) {
163 if (!strcmp(getenv(
"GRN_DB_KEY"),
"pat")) {
166 }
else if (!strcmp(getenv(
"GRN_DB_KEY"),
"dat")) {
177 if (use_pat_as_db_keys) {
185 CRITICAL_SECTION_INIT(s->
lock);
193 gen_pathname(path, specs_path, 0);
200 "failed to create specs: <%s>", specs_path);
208 if (use_pat_as_db_keys) {
233 if (path && strlen(path) <=
PATH_MAX - 14) {
253 gen_pathname(path, specs_path, 0);
255 CRITICAL_SECTION_INIT(s->
lock);
262 #ifdef GRN_WITH_MECAB
318 ctx_used_db = ctx->
impl && ctx->
impl->
db == db;
339 CRITICAL_SECTION_FIN(a->
lock);
351 CRITICAL_SECTION_FIN(s->
lock);
371 if (!ctx || !ctx->
impl || !(db = ctx->
impl->
db)) {
378 name_size = strlen(name);
390 return (ctx && ctx->
impl) ? ctx->
impl->
db : NULL;
425 io = ((
grn_ii *)obj)->seg;
446 #define IS_TEMP(obj) (DB_OBJ(obj)->id & GRN_OBJ_TMP_OBJECT)
480 const char *name_end = name + name_size;
485 while (name < name_end) {
487 if ((
unsigned int)((c | 0x20) -
'a') >= 26u &&
488 (
unsigned int)(c -
'0') >= 10u &&
495 if (!(len =
grn_charlen(ctx, name, name_end))) {
break; }
501 #define GRN_TYPE_SIZE(type) ((type)->range)
510 if (!ctx || !ctx->
impl || !(db = ctx->
impl->
db)) {
562 if (!ctx || !ctx->
impl || !(db = ctx->
impl->
db)) {
571 name_size = strlen(name);
581 if (name && name_size) {
642 calc_rec_size(
grn_obj_flags flags, uint32_t max_n_subrecs, uint32_t range_size,
643 uint8_t *subrec_size, uint8_t *subrec_offset,
644 uint32_t *key_size, uint32_t *value_size)
653 *subrec_offset =
sizeof(
grn_id);
654 *subrec_size =
sizeof(uint32_t);
657 *subrec_offset =
sizeof(
grn_id);
658 *subrec_size =
sizeof(uint32_t) +
sizeof(uint32_t);
661 *key_size +=
sizeof(uint32_t);
664 *key_size +=
sizeof(uint32_t);
665 *subrec_offset =
sizeof(
grn_id) +
sizeof(uint32_t);
666 *subrec_size =
sizeof(uint32_t);
669 *key_size +=
sizeof(uint32_t) +
sizeof(uint32_t);
672 *subrec_size = range_size;
675 *subrec_size = range_size +
sizeof(uint32_t);
678 *subrec_size = range_size +
sizeof(uint32_t) +
sizeof(uint32_t);
682 *subrec_size, max_n_subrecs);
684 *value_size = range_size;
691 grn_table_create_validate(
grn_ctx *ctx,
const char *name,
unsigned int name_size,
700 "key with SIS isn't available for hash table: <%.*s>",
716 "key isn't available for no key table: <%.*s> (%.*s)",
717 name_size, name, key_name_size, key_name);
718 }
else if (flags & GRN_OBJ_KEY_WITH_SIS) {
721 "key with SIS isn't available for no key table: <%.*s>",
726 "key normalization isn't available for no key table: <%.*s>",
735 grn_table_create_with_max_n_subrecs(
grn_ctx *ctx,
const char *name,
736 unsigned int name_size,
const char *path,
738 grn_obj *value_type, uint32_t max_n_subrecs)
742 uint32_t key_size, value_size = 0, range_size = 0;
743 uint8_t subrec_size, subrec_offset;
759 if (grn_table_create_validate(ctx, name, name_size, path, flags,
760 key_type, value_type)) {
764 domain =
DB_OBJ(key_type)->id;
777 "[table][create] key size too big: <%.*s> <%.*s>(%u) (max:%u)",
779 type_name_size, type_name,
789 key_size =
sizeof(
grn_id);
798 "[table][create] key type must be type or table: <%.*s> (%.*s)",
799 name_size, name, key_name_size, key_name);
808 range =
DB_OBJ(value_type)->id;
816 type_name_size =
grn_obj_name(ctx, value_type, type_name,
819 "[table][create] value type must be fixed size: <%.*s> (%.*s)",
820 name_size, name, type_name_size, type_name);
830 range_size =
sizeof(
grn_id);
836 value_name_size =
grn_obj_name(ctx, value_type, value_name,
839 "[table][create] value type must be type or table: <%.*s> (%.*s)",
840 name_size, name, value_name_size, value_name);
853 gen_pathname(grn_obj_io(db)->path, buffer,
id);
872 calc_rec_size(flags, max_n_subrecs, range_size, &subrec_size,
873 &subrec_offset, &key_size, &value_size);
874 switch (flags & GRN_OBJ_TABLE_TYPE_MASK) {
890 DB_OBJ(res)->header.impl_flags = 0;
891 DB_OBJ(res)->header.domain = domain;
892 DB_OBJ(res)->range = range;
893 DB_OBJ(res)->max_n_subrecs = max_n_subrecs;
894 DB_OBJ(res)->subrec_size = subrec_size;
895 DB_OBJ(res)->subrec_offset = subrec_offset;
897 _grn_obj_remove(ctx, res);
913 res = grn_table_create_with_max_n_subrecs(ctx, name, name_size, path,
914 flags, key_type, value_type, 0);
920 unsigned int name_size,
const char *path,
922 unsigned int max_n_subrecs)
929 res = grn_table_create_with_max_n_subrecs(ctx, name, name_size, path,
933 key_type, value_type, max_n_subrecs);
940 grn_id *subrecbuf,
int *scorebuf,
int buf_size)
942 unsigned int count = 0;
947 uint32_t subrec_size =
DB_OBJ(table)->subrec_size;
948 uint32_t max_n_subrecs =
DB_OBJ(table)->max_n_subrecs;
949 if (subrec_size <
sizeof(
grn_id)) {
goto exit; }
950 if (!max_n_subrecs) {
goto exit; }
956 if (limit > buf_size) {
959 if (limit > n_subrecs) {
962 if (limit > max_n_subrecs) {
963 limit = max_n_subrecs;
965 for (; count < limit; count++) {
967 scorebuf[count] = *((
int *)psubrec);
971 subrecbuf[count] = *((
grn_id *)psubrec);
973 psubrec += subrec_size;
997 if (path && (!path2 || strcmp(path, path2))) {
1098 section, oldvalue, newvalue, NULL);
1121 id =
grn_pat_add(ctx, pat, key, key_size, NULL, &added_);
1125 id =
grn_pat_add(ctx, pat, key, key_size, NULL, &added_);
1128 if (added) { *added = added_; }
1139 id =
grn_dat_add(ctx, dat, key, key_size, NULL, &added_);
1143 id =
grn_dat_add(ctx, dat, key, key_size, NULL, &added_);
1146 if (added) { *added = added_; }
1157 id =
grn_hash_add(ctx, hash, key, key_size, NULL, &added_);
1161 id =
grn_hash_add(ctx, hash, key, key_size, NULL, &added_);
1164 if (added) { *added = added_; }
1180 added_ =
id ? 1 : 0;
1181 if (added) { *added = added_; }
1189 grn_obj id_, flags_, oldvalue_, value_;
1208 default_set_value_hook(ctx, 1, &table, &pctx.
user_data);
1210 if (ctx->
rc) {
break; }
1211 hooks = hooks->
next;
1231 ERR(rc,
"cast failed");
1251 ERR(rc,
"cast failed");
1323 grn_table_add_v_inline(
grn_ctx *ctx,
grn_obj *table,
const void *key,
int key_size,
1324 void **value,
int *added)
1327 if (!key || !key_size) {
return GRN_ID_NIL; }
1347 if (added) { *added =
id ? 1 : 0; }
1356 void **value,
int *added) {
1359 id = grn_table_add_v_inline(ctx, table, key, key_size, value, added);
1476 call_delete_hook(
grn_ctx *ctx,
grn_obj *table,
grn_id rid,
const void *key,
unsigned int key_size)
1482 grn_obj id_, flags_, oldvalue_, value_;
1501 default_set_value_hook(ctx, 1, &table, &pctx.
user_data);
1503 if (ctx->
rc) {
break; }
1504 hooks = hooks->
next;
1522 if (col) { grn_obj_clear_value(ctx, col, rid); }
1538 unsigned int i, n_ids;
1550 for (i = 0; i < n_ids; i++) {
1571 grn_obj_clear_value(ctx, source, posting->
rid);
1583 for (i = 0; i < n_ids; i++) {
1585 if (reference_id ==
id) {
1591 unsigned int i, n_elements;
1594 for (i = 0; i < n_elements; i++) {
1595 const char *content;
1596 unsigned int content_length;
1597 unsigned int weight;
1601 &content, &weight, &domain);
1602 if (
grn_table_get(ctx, table, content, content_length) ==
id) {
1618 grn_obj_clear_value(ctx, source, posting->
rid);
1631 for (i = 0; i < n_sources; i++) {
1659 delete_reference_records_in_index(ctx, table,
id, col);
1678 if (key && key_size) { rid =
grn_table_get(ctx, table, key, key_size); }
1680 rc = delete_reference_records(ctx, table, rid);
1684 call_delete_hook(ctx, table, rid, key, key_size);
1685 clear_column_values(ctx, table, rid);
1744 unsigned int key_size;
1746 rc = delete_reference_records(ctx, table,
id);
1751 call_delete_hook(ctx, table,
id, key, key_size);
1769 clear_column_values(ctx, table,
id);
1906 if (flags) { *flags = ((
grn_pat *)table)->obj.header.flags; }
1907 if (encoding) { *encoding = ((
grn_pat *)table)->encoding; }
1908 if (tokenizer) { *tokenizer = ((
grn_pat *)table)->tokenizer; }
1909 if (normalizer) { *normalizer = ((
grn_pat *)table)->normalizer; }
1913 if (flags) { *flags = ((
grn_dat *)table)->obj.header.flags; }
1914 if (encoding) { *encoding = ((
grn_dat *)table)->encoding; }
1915 if (tokenizer) { *tokenizer = ((
grn_dat *)table)->tokenizer; }
1916 if (normalizer) { *normalizer = ((
grn_dat *)table)->normalizer; }
1920 if (flags) { *flags = ((
grn_hash *)table)->obj.header.flags; }
1921 if (encoding) { *encoding = ((
grn_hash *)table)->encoding; }
1922 if (tokenizer) { *tokenizer = ((
grn_hash *)table)->tokenizer; }
1923 if (normalizer) { *normalizer = ((
grn_hash *)table)->normalizer; }
1927 if (flags) { *flags = 0; }
1930 if (normalizer) { *normalizer = NULL; }
1971 subrecs_push(
byte *subrecs,
int size,
int n_subrecs,
int score,
void *body,
int dir)
1975 int n = n_subrecs - 1, n2;
1984 *((
int *)v) = score;
1989 subrecs_replace_min(
byte *subrecs,
int size,
int n_subrecs,
int score,
void *body,
int dir)
1992 int n = 0, n1, n2, *c1, *c2;
2026 if (
DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) {
2027 int limit =
DB_OBJ(table)->max_n_subrecs;
2031 int subrec_size =
DB_OBJ(table)->subrec_size;
2035 if (limit < n_subrecs) {
2037 subrecs_replace_min((
byte *)ri->
subrecs, subrec_size, limit, score, body, dir);
2040 subrecs_push((
byte *)ri->
subrecs, subrec_size, n_subrecs, score, body, dir);
2051 grn_table_add_subrec_inline(table, ri, score, pi, dir);
2056 const void *min,
unsigned int min_size,
2057 const void *max,
unsigned int max_size,
2058 int offset,
int limit,
int flags)
2062 unsigned int table_size;
2063 if (!table) {
return tc; }
2069 "can't use negative offset with GRN_CURSOR_PREFIX: %d", offset);
2070 }
else if (offset != 0 && offset >= table_size) {
2072 "offset is rather than table size: offset:%d, table_size:%d",
2073 offset, table_size);
2077 "can't use small limit rather than -1 with GRN_CURSOR_PREFIX: %d",
2079 }
else if (limit == -1) {
2086 ERR(rc,
"grn_normalize_offset_and_limit failed");
2101 offset, limit, flags);
2116 offset, limit, flags);
2131 offset, limit, flags);
2140 offset, limit, flags);
2163 NULL, 0, NULL, 0, 0, -1, flags);
2167 NULL, 0, NULL, 0, 0, -1, flags);
2171 NULL, 0, NULL, 0, 0, -1, flags);
2175 min, max, 0, -1, flags);
2192 if (
DB_OBJ(tc)->finalizer) {
2195 if (
DB_OBJ(tc)->source) {
2250 if (ip) {
id = ip->
rid; }
2263 id = grn_table_cursor_next_inline(ctx, tc);
2327 len = grn_table_cursor_get_value_inline(ctx, tc, value);
2333 const void *value,
int flags)
2473 while ((ic->
tid = grn_table_cursor_next_inline(ctx, ic->
tc))) {
2489 if (tid) { *tid = ic->
tid; }
2531 const char *sp = key;
2532 const char *se = sp + key_size;
2533 for (; sp < se; sp += len) {
2545 ERR(rc,
"invalid mode %d", mode);
2584 const char *sp = key;
2585 const char *se = sp + key_size;
2586 for (; sp < se; sp += len) {
2598 ERR(rc,
"invalid mode %d", mode);
2650 grn_obj *current_res = base_res;
2655 if (deep == n_accessors) {
2662 for (i = n_accessors; i > 0; i--) {
2679 next_optarg = *optarg;
2692 if (current_res != base_res) {
2704 (
const char *)tid,
sizeof(
grn_id),
2721 if (current_res != base_res) {
2728 current_res = next_res;
2736 if (current_res != base_res) {
2770 index_op = optarg->
mode;
2777 if (n_accessors == 1) {
2837 unsigned int key_len;
2885 rc = grn_obj_search_accessor(ctx, obj, query, res, op, optarg);
2895 if (!key || !key_size) {
2902 rc = grn_obj_search_column_index(ctx, obj, query, res, op, optarg);
2909 #define GRN_TABLE_GROUP_BY_KEY 0
2910 #define GRN_TABLE_GROUP_BY_VALUE 1
2911 #define GRN_TABLE_GROUP_BY_COLUMN_VALUE 2
2913 #define GRN_TABLE_GROUP_FILTER_PREFIX 0
2914 #define GRN_TABLE_GROUP_FILTER_SUFFIX (1L<<2)
2933 unsigned int element_size = (ra)->
header->element_size;
2936 while ((
id = grn_table_cursor_next_inline(ctx, tc))) {
2941 if (
DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) {
2942 grn_table_cursor_get_value_inline(ctx, tc, (
void **)&ri);
2946 if (idp && *((
grn_id *)v) &&
2950 if ((!idp || *((
grn_id *)v)) &&
2951 grn_table_add_v_inline(ctx, res, v, element_size, &value, NULL)) {
2952 grn_table_add_subrec_inline(res, value, ri ? ri->
score : 0,
2963 while ((
id = grn_table_cursor_next_inline(ctx, tc))) {
2965 unsigned int len = 0;
2971 grn_table_cursor_get_value_inline(ctx, tc, (
void **)&ri);
2974 if ((v =
grn_ja_ref(ctx, ja, *id_, &jw, &len))) {
2977 grn_table_add_v_inline(ctx, res, v,
sizeof(
grn_id), &value, NULL)) {
2978 grn_table_add_subrec_inline(res, value, ri ? ri->
score : 0,
3005 grn_obj *res, uint32_t range_gap)
3023 unsigned int element_size = (ra)->
header->element_size;
3026 while ((
id = grn_table_cursor_next_inline(ctx, tc))) {
3031 if (
DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) {
3032 grn_table_cursor_get_value_inline(ctx, tc, (
void **)&ri);
3036 if (idp && *((
grn_id *)v) &&
3040 if ((!idp || *((
grn_id *)v))) {
3042 if (element_size ==
sizeof(uint32_t)) {
3043 uint32_t quantized = (*(uint32_t *)v);
3044 quantized -= quantized % range_gap;
3045 id = grn_table_add_v_inline(ctx, res, &quantized,
3046 element_size, &value, NULL);
3048 id = grn_table_add_v_inline(ctx, res, v,
3049 element_size, &value, NULL);
3052 grn_table_add_subrec_inline(res, value,
3065 while ((
id = grn_table_cursor_next_inline(ctx, tc))) {
3067 unsigned int len = 0;
3073 grn_table_cursor_get_value_inline(ctx, tc, (
void **)&ri);
3076 if ((v =
grn_ja_ref(ctx, ja, *id_, &jw, &len))) {
3079 grn_table_add_v_inline(ctx, res, v,
sizeof(
grn_id), &value, NULL)) {
3080 grn_table_add_subrec_inline(res, value, ri ? ri->
score : 0,
3111 if (!table || !n_keys || !n_results) {
3123 for (k = 0, kp = keys; k < n_keys; k++, kp++) {
3129 for (r = 0, rp = results; r < n_results; r++, rp++) {
3136 if (n_keys == 1 && n_results == 1) {
3137 if (!accelerated_table_group(ctx, table, keys->
key, results->
table)) {
3142 while ((
id = grn_table_cursor_next_inline(ctx, tc))) {
3146 if (
DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) {
3147 grn_table_cursor_get_value_inline(ctx, tc, (
void **)&ri);
3158 grn_table_add_v_inline(ctx, results->
table, v,
sizeof(
grn_id), &value, NULL)) {
3159 grn_table_add_subrec_inline(results->
table, value, ri ? ri->
score : 0,
3173 grn_table_add_v_inline(ctx, results->
table,
3175 grn_table_add_subrec_inline(results->
table, value, ri ? ri->
score : 0,
3191 while ((
id = grn_table_cursor_next_inline(ctx, tc))) {
3194 if (
DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) {
3195 grn_table_cursor_get_value_inline(ctx, tc, (
void **)&ri);
3197 for (k = 0, kp = keys; k < n_keys; k++, kp++) {
3201 for (r = 0, rp = results; r < n_results; r++, rp++) {
3204 int end = rp->
key_end >= n_keys
3209 if (grn_table_add_v_inline(ctx, rp->
table, key, end - begin, &value, NULL)) {
3210 grn_table_add_subrec_inline(rp->
table, value, ri ? ri->
score : 0,
3219 for (r = 0, rp = results; r < n_results; r++, rp++) {
3232 void *key = NULL, *value1 = NULL, *value2 = NULL;
3233 uint32_t value_size = 0;
3234 uint32_t key_size = 0;
3236 if (table1 != res) {
3237 if (table2 == res) {
3249 value_size = ((
grn_hash *)table1)->value_size;
3252 value_size = ((
grn_pat *)table1)->value_size;
3258 value_size = ((
grn_array *)table1)->value_size;
3263 if (value_size < ((
grn_hash *)table2)->value_size) {
3264 value_size = ((
grn_hash *)table2)->value_size;
3268 if (value_size < ((
grn_pat *)table2)->value_size) {
3269 value_size = ((
grn_pat *)table2)->value_size;
3276 if (value_size < ((
grn_array *)table2)->value_size) {
3277 value_size = ((
grn_array *)table2)->value_size;
3285 GRN_TABLE_EACH(ctx, table2, 0, 0,
id, &key, &key_size, &value2, {
3286 if (grn_table_add_v_inline(ctx, table1, key, key_size, &value1, &added)) {
3288 memcpy(value1, value2, value_size);
3292 grn_table_add_subrec_inline(table1, ri1, ri2->
score, NULL, 0);
3297 GRN_TABLE_EACH(ctx, table2, 0, 0,
id, &key, &key_size, &value2, {
3298 if (grn_table_add_v_inline(ctx, table1, key, key_size, &value1, NULL)) {
3299 memcpy(value1, value2, value_size);
3306 GRN_TABLE_EACH(ctx, table1, 0, 0,
id, &key, &key_size, &value1, {
3316 GRN_TABLE_EACH(ctx, table1, 0, 0,
id, &key, &key_size, &value1, {
3324 GRN_TABLE_EACH(ctx, table2, 0, 0,
id, &key, &key_size, &value2, {
3329 GRN_TABLE_EACH(ctx, table2, 0, 0,
id, &key, &key_size, &value2, {
3331 memcpy(value1, value2, value_size);
3346 uint32_t key_size = 0;
3369 const char *name,
unsigned int name_size);
3372 grn_obj_column_(
grn_ctx *ctx,
grn_obj *table,
const char *name,
unsigned int name_size)
3380 memcpy(buf + len, name, name_size);
3398 !(column = grn_obj_column_(ctx, table, name, name_size))) {
3399 column = grn_obj_get_accessor(ctx, table, name, name_size);
3402 column = grn_obj_get_accessor(ctx, table, name, name_size);
3464 const char *name,
unsigned int name_size,
3468 uint32_t value_size;
3485 if (!name || !name_size) {
3496 "[column][create] invalid db assigned: <%.*s>.<%.*s>",
3497 table_name_len, table_name, name_size, name);
3502 "[column][create] temporary table doesn't support column: <%.*s>",
3510 "DDL:column_create %.*s %.*s", s, n, name_size, name);
3516 if ((domain =
DB_OBJ(table)->
id)) {
3520 "[column][create] too long column name: required name_size(%d) < %d"
3523 len, fullname, name_size, name);
3527 memcpy(fullname + len + 1, name, name_size);
3528 name_size += len + 1;
3531 "[column][create] [todo] table-less column isn't supported yet");
3534 range =
DB_OBJ(type)->id;
3547 value_size =
sizeof(
grn_id);
3555 value_size =
sizeof(
grn_id);
3562 gen_pathname(grn_obj_io(db)->path, buffer,
id);
3570 "[column][create] path not assigned for persistent column"
3572 table_name_len, table_name, name_size, name);
3585 "[column][create] path assigned for temporary column"
3587 table_name_len, table_name, name_size, name);
3610 DB_OBJ(res)->header.domain = domain;
3611 DB_OBJ(res)->header.impl_flags = 0;
3612 DB_OBJ(res)->range = range;
3613 DB_OBJ(res)->header.flags = flags;
3618 #ifdef GRN_WITH_ZLIB
3628 if (zlib_p || lzo_p) {
3635 "%s compressed column will leaks memories: <%.*s>.<%.*s>",
3636 zlib_p ?
"zlib" :
"lzo",
3637 table_name_len, table_name, name_size, name);
3641 _grn_obj_remove(ctx, res);
3653 const char *name,
unsigned int name_size,
3661 if (!table || !type || !name || !name_size) {
3674 if ((domain =
DB_OBJ(table)->
id)) {
3681 memcpy(fullname + len + 1, name, name_size);
3682 name_size += len + 1;
3690 if (path && (!path2 || strcmp(path, path2))) {
goto exit; }
3693 if (!dbtype) {
goto exit; }
3707 DB_OBJ(res)->header.domain = domain;
3801 size = vector->
u.
v.n_sections;
3834 unsigned int offset,
const char **str,
3835 unsigned int *weight,
grn_id *domain)
3837 unsigned int length = 0;
3843 if (vector->
u.
v.n_sections <= offset) {
3849 grn_obj *body = grn_vector_body(ctx, vector);
3851 if (weight) { *weight = vp->
weight; }
3852 if (domain) { *domain = vp->
domain; }
3861 const char **str,
unsigned int *weight,
grn_id *domain)
3863 unsigned int offset, length = 0;
3869 if (!vector->
u.
v.n_sections) {
3873 offset = --vector->
u.
v.n_sections;
3876 grn_obj *body = grn_vector_body(ctx, vector);
3878 if (weight) { *weight = vp->
weight; }
3879 if (domain) { *domain = vp->
domain; }
3887 #define W_SECTIONS_UNIT 8
3888 #define S_SECTIONS_UNIT (1 << W_SECTIONS_UNIT)
3889 #define M_SECTIONS_UNIT (S_SECTIONS_UNIT - 1)
3899 v->
u.
v.sections = vp;
3902 grn_obj *body = grn_vector_body(ctx, v);
3909 v->
u.
v.n_sections++;
3916 uint8_t *p = (uint8_t *)data;
3917 uint8_t *pe = p + data_size;
3918 uint32_t n, n0 = v->
u.
v.n_sections;
3925 v->
u.
v.sections = vp;
3929 uint32_t o = 0, l,
i;
3930 for (i = n, vp = v->
u.
v.sections + n0; i; i--, vp++) {
3941 grn_obj *body = grn_vector_body(ctx, v);
3946 for (i = n, vp = v->
u.
v.sections + n0; i; i--, vp++) {
3953 v->
u.
v.n_sections += n;
3959 const char *str,
unsigned int str_len,
3960 unsigned int weight,
grn_id domain)
3968 if ((body = grn_vector_body(ctx, vector))) {
4045 grn_obj_get_accessor(
grn_ctx *ctx,
grn_obj *obj,
const char *name,
unsigned int name_size)
4049 if (!obj) {
return NULL; }
4053 for (rp0 = (
grn_accessor **)&obj; *rp0; rp0 = &(*rp0)->next) {
4082 const char *sp, *se = name + name_size;
4084 for (sp = name; (len =
grn_charlen(ctx, sp, se)); sp += len) {
4087 if (!(len = sp - name)) {
goto exit; }
4090 if (len < 2) {
goto exit; }
4093 if (len != 4 || memcmp(name,
"_key", 4)) {
goto exit; }
4094 for (rp = &res; !done; rp = &(*rp)->
next) {
4095 *rp = accessor_new(ctx);
4106 *rp = accessor_new(ctx);
4135 if (len != 3 || memcmp(name,
"_id", 3)) {
goto exit; }
4136 for (rp = &res; !done; rp = &(*rp)->
next) {
4137 *rp = accessor_new(ctx);
4170 if (len != 6 || memcmp(name,
"_value", 6)) {
goto exit; }
4171 for (rp = &res; !done; rp = &(*rp)->
next) {
4172 *rp = accessor_new(ctx);
4175 if (
DB_OBJ((*rp)->obj)->range) {
4193 if (
DB_OBJ((*rp)->obj)->range) {
4218 if (len != 6 || memcmp(name,
"_score", 6)) {
goto exit; }
4219 for (rp = &res; !done; rp = &(*rp)->
next) {
4220 *rp = accessor_new(ctx);
4222 if (
DB_OBJ(obj)->header.flags & GRN_OBJ_WITH_SUBREC) {
4253 if (len != 9 || memcmp(name,
"_nsubrecs", 9)) {
goto exit; }
4254 for (rp = &res; !done; rp = &(*rp)->
next) {
4255 *rp = accessor_new(ctx);
4293 for (rp = &res; ; rp = &(*rp)->
next) {
4294 grn_obj *column = grn_obj_column_(ctx, obj, name, len);
4296 *rp = accessor_new(ctx);
4297 (*rp)->obj = column;
4319 *rp = accessor_new(ctx);
4343 if (!grn_obj_get_accessor(ctx, (
grn_obj *)res, sp, se - sp)) {
4352 if (rp0) { *rp0 = res; }
4375 *range_id =
DB_OBJ(obj)->range;
4376 if (grn_column_is_vector(ctx, obj)) {
4398 if (grn_column_is_vector(ctx, a->
obj)) {
4420 grn_obj_get_range_info(ctx, obj, &range_id, &range_flags);
4454 #define SRC2RECORD() do {\
4455 grn_obj *table = grn_ctx_at(ctx, dest->header.domain);\
4456 if (GRN_OBJ_TABLEP(table)) {\
4457 grn_obj *p_key = src;\
4459 if (table->header.type != GRN_TABLE_NO_KEY) {\
4461 GRN_OBJ_INIT(&key, GRN_BULK, 0, table->header.domain);\
4462 if (src->header.domain != table->header.domain) {\
4463 grn_obj_cast(ctx, src, &key, GRN_TRUE);\
4466 if (GRN_BULK_VSIZE(p_key)) {\
4467 id = addp ? grn_table_add_by_key(ctx, table, p_key, NULL)\
4468 : grn_table_get_by_key(ctx, table, p_key);\
4469 if (id) { GRN_RECORD_SET(ctx, dest, id); }\
4471 GRN_RECORD_SET(ctx, dest, GRN_ID_NIL);\
4473 GRN_OBJ_FIN(ctx, &key);\
4476 GRN_UINT32_INIT(&record_id, 0);\
4477 grn_obj_cast(ctx, src, &record_id, GRN_TRUE);\
4478 id = GRN_UINT32_VALUE(&record_id);\
4479 if (id) { GRN_RECORD_SET(ctx, dest, id); }\
4482 rc = GRN_FUNCTION_NOT_IMPLEMENTED;\
4529 const char *bool_text;
4545 #define NUM2DEST(getvalue,totext,tobool,totime,tofloat)\
4546 switch (dest->header.domain) {\
4548 tobool(ctx, dest, getvalue(src));\
4551 GRN_INT8_SET(ctx, dest, getvalue(src));\
4553 case GRN_DB_UINT8 :\
4554 GRN_UINT8_SET(ctx, dest, getvalue(src));\
4556 case GRN_DB_INT16 :\
4557 GRN_INT16_SET(ctx, dest, getvalue(src));\
4559 case GRN_DB_UINT16 :\
4560 GRN_UINT16_SET(ctx, dest, getvalue(src));\
4562 case GRN_DB_INT32 :\
4563 GRN_INT32_SET(ctx, dest, getvalue(src));\
4565 case GRN_DB_UINT32 :\
4566 GRN_UINT32_SET(ctx, dest, getvalue(src));\
4569 totime(ctx, dest, getvalue(src));\
4571 case GRN_DB_INT64 :\
4572 GRN_INT64_SET(ctx, dest, getvalue(src));\
4574 case GRN_DB_UINT64 :\
4575 GRN_UINT64_SET(ctx, dest, getvalue(src));\
4577 case GRN_DB_FLOAT :\
4578 tofloat(ctx, dest, getvalue(src));\
4580 case GRN_DB_SHORT_TEXT :\
4582 case GRN_DB_LONG_TEXT :\
4583 totext(ctx, dest, getvalue(src));\
4585 case GRN_DB_TOKYO_GEO_POINT :\
4586 case GRN_DB_WGS84_GEO_POINT :\
4587 rc = GRN_INVALID_ARGUMENT;\
4594 #define TEXT2DEST(type,tonum,setvalue) do {\
4595 const char *cur, *str = GRN_TEXT_VALUE(src);\
4596 const char *str_end = GRN_BULK_CURR(src);\
4597 type i = tonum(str, str_end, &cur);\
4598 if (cur == str_end) {\
4599 setvalue(ctx, dest, i);\
4600 } else if (cur != str) {\
4603 GRN_VOID_INIT(&buf);\
4604 rc = grn_aton(ctx, str, str_end, &rest, &buf);\
4606 rc = grn_obj_cast(ctx, &buf, dest, addp);\
4608 GRN_OBJ_FIN(ctx, &buf);\
4610 rc = GRN_INVALID_ARGUMENT;\
4614 #define NUM2BOOL(ctx, dest, value) GRN_BOOL_SET(ctx, dest, value != 0)
4615 #define FLOAT2BOOL(ctx, dest, value) do {\
4616 double value_ = value;\
4617 GRN_BOOL_SET(ctx, dest, value_ < -DBL_EPSILON || DBL_EPSILON < value_);\
4620 #define NUM2TIME(ctx, dest, value)\
4621 GRN_TIME_SET(ctx, dest, (long long int)(value) * GRN_TIME_USEC_PER_SEC);
4622 #define TIME2TIME(ctx, dest, value)\
4623 GRN_TIME_SET(ctx, dest, value);
4624 #define FLOAT2TIME(ctx, dest, value)\
4625 GRN_TIME_SET(ctx, dest, (long long int)(value * GRN_TIME_USEC_PER_SEC));
4627 #define NUM2FLOAT(ctx, dest, value)\
4628 GRN_FLOAT_SET(ctx, dest, value);
4629 #define TIME2FLOAT(ctx, dest, value)\
4630 GRN_FLOAT_SET(ctx, dest, (double)(value) / GRN_TIME_USEC_PER_SEC);
4631 #define FLOAT2FLOAT(ctx, dest, value)\
4632 GRN_FLOAT_SET(ctx, dest, value);
4640 rc = grn_obj_cast_bool(ctx, src, dest, addp);
4757 int latitude, longitude;
4761 if (str == str_end) {
4766 latitude =
grn_atoi(str, str_end, &cur);
4767 if (cur < str_end && cur[0] ==
'.') {
4781 if (!rc && (cur[0] ==
'x' || cur[0] ==
',') && cur + 1 < str_end) {
4782 const char *c = cur + 1;
4783 longitude =
grn_atoi(c, str_end, &cur);
4784 if (cur < str_end && cur[0] ==
'.') {
4800 if (!rc && cur == str_end) {
4829 int latitude, longitude;
4830 double latitude_in_degree, longitude_in_degree;
4849 double wgs84_latitude_in_degree = latitude_in_degree;
4850 double wgs84_longitude_in_degree = longitude_in_degree;
4851 int tokyo_latitude, tokyo_longitude;
4852 double tokyo_latitude_in_degree, tokyo_longitude_in_degree;
4853 tokyo_latitude_in_degree =
4854 wgs84_latitude_in_degree * 1.000106961 -
4855 wgs84_longitude_in_degree * 0.000017467 -
4857 tokyo_longitude_in_degree =
4858 wgs84_longitude_in_degree * 1.000083049 +
4859 wgs84_latitude_in_degree * 0.000046047 -
4865 double tokyo_latitude_in_degree = latitude_in_degree;
4866 double tokyo_longitude_in_degree = longitude_in_degree;
4867 int wgs84_latitude, wgs84_longitude;
4868 double wgs84_latitude_in_degree, wgs84_longitude_in_degree;
4869 wgs84_latitude_in_degree =
4870 tokyo_latitude_in_degree -
4871 tokyo_latitude_in_degree * 0.00010695 +
4872 tokyo_longitude_in_degree * 0.000017464 +
4874 wgs84_longitude_in_degree =
4875 tokyo_longitude_in_degree -
4876 tokyo_latitude_in_degree * 0.000046038 -
4877 tokyo_longitude_in_degree * 0.000083043 +
4898 const char *value = NULL;
4902 value = (
const char *)(uintptr_t)id;
4914 *size =
sizeof(int);
4920 *size =
sizeof(int);
4937 if (value && (a = a->
next)) {
5007 if ((a = a->
next)) {
5089 if ((a = a->
next)) {
5100 #define INCRDECR(op) \
5101 switch (DB_OBJ(obj)->range) {\
5103 if (s == sizeof(int8_t)) {\
5104 int8_t *vp = (int8_t *)p;\
5105 *vp op *(int8_t *)v;\
5108 rc = GRN_INVALID_ARGUMENT;\
5111 case GRN_DB_UINT8 :\
5112 if (s == sizeof(uint8_t)) {\
5113 uint8_t *vp = (uint8_t *)p;\
5114 *vp op *(int8_t *)v;\
5117 rc = GRN_INVALID_ARGUMENT;\
5120 case GRN_DB_INT16 :\
5121 if (s == sizeof(int16_t)) {\
5122 int16_t *vp = (int16_t *)p;\
5123 *vp op *(int16_t *)v;\
5126 rc = GRN_INVALID_ARGUMENT;\
5129 case GRN_DB_UINT16 :\
5130 if (s == sizeof(uint16_t)) {\
5131 uint16_t *vp = (uint16_t *)p;\
5132 *vp op *(int16_t *)v;\
5135 rc = GRN_INVALID_ARGUMENT;\
5138 case GRN_DB_INT32 :\
5139 if (s == sizeof(int32_t)) {\
5140 int32_t *vp = (int32_t *)p;\
5141 *vp op *(int32_t *)v;\
5144 rc = GRN_INVALID_ARGUMENT;\
5147 case GRN_DB_UINT32 :\
5148 if (s == sizeof(uint32_t)) {\
5149 uint32_t *vp = (uint32_t *)p;\
5150 *vp op *(int32_t *)v;\
5153 rc = GRN_INVALID_ARGUMENT;\
5156 case GRN_DB_INT64 :\
5158 if (s == sizeof(int64_t)) {\
5159 int64_t *vp = (int64_t *)p;\
5160 *vp op *(int64_t *)v;\
5163 rc = GRN_INVALID_ARGUMENT;\
5166 case GRN_DB_FLOAT :\
5167 if (s == sizeof(double)) {\
5168 double *vp = (double *)p;\
5169 *vp op *(double *)v;\
5172 rc = GRN_INVALID_ARGUMENT;\
5176 rc = GRN_OPERATION_NOT_SUPPORTED;\
5183 if (!obj) {
return 0; }
5214 if ((ov && v && os == s && !memcmp(ov, v, s)) &&
5239 default_set_value_hook(ctx, 1, &obj, &pctx.
user_data);
5245 hooks = hooks->
next;
5281 default_set_value_hook(ctx, 1, &obj, &pctx.
user_data);
5287 hooks = hooks->
next;
5305 if (call_hook(ctx, obj,
id, value, flags)) {
5332 if (call_hook(ctx, obj,
id, value, flags)) {
5359 if (call_hook(ctx, obj,
id, value, flags)) {
5388 if (call_hook(ctx, obj,
id, value, flags)) {
5398 }
else if (GRN_DB_INT8 <= value->header.domain &&
5439 if (call_hook(ctx, obj,
id, value, flags)) {
5449 unsigned int token_flags = 0;
5465 if (value->
u.
v.body) {
5472 for (j = value->
u.
v.n_sections, v = value->
u.
v.sections; j; j--, v++) {
5473 const char *value_ptr = head + v->
offset;
5474 int value_length = v->
length;
5498 value_ptr, value_length, NULL);
5552 uint32_t element_size = ((
grn_ra *)obj)->
header->element_size;
5571 }
else if (element_size < s) {
5580 switch (flags & GRN_OBJ_SET_MASK) {
5582 if (call_hook(ctx, obj,
id, value_, flags)) {
5587 if (element_size != s) {
5589 memset(p, 0, element_size);
5594 memcpy(p, b, element_size);
5629 rc = grn_accessor_set_value(ctx, (
grn_accessor *)obj,
id, value, flags);
5636 rc = grn_obj_set_value_table_pat_key(ctx, obj,
id, value, flags);
5642 rc = grn_obj_set_value_table_hash_key(ctx, obj,
id, value, flags);
5645 rc = grn_obj_set_value_table_no_key(ctx, obj,
id, value, flags);
5650 rc = grn_obj_set_value_column_var_size_scalar(ctx, obj,
id, value,
5654 rc = grn_obj_set_value_column_var_size_vector(ctx, obj,
id, value,
5663 rc = grn_obj_set_value_column_fix_size(ctx, obj,
id, value, flags);
5676 const char *value = NULL;
5707 *size = ((
grn_ra *)obj)->header->element_size;
5721 if (!
id) {
goto exit; }
5747 grn_obj_ensure_bulk(ctx, value);
5748 value = grn_accessor_get_value(ctx, (
grn_accessor *)obj,
id, value);
5755 grn_obj_ensure_bulk(ctx, value);
5757 MERR(
"grn_bulk_space failed");
5775 grn_obj_ensure_bulk(ctx, value);
5777 MERR(
"grn_bulk_space failed");
5792 grn_obj_ensure_bulk(ctx, value);
5794 MERR(
"grn_bulk_space failed");
5813 grn_obj_ensure_vector(ctx, value);
5819 grn_obj_ensure_bulk(ctx, value);
5826 grn_obj_ensure_bulk(ctx, value);
5838 unsigned int element_size;
5840 grn_obj_ensure_bulk(ctx, value);
5844 element_size = ((
grn_ra *)obj)->header->element_size;
5851 grn_obj_ensure_bulk(ctx, value);
5869 if (0 < offset && offset <= table_size) {
5878 if (values) { *values = p; }
5897 grn_id id,
unsigned int section,
5930 "failed to open value buffer for GRN_INFO_ZLIB_SUPPORT");
5933 #ifdef GRN_WITH_ZLIB
5942 "failed to open value buffer for GRN_INFO_LZO_SUPPORT");
5969 enc = ((
grn_pat *)obj)->encoding;
5973 enc = ((
grn_dat *)obj)->encoding;
5999 switch (
DB_OBJ(obj)->header.type) {
6001 valuebuf = ((
grn_hash *)obj)->tokenizer;
6004 valuebuf = ((
grn_pat *)obj)->tokenizer;
6007 valuebuf = ((
grn_dat *)obj)->tokenizer;
6012 switch (
DB_OBJ(obj)->header.type) {
6014 valuebuf = ((
grn_hash *)obj)->normalizer;
6017 valuebuf = ((
grn_pat *)obj)->normalizer;
6020 valuebuf = ((
grn_dat *)obj)->normalizer;
6036 grn_obj *src, **cp, **col, *target;
6038 if (!(
DB_OBJ(obj)->source_size) || !s) {
return; }
6047 switch (flags & GRN_OBJ_TABLE_TYPE_MASK) {
6059 for (cp = col, i = ncol;
i; s++, cp++, i--) {
6069 if (use_grn_ii_build) {
6070 uint64_t sparsity = 10;
6071 if (getenv(
"GRN_INDEX_SPARSITY")) {
6074 v = strtoull(getenv(
"GRN_INDEX_SPARSITY"), NULL, 0);
6075 if (!errno) { sparsity = v; }
6085 while ((
id = grn_table_cursor_next_inline(ctx, tc)) !=
GRN_ID_NIL) {
6086 for (cp = col, i = ncol;
i; i--, cp++) {
6093 call_hook_for_build(ctx, *cp,
id, &rv, 0);
6119 for (i = 1; i <= n; i++, s++) {
6146 void *hld_value = NULL;
6147 uint32_t hld_size = 0;
6151 if (!hld_size) {
return; }
6152 for (i = 0, last = &
DB_OBJ(obj)->hooks[entry]; *last; i++, last = &(*last)->
next) {
6153 if (!memcmp(
NEXT_ADDR(*last), hld_value, hld_size)) {
6169 for (i = 1; i <= n; i++, s++) {
6192 #define N_HOOK_ENTRIES 5
6201 for (hooks = obj->
hooks[e]; hooks; hooks = hooks->
next) {
6214 grn_hook_unpack(
grn_ctx *ctx,
grn_db_obj *obj,
const char *buf, uint32_t buf_size)
6217 const uint8_t *p = (uint8_t *)buf, *pe = p + buf_size;
6224 if (!
id--) {
break; }
6240 if ((new->hld_size = hld_size)) {
6263 if (!(b = grn_vector_body(ctx, &v))) {
return; }
6287 grn_obj_set_info_source_validate_report_error(
grn_ctx *ctx,
6297 int column_name_size;
6298 int table_domain_name_size;
6299 int source_name_size;
6300 int source_type_name_size;
6308 source_name[source_name_size] =
'\0';
6309 strncat(source_name,
"._key",
6311 source_name_size = strlen(source_name);
6313 table_domain_name_size =
grn_obj_name(ctx, table_domain,
6316 source_type =
grn_ctx_at(ctx, source_type_id);
6324 source_type_name_size = strlen(source_type_name);
6327 "grn_obj_set_info(): GRN_INFO_SOURCE: "
6328 "source type must equal to index table's key type: "
6329 "source:<%.*s(%.*s)> index:<%.*s(%.*s)>",
6330 source_name_size, source_name,
6331 source_type_name_size, source_type_name,
6332 column_name_size, column_name,
6333 table_domain_name_size, table_domain_name);
6346 int i, n_source_ids;
6355 table_domain =
grn_ctx_at(ctx, table_domain_id);
6356 if (!table_domain) {
6366 for (i = 0; i < n_source_ids; i++) {
6367 grn_id source_id = source_ids[
i];
6378 source_type_id =
DB_OBJ(source)->range;
6380 if (table_domain_id != source_type_id) {
6381 rc = grn_obj_set_info_source_validate_report_error(ctx,
6436 DB_OBJ(obj)->source = v2;
6437 DB_OBJ(obj)->source_size = s;
6440 update_source_hook(ctx, obj);
6441 build_index(ctx, obj);
6444 DB_OBJ(obj)->source = NULL;
6445 DB_OBJ(obj)->source_size = 0;
6456 rc = grn_obj_set_info_source_validate(ctx, obj, value);
6460 grn_obj_set_info_source_log(ctx, obj, value);
6461 rc = grn_obj_set_info_source_update(ctx, obj, value);
6485 rc = grn_obj_set_info_source(ctx, obj, value);
6489 switch (
DB_OBJ(obj)->header.type) {
6491 ((
grn_hash *)obj)->tokenizer = value;
6496 ((
grn_pat *)obj)->tokenizer = value;
6501 ((
grn_dat *)obj)->tokenizer = value;
6510 switch (
DB_OBJ(obj)->header.type) {
6512 ((
grn_hash *)obj)->normalizer = value;
6517 ((
grn_pat *)obj)->normalizer = value;
6522 ((
grn_dat *)obj)->normalizer = value;
6572 for (curr = h; curr; curr = next) {
6588 void *hld_value = NULL;
6589 uint32_t hld_size = 0;
6600 new->hld_size = hld_size;
6602 memcpy(
NEXT_ADDR(
new), hld_value, hld_size);
6604 for (i = 0; i != offset && *last; i++) { last = &(*last)->next; }
6637 for (i = 0; i < offset; i++) {
6639 if (!hook) {
return NULL; }
6656 if (++i > offset) {
break; }
6670 DB_OBJ(obj)->hooks[entry] = NULL;
6679 "[column][remove][index] "
6680 "hook has a dangling reference: %.*s", length, name);
6683 _grn_obj_remove(ctx, target);
6693 hooks = hooks->
next;
6708 if (col) { _grn_obj_remove(ctx, col); }
6721 while ((
id = grn_table_cursor_next_inline(ctx, cur)) !=
GRN_ID_NIL) {
6724 _grn_obj_remove(ctx, obj);
6737 while ((
id = grn_table_cursor_next_inline(ctx, cur)) !=
GRN_ID_NIL) {
6748 if (!
DB_OBJ(obj)->range) {
6762 _grn_obj_remove(ctx, obj);
6778 while ((
id = grn_table_cursor_next_inline(ctx, cur)) !=
GRN_ID_NIL) {
6804 _grn_obj_remove(ctx, obj);
6820 while ((
id = grn_table_cursor_next_inline(ctx, cur)) !=
GRN_ID_NIL) {
6832 _grn_obj_remove(ctx, obj);
6844 const char *io_spath;
6847 unsigned char key_type;
6861 _grn_obj_remove_db_index_columns(ctx, db);
6862 _grn_obj_remove_db_reference_columns(ctx, db);
6863 _grn_obj_remove_db_reference_tables(ctx, db);
6864 _grn_obj_remove_db_all_tables(ctx, db);
6891 int table_name_size;
6894 table_id =
DB_OBJ(table)->id;
6912 if (
DB_OBJ(
object)->
id == table_id) {
6918 int reference_table_name_size;
6919 reference_table_name_size =
6923 "[table][remove] a table that references the table exists: "
6924 "<%.*s._key> -> <%.*s>",
6925 reference_table_name_size, reference_table_name,
6926 table_name_size, table_name);
6935 if (
DB_OBJ(
object)->range == table_id) {
6937 int column_name_size;
6938 column_name_size =
grn_obj_name(ctx,
object, column_name,
6941 "[table][remove] a column that references the table exists: "
6943 column_name_size, column_name,
6944 table_name_size, table_name);
6967 if (!is_removable_table(ctx, obj, db)) {
6971 remove_columns(ctx, obj);
6985 if (!is_removable_table(ctx, obj, db)) {
6989 remove_columns(ctx, obj);
7003 if (!is_removable_table(ctx, obj, db)) {
7007 remove_columns(ctx, obj);
7021 if (!is_removable_table(ctx, obj, db)) {
7024 remove_columns(ctx, obj);
7066 delete_source_hook(ctx, obj);
7103 const char *io_path;
7110 if ((io_path =
grn_obj_path(ctx, obj)) && *io_path !=
'\0') {
7124 _grn_obj_remove_db(ctx, obj, db,
id, path);
7127 _grn_obj_remove_pat(ctx, obj, db,
id, path);
7130 _grn_obj_remove_dat(ctx, obj, db,
id, path);
7133 _grn_obj_remove_hash(ctx, obj, db,
id, path);
7136 _grn_obj_remove_array(ctx, obj, db,
id, path);
7139 _grn_obj_remove_ja(ctx, obj, db,
id, path);
7142 _grn_obj_remove_ra(ctx, obj, db,
id, path);
7145 _grn_obj_remove_index(ctx, obj, db,
id, path);
7149 _grn_obj_remove_db_obj(ctx, obj, db,
id, path);
7151 _grn_obj_remove_other(ctx, obj, db,
id, path);
7164 _grn_obj_remove(ctx, obj);
7168 _grn_obj_remove(ctx, obj);
7175 const void *dest_key,
unsigned int dest_key_size)
7197 const void *src_key,
unsigned int src_key_size,
7198 const void *dest_key,
unsigned int dest_key_size)
7204 src_key, src_key_size,
7205 dest_key, dest_key_size);
7233 int table_name_size;
7238 "[table][rename] isn't table: <%.*s> -> <%.*s>",
7239 table_name_size, table_name,
7246 "[table][rename] temporary table doesn't have name: "
7247 "(anonymous) -> <%.*s>",
7258 memcpy(fullname, name, name_size);
7267 name_size + 1 + colname_len))) {
7292 "[column][rename] too long column name: required name_size(%d) < %d"
7295 len, fullname, name_size, name);
7299 memcpy(fullname + len + 1, name, name_size);
7300 name_size += len + 1;
7319 if (name && name_size) {
7324 "grn_table_add failed: <%.*s>", name_size, name);
7325 }
else if (!added) {
7327 "already used name was assigned: <%.*s>", name_size, name);
7342 if (
id & GRN_OBJ_TMP_OBJECT) {
7345 id & ~GRN_OBJ_TMP_OBJECT, NULL);
7382 gen_pathname(grn_obj_io(db)->path, buffer,
id);
7393 if (
id & GRN_OBJ_TMP_OBJECT) {
7396 id & ~GRN_OBJ_TMP_OBJECT, &obj, GRN_OBJ_SET);
7403 ERR(rc,
"grn_tiny_array_at failed (%d)",
id);
7417 obj->
hooks[entry] = NULL;
7424 #define GET_PATH(spec,buffer,s,id) do {\
7425 if (spec->header.flags & GRN_OBJ_CUSTOM_NAME) {\
7427 unsigned int size = grn_vector_get_element(ctx, &v, 1, &path, NULL, NULL); \
7428 if (size > PATH_MAX) { ERR(GRN_FILENAME_TOO_LONG, "too long path"); }\
7429 memcpy(buffer, path, size);\
7430 buffer[size] = '\0';\
7432 gen_pathname(grn_obj_io(s->keys)->path, buffer, id); \
7436 #define UNPACK_INFO() do {\
7438 grn_db_obj *r = DB_OBJ(vp->ptr);\
7439 r->header = spec->header;\
7441 r->range = spec->range;\
7442 r->db = (grn_obj *)s;\
7443 size = grn_vector_get_element(ctx, &v, 2, &p, NULL, NULL);\
7445 if ((r->source = GRN_MALLOC(size))) {\
7446 memcpy(r->source, p, size);\
7447 r->source_size = size;\
7450 size = grn_vector_get_element(ctx, &v, 3, &p, NULL, NULL);\
7451 grn_hook_unpack(ctx, r, p, size);\
7459 if (!ctx || !ctx->
impl || !
id) {
return res; }
7461 if (
id & GRN_OBJ_TMP_OBJECT) {
7473 uint32_t l, *pl, ntrial;
7477 for (ntrial = 0;; ntrial++) {
7478 GRN_ATOMIC_ADD_EX(pl, 1, l);
7484 GRN_ATOMIC_ADD_EX(pl, -1, l);
7491 for (ntrial = 0;; ntrial++) {
7492 GRN_ATOMIC_ADD_EX(pl, 1, l);
7498 GRN_ATOMIC_ADD_EX(pl, -1, l);
7518 vp->
ptr = (
grn_obj *)grn_type_open(ctx, spec);
7590 GRN_ATOMIC_ADD_EX(pl, -1, l);
7595 for (ntrial = 0; !vp->
ptr; ntrial++) {
7596 if (ntrial >= 1000) {
7628 new->u.b.head = obj->
u.
b.head;
7629 new->u.b.curr = obj->
u.
b.curr;
7630 new->u.b.tail = obj->
u.
b.tail;
7631 obj->
u.
b.head = NULL;
7632 obj->
u.
b.curr = NULL;
7633 obj->
u.
b.tail = NULL;
7646 if (
DB_OBJ(obj)->finalizer) {
7647 DB_OBJ(obj)->finalizer(ctx, 1, &obj, &
DB_OBJ(obj)->user_data);
7649 if (
DB_OBJ(obj)->source) {
7653 grn_hook_free(ctx,
DB_OBJ(obj)->hooks[entry]);
7662 if (obj->
u.
v.sections) {
GRN_FREE(obj->
u.
v.sections); }
7751 for (i = 0; i < p->
nvars; i++) {
7776 (((
grn_db_obj *)obj)->
id & GRN_OBJ_TMP_OBJECT) ||
7786 uint32_t l, *pl = &vp->lock;
7791 GRN_ATOMIC_ADD_EX(pl, -1, l);
7795 #ifdef CALL_FINALIZER
7813 #define VECTOR_CLEAR(ctx,obj) do {\
7814 if ((obj)->u.v.body && !((obj)->header.impl_flags & GRN_OBJ_REFER)) {\
7815 grn_obj_close((ctx), (obj)->u.v.body);\
7817 if ((obj)->u.v.sections) { GRN_FREE((obj)->u.v.sections); }\
7818 (obj)->header.impl_flags &= ~GRN_OBJ_DO_SHALLOW_COPY;\
7819 (obj)->u.b.head = NULL;\
7820 (obj)->u.b.curr = NULL;\
7821 (obj)->u.b.tail = NULL;\
7876 if (obj->
u.
v.body) {
7879 obj->
u.
v.n_sections = 0;
7894 if (flags & GRN_OBJ_VECTOR) {
7924 limited_size_inspect(ctx, &inspected, domain_obj);
7926 "[reinit] invalid domain object: <%.*s>",
7932 grn_obj_get_range_info(ctx, domain_obj, &domain, &flags);
7944 const char *path = NULL;
7950 io = grn_obj_io(obj);
7963 if (!(
DB_OBJ(obj)->
id & GRN_OBJ_TMP_OBJECT)) {
7976 if (!obj) {
return len; }
7984 char *p = buf, *p0 = p, *pe = p + len;
7985 for (; p < pe && (cl =
grn_charlen(ctx, p, pe)); p += cl) {
7989 if (len && len <= buf_size) {
7990 memcpy(namebuf, p0, len);
7995 const char *name = NULL;
8023 if (len <= buf_size) {
8024 memcpy(namebuf, name, len);
8041 const char *p0 = p, *pe = p + len;
8042 for (; p < pe && (cl =
grn_charlen(ctx, p, pe)); p += cl) {
8120 return &
DB_OBJ(obj)->user_data;
8127 DB_OBJ(obj)->finalizer = func;
8141 while ((
id = grn_table_cursor_next_inline(ctx, cur)) !=
GRN_ID_NIL) {
8196 unsigned int res = 0;
8233 while ((
id = grn_table_cursor_next_inline(ctx, cur)) !=
GRN_ID_NIL) {
8295 #define CMPNUM(type) do {\
8298 type va = *((type *)(ap));\
8299 type vb = *((type *)(bp));\
8300 if (va != vb) { return va > vb; }\
8305 if (bs) { return 0; }\
8316 const unsigned char *ap, *bp;
8317 for (i = 0; i < n_keys; i++, keys++) {
8319 const char *ap_raw, *bp_raw;
8327 ap = (
const unsigned char *)ap_raw;
8328 bp = (
const unsigned char *)bp_raw;
8341 if (ap != bp) {
return ap > bp; }
8344 for (;; ap++, bp++, as--, bs--) {
8345 if (!as) {
if (bs) {
return 0; }
else {
break; } }
8346 if (!bs) {
return 1; }
8347 if (*ap < *bp) {
return 0; }
8348 if (*ap > *bp) {
return 1; }
8378 float va = *((
float *)(ap));
8379 float vb = *((
float *)(bp));
8380 if (va < vb || va > vb) {
return va > vb; }
8385 if (bs) {
return 0; }
8391 double va = *((
double *)(ap));
8392 double vb = *((
double *)(bp));
8393 if (va < vb || va > vb) {
return va > vb; }
8398 if (bs) {
return 0; }
8419 if (compare_value(ctx, b, e, keys, n_keys)) {
8422 if (d < 2) {
return NULL; }
8424 if (compare_value(ctx, b, c, keys, n_keys)) {
8427 if (compare_value(ctx, c, e, keys, n_keys)) {
8431 if (d < 3) {
return NULL; }
8438 }
while (compare_value(ctx, c, b, keys, n_keys));
8441 }
while (compare_value(ctx, e, c, keys, n_keys));
8442 if (b >= e) {
break; }
8454 if (head < tail && (c = part(ctx, head, tail, keys, n_keys))) {
8455 intptr_t m = c - head + 1;
8456 if (from < m - 1) { _sort(ctx, head, c - 1, from, to, keys, n_keys); }
8457 if (m < to) { _sort(ctx, c + 1, tail, from - m, to - m, keys, n_keys); }
8468 if (!tc) {
return NULL; }
8469 if ((c.
id = grn_table_cursor_next_inline(ctx, tc))) {
8471 while ((e.
id = grn_table_cursor_next_inline(ctx, tc))) {
8473 if (compare_value(ctx, &c, &e, keys, n_keys)) {
8484 return i > 2 ? head : NULL;
8508 if (!n_keys || !keys) {
8522 ERR(rc,
"grn_normalize_offset_and_limit failed");
8562 for (kp = keys, j = n_keys; j; kp++, j--) {
8563 if (range_is_idp(kp->
key)) {
8635 if ((ep = pack(ctx, table, array, array + n - 1, keys, n_keys))) {
8636 intptr_t m = ep - array + 1;
8637 if (offset < m - 1) { _sort(ctx, array, ep - 1, offset, e, keys, n_keys); }
8638 if (m < e) { _sort(ctx, ep + 1, array + n - 1, offset - m, e - m, keys, n_keys); }
8642 for (i = 0, ep = array + offset; i < limit && ep < array + n; i++, ep++) {
8654 deftype(
grn_ctx *ctx,
const char *name,
8658 if (!o) { o =
grn_type_create(ctx, name, strlen(name), flags, size); }
8667 char buf[] =
"Sys00";
8669 obj = deftype(ctx,
"Object",
8672 obj = deftype(ctx,
"Bool",
8675 obj = deftype(ctx,
"Int8",
8678 obj = deftype(ctx,
"UInt8",
8681 obj = deftype(ctx,
"Int16",
8684 obj = deftype(ctx,
"UInt16",
8687 obj = deftype(ctx,
"Int32",
8690 obj = deftype(ctx,
"UInt32",
8693 obj = deftype(ctx,
"Int64",
8696 obj = deftype(ctx,
"UInt64",
8699 obj = deftype(ctx,
"Float",
8702 obj = deftype(ctx,
"Time",
8705 obj = deftype(ctx,
"ShortText",
8708 obj = deftype(ctx,
"Text",
8711 obj = deftype(ctx,
"LongText",
8714 obj = deftype(ctx,
"TokyoGeoPoint",
8717 obj = deftype(ctx,
"WGS84GeoPoint",
8720 for (
id = grn_db_curr_id(ctx, db) + 1;
id <
GRN_DB_MECAB;
id++) {
8724 #ifdef GRN_WITH_MECAB
8729 #ifdef GRN_WITH_MECAB
8734 for (
id = grn_db_curr_id(ctx, db) + 1;
id < 128;
id++) {
8746 #define MULTI_COLUMN_INDEXP(i) (DB_OBJ(i)->source_size > sizeof(grn_id))
8750 grn_obj **indexbuf,
int buf_size,
int *section)
8763 if (!lexicon) {
continue; }
8765 if (tokenizer) {
continue; }
8778 grn_obj **indexbuf,
int buf_size,
int *section)
8800 grn_obj **indexbuf,
int buf_size,
int *section)
8819 for (hooks =
DB_OBJ(obj)->hooks[hook_entry]; hooks; hooks = hooks->
next) {
8826 if (!lexicon) {
continue; }
8830 if (tokenizer) {
continue; }
8876 return is_valid_match_index(ctx, index_column);
8883 return is_valid_range_index(ctx, index_column);
8895 grn_id indexed_column_id;
8897 int i, n_source_ids;
8899 indexed_column_id =
DB_OBJ(indexed_column)->id;
8901 source_ids =
DB_OBJ(index_column)->source;
8902 n_source_ids =
DB_OBJ(index_column)->source_size /
sizeof(
grn_id);
8903 for (i = 0; i < n_source_ids; i++) {
8904 grn_id source_id = source_ids[
i];
8905 if (source_id == indexed_column_id) {
8917 grn_obj **indexbuf,
int buf_size,
8922 if (!is_valid_index(ctx, index_column, op)) {
8927 int specified_section;
8932 specified_section = find_section(ctx, index_column, a->
next->
obj);
8933 is_invalid_section = (specified_section == 0);
8934 if (is_invalid_section) {
8938 *section = specified_section;
8942 *indexbuf = index_column;
8950 grn_obj **indexbuf,
int buf_size,
int *section)
8963 return grn_column_index_accessor_index_column(ctx, a, op, indexbuf,
8982 for (hooks =
DB_OBJ(a->
obj)->hooks[entry]; hooks; hooks = hooks->
next) {
8990 if (!is_valid_index(ctx, target, op)) {
9015 grn_obj **indexbuf,
int buf_size,
int *section)
9022 n = grn_column_index_column_equal(ctx, obj, op,
9023 indexbuf, buf_size, section);
9031 n = grn_column_index_column_match(ctx, obj, op,
9032 indexbuf, buf_size, section);
9039 n = grn_column_index_column_range(ctx, obj, op,
9040 indexbuf, buf_size, section);
9049 if (buf_size) { indexbuf[n] = obj; }
9057 if (buf_size) { indexbuf[n] = obj; }
9070 if (buf_size) { indexbuf[n] = obj; }
9085 n = grn_column_index_accessor(ctx, obj, op, indexbuf, buf_size, section);
9096 tokenize(
const char *str,
size_t str_len,
const char **tokbuf,
int buf_size,
const char **rest)
9098 const char **tok = tokbuf, **tok_end = tokbuf + buf_size;
9100 const char *str_end = str + str_len;
9101 while (str < str_end && (
' ' == *str ||
',' == *str)) { str++; }
9103 if (str == str_end) {
9107 if (
' ' == *str ||
',' == *str) {
9110 if (tok == tok_end) {
break; }
9111 do { str++; }
while (str < str_end && (
' ' == *str ||
',' == *str));
9117 if (rest) { *rest = str; }
9118 return tok - tokbuf;
9123 const char *str,
unsigned int str_size,
grn_obj *res)
9126 const char *p = (
char *)str, *q, *r, *pe = p + str_size, *tokbuf[256];
9128 int i, n = tokenize(p, pe - p, tokbuf, 256, &q);
9129 for (i = 0; i < n; i++) {
9131 while (p < r && (
' ' == *p ||
',' == *p)) { p++; }
9155 grn_obj *target_table = table;
9157 target_table = a->
obj;
9160 p, r - p - 1, (
grn_obj *)cols);
9163 ac = accessor_new(ctx);
9169 ac->
next = accessor_new(ctx);
9170 if (!(ac = ac->
next)) {
break; }
9199 grn_table_sort_key_from_str_geo(
grn_ctx *ctx,
const char *str,
unsigned int str_size,
9200 grn_obj *table,
unsigned int *nkeys)
9202 const char **tokbuf;
9203 const char *p = str, *pe = str + str_size;
9205 while ((*p++ !=
'(')) {
if (p == pe) {
return NULL; } }
9207 while ((*p !=
')')) {
if (++p == pe) {
return NULL; } }
9210 if ((tokbuf =
GRN_MALLOCN(
const char *, str_size))) {
9212 int i, n = tokenize(str, str_size, tokbuf, str_size, NULL);
9215 for (i = 0; i < n; i++) {
9216 const char *r = tokbuf[
i];
9217 while (p < r && (
' ' == *p ||
',' == *p)) { p++; }
9223 }
else if (*p ==
'-') {
9230 (
int)(tokbuf[i] - p), p, str_size, str);
9250 if (!ctx->
rc && k - keys > 0) {
9262 grn_obj *table,
unsigned int *nkeys)
9264 const char *p = str;
9265 const char **tokbuf;
9267 if ((keys = grn_table_sort_key_from_str_geo(ctx, str, str_size, table, nkeys))) {
9270 if ((tokbuf =
GRN_MALLOCN(
const char *, str_size))) {
9271 int i, n = tokenize(str, str_size, tokbuf, str_size, NULL);
9274 for (i = 0; i < n; i++) {
9275 const char *r = tokbuf[
i];
9276 while (p < r && (
' ' == *p ||
',' == *p)) { p++; }
9282 }
else if (*p ==
'-') {
9289 if (r - p == 6 && memcmp(p,
"_score", 6) == 0) {
9291 "ignore invalid sort key: <%.*s>(<%.*s>)",
9292 (
int)(r - p), p, str_size, str);
9295 "invalid sort key: <%.*s>(<%.*s>)",
9296 (
int)(r - p), p, str_size, str);
9306 if (!ctx->
rc && k - keys > 0) {
9321 for (i = 0; i < nkeys; i++) {
9342 return DB_OBJ(table)->max_n_subrecs;
9349 const char *str,
unsigned int str_len,
9355 if (!(token =
grn_token_open(ctx, table, str, str_len, mode, 0))) {
9399 #define OPEN_BRACKET 0x40000000
9400 #define OPEN_BRACE 0x40000001
9415 for (len = 0; head < tail; head = values_next(ctx, head), len++) ;
9428 unsigned int result_boolean;
9432 if (!result_boolean) {
id = 0; }
9445 range_id =
DB_OBJ(column)->range;
9463 if (element == &record) {
GRN_OBJ_FIN(ctx, element); }
9464 v = values_next(ctx, v);
9472 grn_obj casted_element, *element = v;
9479 element = &casted_element;
9487 if (element == &casted_element) {
GRN_OBJ_FIN(ctx, element); }
9491 v = values_next(ctx, v);
9498 grn_obj casted_element, *element = v;
9505 element = &casted_element;
9510 if (element == &casted_element) {
GRN_OBJ_FIN(ctx, element); }
9511 v = values_next(ctx, v);
9520 name_equal(
const char *p,
unsigned int size,
const char *name)
9522 if (strlen(name) != size) {
return 0; }
9524 return !memcmp(p + 1, name + 1, size - 1);
9528 report_set_column_value_failure(
grn_ctx *ctx,
9530 const char *column_name,
9531 unsigned int column_name_size,
9534 grn_obj key_inspected, column_value_inspected;
9538 limited_size_inspect(ctx, &key_inspected, key);
9539 limited_size_inspect(ctx, &column_value_inspected, column_value);
9541 "[table][load] failed to set column value: %s: "
9542 "key: <%.*s>, column: <%.*s>, value: <%.*s>",
9569 ndata = values_len(ctx, value, ve);
9570 if (loader->
table) {
9575 if (loader->
key_offset != -1 && ndata == ncols + 1) {
9577 id = loader_add(ctx, key_value);
9580 grn_obj *key_column_name = NULL;
9585 (name_equal(column_name, column_name_size,
KEY_NAME) ||
9586 name_equal(column_name, column_name_size,
ID_NAME))) {
9589 "duplicated key columns: <%.*s> at %d and <%.*s> at %i",
9593 column_name_size, column_name, i);
9596 key_column_name = value;
9600 column_name, column_name_size);
9603 "nonexistent column: <%.*s>",
9604 column_name_size, column_name);
9616 (ndata == 0 || ndata == ncols)) {
9618 }
else if (!ncols) {
9624 column_name, column_name_size);
9627 "nonexistent column: <%.*s>",
9628 column_name_size, column_name);
9638 "column name must be string: <%.*s>",
9658 value = values_next(ctx, value);
9665 set_vector(ctx, column,
id, value);
9673 unsigned int column_name_size;
9674 column_name_size =
grn_obj_name(ctx, column, column_name,
9676 report_set_column_value_failure(ctx, key_value,
9677 column_name, column_name_size,
9681 value = values_next(ctx, value);
9711 if (loader->
table) {
9717 grn_obj *v, *key_column_name = NULL;
9718 for (v = value; v + 1 < ve; v = values_next(ctx, v)) {
9722 (name_equal(column_name, column_name_size,
KEY_NAME) ||
9723 name_equal(column_name, column_name_size,
ID_NAME))) {
9724 if (key_column_name) {
9728 column_name_size, column_name);
9731 key_column_name = value;
9734 id = loader_add(ctx, key_value);
9736 v = values_next(ctx, v);
9750 unsigned int name_size;
9751 while (value + 1 < ve) {
9773 set_vector(ctx, col,
id, value);
9780 report_set_column_value_failure(ctx, key_value,
9781 name, name_size, value);
9788 value = values_next(ctx, value);
9804 #define JSON_READ_OPEN_BRACKET() do {\
9805 GRN_UINT32_PUT(ctx, &loader->level, loader->values_size);\
9806 values_add(ctx, loader);\
9807 loader->last->header.domain = OPEN_BRACKET;\
9808 loader->stat = GRN_LOADER_TOKEN;\
9812 #define JSON_READ_OPEN_BRACE() do {\
9813 GRN_UINT32_PUT(ctx, &loader->level, loader->values_size);\
9814 values_add(ctx, loader);\
9815 loader->last->header.domain = OPEN_BRACE;\
9816 loader->stat = GRN_LOADER_TOKEN;\
9821 json_read(
grn_ctx *ctx,
grn_loader *loader,
const char *str,
unsigned int str_len)
9823 const char *
const beg = str;
9826 const char *se = str + str_len;
9829 switch (loader->
stat) {
9845 "JSON must start with '[' or '{': <%.*s>", str_len, beg);
9859 values_add(ctx, loader);
9875 bracket_close(ctx, loader);
9880 brace_close(ctx, loader);
9884 case '+' :
case '-' :
case '0' :
case '1' :
case '2' :
case '3' :
9885 case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
9887 values_add(ctx, loader);
9890 if ((
'A' <= c && c <=
'Z') || (
'a' <= c && c <=
'z') || (
'_' == c)) {
9892 values_add(ctx, loader);
9909 if ((
'A' <= c && c <=
'Z') || (
'a' <= c && c <=
'z') ||
9910 (
'0' <= c && c <=
'9') || (
'_' == c)) {
9942 case '+' :
case '-' :
case '.' :
case 'e' :
case 'E' :
9943 case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
9944 case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
9952 int64_t i =
grn_atoll(str, str_end, &cur);
9953 if (cur == str_end) {
9956 }
else if (cur != str) {
10036 case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
10037 case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
10038 loader->
unichar = (c -
'0') * 0x1000;
10040 case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' :
10041 loader->
unichar = (c -
'a' + 10) * 0x1000;
10043 case 'A' :
case 'B' :
case 'C' :
case 'D' :
case 'E' :
case 'F' :
10044 loader->
unichar = (c -
'A' + 10) * 0x1000;
10054 case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
10055 case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
10056 loader->
unichar += (c -
'0') * 0x100;
10058 case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' :
10059 loader->
unichar += (c -
'a' + 10) * 0x100;
10061 case 'A' :
case 'B' :
case 'C' :
case 'D' :
case 'E' :
case 'F' :
10062 loader->
unichar += (c -
'A' + 10) * 0x100;
10072 case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
10073 case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
10074 loader->
unichar += (c -
'0') * 0x10;
10076 case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' :
10077 loader->
unichar += (c -
'a' + 10) * 0x10;
10079 case 'A' :
case 'B' :
case 'C' :
case 'D' :
case 'E' :
case 'F' :
10080 loader->
unichar += (c -
'A' + 10) * 0x10;
10090 case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
10091 case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
10092 loader->
unichar += (c -
'0');
10094 case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' :
10095 loader->
unichar += (c -
'a' + 10);
10097 case 'A' :
case 'B' :
case 'C' :
case 'D' :
case 'E' :
case 'F' :
10098 loader->
unichar += (c -
'A' + 10);
10104 uint32_t u = loader->
unichar;
10127 #undef JSON_READ_OPEN_BRACKET
10128 #undef JSON_READ_OPEN_BRACE
10132 const char *str,
unsigned int str_size,
grn_obj *res)
10134 const char *p = (
char *)str, *q, *r, *pe = p + str_size, *tokbuf[256];
10136 int i, n = tokenize(p, pe - p, tokbuf, 256, &q);
10137 for (i = 0; i < n; i++) {
10140 while (p < r && (
' ' == *p ||
',' == *p)) { p++; }
10159 const char *table,
unsigned int table_len,
10160 const char *columns,
unsigned int columns_len,
10161 const char *values,
unsigned int values_len,
10162 const char *ifexists,
unsigned int ifexists_len,
10163 const char *each,
unsigned int each_len,
10164 uint32_t emit_level)
10175 if (table && table_len) {
10184 if (!loader->
table) {
10189 if (loader->
table && columns && columns_len) {
10194 if (parse_load_columns(ctx, loader->
table, columns, columns_len,
10195 &parsed_columns)) {
10200 for (i = 0; i < n_columns; i++) {
10213 if (ifexists && ifexists_len) {
10222 if (each && each_len) {
10225 if (loader->
each && v) {
10232 if (!loader->
table) {
10239 switch (input_type) {
10241 json_read(ctx, loader, values, values_len);
10255 const char *table,
unsigned int table_len,
10256 const char *columns,
unsigned int columns_len,
10257 const char *values,
unsigned int values_len,
10258 const char *ifexists,
unsigned int ifexists_len,
10259 const char *each,
unsigned int each_len)
10261 if (!ctx || !ctx->
impl) {
10266 grn_load_(ctx, input_type, table, table_len,
10267 columns, columns_len, values, values_len,
10268 ifexists, ifexists_len, each, each_len, 1);