1 /*
2   Copyright(C) 2009-2018  Brazil
3   Copyright(C) 2018-2022  Sutou Kouhei <kou@clear-code.com>
4 
5   This library is free software; you can redistribute it and/or
6   modify it under the terms of the GNU Lesser General Public
7   License as published by the Free Software Foundation; either
8   version 2.1 of the License, or (at your option) any later version.
9 
10   This library is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   Lesser General Public License for more details.
14 
15   You should have received a copy of the GNU Lesser General Public
16   License along with this library; if not, write to the Free Software
17   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18 */
19 module groonga_d.groonga;
20 
21 
22 private static import core.stdc.config;
23 private static import core.stdc.stdarg;
24 private static import core.sys.posix.sys.types;
25 
26 extern(C):
27 nothrow @nogc:
28 
29 //ToDo: temp
30 version (Windows) {
31 	alias off_t = core.stdc.config.c_ulong;
32 } else {
33 	alias off_t = core.sys.posix.sys.types.off_t;
34 }
35 
36 /+
37 #ifndef GRN_API
38 # if defined(_WIN32) || defined(_WIN64)
39 #  define GRN_API __declspec(dllimport)
40 # else
41 #  define GRN_API
42 # endif /* defined(_WIN32) || defined(_WIN64) */
43 #endif /* GRN_API */
44 +/
45 
46 alias grn_id = uint;
47 /* Deprecated since 9.0.2. Use bool directly. */
48 deprecated alias grn_bool = bool;
49 
50 enum GRN_ID_NIL = 0x00;
51 enum GRN_ID_MAX = 0x3FFFFFFF;
52 
53 enum GRN_TRUE = true;
54 enum GRN_FALSE = false;
55 
56 enum grn_rc
57 {
58 	GRN_SUCCESS = 0,
59 	GRN_END_OF_DATA = 1,
60 	GRN_UNKNOWN_ERROR = -1,
61 	GRN_OPERATION_NOT_PERMITTED = -2,
62 	GRN_NO_SUCH_FILE_OR_DIRECTORY = -3,
63 	GRN_NO_SUCH_PROCESS = -4,
64 	GRN_INTERRUPTED_FUNCTION_CALL = -5,
65 	GRN_INPUT_OUTPUT_ERROR = -6,
66 	GRN_NO_SUCH_DEVICE_OR_ADDRESS = -7,
67 	GRN_ARG_LIST_TOO_LONG = -8,
68 	GRN_EXEC_FORMAT_ERROR = -9,
69 	GRN_BAD_FILE_DESCRIPTOR = -10,
70 	GRN_NO_CHILD_PROCESSES = -11,
71 	GRN_RESOURCE_TEMPORARILY_UNAVAILABLE = -12,
72 	GRN_NOT_ENOUGH_SPACE = -13,
73 	GRN_PERMISSION_DENIED = -14,
74 	GRN_BAD_ADDRESS = -15,
75 	GRN_RESOURCE_BUSY = -16,
76 	GRN_FILE_EXISTS = -17,
77 	GRN_IMPROPER_LINK = -18,
78 	GRN_NO_SUCH_DEVICE = -19,
79 	GRN_NOT_A_DIRECTORY = -20,
80 	GRN_IS_A_DIRECTORY = -21,
81 	GRN_INVALID_ARGUMENT = -22,
82 	GRN_TOO_MANY_OPEN_FILES_IN_SYSTEM = -23,
83 	GRN_TOO_MANY_OPEN_FILES = -24,
84 	GRN_INAPPROPRIATE_I_O_CONTROL_OPERATION = -25,
85 	GRN_FILE_TOO_LARGE = -26,
86 	GRN_NO_SPACE_LEFT_ON_DEVICE = -27,
87 	GRN_INVALID_SEEK = -28,
88 	GRN_READ_ONLY_FILE_SYSTEM = -29,
89 	GRN_TOO_MANY_LINKS = -30,
90 	GRN_BROKEN_PIPE = -31,
91 	GRN_DOMAIN_ERROR = -32,
92 	GRN_RESULT_TOO_LARGE = -33,
93 	GRN_RESOURCE_DEADLOCK_AVOIDED = -34,
94 	GRN_NO_MEMORY_AVAILABLE = -35,
95 	GRN_FILENAME_TOO_LONG = -36,
96 	GRN_NO_LOCKS_AVAILABLE = -37,
97 	GRN_FUNCTION_NOT_IMPLEMENTED = -38,
98 	GRN_DIRECTORY_NOT_EMPTY = -39,
99 	GRN_ILLEGAL_BYTE_SEQUENCE = -40,
100 	GRN_SOCKET_NOT_INITIALIZED = -41,
101 	GRN_OPERATION_WOULD_BLOCK = -42,
102 	GRN_ADDRESS_IS_NOT_AVAILABLE = -43,
103 	GRN_NETWORK_IS_DOWN = -44,
104 	GRN_NO_BUFFER = -45,
105 	GRN_SOCKET_IS_ALREADY_CONNECTED = -46,
106 	GRN_SOCKET_IS_NOT_CONNECTED = -47,
107 	GRN_SOCKET_IS_ALREADY_SHUTDOWNED = -48,
108 	GRN_OPERATION_TIMEOUT = -49,
109 	GRN_CONNECTION_REFUSED = -50,
110 	GRN_RANGE_ERROR = -51,
111 	GRN_TOKENIZER_ERROR = -52,
112 	GRN_FILE_CORRUPT = -53,
113 	GRN_INVALID_FORMAT = -54,
114 	GRN_OBJECT_CORRUPT = -55,
115 	GRN_TOO_MANY_SYMBOLIC_LINKS = -56,
116 	GRN_NOT_SOCKET = -57,
117 	GRN_OPERATION_NOT_SUPPORTED = -58,
118 	GRN_ADDRESS_IS_IN_USE = -59,
119 	GRN_ZLIB_ERROR = -60,
120 	GRN_LZ4_ERROR = -61,
121 
122 	/**
123 	 * Just for backward compatibility. We'll remove it at 5.0.0.
124 	 */
125 	GRN_LZO_ERROR = GRN_LZ4_ERROR,
126 
127 	GRN_STACK_OVER_FLOW = -62,
128 	GRN_SYNTAX_ERROR = -63,
129 	GRN_RETRY_MAX = -64,
130 	GRN_INCOMPATIBLE_FILE_FORMAT = -65,
131 	GRN_UPDATE_NOT_ALLOWED = -66,
132 	GRN_TOO_SMALL_OFFSET = -67,
133 	GRN_TOO_LARGE_OFFSET = -68,
134 	GRN_TOO_SMALL_LIMIT = -69,
135 	GRN_CAS_ERROR = -70,
136 	GRN_UNSUPPORTED_COMMAND_VERSION = -71,
137 	GRN_NORMALIZER_ERROR = -72,
138 	GRN_TOKEN_FILTER_ERROR = -73,
139 	GRN_COMMAND_ERROR = -74,
140 	GRN_PLUGIN_ERROR = -75,
141 	GRN_SCORER_ERROR = -76,
142 	GRN_CANCEL = -77,
143 	GRN_WINDOW_FUNCTION_ERROR = -78,
144 	GRN_ZSTD_ERROR = -79,
145 	GRN_CONNECTION_RESET = -80,
146 }
147 
148 //Declaration name in C language
149 enum
150 {
151 	GRN_SUCCESS = .grn_rc.GRN_SUCCESS,
152 	GRN_END_OF_DATA = .grn_rc.GRN_END_OF_DATA,
153 	GRN_UNKNOWN_ERROR = .grn_rc.GRN_UNKNOWN_ERROR,
154 	GRN_OPERATION_NOT_PERMITTED = .grn_rc.GRN_OPERATION_NOT_PERMITTED,
155 	GRN_NO_SUCH_FILE_OR_DIRECTORY = .grn_rc.GRN_NO_SUCH_FILE_OR_DIRECTORY,
156 	GRN_NO_SUCH_PROCESS = .grn_rc.GRN_NO_SUCH_PROCESS,
157 	GRN_INTERRUPTED_FUNCTION_CALL = .grn_rc.GRN_INTERRUPTED_FUNCTION_CALL,
158 	GRN_INPUT_OUTPUT_ERROR = .grn_rc.GRN_INPUT_OUTPUT_ERROR,
159 	GRN_NO_SUCH_DEVICE_OR_ADDRESS = .grn_rc.GRN_NO_SUCH_DEVICE_OR_ADDRESS,
160 	GRN_ARG_LIST_TOO_LONG = .grn_rc.GRN_ARG_LIST_TOO_LONG,
161 	GRN_EXEC_FORMAT_ERROR = .grn_rc.GRN_EXEC_FORMAT_ERROR,
162 	GRN_BAD_FILE_DESCRIPTOR = .grn_rc.GRN_BAD_FILE_DESCRIPTOR,
163 	GRN_NO_CHILD_PROCESSES = .grn_rc.GRN_NO_CHILD_PROCESSES,
164 	GRN_RESOURCE_TEMPORARILY_UNAVAILABLE = .grn_rc.GRN_RESOURCE_TEMPORARILY_UNAVAILABLE,
165 	GRN_NOT_ENOUGH_SPACE = .grn_rc.GRN_NOT_ENOUGH_SPACE,
166 	GRN_PERMISSION_DENIED = .grn_rc.GRN_PERMISSION_DENIED,
167 	GRN_BAD_ADDRESS = .grn_rc.GRN_BAD_ADDRESS,
168 	GRN_RESOURCE_BUSY = .grn_rc.GRN_RESOURCE_BUSY,
169 	GRN_FILE_EXISTS = .grn_rc.GRN_FILE_EXISTS,
170 	GRN_IMPROPER_LINK = .grn_rc.GRN_IMPROPER_LINK,
171 	GRN_NO_SUCH_DEVICE = .grn_rc.GRN_NO_SUCH_DEVICE,
172 	GRN_NOT_A_DIRECTORY = .grn_rc.GRN_NOT_A_DIRECTORY,
173 	GRN_IS_A_DIRECTORY = .grn_rc.GRN_IS_A_DIRECTORY,
174 	GRN_INVALID_ARGUMENT = .grn_rc.GRN_INVALID_ARGUMENT,
175 	GRN_TOO_MANY_OPEN_FILES_IN_SYSTEM = .grn_rc.GRN_TOO_MANY_OPEN_FILES_IN_SYSTEM,
176 	GRN_TOO_MANY_OPEN_FILES = .grn_rc.GRN_TOO_MANY_OPEN_FILES,
177 	GRN_INAPPROPRIATE_I_O_CONTROL_OPERATION = .grn_rc.GRN_INAPPROPRIATE_I_O_CONTROL_OPERATION,
178 	GRN_FILE_TOO_LARGE = .grn_rc.GRN_FILE_TOO_LARGE,
179 	GRN_NO_SPACE_LEFT_ON_DEVICE = .grn_rc.GRN_NO_SPACE_LEFT_ON_DEVICE,
180 	GRN_INVALID_SEEK = .grn_rc.GRN_INVALID_SEEK,
181 	GRN_READ_ONLY_FILE_SYSTEM = .grn_rc.GRN_READ_ONLY_FILE_SYSTEM,
182 	GRN_TOO_MANY_LINKS = .grn_rc.GRN_TOO_MANY_LINKS,
183 	GRN_BROKEN_PIPE = .grn_rc.GRN_BROKEN_PIPE,
184 	GRN_DOMAIN_ERROR = .grn_rc.GRN_DOMAIN_ERROR,
185 	GRN_RESULT_TOO_LARGE = .grn_rc.GRN_RESULT_TOO_LARGE,
186 	GRN_RESOURCE_DEADLOCK_AVOIDED = .grn_rc.GRN_RESOURCE_DEADLOCK_AVOIDED,
187 	GRN_NO_MEMORY_AVAILABLE = .grn_rc.GRN_NO_MEMORY_AVAILABLE,
188 	GRN_FILENAME_TOO_LONG = .grn_rc.GRN_FILENAME_TOO_LONG,
189 	GRN_NO_LOCKS_AVAILABLE = .grn_rc.GRN_NO_LOCKS_AVAILABLE,
190 	GRN_FUNCTION_NOT_IMPLEMENTED = .grn_rc.GRN_FUNCTION_NOT_IMPLEMENTED,
191 	GRN_DIRECTORY_NOT_EMPTY = .grn_rc.GRN_DIRECTORY_NOT_EMPTY,
192 	GRN_ILLEGAL_BYTE_SEQUENCE = .grn_rc.GRN_ILLEGAL_BYTE_SEQUENCE,
193 	GRN_SOCKET_NOT_INITIALIZED = .grn_rc.GRN_SOCKET_NOT_INITIALIZED,
194 	GRN_OPERATION_WOULD_BLOCK = .grn_rc.GRN_OPERATION_WOULD_BLOCK,
195 	GRN_ADDRESS_IS_NOT_AVAILABLE = .grn_rc.GRN_ADDRESS_IS_NOT_AVAILABLE,
196 	GRN_NETWORK_IS_DOWN = .grn_rc.GRN_NETWORK_IS_DOWN,
197 	GRN_NO_BUFFER = .grn_rc.GRN_NO_BUFFER,
198 	GRN_SOCKET_IS_ALREADY_CONNECTED = .grn_rc.GRN_SOCKET_IS_ALREADY_CONNECTED,
199 	GRN_SOCKET_IS_NOT_CONNECTED = .grn_rc.GRN_SOCKET_IS_NOT_CONNECTED,
200 	GRN_SOCKET_IS_ALREADY_SHUTDOWNED = .grn_rc.GRN_SOCKET_IS_ALREADY_SHUTDOWNED,
201 	GRN_OPERATION_TIMEOUT = .grn_rc.GRN_OPERATION_TIMEOUT,
202 	GRN_CONNECTION_REFUSED = .grn_rc.GRN_CONNECTION_REFUSED,
203 	GRN_RANGE_ERROR = .grn_rc.GRN_RANGE_ERROR,
204 	GRN_TOKENIZER_ERROR = .grn_rc.GRN_TOKENIZER_ERROR,
205 	GRN_FILE_CORRUPT = .grn_rc.GRN_FILE_CORRUPT,
206 	GRN_INVALID_FORMAT = .grn_rc.GRN_INVALID_FORMAT,
207 	GRN_OBJECT_CORRUPT = .grn_rc.GRN_OBJECT_CORRUPT,
208 	GRN_TOO_MANY_SYMBOLIC_LINKS = .grn_rc.GRN_TOO_MANY_SYMBOLIC_LINKS,
209 	GRN_NOT_SOCKET = .grn_rc.GRN_NOT_SOCKET,
210 	GRN_OPERATION_NOT_SUPPORTED = .grn_rc.GRN_OPERATION_NOT_SUPPORTED,
211 	GRN_ADDRESS_IS_IN_USE = .grn_rc.GRN_ADDRESS_IS_IN_USE,
212 	GRN_ZLIB_ERROR = .grn_rc.GRN_ZLIB_ERROR,
213 	GRN_LZ4_ERROR = .grn_rc.GRN_LZ4_ERROR,
214 	GRN_LZO_ERROR = .grn_rc.GRN_LZO_ERROR,
215 	GRN_STACK_OVER_FLOW = .grn_rc.GRN_STACK_OVER_FLOW,
216 	GRN_SYNTAX_ERROR = .grn_rc.GRN_SYNTAX_ERROR,
217 	GRN_RETRY_MAX = .grn_rc.GRN_RETRY_MAX,
218 	GRN_INCOMPATIBLE_FILE_FORMAT = .grn_rc.GRN_INCOMPATIBLE_FILE_FORMAT,
219 	GRN_UPDATE_NOT_ALLOWED = .grn_rc.GRN_UPDATE_NOT_ALLOWED,
220 	GRN_TOO_SMALL_OFFSET = .grn_rc.GRN_TOO_SMALL_OFFSET,
221 	GRN_TOO_LARGE_OFFSET = .grn_rc.GRN_TOO_LARGE_OFFSET,
222 	GRN_TOO_SMALL_LIMIT = .grn_rc.GRN_TOO_SMALL_LIMIT,
223 	GRN_CAS_ERROR = .grn_rc.GRN_CAS_ERROR,
224 	GRN_UNSUPPORTED_COMMAND_VERSION = .grn_rc.GRN_UNSUPPORTED_COMMAND_VERSION,
225 	GRN_NORMALIZER_ERROR = .grn_rc.GRN_NORMALIZER_ERROR,
226 	GRN_TOKEN_FILTER_ERROR = .grn_rc.GRN_TOKEN_FILTER_ERROR,
227 	GRN_COMMAND_ERROR = .grn_rc.GRN_COMMAND_ERROR,
228 	GRN_PLUGIN_ERROR = .grn_rc.GRN_PLUGIN_ERROR,
229 	GRN_SCORER_ERROR = .grn_rc.GRN_SCORER_ERROR,
230 	GRN_CANCEL = .grn_rc.GRN_CANCEL,
231 	GRN_WINDOW_FUNCTION_ERROR = .grn_rc.GRN_WINDOW_FUNCTION_ERROR,
232 	GRN_ZSTD_ERROR = .grn_rc.GRN_ZSTD_ERROR,
233 	GRN_CONNECTION_RESET = .grn_rc.GRN_CONNECTION_RESET,
234 }
235 
236 //GRN_API
237 .grn_rc grn_init();
238 
239 //GRN_API
240 .grn_rc grn_fin();
241 
242 //GRN_API
243 const (char)* grn_get_global_error_message();
244 
245 enum grn_encoding
246 {
247 	GRN_ENC_DEFAULT = 0,
248 	GRN_ENC_NONE,
249 	GRN_ENC_EUC_JP,
250 	GRN_ENC_UTF8,
251 	GRN_ENC_SJIS,
252 	GRN_ENC_LATIN1,
253 	GRN_ENC_KOI8R,
254 }
255 
256 //Declaration name in C language
257 enum
258 {
259 	GRN_ENC_DEFAULT = .grn_encoding.GRN_ENC_DEFAULT,
260 	GRN_ENC_NONE = .grn_encoding.GRN_ENC_NONE,
261 	GRN_ENC_EUC_JP = .grn_encoding.GRN_ENC_EUC_JP,
262 	GRN_ENC_UTF8 = .grn_encoding.GRN_ENC_UTF8,
263 	GRN_ENC_SJIS = .grn_encoding.GRN_ENC_SJIS,
264 	GRN_ENC_LATIN1 = .grn_encoding.GRN_ENC_LATIN1,
265 	GRN_ENC_KOI8R = .grn_encoding.GRN_ENC_KOI8R,
266 }
267 
268 enum grn_command_version
269 {
270 	GRN_COMMAND_VERSION_DEFAULT = 0,
271 	GRN_COMMAND_VERSION_1,
272 	GRN_COMMAND_VERSION_2,
273 	GRN_COMMAND_VERSION_3,
274 }
275 
276 //Declaration name in C language
277 enum
278 {
279 	GRN_COMMAND_VERSION_DEFAULT = .grn_command_version.GRN_COMMAND_VERSION_DEFAULT,
280 	GRN_COMMAND_VERSION_1 = .grn_command_version.GRN_COMMAND_VERSION_1,
281 	GRN_COMMAND_VERSION_2 = .grn_command_version.GRN_COMMAND_VERSION_2,
282 	GRN_COMMAND_VERSION_3 = .grn_command_version.GRN_COMMAND_VERSION_3,
283 }
284 
285 enum GRN_COMMAND_VERSION_MIN = .grn_command_version.GRN_COMMAND_VERSION_1;
286 enum GRN_COMMAND_VERSION_STABLE = .grn_command_version.GRN_COMMAND_VERSION_1;
287 enum GRN_COMMAND_VERSION_MAX = .grn_command_version.GRN_COMMAND_VERSION_3;
288 
289 enum grn_log_level
290 {
291 	GRN_LOG_NONE = 0,
292 	GRN_LOG_EMERG,
293 	GRN_LOG_ALERT,
294 	GRN_LOG_CRIT,
295 	GRN_LOG_ERROR,
296 	GRN_LOG_WARNING,
297 	GRN_LOG_NOTICE,
298 	GRN_LOG_INFO,
299 	GRN_LOG_DEBUG,
300 	GRN_LOG_DUMP,
301 }
302 
303 //Declaration name in C language
304 enum
305 {
306 	//GRN_LOG_NONE = .grn_log_level.GRN_LOG_NONE,
307 	GRN_LOG_EMERG = .grn_log_level.GRN_LOG_EMERG,
308 	GRN_LOG_ALERT = .grn_log_level.GRN_LOG_ALERT,
309 	GRN_LOG_CRIT = .grn_log_level.GRN_LOG_CRIT,
310 	GRN_LOG_ERROR = .grn_log_level.GRN_LOG_ERROR,
311 	GRN_LOG_WARNING = .grn_log_level.GRN_LOG_WARNING,
312 	GRN_LOG_NOTICE = .grn_log_level.GRN_LOG_NOTICE,
313 	GRN_LOG_INFO = .grn_log_level.GRN_LOG_INFO,
314 	GRN_LOG_DEBUG = .grn_log_level.GRN_LOG_DEBUG,
315 	GRN_LOG_DUMP = .grn_log_level.GRN_LOG_DUMP,
316 }
317 
318 //GRN_API
319 const (char)* grn_log_level_to_string(.grn_log_level level);
320 
321 //GRN_API
322 .grn_bool grn_log_level_parse(const (char)* string_, .grn_log_level* level);
323 
324 /* query log flags */
325 enum GRN_QUERY_LOG_NONE = 0x00;
326 enum GRN_QUERY_LOG_COMMAND = 0x01 << 0;
327 enum GRN_QUERY_LOG_RESULT_CODE = 0x01 << 1;
328 enum GRN_QUERY_LOG_DESTINATION = 0x01 << 2;
329 enum GRN_QUERY_LOG_CACHE = 0x01 << 3;
330 enum GRN_QUERY_LOG_SIZE = 0x01 << 4;
331 enum GRN_QUERY_LOG_SCORE = 0x01 << 5;
332 enum GRN_QUERY_LOG_ALL = .GRN_QUERY_LOG_COMMAND | .GRN_QUERY_LOG_RESULT_CODE | .GRN_QUERY_LOG_DESTINATION | .GRN_QUERY_LOG_CACHE | .GRN_QUERY_LOG_SIZE | .GRN_QUERY_LOG_SCORE;
333 enum GRN_QUERY_LOG_DEFAULT = .GRN_QUERY_LOG_ALL;
334 
335 enum grn_content_type
336 {
337 	GRN_CONTENT_NONE = 0,
338 	GRN_CONTENT_TSV,
339 	GRN_CONTENT_JSON,
340 	GRN_CONTENT_XML,
341 	GRN_CONTENT_MSGPACK,
342 	GRN_CONTENT_GROONGA_COMMAND_LIST,
343 	GRN_CONTENT_APACHE_ARROW,
344 }
345 
346 //Declaration name in C language
347 enum
348 {
349 	GRN_CONTENT_NONE = .grn_content_type.GRN_CONTENT_NONE,
350 	GRN_CONTENT_TSV = .grn_content_type.GRN_CONTENT_TSV,
351 	GRN_CONTENT_JSON = .grn_content_type.GRN_CONTENT_JSON,
352 	GRN_CONTENT_XML = .grn_content_type.GRN_CONTENT_XML,
353 	GRN_CONTENT_MSGPACK = .grn_content_type.GRN_CONTENT_MSGPACK,
354 	GRN_CONTENT_GROONGA_COMMAND_LIST = .grn_content_type.GRN_CONTENT_GROONGA_COMMAND_LIST,
355 	GRN_CONTENT_APACHE_ARROW = .grn_content_type.GRN_CONTENT_APACHE_ARROW,
356 }
357 
358 enum GRN_CTX_MSGSIZE = 0x80;
359 enum GRN_CTX_FIN = 0xFF;
360 
361 alias grn_close_func = extern (C) void function (.grn_ctx* ctx, void* data);
362 
363 union grn_user_data
364 {
365 	int int_value;
366 	.grn_id id;
367 	void* ptr_;
368 
369 	deprecated
370 	alias ptr = ptr_;
371 }
372 
373 alias grn_proc_func = extern (C) .grn_obj* function(.grn_ctx* ctx, int nargs, .grn_obj** args, grn_user_data* user_data);
374 
375 extern struct _grn_ctx_impl;
376 
377 struct _grn_ctx
378 {
379 	.grn_rc rc;
380 	int flags;
381 	.grn_encoding encoding;
382 	ubyte ntrace;
383 	ubyte errlvl;
384 	ubyte stat;
385 	uint seqno;
386 	uint subno;
387 	uint seqno2;
388 	uint errline;
389 	grn_user_data user_data;
390 	.grn_ctx* prev;
391 	.grn_ctx* next;
392 	const (char)* errfile;
393 	const (char)* errfunc;
394 	._grn_ctx_impl* impl;
395 
396 	//ToDo: Check
397 	void*[16] trace;
398 
399 	char[.GRN_CTX_MSGSIZE] errbuf = '\0';
400 }
401 
402 alias grn_ctx = ._grn_ctx;
403 
404 pragma(inline, true)
405 pure nothrow @trusted @nogc @live
406 grn_user_data* GRN_CTX_USER_DATA(return scope .grn_ctx* ctx)
407 
408 	in
409 	{
410 		assert(ctx != null);
411 	}
412 
413 	do
414 	{
415 		return &(ctx.user_data);
416 	}
417 
418 /* Deprecated since 4.0.3. Don't use it. */
419 enum GRN_CTX_USE_QL = 0x03;
420 /* Deprecated since 4.0.3. Don't use it. */
421 enum GRN_CTX_BATCH_MODE = 0x04;
422 enum GRN_CTX_PER_DB = 0x08;
423 
424 //GRN_API
425 .grn_rc grn_ctx_init(.grn_ctx* ctx, int flags);
426 
427 //GRN_API
428 .grn_rc grn_ctx_fin(.grn_ctx* ctx);
429 
430 //GRN_API
431 .grn_ctx* grn_ctx_open(int flags);
432 
433 //GRN_API
434 .grn_rc grn_ctx_close(.grn_ctx* ctx);
435 
436 //GRN_API
437 .grn_rc grn_ctx_set_finalizer(.grn_ctx* ctx, grn_proc_func* func);
438 
439 //GRN_API
440 .grn_rc grn_ctx_push_temporary_open_space(.grn_ctx* ctx);
441 
442 //GRN_API
443 .grn_rc grn_ctx_pop_temporary_open_space(.grn_ctx* ctx);
444 
445 //GRN_API
446 .grn_rc grn_ctx_merge_temporary_open_space(.grn_ctx* ctx);
447 
448 //GRN_API
449 .grn_encoding grn_get_default_encoding();
450 
451 //GRN_API
452 .grn_rc grn_set_default_encoding(.grn_encoding encoding);
453 
454 pragma(inline, true)
455 pure nothrow @trusted @nogc @live
456 .grn_encoding GRN_CTX_GET_ENCODING(scope const .grn_ctx* ctx)
457 
458 	in
459 	{
460 		assert(ctx != null);
461 	}
462 
463 	do
464 	{
465 		return ctx.encoding;
466 	}
467 
468 pragma(inline, true)
469 void GRN_CTX_SET_ENCODING(scope .grn_ctx* ctx, .grn_encoding enc)
470 
471 	in
472 	{
473 		assert(ctx != null);
474 	}
475 
476 	do
477 	{
478 		ctx.encoding = (enc == .grn_encoding.GRN_ENC_DEFAULT) ? (.grn_get_default_encoding()) : (enc);
479 	}
480 
481 //GRN_API
482 const (char)* grn_get_version();
483 
484 //GRN_API
485 uint grn_get_version_major();
486 
487 //GRN_API
488 uint grn_get_version_minor();
489 
490 //GRN_API
491 uint grn_get_version_micro();
492 
493 //GRN_API
494 const (char)* grn_get_package();
495 
496 //GRN_API
497 const (char)* grn_get_package_label();
498 
499 //GRN_API
500 .grn_command_version grn_get_default_command_version();
501 
502 //GRN_API
503 .grn_rc grn_set_default_command_version(.grn_command_version input_version);
504 
505 //GRN_API
506 .grn_command_version grn_ctx_get_command_version(.grn_ctx* ctx);
507 
508 //GRN_API
509 .grn_rc grn_ctx_set_command_version(.grn_ctx* ctx, .grn_command_version input_version);
510 
511 //GRN_API
512 long grn_ctx_get_match_escalation_threshold(.grn_ctx* ctx);
513 
514 //GRN_API
515 .grn_rc grn_ctx_set_match_escalation_threshold(.grn_ctx* ctx, long threshold);
516 
517 //GRN_API
518 .grn_bool grn_ctx_get_force_match_escalation(.grn_ctx* ctx);
519 
520 //GRN_API
521 .grn_rc grn_ctx_set_force_match_escalation(.grn_ctx* ctx, .grn_bool force);
522 
523 //GRN_API
524 long grn_get_default_match_escalation_threshold();
525 
526 //GRN_API
527 .grn_rc grn_set_default_match_escalation_threshold(long threshold);
528 
529 //GRN_API
530 bool grn_is_back_trace_enable();
531 
532 //GRN_API
533 .grn_rc grn_set_back_trace_enable(bool enable);
534 
535 //GRN_API
536 grn_rc grn_ctx_set_variable(.grn_ctx* ctx, const (char)* name, int name_size, void* data, .grn_close_func close_func);
537 
538 //GRN_API
539 void* grn_ctx_get_variable(.grn_ctx* ctx, const (char)* name, int name_size);
540 
541 //GRN_API
542 grn_rc grn_unset_variable(const (char)* name, int name_size);
543 
544 //GRN_API
545 int grn_get_lock_timeout();
546 
547 //GRN_API
548 .grn_rc grn_set_lock_timeout(int timeout);
549 
550 /* .grn_encoding */
551 
552 //GRN_API
553 const (char)* grn_encoding_to_string(.grn_encoding encoding);
554 
555 //GRN_API
556 .grn_encoding grn_encoding_parse(const (char)* name);
557 
558 /* obj */
559 
560 alias grn_obj_flags = ushort;
561 alias grn_table_flags = uint;
562 alias grn_column_flags = uint;
563 
564 /* flags for grn_obj_flags and grn_table_flags */
565 
566 enum GRN_OBJ_FLAGS_MASK = 0xFFFF;
567 
568 enum GRN_OBJ_TABLE_TYPE_MASK = 0x07;
569 enum GRN_OBJ_TABLE_HASH_KEY = 0x00;
570 enum GRN_OBJ_TABLE_PAT_KEY = 0x01;
571 enum GRN_OBJ_TABLE_DAT_KEY = 0x02;
572 enum GRN_OBJ_TABLE_NO_KEY = 0x03;
573 
574 enum GRN_OBJ_KEY_MASK = 0x07 << 3;
575 enum GRN_OBJ_KEY_UINT = 0x00 << 3;
576 enum GRN_OBJ_KEY_INT = 0x01 << 3;
577 enum GRN_OBJ_KEY_FLOAT = 0x02 << 3;
578 enum GRN_OBJ_KEY_GEO_POINT = 0x03 << 3;
579 
580 enum GRN_OBJ_KEY_WITH_SIS = 0x01 << 6;
581 enum GRN_OBJ_KEY_NORMALIZE = 0x01 << 7;
582 
583 /* flags for grn_obj_flags and grn_column_flags */
584 
585 enum GRN_OBJ_COLUMN_TYPE_MASK = 0x07;
586 enum GRN_OBJ_COLUMN_SCALAR = 0x00;
587 enum GRN_OBJ_COLUMN_VECTOR = 0x01;
588 enum GRN_OBJ_COLUMN_INDEX = 0x02;
589 
590 enum GRN_OBJ_COMPRESS_MASK = 0x07 << 4;
591 enum GRN_OBJ_COMPRESS_NONE = 0x00 << 4;
592 enum GRN_OBJ_COMPRESS_ZLIB = 0x01 << 4;
593 enum GRN_OBJ_COMPRESS_LZ4 = 0x02 << 4;
594 /* Just for backward compatibility. We'll remove it at 5.0.0. */
595 enum GRN_OBJ_COMPRESS_LZO = .GRN_OBJ_COMPRESS_LZ4;
596 enum GRN_OBJ_COMPRESS_ZSTD = 0x03 << 4;
597 
598 enum GRN_OBJ_WITH_SECTION = 0x01 << 7;
599 enum GRN_OBJ_WITH_WEIGHT = 0x01 << 8;
600 enum GRN_OBJ_WITH_POSITION = 0x01 << 9;
601 enum GRN_OBJ_RING_BUFFER = 0x01 << 10;
602 
603 enum GRN_OBJ_UNIT_MASK = 0x0F << 8;
604 enum GRN_OBJ_UNIT_DOCUMENT_NONE = 0x00 << 8;
605 enum GRN_OBJ_UNIT_DOCUMENT_SECTION = 0x01 << 8;
606 enum GRN_OBJ_UNIT_DOCUMENT_POSITION = 0x02 << 8;
607 enum GRN_OBJ_UNIT_SECTION_NONE = 0x03 << 8;
608 enum GRN_OBJ_UNIT_SECTION_POSITION = 0x04 << 8;
609 enum GRN_OBJ_UNIT_POSITION_NONE = 0x05 << 8;
610 enum GRN_OBJ_UNIT_USERDEF_DOCUMENT = 0x06 << 8;
611 enum GRN_OBJ_UNIT_USERDEF_SECTION = 0x07 << 8;
612 enum GRN_OBJ_UNIT_USERDEF_POSITION = 0x08 << 8;
613 
614 /* Don't use (0x01<<12) because it's used internally. */
615 
616 enum GRN_OBJ_NO_SUBREC = 0x00 << 13;
617 enum GRN_OBJ_WITH_SUBREC = 0x01 << 13;
618 
619 enum GRN_OBJ_KEY_VAR_SIZE = 0x01 << 14;
620 
621 enum GRN_OBJ_TEMPORARY = 0x00 << 15;
622 enum GRN_OBJ_PERSISTENT = 0x01 << 15;
623 
624 /* flags only for grn_table_flags */
625 
626 enum GRN_OBJ_KEY_LARGE = 0x01 << 16;
627 
628 /* flags only for grn_column_flags */
629 
630 enum GRN_OBJ_INDEX_SMALL = 0x01 << 16;
631 enum GRN_OBJ_INDEX_MEDIUM = 0x01 << 17;
632 enum GRN_OBJ_INDEX_LARGE = 0x01 << 18;
633 enum GRN_OBJ_WEIGHT_FLOAT32 = 0x01 << 19;
634 
635 /* flags only for grn_table_flags and grn_column_flags */
636 
637 /* GRN_COLUMN_INDEX only uses this for now */
638 enum GRN_OBJ_VISIBLE = cast(uint)(0x00 << 31);
639 enum GRN_OBJ_INVISIBLE = cast(uint)(0x01 << 31);
640 
641 /* obj types */
642 
643 enum GRN_VOID = 0x00;
644 enum GRN_BULK = 0x02;
645 enum GRN_PTR = 0x03;
646 
647 /* vector of fixed size data especially grn_id */
648 enum GRN_UVECTOR = 0x04;
649 
650 /* vector of .grn_obj* */
651 enum GRN_PVECTOR = 0x05;
652 
653 /* vector of arbitrary data */
654 enum GRN_VECTOR = 0x06;
655 
656 enum GRN_MSG = 0x07;
657 enum GRN_QUERY = 0x08;
658 enum GRN_ACCESSOR = 0x09;
659 enum GRN_SNIP = 0x0B;
660 enum GRN_PATSNIP = 0x0C;
661 enum GRN_STRING = 0x0D;
662 enum GRN_HIGHLIGHTER = 0x0E;
663 enum GRN_CURSOR_TABLE_HASH_KEY = 0x10;
664 enum GRN_CURSOR_TABLE_PAT_KEY = 0x11;
665 enum GRN_CURSOR_TABLE_DAT_KEY = 0x12;
666 enum GRN_CURSOR_TABLE_NO_KEY = 0x13;
667 enum GRN_CURSOR_COLUMN_INDEX = 0x18;
668 enum GRN_CURSOR_COLUMN_GEO_INDEX = 0x1A;
669 enum GRN_CURSOR_CONFIG = 0x1F;
670 enum GRN_TYPE = 0x20;
671 enum GRN_PROC = 0x21;
672 enum GRN_EXPR = 0x22;
673 enum GRN_TABLE_HASH_KEY = 0x30;
674 enum GRN_TABLE_PAT_KEY = 0x31;
675 enum GRN_TABLE_DAT_KEY = 0x32;
676 enum GRN_TABLE_NO_KEY = 0x33;
677 enum GRN_DB = 0x37;
678 enum GRN_COLUMN_FIX_SIZE = 0x40;
679 enum GRN_COLUMN_VAR_SIZE = 0x41;
680 enum GRN_COLUMN_INDEX = 0x48;
681 
682 struct _grn_section
683 {
684 	uint offset;
685 	uint length;
686 	float weight = 0;
687 	.grn_id domain;
688 }
689 
690 alias grn_section = ._grn_section;
691 
692 struct _grn_obj_header
693 {
694 	ubyte type;
695 	ubyte impl_flags;
696 	.grn_obj_flags flags;
697 	.grn_id domain;
698 }
699 
700 alias grn_obj_header = ._grn_obj_header;
701 
702 struct _grn_obj
703 {
704 	.grn_obj_header header;
705 
706 	union u_
707 	{
708 		struct b_
709 		{
710 			char* head;
711 			char* curr;
712 			char* tail;
713 		}
714 
715 		b_ b;
716 
717 		struct v_
718 		{
719 			.grn_obj* body_;
720 			.grn_section* sections;
721 			uint n_sections;
722 		}
723 
724 		v_ v;
725 	}
726 
727 	u_ u;
728 }
729 
730 alias grn_obj = ._grn_obj;
731 
732 enum GRN_OBJ_REFER = 0x01 << 0;
733 enum GRN_OBJ_OUTPLACE = 0x01 << 1;
734 enum GRN_OBJ_OWN = 0x01 << 5;
735 
736 pragma(inline, true)
737 pure nothrow @trusted @nogc @live
738 void GRN_OBJ_INIT(scope .grn_obj* obj, ubyte obj_type, ubyte obj_flags, .grn_id obj_domain)
739 
740 	in
741 	{
742 		assert(obj != null);
743 	}
744 
745 	do
746 	{
747 		obj.header.type = obj_type;
748 		obj.header.impl_flags = obj_flags;
749 		obj.header.flags = 0;
750 		obj.header.domain = obj_domain;
751 		obj.u.b.head = null;
752 		obj.u.b.curr = null;
753 		obj.u.b.tail = null;
754 	}
755 
756 alias GRN_OBJ_FIN = grn_obj_close;
757 
758 //GRN_API
759 .grn_rc grn_ctx_use(.grn_ctx* ctx, .grn_obj* db);
760 
761 //GRN_API
762 .grn_obj* grn_ctx_db(.grn_ctx* ctx);
763 
764 //GRN_API
765 .grn_obj* grn_ctx_get(.grn_ctx* ctx, const (char)* name, int name_size);
766 
767 //GRN_API
768 .grn_rc grn_ctx_get_all_tables(.grn_ctx* ctx, .grn_obj* tables_buffer);
769 
770 //GRN_API
771 .grn_rc grn_ctx_get_all_types(.grn_ctx* ctx, .grn_obj* types_buffer);
772 
773 //GRN_API
774 .grn_rc grn_ctx_get_all_tokenizers(.grn_ctx* ctx, .grn_obj* tokenizers_buffer);
775 
776 //GRN_API
777 .grn_rc grn_ctx_get_all_normalizers(.grn_ctx* ctx, .grn_obj* normalizers_buffer);
778 
779 //GRN_API
780 .grn_rc grn_ctx_get_all_token_filters(.grn_ctx* ctx, .grn_obj* token_filters_buffer);
781 
782 enum grn_builtin_type
783 {
784 	GRN_DB_VOID = 0,
785 	GRN_DB_DB,
786 	GRN_DB_OBJECT,
787 	GRN_DB_BOOL,
788 	GRN_DB_INT8,
789 	GRN_DB_UINT8,
790 	GRN_DB_INT16,
791 	GRN_DB_UINT16,
792 	GRN_DB_INT32,
793 	GRN_DB_UINT32,
794 	GRN_DB_INT64,
795 	GRN_DB_UINT64,
796 	GRN_DB_FLOAT,
797 	GRN_DB_TIME,
798 	GRN_DB_SHORT_TEXT,
799 	GRN_DB_TEXT,
800 	GRN_DB_LONG_TEXT,
801 	GRN_DB_TOKYO_GEO_POINT,
802 	GRN_DB_WGS84_GEO_POINT,
803 	GRN_DB_FLOAT32,
804 }
805 
806 //Declaration name in C language
807 enum
808 {
809 	GRN_DB_VOID = .grn_builtin_type.GRN_DB_VOID,
810 	GRN_DB_DB = .grn_builtin_type.GRN_DB_DB,
811 	GRN_DB_OBJECT = .grn_builtin_type.GRN_DB_OBJECT,
812 	GRN_DB_BOOL = .grn_builtin_type.GRN_DB_BOOL,
813 	GRN_DB_INT8 = .grn_builtin_type.GRN_DB_INT8,
814 	GRN_DB_UINT8 = .grn_builtin_type.GRN_DB_UINT8,
815 	GRN_DB_INT16 = .grn_builtin_type.GRN_DB_INT16,
816 	GRN_DB_UINT16 = .grn_builtin_type.GRN_DB_UINT16,
817 	GRN_DB_INT32 = .grn_builtin_type.GRN_DB_INT32,
818 	GRN_DB_UINT32 = .grn_builtin_type.GRN_DB_UINT32,
819 	GRN_DB_INT64 = .grn_builtin_type.GRN_DB_INT64,
820 	GRN_DB_UINT64 = .grn_builtin_type.GRN_DB_UINT64,
821 	GRN_DB_FLOAT = .grn_builtin_type.GRN_DB_FLOAT,
822 	GRN_DB_TIME = .grn_builtin_type.GRN_DB_TIME,
823 	GRN_DB_SHORT_TEXT = .grn_builtin_type.GRN_DB_SHORT_TEXT,
824 	GRN_DB_TEXT = .grn_builtin_type.GRN_DB_TEXT,
825 	GRN_DB_LONG_TEXT = .grn_builtin_type.GRN_DB_LONG_TEXT,
826 	GRN_DB_TOKYO_GEO_POINT = .grn_builtin_type.GRN_DB_TOKYO_GEO_POINT,
827 	GRN_DB_WGS84_GEO_POINT = .grn_builtin_type.GRN_DB_WGS84_GEO_POINT,
828 	GRN_DB_FLOAT32 = .grn_builtin_type.GRN_DB_FLOAT32,
829 }
830 
831 enum grn_builtin_tokenizer
832 {
833 	GRN_DB_MECAB = 64,
834 	GRN_DB_DELIMIT,
835 	GRN_DB_UNIGRAM,
836 	GRN_DB_BIGRAM,
837 	GRN_DB_TRIGRAM,
838 }
839 
840 //Declaration name in C language
841 enum
842 {
843 	GRN_DB_MECAB = .grn_builtin_tokenizer.GRN_DB_MECAB,
844 	GRN_DB_DELIMIT = .grn_builtin_tokenizer.GRN_DB_DELIMIT,
845 	GRN_DB_UNIGRAM = .grn_builtin_tokenizer.GRN_DB_UNIGRAM,
846 	GRN_DB_BIGRAM = .grn_builtin_tokenizer.GRN_DB_BIGRAM,
847 	GRN_DB_TRIGRAM = .grn_builtin_tokenizer.GRN_DB_TRIGRAM,
848 }
849 
850 //GRN_API
851 .grn_obj* grn_ctx_at(.grn_ctx* ctx, .grn_id id);
852 
853 //GRN_API
854 .grn_bool grn_ctx_is_opened(.grn_ctx* ctx, .grn_id id);
855 
856 //GRN_API
857 .grn_rc grn_plugin_register(.grn_ctx* ctx, const (char)* name);
858 
859 //GRN_API
860 .grn_rc grn_plugin_unregister(.grn_ctx* ctx, const (char)* name);
861 
862 //GRN_API
863 .grn_rc grn_plugin_register_by_path(.grn_ctx* ctx, const (char)* path);
864 
865 //GRN_API
866 .grn_rc grn_plugin_unregister_by_path(.grn_ctx* ctx, const (char)* path);
867 
868 //GRN_API
869 const (char)* grn_plugin_get_system_plugins_dir();
870 
871 //GRN_API
872 const (char)* grn_plugin_get_suffix();
873 
874 //GRN_API
875 const (char)* grn_plugin_get_ruby_suffix();
876 
877 //GRN_API
878 .grn_rc grn_plugin_get_names(.grn_ctx* ctx, .grn_obj* names);
879 
880 struct grn_expr_var
881 {
882 	const (char)* name;
883 	uint name_size;
884 	.grn_obj value;
885 }
886 
887 .grn_rc function (.grn_ctx* ctx) grn_plugin_func;
888 
889 alias grn_table_cursor = .grn_obj;
890 
891 enum grn_operator
892 {
893 	GRN_OP_PUSH = 0,
894 	GRN_OP_POP,
895 	GRN_OP_NOP,
896 	GRN_OP_CALL,
897 	GRN_OP_INTERN,
898 	GRN_OP_GET_REF,
899 	GRN_OP_GET_VALUE,
900 	GRN_OP_AND,
901 	GRN_OP_AND_NOT,
902 
903 	/**
904 	 * Deprecated. Just for backward compatibility.
905 	 */
906 	GRN_OP_BUT = GRN_OP_AND_NOT,
907 
908 	GRN_OP_OR,
909 	GRN_OP_ASSIGN,
910 	GRN_OP_STAR_ASSIGN,
911 	GRN_OP_SLASH_ASSIGN,
912 	GRN_OP_MOD_ASSIGN,
913 	GRN_OP_PLUS_ASSIGN,
914 	GRN_OP_MINUS_ASSIGN,
915 	GRN_OP_SHIFTL_ASSIGN,
916 	GRN_OP_SHIFTR_ASSIGN,
917 	GRN_OP_SHIFTRR_ASSIGN,
918 	GRN_OP_AND_ASSIGN,
919 	GRN_OP_XOR_ASSIGN,
920 	GRN_OP_OR_ASSIGN,
921 	GRN_OP_JUMP,
922 	GRN_OP_CJUMP,
923 	GRN_OP_COMMA,
924 	GRN_OP_BITWISE_OR,
925 	GRN_OP_BITWISE_XOR,
926 	GRN_OP_BITWISE_AND,
927 	GRN_OP_BITWISE_NOT,
928 	GRN_OP_EQUAL,
929 	GRN_OP_NOT_EQUAL,
930 	GRN_OP_LESS,
931 	GRN_OP_GREATER,
932 	GRN_OP_LESS_EQUAL,
933 	GRN_OP_GREATER_EQUAL,
934 	GRN_OP_IN,
935 	GRN_OP_MATCH,
936 	GRN_OP_NEAR,
937 	GRN_OP_NEAR_NO_OFFSET,
938 	GRN_OP_SIMILAR,
939 	GRN_OP_TERM_EXTRACT,
940 	GRN_OP_SHIFTL,
941 	GRN_OP_SHIFTR,
942 	GRN_OP_SHIFTRR,
943 	GRN_OP_PLUS,
944 	GRN_OP_MINUS,
945 	GRN_OP_STAR,
946 	GRN_OP_SLASH,
947 	GRN_OP_MOD,
948 	GRN_OP_DELETE,
949 	GRN_OP_INCR,
950 	GRN_OP_DECR,
951 	GRN_OP_INCR_POST,
952 	GRN_OP_DECR_POST,
953 	GRN_OP_NOT,
954 	GRN_OP_ADJUST,
955 	GRN_OP_EXACT,
956 	GRN_OP_LCP,
957 	GRN_OP_PARTIAL,
958 	GRN_OP_UNSPLIT,
959 	GRN_OP_PREFIX,
960 	GRN_OP_SUFFIX,
961 	GRN_OP_GEO_DISTANCE1,
962 	GRN_OP_GEO_DISTANCE2,
963 	GRN_OP_GEO_DISTANCE3,
964 	GRN_OP_GEO_DISTANCE4,
965 	GRN_OP_GEO_WITHINP5,
966 	GRN_OP_GEO_WITHINP6,
967 	GRN_OP_GEO_WITHINP8,
968 	GRN_OP_OBJ_SEARCH,
969 	GRN_OP_EXPR_GET_VAR,
970 	GRN_OP_TABLE_CREATE,
971 	GRN_OP_TABLE_SELECT,
972 	GRN_OP_TABLE_SORT,
973 	GRN_OP_TABLE_GROUP,
974 	GRN_OP_JSON_PUT,
975 	GRN_OP_GET_MEMBER,
976 	GRN_OP_REGEXP,
977 	GRN_OP_FUZZY,
978 	GRN_OP_QUORUM,
979 	GRN_OP_NEAR_PHRASE,
980 	GRN_OP_ORDERED_NEAR_PHRASE,
981 	GRN_OP_NEAR_PHRASE_PRODUCT,
982 	GRN_OP_ORDERED_NEAR_PHRASE_PRODUCT,
983 }
984 
985 //Declaration name in C language
986 enum
987 {
988 	GRN_OP_PUSH = .grn_operator.GRN_OP_PUSH,
989 	GRN_OP_POP = .grn_operator.GRN_OP_POP,
990 	GRN_OP_NOP = .grn_operator.GRN_OP_NOP,
991 	GRN_OP_CALL = .grn_operator.GRN_OP_CALL,
992 	GRN_OP_INTERN = .grn_operator.GRN_OP_INTERN,
993 	GRN_OP_GET_REF = .grn_operator.GRN_OP_GET_REF,
994 	GRN_OP_GET_VALUE = .grn_operator.GRN_OP_GET_VALUE,
995 	GRN_OP_AND = .grn_operator.GRN_OP_AND,
996 	GRN_OP_AND_NOT = .grn_operator.GRN_OP_AND_NOT,
997 	GRN_OP_BUT = .grn_operator.GRN_OP_BUT,
998 	GRN_OP_OR = .grn_operator.GRN_OP_OR,
999 	GRN_OP_ASSIGN = .grn_operator.GRN_OP_ASSIGN,
1000 	GRN_OP_STAR_ASSIGN = .grn_operator.GRN_OP_STAR_ASSIGN,
1001 	GRN_OP_SLASH_ASSIGN = .grn_operator.GRN_OP_SLASH_ASSIGN,
1002 	GRN_OP_MOD_ASSIGN = .grn_operator.GRN_OP_MOD_ASSIGN,
1003 	GRN_OP_PLUS_ASSIGN = .grn_operator.GRN_OP_PLUS_ASSIGN,
1004 	GRN_OP_MINUS_ASSIGN = .grn_operator.GRN_OP_MINUS_ASSIGN,
1005 	GRN_OP_SHIFTL_ASSIGN = .grn_operator.GRN_OP_SHIFTL_ASSIGN,
1006 	GRN_OP_SHIFTR_ASSIGN = .grn_operator.GRN_OP_SHIFTR_ASSIGN,
1007 	GRN_OP_SHIFTRR_ASSIGN = .grn_operator.GRN_OP_SHIFTRR_ASSIGN,
1008 	GRN_OP_AND_ASSIGN = .grn_operator.GRN_OP_AND_ASSIGN,
1009 	GRN_OP_XOR_ASSIGN = .grn_operator.GRN_OP_XOR_ASSIGN,
1010 	GRN_OP_OR_ASSIGN = .grn_operator.GRN_OP_OR_ASSIGN,
1011 	GRN_OP_JUMP = .grn_operator.GRN_OP_JUMP,
1012 	GRN_OP_CJUMP = .grn_operator.GRN_OP_CJUMP,
1013 	GRN_OP_COMMA = .grn_operator.GRN_OP_COMMA,
1014 	GRN_OP_BITWISE_OR = .grn_operator.GRN_OP_BITWISE_OR,
1015 	GRN_OP_BITWISE_XOR = .grn_operator.GRN_OP_BITWISE_XOR,
1016 	GRN_OP_BITWISE_AND = .grn_operator.GRN_OP_BITWISE_AND,
1017 	GRN_OP_BITWISE_NOT = .grn_operator.GRN_OP_BITWISE_NOT,
1018 	GRN_OP_EQUAL = .grn_operator.GRN_OP_EQUAL,
1019 	GRN_OP_NOT_EQUAL = .grn_operator.GRN_OP_NOT_EQUAL,
1020 	GRN_OP_LESS = .grn_operator.GRN_OP_LESS,
1021 	GRN_OP_GREATER = .grn_operator.GRN_OP_GREATER,
1022 	GRN_OP_LESS_EQUAL = .grn_operator.GRN_OP_LESS_EQUAL,
1023 	GRN_OP_GREATER_EQUAL = .grn_operator.GRN_OP_GREATER_EQUAL,
1024 	GRN_OP_IN = .grn_operator.GRN_OP_IN,
1025 	GRN_OP_MATCH = .grn_operator.GRN_OP_MATCH,
1026 	GRN_OP_NEAR = .grn_operator.GRN_OP_NEAR,
1027 	GRN_OP_NEAR_NO_OFFSET = .grn_operator.GRN_OP_NEAR_NO_OFFSET,
1028 	GRN_OP_SIMILAR = .grn_operator.GRN_OP_SIMILAR,
1029 	GRN_OP_TERM_EXTRACT = .grn_operator.GRN_OP_TERM_EXTRACT,
1030 	GRN_OP_SHIFTL = .grn_operator.GRN_OP_SHIFTL,
1031 	GRN_OP_SHIFTR = .grn_operator.GRN_OP_SHIFTR,
1032 	GRN_OP_SHIFTRR = .grn_operator.GRN_OP_SHIFTRR,
1033 	GRN_OP_PLUS = .grn_operator.GRN_OP_PLUS,
1034 	GRN_OP_MINUS = .grn_operator.GRN_OP_MINUS,
1035 	GRN_OP_STAR = .grn_operator.GRN_OP_STAR,
1036 	GRN_OP_SLASH = .grn_operator.GRN_OP_SLASH,
1037 	GRN_OP_MOD = .grn_operator.GRN_OP_MOD,
1038 	GRN_OP_DELETE = .grn_operator.GRN_OP_DELETE,
1039 	GRN_OP_INCR = .grn_operator.GRN_OP_INCR,
1040 	GRN_OP_DECR = .grn_operator.GRN_OP_DECR,
1041 	GRN_OP_INCR_POST = .grn_operator.GRN_OP_INCR_POST,
1042 	GRN_OP_DECR_POST = .grn_operator.GRN_OP_DECR_POST,
1043 	GRN_OP_NOT = .grn_operator.GRN_OP_NOT,
1044 	GRN_OP_ADJUST = .grn_operator.GRN_OP_ADJUST,
1045 	GRN_OP_EXACT = .grn_operator.GRN_OP_EXACT,
1046 	GRN_OP_LCP = .grn_operator.GRN_OP_LCP,
1047 	GRN_OP_PARTIAL = .grn_operator.GRN_OP_PARTIAL,
1048 	GRN_OP_UNSPLIT = .grn_operator.GRN_OP_UNSPLIT,
1049 	GRN_OP_PREFIX = .grn_operator.GRN_OP_PREFIX,
1050 	GRN_OP_SUFFIX = .grn_operator.GRN_OP_SUFFIX,
1051 	GRN_OP_GEO_DISTANCE1 = .grn_operator.GRN_OP_GEO_DISTANCE1,
1052 	GRN_OP_GEO_DISTANCE2 = .grn_operator.GRN_OP_GEO_DISTANCE2,
1053 	GRN_OP_GEO_DISTANCE3 = .grn_operator.GRN_OP_GEO_DISTANCE3,
1054 	GRN_OP_GEO_DISTANCE4 = .grn_operator.GRN_OP_GEO_DISTANCE4,
1055 	GRN_OP_GEO_WITHINP5 = .grn_operator.GRN_OP_GEO_WITHINP5,
1056 	GRN_OP_GEO_WITHINP6 = .grn_operator.GRN_OP_GEO_WITHINP6,
1057 	GRN_OP_GEO_WITHINP8 = .grn_operator.GRN_OP_GEO_WITHINP8,
1058 	GRN_OP_OBJ_SEARCH = .grn_operator.GRN_OP_OBJ_SEARCH,
1059 	GRN_OP_EXPR_GET_VAR = .grn_operator.GRN_OP_EXPR_GET_VAR,
1060 	GRN_OP_TABLE_CREATE = .grn_operator.GRN_OP_TABLE_CREATE,
1061 	GRN_OP_TABLE_SELECT = .grn_operator.GRN_OP_TABLE_SELECT,
1062 	GRN_OP_TABLE_SORT = .grn_operator.GRN_OP_TABLE_SORT,
1063 	GRN_OP_TABLE_GROUP = .grn_operator.GRN_OP_TABLE_GROUP,
1064 	GRN_OP_JSON_PUT = .grn_operator.GRN_OP_JSON_PUT,
1065 	GRN_OP_GET_MEMBER = .grn_operator.GRN_OP_GET_MEMBER,
1066 	GRN_OP_REGEXP = .grn_operator.GRN_OP_REGEXP,
1067 	GRN_OP_FUZZY = .grn_operator.GRN_OP_FUZZY,
1068 	GRN_OP_QUORUM = .grn_operator.GRN_OP_QUORUM,
1069 	GRN_OP_NEAR_PHRASE = .grn_operator.GRN_OP_NEAR_PHRASE,
1070 	GRN_OP_ORDERED_NEAR_PHRASE = .grn_operator.GRN_OP_ORDERED_NEAR_PHRASE,
1071 	GRN_OP_NEAR_PHRASE_PRODUCT = .grn_operator.GRN_OP_NEAR_PHRASE_PRODUCT,
1072 	GRN_OP_ORDERED_NEAR_PHRASE_PRODUCT = .grn_operator.GRN_OP_ORDERED_NEAR_PHRASE_PRODUCT,
1073 }
1074 
1075 /* Deprecated. Just for backward compatibility. */
1076 deprecated alias GRN_OP_NEAR2 = .GRN_OP_NEAR_NO_OFFSET;
1077 
1078 //GRN_API
1079 .grn_obj* grn_obj_column(.grn_ctx* ctx, .grn_obj* table, const (char)* name, uint name_size);
1080 
1081 /*-------------------------------------------------------------
1082  * API for db, table and/or column
1083  */
1084 
1085 enum grn_info_type
1086 {
1087 	GRN_INFO_ENCODING = 0,
1088 	GRN_INFO_SOURCE,
1089 	GRN_INFO_DEFAULT_TOKENIZER,
1090 	GRN_INFO_ELEMENT_SIZE,
1091 	GRN_INFO_CURR_MAX,
1092 	GRN_INFO_MAX_ELEMENT_SIZE,
1093 	GRN_INFO_SEG_SIZE,
1094 	GRN_INFO_CHUNK_SIZE,
1095 	GRN_INFO_MAX_SECTION,
1096 	GRN_INFO_HOOK_LOCAL_DATA,
1097 	GRN_INFO_ELEMENT_A,
1098 	GRN_INFO_ELEMENT_CHUNK,
1099 	GRN_INFO_ELEMENT_CHUNK_SIZE,
1100 	GRN_INFO_ELEMENT_BUFFER_FREE,
1101 	GRN_INFO_ELEMENT_NTERMS,
1102 	GRN_INFO_ELEMENT_NTERMS_VOID,
1103 	GRN_INFO_ELEMENT_SIZE_IN_CHUNK,
1104 	GRN_INFO_ELEMENT_POS_IN_CHUNK,
1105 	GRN_INFO_ELEMENT_SIZE_IN_BUFFER,
1106 	GRN_INFO_ELEMENT_POS_IN_BUFFER,
1107 	GRN_INFO_ELEMENT_ESTIMATE_SIZE,
1108 	GRN_INFO_NGRAM_UNIT_SIZE,
1109 	/*
1110 	GRN_INFO_VERSION,
1111 	GRN_INFO_CONFIGURE_OPTIONS,
1112 	GRN_INFO_CONFIG_PATH,
1113 	*/
1114 	GRN_INFO_PARTIAL_MATCH_THRESHOLD,
1115 	GRN_INFO_II_SPLIT_THRESHOLD,
1116 	GRN_INFO_SUPPORT_ZLIB,
1117 	GRN_INFO_SUPPORT_LZ4,
1118 	/* Just for backward compatibility. We'll remove it at 5.0.0. */
1119 	GRN_INFO_SUPPORT_LZO = GRN_INFO_SUPPORT_LZ4,
1120 	GRN_INFO_NORMALIZER,
1121 	GRN_INFO_TOKEN_FILTERS,
1122 	GRN_INFO_SUPPORT_ZSTD,
1123 
1124 	GRN_INFO_SUPPORT_APACHE_ARROW,
1125 	GRN_INFO_NORMALIZERS,
1126 }
1127 
1128 //Declaration name in C language
1129 enum
1130 {
1131 	GRN_INFO_ENCODING = .grn_info_type.GRN_INFO_ENCODING,
1132 	GRN_INFO_SOURCE = .grn_info_type.GRN_INFO_SOURCE,
1133 	GRN_INFO_DEFAULT_TOKENIZER = .grn_info_type.GRN_INFO_DEFAULT_TOKENIZER,
1134 	GRN_INFO_ELEMENT_SIZE = .grn_info_type.GRN_INFO_ELEMENT_SIZE,
1135 	GRN_INFO_CURR_MAX = .grn_info_type.GRN_INFO_CURR_MAX,
1136 	GRN_INFO_MAX_ELEMENT_SIZE = .grn_info_type.GRN_INFO_MAX_ELEMENT_SIZE,
1137 	GRN_INFO_SEG_SIZE = .grn_info_type.GRN_INFO_SEG_SIZE,
1138 	GRN_INFO_CHUNK_SIZE = .grn_info_type.GRN_INFO_CHUNK_SIZE,
1139 	GRN_INFO_MAX_SECTION = .grn_info_type.GRN_INFO_MAX_SECTION,
1140 	GRN_INFO_HOOK_LOCAL_DATA = .grn_info_type.GRN_INFO_HOOK_LOCAL_DATA,
1141 	GRN_INFO_ELEMENT_A = .grn_info_type.GRN_INFO_ELEMENT_A,
1142 	GRN_INFO_ELEMENT_CHUNK = .grn_info_type.GRN_INFO_ELEMENT_CHUNK,
1143 	GRN_INFO_ELEMENT_CHUNK_SIZE = .grn_info_type.GRN_INFO_ELEMENT_CHUNK_SIZE,
1144 	GRN_INFO_ELEMENT_BUFFER_FREE = .grn_info_type.GRN_INFO_ELEMENT_BUFFER_FREE,
1145 	GRN_INFO_ELEMENT_NTERMS = .grn_info_type.GRN_INFO_ELEMENT_NTERMS,
1146 	GRN_INFO_ELEMENT_NTERMS_VOID = .grn_info_type.GRN_INFO_ELEMENT_NTERMS_VOID,
1147 	GRN_INFO_ELEMENT_SIZE_IN_CHUNK = .grn_info_type.GRN_INFO_ELEMENT_SIZE_IN_CHUNK,
1148 	GRN_INFO_ELEMENT_POS_IN_CHUNK = .grn_info_type.GRN_INFO_ELEMENT_POS_IN_CHUNK,
1149 	GRN_INFO_ELEMENT_SIZE_IN_BUFFER = .grn_info_type.GRN_INFO_ELEMENT_SIZE_IN_BUFFER,
1150 	GRN_INFO_ELEMENT_POS_IN_BUFFER = .grn_info_type.GRN_INFO_ELEMENT_POS_IN_BUFFER,
1151 	GRN_INFO_ELEMENT_ESTIMATE_SIZE = .grn_info_type.GRN_INFO_ELEMENT_ESTIMATE_SIZE,
1152 	GRN_INFO_NGRAM_UNIT_SIZE = .grn_info_type.GRN_INFO_NGRAM_UNIT_SIZE,
1153 	/*
1154 	GRN_INFO_VERSION = .grn_info_type.GRN_INFO_VERSION,
1155 	GRN_INFO_CONFIGURE_OPTIONS = .grn_info_type.GRN_INFO_CONFIGURE_OPTIONS,
1156 	GRN_INFO_CONFIG_PATH = .grn_info_type.GRN_INFO_CONFIG_PATH,
1157 	*/
1158 	GRN_INFO_PARTIAL_MATCH_THRESHOLD = .grn_info_type.GRN_INFO_PARTIAL_MATCH_THRESHOLD,
1159 	GRN_INFO_II_SPLIT_THRESHOLD = .grn_info_type.GRN_INFO_II_SPLIT_THRESHOLD,
1160 	GRN_INFO_SUPPORT_ZLIB = .grn_info_type.GRN_INFO_SUPPORT_ZLIB,
1161 	GRN_INFO_SUPPORT_LZ4 = .grn_info_type.GRN_INFO_SUPPORT_LZ4,
1162 	GRN_INFO_SUPPORT_LZO = .grn_info_type.GRN_INFO_SUPPORT_LZO,
1163 	GRN_INFO_NORMALIZER = .grn_info_type.GRN_INFO_NORMALIZER,
1164 	GRN_INFO_TOKEN_FILTERS = .grn_info_type.GRN_INFO_TOKEN_FILTERS,
1165 	GRN_INFO_SUPPORT_ZSTD = .grn_info_type.GRN_INFO_SUPPORT_ZSTD,
1166 
1167 	GRN_INFO_SUPPORT_APACHE_ARROW = .grn_info_type.GRN_INFO_SUPPORT_APACHE_ARROW,
1168 }
1169 
1170 /* Just for backward compatibility. */
1171 package alias GRN_INFO_SUPPORT_ARROW = .grn_info_type.GRN_INFO_SUPPORT_APACHE_ARROW;
1172 
1173 //GRN_API
1174 .grn_obj* grn_obj_get_info(.grn_ctx* ctx, .grn_obj* obj, .grn_info_type type, .grn_obj* valuebuf);
1175 
1176 //GRN_API
1177 .grn_rc grn_obj_set_info(.grn_ctx* ctx, .grn_obj* obj, .grn_info_type type, .grn_obj* value);
1178 
1179 //GRN_API
1180 .grn_obj* grn_obj_get_element_info(.grn_ctx* ctx, .grn_obj* obj, .grn_id id, .grn_info_type type, .grn_obj* value);
1181 
1182 //GRN_API
1183 .grn_rc grn_obj_set_element_info(.grn_ctx* ctx, .grn_obj* obj, .grn_id id, .grn_info_type type, .grn_obj* value);
1184 
1185 //GRN_API
1186 .grn_obj* grn_obj_get_value(.grn_ctx* ctx, .grn_obj* obj, .grn_id id, .grn_obj* value);
1187 
1188 //GRN_API
1189 int grn_obj_get_values(.grn_ctx* ctx, .grn_obj* obj, .grn_id offset, void** values);
1190 
1191 
1192 //ToDo: temp
1193 alias internal_block_func = extern (C) nothrow @nogc void function();
1194 
1195 //ToDo: check
1196 /+
1197 pragma(inline, true)
1198 nothrow @nogc @disable
1199 void GRN_COLUMN_EACH(.grn_ctx* ctx, .grn_obj* column, uint id, void** value, internal_block_func block)
1200 
1201 	do
1202 	{
1203 		int _n;
1204 		.grn_id id = 1;
1205 
1206 		while ((_n = .grn_obj_get_values(ctx, column, id, value)) > 0) {
1207 			for (; _n; _n--, id++, value++) {
1208 				block();
1209 			}
1210 		}
1211 	}
1212 +/
1213 
1214 enum GRN_OBJ_SET_MASK = 0x07;
1215 enum GRN_OBJ_SET = 0x01;
1216 enum GRN_OBJ_INCR = 0x02;
1217 enum GRN_OBJ_DECR = 0x03;
1218 enum GRN_OBJ_APPEND = 0x04;
1219 enum GRN_OBJ_PREPEND = 0x05;
1220 enum GRN_OBJ_GET = 0x01 << 4;
1221 enum GRN_OBJ_COMPARE = 0x01 << 5;
1222 enum GRN_OBJ_LOCK = 0x01 << 6;
1223 enum GRN_OBJ_UNLOCK = 0x01 << 7;
1224 
1225 //GRN_API
1226 .grn_rc grn_obj_set_value(.grn_ctx* ctx, .grn_obj* obj, .grn_id id, .grn_obj* value, int flags);
1227 
1228 //GRN_API
1229 .grn_rc grn_obj_remove(.grn_ctx* ctx, .grn_obj* obj);
1230 
1231 //GRN_API
1232 .grn_rc grn_obj_remove_dependent(.grn_ctx* ctx, .grn_obj* obj);
1233 
1234 //GRN_API
1235 .grn_rc grn_obj_remove_force(.grn_ctx* ctx, const (char)* name, int name_size);
1236 
1237 //GRN_API
1238 .grn_rc grn_obj_rename(.grn_ctx* ctx, .grn_obj* obj, const (char)* name, uint name_size);
1239 
1240 //GRN_API
1241 .grn_rc grn_table_rename(.grn_ctx* ctx, .grn_obj* table, const (char)* name, uint name_size);
1242 
1243 //GRN_API
1244 .grn_rc grn_column_rename(.grn_ctx* ctx, .grn_obj* column, const (char)* name, uint name_size);
1245 
1246 //GRN_API
1247 .grn_rc grn_obj_close(.grn_ctx* ctx, .grn_obj* obj);
1248 
1249 //GRN_API
1250 .grn_rc grn_obj_reinit(.grn_ctx* ctx, .grn_obj* obj, .grn_id domain, ubyte flags);
1251 /* On non reference count mode (default):
1252 * This closes the following objects immediately:
1253 *
1254 *   * Acceessor
1255 *   * Bulk
1256 *   * DB
1257 *   * Temporary column
1258 *   * Temporary table
1259 *
1260 * This does nothing for other objects such as persisted tables and
1261 * columns.
1262 *
1263 * On reference count mode (GRN_ENABLE_REFERENCE_COUNT=yes):
1264 * This closes the following objects immediately:
1265 *
1266 *   * Bulk
1267 *   * DB
1268 *
1269 * This decreases the reference count of the following objects:
1270 *
1271 *   * Acceessor
1272 *   * Column (both persisted and temporary)
1273 *   * Table (both persisted and temporary)
1274 *
1275 * If the decreased reference count is zero, the object is closed.
1276 */
1277 //GRN_API
1278 void grn_obj_unlink(.grn_ctx* ctx, .grn_obj* obj);
1279 
1280 //GRN_API
1281 .grn_rc grn_obj_refer(.grn_ctx* ctx, .grn_obj* obj);
1282 
1283 //GRN_API
1284 .grn_rc grn_obj_refer_recursive(.grn_ctx* ctx, .grn_obj* obj);
1285 
1286 //GRN_API
1287 .grn_rc grn_obj_refer_recursive_dependent(.grn_ctx* ctx, .grn_obj* obj);
1288 /* This calls grn_obj_unlink() only on reference count mode
1289 * (GRN_ENABLE_REFERENCE_COUNT=yes) */
1290 //GRN_API
1291 void grn_obj_unref(.grn_ctx* ctx, .grn_obj* obj);
1292 
1293 //GRN_API
1294 void grn_obj_unref_recursive(.grn_ctx* ctx, .grn_obj* obj);
1295 
1296 //GRN_API
1297 void grn_obj_unref_recursive_dependent(.grn_ctx* ctx, .grn_obj* obj);
1298 
1299 //GRN_API
1300 grn_user_data* grn_obj_user_data(.grn_ctx* ctx, .grn_obj* obj);
1301 
1302 //GRN_API
1303 .grn_rc grn_obj_set_finalizer(.grn_ctx* ctx, .grn_obj* obj, grn_proc_func* func);
1304 
1305 //GRN_API
1306 const (char)* grn_obj_path(.grn_ctx* ctx, .grn_obj* obj);
1307 
1308 //GRN_API
1309 int grn_obj_name(.grn_ctx* ctx, .grn_obj* obj, char* namebuf, int buf_size);
1310 
1311 //GRN_API
1312 int grn_column_name(.grn_ctx* ctx, .grn_obj* obj, char* namebuf, int buf_size);
1313 
1314 //GRN_API
1315 .grn_id grn_obj_get_range(.grn_ctx* ctx, .grn_obj* obj);
1316 
1317 pragma(inline, true)
1318 pure nothrow @trusted @nogc @live
1319 .grn_id GRN_OBJ_GET_DOMAIN(scope const .grn_obj* obj)
1320 
1321 	in
1322 	{
1323 		assert(obj != null);
1324 	}
1325 
1326 	do
1327 	{
1328 		return (obj.header.type == .GRN_TABLE_NO_KEY) ? (.GRN_ID_NIL) : (obj.header.domain);
1329 	}
1330 
1331 //GRN_API
1332 int grn_obj_expire(.grn_ctx* ctx, .grn_obj* obj, int threshold);
1333 
1334 //GRN_API
1335 int grn_obj_check(.grn_ctx* ctx, .grn_obj* obj);
1336 
1337 //GRN_API
1338 .grn_rc grn_obj_lock(.grn_ctx* ctx, .grn_obj* obj, .grn_id id, int timeout);
1339 
1340 //GRN_API
1341 .grn_rc grn_obj_unlock(.grn_ctx* ctx, .grn_obj* obj, .grn_id id);
1342 
1343 //GRN_API
1344 .grn_rc grn_obj_clear_lock(.grn_ctx* ctx, .grn_obj* obj);
1345 
1346 //GRN_API
1347 uint grn_obj_is_locked(.grn_ctx* ctx, .grn_obj* obj);
1348 
1349 //GRN_API
1350 .grn_rc grn_obj_flush(.grn_ctx* ctx, .grn_obj* obj);
1351 
1352 //GRN_API
1353 .grn_rc grn_obj_flush_recursive(.grn_ctx* ctx, .grn_obj* obj);
1354 
1355 //GRN_API
1356 .grn_rc grn_obj_flush_recursive_dependent(.grn_ctx* ctx, .grn_obj* obj);
1357 
1358 //GRN_API
1359 .grn_rc grn_obj_flush_only_opened(.grn_ctx* ctx, .grn_obj* obj);
1360 
1361 //GRN_API
1362 int grn_obj_defrag(.grn_ctx* ctx, .grn_obj* obj, int threshold);
1363 
1364 //GRN_API
1365 .grn_obj* grn_obj_db(.grn_ctx* ctx, .grn_obj* obj);
1366 
1367 //GRN_API
1368 .grn_id grn_obj_id(.grn_ctx* ctx, .grn_obj* obj);
1369 
1370 /* Flags for grn_fuzzy_search_optarg.flags. */
1371 enum GRN_TABLE_FUZZY_SEARCH_WITH_TRANSPOSITION = 0x01;
1372 
1373 struct _grn_fuzzy_search_optarg
1374 {
1375 	uint max_distance;
1376 	uint max_expansion;
1377 	uint prefix_match_size;
1378 	int flags;
1379 }
1380 
1381 alias grn_fuzzy_search_optarg = ._grn_fuzzy_search_optarg;
1382 
1383 enum GRN_MATCH_INFO_GET_MIN_RECORD_ID = 0x01;
1384 enum GRN_MATCH_INFO_ONLY_SKIP_TOKEN = 0x02;
1385 
1386 struct _grn_match_info
1387 {
1388 	int flags;
1389 	.grn_id min;
1390 }
1391 
1392 alias grn_match_info = ._grn_match_info;
1393 
1394 struct _grn_search_optarg
1395 {
1396 	.grn_operator mode;
1397 	int similarity_threshold;
1398 	int max_interval;
1399 	int* weight_vector;
1400 	int vector_size;
1401 	.grn_obj* proc;
1402 	int max_size;
1403 	.grn_obj* scorer;
1404 	.grn_obj* scorer_args_expr;
1405 	uint scorer_args_expr_offset;
1406 	.grn_fuzzy_search_optarg fuzzy;
1407 	.grn_match_info match_info;
1408 	int quorum_threshold;
1409 	int additional_last_interval;
1410 	float* weight_vector_float;
1411 	float weight_float = 0;
1412 	.grn_obj* query_options;
1413 	.grn_obj* max_element_intervals;
1414 }
1415 
1416 alias grn_search_optarg = ._grn_search_optarg;
1417 
1418 //GRN_API
1419 .grn_rc grn_obj_search(.grn_ctx* ctx, .grn_obj* obj, .grn_obj* query, .grn_obj* res, .grn_operator op, .grn_search_optarg* optarg);
1420 
1421 //GRN_API
1422 .grn_rc grn_proc_set_is_stable(.grn_ctx* ctx, .grn_obj* proc, .grn_bool is_stable);
1423 
1424 //GRN_API
1425 .grn_bool grn_proc_is_stable(.grn_ctx* ctx, .grn_obj* proc);
1426 
1427 /*-------------------------------------------------------------
1428  * API for hook
1429  */
1430 
1431 //GRN_API
1432 int grn_proc_call_next(.grn_ctx* ctx, .grn_obj* exec_info, .grn_obj* in_, .grn_obj* out_);
1433 
1434 //GRN_API
1435 void* grn_proc_get_ctx_local_data(.grn_ctx* ctx, .grn_obj* exec_info);
1436 
1437 //GRN_API
1438 void* grn_proc_get_hook_local_data(.grn_ctx* ctx, .grn_obj* exec_info);
1439 
1440 enum grn_hook_entry
1441 {
1442 	GRN_HOOK_SET = 0,
1443 	GRN_HOOK_GET,
1444 	GRN_HOOK_INSERT,
1445 	GRN_HOOK_DELETE,
1446 	GRN_HOOK_SELECT,
1447 }
1448 
1449 //Declaration name in C language
1450 enum
1451 {
1452 	GRN_HOOK_SET = .grn_hook_entry.GRN_HOOK_SET,
1453 	GRN_HOOK_GET = .grn_hook_entry.GRN_HOOK_GET,
1454 	GRN_HOOK_INSERT = .grn_hook_entry.GRN_HOOK_INSERT,
1455 	GRN_HOOK_DELETE = .grn_hook_entry.GRN_HOOK_DELETE,
1456 	GRN_HOOK_SELECT = .grn_hook_entry.GRN_HOOK_SELECT,
1457 }
1458 
1459 //GRN_API
1460 .grn_rc grn_obj_add_hook(.grn_ctx* ctx, .grn_obj* obj, .grn_hook_entry entry, int offset, .grn_obj* proc, .grn_obj* data);
1461 
1462 //GRN_API
1463 int grn_obj_get_nhooks(.grn_ctx* ctx, .grn_obj* obj, .grn_hook_entry entry);
1464 
1465 //GRN_API
1466 .grn_obj* grn_obj_get_hook(.grn_ctx* ctx, .grn_obj* obj, .grn_hook_entry entry, int offset, .grn_obj* data);
1467 
1468 //GRN_API
1469 .grn_rc grn_obj_delete_hook(.grn_ctx* ctx, .grn_obj* obj, .grn_hook_entry entry, int offset);
1470 
1471 //GRN_API
1472 .grn_obj* grn_obj_open(.grn_ctx* ctx, ubyte type, .grn_obj_flags flags, .grn_id domain);
1473 
1474 /* Deprecated since 5.0.1. Use grn_column_find_index_data() instead. */
1475 
1476 //GRN_API
1477 int grn_column_index(.grn_ctx* ctx, .grn_obj* column, .grn_operator op, .grn_obj** indexbuf, int buf_size, int* section);
1478 
1479 /* @since 5.0.1. */
1480 struct _grn_index_datum
1481 {
1482 	.grn_obj* index;
1483 	uint section;
1484 }
1485 
1486 alias grn_index_datum = ._grn_index_datum;
1487 
1488 /* @since 5.0.1. */
1489 
1490 //GRN_API
1491 uint grn_column_find_index_data(.grn_ctx* ctx, .grn_obj* column, .grn_operator op, .grn_index_datum* index_data, uint n_index_data);
1492 /* @since 5.1.2. */
1493 
1494 //GRN_API
1495 uint grn_column_get_all_index_data(.grn_ctx* ctx, .grn_obj* column, .grn_index_datum* index_data, uint n_index_data);
1496 
1497 /* @since 9.1.2. */
1498 //GRN_API
1499 .grn_rc grn_column_get_all_index_columns(.grn_ctx* ctx, .grn_obj* column, .grn_obj* index_columns);
1500 
1501 //GRN_API
1502 .grn_rc grn_obj_delete_by_id(.grn_ctx* ctx, .grn_obj* db, .grn_id id, .grn_bool removep);
1503 
1504 //GRN_API
1505 .grn_rc grn_obj_path_by_id(.grn_ctx* ctx, .grn_obj* db, .grn_id id, char* buffer);
1506 
1507 /* query & snippet */
1508 
1509 static if (!__traits(compiles, .GRN_QUERY_AND)) {
1510 	enum GRN_QUERY_AND = '+';
1511 }
1512 
1513 static if (!__traits(compiles, .GRN_QUERY_AND_NOT)) {
1514 	static if (__traits(compiles, .GRN_QUERY_BUT)) {
1515 		/* Deprecated. Just for backward compatibility. */
1516 		enum GRN_QUERY_AND_NOT = .GRN_QUERY_BUT;
1517 	} else {
1518 		enum GRN_QUERY_AND_NOT = '-';
1519 	}
1520 }
1521 
1522 static if (!__traits(compiles, .GRN_QUERY_ADJ_INC)) {
1523 	enum GRN_QUERY_ADJ_INC = '>';
1524 }
1525 
1526 static if (!__traits(compiles, .GRN_QUERY_ADJ_DEC)) {
1527 	enum GRN_QUERY_ADJ_DEC = '<';
1528 }
1529 
1530 static if (!__traits(compiles, .GRN_QUERY_ADJ_NEG)) {
1531 	enum GRN_QUERY_ADJ_NEG = '~';
1532 }
1533 
1534 static if (!__traits(compiles, .GRN_QUERY_PREFIX)) {
1535 	enum GRN_QUERY_PREFIX = '*';
1536 }
1537 
1538 static if (!__traits(compiles, .GRN_QUERY_PARENL)) {
1539 	enum GRN_QUERY_PARENL = '(';
1540 }
1541 
1542 static if (!__traits(compiles, .GRN_QUERY_PARENR)) {
1543 	enum GRN_QUERY_PARENR = ')';
1544 }
1545 
1546 static if (!__traits(compiles, .GRN_QUERY_QUOTEL)) {
1547 	enum GRN_QUERY_QUOTEL = '"';
1548 }
1549 
1550 static if (!__traits(compiles, .GRN_QUERY_QUOTER)) {
1551 	enum GRN_QUERY_QUOTER = '"';
1552 }
1553 
1554 static if (!__traits(compiles, .GRN_QUERY_ESCAPE)) {
1555 	enum GRN_QUERY_ESCAPE = '\\';
1556 }
1557 
1558 static if (!__traits(compiles, .GRN_QUERY_COLUMN)) {
1559 	enum GRN_QUERY_COLUMN = ':';
1560 }
1561 
1562 struct _grn_snip_mapping
1563 {
1564 	void* dummy;
1565 }
1566 
1567 alias grn_snip_mapping = ._grn_snip_mapping;
1568 
1569 enum GRN_SNIP_NORMALIZE = 0x01 << 0;
1570 enum GRN_SNIP_COPY_TAG = 0x01 << 1;
1571 enum GRN_SNIP_SKIP_LEADING_SPACES = 0x01 << 2;
1572 
1573 /*
1574 //ToDo: 
1575 #define GRN_SNIP_MAPPING_HTML_ESCAPE ((.grn_snip_mapping *)-1)
1576 */
1577 
1578 //GRN_API
1579 .grn_obj* grn_snip_open(.grn_ctx* ctx, int flags, uint width, uint max_results, const (char)* defaultopentag, uint defaultopentag_len, const (char)* defaultclosetag, uint defaultclosetag_len, .grn_snip_mapping* mapping);
1580 
1581 //GRN_API
1582 .grn_rc grn_snip_add_cond(.grn_ctx* ctx, .grn_obj* snip, const (char)* keyword, uint keyword_len, const (char)* opentag, uint opentag_len, const (char)* closetag, uint closetag_len);
1583 
1584 //GRN_API
1585 .grn_rc grn_snip_set_normalizer(.grn_ctx* ctx, .grn_obj* snip, .grn_obj* normalizer);
1586 
1587 //GRN_API
1588 .grn_obj* grn_snip_get_normalizer(.grn_ctx* ctx, .grn_obj* snip);
1589 
1590 //GRN_API
1591 .grn_rc grn_snip_set_delimiter_regexp(.grn_ctx* ctx, .grn_obj* snip, const (char)* pattern, int pattern_length);
1592 
1593 //GRN_API
1594 const (char)* grn_snip_get_delimiter_regexp(.grn_ctx* ctx, .grn_obj* snip, size_t* pattern_length);
1595 
1596 //GRN_API
1597 .grn_rc grn_snip_exec(.grn_ctx* ctx, .grn_obj* snip, const (char)* string_, uint string_len, uint* nresults, uint* max_tagged_len);
1598 
1599 //GRN_API
1600 .grn_rc grn_snip_get_result(.grn_ctx* ctx, .grn_obj* snip, const uint index, char* result, uint* result_len);
1601 
1602 /* log */
1603 
1604 enum GRN_LOG_NONE = 0x00 << 0;
1605 enum GRN_LOG_TIME = 0x01 << 0;
1606 enum GRN_LOG_TITLE = 0x01 << 1;
1607 enum GRN_LOG_MESSAGE = 0x01 << 2;
1608 enum GRN_LOG_LOCATION = 0x01 << 3;
1609 enum GRN_LOG_PID = 0x01 << 4;
1610 enum GRN_LOG_PROCESS_ID = .GRN_LOG_PID;
1611 enum GRN_LOG_THREAD_ID = 0x01 << 5;
1612 enum GRN_LOG_ALL = .GRN_LOG_TIME | .GRN_LOG_TITLE | .GRN_LOG_MESSAGE | .GRN_LOG_LOCATION | .GRN_LOG_PROCESS_ID | .GRN_LOG_THREAD_ID;
1613 enum GRN_LOG_DEFAULT = .GRN_LOG_TIME | .GRN_LOG_MESSAGE;
1614 
1615 /* Deprecated since 2.1.2. Use .grn_logger instead. */
1616 struct _grn_logger_info
1617 {
1618 extern (C):
1619 	.grn_log_level max_level;
1620 	int flags;
1621 	void function (int, const (char)*, const (char)*, const (char)*, const (char)*, void*) func;
1622 	void* func_arg;
1623 }
1624 
1625 /* Deprecated since 2.1.2. Use .grn_logger instead. */
1626 alias grn_logger_info = ._grn_logger_info;
1627 
1628 /* Deprecated since 2.1.2. Use grn_logger_set() instead. */
1629 
1630 //GRN_API
1631 .grn_rc grn_logger_info_set(.grn_ctx* ctx, const (.grn_logger_info)* info);
1632 
1633 struct _grn_logger
1634 {
1635 extern (C):
1636 	.grn_log_level max_level;
1637 	int flags;
1638 	void* user_data;
1639 	void function (.grn_ctx* ctx, .grn_log_level level, const (char)* timestamp, const (char)* title, const (char)* message, const (char)* location, void* user_data) log;
1640 	void function (.grn_ctx* ctx, void* user_data) reopen;
1641 	void function (.grn_ctx* ctx, void* user_data) fin;
1642 }
1643 
1644 alias grn_logger = ._grn_logger;
1645 
1646 //GRN_API
1647 .grn_bool grn_log_flags_parse(const (char)* string_, int string_size, int* flags);
1648 
1649 //GRN_API
1650 .grn_rc grn_logger_set(.grn_ctx* ctx, const (.grn_logger)* logger);
1651 
1652 //GRN_API
1653 void grn_logger_set_max_level(.grn_ctx* ctx, .grn_log_level max_level);
1654 
1655 //GRN_API
1656 .grn_log_level grn_logger_get_max_level(.grn_ctx* ctx);
1657 
1658 /+
1659 #ifdef __GNUC__
1660 # define GRN_ATTRIBUTE_PRINTF(fmt_pos) __attribute__ ((format(printf, fmt_pos, fmt_pos + 1)))
1661 #else
1662 # define GRN_ATTRIBUTE_PRINTF(fmt_pos)
1663 #endif /* __GNUC__ */
1664 
1665 #if defined(__clang__)
1666 # if __has_attribute(__alloc_size__)
1667 #  define HAVE_ALLOC_SIZE_ATTRIBUTE
1668 # endif /* __has_attribute(__alloc_size__) */
1669 #elif defined(__GNUC__) && ((__GNUC__ >= 5) || (__GNUC__ > 4 && __GNUC_MINOR__ >= 3))
1670 # define HAVE_ALLOC_SIZE_ATTRIBUTE
1671 #endif /* __clang__ */
1672 
1673 #ifdef HAVE_ALLOC_SIZE_ATTRIBUTE
1674 # define GRN_ATTRIBUTE_ALLOC_SIZE(size) __attribute__ ((alloc_size(size)))
1675 # define GRN_ATTRIBUTE_ALLOC_SIZE_N(n, size) __attribute__ ((alloc_size(n, size)))
1676 #else
1677 # define GRN_ATTRIBUTE_ALLOC_SIZE(size)
1678 # define GRN_ATTRIBUTE_ALLOC_SIZE_N(n, size)
1679 #endif /* HAVE_ALLOC_SIZE_ATTRIBUTE */
1680 
1681 //GRN_API
1682 void grn_logger_put(.grn_ctx* ctx, .grn_log_level level, const (char)* file, int line, const (char)* func, const (char)* fmt, ...) GRN_ATTRIBUTE_PRINTF(6);
1683 +/
1684 
1685 //GRN_API
1686 void grn_logger_putv(.grn_ctx* ctx, .grn_log_level level, const (char)* file, int line, const (char)* func, const (char)* fmt, core.stdc.stdarg.va_list ap);
1687 
1688 //GRN_API
1689 void grn_logger_reopen(.grn_ctx* ctx);
1690 
1691 //GRN_API
1692 .grn_bool grn_logger_pass(.grn_ctx* ctx, .grn_log_level level);
1693 
1694 //GRN_API
1695 .grn_bool grn_logger_is_default_logger(.grn_ctx* ctx);
1696 
1697 static if (!__traits(compiles, GRN_LOG_DEFAULT_LEVEL)) {
1698 	enum GRN_LOG_DEFAULT_LEVEL = .grn_log_level.GRN_LOG_NOTICE;
1699 }
1700 
1701 //GRN_API
1702 void grn_default_logger_set_max_level(.grn_log_level level);
1703 
1704 //GRN_API
1705 .grn_log_level grn_default_logger_get_max_level();
1706 
1707 //GRN_API
1708 void grn_default_logger_set_flags(int flags);
1709 
1710 //GRN_API
1711 int grn_default_logger_get_flags();
1712 
1713 //GRN_API
1714 void grn_default_logger_set_path(const (char)* path);
1715 
1716 //GRN_API
1717 const (char)* grn_default_logger_get_path();
1718 
1719 //GRN_API
1720 void grn_default_logger_set_rotate_threshold_size(.off_t threshold);
1721 
1722 //GRN_API
1723 .off_t grn_default_logger_get_rotate_threshold_size();
1724 
1725 /*
1726 #define GRN_LOG(ctx, level, ...)
1727 if (grn_logger_pass(ctx, level)) {
1728 	grn_logger_put(ctx, (level), __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__);
1729 }
1730 */
1731 
1732 struct _grn_query_logger
1733 {
1734 extern (C):
1735 	uint flags;
1736 	void* user_data;
1737 	void function(.grn_ctx* ctx, uint flag, const (char)* timestamp, const (char)* info, const (char)* message, void* user_data) log;
1738 	void function(.grn_ctx* ctx, void* user_data) reopen;
1739 	void function(.grn_ctx* ctx, void* user_data) fin;
1740 }
1741 
1742 alias grn_query_logger = ._grn_query_logger;
1743 
1744 //GRN_API
1745 .grn_bool grn_query_log_flags_parse(const (char)* string_, int string_size, uint* flags);
1746 
1747 //GRN_API
1748 .grn_rc grn_query_logger_set(.grn_ctx* ctx, const (.grn_query_logger)* logger);
1749 
1750 //GRN_API
1751 void grn_query_logger_set_flags(.grn_ctx* ctx, uint flags);
1752 
1753 //GRN_API
1754 void grn_query_logger_add_flags(.grn_ctx* ctx, uint flags);
1755 
1756 //GRN_API
1757 void grn_query_logger_remove_flags(.grn_ctx* ctx, uint flags);
1758 
1759 //GRN_API
1760 uint grn_query_logger_get_flags(.grn_ctx* ctx);
1761 
1762 /+
1763 //ToDo: 
1764 //GRN_API
1765 void grn_query_logger_put(.grn_ctx* ctx, uint flag, const (char)* mark, const (char)* format, ...) GRN_ATTRIBUTE_PRINTF(4);
1766 +/
1767 
1768 //GRN_API
1769 void grn_query_logger_reopen(.grn_ctx* ctx);
1770 
1771 //GRN_API
1772 .grn_bool grn_query_logger_pass(.grn_ctx* ctx, uint flag);
1773 
1774 //GRN_API
1775 void grn_default_query_logger_set_flags(uint flags);
1776 
1777 //GRN_API
1778 uint grn_default_query_logger_get_flags();
1779 
1780 //GRN_API
1781 void grn_default_query_logger_set_path(const (char)* path);
1782 
1783 //GRN_API
1784 const (char)* grn_default_query_logger_get_path();
1785 
1786 //GRN_API
1787 void grn_default_query_logger_set_rotate_threshold_size(.off_t threshold);
1788 
1789 //GRN_API
1790 .off_t grn_default_query_logger_get_rotate_threshold_size();
1791 
1792 /*
1793 //ToDo: 
1794 #define GRN_QUERY_LOG(ctx, flag, mark, format, ...)
1795 if (grn_query_logger_pass(ctx, flag)) {
1796 	grn_query_logger_put(ctx, (flag), (mark), format, __VA_ARGS__);
1797 }
1798 */
1799 
1800 /* grn_bulk */
1801 
1802 enum GRN_BULK_BUFSIZE = .grn_obj.sizeof - .grn_obj_header.sizeof;
1803 /* This assumes that .GRN_BULK_BUFSIZE is less than 32 (= 0x20). */
1804 enum GRN_BULK_BUFSIZE_MAX = 0x1F;
1805 
1806 pragma(inline, true)
1807 pure nothrow @trusted @nogc @live
1808 size_t GRN_BULK_SIZE_IN_FLAGS(size_t flags)
1809 
1810 	do
1811 	{
1812 		return flags & .GRN_BULK_BUFSIZE_MAX;
1813 	}
1814 
1815 pragma(inline, true)
1816 pure nothrow @trusted @nogc @live
1817 ubyte GRN_BULK_OUTP(scope const .grn_obj* bulk)
1818 
1819 	in
1820 	{
1821 		assert(bulk != null);
1822 	}
1823 
1824 	do
1825 	{
1826 		return bulk.header.impl_flags & .GRN_OBJ_OUTPLACE;
1827 	}
1828 
1829 pragma(inline, true)
1830 pure nothrow @trusted @nogc @live
1831 void GRN_BULK_REWIND(scope .grn_obj* bulk)
1832 
1833 	in
1834 	{
1835 		assert(bulk != null);
1836 	}
1837 
1838 	do
1839 	{
1840 		if (bulk.header.type == .GRN_VECTOR) {
1841 			.grn_obj* _body = bulk.u.v.body_;
1842 
1843 			if (_body != null) {
1844 				if (.GRN_BULK_OUTP(_body)) {
1845 					_body.u.b.curr = _body.u.b.head;
1846 				} else {
1847 					_body.header.flags &= ~.GRN_BULK_BUFSIZE_MAX;
1848 				}
1849 			}
1850 
1851 			bulk.u.v.n_sections = 0;
1852 		} else {
1853 			if (.GRN_BULK_OUTP(bulk)) {
1854 				bulk.u.b.curr = bulk.u.b.head;
1855 			} else {
1856 				bulk.header.flags &= ~.GRN_BULK_BUFSIZE_MAX;
1857 			}
1858 		}
1859 	}
1860 
1861 pragma(inline, true)
1862 pure nothrow @trusted @nogc @live
1863 void GRN_BULK_SET_CURR(scope .grn_obj* buf, char* p)
1864 
1865 	in
1866 	{
1867 		assert(buf != null);
1868 	}
1869 
1870 	do
1871 	{
1872 		if (.GRN_BULK_OUTP(buf)) {
1873 			buf.u.b.curr = p;
1874 		} else {
1875 			buf.header.flags = cast(.grn_obj_flags)(p -GRN_BULK_HEAD(buf));
1876 		}
1877 	}
1878 
1879 pragma(inline, true)
1880 pure nothrow @trusted @nogc @live
1881 void GRN_BULK_INCR_LEN(scope .grn_obj* bulk, size_t len)
1882 
1883 	in
1884 	{
1885 		assert(bulk != null);
1886 	}
1887 
1888 	do
1889 	{
1890 		if (.GRN_BULK_OUTP(bulk)) {
1891 			bulk.u.b.curr += len;
1892 		} else {
1893 			bulk.header.flags += cast(.grn_obj_flags)(len);
1894 		}
1895 	}
1896 
1897 pragma(inline, true)
1898 pure nothrow @trusted @nogc @live
1899 size_t GRN_BULK_WSIZE(return scope .grn_obj* bulk)
1900 
1901 	in
1902 	{
1903 		assert(bulk != null);
1904 	}
1905 
1906 	do
1907 	{
1908 		return (.GRN_BULK_OUTP(bulk)) ? (cast(size_t)(bulk.u.b.tail - bulk.u.b.head)) : (.GRN_BULK_BUFSIZE);
1909 	}
1910 
1911 pragma(inline, true)
1912 pure nothrow @trusted @nogc @live
1913 size_t GRN_BULK_REST(return scope .grn_obj* bulk)
1914 
1915 	in
1916 	{
1917 		assert(bulk != null);
1918 	}
1919 
1920 	do
1921 	{
1922 		return (.GRN_BULK_OUTP(bulk)) ? (cast(size_t)(bulk.u.b.tail - bulk.u.b.curr)) : (.GRN_BULK_BUFSIZE - .GRN_BULK_SIZE_IN_FLAGS(bulk.header.flags));
1923 	}
1924 
1925 pragma(inline, true)
1926 pure nothrow @trusted @nogc @live
1927 size_t GRN_BULK_VSIZE(return scope .grn_obj* bulk)
1928 
1929 	in
1930 	{
1931 		assert(bulk != null);
1932 	}
1933 
1934 	do
1935 	{
1936 		return (.GRN_BULK_OUTP(bulk)) ? (cast(size_t)(bulk.u.b.curr - bulk.u.b.head)) : (.GRN_BULK_SIZE_IN_FLAGS(bulk.header.flags));
1937 	}
1938 
1939 pragma(inline, true)
1940 pure nothrow @trusted @nogc @live
1941 char* GRN_BULK_EMPTYP(return scope .grn_obj* bulk)
1942 
1943 	in
1944 	{
1945 		assert(bulk != null);
1946 	}
1947 
1948 	do
1949 	{
1950 		return (.GRN_BULK_OUTP(bulk)) ? (cast(char*)(bulk.u.b.curr == bulk.u.b.head)) : (cast(char*)(!(.GRN_BULK_SIZE_IN_FLAGS(bulk.header.flags))));
1951 	}
1952 
1953 pragma(inline, true)
1954 pure nothrow @trusted @nogc @live
1955 char* GRN_BULK_HEAD(return scope .grn_obj* bulk)
1956 
1957 	in
1958 	{
1959 		assert(bulk != null);
1960 	}
1961 
1962 	do
1963 	{
1964 		return (.GRN_BULK_OUTP(bulk)) ? (bulk.u.b.head) : (cast(char*)(&(bulk.u.b.head)));
1965 	}
1966 
1967 pragma(inline, true)
1968 pure nothrow @trusted @nogc @live
1969 char* GRN_BULK_CURR(return scope .grn_obj* bulk)
1970 
1971 	in
1972 	{
1973 		assert(bulk != null);
1974 	}
1975 
1976 	do
1977 	{
1978 		return (.GRN_BULK_OUTP(bulk)) ? (bulk.u.b.curr) : (cast(char*)(&(bulk.u.b.head)) + .GRN_BULK_SIZE_IN_FLAGS(bulk.header.flags));
1979 	}
1980 
1981 pragma(inline, true)
1982 pure nothrow @trusted @nogc @live
1983 char* GRN_BULK_TAIL(return scope .grn_obj* bulk)
1984 
1985 	in
1986 	{
1987 		assert(bulk != null);
1988 	}
1989 
1990 	do
1991 	{
1992 		return (.GRN_BULK_OUTP(bulk)) ? (bulk.u.b.tail) : (cast(char*)(&(bulk[1])));
1993 	}
1994 
1995 //GRN_API
1996 .grn_rc grn_bulk_reinit(.grn_ctx* ctx, .grn_obj* bulk, size_t size);
1997 
1998 //GRN_API
1999 .grn_rc grn_bulk_resize(.grn_ctx* ctx, .grn_obj* bulk, size_t newsize);
2000 
2001 //GRN_API
2002 .grn_rc grn_bulk_write(.grn_ctx* ctx, .grn_obj* bulk, const (char)* str, size_t len);
2003 
2004 //GRN_API
2005 .grn_rc grn_bulk_write_from(.grn_ctx* ctx, .grn_obj* bulk, const (char)* str, size_t from, size_t len);
2006 
2007 //GRN_API
2008 .grn_rc grn_bulk_reserve(.grn_ctx* ctx, .grn_obj* bulk, size_t len);
2009 
2010 //GRN_API
2011 .grn_rc grn_bulk_space(.grn_ctx* ctx, .grn_obj* bulk, size_t len);
2012 
2013 //GRN_API
2014 .grn_rc grn_bulk_truncate(.grn_ctx* ctx, .grn_obj* bulk, size_t len);
2015 
2016 //GRN_API
2017 char* grn_bulk_detach(.grn_ctx* ctx, .grn_obj* bulk);
2018 
2019 //GRN_API
2020 .grn_rc grn_bulk_fin(.grn_ctx* ctx, .grn_obj* bulk);
2021 
2022 /* grn_text */
2023 
2024 //GRN_API
2025 .grn_rc grn_text_itoa(.grn_ctx* ctx, .grn_obj* bulk, int i);
2026 
2027 //GRN_API
2028 .grn_rc grn_text_itoa_padded(.grn_ctx* ctx, .grn_obj* bulk, int i, char ch, size_t len);
2029 
2030 //GRN_API
2031 .grn_rc grn_text_lltoa(.grn_ctx* ctx, .grn_obj* bulk, long i);
2032 
2033 //GRN_API
2034 .grn_rc grn_text_f32toa(.grn_ctx* ctx, .grn_obj* bulk, float f);
2035 
2036 //GRN_API
2037 .grn_rc grn_text_ftoa(.grn_ctx* ctx, .grn_obj* bulk, double d);
2038 
2039 //GRN_API
2040 .grn_rc grn_text_itoh(.grn_ctx* ctx, .grn_obj* bulk, uint i, size_t len);
2041 
2042 //GRN_API
2043 .grn_rc grn_text_itob(.grn_ctx* ctx, .grn_obj* bulk, .grn_id id);
2044 
2045 //GRN_API
2046 .grn_rc grn_text_lltob32h(.grn_ctx* ctx, .grn_obj* bulk, long i);
2047 
2048 //GRN_API
2049 .grn_rc grn_text_benc(.grn_ctx* ctx, .grn_obj* bulk, uint v);
2050 
2051 //GRN_API
2052 .grn_rc grn_text_esc(.grn_ctx* ctx, .grn_obj* bulk, const (char)* s, size_t len);
2053 
2054 //GRN_API
2055 .grn_rc grn_text_urlenc(.grn_ctx* ctx, .grn_obj* buf, const (char)* str, size_t len);
2056 
2057 //GRN_API
2058 const (char)* grn_text_urldec(.grn_ctx* ctx, .grn_obj* buf, const (char)* s, const (char)* e, char d);
2059 
2060 //GRN_API
2061 .grn_rc grn_text_escape_xml(.grn_ctx* ctx, .grn_obj* buf, const (char)* s, size_t len);
2062 
2063 //GRN_API
2064 .grn_rc grn_text_time2rfc1123(.grn_ctx* ctx, .grn_obj* bulk, int sec);
2065 
2066 /+
2067 //ToDo:
2068 //GRN_API
2069 .grn_rc grn_text_printf(.grn_ctx* ctx, .grn_obj* bulk, const (char)* format, ...) GRN_ATTRIBUTE_PRINTF(3);
2070 +/
2071 
2072 //GRN_API
2073 .grn_rc grn_text_printfv(.grn_ctx* ctx, .grn_obj* bulk, const (char)* format, core.stdc.stdarg.va_list args);
2074 /* Deprecated since 10.0.3. Use grn_text_printfv() instead. */
2075 //GRN_API
2076 .grn_rc grn_text_vprintf(.grn_ctx* ctx, .grn_obj* bulk, const (char)* format, core.stdc.stdarg.va_list args);
2077 
2078 alias grn_recv_handler_func = extern (C) void function(.grn_ctx* ctx, int flags, void* user_data);
2079 
2080 //GRN_API
2081 void grn_ctx_recv_handler_set(.grn_ctx*, .grn_recv_handler_func func, void* user_data);
2082 
2083 
2084 /* various values exchanged via .grn_obj */
2085 
2086 enum GRN_OBJ_DO_SHALLOW_COPY = .GRN_OBJ_REFER|.GRN_OBJ_OUTPLACE;
2087 enum GRN_OBJ_VECTOR = 0x01 << 7;
2088 
2089 /+
2090 #define GRN_OBJ_DO_SHALLOW_COPY        (GRN_OBJ_REFER|GRN_OBJ_OUTPLACE)
2091 #define GRN_OBJ_VECTOR                 (0x01<<7)
2092 
2093 #define GRN_OBJ_MUTABLE(obj) ((obj) && (obj)->header.type <= GRN_VECTOR)
2094 
2095 #define GRN_VALUE_FIX_SIZE_INIT(obj,flags,domain)\
2096 	GRN_OBJ_INIT((obj), ((flags) & GRN_OBJ_VECTOR) ? GRN_UVECTOR : GRN_BULK,\
2097 	             ((flags) & GRN_OBJ_DO_SHALLOW_COPY), (domain))
2098 #define GRN_VALUE_VAR_SIZE_INIT(obj,flags,domain)\
2099 	GRN_OBJ_INIT((obj), ((flags) & GRN_OBJ_VECTOR) ? GRN_VECTOR : GRN_BULK,\
2100 	             ((flags) & GRN_OBJ_DO_SHALLOW_COPY), (domain))
2101 
2102 #define GRN_VOID_INIT(obj) GRN_OBJ_INIT((obj), GRN_VOID, 0, GRN_DB_VOID)
2103 #define GRN_TEXT_INIT(obj,flags) \
2104 	GRN_VALUE_VAR_SIZE_INIT(obj, flags, GRN_DB_TEXT)
2105 #define GRN_SHORT_TEXT_INIT(obj,flags) \
2106 	GRN_VALUE_VAR_SIZE_INIT(obj, flags, GRN_DB_SHORT_TEXT)
2107 #define GRN_LONG_TEXT_INIT(obj,flags) \
2108 	GRN_VALUE_VAR_SIZE_INIT(obj, flags, GRN_DB_LONG_TEXT)
2109 #define GRN_TEXT_SET_REF(obj,str,len) do {\
2110 		(obj)->u.b.head = (char *)(str);\
2111 		(obj)->u.b.curr = (char *)(str) + (len);\
2112 	} while (0)
2113 #define GRN_TEXT_SET(ctx,obj,str,len) do {\
2114 		if ((obj)->header.impl_flags & GRN_OBJ_REFER) {\
2115 			GRN_TEXT_SET_REF((obj), (str), (len));\
2116 		} else {\
2117 			grn_bulk_write_from((ctx), (obj), (const char *)(str), 0, (unsigned int)(len));\
2118 		}\
2119 	} while (0)
2120 #define GRN_TEXT_PUT(ctx,obj,str,len) \
2121 	grn_bulk_write((ctx), (obj), (const char *)(str), (unsigned int)(len))
2122 #define GRN_TEXT_PUTC(ctx,obj,c) do {\
2123 		char _c = (c); grn_bulk_write((ctx), (obj), &_c, 1);\
2124 	} while (0)
2125 
2126 #define GRN_TEXT_PUTS(ctx,obj,str) GRN_TEXT_PUT((ctx), (obj), (str), strlen(str))
2127 #define GRN_TEXT_SETS(ctx,obj,str) GRN_TEXT_SET((ctx), (obj), (str), strlen(str))
2128 #define GRN_TEXT_VALUE(obj) GRN_BULK_HEAD(obj)
2129 #define GRN_TEXT_LEN(obj) GRN_BULK_VSIZE(obj)
2130 
2131 #define GRN_TEXT_EQUAL_CSTRING(bulk, string_)\
2132 	(GRN_TEXT_LEN(bulk) == strlen(string_) &&\
2133 	 memcmp(GRN_TEXT_VALUE(bulk), string_, GRN_TEXT_LEN(bulk)) == 0)
2134 
2135 #define GRN_BOOL_INIT(obj,flags) \
2136 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_BOOL)
2137 #define GRN_INT8_INIT(obj,flags) \
2138 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT8)
2139 #define GRN_UINT8_INIT(obj,flags) \
2140 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT8)
2141 #define GRN_INT16_INIT(obj,flags) \
2142 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT16)
2143 #define GRN_UINT16_INIT(obj,flags) \
2144 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT16)
2145 #define GRN_INT32_INIT(obj,flags) \
2146 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT32)
2147 #define GRN_UINT32_INIT(obj,flags) \
2148 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT32)
2149 #define GRN_INT64_INIT(obj,flags) \
2150 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT64)
2151 #define GRN_UINT64_INIT(obj,flags) \
2152 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT64)
2153 #define GRN_FLOAT32_INIT(obj, flags) \
2154 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_FLOAT32)
2155 #define GRN_FLOAT_INIT(obj,flags) \
2156 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_FLOAT)
2157 #define GRN_TIME_INIT(obj,flags) \
2158 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_TIME)
2159 #define GRN_RECORD_INIT GRN_VALUE_FIX_SIZE_INIT
2160 #define GRN_PTR_INIT(obj,flags,domain)\
2161 	GRN_OBJ_INIT((obj), ((flags) & GRN_OBJ_VECTOR) ? GRN_PVECTOR : GRN_PTR,\
2162 	             ((flags) & (GRN_OBJ_DO_SHALLOW_COPY | GRN_OBJ_OWN)),\
2163 	             (domain))
2164 #define GRN_TOKYO_GEO_POINT_INIT(obj,flags) \
2165 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_TOKYO_GEO_POINT)
2166 #define GRN_WGS84_GEO_POINT_INIT(obj,flags) \
2167 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_WGS84_GEO_POINT)
2168 
2169 #define GRN_BOOL_SET(ctx,obj,val) do {\
2170 		bool _val = (bool)(val);\
2171 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(bool));\
2172 	} while (0)
2173 #define GRN_INT8_SET(ctx,obj,val) do {\
2174 		int8_t _val = (int8_t)(val);\
2175 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(int8_t));\
2176 	} while (0)
2177 #define GRN_UINT8_SET(ctx,obj,val) do {\
2178 		uint8_t _val = (uint8_t)(val);\
2179 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(uint8_t));\
2180 	} while (0)
2181 #define GRN_INT16_SET(ctx,obj,val) do {\
2182 		int16_t _val = (int16_t)(val);\
2183 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(int16_t));\
2184 	} while (0)
2185 #define GRN_UINT16_SET(ctx,obj,val) do {\
2186 		uint16_t _val = (uint16_t)(val);\
2187 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(uint16_t));\
2188 	} while (0)
2189 #define GRN_INT32_SET(ctx,obj,val) do {\
2190 		int32_t _val = (int32_t)(val);\
2191 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(int32_t));\
2192 	} while (0)
2193 #define GRN_UINT32_SET(ctx,obj,val) do {\
2194 		uint32_t _val = (uint32_t)(val);\
2195 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(uint32_t));\
2196 	} while (0)
2197 #define GRN_INT64_SET(ctx,obj,val) do {\
2198 		int64_t _val = (int64_t)(val);\
2199 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(int64_t));\
2200 	} while (0)
2201 #define GRN_UINT64_SET(ctx,obj,val) do {\
2202 		uint64_t _val = (uint64_t)(val);\
2203 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(uint64_t));\
2204 	} while (0)
2205 #define GRN_FLOAT32_SET(ctx, obj, val) \
2206 	do { \
2207 		float _val = (float) (val); \
2208 		grn_bulk_write_from((ctx), (obj), (char*) &_val, 0, sizeof(float)); \
2209 	} while (0)
2210 #define GRN_FLOAT_SET(ctx,obj,val) do {\
2211 		double _val = (double)(val);\
2212 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(double));\
2213 	} while (0)
2214 #define GRN_TIME_SET GRN_INT64_SET
2215 #define GRN_RECORD_SET(ctx,obj,val) do {\
2216 		grn_id _val = (grn_id)(val);\
2217 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(grn_id));\
2218 	} while (0)
2219 #define GRN_PTR_SET(ctx,obj,val) do {\
2220 		grn_obj *_val = (grn_obj *)(val);\
2221 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(grn_obj *));\
2222 	} while (0)
2223 
2224 #define GRN_GEO_DEGREE2MSEC(degree)\
2225 	((int32_t)((degree) * 3600 * 1000 + ((degree) > 0 ? 0.5 : -0.5)))
2226 #define GRN_GEO_MSEC2DEGREE(msec)\
2227 	((((int32_t)(msec)) / 3600.0) * 0.001)
2228 
2229 #define GRN_GEO_POINT_SET(ctx,obj,_latitude,_longitude) do {\
2230 		grn_geo_point _val;\
2231 		_val.latitude = (int)(_latitude);\
2232 		_val.longitude = (int)(_longitude);\
2233 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(grn_geo_point));\
2234 	} while (0)
2235 
2236 #define GRN_BOOL_SET_AT(ctx,obj,offset,val) do {\
2237 		bool _val = (bool)(val);\
2238 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2239 		                    (offset), sizeof(bool));\
2240 	} while (0)
2241 #define GRN_INT8_SET_AT(ctx,obj,offset,val) do {\
2242 		int8_t _val = (int8_t)(val);\
2243 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2244 		                    (offset) * sizeof(int8_t), sizeof(int8_t));\
2245 	} while (0)
2246 #define GRN_UINT8_SET_AT(ctx,obj,offset,val) do { \
2247 		uint8_t _val = (uint8_t)(val);\
2248 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2249 		                    (offset) * sizeof(uint8_t), sizeof(uint8_t));\
2250 	} while (0)
2251 #define GRN_INT16_SET_AT(ctx,obj,offset,val) do {\
2252 		int16_t _val = (int16_t)(val);\
2253 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2254 		                    (offset) * sizeof(int16_t), sizeof(int16_t));\
2255 	} while (0)
2256 #define GRN_UINT16_SET_AT(ctx,obj,offset,val) do { \
2257 		uint16_t _val = (uint16_t)(val);\
2258 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2259 		                    (offset) * sizeof(uint16_t), sizeof(uint16_t));\
2260 	} while (0)
2261 #define GRN_INT32_SET_AT(ctx,obj,offset,val) do {\
2262 		int32_t _val = (int32_t)(val);\
2263 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2264 		                    (offset) * sizeof(int32_t), sizeof(int32_t));\
2265 	} while (0)
2266 #define GRN_UINT32_SET_AT(ctx,obj,offset,val) do { \
2267 		uint32_t _val = (uint32_t)(val);\
2268 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2269 		                    (offset) * sizeof(uint32_t), sizeof(uint32_t));\
2270 	} while (0)
2271 #define GRN_INT64_SET_AT(ctx,obj,offset,val) do {\
2272 		int64_t _val = (int64_t)(val);\
2273 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2274 		                    (offset) * sizeof(int64_t), sizeof(int64_t));\
2275 	} while (0)
2276 #define GRN_UINT64_SET_AT(ctx,obj,offset,val) do {\
2277 		uint64_t _val = (uint64_t)(val);\
2278 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2279 		                    (offset) * sizeof(uint64_t),\
2280 		                    sizeof(uint64_t));\
2281 	} while (0)
2282 #define GRN_FLOAT32_SET_AT(ctx, obj, offset, val) \
2283 	do { \
2284 		float _val = (float) (val); \
2285 		grn_bulk_write_from((ctx), (obj), (char*) &_val, (offset) * sizeof(float), sizeof(float)); \
2286 	} while (0)
2287 #define GRN_FLOAT_SET_AT(ctx,obj,offset,val) do {\
2288 		double _val = (double)(val);\
2289 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2290 		                    (offset) * sizeof(double), sizeof(double));\
2291 	} while (0)
2292 #define GRN_TIME_SET_AT GRN_INT64_SET_AT
2293 #define GRN_RECORD_SET_AT(ctx,obj,offset,val) do {\
2294 		grn_id _val = (grn_id)(val);\
2295 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2296 		                    (offset) * sizeof(grn_id), sizeof(grn_id));\
2297 	} while (0)
2298 #define GRN_PTR_SET_AT(ctx,obj,offset,val) do {\
2299 		grn_obj *_val = (grn_obj *)(val);\
2300 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
2301 		                    (offset) * sizeof(grn_obj *), sizeof(grn_obj *));\
2302 	} while (0)
2303 
2304 #define GRN_BOOL_VALUE(obj) (*((bool *)GRN_BULK_HEAD(obj)))
2305 #define GRN_INT8_VALUE(obj) (*((int8_t *)GRN_BULK_HEAD(obj)))
2306 #define GRN_UINT8_VALUE(obj) (*((uint8_t *)GRN_BULK_HEAD(obj)))
2307 #define GRN_INT16_VALUE(obj) (*((int16_t *)GRN_BULK_HEAD(obj)))
2308 #define GRN_UINT16_VALUE(obj) (*((uint16_t *)GRN_BULK_HEAD(obj)))
2309 #define GRN_INT32_VALUE(obj) (*((int32_t *)GRN_BULK_HEAD(obj)))
2310 #define GRN_UINT32_VALUE(obj) (*((uint32_t *)GRN_BULK_HEAD(obj)))
2311 #define GRN_INT64_VALUE(obj) (*((int64_t *)GRN_BULK_HEAD(obj)))
2312 #define GRN_UINT64_VALUE(obj) (*((uint64_t *)GRN_BULK_HEAD(obj)))
2313 #define GRN_FLOAT32_VALUE(obj) (*((float*) GRN_BULK_HEAD(obj)))
2314 #define GRN_FLOAT_VALUE(obj) (*((double *)GRN_BULK_HEAD(obj)))
2315 #define GRN_TIME_VALUE GRN_INT64_VALUE
2316 #define GRN_RECORD_VALUE(obj) (*((grn_id *)GRN_BULK_HEAD(obj)))
2317 #define GRN_PTR_VALUE(obj) (*((grn_obj **)GRN_BULK_HEAD(obj)))
2318 #define GRN_GEO_POINT_VALUE(obj,_latitude,_longitude) do {\
2319 		grn_geo_point *_val = (grn_geo_point *)GRN_BULK_HEAD(obj);\
2320 		_latitude = _val->latitude;\
2321 		_longitude = _val->longitude;\
2322 	} while (0)
2323 
2324 #define GRN_BOOL_VALUE_AT(obj,offset) (((bool *)GRN_BULK_HEAD(obj))[offset])
2325 #define GRN_INT8_VALUE_AT(obj,offset) (((int8_t *)GRN_BULK_HEAD(obj))[offset])
2326 #define GRN_UINT8_VALUE_AT(obj,offset) (((uint8_t *)GRN_BULK_HEAD(obj))[offset])
2327 #define GRN_INT16_VALUE_AT(obj,offset) (((int16_t *)GRN_BULK_HEAD(obj))[offset])
2328 #define GRN_UINT16_VALUE_AT(obj,offset) (((uint16_t *)GRN_BULK_HEAD(obj))[offset])
2329 #define GRN_INT32_VALUE_AT(obj,offset) (((int32_t *)GRN_BULK_HEAD(obj))[offset])
2330 #define GRN_UINT32_VALUE_AT(obj,offset) (((uint32_t *)GRN_BULK_HEAD(obj))[offset])
2331 #define GRN_INT64_VALUE_AT(obj,offset) (((int64_t *)GRN_BULK_HEAD(obj))[offset])
2332 #define GRN_UINT64_VALUE_AT(obj,offset) (((uint64_t *)GRN_BULK_HEAD(obj))[offset])
2333 #define GRN_FLOAT32_VALUE_AT(obj, offset) (((float*) GRN_BULK_HEAD(obj))[offset])
2334 #define GRN_FLOAT_VALUE_AT(obj,offset) (((double *)GRN_BULK_HEAD(obj))[offset])
2335 #define GRN_TIME_VALUE_AT GRN_INT64_VALUE_AT
2336 #define GRN_RECORD_VALUE_AT(obj,offset) (((grn_id *)GRN_BULK_HEAD(obj))[offset])
2337 #define GRN_PTR_VALUE_AT(obj,offset) (((grn_obj **)GRN_BULK_HEAD(obj))[offset])
2338 
2339 #define GRN_BOOL_PUT(ctx,obj,val) do {\
2340 		bool _val = (bool)(val);\
2341 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(bool));\
2342 	} while (0)
2343 #define GRN_INT8_PUT(ctx,obj,val) do {\
2344 		int8_t _val = (int8_t)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(int8_t));\
2345 	} while (0)
2346 #define GRN_UINT8_PUT(ctx,obj,val) do {\
2347 		uint8_t _val = (uint8_t)(val);\
2348 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(uint8_t));\
2349 	} while (0)
2350 #define GRN_INT16_PUT(ctx,obj,val) do {\
2351 		int16_t _val = (int16_t)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(int16_t));\
2352 	} while (0)
2353 #define GRN_UINT16_PUT(ctx,obj,val) do {\
2354 		uint16_t _val = (uint16_t)(val);\
2355 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(uint16_t));\
2356 	} while (0)
2357 #define GRN_INT32_PUT(ctx,obj,val) do {\
2358 		int32_t _val = (int32_t)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(int32_t));\
2359 	} while (0)
2360 #define GRN_UINT32_PUT(ctx,obj,val) do {\
2361 		uint32_t _val = (uint32_t)(val);\
2362 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(unsigned int));\
2363 	} while (0)
2364 #define GRN_INT64_PUT(ctx,obj,val) do {\
2365 		int64_t _val = (int64_t)(val);\
2366 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(int64_t));\
2367 	} while (0)
2368 #define GRN_UINT64_PUT(ctx,obj,val) do {\
2369 		uint64_t _val = (uint64_t)(val);\
2370 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(uint64_t));\
2371 	} while (0)
2372 #define GRN_FLOAT32_PUT(ctx, obj, val) \
2373 	do { \
2374 		float _val = (float) (val); \
2375 		grn_bulk_write((ctx), (obj), (char*) &_val, sizeof(float)); \
2376 	} while (0)
2377 #define GRN_FLOAT_PUT(ctx,obj,val) do {\
2378 		double _val = (double)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(double));\
2379 	} while (0)
2380 #define GRN_TIME_PUT GRN_INT64_PUT
2381 #define GRN_RECORD_PUT(ctx,obj,val) do {\
2382 		grn_id _val = (grn_id)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(grn_id));\
2383 	} while (0)
2384 #define GRN_PTR_PUT(ctx,obj,val) do {\
2385 		grn_obj *_val = (grn_obj *)(val);\
2386 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(grn_obj *));\
2387 	} while (0)
2388 
2389 #define GRN_BULK_POP(obj, value, type, default) do {\
2390 		if (GRN_BULK_VSIZE(obj) >= sizeof(type)) {\
2391 			GRN_BULK_INCR_LEN((obj), -(sizeof(type)));\
2392 			value = *(type *)(GRN_BULK_CURR(obj));\
2393 		} else {\
2394 			value = default;\
2395 		}\
2396 	} while (0)
2397 #define GRN_BOOL_POP(obj, value) GRN_BULK_POP(obj, value, bool, 0)
2398 #define GRN_INT8_POP(obj, value) GRN_BULK_POP(obj, value, int8_t, 0)
2399 #define GRN_UINT8_POP(obj, value) GRN_BULK_POP(obj, value, uint8_t, 0)
2400 #define GRN_INT16_POP(obj, value) GRN_BULK_POP(obj, value, int16_t, 0)
2401 #define GRN_UINT16_POP(obj, value) GRN_BULK_POP(obj, value, uint16_t, 0)
2402 #define GRN_INT32_POP(obj, value) GRN_BULK_POP(obj, value, int32_t, 0)
2403 #define GRN_UINT32_POP(obj, value) GRN_BULK_POP(obj, value, uint32_t, 0)
2404 #define GRN_INT64_POP(obj, value) GRN_BULK_POP(obj, value, int64_t, 0)
2405 #define GRN_UINT64_POP(obj, value) GRN_BULK_POP(obj, value, uint64_t, 0)
2406 #define GRN_FLOAT32_POP(obj, value) GRN_BULK_POP(obj, value, float, 0.0)
2407 #define GRN_FLOAT_POP(obj, value) GRN_BULK_POP(obj, value, double, 0.0)
2408 #define GRN_TIME_POP GRN_INT64_POP
2409 #define GRN_RECORD_POP(obj, value) GRN_BULK_POP(obj, value, grn_id, GRN_ID_NIL)
2410 #define GRN_PTR_POP(obj, value) GRN_BULK_POP(obj, value, grn_obj *, NULL)
2411 
2412 #define GRN_BULK_VECTOR_SIZE(obj, type) (GRN_BULK_VSIZE(obj) / sizeof(type))
2413 #define GRN_BOOL_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, bool)
2414 #define GRN_INT8_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, int8_t)
2415 #define GRN_UINT8_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, uint8_t)
2416 #define GRN_INT16_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, int16_t)
2417 #define GRN_UINT16_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, uint16_t)
2418 #define GRN_INT32_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, int32_t)
2419 #define GRN_UINT32_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, uint32_t)
2420 #define GRN_INT64_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, int64_t)
2421 #define GRN_UINT64_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, uint64_t)
2422 #define GRN_FLOAT32_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, float)
2423 #define GRN_FLOAT_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, double)
2424 #define GRN_TIME_VECTOR_SIZE GRN_INT64_VECTOR_SIZE
2425 #define GRN_RECORD_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, grn_id)
2426 #define GRN_PTR_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, grn_obj *)
2427 +/
2428 
2429 //GRN_API
2430 .grn_rc grn_ctx_push(.grn_ctx* ctx, .grn_obj* obj);
2431 
2432 //GRN_API
2433 .grn_obj* grn_ctx_pop(.grn_ctx* ctx);
2434 
2435 //GRN_API
2436 int grn_obj_columns(.grn_ctx* ctx, .grn_obj* table, const (char)* str, uint str_size, .grn_obj* res);
2437 
2438 //GRN_API
2439 .grn_rc grn_load(.grn_ctx* ctx, .grn_content_type input_type, const (char)* table, uint table_len, const (char)* columns, uint columns_len, const (char)* values, uint values_len, const (char)* ifexists, uint ifexists_len, const (char)* each, uint each_len);
2440 
2441 enum GRN_CTX_MORE = 0x01 << 0;
2442 enum GRN_CTX_TAIL = 0x01 << 1;
2443 enum GRN_CTX_HEAD = 0x01 << 2;
2444 enum GRN_CTX_QUIET = 0x01 << 3;
2445 enum GRN_CTX_QUIT = 0x01 << 4;
2446 
2447 //GRN_API
2448 .grn_rc grn_ctx_connect(.grn_ctx* ctx, const (char)* host, int port, int flags);
2449 
2450 //GRN_API
2451 uint grn_ctx_send(.grn_ctx* ctx, const (char)* str, uint str_len, int flags);
2452 
2453 //GRN_API
2454 uint grn_ctx_recv(.grn_ctx* ctx, char** str, uint* str_len, int* flags);
2455 
2456 struct _grn_ctx_info
2457 {
2458 	int fd;
2459 	uint com_status;
2460 	.grn_obj* outbuf;
2461 	ubyte stat;
2462 }
2463 
2464 alias grn_ctx_info = ._grn_ctx_info;
2465 
2466 //GRN_API
2467 .grn_rc grn_ctx_info_get(.grn_ctx* ctx, .grn_ctx_info* info);
2468 
2469 //GRN_API
2470 .grn_rc grn_set_segv_handler();
2471 
2472 //GRN_API
2473 .grn_rc grn_set_int_handler();
2474 
2475 //GRN_API
2476 .grn_rc grn_set_term_handler();
2477 
2478 struct _grn_table_delete_optarg
2479 {
2480 extern (C):
2481 	int flags;
2482 	int function(.grn_ctx* ctx, .grn_obj*, .grn_id, void*) func;
2483 	void* func_arg;
2484 }
2485 
2486 alias grn_table_delete_optarg = ._grn_table_delete_optarg;
2487 
2488 struct _grn_table_scan_hit
2489 {
2490 	.grn_id id;
2491 	uint offset;
2492 	uint length;
2493 }
2494 
2495 struct grn_timeval
2496 {
2497 	long tv_sec;
2498 	int tv_nsec;
2499 }