1 /* 2 Copyright(C) 2009-2016 Brazil 3 4 This library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 This library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with this library; if not, write to the Free Software 16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA 17 */ 18 19 #pragma once 20 21 #ifdef __cplusplus 22 extern "C" { 23 #endif 24 25 #define GRN_TABLE_MAX_KEY_SIZE (0x1000) 26 27 GRN_API grn_obj *grn_table_create(grn_ctx *ctx, 28 const char *name, unsigned int name_size, 29 const char *path, grn_table_flags flags, 30 grn_obj *key_type, grn_obj *value_type); 31 32 #define GRN_TABLE_OPEN_OR_CREATE(ctx,name,name_size,path,flags,key_type,value_type,table) \ 33 (((table) = grn_ctx_get((ctx), (name), (name_size))) ||\ 34 ((table) = grn_table_create((ctx), (name), (name_size), (path), (flags), (key_type), (value_type)))) 35 36 /* TODO: int *added -> grn_bool *added */ 37 GRN_API grn_id grn_table_add(grn_ctx *ctx, grn_obj *table, 38 const void *key, unsigned int key_size, int *added); 39 GRN_API grn_id grn_table_get(grn_ctx *ctx, grn_obj *table, 40 const void *key, unsigned int key_size); 41 GRN_API grn_id grn_table_at(grn_ctx *ctx, grn_obj *table, grn_id id); 42 GRN_API grn_id grn_table_lcp_search(grn_ctx *ctx, grn_obj *table, 43 const void *key, unsigned int key_size); 44 GRN_API int grn_table_get_key(grn_ctx *ctx, grn_obj *table, 45 grn_id id, void *keybuf, int buf_size); 46 GRN_API grn_rc grn_table_delete(grn_ctx *ctx, grn_obj *table, 47 const void *key, unsigned int key_size); 48 GRN_API grn_rc grn_table_delete_by_id(grn_ctx *ctx, grn_obj *table, grn_id id); 49 GRN_API grn_rc grn_table_update_by_id(grn_ctx *ctx, grn_obj *table, grn_id id, 50 const void *dest_key, unsigned int dest_key_size); 51 GRN_API grn_rc grn_table_update(grn_ctx *ctx, grn_obj *table, 52 const void *src_key, unsigned int src_key_size, 53 const void *dest_key, unsigned int dest_key_size); 54 GRN_API grn_rc grn_table_truncate(grn_ctx *ctx, grn_obj *table); 55 56 #define GRN_CURSOR_ASCENDING (0x00<<0) 57 #define GRN_CURSOR_DESCENDING (0x01<<0) 58 #define GRN_CURSOR_GE (0x00<<1) 59 #define GRN_CURSOR_GT (0x01<<1) 60 #define GRN_CURSOR_LE (0x00<<2) 61 #define GRN_CURSOR_LT (0x01<<2) 62 #define GRN_CURSOR_BY_KEY (0x00<<3) 63 #define GRN_CURSOR_BY_ID (0x01<<3) 64 #define GRN_CURSOR_PREFIX (0x01<<4) 65 #define GRN_CURSOR_SIZE_BY_BIT (0x01<<5) 66 #define GRN_CURSOR_RK (0x01<<6) 67 68 GRN_API grn_table_cursor *grn_table_cursor_open(grn_ctx *ctx, grn_obj *table, 69 const void *min, unsigned int min_size, 70 const void *max, unsigned int max_size, 71 int offset, int limit, int flags); 72 GRN_API grn_rc grn_table_cursor_close(grn_ctx *ctx, grn_table_cursor *tc); 73 GRN_API grn_id grn_table_cursor_next(grn_ctx *ctx, grn_table_cursor *tc); 74 GRN_API int grn_table_cursor_get_key(grn_ctx *ctx, grn_table_cursor *tc, void **key); 75 GRN_API int grn_table_cursor_get_value(grn_ctx *ctx, grn_table_cursor *tc, void **value); 76 GRN_API grn_rc grn_table_cursor_set_value(grn_ctx *ctx, grn_table_cursor *tc, 77 const void *value, int flags); 78 GRN_API grn_rc grn_table_cursor_delete(grn_ctx *ctx, grn_table_cursor *tc); 79 GRN_API grn_obj *grn_table_cursor_table(grn_ctx *ctx, grn_table_cursor *tc); 80 81 GRN_API grn_obj *grn_index_cursor_open(grn_ctx *ctx, grn_table_cursor *tc, grn_obj *index, 82 grn_id rid_min, grn_id rid_max, int flags); 83 GRN_API grn_posting *grn_index_cursor_next(grn_ctx *ctx, grn_obj *ic, grn_id *tid); 84 85 #define GRN_TABLE_EACH(ctx,table,head,tail,id,key,key_size,value,block) do {\ 86 (ctx)->errlvl = GRN_LOG_NOTICE;\ 87 (ctx)->rc = GRN_SUCCESS;\ 88 if ((ctx)->seqno & 1) {\ 89 (ctx)->subno++;\ 90 } else {\ 91 (ctx)->seqno++;\ 92 }\ 93 if (table) {\ 94 switch ((table)->header.type) {\ 95 case GRN_TABLE_PAT_KEY :\ 96 GRN_PAT_EACH((ctx), (grn_pat *)(table), (id), (key), (key_size), (value), block);\ 97 break;\ 98 case GRN_TABLE_DAT_KEY :\ 99 GRN_DAT_EACH((ctx), (grn_dat *)(table), (id), (key), (key_size), block);\ 100 break;\ 101 case GRN_TABLE_HASH_KEY :\ 102 GRN_HASH_EACH((ctx), (grn_hash *)(table), (id), (key), (key_size), (value), block);\ 103 break;\ 104 case GRN_TABLE_NO_KEY :\ 105 GRN_ARRAY_EACH((ctx), (grn_array *)(table), (head), (tail), (id), (value), block);\ 106 break;\ 107 }\ 108 }\ 109 if ((ctx)->subno) {\ 110 (ctx)->subno--;\ 111 } else {\ 112 (ctx)->seqno++;\ 113 }\ 114 } while (0) 115 116 #define GRN_TABLE_EACH_BEGIN(ctx, table, cursor, id) do {\ 117 if ((table)) {\ 118 grn_table_cursor *cursor;\ 119 cursor = grn_table_cursor_open((ctx), (table),\ 120 NULL, 0,\ 121 NULL, 0,\ 122 0, -1, GRN_CURSOR_ASCENDING);\ 123 if (cursor) {\ 124 grn_id id;\ 125 while ((id = grn_table_cursor_next((ctx), cursor))) { 126 127 #define GRN_TABLE_EACH_BEGIN_FLAGS(ctx, table, cursor, id, flags) do {\ 128 if ((table)) {\ 129 grn_table_cursor *cursor;\ 130 cursor = grn_table_cursor_open((ctx), (table),\ 131 NULL, 0,\ 132 NULL, 0,\ 133 0, -1, (flags));\ 134 if (cursor) {\ 135 grn_id id;\ 136 while ((id = grn_table_cursor_next((ctx), cursor))) { 137 138 #define GRN_TABLE_EACH_BEGIN_MIN(ctx, table, cursor, id,\ 139 min, min_size, flags) do {\ 140 if ((table)) {\ 141 grn_table_cursor *cursor;\ 142 cursor = grn_table_cursor_open((ctx), (table),\ 143 (min), (min_size),\ 144 NULL, 0,\ 145 0, -1, (flags));\ 146 if (cursor) {\ 147 grn_id id;\ 148 while ((id = grn_table_cursor_next((ctx), cursor))) { 149 150 #define GRN_TABLE_EACH_END(ctx, cursor)\ 151 }\ 152 grn_table_cursor_close((ctx), cursor);\ 153 }\ 154 }\ 155 } while (0) 156 157 typedef struct _grn_table_sort_key grn_table_sort_key; 158 typedef unsigned char grn_table_sort_flags; 159 160 #define GRN_TABLE_SORT_ASC (0x00<<0) 161 #define GRN_TABLE_SORT_DESC (0x01<<0) 162 163 struct _grn_table_sort_key { 164 grn_obj *key; 165 grn_table_sort_flags flags; 166 int offset; 167 }; 168 169 GRN_API int grn_table_sort(grn_ctx *ctx, grn_obj *table, int offset, int limit, 170 grn_obj *result, grn_table_sort_key *keys, int n_keys); 171 172 typedef struct _grn_table_group_result grn_table_group_result; 173 typedef uint32_t grn_table_group_flags; 174 175 #define GRN_TABLE_GROUP_CALC_COUNT (0x01<<3) 176 #define GRN_TABLE_GROUP_CALC_MAX (0x01<<4) 177 #define GRN_TABLE_GROUP_CALC_MIN (0x01<<5) 178 #define GRN_TABLE_GROUP_CALC_SUM (0x01<<6) 179 #define GRN_TABLE_GROUP_CALC_AVG (0x01<<7) 180 181 struct _grn_table_group_result { 182 grn_obj *table; 183 unsigned char key_begin; 184 unsigned char key_end; 185 int limit; 186 grn_table_group_flags flags; 187 grn_operator op; 188 unsigned int max_n_subrecs; 189 grn_obj *calc_target; 190 }; 191 192 GRN_API grn_rc grn_table_group(grn_ctx *ctx, grn_obj *table, 193 grn_table_sort_key *keys, int n_keys, 194 grn_table_group_result *results, int n_results); 195 GRN_API grn_rc grn_table_setoperation(grn_ctx *ctx, grn_obj *table1, grn_obj *table2, 196 grn_obj *res, grn_operator op); 197 GRN_API grn_rc grn_table_difference(grn_ctx *ctx, grn_obj *table1, grn_obj *table2, 198 grn_obj *res1, grn_obj *res2); 199 GRN_API int grn_table_columns(grn_ctx *ctx, grn_obj *table, 200 const char *name, unsigned int name_size, 201 grn_obj *res); 202 203 GRN_API unsigned int grn_table_size(grn_ctx *ctx, grn_obj *table); 204 205 GRN_API grn_rc grn_table_rename(grn_ctx *ctx, grn_obj *table, 206 const char *name, unsigned int name_size); 207 208 GRN_API grn_obj *grn_table_select(grn_ctx *ctx, grn_obj *table, grn_obj *expr, 209 grn_obj *res, grn_operator op); 210 211 GRN_API grn_table_sort_key *grn_table_sort_key_from_str(grn_ctx *ctx, 212 const char *str, unsigned int str_size, 213 grn_obj *table, unsigned int *nkeys); 214 GRN_API grn_rc grn_table_sort_key_close(grn_ctx *ctx, 215 grn_table_sort_key *keys, unsigned int nkeys); 216 217 GRN_API grn_bool grn_table_is_grouped(grn_ctx *ctx, grn_obj *table); 218 219 GRN_API unsigned int grn_table_max_n_subrecs(grn_ctx *ctx, grn_obj *table); 220 221 GRN_API grn_obj *grn_table_create_for_group(grn_ctx *ctx, 222 const char *name, 223 unsigned int name_size, 224 const char *path, 225 grn_obj *group_key, 226 grn_obj *value_type, 227 unsigned int max_n_subrecs); 228 229 GRN_API unsigned int grn_table_get_subrecs(grn_ctx *ctx, grn_obj *table, 230 grn_id id, grn_id *subrecbuf, 231 int *scorebuf, int buf_size); 232 233 GRN_API grn_obj *grn_table_tokenize(grn_ctx *ctx, grn_obj *table, 234 const char *str, unsigned int str_len, 235 grn_obj *buf, grn_bool addp); 236 237 GRN_API grn_rc grn_table_apply_expr(grn_ctx *ctx, 238 grn_obj *table, 239 grn_obj *output_column, 240 grn_obj *expr); 241 242 GRN_API grn_id grn_table_find_reference_object(grn_ctx *ctx, grn_obj *table); 243 244 #ifdef __cplusplus 245 } 246 #endif 247