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