1 /*
2   Copyright(C) 2009-2018 Brazil
3   Copyright(C) 2018-2019 Kouhei Sutou <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 }
146 
147 //GRN_API
148 .grn_rc grn_init();
149 
150 //GRN_API
151 .grn_rc grn_fin();
152 
153 //GRN_API
154 const (char)* grn_get_global_error_message();
155 
156 enum grn_encoding
157 {
158 	GRN_ENC_DEFAULT = 0,
159 	GRN_ENC_NONE,
160 	GRN_ENC_EUC_JP,
161 	GRN_ENC_UTF8,
162 	GRN_ENC_SJIS,
163 	GRN_ENC_LATIN1,
164 	GRN_ENC_KOI8R,
165 }
166 
167 enum grn_command_version
168 {
169 	GRN_COMMAND_VERSION_DEFAULT = 0,
170 	GRN_COMMAND_VERSION_1,
171 	GRN_COMMAND_VERSION_2,
172 	GRN_COMMAND_VERSION_3,
173 }
174 
175 enum GRN_COMMAND_VERSION_MIN = .grn_command_version.GRN_COMMAND_VERSION_1;
176 enum GRN_COMMAND_VERSION_STABLE = .grn_command_version.GRN_COMMAND_VERSION_1;
177 enum GRN_COMMAND_VERSION_MAX = .grn_command_version.GRN_COMMAND_VERSION_3;
178 
179 enum grn_log_level
180 {
181 	GRN_LOG_NONE = 0,
182 	GRN_LOG_EMERG,
183 	GRN_LOG_ALERT,
184 	GRN_LOG_CRIT,
185 	GRN_LOG_ERROR,
186 	GRN_LOG_WARNING,
187 	GRN_LOG_NOTICE,
188 	GRN_LOG_INFO,
189 	GRN_LOG_DEBUG,
190 	GRN_LOG_DUMP,
191 }
192 
193 //GRN_API
194 const (char)* grn_log_level_to_string(.grn_log_level level);
195 
196 //GRN_API
197 ubyte grn_log_level_parse(const (char)* string, .grn_log_level* level);
198 
199 /* query log flags */
200 enum GRN_QUERY_LOG_NONE = 0x00;
201 enum GRN_QUERY_LOG_COMMAND = 0x01 << 0;
202 enum GRN_QUERY_LOG_RESULT_CODE = 0x01 << 1;
203 enum GRN_QUERY_LOG_DESTINATION = 0x01 << 2;
204 enum GRN_QUERY_LOG_CACHE = 0x01 << 3;
205 enum GRN_QUERY_LOG_SIZE = 0x01 << 4;
206 enum GRN_QUERY_LOG_SCORE = 0x01 << 5;
207 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;
208 enum GRN_QUERY_LOG_DEFAULT = .GRN_QUERY_LOG_ALL;
209 
210 enum grn_content_type
211 {
212 	GRN_CONTENT_NONE = 0,
213 	GRN_CONTENT_TSV,
214 	GRN_CONTENT_JSON,
215 	GRN_CONTENT_XML,
216 	GRN_CONTENT_MSGPACK,
217 	GRN_CONTENT_GROONGA_COMMAND_LIST,
218 }
219 
220 enum GRN_CTX_MSGSIZE = 0x80;
221 enum GRN_CTX_FIN = 0xFF;
222 
223 alias grn_close_func = extern (C) void function (.grn_ctx* ctx, void* data);
224 
225 union grn_user_data
226 {
227 	int int_value;
228 	uint id;
229 	void* ptr;
230 }
231 
232 alias grn_proc_func = extern (C) .grn_obj* function(.grn_ctx* ctx, int nargs, .grn_obj** args, grn_user_data* user_data);
233 
234 extern struct _grn_ctx_impl;
235 
236 struct grn_ctx
237 {
238 	.grn_rc rc;
239 	int flags;
240 	.grn_encoding encoding;
241 	ubyte ntrace;
242 	ubyte errlvl;
243 	ubyte stat;
244 	uint seqno;
245 	uint subno;
246 	uint seqno2;
247 	uint errline;
248 	grn_user_data user_data;
249 	.grn_ctx* prev;
250 	.grn_ctx* next;
251 	const (char)* errfile;
252 	const (char)* errfunc;
253 	._grn_ctx_impl* impl;
254 
255 	//ToDo: Check
256 	void*[16] trace;
257 
258 	char[.GRN_CTX_MSGSIZE] errbuf;
259 }
260 
261 alias _grn_ctx = .grn_ctx;
262 
263 pragma(inline, true)
264 pure nothrow @nogc
265 grn_user_data* GRN_CTX_USER_DATA(ref .grn_ctx ctx)
266 
267 	body
268 	{
269 		return &(ctx.user_data);
270 	}
271 
272 /* Deprecated since 4.0.3. Don't use it. */
273 enum GRN_CTX_USE_QL = 0x03;
274 /* Deprecated since 4.0.3. Don't use it. */
275 enum GRN_CTX_BATCH_MODE = 0x04;
276 enum GRN_CTX_PER_DB = 0x08;
277 
278 //GRN_API
279 .grn_rc grn_ctx_init(.grn_ctx* ctx, int flags);
280 
281 //GRN_API
282 .grn_rc grn_ctx_fin(.grn_ctx* ctx);
283 
284 //GRN_API
285 .grn_ctx* grn_ctx_open(int flags);
286 
287 //GRN_API
288 .grn_rc grn_ctx_close(.grn_ctx* ctx);
289 
290 //GRN_API
291 .grn_rc grn_ctx_set_finalizer(.grn_ctx* ctx, grn_proc_func* func);
292 
293 //GRN_API
294 .grn_rc grn_ctx_push_temporary_open_space(.grn_ctx* ctx);
295 
296 //GRN_API
297 .grn_rc grn_ctx_pop_temporary_open_space(.grn_ctx* ctx);
298 
299 //GRN_API
300 .grn_rc grn_ctx_merge_temporary_open_space(.grn_ctx* ctx);
301 
302 //GRN_API
303 .grn_encoding grn_get_default_encoding();
304 
305 //GRN_API
306 .grn_rc grn_set_default_encoding(.grn_encoding encoding);
307 
308 pragma(inline, true)
309 pure nothrow @nogc
310 .grn_encoding GRN_CTX_GET_ENCODING(const ref .grn_ctx ctx)
311 
312 	body
313 	{
314 		return ctx.encoding;
315 	}
316 
317 /+
318 pragma(inline, true)
319 nothrow @nogc
320 void GRN_CTX_SET_ENCODING(ref .grn_ctx ctx, .grn_encoding enc)
321 
322 	body
323 	{
324 		ctx.encoding = (enc == .grn_encoding.GRN_ENC_DEFAULT) ? (.grn_get_default_encoding()) : (enc);
325 	}
326 +/
327 
328 //GRN_API
329 const (char)* grn_get_version();
330 
331 //GRN_API
332 const (char)* grn_get_package();
333 
334 //GRN_API
335 const (char)* grn_get_package_label();
336 
337 //GRN_API
338 .grn_command_version grn_get_default_command_version();
339 
340 //GRN_API
341 .grn_rc grn_set_default_command_version(.grn_command_version input_version);
342 
343 //GRN_API
344 .grn_command_version grn_ctx_get_command_version(.grn_ctx* ctx);
345 
346 //GRN_API
347 .grn_rc grn_ctx_set_command_version(.grn_ctx* ctx, .grn_command_version input_version);
348 
349 //GRN_API
350 long grn_ctx_get_match_escalation_threshold(.grn_ctx* ctx);
351 
352 //GRN_API
353 .grn_rc grn_ctx_set_match_escalation_threshold(.grn_ctx* ctx, long threshold);
354 
355 //GRN_API
356 ubyte grn_ctx_get_force_match_escalation(.grn_ctx* ctx);
357 
358 //GRN_API
359 .grn_rc grn_ctx_set_force_match_escalation(.grn_ctx* ctx, ubyte force);
360 
361 //GRN_API
362 long grn_get_default_match_escalation_threshold();
363 
364 //GRN_API
365 .grn_rc grn_set_default_match_escalation_threshold(long threshold);
366 
367 //GRN_API
368 int grn_get_lock_timeout();
369 
370 //GRN_API
371 .grn_rc grn_set_lock_timeout(int timeout);
372 
373 /* .grn_encoding */
374 
375 //GRN_API
376 const (char)* grn_encoding_to_string(.grn_encoding encoding);
377 
378 //GRN_API
379 .grn_encoding grn_encoding_parse(const (char)* name);
380 
381 /* obj */
382 
383 alias grn_obj_flags = ushort;
384 alias grn_table_flags = uint;
385 alias grn_column_flags = uint;
386 
387 /* flags for grn_obj_flags and grn_table_flags */
388 
389 enum GRN_OBJ_FLAGS_MASK = 0xFFFF;
390 
391 enum GRN_OBJ_TABLE_TYPE_MASK = 0x07;
392 enum GRN_OBJ_TABLE_HASH_KEY = 0x00;
393 enum GRN_OBJ_TABLE_PAT_KEY = 0x01;
394 enum GRN_OBJ_TABLE_DAT_KEY = 0x02;
395 enum GRN_OBJ_TABLE_NO_KEY = 0x03;
396 
397 enum GRN_OBJ_KEY_MASK = 0x07 << 3;
398 enum GRN_OBJ_KEY_UINT = 0x00 << 3;
399 enum GRN_OBJ_KEY_INT = 0x01 << 3;
400 enum GRN_OBJ_KEY_FLOAT = 0x02 << 3;
401 enum GRN_OBJ_KEY_GEO_POINT = 0x03 << 3;
402 
403 enum GRN_OBJ_KEY_WITH_SIS = 0x01 << 6;
404 enum GRN_OBJ_KEY_NORMALIZE = 0x01 << 7;
405 
406 /* flags for grn_obj_flags and grn_column_flags */
407 
408 enum GRN_OBJ_COLUMN_TYPE_MASK = 0x07;
409 enum GRN_OBJ_COLUMN_SCALAR = 0x00;
410 enum GRN_OBJ_COLUMN_VECTOR = 0x01;
411 enum GRN_OBJ_COLUMN_INDEX = 0x02;
412 
413 enum GRN_OBJ_COMPRESS_MASK = 0x07 << 4;
414 enum GRN_OBJ_COMPRESS_NONE = 0x00 << 4;
415 enum GRN_OBJ_COMPRESS_ZLIB = 0x01 << 4;
416 enum GRN_OBJ_COMPRESS_LZ4 = 0x02 << 4;
417 /* Just for backward compatibility. We'll remove it at 5.0.0. */
418 enum GRN_OBJ_COMPRESS_LZO = .GRN_OBJ_COMPRESS_LZ4;
419 enum GRN_OBJ_COMPRESS_ZSTD = 0x03 << 4;
420 
421 enum GRN_OBJ_WITH_SECTION = 0x01 << 7;
422 enum GRN_OBJ_WITH_WEIGHT = 0x01 << 8;
423 enum GRN_OBJ_WITH_POSITION = 0x01 << 9;
424 enum GRN_OBJ_RING_BUFFER = 0x01 << 10;
425 
426 enum GRN_OBJ_UNIT_MASK = 0x0F << 8;
427 enum GRN_OBJ_UNIT_DOCUMENT_NONE = 0x00 << 8;
428 enum GRN_OBJ_UNIT_DOCUMENT_SECTION = 0x01 << 8;
429 enum GRN_OBJ_UNIT_DOCUMENT_POSITION = 0x02 << 8;
430 enum GRN_OBJ_UNIT_SECTION_NONE = 0x03 << 8;
431 enum GRN_OBJ_UNIT_SECTION_POSITION = 0x04 << 8;
432 enum GRN_OBJ_UNIT_POSITION_NONE = 0x05 << 8;
433 enum GRN_OBJ_UNIT_USERDEF_DOCUMENT = 0x06 << 8;
434 enum GRN_OBJ_UNIT_USERDEF_SECTION = 0x07 << 8;
435 enum GRN_OBJ_UNIT_USERDEF_POSITION = 0x08 << 8;
436 
437 /* Don't use (0x01<<12) because it's used internally. */
438 
439 enum GRN_OBJ_NO_SUBREC = 0x00 << 13;
440 enum GRN_OBJ_WITH_SUBREC = 0x01 << 13;
441 
442 enum GRN_OBJ_KEY_VAR_SIZE = 0x01 << 14;
443 
444 enum GRN_OBJ_TEMPORARY = 0x00 << 15;
445 enum GRN_OBJ_PERSISTENT = 0x01 << 15;
446 
447 /* flags only for grn_table_flags */
448 
449 enum GRN_OBJ_KEY_LARGE = 0x01 << 16;
450 
451 /* flags only for grn_column_flags */
452 
453 enum GRN_OBJ_INDEX_SMALL = 0x01 << 16;
454 enum GRN_OBJ_INDEX_MEDIUM = 0x01 << 17;
455 enum GRN_OBJ_INDEX_LARGE = 0x01 << 18;
456 
457 /* flags only for grn_table_flags and grn_column_flags */
458 
459 /* GRN_COLUMN_INDEX only uses this for now */
460 enum GRN_OBJ_VISIBLE = cast(uint)(0x00 << 31);
461 enum GRN_OBJ_INVISIBLE = cast(uint)(0x01 << 31);
462 
463 /* obj types */
464 
465 enum GRN_VOID = 0x00;
466 enum GRN_BULK = 0x02;
467 enum GRN_PTR = 0x03;
468 
469 /* vector of fixed size data especially uint */
470 enum GRN_UVECTOR = 0x04;
471 
472 /* vector of .grn_obj* */
473 enum GRN_PVECTOR = 0x05;
474 
475 /* vector of arbitrary data */
476 enum GRN_VECTOR = 0x06;
477 
478 enum GRN_MSG = 0x07;
479 enum GRN_QUERY = 0x08;
480 enum GRN_ACCESSOR = 0x09;
481 enum GRN_SNIP = 0x0B;
482 enum GRN_PATSNIP = 0x0C;
483 enum GRN_STRING = 0x0D;
484 enum GRN_HIGHLIGHTER = 0x0E;
485 enum GRN_CURSOR_TABLE_HASH_KEY = 0x10;
486 enum GRN_CURSOR_TABLE_PAT_KEY = 0x11;
487 enum GRN_CURSOR_TABLE_DAT_KEY = 0x12;
488 enum GRN_CURSOR_TABLE_NO_KEY = 0x13;
489 enum GRN_CURSOR_COLUMN_INDEX = 0x18;
490 enum GRN_CURSOR_COLUMN_GEO_INDEX = 0x1A;
491 enum GRN_CURSOR_CONFIG = 0x1F;
492 enum GRN_TYPE = 0x20;
493 enum GRN_PROC = 0x21;
494 enum GRN_EXPR = 0x22;
495 enum GRN_TABLE_HASH_KEY = 0x30;
496 enum GRN_TABLE_PAT_KEY = 0x31;
497 enum GRN_TABLE_DAT_KEY = 0x32;
498 enum GRN_TABLE_NO_KEY = 0x33;
499 enum GRN_DB = 0x37;
500 enum GRN_COLUMN_FIX_SIZE = 0x40;
501 enum GRN_COLUMN_VAR_SIZE = 0x41;
502 enum GRN_COLUMN_INDEX = 0x48;
503 
504 struct grn_section
505 {
506 	uint offset;
507 	uint length;
508 	uint weight;
509 	uint domain;
510 }
511 
512 alias _grn_section = .grn_section;
513 
514 struct grn_obj_header
515 {
516 	ubyte type;
517 	ubyte impl_flags;
518 	ubyte flags;
519 	uint domain;
520 }
521 
522 alias _grn_obj_header = .grn_obj_header;
523 
524 struct grn_obj
525 {
526 	.grn_obj_header header;
527 
528 	union u
529 	{
530 		struct b
531 		{
532 			char* head;
533 			char* curr;
534 			char* tail;
535 		}
536 
537 		struct v
538 		{
539 			.grn_obj* body;
540 			.grn_section* sections;
541 			int n_sections;
542 		}
543 	}
544 }
545 
546 alias _grn_obj = .grn_obj;
547 
548 enum GRN_OBJ_REFER = 0x01 << 0;
549 enum GRN_OBJ_OUTPLACE = 0x01 << 1;
550 enum GRN_OBJ_OWN = 0x01 << 5;
551 
552 /+
553 //ToDo:
554 pragma(inline, true)
555 pure nothrow @nogc
556 void GRN_OBJ_INIT(ref .grn_obj obj, ubyte obj_type, ubyte obj_flags, uint obj_domain)
557 
558 	body
559 	{
560 		obj.header.type = obj_type;
561 		obj.header.impl_flags = obj_flags;
562 		obj.header.flags = 0;
563 		obj.header.domain = obj_domain;
564 		obj.u.b.head = null;
565 		obj.u.b.curr = null;
566 		obj.u.b.tail = null;
567 	}
568 +/
569 
570 alias GRN_OBJ_FIN = grn_obj_close;
571 
572 //GRN_API
573 .grn_rc grn_ctx_use(.grn_ctx* ctx, .grn_obj* db);
574 
575 //GRN_API
576 .grn_obj* grn_ctx_db(.grn_ctx* ctx);
577 
578 //GRN_API
579 .grn_obj* grn_ctx_get(.grn_ctx* ctx, const (char)* name, int name_size);
580 
581 //GRN_API
582 .grn_rc grn_ctx_get_all_tables(.grn_ctx* ctx, .grn_obj* tables_buffer);
583 
584 //GRN_API
585 .grn_rc grn_ctx_get_all_types(.grn_ctx* ctx, .grn_obj* types_buffer);
586 
587 //GRN_API
588 .grn_rc grn_ctx_get_all_tokenizers(.grn_ctx* ctx, .grn_obj* tokenizers_buffer);
589 
590 //GRN_API
591 .grn_rc grn_ctx_get_all_normalizers(.grn_ctx* ctx, .grn_obj* normalizers_buffer);
592 
593 //GRN_API
594 .grn_rc grn_ctx_get_all_token_filters(.grn_ctx* ctx, .grn_obj* token_filters_buffer);
595 
596 enum grn_builtin_type
597 {
598 	GRN_DB_VOID = 0,
599 	GRN_DB_DB,
600 	GRN_DB_OBJECT,
601 	GRN_DB_BOOL,
602 	GRN_DB_INT8,
603 	GRN_DB_UINT8,
604 	GRN_DB_INT16,
605 	GRN_DB_UINT16,
606 	GRN_DB_INT32,
607 	GRN_DB_UINT32,
608 	GRN_DB_INT64,
609 	GRN_DB_UINT64,
610 	GRN_DB_FLOAT,
611 	GRN_DB_TIME,
612 	GRN_DB_SHORT_TEXT,
613 	GRN_DB_TEXT,
614 	GRN_DB_LONG_TEXT,
615 	GRN_DB_TOKYO_GEO_POINT,
616 	GRN_DB_WGS84_GEO_POINT,
617 }
618 
619 enum grn_builtin_tokenizer
620 {
621 	GRN_DB_MECAB = 64,
622 	GRN_DB_DELIMIT,
623 	GRN_DB_UNIGRAM,
624 	GRN_DB_BIGRAM,
625 	GRN_DB_TRIGRAM,
626 }
627 
628 //GRN_API
629 .grn_obj* grn_ctx_at(.grn_ctx* ctx, uint id);
630 
631 //GRN_API
632 ubyte grn_ctx_is_opened(.grn_ctx* ctx, uint id);
633 
634 //GRN_API
635 .grn_rc grn_plugin_register(.grn_ctx* ctx, const (char)* name);
636 
637 //GRN_API
638 .grn_rc grn_plugin_unregister(.grn_ctx* ctx, const (char)* name);
639 
640 //GRN_API
641 .grn_rc grn_plugin_register_by_path(.grn_ctx* ctx, const (char)* path);
642 
643 //GRN_API
644 .grn_rc grn_plugin_unregister_by_path(.grn_ctx* ctx, const (char)* path);
645 
646 //GRN_API
647 const (char)* grn_plugin_get_system_plugins_dir();
648 
649 //GRN_API
650 const (char)* grn_plugin_get_suffix();
651 
652 //GRN_API
653 const (char)* grn_plugin_get_ruby_suffix();
654 
655 //GRN_API
656 .grn_rc grn_plugin_get_names(.grn_ctx* ctx, .grn_obj* names);
657 
658 struct grn_expr_var
659 {
660 	const (char)* name;
661 	uint name_size;
662 	.grn_obj value;
663 }
664 
665 .grn_rc function (.grn_ctx* ctx) grn_plugin_func;
666 
667 enum grn_proc_type
668 {
669 	GRN_PROC_INVALID = 0,
670 	GRN_PROC_TOKENIZER,
671 	GRN_PROC_COMMAND,
672 	GRN_PROC_FUNCTION,
673 	GRN_PROC_HOOK,
674 	GRN_PROC_NORMALIZER,
675 	GRN_PROC_TOKEN_FILTER,
676 	GRN_PROC_SCORER,
677 	GRN_PROC_WINDOW_FUNCTION,
678 }
679 
680 //GRN_API
681 .grn_obj* grn_proc_create(.grn_ctx* ctx, const (char)* name, int name_size, .grn_proc_type type, grn_proc_func* init, grn_proc_func* next, grn_proc_func* fin, uint nvars, .grn_expr_var* vars);
682 
683 //GRN_API
684 .grn_obj* grn_proc_get_info(.grn_ctx* ctx, grn_user_data* user_data, .grn_expr_var** vars, uint* nvars, .grn_obj** caller);
685 
686 //GRN_API
687 .grn_proc_type grn_proc_get_type(.grn_ctx* ctx, .grn_obj* proc);
688 
689 alias grn_table_cursor = .grn_obj;
690 
691 struct grn_posting
692 {
693 	uint rid;
694 	uint sid;
695 	uint pos;
696 	uint tf;
697 	uint weight;
698 	uint rest;
699 }
700 
701 enum grn_operator
702 {
703 	GRN_OP_PUSH = 0,
704 	GRN_OP_POP,
705 	GRN_OP_NOP,
706 	GRN_OP_CALL,
707 	GRN_OP_INTERN,
708 	GRN_OP_GET_REF,
709 	GRN_OP_GET_VALUE,
710 	GRN_OP_AND,
711 	GRN_OP_AND_NOT,
712 
713 	/**
714 	 * Deprecated. Just for backward compatibility.
715 	 */
716 	GRN_OP_BUT = GRN_OP_AND_NOT,
717 
718 	GRN_OP_OR,
719 	GRN_OP_ASSIGN,
720 	GRN_OP_STAR_ASSIGN,
721 	GRN_OP_SLASH_ASSIGN,
722 	GRN_OP_MOD_ASSIGN,
723 	GRN_OP_PLUS_ASSIGN,
724 	GRN_OP_MINUS_ASSIGN,
725 	GRN_OP_SHIFTL_ASSIGN,
726 	GRN_OP_SHIFTR_ASSIGN,
727 	GRN_OP_SHIFTRR_ASSIGN,
728 	GRN_OP_AND_ASSIGN,
729 	GRN_OP_XOR_ASSIGN,
730 	GRN_OP_OR_ASSIGN,
731 	GRN_OP_JUMP,
732 	GRN_OP_CJUMP,
733 	GRN_OP_COMMA,
734 	GRN_OP_BITWISE_OR,
735 	GRN_OP_BITWISE_XOR,
736 	GRN_OP_BITWISE_AND,
737 	GRN_OP_BITWISE_NOT,
738 	GRN_OP_EQUAL,
739 	GRN_OP_NOT_EQUAL,
740 	GRN_OP_LESS,
741 	GRN_OP_GREATER,
742 	GRN_OP_LESS_EQUAL,
743 	GRN_OP_GREATER_EQUAL,
744 	GRN_OP_IN,
745 	GRN_OP_MATCH,
746 	GRN_OP_NEAR,
747 	GRN_OP_NEAR2,
748 	GRN_OP_SIMILAR,
749 	GRN_OP_TERM_EXTRACT,
750 	GRN_OP_SHIFTL,
751 	GRN_OP_SHIFTR,
752 	GRN_OP_SHIFTRR,
753 	GRN_OP_PLUS,
754 	GRN_OP_MINUS,
755 	GRN_OP_STAR,
756 	GRN_OP_SLASH,
757 	GRN_OP_MOD,
758 	GRN_OP_DELETE,
759 	GRN_OP_INCR,
760 	GRN_OP_DECR,
761 	GRN_OP_INCR_POST,
762 	GRN_OP_DECR_POST,
763 	GRN_OP_NOT,
764 	GRN_OP_ADJUST,
765 	GRN_OP_EXACT,
766 	GRN_OP_LCP,
767 	GRN_OP_PARTIAL,
768 	GRN_OP_UNSPLIT,
769 	GRN_OP_PREFIX,
770 	GRN_OP_SUFFIX,
771 	GRN_OP_GEO_DISTANCE1,
772 	GRN_OP_GEO_DISTANCE2,
773 	GRN_OP_GEO_DISTANCE3,
774 	GRN_OP_GEO_DISTANCE4,
775 	GRN_OP_GEO_WITHINP5,
776 	GRN_OP_GEO_WITHINP6,
777 	GRN_OP_GEO_WITHINP8,
778 	GRN_OP_OBJ_SEARCH,
779 	GRN_OP_EXPR_GET_VAR,
780 	GRN_OP_TABLE_CREATE,
781 	GRN_OP_TABLE_SELECT,
782 	GRN_OP_TABLE_SORT,
783 	GRN_OP_TABLE_GROUP,
784 	GRN_OP_JSON_PUT,
785 	GRN_OP_GET_MEMBER,
786 	GRN_OP_REGEXP,
787 	GRN_OP_FUZZY,
788 	GRN_OP_QUORUM,
789 }
790 
791 //GRN_API
792 .grn_obj* grn_obj_column(.grn_ctx* ctx, .grn_obj* table, const (char)* name, uint name_size);
793 
794 /*-------------------------------------------------------------
795  * API for column
796  */
797 
798 enum GRN_COLUMN_NAME_ID = "_id";
799 enum GRN_COLUMN_NAME_ID_LEN = .GRN_COLUMN_NAME_ID.length;
800 enum GRN_COLUMN_NAME_KEY = "_key";
801 enum GRN_COLUMN_NAME_KEY_LEN = .GRN_COLUMN_NAME_KEY.length;
802 enum GRN_COLUMN_NAME_VALUE = "_value";
803 enum GRN_COLUMN_NAME_VALUE_LEN = .GRN_COLUMN_NAME_VALUE.length;
804 enum GRN_COLUMN_NAME_SCORE = "_score";
805 enum GRN_COLUMN_NAME_SCORE_LEN = .GRN_COLUMN_NAME_SCORE.length;
806 enum GRN_COLUMN_NAME_NSUBRECS = "_nsubrecs";
807 enum GRN_COLUMN_NAME_NSUBRECS_LEN = .GRN_COLUMN_NAME_NSUBRECS.length;
808 enum GRN_COLUMN_NAME_MAX = "_max";
809 enum GRN_COLUMN_NAME_MAX_LEN = .GRN_COLUMN_NAME_MAX.length;
810 enum GRN_COLUMN_NAME_MIN = "_min";
811 enum GRN_COLUMN_NAME_MIN_LEN = .GRN_COLUMN_NAME_MIN.length;
812 enum GRN_COLUMN_NAME_SUM = "_sum";
813 enum GRN_COLUMN_NAME_SUM_LEN = .GRN_COLUMN_NAME_SUM.length;
814 enum GRN_COLUMN_NAME_AVG = "_avg";
815 enum GRN_COLUMN_NAME_AVG_LEN = .GRN_COLUMN_NAME_AVG.length;
816 
817 //GRN_API
818 .grn_obj* grn_column_create(.grn_ctx* ctx, .grn_obj* table, const (char)* name, uint name_size, const (char)* path, uint flags, .grn_obj* type);
819 
820 /+
821 pragma(inline, true)
822 nothrow @nogc
823 bool GRN_COLUMN_OPEN_OR_CREATE(.grn_ctx* ctx, .grn_obj* table, const (char)* name, uint name_size, const (char)* path, uint flags, grn_obj* type, .grn_obj* column)
824 
825 	body
826 	{
827 		//Todo: not null?
828 		return ((column = grn_obj_column(ctx, table, name, name_size)) != null) || ((column = grn_column_create(ctx, table, name, name_size, path, flags, type)) != null);
829 	}
830 +/
831 
832 //GRN_API
833 .grn_rc grn_column_index_update(.grn_ctx* ctx, .grn_obj* column, uint id, uint section, .grn_obj* oldvalue, .grn_obj* newvalue);
834 
835 //GRN_API
836 .grn_obj* grn_column_table(.grn_ctx* ctx, .grn_obj* column);
837 
838 //GRN_API
839 .grn_rc grn_column_truncate(.grn_ctx* ctx, .grn_obj* column);
840 
841 /*-------------------------------------------------------------
842  * API for db, table and/or column
843  */
844 
845 enum grn_info_type
846 {
847 	GRN_INFO_ENCODING = 0,
848 	GRN_INFO_SOURCE,
849 	GRN_INFO_DEFAULT_TOKENIZER,
850 	GRN_INFO_ELEMENT_SIZE,
851 	GRN_INFO_CURR_MAX,
852 	GRN_INFO_MAX_ELEMENT_SIZE,
853 	GRN_INFO_SEG_SIZE,
854 	GRN_INFO_CHUNK_SIZE,
855 	GRN_INFO_MAX_SECTION,
856 	GRN_INFO_HOOK_LOCAL_DATA,
857 	GRN_INFO_ELEMENT_A,
858 	GRN_INFO_ELEMENT_CHUNK,
859 	GRN_INFO_ELEMENT_CHUNK_SIZE,
860 	GRN_INFO_ELEMENT_BUFFER_FREE,
861 	GRN_INFO_ELEMENT_NTERMS,
862 	GRN_INFO_ELEMENT_NTERMS_VOID,
863 	GRN_INFO_ELEMENT_SIZE_IN_CHUNK,
864 	GRN_INFO_ELEMENT_POS_IN_CHUNK,
865 	GRN_INFO_ELEMENT_SIZE_IN_BUFFER,
866 	GRN_INFO_ELEMENT_POS_IN_BUFFER,
867 	GRN_INFO_ELEMENT_ESTIMATE_SIZE,
868 	GRN_INFO_NGRAM_UNIT_SIZE,
869 	/*
870 	GRN_INFO_VERSION,
871 	GRN_INFO_CONFIGURE_OPTIONS,
872 	GRN_INFO_CONFIG_PATH,
873 	*/
874 	GRN_INFO_PARTIAL_MATCH_THRESHOLD,
875 	GRN_INFO_II_SPLIT_THRESHOLD,
876 	GRN_INFO_SUPPORT_ZLIB,
877 	GRN_INFO_SUPPORT_LZ4,
878 	/* Just for backward compatibility. We'll remove it at 5.0.0. */
879 	GRN_INFO_SUPPORT_LZO = GRN_INFO_SUPPORT_LZ4,
880 	GRN_INFO_NORMALIZER,
881 	GRN_INFO_TOKEN_FILTERS,
882 	GRN_INFO_SUPPORT_ZSTD,
883 	GRN_INFO_SUPPORT_ARROW,
884 }
885 
886 //GRN_API
887 .grn_obj* grn_obj_get_info(.grn_ctx* ctx, .grn_obj* obj, .grn_info_type type, .grn_obj* valuebuf);
888 
889 //GRN_API
890 .grn_rc grn_obj_set_info(.grn_ctx* ctx, .grn_obj* obj, .grn_info_type type, .grn_obj* value);
891 
892 //GRN_API
893 .grn_obj* grn_obj_get_element_info(.grn_ctx* ctx, .grn_obj* obj, uint id, .grn_info_type type, .grn_obj* value);
894 
895 //GRN_API
896 .grn_rc grn_obj_set_element_info(.grn_ctx* ctx, .grn_obj* obj, uint id, .grn_info_type type, .grn_obj* value);
897 
898 //GRN_API
899 .grn_obj* grn_obj_get_value(.grn_ctx* ctx, .grn_obj* obj, uint id, .grn_obj* value);
900 
901 //GRN_API
902 int grn_obj_get_values(.grn_ctx* ctx, .grn_obj* obj, uint offset, void** values);
903 
904 
905 //ToDo: temp
906 alias internal_block_func = extern (C) nothrow @nogc void function();
907 
908 //ToDo: check
909 /+
910 pragma(inline, true)
911 nothrow @nogc @disable
912 void GRN_COLUMN_EACH(.grn_ctx* ctx, .grn_obj* column, uint id, void** value, internal_block_func block)
913 
914 	body
915 	{
916 		int _n;
917 		uint id = 1;
918 
919 		while ((_n = .grn_obj_get_values(ctx, column, id, value)) > 0) {
920 			for (; _n; _n--, id++, value++) {
921 				block();
922 			}
923 		}
924 	}
925 +/
926 
927 enum GRN_OBJ_SET_MASK = 0x07;
928 enum GRN_OBJ_SET = 0x01;
929 enum GRN_OBJ_INCR = 0x02;
930 enum GRN_OBJ_DECR = 0x03;
931 enum GRN_OBJ_APPEND = 0x04;
932 enum GRN_OBJ_PREPEND = 0x05;
933 enum GRN_OBJ_GET = 0x01 << 4;
934 enum GRN_OBJ_COMPARE = 0x01 << 5;
935 enum GRN_OBJ_LOCK = 0x01 << 6;
936 enum GRN_OBJ_UNLOCK = 0x01 << 7;
937 
938 //GRN_API
939 .grn_rc grn_obj_set_value(.grn_ctx* ctx, .grn_obj* obj, uint id, .grn_obj* value, int flags);
940 
941 //GRN_API
942 .grn_rc grn_obj_remove(.grn_ctx* ctx, .grn_obj* obj);
943 
944 //GRN_API
945 .grn_rc grn_obj_remove_dependent(.grn_ctx* ctx, .grn_obj* obj);
946 
947 //GRN_API
948 .grn_rc grn_obj_remove_force(.grn_ctx* ctx, const (char)* name, int name_size);
949 
950 //GRN_API
951 .grn_rc grn_obj_rename(.grn_ctx* ctx, .grn_obj* obj, const (char)* name, uint name_size);
952 
953 //GRN_API
954 .grn_rc grn_table_rename(.grn_ctx* ctx, .grn_obj* table, const (char)* name, uint name_size);
955 
956 //GRN_API
957 .grn_rc grn_column_rename(.grn_ctx* ctx, .grn_obj* column, const (char)* name, uint name_size);
958 
959 //GRN_API
960 .grn_rc grn_obj_close(.grn_ctx* ctx, .grn_obj* obj);
961 
962 //GRN_API
963 .grn_rc grn_obj_reinit(.grn_ctx* ctx, .grn_obj* obj, uint domain, ubyte flags);
964 
965 //GRN_API
966 void grn_obj_unlink(.grn_ctx* ctx, .grn_obj* obj);
967 
968 //GRN_API
969 grn_user_data* grn_obj_user_data(.grn_ctx* ctx, .grn_obj* obj);
970 
971 //GRN_API
972 .grn_rc grn_obj_set_finalizer(.grn_ctx* ctx, .grn_obj* obj, grn_proc_func* func);
973 
974 //GRN_API
975 const (char)* grn_obj_path(.grn_ctx* ctx, .grn_obj* obj);
976 
977 //GRN_API
978 int grn_obj_name(.grn_ctx* ctx, .grn_obj* obj, char* namebuf, int buf_size);
979 
980 //GRN_API
981 int grn_column_name(.grn_ctx* ctx, .grn_obj* obj, char* namebuf, int buf_size);
982 
983 //GRN_API
984 uint grn_obj_get_range(.grn_ctx* ctx, .grn_obj* obj);
985 
986 pragma(inline, true)
987 nothrow @nogc
988 uint GRN_OBJ_GET_DOMAIN(ref .grn_obj obj)
989 
990 	body
991 	{
992 		return ((obj.header.type == .GRN_TABLE_NO_KEY) ? (.GRN_ID_NIL) : (obj.header.domain));
993 	}
994 
995 //GRN_API
996 int grn_obj_expire(.grn_ctx* ctx, .grn_obj* obj, int threshold);
997 
998 //GRN_API
999 int grn_obj_check(.grn_ctx* ctx, .grn_obj* obj);
1000 
1001 //GRN_API
1002 .grn_rc grn_obj_lock(.grn_ctx* ctx, .grn_obj* obj, uint id, int timeout);
1003 
1004 //GRN_API
1005 .grn_rc grn_obj_unlock(.grn_ctx* ctx, .grn_obj* obj, uint id);
1006 
1007 //GRN_API
1008 .grn_rc grn_obj_clear_lock(.grn_ctx* ctx, .grn_obj* obj);
1009 
1010 //GRN_API
1011 uint grn_obj_is_locked(.grn_ctx* ctx, .grn_obj* obj);
1012 
1013 //GRN_API
1014 .grn_rc grn_obj_flush(.grn_ctx* ctx, .grn_obj* obj);
1015 
1016 //GRN_API
1017 .grn_rc grn_obj_flush_recursive(.grn_ctx* ctx, .grn_obj* obj);
1018 
1019 //GRN_API
1020 .grn_rc grn_obj_flush_recursive_dependent(.grn_ctx* ctx, .grn_obj* obj);
1021 
1022 //GRN_API
1023 int grn_obj_defrag(.grn_ctx* ctx, .grn_obj* obj, int threshold);
1024 
1025 //GRN_API
1026 .grn_obj* grn_obj_db(.grn_ctx* ctx, .grn_obj* obj);
1027 
1028 //GRN_API
1029 uint grn_obj_id(.grn_ctx* ctx, .grn_obj* obj);
1030 
1031 /* Flags for grn_fuzzy_search_optarg.flags. */
1032 enum GRN_TABLE_FUZZY_SEARCH_WITH_TRANSPOSITION = 0x01;
1033 
1034 struct grn_fuzzy_search_optarg
1035 {
1036 	uint max_distance;
1037 	uint max_expansion;
1038 	uint prefix_match_size;
1039 	int flags;
1040 }
1041 
1042 alias _grn_fuzzy_search_optarg = .grn_fuzzy_search_optarg;
1043 
1044 enum GRN_MATCH_INFO_GET_MIN_RECORD_ID = 0x01;
1045 enum GRN_MATCH_INFO_ONLY_SKIP_TOKEN = 0x02;
1046 
1047 struct grn_match_info
1048 {
1049 	int flags;
1050 	uint min;
1051 }
1052 
1053 alias _grn_match_info = .grn_match_info;
1054 
1055 struct grn_search_optarg
1056 {
1057 	.grn_operator mode;
1058 	int similarity_threshold;
1059 	int max_interval;
1060 	int* weight_vector;
1061 	int vector_size;
1062 	.grn_obj* proc;
1063 	int max_size;
1064 	.grn_obj* scorer;
1065 	.grn_obj* scorer_args_expr;
1066 	uint scorer_args_expr_offset;
1067 	.grn_fuzzy_search_optarg fuzzy;
1068 	.grn_match_info match_info;
1069 	int quorum_threshold;
1070 }
1071 
1072 alias _grn_search_optarg = .grn_search_optarg;
1073 
1074 //GRN_API
1075 .grn_rc grn_obj_search(.grn_ctx* ctx, .grn_obj* obj, .grn_obj* query, .grn_obj* res, .grn_operator op, .grn_search_optarg* optarg);
1076 
1077 //.grn_rc function(.grn_ctx* ctx, .grn_obj* table, .grn_obj* index, int nargs, .grn_obj** args, .grn_obj* res, .grn_operator op) grn_selector_func;
1078 alias grn_selector_func = extern (C) .grn_rc function(.grn_ctx* ctx, .grn_obj* table, .grn_obj* index, int nargs, .grn_obj** args, .grn_obj* res, .grn_operator op);
1079 
1080 //GRN_API
1081 .grn_rc grn_proc_set_selector(.grn_ctx* ctx, .grn_obj* proc, grn_selector_func selector);
1082 
1083 //GRN_API
1084 .grn_rc grn_proc_set_selector_operator(.grn_ctx* ctx, .grn_obj* proc, .grn_operator selector_op);
1085 
1086 //GRN_API
1087 .grn_operator grn_proc_get_selector_operator(.grn_ctx* ctx, .grn_obj* proc);
1088 
1089 //GRN_API
1090 .grn_rc grn_proc_set_is_stable(.grn_ctx* ctx, .grn_obj* proc, ubyte is_stable);
1091 
1092 //GRN_API
1093 ubyte grn_proc_is_stable(.grn_ctx* ctx, .grn_obj* proc);
1094 
1095 /*-------------------------------------------------------------
1096  * grn_uvector
1097 */
1098 
1099 //GRN_API
1100 uint grn_uvector_size(.grn_ctx* ctx, .grn_obj* uvector);
1101 
1102 //GRN_API
1103 uint grn_uvector_element_size(.grn_ctx* ctx, .grn_obj* uvector);
1104 
1105 //GRN_API
1106 .grn_rc grn_uvector_add_element(.grn_ctx* ctx, .grn_obj* vector, uint id, uint weight);
1107 
1108 //GRN_API
1109 uint grn_uvector_get_element(.grn_ctx* ctx, .grn_obj* uvector, uint offset, uint* weight);
1110 
1111 /*-------------------------------------------------------------
1112  * API for hook
1113  */
1114 
1115 //GRN_API
1116 int grn_proc_call_next(.grn_ctx* ctx, .grn_obj* exec_info, .grn_obj* input, .grn_obj* output);
1117 
1118 //GRN_API
1119 void* grn_proc_get_ctx_local_data(.grn_ctx* ctx, .grn_obj* exec_info);
1120 
1121 //GRN_API
1122 void* grn_proc_get_hook_local_data(.grn_ctx* ctx, .grn_obj* exec_info);
1123 
1124 enum grn_hook_entry
1125 {
1126 	GRN_HOOK_SET = 0,
1127 	GRN_HOOK_GET,
1128 	GRN_HOOK_INSERT,
1129 	GRN_HOOK_DELETE,
1130 	GRN_HOOK_SELECT,
1131 }
1132 
1133 //GRN_API
1134 .grn_rc grn_obj_add_hook(.grn_ctx* ctx, .grn_obj* obj, .grn_hook_entry entry, int offset, .grn_obj* proc, .grn_obj* data);
1135 
1136 //GRN_API
1137 int grn_obj_get_nhooks(.grn_ctx* ctx, .grn_obj* obj, .grn_hook_entry entry);
1138 
1139 //GRN_API
1140 .grn_obj* grn_obj_get_hook(.grn_ctx* ctx, .grn_obj* obj, .grn_hook_entry entry, int offset, .grn_obj* data);
1141 
1142 //GRN_API
1143 .grn_rc grn_obj_delete_hook(.grn_ctx* ctx, .grn_obj* obj, .grn_hook_entry entry, int offset);
1144 
1145 //GRN_API
1146 .grn_obj* grn_obj_open(.grn_ctx* ctx, ubyte type, ubyte flags, uint domain);
1147 
1148 /* Deprecated since 5.0.1. Use grn_column_find_index_data() instead. */
1149 
1150 //GRN_API
1151 int grn_column_index(.grn_ctx* ctx, .grn_obj* column, .grn_operator op, .grn_obj** indexbuf, int buf_size, int* section);
1152 
1153 /* @since 5.0.1. */
1154 struct grn_index_datum
1155 {
1156 	.grn_obj* index;
1157 	uint section;
1158 }
1159 
1160 alias _grn_index_datum = .grn_index_datum;
1161 
1162 /* @since 5.0.1. */
1163 
1164 //GRN_API
1165 uint grn_column_find_index_data(.grn_ctx* ctx, .grn_obj* column, .grn_operator op, .grn_index_datum* index_data, uint n_index_data);
1166 /* @since 5.1.2. */
1167 
1168 //GRN_API
1169 uint grn_column_get_all_index_data(.grn_ctx* ctx, .grn_obj* column, .grn_index_datum* index_data, uint n_index_data);
1170 
1171 //GRN_API
1172 .grn_rc grn_obj_delete_by_id(.grn_ctx* ctx, .grn_obj* db, uint id, ubyte removep);
1173 
1174 //GRN_API
1175 .grn_rc grn_obj_path_by_id(.grn_ctx* ctx, .grn_obj* db, uint id, char* buffer);
1176 
1177 /* geo */
1178 
1179 struct grn_geo_point
1180 {
1181 	int latitude;
1182 	int longitude;
1183 }
1184 
1185 //GRN_API
1186 .grn_rc grn_geo_select_in_rectangle(.grn_ctx* ctx, .grn_obj* index, .grn_obj* top_left_point, .grn_obj* bottom_right_point, .grn_obj* res, .grn_operator op);
1187 
1188 //GRN_API
1189 uint grn_geo_estimate_size_in_rectangle(.grn_ctx* ctx, .grn_obj* index, .grn_obj* top_left_point, .grn_obj* bottom_right_point);
1190 /* Deprecated since 4.0.8. Use grn_geo_estimate_size_in_rectangle() instead. */
1191 
1192 //GRN_API
1193 int grn_geo_estimate_in_rectangle(.grn_ctx* ctx, .grn_obj* index, .grn_obj* top_left_point, .grn_obj* bottom_right_point);
1194 
1195 //GRN_API
1196 .grn_obj* grn_geo_cursor_open_in_rectangle(.grn_ctx* ctx, .grn_obj* index, .grn_obj* top_left_point, .grn_obj* bottom_right_point, int offset, int limit);
1197 
1198 //GRN_API
1199 .grn_posting* grn_geo_cursor_next(.grn_ctx* ctx, .grn_obj* cursor);
1200 
1201 /* query & snippet */
1202 
1203 static if (!__traits(compiles, .GRN_QUERY_AND)) {
1204 	enum GRN_QUERY_AND = '+';
1205 }
1206 
1207 static if (!__traits(compiles, .GRN_QUERY_AND_NOT)) {
1208 	static if (__traits(compiles, .GRN_QUERY_BUT)) {
1209 		/* Deprecated. Just for backward compatibility. */
1210 		enum GRN_QUERY_AND_NOT = .GRN_QUERY_BUT;
1211 	} else {
1212 		enum GRN_QUERY_AND_NOT = '-';
1213 	}
1214 }
1215 
1216 static if (!__traits(compiles, .GRN_QUERY_ADJ_INC)) {
1217 	enum GRN_QUERY_ADJ_INC = '>';
1218 }
1219 
1220 static if (!__traits(compiles, .GRN_QUERY_ADJ_DEC)) {
1221 	enum GRN_QUERY_ADJ_DEC = '<';
1222 }
1223 
1224 static if (!__traits(compiles, .GRN_QUERY_ADJ_NEG)) {
1225 	enum GRN_QUERY_ADJ_NEG = '~';
1226 }
1227 
1228 static if (!__traits(compiles, .GRN_QUERY_PREFIX)) {
1229 	enum GRN_QUERY_PREFIX = '*';
1230 }
1231 
1232 static if (!__traits(compiles, .GRN_QUERY_PARENL)) {
1233 	enum GRN_QUERY_PARENL = '(';
1234 }
1235 
1236 static if (!__traits(compiles, .GRN_QUERY_PARENR)) {
1237 	enum GRN_QUERY_PARENR = ')';
1238 }
1239 
1240 static if (!__traits(compiles, .GRN_QUERY_QUOTEL)) {
1241 	enum GRN_QUERY_QUOTEL = '"';
1242 }
1243 
1244 static if (!__traits(compiles, .GRN_QUERY_QUOTER)) {
1245 	enum GRN_QUERY_QUOTER = '"';
1246 }
1247 
1248 static if (!__traits(compiles, .GRN_QUERY_ESCAPE)) {
1249 	enum GRN_QUERY_ESCAPE = '\\';
1250 }
1251 
1252 static if (!__traits(compiles, .GRN_QUERY_COLUMN)) {
1253 	enum GRN_QUERY_COLUMN = ':';
1254 }
1255 
1256 struct grn_snip_mapping
1257 {
1258 	void* dummy;
1259 }
1260 
1261 alias _grn_snip_mapping = .grn_snip_mapping;
1262 
1263 enum GRN_SNIP_NORMALIZE = 0x01 << 0;
1264 enum GRN_SNIP_COPY_TAG = 0x01 << 1;
1265 enum GRN_SNIP_SKIP_LEADING_SPACES = 0x01 << 2;
1266 
1267 /*
1268 //ToDo: 
1269 #define GRN_SNIP_MAPPING_HTML_ESCAPE ((.grn_snip_mapping *)-1)
1270 */
1271 
1272 //GRN_API
1273 .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);
1274 
1275 //GRN_API
1276 .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);
1277 
1278 //GRN_API
1279 .grn_rc grn_snip_set_normalizer(.grn_ctx* ctx, .grn_obj* snip, .grn_obj* normalizer);
1280 
1281 //GRN_API
1282 .grn_obj* grn_snip_get_normalizer(.grn_ctx* ctx, .grn_obj* snip);
1283 
1284 //GRN_API
1285 .grn_rc grn_snip_exec(.grn_ctx* ctx, .grn_obj* snip, const (char)* string, uint string_len, uint* nresults, uint* max_tagged_len);
1286 
1287 //GRN_API
1288 .grn_rc grn_snip_get_result(.grn_ctx* ctx, .grn_obj* snip, const uint index, char* result, uint* result_len);
1289 
1290 /* log */
1291 
1292 enum GRN_LOG_NONE = 0x00 << 0;
1293 enum GRN_LOG_TIME = 0x01 << 0;
1294 enum GRN_LOG_TITLE = 0x01 << 1;
1295 enum GRN_LOG_MESSAGE = 0x01 << 2;
1296 enum GRN_LOG_LOCATION = 0x01 << 3;
1297 enum GRN_LOG_PID = 0x01 << 4;
1298 enum GRN_LOG_PROCESS_ID = .GRN_LOG_PID;
1299 enum GRN_LOG_THREAD_ID = 0x01 << 5;
1300 enum GRN_LOG_ALL = .GRN_LOG_TIME | .GRN_LOG_TITLE | .GRN_LOG_MESSAGE | .GRN_LOG_LOCATION | .GRN_LOG_PROCESS_ID | .GRN_LOG_THREAD_ID;
1301 enum GRN_LOG_DEFAULT = .GRN_LOG_TIME | .GRN_LOG_MESSAGE;
1302 
1303 /* Deprecated since 2.1.2. Use .grn_logger instead. */
1304 struct grn_logger_info
1305 {
1306 extern (C):
1307 	.grn_log_level max_level;
1308 	int flags;
1309 	void function (int, const (char)*, const (char)*, const (char)*, const (char)*, void*) func;
1310 	void* func_arg;
1311 }
1312 
1313 /* Deprecated since 2.1.2. Use .grn_logger instead. */
1314 alias _grn_logger_info = .grn_logger_info;
1315 
1316 /* Deprecated since 2.1.2. Use grn_logger_set() instead. */
1317 
1318 //GRN_API
1319 .grn_rc grn_logger_info_set(.grn_ctx* ctx, const (.grn_logger_info)* info);
1320 
1321 struct grn_logger
1322 {
1323 extern (C):
1324 	.grn_log_level max_level;
1325 	int flags;
1326 	void* user_data;
1327 	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;
1328 	void function (.grn_ctx* ctx, void* user_data) reopen;
1329 	void function (.grn_ctx* ctx, void* user_data) fin;
1330 }
1331 
1332 alias _grn_logger = .grn_logger;
1333 
1334 //GRN_API
1335 ubyte grn_log_flags_parse(const (char)* string, int string_size, int* flags);
1336 
1337 //GRN_API
1338 .grn_rc grn_logger_set(.grn_ctx* ctx, const (.grn_logger)* logger);
1339 
1340 //GRN_API
1341 void grn_logger_set_max_level(.grn_ctx* ctx, .grn_log_level max_level);
1342 
1343 //GRN_API
1344 .grn_log_level grn_logger_get_max_level(.grn_ctx* ctx);
1345 
1346 /+
1347 #ifdef __GNUC__
1348 # define GRN_ATTRIBUTE_PRINTF(fmt_pos) __attribute__ ((format(printf, fmt_pos, fmt_pos + 1)))
1349 #else
1350 # define GRN_ATTRIBUTE_PRINTF(fmt_pos)
1351 #endif /* __GNUC__ */
1352 
1353 #if defined(__clang__)
1354 # if __has_attribute(__alloc_size__)
1355 #  define HAVE_ALLOC_SIZE_ATTRIBUTE
1356 # endif /* __has_attribute(__alloc_size__) */
1357 #elif defined(__GNUC__) && ((__GNUC__ >= 5) || (__GNUC__ > 4 && __GNUC_MINOR__ >= 3))
1358 # define HAVE_ALLOC_SIZE_ATTRIBUTE
1359 #endif /* __clang__ */
1360 
1361 #ifdef HAVE_ALLOC_SIZE_ATTRIBUTE
1362 # define GRN_ATTRIBUTE_ALLOC_SIZE(size) __attribute__ ((alloc_size(size)))
1363 # define GRN_ATTRIBUTE_ALLOC_SIZE_N(n, size) __attribute__ ((alloc_size(n, size)))
1364 #else
1365 # define GRN_ATTRIBUTE_ALLOC_SIZE(size)
1366 # define GRN_ATTRIBUTE_ALLOC_SIZE_N(n, size)
1367 #endif /* HAVE_ALLOC_SIZE_ATTRIBUTE */
1368 
1369 //GRN_API
1370 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);
1371 +/
1372 
1373 //GRN_API
1374 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);
1375 
1376 //GRN_API
1377 void grn_logger_reopen(.grn_ctx* ctx);
1378 
1379 //GRN_API
1380 ubyte grn_logger_pass(.grn_ctx* ctx, .grn_log_level level);
1381 
1382 //GRN_API
1383 ubyte grn_logger_is_default_logger(.grn_ctx* ctx);
1384 
1385 static if (!__traits(compiles, GRN_LOG_DEFAULT_LEVEL)) {
1386 	enum GRN_LOG_DEFAULT_LEVEL = .grn_log_level.GRN_LOG_NOTICE;
1387 }
1388 
1389 //GRN_API
1390 void grn_default_logger_set_max_level(.grn_log_level level);
1391 
1392 //GRN_API
1393 .grn_log_level grn_default_logger_get_max_level();
1394 
1395 //GRN_API
1396 void grn_default_logger_set_flags(int flags);
1397 
1398 //GRN_API
1399 int grn_default_logger_get_flags();
1400 
1401 //GRN_API
1402 void grn_default_logger_set_path(const (char)* path);
1403 
1404 //GRN_API
1405 const (char)* grn_default_logger_get_path();
1406 
1407 //GRN_API
1408 void grn_default_logger_set_rotate_threshold_size(.off_t threshold);
1409 
1410 //GRN_API
1411 .off_t grn_default_logger_get_rotate_threshold_size();
1412 
1413 /*
1414 #define GRN_LOG(ctx, level, ...)
1415 if (grn_logger_pass(ctx, level)) {
1416 	grn_logger_put(ctx, (level), __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__);
1417 }
1418 */
1419 
1420 struct grn_query_logger
1421 {
1422 extern (C):
1423 	uint flags;
1424 	void* user_data;
1425 	void function(.grn_ctx* ctx, uint flag, const (char)* timestamp, const (char)* info, const (char)* message, void* user_data) log;
1426 	void function(.grn_ctx* ctx, void* user_data) reopen;
1427 	void function(.grn_ctx* ctx, void* user_data) fin;
1428 }
1429 
1430 alias _grn_query_logger = .grn_query_logger;
1431 
1432 //GRN_API
1433 ubyte grn_query_log_flags_parse(const (char)* string, int string_size, uint* flags);
1434 
1435 //GRN_API
1436 .grn_rc grn_query_logger_set(.grn_ctx* ctx, const (.grn_query_logger)* logger);
1437 
1438 //GRN_API
1439 void grn_query_logger_set_flags(.grn_ctx* ctx, uint flags);
1440 
1441 //GRN_API
1442 void grn_query_logger_add_flags(.grn_ctx* ctx, uint flags);
1443 
1444 //GRN_API
1445 void grn_query_logger_remove_flags(.grn_ctx* ctx, uint flags);
1446 
1447 //GRN_API
1448 uint grn_query_logger_get_flags(.grn_ctx* ctx);
1449 
1450 /+
1451 //ToDo: 
1452 //GRN_API
1453 void grn_query_logger_put(.grn_ctx* ctx, uint flag, const (char)* mark, const (char)* format, ...) GRN_ATTRIBUTE_PRINTF(4);
1454 +/
1455 
1456 //GRN_API
1457 void grn_query_logger_reopen(.grn_ctx* ctx);
1458 
1459 //GRN_API
1460 ubyte grn_query_logger_pass(.grn_ctx* ctx, uint flag);
1461 
1462 //GRN_API
1463 void grn_default_query_logger_set_flags(uint flags);
1464 
1465 //GRN_API
1466 uint grn_default_query_logger_get_flags();
1467 
1468 //GRN_API
1469 void grn_default_query_logger_set_path(const (char)* path);
1470 
1471 //GRN_API
1472 const (char)* grn_default_query_logger_get_path();
1473 
1474 //GRN_API
1475 void grn_default_query_logger_set_rotate_threshold_size(.off_t threshold);
1476 
1477 //GRN_API
1478 .off_t grn_default_query_logger_get_rotate_threshold_size();
1479 
1480 /*
1481 //ToDo: 
1482 #define GRN_QUERY_LOG(ctx, flag, mark, format, ...)
1483 if (grn_query_logger_pass(ctx, flag)) {
1484 	grn_query_logger_put(ctx, (flag), (mark), format, __VA_ARGS__);
1485 }
1486 */
1487 
1488 /* grn_bulk */
1489 
1490 enum GRN_BULK_BUFSIZE = .grn_obj.sizeof - .grn_obj_header.sizeof;
1491 /* This assumes that .GRN_BULK_BUFSIZE is less than 32 (= 0x20). */
1492 enum GRN_BULK_BUFSIZE_MAX = 0x1F;
1493 
1494 pragma(inline, true)
1495 pure nothrow @safe @nogc
1496 ubyte GRN_BULK_SIZE_IN_FLAGS(ubyte flags)
1497 
1498 	body
1499 	{
1500 		return flags & .GRN_BULK_BUFSIZE_MAX;
1501 	}
1502 
1503 pragma(inline, true)
1504 pure nothrow @safe @nogc
1505 ubyte GRN_BULK_OUTP(ref .grn_obj bulk)
1506 
1507 	body
1508 	{
1509 		return bulk.header.impl_flags & .GRN_OBJ_OUTPLACE;
1510 	}
1511 
1512 /+
1513 //ToDo:
1514 pragma(inline, true)
1515 pure nothrow @safe @nogc
1516 void GRN_BULK_REWIND(ref .grn_obj bulk)
1517 
1518 	body
1519 	{
1520 		if (bulk.header.type == .GRN_VECTOR) {
1521 			.grn_obj *_body = cast(bulk)(->u.v.body);
1522 
1523 			if (_body) {
1524 				if (.GRN_BULK_OUTP(_body)) {
1525 					(_body)->u.b.curr = cast(_body)(->u.b.head);
1526 				} else {
1527 					(_body)->header.flags &= ~.GRN_BULK_BUFSIZE_MAX;
1528 				}
1529 			}
1530 
1531 			bulk.u.v.n_sections = 0;
1532 		} else {
1533 			if (.GRN_BULK_OUTP(bulk)) {
1534 				bulk.u.b.curr = cast(bulk)(->u.b.head);
1535 			} else {
1536 				bulk.header.flags &= ~.GRN_BULK_BUFSIZE_MAX;
1537 			}
1538 		}
1539 	}
1540 +/
1541 
1542 /+
1543 //ToDo:
1544 pragma(inline, true)
1545 pure nothrow @safe @nogc
1546 void GRN_BULK_INCR_LEN(ref .grn_obj bulk, size_t len)
1547 
1548 	body
1549 	{
1550 		if (.GRN_BULK_OUTP(bulk)) {
1551 			bulk.u.b.curr += len;
1552 		} else {
1553 			bulk.header.flags += cast(ubyte)(len);
1554 		}
1555 	}
1556 +/
1557 
1558 /+
1559 //ToDo:
1560 pragma(inline, true)
1561 pure nothrow @safe @nogc
1562 #define GRN_BULK_WSIZE(ref .grn_obj bulk)
1563 
1564 	body
1565 	{
1566 		return (.GRN_BULK_OUTP(bulk)) ? (bulk.u.b.tail - bulk.u.b.head) : (.GRN_BULK_BUFSIZE);
1567 	}
1568 
1569 pragma(inline, true)
1570 pure nothrow @safe @nogc
1571 #define GRN_BULK_REST(ref .grn_obj bulk)
1572 
1573 	body
1574 	{
1575 		return (.GRN_BULK_OUTP(bulk)) ? (bulk.u.b.tail - bulk.u.b.curr) : .GRN_BULK_BUFSIZE - .GRN_BULK_SIZE_IN_FLAGS(bulk.header.flags);
1576 	}
1577 
1578 pragma(inline, true)
1579 pure nothrow @safe @nogc
1580 #define GRN_BULK_VSIZE(ref .grn_obj bulk)
1581 
1582 	body
1583 	{
1584 		return (.GRN_BULK_OUTP(bulk)) ? (bulk.u.b.curr - bulk.u.b.head) : (.GRN_BULK_SIZE_IN_FLAGS(bulk.header.flags));
1585 	}
1586 
1587 pragma(inline, true)
1588 pure nothrow @safe @nogc
1589 #define GRN_BULK_EMPTYP(ref .grn_obj bulk)
1590 
1591 	body
1592 	{
1593 		return (.GRN_BULK_OUTP(bulk)) ? (bulk.u.b.curr == bulk.u.b.head) : !(.GRN_BULK_SIZE_IN_FLAGS(bulk.header.flags));
1594 	}
1595 
1596 pragma(inline, true)
1597 pure nothrow @safe @nogc
1598 #define GRN_BULK_HEAD(ref .grn_obj bulk)
1599 
1600 	body
1601 	{
1602 		return (.GRN_BULK_OUTP(bulk)) ? (bulk.u.b.head) : ((char *)&(bulk.u.b.head));
1603 	}
1604 
1605 pragma(inline, true)
1606 pure nothrow @safe @nogc
1607 #define GRN_BULK_CURR(ref .grn_obj bulk)
1608 
1609 	body
1610 	{
1611 		return (.GRN_BULK_OUTP(bulk)) ? (bulk.u.b.curr) : (char *)&(bulk.u.b.head) + .GRN_BULK_SIZE_IN_FLAGS(bulk.header.flags);
1612 	}
1613 
1614 pragma(inline, true)
1615 pure nothrow @safe @nogc
1616 #define GRN_BULK_TAIL(ref .grn_obj bulk)
1617 
1618 	body
1619 	{
1620 		return (.GRN_BULK_OUTP(bulk)) ? (bulk.u.b.tail) : ((char *)&(bulk[1]));
1621 	}
1622 +/
1623 
1624 //GRN_API
1625 .grn_rc grn_bulk_reinit(.grn_ctx* ctx, .grn_obj* bulk, size_t size);
1626 
1627 //GRN_API
1628 .grn_rc grn_bulk_resize(.grn_ctx* ctx, .grn_obj* bulk, size_t newsize);
1629 
1630 //GRN_API
1631 .grn_rc grn_bulk_write(.grn_ctx* ctx, .grn_obj* bulk, const (char)* str, size_t len);
1632 
1633 //GRN_API
1634 .grn_rc grn_bulk_write_from(.grn_ctx* ctx, .grn_obj* bulk, const (char)* str, size_t from, size_t len);
1635 
1636 //GRN_API
1637 .grn_rc grn_bulk_reserve(.grn_ctx* ctx, .grn_obj* bulk, size_t len);
1638 
1639 //GRN_API
1640 .grn_rc grn_bulk_space(.grn_ctx* ctx, .grn_obj* bulk, size_t len);
1641 
1642 //GRN_API
1643 .grn_rc grn_bulk_truncate(.grn_ctx* ctx, .grn_obj* bulk, size_t len);
1644 
1645 //GRN_API
1646 .grn_rc grn_bulk_fin(.grn_ctx* ctx, .grn_obj* bulk);
1647 
1648 /* grn_text */
1649 
1650 //GRN_API
1651 .grn_rc grn_text_itoa(.grn_ctx* ctx, .grn_obj* bulk, int i);
1652 
1653 //GRN_API
1654 .grn_rc grn_text_itoa_padded(.grn_ctx* ctx, .grn_obj* bulk, int i, char ch, size_t len);
1655 
1656 //GRN_API
1657 .grn_rc grn_text_lltoa(.grn_ctx* ctx, .grn_obj* bulk, long i);
1658 
1659 //GRN_API
1660 .grn_rc grn_text_ftoa(.grn_ctx* ctx, .grn_obj* bulk, double d);
1661 
1662 //GRN_API
1663 .grn_rc grn_text_itoh(.grn_ctx* ctx, .grn_obj* bulk, uint i, size_t len);
1664 
1665 //GRN_API
1666 .grn_rc grn_text_itob(.grn_ctx* ctx, .grn_obj* bulk, uint id);
1667 
1668 //GRN_API
1669 .grn_rc grn_text_lltob32h(.grn_ctx* ctx, .grn_obj* bulk, long i);
1670 
1671 //GRN_API
1672 .grn_rc grn_text_benc(.grn_ctx* ctx, .grn_obj* bulk, uint v);
1673 
1674 //GRN_API
1675 .grn_rc grn_text_esc(.grn_ctx* ctx, .grn_obj* bulk, const (char)* s, size_t len);
1676 
1677 //GRN_API
1678 .grn_rc grn_text_urlenc(.grn_ctx* ctx, .grn_obj* buf, const (char)* str, size_t len);
1679 
1680 //GRN_API
1681 const (char)* grn_text_urldec(.grn_ctx* ctx, .grn_obj* buf, const (char)* s, const (char)* e, char d);
1682 
1683 //GRN_API
1684 .grn_rc grn_text_escape_xml(.grn_ctx* ctx, .grn_obj* buf, const (char)* s, size_t len);
1685 
1686 //GRN_API
1687 .grn_rc grn_text_time2rfc1123(.grn_ctx* ctx, .grn_obj* bulk, int sec);
1688 
1689 /+
1690 //ToDo:
1691 //GRN_API
1692 .grn_rc grn_text_printf(.grn_ctx* ctx, .grn_obj* bulk, const (char)* format, ...) GRN_ATTRIBUTE_PRINTF(3);
1693 +/
1694 
1695 //GRN_API
1696 .grn_rc grn_text_vprintf(.grn_ctx* ctx, .grn_obj* bulk, const (char)* format, core.stdc.stdarg.va_list args);
1697 
1698 //GRN_API
1699 void grn_ctx_recv_handler_set(.grn_ctx*, void function(.grn_ctx*, int, void*) func, void* func_arg);
1700 
1701 /* various values exchanged via .grn_obj */
1702 
1703 enum GRN_OBJ_DO_SHALLOW_COPY = .GRN_OBJ_REFER|.GRN_OBJ_OUTPLACE;
1704 enum GRN_OBJ_VECTOR = 0x01 << 7;
1705 
1706 /+
1707 #define GRN_OBJ_DO_SHALLOW_COPY        (GRN_OBJ_REFER|GRN_OBJ_OUTPLACE)
1708 #define GRN_OBJ_VECTOR                 (0x01<<7)
1709 
1710 #define GRN_OBJ_MUTABLE(obj) ((obj) && (obj)->header.type <= GRN_VECTOR)
1711 
1712 #define GRN_VALUE_FIX_SIZE_INIT(obj,flags,domain)\
1713 	GRN_OBJ_INIT((obj), ((flags) & GRN_OBJ_VECTOR) ? GRN_UVECTOR : GRN_BULK,\
1714 	             ((flags) & GRN_OBJ_DO_SHALLOW_COPY), (domain))
1715 #define GRN_VALUE_VAR_SIZE_INIT(obj,flags,domain)\
1716 	GRN_OBJ_INIT((obj), ((flags) & GRN_OBJ_VECTOR) ? GRN_VECTOR : GRN_BULK,\
1717 	             ((flags) & GRN_OBJ_DO_SHALLOW_COPY), (domain))
1718 
1719 #define GRN_VOID_INIT(obj) GRN_OBJ_INIT((obj), GRN_VOID, 0, GRN_DB_VOID)
1720 #define GRN_TEXT_INIT(obj,flags) \
1721 	GRN_VALUE_VAR_SIZE_INIT(obj, flags, GRN_DB_TEXT)
1722 #define GRN_SHORT_TEXT_INIT(obj,flags) \
1723 	GRN_VALUE_VAR_SIZE_INIT(obj, flags, GRN_DB_SHORT_TEXT)
1724 #define GRN_LONG_TEXT_INIT(obj,flags) \
1725 	GRN_VALUE_VAR_SIZE_INIT(obj, flags, GRN_DB_LONG_TEXT)
1726 #define GRN_TEXT_SET_REF(obj,str,len) do {\
1727 		(obj)->u.b.head = (char *)(str);\
1728 		(obj)->u.b.curr = (char *)(str) + (len);\
1729 	} while (0)
1730 #define GRN_TEXT_SET(ctx,obj,str,len) do {\
1731 		if ((obj)->header.impl_flags & GRN_OBJ_REFER) {\
1732 			GRN_TEXT_SET_REF((obj), (str), (len));\
1733 		} else {\
1734 			grn_bulk_write_from((ctx), (obj), (const char *)(str), 0, (unsigned int)(len));\
1735 		}\
1736 	} while (0)
1737 #define GRN_TEXT_PUT(ctx,obj,str,len) \
1738 	grn_bulk_write((ctx), (obj), (const char *)(str), (unsigned int)(len))
1739 #define GRN_TEXT_PUTC(ctx,obj,c) do {\
1740 		char _c = (c); grn_bulk_write((ctx), (obj), &_c, 1);\
1741 	} while (0)
1742 
1743 #define GRN_TEXT_PUTS(ctx,obj,str) GRN_TEXT_PUT((ctx), (obj), (str), strlen(str))
1744 #define GRN_TEXT_SETS(ctx,obj,str) GRN_TEXT_SET((ctx), (obj), (str), strlen(str))
1745 #define GRN_TEXT_VALUE(obj) GRN_BULK_HEAD(obj)
1746 #define GRN_TEXT_LEN(obj) GRN_BULK_VSIZE(obj)
1747 
1748 #define GRN_TEXT_EQUAL_CSTRING(bulk, string)\
1749 	(GRN_TEXT_LEN(bulk) == strlen(string) &&\
1750 	 memcmp(GRN_TEXT_VALUE(bulk), string, GRN_TEXT_LEN(bulk)) == 0)
1751 
1752 #define GRN_BOOL_INIT(obj,flags) \
1753 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_BOOL)
1754 #define GRN_INT8_INIT(obj,flags) \
1755 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT8)
1756 #define GRN_UINT8_INIT(obj,flags) \
1757 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT8)
1758 #define GRN_INT16_INIT(obj,flags) \
1759 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT16)
1760 #define GRN_UINT16_INIT(obj,flags) \
1761 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT16)
1762 #define GRN_INT32_INIT(obj,flags) \
1763 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT32)
1764 #define GRN_UINT32_INIT(obj,flags) \
1765 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT32)
1766 #define GRN_INT64_INIT(obj,flags) \
1767 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT64)
1768 #define GRN_UINT64_INIT(obj,flags) \
1769 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT64)
1770 #define GRN_FLOAT_INIT(obj,flags) \
1771 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_FLOAT)
1772 #define GRN_TIME_INIT(obj,flags) \
1773 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_TIME)
1774 #define GRN_RECORD_INIT GRN_VALUE_FIX_SIZE_INIT
1775 #define GRN_PTR_INIT(obj,flags,domain)\
1776 	GRN_OBJ_INIT((obj), ((flags) & GRN_OBJ_VECTOR) ? GRN_PVECTOR : GRN_PTR,\
1777 	             ((flags) & (GRN_OBJ_DO_SHALLOW_COPY | GRN_OBJ_OWN)),\
1778 	             (domain))
1779 #define GRN_TOKYO_GEO_POINT_INIT(obj,flags) \
1780 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_TOKYO_GEO_POINT)
1781 #define GRN_WGS84_GEO_POINT_INIT(obj,flags) \
1782 	GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_WGS84_GEO_POINT)
1783 
1784 #define GRN_BOOL_SET(ctx,obj,val) do {\
1785 		bool _val = (bool)(val);\
1786 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(bool));\
1787 	} while (0)
1788 #define GRN_INT8_SET(ctx,obj,val) do {\
1789 		int8_t _val = (int8_t)(val);\
1790 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(int8_t));\
1791 	} while (0)
1792 #define GRN_UINT8_SET(ctx,obj,val) do {\
1793 		uint8_t _val = (uint8_t)(val);\
1794 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(uint8_t));\
1795 	} while (0)
1796 #define GRN_INT16_SET(ctx,obj,val) do {\
1797 		int16_t _val = (int16_t)(val);\
1798 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(int16_t));\
1799 	} while (0)
1800 #define GRN_UINT16_SET(ctx,obj,val) do {\
1801 		uint16_t _val = (uint16_t)(val);\
1802 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(uint16_t));\
1803 	} while (0)
1804 #define GRN_INT32_SET(ctx,obj,val) do {\
1805 		int32_t _val = (int32_t)(val);\
1806 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(int32_t));\
1807 	} while (0)
1808 #define GRN_UINT32_SET(ctx,obj,val) do {\
1809 		uint32_t _val = (uint32_t)(val);\
1810 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(uint32_t));\
1811 	} while (0)
1812 #define GRN_INT64_SET(ctx,obj,val) do {\
1813 		int64_t _val = (int64_t)(val);\
1814 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(int64_t));\
1815 	} while (0)
1816 #define GRN_UINT64_SET(ctx,obj,val) do {\
1817 		uint64_t _val = (uint64_t)(val);\
1818 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(uint64_t));\
1819 	} while (0)
1820 #define GRN_FLOAT_SET(ctx,obj,val) do {\
1821 		double _val = (double)(val);\
1822 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(double));\
1823 	} while (0)
1824 #define GRN_TIME_SET GRN_INT64_SET
1825 #define GRN_RECORD_SET(ctx,obj,val) do {\
1826 		grn_id _val = (grn_id)(val);\
1827 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(grn_id));\
1828 	} while (0)
1829 #define GRN_PTR_SET(ctx,obj,val) do {\
1830 		grn_obj *_val = (grn_obj *)(val);\
1831 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(grn_obj *));\
1832 	} while (0)
1833 
1834 #define GRN_GEO_DEGREE2MSEC(degree)\
1835 	((int32_t)((degree) * 3600 * 1000 + ((degree) > 0 ? 0.5 : -0.5)))
1836 #define GRN_GEO_MSEC2DEGREE(msec)\
1837 	((((int32_t)(msec)) / 3600.0) * 0.001)
1838 
1839 #define GRN_GEO_POINT_SET(ctx,obj,_latitude,_longitude) do {\
1840 		grn_geo_point _val;\
1841 		_val.latitude = (int)(_latitude);\
1842 		_val.longitude = (int)(_longitude);\
1843 		grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(grn_geo_point));\
1844 	} while (0)
1845 
1846 #define GRN_BOOL_SET_AT(ctx,obj,offset,val) do {\
1847 		bool _val = (bool)(val);\
1848 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1849 		                    (offset), sizeof(bool));\
1850 	} while (0)
1851 #define GRN_INT8_SET_AT(ctx,obj,offset,val) do {\
1852 		int8_t _val = (int8_t)(val);\
1853 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1854 		                    (offset) * sizeof(int8_t), sizeof(int8_t));\
1855 	} while (0)
1856 #define GRN_UINT8_SET_AT(ctx,obj,offset,val) do { \
1857 		uint8_t _val = (uint8_t)(val);\
1858 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1859 		                    (offset) * sizeof(uint8_t), sizeof(uint8_t));\
1860 	} while (0)
1861 #define GRN_INT16_SET_AT(ctx,obj,offset,val) do {\
1862 		int16_t _val = (int16_t)(val);\
1863 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1864 		                    (offset) * sizeof(int16_t), sizeof(int16_t));\
1865 	} while (0)
1866 #define GRN_UINT16_SET_AT(ctx,obj,offset,val) do { \
1867 		uint16_t _val = (uint16_t)(val);\
1868 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1869 		                    (offset) * sizeof(uint16_t), sizeof(uint16_t));\
1870 	} while (0)
1871 #define GRN_INT32_SET_AT(ctx,obj,offset,val) do {\
1872 		int32_t _val = (int32_t)(val);\
1873 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1874 		                    (offset) * sizeof(int32_t), sizeof(int32_t));\
1875 	} while (0)
1876 #define GRN_UINT32_SET_AT(ctx,obj,offset,val) do { \
1877 		uint32_t _val = (uint32_t)(val);\
1878 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1879 		                    (offset) * sizeof(uint32_t), sizeof(uint32_t));\
1880 	} while (0)
1881 #define GRN_INT64_SET_AT(ctx,obj,offset,val) do {\
1882 		int64_t _val = (int64_t)(val);\
1883 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1884 		                    (offset) * sizeof(int64_t), sizeof(int64_t));\
1885 	} while (0)
1886 #define GRN_UINT64_SET_AT(ctx,obj,offset,val) do {\
1887 		uint64_t _val = (uint64_t)(val);\
1888 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1889 		                    (offset) * sizeof(uint64_t),\
1890 		                    sizeof(uint64_t));\
1891 	} while (0)
1892 #define GRN_FLOAT_SET_AT(ctx,obj,offset,val) do {\
1893 		double _val = (double)(val);\
1894 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1895 		                    (offset) * sizeof(double), sizeof(double));\
1896 	} while (0)
1897 #define GRN_TIME_SET_AT GRN_INT64_SET_AT
1898 #define GRN_RECORD_SET_AT(ctx,obj,offset,val) do {\
1899 		grn_id _val = (grn_id)(val);\
1900 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1901 		                    (offset) * sizeof(grn_id), sizeof(grn_id));\
1902 	} while (0)
1903 #define GRN_PTR_SET_AT(ctx,obj,offset,val) do {\
1904 		grn_obj *_val = (grn_obj *)(val);\
1905 		grn_bulk_write_from((ctx), (obj), (char *)&_val,\
1906 		                    (offset) * sizeof(grn_obj *), sizeof(grn_obj *));\
1907 	} while (0)
1908 
1909 #define GRN_BOOL_VALUE(obj) (*((bool *)GRN_BULK_HEAD(obj)))
1910 #define GRN_INT8_VALUE(obj) (*((int8_t *)GRN_BULK_HEAD(obj)))
1911 #define GRN_UINT8_VALUE(obj) (*((uint8_t *)GRN_BULK_HEAD(obj)))
1912 #define GRN_INT16_VALUE(obj) (*((int16_t *)GRN_BULK_HEAD(obj)))
1913 #define GRN_UINT16_VALUE(obj) (*((uint16_t *)GRN_BULK_HEAD(obj)))
1914 #define GRN_INT32_VALUE(obj) (*((int32_t *)GRN_BULK_HEAD(obj)))
1915 #define GRN_UINT32_VALUE(obj) (*((uint32_t *)GRN_BULK_HEAD(obj)))
1916 #define GRN_INT64_VALUE(obj) (*((int64_t *)GRN_BULK_HEAD(obj)))
1917 #define GRN_UINT64_VALUE(obj) (*((uint64_t *)GRN_BULK_HEAD(obj)))
1918 #define GRN_FLOAT_VALUE(obj) (*((double *)GRN_BULK_HEAD(obj)))
1919 #define GRN_TIME_VALUE GRN_INT64_VALUE
1920 #define GRN_RECORD_VALUE(obj) (*((grn_id *)GRN_BULK_HEAD(obj)))
1921 #define GRN_PTR_VALUE(obj) (*((grn_obj **)GRN_BULK_HEAD(obj)))
1922 #define GRN_GEO_POINT_VALUE(obj,_latitude,_longitude) do {\
1923 		grn_geo_point *_val = (grn_geo_point *)GRN_BULK_HEAD(obj);\
1924 		_latitude = _val->latitude;\
1925 		_longitude = _val->longitude;\
1926 	} while (0)
1927 
1928 #define GRN_BOOL_VALUE_AT(obj,offset) (((bool *)GRN_BULK_HEAD(obj))[offset])
1929 #define GRN_INT8_VALUE_AT(obj,offset) (((int8_t *)GRN_BULK_HEAD(obj))[offset])
1930 #define GRN_UINT8_VALUE_AT(obj,offset) (((uint8_t *)GRN_BULK_HEAD(obj))[offset])
1931 #define GRN_INT16_VALUE_AT(obj,offset) (((int16_t *)GRN_BULK_HEAD(obj))[offset])
1932 #define GRN_UINT16_VALUE_AT(obj,offset) (((uint16_t *)GRN_BULK_HEAD(obj))[offset])
1933 #define GRN_INT32_VALUE_AT(obj,offset) (((int32_t *)GRN_BULK_HEAD(obj))[offset])
1934 #define GRN_UINT32_VALUE_AT(obj,offset) (((uint32_t *)GRN_BULK_HEAD(obj))[offset])
1935 #define GRN_INT64_VALUE_AT(obj,offset) (((int64_t *)GRN_BULK_HEAD(obj))[offset])
1936 #define GRN_UINT64_VALUE_AT(obj,offset) (((uint64_t *)GRN_BULK_HEAD(obj))[offset])
1937 #define GRN_FLOAT_VALUE_AT(obj,offset) (((double *)GRN_BULK_HEAD(obj))[offset])
1938 #define GRN_TIME_VALUE_AT GRN_INT64_VALUE_AT
1939 #define GRN_RECORD_VALUE_AT(obj,offset) (((grn_id *)GRN_BULK_HEAD(obj))[offset])
1940 #define GRN_PTR_VALUE_AT(obj,offset) (((grn_obj **)GRN_BULK_HEAD(obj))[offset])
1941 
1942 #define GRN_BOOL_PUT(ctx,obj,val) do {\
1943 		bool _val = (bool)(val);\
1944 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(bool));\
1945 	} while (0)
1946 #define GRN_INT8_PUT(ctx,obj,val) do {\
1947 		int8_t _val = (int8_t)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(int8_t));\
1948 	} while (0)
1949 #define GRN_UINT8_PUT(ctx,obj,val) do {\
1950 		uint8_t _val = (uint8_t)(val);\
1951 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(uint8_t));\
1952 	} while (0)
1953 #define GRN_INT16_PUT(ctx,obj,val) do {\
1954 		int16_t _val = (int16_t)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(int16_t));\
1955 	} while (0)
1956 #define GRN_UINT16_PUT(ctx,obj,val) do {\
1957 		uint16_t _val = (uint16_t)(val);\
1958 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(uint16_t));\
1959 	} while (0)
1960 #define GRN_INT32_PUT(ctx,obj,val) do {\
1961 		int32_t _val = (int32_t)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(int32_t));\
1962 	} while (0)
1963 #define GRN_UINT32_PUT(ctx,obj,val) do {\
1964 		uint32_t _val = (uint32_t)(val);\
1965 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(unsigned int));\
1966 	} while (0)
1967 #define GRN_INT64_PUT(ctx,obj,val) do {\
1968 		int64_t _val = (int64_t)(val);\
1969 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(int64_t));\
1970 	} while (0)
1971 #define GRN_UINT64_PUT(ctx,obj,val) do {\
1972 		uint64_t _val = (uint64_t)(val);\
1973 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(uint64_t));\
1974 	} while (0)
1975 #define GRN_FLOAT_PUT(ctx,obj,val) do {\
1976 		double _val = (double)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(double));\
1977 	} while (0)
1978 #define GRN_TIME_PUT GRN_INT64_PUT
1979 #define GRN_RECORD_PUT(ctx,obj,val) do {\
1980 		grn_id _val = (grn_id)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(grn_id));\
1981 	} while (0)
1982 #define GRN_PTR_PUT(ctx,obj,val) do {\
1983 		grn_obj *_val = (grn_obj *)(val);\
1984 		grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(grn_obj *));\
1985 	} while (0)
1986 
1987 #define GRN_BULK_POP(obj, value, type, default) do {\
1988 		if (GRN_BULK_VSIZE(obj) >= sizeof(type)) {\
1989 			GRN_BULK_INCR_LEN((obj), -(sizeof(type)));\
1990 			value = *(type *)(GRN_BULK_CURR(obj));\
1991 		} else {\
1992 			value = default;\
1993 		}\
1994 	} while (0)
1995 #define GRN_BOOL_POP(obj, value) GRN_BULK_POP(obj, value, bool, 0)
1996 #define GRN_INT8_POP(obj, value) GRN_BULK_POP(obj, value, int8_t, 0)
1997 #define GRN_UINT8_POP(obj, value) GRN_BULK_POP(obj, value, uint8_t, 0)
1998 #define GRN_INT16_POP(obj, value) GRN_BULK_POP(obj, value, int16_t, 0)
1999 #define GRN_UINT16_POP(obj, value) GRN_BULK_POP(obj, value, uint16_t, 0)
2000 #define GRN_INT32_POP(obj, value) GRN_BULK_POP(obj, value, int32_t, 0)
2001 #define GRN_UINT32_POP(obj, value) GRN_BULK_POP(obj, value, uint32_t, 0)
2002 #define GRN_INT64_POP(obj, value) GRN_BULK_POP(obj, value, int64_t, 0)
2003 #define GRN_UINT64_POP(obj, value) GRN_BULK_POP(obj, value, uint64_t, 0)
2004 #define GRN_FLOAT_POP(obj, value) GRN_BULK_POP(obj, value, double, 0.0)
2005 #define GRN_TIME_POP GRN_INT64_POP
2006 #define GRN_RECORD_POP(obj, value) GRN_BULK_POP(obj, value, grn_id, GRN_ID_NIL)
2007 #define GRN_PTR_POP(obj, value) GRN_BULK_POP(obj, value, grn_obj *, NULL)
2008 
2009 #define GRN_BULK_VECTOR_SIZE(obj, type) (GRN_BULK_VSIZE(obj) / sizeof(type))
2010 #define GRN_BOOL_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, bool)
2011 #define GRN_INT8_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, int8_t)
2012 #define GRN_UINT8_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, uint8_t)
2013 #define GRN_INT16_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, int16_t)
2014 #define GRN_UINT16_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, uint16_t)
2015 #define GRN_INT32_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, int32_t)
2016 #define GRN_UINT32_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, uint32_t)
2017 #define GRN_INT64_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, int64_t)
2018 #define GRN_UINT64_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, uint64_t)
2019 #define GRN_FLOAT_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, double)
2020 #define GRN_TIME_VECTOR_SIZE GRN_INT64_VECTOR_SIZE
2021 #define GRN_RECORD_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, grn_id)
2022 #define GRN_PTR_VECTOR_SIZE(obj) GRN_BULK_VECTOR_SIZE(obj, grn_obj *)
2023 +/
2024 
2025 //GRN_API
2026 .grn_rc grn_ctx_push(.grn_ctx* ctx, .grn_obj* obj);
2027 
2028 //GRN_API
2029 .grn_obj* grn_ctx_pop(.grn_ctx* ctx);
2030 
2031 //GRN_API
2032 int grn_obj_columns(.grn_ctx* ctx, .grn_obj* table, const (char)* str, uint str_size, .grn_obj* res);
2033 
2034 //GRN_API
2035 .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);
2036 
2037 enum GRN_CTX_MORE = 0x01 << 0;
2038 enum GRN_CTX_TAIL = 0x01 << 1;
2039 enum GRN_CTX_HEAD = 0x01 << 2;
2040 enum GRN_CTX_QUIET = 0x01 << 3;
2041 enum GRN_CTX_QUIT = 0x01 << 4;
2042 
2043 //GRN_API
2044 .grn_rc grn_ctx_connect(.grn_ctx* ctx, const (char)* host, int port, int flags);
2045 
2046 //GRN_API
2047 uint grn_ctx_send(.grn_ctx* ctx, const (char)* str, uint str_len, int flags);
2048 
2049 //GRN_API
2050 uint grn_ctx_recv(.grn_ctx* ctx, char** str, uint* str_len, int* flags);
2051 
2052 struct grn_ctx_info
2053 {
2054 	int fd;
2055 	uint com_status;
2056 	.grn_obj* outbuf;
2057 	ubyte stat;
2058 }
2059 
2060 alias _grn_ctx_info = .grn_ctx_info;
2061 
2062 //GRN_API
2063 .grn_rc grn_ctx_info_get(.grn_ctx* ctx, .grn_ctx_info* info);
2064 
2065 //GRN_API
2066 .grn_rc grn_set_segv_handler();
2067 
2068 //GRN_API
2069 .grn_rc grn_set_int_handler();
2070 
2071 //GRN_API
2072 .grn_rc grn_set_term_handler();
2073 
2074 struct grn_table_delete_optarg
2075 {
2076 extern (C):
2077 	int flags;
2078 	int function(.grn_ctx* ctx, .grn_obj*, uint, void*) func;
2079 	void* func_arg;
2080 }
2081 
2082 alias _grn_table_delete_optarg = .grn_table_delete_optarg;
2083 
2084 struct _grn_table_scan_hit
2085 {
2086 	uint id;
2087 	uint offset;
2088 	uint length;
2089 }
2090 
2091 struct grn_timeval
2092 {
2093 	long tv_sec;
2094 	int tv_nsec;
2095 }