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 }