rroonga 0.9.3-x86-mingw32 → 0.9.4-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/NEWS.ja.rdoc +13 -0
- data/NEWS.rdoc +13 -0
- data/Rakefile +1 -1
- data/ext/groonga/extconf.rb +4 -3
- data/ext/groonga/rb-grn.h +698 -0
- data/html/developer.html +10 -7
- data/html/index.html +1 -1
- data/lib/1.8/groonga.so +0 -0
- data/lib/1.9/groonga.so +0 -0
- data/pkg-config.rb +1 -1
- data/test/run-test.rb +9 -3
- data/vendor/local/bin/libgroonga-0.dll +0 -0
- data/vendor/local/include/groonga.h +2285 -0
- data/vendor/local/lib/libgroonga.la +41 -0
- metadata +37 -85
- data/ext/groonga/mkmf.log +0 -99
- data/test-unit/Rakefile +0 -40
- data/test-unit/TODO +0 -5
- data/test-unit/bin/testrb +0 -5
- data/test-unit/html/classic.html +0 -15
- data/test-unit/html/index.html +0 -25
- data/test-unit/html/index.html.ja +0 -27
- data/test-unit/lib/test/unit/assertionfailederror.rb +0 -25
- data/test-unit/lib/test/unit/assertions.rb +0 -1230
- data/test-unit/lib/test/unit/attribute.rb +0 -125
- data/test-unit/lib/test/unit/autorunner.rb +0 -360
- data/test-unit/lib/test/unit/collector/descendant.rb +0 -23
- data/test-unit/lib/test/unit/collector/dir.rb +0 -108
- data/test-unit/lib/test/unit/collector/load.rb +0 -144
- data/test-unit/lib/test/unit/collector/objectspace.rb +0 -34
- data/test-unit/lib/test/unit/collector.rb +0 -36
- data/test-unit/lib/test/unit/color-scheme.rb +0 -102
- data/test-unit/lib/test/unit/color.rb +0 -96
- data/test-unit/lib/test/unit/diff.rb +0 -724
- data/test-unit/lib/test/unit/error.rb +0 -130
- data/test-unit/lib/test/unit/exceptionhandler.rb +0 -39
- data/test-unit/lib/test/unit/failure.rb +0 -136
- data/test-unit/lib/test/unit/fixture.rb +0 -176
- data/test-unit/lib/test/unit/notification.rb +0 -129
- data/test-unit/lib/test/unit/omission.rb +0 -191
- data/test-unit/lib/test/unit/pending.rb +0 -150
- data/test-unit/lib/test/unit/priority.rb +0 -180
- data/test-unit/lib/test/unit/runner/console.rb +0 -52
- data/test-unit/lib/test/unit/runner/emacs.rb +0 -8
- data/test-unit/lib/test/unit/runner/tap.rb +0 -8
- data/test-unit/lib/test/unit/testcase.rb +0 -476
- data/test-unit/lib/test/unit/testresult.rb +0 -89
- data/test-unit/lib/test/unit/testsuite.rb +0 -110
- data/test-unit/lib/test/unit/ui/console/outputlevel.rb +0 -14
- data/test-unit/lib/test/unit/ui/console/testrunner.rb +0 -466
- data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +0 -63
- data/test-unit/lib/test/unit/ui/tap/testrunner.rb +0 -92
- data/test-unit/lib/test/unit/ui/testrunner.rb +0 -28
- data/test-unit/lib/test/unit/ui/testrunnermediator.rb +0 -77
- data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +0 -41
- data/test-unit/lib/test/unit/util/backtracefilter.rb +0 -41
- data/test-unit/lib/test/unit/util/method-owner-finder.rb +0 -28
- data/test-unit/lib/test/unit/util/observable.rb +0 -90
- data/test-unit/lib/test/unit/util/procwrapper.rb +0 -48
- data/test-unit/lib/test/unit/version.rb +0 -7
- data/test-unit/lib/test/unit.rb +0 -323
- data/test-unit/sample/adder.rb +0 -13
- data/test-unit/sample/subtracter.rb +0 -12
- data/test-unit/sample/test_adder.rb +0 -20
- data/test-unit/sample/test_subtracter.rb +0 -20
- data/test-unit/sample/test_user.rb +0 -23
- data/test-unit/test/collector/test-descendant.rb +0 -133
- data/test-unit/test/collector/test-load.rb +0 -442
- data/test-unit/test/collector/test_dir.rb +0 -406
- data/test-unit/test/collector/test_objectspace.rb +0 -100
- data/test-unit/test/run-test.rb +0 -15
- data/test-unit/test/test-attribute.rb +0 -86
- data/test-unit/test/test-color-scheme.rb +0 -67
- data/test-unit/test/test-color.rb +0 -47
- data/test-unit/test/test-diff.rb +0 -518
- data/test-unit/test/test-emacs-runner.rb +0 -60
- data/test-unit/test/test-fixture.rb +0 -287
- data/test-unit/test/test-notification.rb +0 -33
- data/test-unit/test/test-omission.rb +0 -81
- data/test-unit/test/test-pending.rb +0 -70
- data/test-unit/test/test-priority.rb +0 -119
- data/test-unit/test/test-testcase.rb +0 -544
- data/test-unit/test/test_assertions.rb +0 -1151
- data/test-unit/test/test_error.rb +0 -26
- data/test-unit/test/test_failure.rb +0 -33
- data/test-unit/test/test_testresult.rb +0 -113
- data/test-unit/test/test_testsuite.rb +0 -129
- data/test-unit/test/testunit-test-util.rb +0 -14
- data/test-unit/test/ui/test_testrunmediator.rb +0 -20
- data/test-unit/test/util/test-method-owner-finder.rb +0 -38
- data/test-unit/test/util/test_backtracefilter.rb +0 -41
- data/test-unit/test/util/test_observable.rb +0 -102
- data/test-unit/test/util/test_procwrapper.rb +0 -36
@@ -0,0 +1,2285 @@
|
|
1
|
+
/* Copyright(C) 2009 Brazil
|
2
|
+
|
3
|
+
This library is free software; you can redistribute it and/or
|
4
|
+
modify it under the terms of the GNU Lesser General Public
|
5
|
+
License as published by the Free Software Foundation; either
|
6
|
+
version 2.1 of the License, or (at your option) any later version.
|
7
|
+
|
8
|
+
This library is distributed in the hope that it will be useful,
|
9
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
Lesser General Public License for more details.
|
12
|
+
|
13
|
+
You should have received a copy of the GNU Lesser General Public
|
14
|
+
License along with this library; if not, write to the Free Software
|
15
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
16
|
+
*/
|
17
|
+
#ifndef GROONGA_H
|
18
|
+
#define GROONGA_H
|
19
|
+
|
20
|
+
#ifdef __cplusplus
|
21
|
+
extern "C" {
|
22
|
+
#endif
|
23
|
+
|
24
|
+
#ifndef GRN_API
|
25
|
+
#if defined(_WIN32) || defined(_WIN64)
|
26
|
+
#define GRN_API __declspec(dllimport)
|
27
|
+
#else
|
28
|
+
#define GRN_API
|
29
|
+
#endif /* defined(_WIN32) || defined(_WIN64) */
|
30
|
+
#endif /* GRN_API */
|
31
|
+
|
32
|
+
typedef unsigned grn_id;
|
33
|
+
|
34
|
+
#define GRN_ID_NIL (0x00)
|
35
|
+
#define GRN_ID_MAX (0x3fffffff)
|
36
|
+
|
37
|
+
#define GRN_TRUE (1)
|
38
|
+
#define GRN_FALSE (0)
|
39
|
+
|
40
|
+
typedef enum {
|
41
|
+
GRN_SUCCESS = 0,
|
42
|
+
GRN_END_OF_DATA = 1,
|
43
|
+
GRN_UNKNOWN_ERROR = -1,
|
44
|
+
GRN_OPERATION_NOT_PERMITTED = -2,
|
45
|
+
GRN_NO_SUCH_FILE_OR_DIRECTORY = -3,
|
46
|
+
GRN_NO_SUCH_PROCESS = -4,
|
47
|
+
GRN_INTERRUPTED_FUNCTION_CALL = -5,
|
48
|
+
GRN_INPUT_OUTPUT_ERROR = -6,
|
49
|
+
GRN_NO_SUCH_DEVICE_OR_ADDRESS = -7,
|
50
|
+
GRN_ARG_LIST_TOO_LONG = -8,
|
51
|
+
GRN_EXEC_FORMAT_ERROR = -9,
|
52
|
+
GRN_BAD_FILE_DESCRIPTOR = -10,
|
53
|
+
GRN_NO_CHILD_PROCESSES = -11,
|
54
|
+
GRN_RESOURCE_TEMPORARILY_UNAVAILABLE = -12,
|
55
|
+
GRN_NOT_ENOUGH_SPACE = -13,
|
56
|
+
GRN_PERMISSION_DENIED = -14,
|
57
|
+
GRN_BAD_ADDRESS = -15,
|
58
|
+
GRN_RESOURCE_BUSY = -16,
|
59
|
+
GRN_FILE_EXISTS = -17,
|
60
|
+
GRN_IMPROPER_LINK = -18,
|
61
|
+
GRN_NO_SUCH_DEVICE = -19,
|
62
|
+
GRN_NOT_A_DIRECTORY = -20,
|
63
|
+
GRN_IS_A_DIRECTORY = -21,
|
64
|
+
GRN_INVALID_ARGUMENT = -22,
|
65
|
+
GRN_TOO_MANY_OPEN_FILES_IN_SYSTEM = -23,
|
66
|
+
GRN_TOO_MANY_OPEN_FILES = -24,
|
67
|
+
GRN_INAPPROPRIATE_I_O_CONTROL_OPERATION = -25,
|
68
|
+
GRN_FILE_TOO_LARGE = -26,
|
69
|
+
GRN_NO_SPACE_LEFT_ON_DEVICE = -27,
|
70
|
+
GRN_INVALID_SEEK = -28,
|
71
|
+
GRN_READ_ONLY_FILE_SYSTEM = -29,
|
72
|
+
GRN_TOO_MANY_LINKS = -30,
|
73
|
+
GRN_BROKEN_PIPE = -31,
|
74
|
+
GRN_DOMAIN_ERROR = -32,
|
75
|
+
GRN_RESULT_TOO_LARGE = -33,
|
76
|
+
GRN_RESOURCE_DEADLOCK_AVOIDED = -34,
|
77
|
+
GRN_NO_MEMORY_AVAILABLE = -35,
|
78
|
+
GRN_FILENAME_TOO_LONG = -36,
|
79
|
+
GRN_NO_LOCKS_AVAILABLE = -37,
|
80
|
+
GRN_FUNCTION_NOT_IMPLEMENTED = -38,
|
81
|
+
GRN_DIRECTORY_NOT_EMPTY = -39,
|
82
|
+
GRN_ILLEGAL_BYTE_SEQUENCE = -40,
|
83
|
+
GRN_SOCKET_NOT_INITIALIZED = -41,
|
84
|
+
GRN_OPERATION_WOULD_BLOCK = -42,
|
85
|
+
GRN_ADDRESS_IS_NOT_AVAILABLE = -43,
|
86
|
+
GRN_NETWORK_IS_DOWN = -44,
|
87
|
+
GRN_NO_BUFFER = -45,
|
88
|
+
GRN_SOCKET_IS_ALREADY_CONNECTED = -46,
|
89
|
+
GRN_SOCKET_IS_NOT_CONNECTED = -47,
|
90
|
+
GRN_SOCKET_IS_ALREADY_SHUTDOWNED = -48,
|
91
|
+
GRN_OPERATION_TIMEOUT = -49,
|
92
|
+
GRN_CONNECTION_REFUSED = -50,
|
93
|
+
GRN_RANGE_ERROR = -51,
|
94
|
+
GRN_TOKENIZER_ERROR = -52,
|
95
|
+
GRN_FILE_CORRUPT = -53,
|
96
|
+
GRN_INVALID_FORMAT = -54,
|
97
|
+
GRN_OBJECT_CORRUPT = -55,
|
98
|
+
GRN_TOO_MANY_SYMBOLIC_LINKS = -56,
|
99
|
+
GRN_NOT_SOCKET = -57,
|
100
|
+
GRN_OPERATION_NOT_SUPPORTED = -58,
|
101
|
+
GRN_ADDRESS_IS_IN_USE = -59,
|
102
|
+
GRN_ZLIB_ERROR = -60,
|
103
|
+
GRN_LZO_ERROR = -61,
|
104
|
+
GRN_STACK_OVER_FLOW = -62,
|
105
|
+
GRN_SYNTAX_ERROR = -63,
|
106
|
+
GRN_RETRY_MAX = -64,
|
107
|
+
GRN_INCOMPATIBLE_FILE_FORMAT = -65,
|
108
|
+
GRN_UPDATE_NOT_ALLOWED = -66,
|
109
|
+
} grn_rc;
|
110
|
+
|
111
|
+
GRN_API grn_rc grn_init(void);
|
112
|
+
GRN_API grn_rc grn_fin(void);
|
113
|
+
|
114
|
+
typedef enum {
|
115
|
+
GRN_ENC_DEFAULT = 0,
|
116
|
+
GRN_ENC_NONE,
|
117
|
+
GRN_ENC_EUC_JP,
|
118
|
+
GRN_ENC_UTF8,
|
119
|
+
GRN_ENC_SJIS,
|
120
|
+
GRN_ENC_LATIN1,
|
121
|
+
GRN_ENC_KOI8R
|
122
|
+
} grn_encoding;
|
123
|
+
|
124
|
+
typedef enum {
|
125
|
+
GRN_LOG_NONE = 0,
|
126
|
+
GRN_LOG_EMERG,
|
127
|
+
GRN_LOG_ALERT,
|
128
|
+
GRN_LOG_CRIT,
|
129
|
+
GRN_LOG_ERROR,
|
130
|
+
GRN_LOG_WARNING,
|
131
|
+
GRN_LOG_NOTICE,
|
132
|
+
GRN_LOG_INFO,
|
133
|
+
GRN_LOG_DEBUG,
|
134
|
+
GRN_LOG_DUMP
|
135
|
+
} grn_log_level;
|
136
|
+
|
137
|
+
typedef enum {
|
138
|
+
GRN_CONTENT_NONE = 0,
|
139
|
+
GRN_CONTENT_TSV,
|
140
|
+
GRN_CONTENT_JSON,
|
141
|
+
GRN_CONTENT_XML
|
142
|
+
} grn_content_type;
|
143
|
+
|
144
|
+
typedef struct _grn_obj grn_obj;
|
145
|
+
typedef struct _grn_ctx grn_ctx;
|
146
|
+
|
147
|
+
#define GRN_CTX_MSGSIZE (0x80)
|
148
|
+
#define GRN_CTX_FIN (0xff)
|
149
|
+
|
150
|
+
typedef union {
|
151
|
+
int int_value;
|
152
|
+
grn_id id;
|
153
|
+
void *ptr;
|
154
|
+
} grn_user_data;
|
155
|
+
|
156
|
+
typedef grn_obj *grn_proc_func(grn_ctx *ctx, int nargs, grn_obj **args,
|
157
|
+
grn_user_data *user_data);
|
158
|
+
|
159
|
+
struct _grn_ctx {
|
160
|
+
grn_rc rc;
|
161
|
+
int flags;
|
162
|
+
grn_encoding encoding;
|
163
|
+
unsigned char ntrace;
|
164
|
+
unsigned char errlvl;
|
165
|
+
unsigned char stat;
|
166
|
+
unsigned int seqno;
|
167
|
+
unsigned int subno;
|
168
|
+
unsigned int seqno2;
|
169
|
+
unsigned int errline;
|
170
|
+
grn_user_data user_data;
|
171
|
+
grn_ctx *prev;
|
172
|
+
grn_ctx *next;
|
173
|
+
const char *errfile;
|
174
|
+
const char *errfunc;
|
175
|
+
struct _grn_ctx_impl *impl;
|
176
|
+
void *trace[16];
|
177
|
+
char errbuf[GRN_CTX_MSGSIZE];
|
178
|
+
};
|
179
|
+
|
180
|
+
#define GRN_CTX_USER_DATA(ctx) (&((ctx)->user_data))
|
181
|
+
|
182
|
+
/**
|
183
|
+
* grn_ctx_init:
|
184
|
+
* @ctx: 初期化するctx構造体へのポインタを指定します。
|
185
|
+
* @flags: 初期化するctxのオプションを指定します。
|
186
|
+
*
|
187
|
+
* ctxを初期化します。
|
188
|
+
**/
|
189
|
+
|
190
|
+
#define GRN_CTX_USE_QL (0x03)
|
191
|
+
#define GRN_CTX_BATCH_MODE (0x04)
|
192
|
+
|
193
|
+
GRN_API grn_rc grn_ctx_init(grn_ctx *ctx, int flags);
|
194
|
+
|
195
|
+
/**
|
196
|
+
* grn_ctx_open:
|
197
|
+
* @flags: 初期化するctxのオプションを指定します。
|
198
|
+
*
|
199
|
+
*
|
200
|
+
* 初期化されたgrn_ctxオブジェクトを返します。
|
201
|
+
* grn_ctx_initで初期化されたgrn_ctxオブジェクトは構造体の実体を
|
202
|
+
* APIの呼び元で確保するのに対して、grn_ctx_openではgroongaライブラリの内部で、
|
203
|
+
* 実体を確保します。どちらで初期化されたgrn_ctxも、grn_ctx_fin()で解放できます。
|
204
|
+
* grn_ctx_openで確保したgrn_ctx構造体に関しては、grn_ctx_fin()で解放した後に、
|
205
|
+
* そのgrn_ctxで作成したgrn_objをgrn_obj_close()によって解放しても問題ありません。
|
206
|
+
**/
|
207
|
+
|
208
|
+
GRN_API grn_ctx *grn_ctx_open(int flags);
|
209
|
+
|
210
|
+
/**
|
211
|
+
* grn_ctx_fin:
|
212
|
+
* @ctx: 解放するctx構造体へのポインタを指定します。
|
213
|
+
*
|
214
|
+
* ctxの管理するメモリを解放し、使用を終了します。
|
215
|
+
**/
|
216
|
+
GRN_API grn_rc grn_ctx_fin(grn_ctx *ctx);
|
217
|
+
|
218
|
+
/**
|
219
|
+
* grn_get_default_encoding:
|
220
|
+
*
|
221
|
+
* デフォルトのencodingを返します。
|
222
|
+
**/
|
223
|
+
GRN_API grn_encoding grn_get_default_encoding(void);
|
224
|
+
|
225
|
+
/**
|
226
|
+
* grn_set_default_encoding:
|
227
|
+
* @encoding: 変更後のデフォルトのencodingを指定します。
|
228
|
+
*
|
229
|
+
* デフォルトのencodingを変更します。
|
230
|
+
**/
|
231
|
+
GRN_API grn_rc grn_set_default_encoding(grn_encoding encoding);
|
232
|
+
|
233
|
+
#define GRN_CTX_GET_ENCODING(ctx) ((ctx)->encoding)
|
234
|
+
#define GRN_CTX_SET_ENCODING(ctx,enc) \
|
235
|
+
((ctx)->encoding = (enc == GRN_ENC_DEFAULT) ? grn_get_default_encoding() : enc)
|
236
|
+
|
237
|
+
GRN_API const char *grn_get_version(void);
|
238
|
+
GRN_API const char *grn_get_package(void);
|
239
|
+
|
240
|
+
/* obj */
|
241
|
+
|
242
|
+
typedef unsigned short int grn_obj_flags;
|
243
|
+
|
244
|
+
#define GRN_OBJ_TABLE_TYPE_MASK (0x07)
|
245
|
+
#define GRN_OBJ_TABLE_HASH_KEY (0x00)
|
246
|
+
#define GRN_OBJ_TABLE_PAT_KEY (0x01)
|
247
|
+
#define GRN_OBJ_TABLE_NO_KEY (0x03)
|
248
|
+
#define GRN_OBJ_TABLE_VIEW (0x04)
|
249
|
+
|
250
|
+
#define GRN_OBJ_KEY_MASK (0x07<<3)
|
251
|
+
#define GRN_OBJ_KEY_UINT (0x00<<3)
|
252
|
+
#define GRN_OBJ_KEY_INT (0x01<<3)
|
253
|
+
#define GRN_OBJ_KEY_FLOAT (0x02<<3)
|
254
|
+
|
255
|
+
#define GRN_OBJ_KEY_WITH_SIS (0x01<<6)
|
256
|
+
#define GRN_OBJ_KEY_NORMALIZE (0x01<<7)
|
257
|
+
|
258
|
+
#define GRN_OBJ_COLUMN_TYPE_MASK (0x07)
|
259
|
+
#define GRN_OBJ_COLUMN_SCALAR (0x00)
|
260
|
+
#define GRN_OBJ_COLUMN_VECTOR (0x01)
|
261
|
+
#define GRN_OBJ_COLUMN_INDEX (0x02)
|
262
|
+
|
263
|
+
#define GRN_OBJ_COMPRESS_MASK (0x07<<4)
|
264
|
+
#define GRN_OBJ_COMPRESS_NONE (0x00<<4)
|
265
|
+
#define GRN_OBJ_COMPRESS_ZLIB (0x01<<4)
|
266
|
+
#define GRN_OBJ_COMPRESS_LZO (0x02<<4)
|
267
|
+
|
268
|
+
#define GRN_OBJ_WITH_SECTION (0x01<<7)
|
269
|
+
#define GRN_OBJ_WITH_WEIGHT (0x01<<8)
|
270
|
+
#define GRN_OBJ_WITH_POSITION (0x01<<9)
|
271
|
+
#define GRN_OBJ_WITH_BUFFER (0x01<<10)
|
272
|
+
|
273
|
+
#define GRN_OBJ_UNIT_MASK (0x0f<<8)
|
274
|
+
#define GRN_OBJ_UNIT_DOCUMENT_NONE (0x00<<8)
|
275
|
+
#define GRN_OBJ_UNIT_DOCUMENT_SECTION (0x01<<8)
|
276
|
+
#define GRN_OBJ_UNIT_DOCUMENT_POSITION (0x02<<8)
|
277
|
+
#define GRN_OBJ_UNIT_SECTION_NONE (0x03<<8)
|
278
|
+
#define GRN_OBJ_UNIT_SECTION_POSITION (0x04<<8)
|
279
|
+
#define GRN_OBJ_UNIT_POSITION_NONE (0x05<<8)
|
280
|
+
#define GRN_OBJ_UNIT_USERDEF_DOCUMENT (0x06<<8)
|
281
|
+
#define GRN_OBJ_UNIT_USERDEF_SECTION (0x07<<8)
|
282
|
+
#define GRN_OBJ_UNIT_USERDEF_POSITION (0x08<<8)
|
283
|
+
|
284
|
+
#define GRN_OBJ_NO_SUBREC (0x00<<13)
|
285
|
+
#define GRN_OBJ_WITH_SUBREC (0x01<<13)
|
286
|
+
|
287
|
+
#define GRN_OBJ_KEY_VAR_SIZE (0x01<<14)
|
288
|
+
|
289
|
+
#define GRN_OBJ_TEMPORARY (0x00<<15)
|
290
|
+
#define GRN_OBJ_PERSISTENT (0x01<<15)
|
291
|
+
|
292
|
+
/* obj types */
|
293
|
+
|
294
|
+
#define GRN_VOID (0x00)
|
295
|
+
#define GRN_BULK (0x02)
|
296
|
+
#define GRN_PTR (0x03)
|
297
|
+
#define GRN_UVECTOR (0x04) /* vector of grn_id */
|
298
|
+
#define GRN_PVECTOR (0x05) /* vector of grn_obj* */
|
299
|
+
#define GRN_VECTOR (0x06) /* vector of arbitrary data */
|
300
|
+
#define GRN_MSG (0x07)
|
301
|
+
#define GRN_QUERY (0x08)
|
302
|
+
#define GRN_ACCESSOR (0x09)
|
303
|
+
#define GRN_ACCESSOR_VIEW (0x0a)
|
304
|
+
#define GRN_SNIP (0x0b)
|
305
|
+
#define GRN_PATSNIP (0x0c)
|
306
|
+
#define GRN_CURSOR_TABLE_HASH_KEY (0x10)
|
307
|
+
#define GRN_CURSOR_TABLE_PAT_KEY (0x11)
|
308
|
+
#define GRN_CURSOR_TABLE_NO_KEY (0x13)
|
309
|
+
#define GRN_CURSOR_TABLE_VIEW (0x14)
|
310
|
+
#define GRN_CURSOR_COLUMN_INDEX (0x18)
|
311
|
+
#define GRN_TYPE (0x20)
|
312
|
+
#define GRN_PROC (0x21)
|
313
|
+
#define GRN_EXPR (0x22)
|
314
|
+
#define GRN_TABLE_HASH_KEY (0x30)
|
315
|
+
#define GRN_TABLE_PAT_KEY (0x31)
|
316
|
+
#define GRN_TABLE_NO_KEY (0x33)
|
317
|
+
#define GRN_TABLE_VIEW (0x34)
|
318
|
+
#define GRN_DB (0x37)
|
319
|
+
#define GRN_COLUMN_FIX_SIZE (0x40)
|
320
|
+
#define GRN_COLUMN_VAR_SIZE (0x41)
|
321
|
+
#define GRN_COLUMN_INDEX (0x48)
|
322
|
+
|
323
|
+
typedef struct _grn_section grn_section;
|
324
|
+
typedef struct _grn_obj_header grn_obj_header;
|
325
|
+
|
326
|
+
struct _grn_section {
|
327
|
+
unsigned int offset;
|
328
|
+
unsigned int length;
|
329
|
+
unsigned int weight;
|
330
|
+
grn_id domain;
|
331
|
+
};
|
332
|
+
|
333
|
+
struct _grn_obj_header {
|
334
|
+
unsigned char type;
|
335
|
+
unsigned char impl_flags;
|
336
|
+
grn_obj_flags flags;
|
337
|
+
grn_id domain;
|
338
|
+
};
|
339
|
+
|
340
|
+
struct _grn_obj {
|
341
|
+
grn_obj_header header;
|
342
|
+
union {
|
343
|
+
struct {
|
344
|
+
char *head;
|
345
|
+
char *curr;
|
346
|
+
char *tail;
|
347
|
+
} b;
|
348
|
+
struct {
|
349
|
+
grn_obj *body;
|
350
|
+
grn_section *sections;
|
351
|
+
int n_sections;
|
352
|
+
} v;
|
353
|
+
} u;
|
354
|
+
};
|
355
|
+
|
356
|
+
#define GRN_OBJ_REFER (0x01<<0)
|
357
|
+
#define GRN_OBJ_OUTPLACE (0x01<<1)
|
358
|
+
|
359
|
+
#define GRN_OBJ_INIT(obj,obj_type,obj_flags,obj_domain) do { \
|
360
|
+
(obj)->header.type = (obj_type);\
|
361
|
+
(obj)->header.impl_flags = (obj_flags);\
|
362
|
+
(obj)->header.flags = 0;\
|
363
|
+
(obj)->header.domain = (obj_domain);\
|
364
|
+
(obj)->u.b.head = NULL;\
|
365
|
+
(obj)->u.b.curr = NULL;\
|
366
|
+
(obj)->u.b.tail = NULL;\
|
367
|
+
} while (0)
|
368
|
+
|
369
|
+
#define GRN_OBJ_FIN(ctx,obj) (grn_obj_close((ctx), (obj)))
|
370
|
+
|
371
|
+
/**
|
372
|
+
* grn_db_create:
|
373
|
+
* @path: 作成するdbを格納するファイルパス。NULLならtemporary dbとなる。
|
374
|
+
* NULL以外のパスを指定した場合はpersistent dbとなる。
|
375
|
+
* @optarg: 作成するdbの組み込み型の名前を変更する時に指定する。
|
376
|
+
* optarg.builtin_type_namesには組み込み型の名前となるnul終端文字列の配列を指定する。
|
377
|
+
* optarg.n_builtin_type_namesには、optarg.builtin_type_namesで指定する文字列の数を
|
378
|
+
* 指定する。配列のoffsetはenum型grn_builtin_typeの値に対応する。
|
379
|
+
*
|
380
|
+
* 新たなdbを作成する。
|
381
|
+
**/
|
382
|
+
|
383
|
+
typedef struct _grn_db_create_optarg grn_db_create_optarg;
|
384
|
+
|
385
|
+
struct _grn_db_create_optarg {
|
386
|
+
char **builtin_type_names;
|
387
|
+
int n_builtin_type_names;
|
388
|
+
};
|
389
|
+
|
390
|
+
GRN_API grn_obj *grn_db_create(grn_ctx *ctx, const char *path, grn_db_create_optarg *optarg);
|
391
|
+
|
392
|
+
#define GRN_DB_OPEN_OR_CREATE(ctx,path,optarg,db) \
|
393
|
+
(((db) = grn_db_open((ctx), (path))) || (db = grn_db_create((ctx), (path), (optarg))))
|
394
|
+
|
395
|
+
/**
|
396
|
+
* grn_db_open:
|
397
|
+
* @path: 開こうとするdbを格納するファイルパス。
|
398
|
+
*
|
399
|
+
* 既存のdbを開く。
|
400
|
+
**/
|
401
|
+
GRN_API grn_obj *grn_db_open(grn_ctx *ctx, const char *path);
|
402
|
+
|
403
|
+
/**
|
404
|
+
* grn_ctx_use:
|
405
|
+
* @db: ctxが使用するdbを指定します。
|
406
|
+
*
|
407
|
+
* ctxが操作対象とするdbを指定します。NULLを指定した場合は、
|
408
|
+
* dbを操作しない状態(init直後の状態)になります。
|
409
|
+
**/
|
410
|
+
GRN_API grn_rc grn_ctx_use(grn_ctx *ctx, grn_obj *db);
|
411
|
+
|
412
|
+
/**
|
413
|
+
* grn_ctx_db:
|
414
|
+
*
|
415
|
+
* ctxが現在操作対象としているdbを返します。
|
416
|
+
* dbを使用していない場合はNULLを返します。
|
417
|
+
**/
|
418
|
+
GRN_API grn_obj *grn_ctx_db(grn_ctx *ctx);
|
419
|
+
|
420
|
+
/**
|
421
|
+
* grn_ctx_get:
|
422
|
+
* @name: 検索しようとするオブジェクトの名前。
|
423
|
+
* @name_size: @nameのbyte長。
|
424
|
+
*
|
425
|
+
* ctxが使用するdbからnameに対応するオブジェクトを検索して返す。
|
426
|
+
* nameに一致するオブジェクトが存在しなければNULLを返す。
|
427
|
+
**/
|
428
|
+
GRN_API grn_obj *grn_ctx_get(grn_ctx *ctx, const char *name, unsigned name_size);
|
429
|
+
|
430
|
+
/**
|
431
|
+
* grn_ctx_at:
|
432
|
+
* @id: 検索しようとするオブジェクトのid。
|
433
|
+
*
|
434
|
+
* ctx、またはctxが使用するdbからidに対応するオブジェクトを検索して返す。
|
435
|
+
* idに一致するオブジェクトが存在しなければNULLを返す。
|
436
|
+
**/
|
437
|
+
|
438
|
+
typedef enum {
|
439
|
+
GRN_DB_VOID = 0,
|
440
|
+
GRN_DB_DB,
|
441
|
+
GRN_DB_OBJECT,
|
442
|
+
GRN_DB_BOOL,
|
443
|
+
GRN_DB_INT8,
|
444
|
+
GRN_DB_UINT8,
|
445
|
+
GRN_DB_INT16,
|
446
|
+
GRN_DB_UINT16,
|
447
|
+
GRN_DB_INT32,
|
448
|
+
GRN_DB_UINT32,
|
449
|
+
GRN_DB_INT64,
|
450
|
+
GRN_DB_UINT64,
|
451
|
+
GRN_DB_FLOAT,
|
452
|
+
GRN_DB_TIME,
|
453
|
+
GRN_DB_SHORT_TEXT,
|
454
|
+
GRN_DB_TEXT,
|
455
|
+
GRN_DB_LONG_TEXT,
|
456
|
+
GRN_DB_TOKYO_GEO_POINT,
|
457
|
+
GRN_DB_WGS84_GEO_POINT
|
458
|
+
} grn_builtin_type;
|
459
|
+
|
460
|
+
typedef enum {
|
461
|
+
GRN_DB_MECAB = 64,
|
462
|
+
GRN_DB_DELIMIT,
|
463
|
+
GRN_DB_UNIGRAM,
|
464
|
+
GRN_DB_BIGRAM,
|
465
|
+
GRN_DB_TRIGRAM,
|
466
|
+
} grn_builtin_tokenizer;
|
467
|
+
|
468
|
+
GRN_API grn_obj *grn_ctx_at(grn_ctx *ctx, grn_id id);
|
469
|
+
|
470
|
+
/**
|
471
|
+
* grn_type_create:
|
472
|
+
* @name: 作成するtypeの名前。
|
473
|
+
* @flags: GRN_OBJ_KEY_VAR_SIZE, GRN_OBJ_KEY_FLOAT, GRN_OBJ_KEY_INT, GRN_OBJ_KEY_UINT
|
474
|
+
* のいずれかを指定
|
475
|
+
* @size: GRN_OBJ_KEY_VAR_SIZEの場合は最大長、
|
476
|
+
* それ以外の場合は長さを指定(単位:byte)
|
477
|
+
*
|
478
|
+
* nameに対応する新たなtype(型)をdbに定義する。
|
479
|
+
**/
|
480
|
+
|
481
|
+
GRN_API grn_obj *grn_type_create(grn_ctx *ctx, const char *name, unsigned name_size,
|
482
|
+
grn_obj_flags flags, unsigned int size);
|
483
|
+
|
484
|
+
GRN_API grn_rc grn_db_load(grn_ctx *ctx, const char *path);
|
485
|
+
|
486
|
+
/**
|
487
|
+
* grn_proc_create:
|
488
|
+
* @name: 作成するprocの名前。
|
489
|
+
* @type: procの種類。
|
490
|
+
* @init: 初期化関数のポインタ
|
491
|
+
* @next: 実処理関数のポインタ
|
492
|
+
* @fin: 終了関数のポインタ
|
493
|
+
* @nvars: procで使用する変数の数
|
494
|
+
* @vars: procで使用する変数の定義(grn_expr_var構造体の配列)
|
495
|
+
*
|
496
|
+
* nameに対応する新たなproc(手続き)をctxが使用するdbに定義する。
|
497
|
+
**/
|
498
|
+
|
499
|
+
typedef struct {
|
500
|
+
char *name;
|
501
|
+
unsigned name_size;
|
502
|
+
grn_obj value;
|
503
|
+
} grn_expr_var;
|
504
|
+
|
505
|
+
typedef grn_rc grn_proc_init_func(grn_ctx *ctx, const char *path);
|
506
|
+
|
507
|
+
typedef enum {
|
508
|
+
GRN_PROC_TOKENIZER = 1,
|
509
|
+
GRN_PROC_PROCEDURE,
|
510
|
+
GRN_PROC_FUNCTION,
|
511
|
+
GRN_PROC_HOOK
|
512
|
+
} grn_proc_type;
|
513
|
+
|
514
|
+
GRN_API grn_obj *grn_proc_create(grn_ctx *ctx,
|
515
|
+
const char *name, unsigned name_size,
|
516
|
+
const char *path, grn_proc_type type,
|
517
|
+
grn_proc_func *init, grn_proc_func *next, grn_proc_func *fin,
|
518
|
+
unsigned nvars, grn_expr_var *vars);
|
519
|
+
/**
|
520
|
+
* grn_proc_vars:
|
521
|
+
* @user_data: grn_proc_funcに渡されたuser_data
|
522
|
+
* @nvars: 変数の数
|
523
|
+
*
|
524
|
+
* user_dataをキーとして、現在実行中のgrn_proc_func関数および
|
525
|
+
* 定義されている変数(grn_expr_var)の配列とその数を取得する。
|
526
|
+
**/
|
527
|
+
|
528
|
+
GRN_API grn_obj *grn_proc_get_info(grn_ctx *ctx, grn_user_data *user_data,
|
529
|
+
grn_expr_var **vars, unsigned *nvars, grn_obj **caller);
|
530
|
+
|
531
|
+
/*-------------------------------------------------------------
|
532
|
+
* table操作のための関数
|
533
|
+
*/
|
534
|
+
|
535
|
+
#define GRN_TABLE_MAX_KEY_SIZE (0x1000)
|
536
|
+
|
537
|
+
/**
|
538
|
+
* grn_table_create:
|
539
|
+
* @name: 作成するtableの名前。NULLなら無名tableとなる。
|
540
|
+
* persistent dbに対して名前をありのtableを作成するときには、
|
541
|
+
* flagsにGRN_OBJ_PERSISTENTが指定されていなければならない。
|
542
|
+
* @path: 作成するtableのファイルパス。
|
543
|
+
* flagsにGRN_OBJ_PERSISTENTが指定されている場合のみ有効。
|
544
|
+
* NULLなら自動的にファイルパスが付与される。
|
545
|
+
* @flags: GRN_OBJ_PERSISTENTを指定すると永続tableとなる。
|
546
|
+
* GRN_OBJ_TABLE_PAT_KEY,GRN_OBJ_TABLE_HASH_KEY,GRN_OBJ_TABLE_NO_KEY
|
547
|
+
* のいずれかを指定する。
|
548
|
+
* GRN_OBJ_KEY_NORMALIZEを指定すると正規化された文字列がkeyとなる。
|
549
|
+
* GRN_OBJ_KEY_WITH_SISを指定するとkey文字列の全suffixが自動的に登録される。
|
550
|
+
* @key_type: keyの型を指定する。GRN_OBJ_TABLE_NO_KEYが指定された場合は無効。
|
551
|
+
* 既存のtypeあるいはtableを指定できる。
|
552
|
+
* key_typeにtable Aを指定してtable Bを作成した場合、Bは必ずAのサブセットとなる。
|
553
|
+
* @value_type: keyに対応する値を格納する領域の型。tableはcolumnとは別に、
|
554
|
+
* keyに対応する値を格納する領域を一つだけ持つことができる。
|
555
|
+
*
|
556
|
+
* nameに対応する新たなtableをctxが使用するdbに定義する。
|
557
|
+
**/
|
558
|
+
GRN_API grn_obj *grn_table_create(grn_ctx *ctx,
|
559
|
+
const char *name, unsigned name_size,
|
560
|
+
const char *path, grn_obj_flags flags,
|
561
|
+
grn_obj *key_type, grn_obj *value_type);
|
562
|
+
|
563
|
+
#define GRN_TABLE_OPEN_OR_CREATE(ctx,name,name_size,path,flags,key_type,value_type,table) \
|
564
|
+
(((table) = grn_ctx_get((ctx), (name), (name_size))) ||\
|
565
|
+
((table) = grn_table_create((ctx), (name), (name_size), (path), (flags), (key_type), (value_type))))
|
566
|
+
|
567
|
+
/**
|
568
|
+
* grn_table_add:
|
569
|
+
* @table: 対象table
|
570
|
+
* @key: 検索key
|
571
|
+
* @added: NULL以外の値が指定された場合、
|
572
|
+
* 新たにrecordが追加された時には1が、既存recordだった時には0がセットされる。
|
573
|
+
*
|
574
|
+
* keyに対応する新しいrecordをtableに追加し、そのIDを返す。
|
575
|
+
* keyに対応するrecordがすでにtableに存在するならば、そのrecordのIDを返す。
|
576
|
+
* GRN_OBJ_TABLE_NO_KEYが指定されたtableでは、key, key_size は無視される。
|
577
|
+
**/
|
578
|
+
GRN_API grn_id grn_table_add(grn_ctx *ctx, grn_obj *table,
|
579
|
+
const void *key, unsigned key_size, int *added);
|
580
|
+
|
581
|
+
/**
|
582
|
+
* grn_table_get:
|
583
|
+
* @table: 対象table
|
584
|
+
* @key: 検索key
|
585
|
+
*
|
586
|
+
* tableからkeyに対応するrecordを検索し、対応するIDを返す。
|
587
|
+
**/
|
588
|
+
GRN_API grn_id grn_table_get(grn_ctx *ctx, grn_obj *table,
|
589
|
+
const void *key, unsigned key_size);
|
590
|
+
|
591
|
+
/**
|
592
|
+
* grn_table_lcp_search:
|
593
|
+
* @table: 対象table
|
594
|
+
* @key: 検索key
|
595
|
+
*
|
596
|
+
* tableがGRN_TABLE_PAT_KEYを指定して作ったtableなら、
|
597
|
+
* longest common prefix searchを行い、対応するIDを返す。
|
598
|
+
**/
|
599
|
+
GRN_API grn_id grn_table_lcp_search(grn_ctx *ctx, grn_obj *table,
|
600
|
+
const void *key, unsigned key_size);
|
601
|
+
|
602
|
+
/**
|
603
|
+
* grn_table_get_key:
|
604
|
+
* @table: 対象table
|
605
|
+
* @id: 対象レコードのID
|
606
|
+
* @keybuf: keyを格納するバッファ(呼出側で準備する)
|
607
|
+
* @buf_size: keybufのサイズ(byte長)
|
608
|
+
*
|
609
|
+
* tableのIDに対応するレコードのkeyを取得する。対応するレコードが存在する場合はkey長を返す。
|
610
|
+
* 見つからない場合は0を返す。
|
611
|
+
* 対応するキーの検索に成功し、またbuf_sizeの長さがkey長以上であった場合は、
|
612
|
+
* keybufに該当するkeyをコピーする。
|
613
|
+
*
|
614
|
+
**/
|
615
|
+
GRN_API int grn_table_get_key(grn_ctx *ctx, grn_obj *table,
|
616
|
+
grn_id id, void *keybuf, int buf_size);
|
617
|
+
|
618
|
+
/**
|
619
|
+
* grn_table_delete:
|
620
|
+
* @table: 対象table
|
621
|
+
* @key: 検索key
|
622
|
+
* @key_size: 検索keyのサイズ
|
623
|
+
*
|
624
|
+
* tableのkeyに対応するレコードを削除する。
|
625
|
+
* 対応するレコードが存在しない場合はGRN_INVALID_ARGUMENTを返す。
|
626
|
+
**/
|
627
|
+
GRN_API grn_rc grn_table_delete(grn_ctx *ctx, grn_obj *table,
|
628
|
+
const void *key, unsigned key_size);
|
629
|
+
|
630
|
+
/**
|
631
|
+
* grn_table_delete_by_id:
|
632
|
+
* @table: 対象table
|
633
|
+
* @id: レコードID
|
634
|
+
*
|
635
|
+
* tableのkeyに対応するレコードを削除する。
|
636
|
+
* 対応するレコードが存在しない場合はGRN_INVALID_ARGUMENTを返す。
|
637
|
+
**/
|
638
|
+
GRN_API grn_rc grn_table_delete_by_id(grn_ctx *ctx, grn_obj *table, grn_id id);
|
639
|
+
|
640
|
+
/**
|
641
|
+
* grn_table_truncate:
|
642
|
+
* @table: 対象table
|
643
|
+
*
|
644
|
+
* tableの全レコードを一括して削除する。
|
645
|
+
* 注意: multithread環境では他のthreadのアクセスによって
|
646
|
+
* 存在しないアドレスへアクセスし、SIGSEGVが発生する可能性がある。
|
647
|
+
**/
|
648
|
+
GRN_API grn_rc grn_table_truncate(grn_ctx *ctx, grn_obj *table);
|
649
|
+
|
650
|
+
typedef grn_obj grn_table_cursor;
|
651
|
+
|
652
|
+
#define GRN_CURSOR_ASCENDING (0x00<<0)
|
653
|
+
#define GRN_CURSOR_DESCENDING (0x01<<0)
|
654
|
+
#define GRN_CURSOR_GE (0x00<<1)
|
655
|
+
#define GRN_CURSOR_GT (0x01<<1)
|
656
|
+
#define GRN_CURSOR_LE (0x00<<2)
|
657
|
+
#define GRN_CURSOR_LT (0x01<<2)
|
658
|
+
#define GRN_CURSOR_BY_KEY (0x00<<3)
|
659
|
+
#define GRN_CURSOR_BY_ID (0x01<<3)
|
660
|
+
#define GRN_CURSOR_PREFIX (0x01<<4)
|
661
|
+
|
662
|
+
/**
|
663
|
+
* grn_table_cursor_open:
|
664
|
+
* @table: 対象table
|
665
|
+
* @min: keyの下限 (NULLは下限なしと見なす)
|
666
|
+
* @min_size: @minのsize
|
667
|
+
* @max: keyの上限 (NULLは上限なしと見なす)
|
668
|
+
* @max_size: @maxのsize
|
669
|
+
* @flags: GRN_CURSOR_ASCENDINGを指定すると昇順にレコードを取り出す。
|
670
|
+
* GRN_CURSOR_DESCENDINGを指定すると降順にレコードを取り出す。
|
671
|
+
* GRN_CURSOR_GTを指定するとminに一致したkeyをcursorの範囲に含まない。
|
672
|
+
* GRN_CURSOR_LTを指定するとmaxに一致したkeyをcursorの範囲に含まない。
|
673
|
+
* GRN_CURSOR_BY_IDを指定するとID順にレコードを取り出す。
|
674
|
+
* GRN_OBJ_TABLE_PAT_KEYを指定したtableについては、
|
675
|
+
* GRN_CURSOR_BY_KEYを指定するとkey順にレコードを取り出す。
|
676
|
+
* (GRN_OBJ_TABLE_HASH_KEY,GRN_OBJ_TABLE_NO_KEYではGRN_CURSOR_BY_KEYは無視される)
|
677
|
+
* @offset: 該当する範囲のレコードのうち、(0ベースで)offset番目からレコードを取り出す。
|
678
|
+
* @limit: 該当する範囲のレコードのうち、limit件のみを取り出す。
|
679
|
+
* -1が指定された場合は、全件が指定されたものとみなす。
|
680
|
+
*
|
681
|
+
* tableに登録されているレコードを順番に取り出すためのカーソルを生成して返す。
|
682
|
+
**/
|
683
|
+
GRN_API grn_table_cursor *grn_table_cursor_open(grn_ctx *ctx, grn_obj *table,
|
684
|
+
const void *min, unsigned min_size,
|
685
|
+
const void *max, unsigned max_size,
|
686
|
+
int offset, int limit, int flags);
|
687
|
+
|
688
|
+
/**
|
689
|
+
* grn_table_cursor_close:
|
690
|
+
* @tc: 対象cursor
|
691
|
+
*
|
692
|
+
* grn_table_cursor_openで生成したcursorを解放する。
|
693
|
+
**/
|
694
|
+
GRN_API grn_rc grn_table_cursor_close(grn_ctx *ctx, grn_table_cursor *tc);
|
695
|
+
|
696
|
+
/**
|
697
|
+
* grn_table_cursor_next:
|
698
|
+
* @tc: 対象cursor
|
699
|
+
*
|
700
|
+
* cursorのカレントレコードを一件進めてそのIDを返す。
|
701
|
+
* cursorの対象範囲の末尾に達するとGRN_ID_NILを返す。
|
702
|
+
**/
|
703
|
+
GRN_API grn_id grn_table_cursor_next(grn_ctx *ctx, grn_table_cursor *tc);
|
704
|
+
|
705
|
+
/**
|
706
|
+
* grn_table_cursor_get_key:
|
707
|
+
* @tc: 対象cursor
|
708
|
+
* @key: カレントレコードのkeyへのポインタがセットされる。
|
709
|
+
* cursorのカレントレコードのkeyを@keyにセットし、その長さを返す。
|
710
|
+
**/
|
711
|
+
GRN_API int grn_table_cursor_get_key(grn_ctx *ctx, grn_table_cursor *tc, void **key);
|
712
|
+
|
713
|
+
/**
|
714
|
+
* grn_table_cursor_get_value:
|
715
|
+
* @tc: 対象cursor
|
716
|
+
* @value: カレントレコードのvalueへのポインタがセットされる。
|
717
|
+
* cursorのカレントレコードのvalueを@valueにセットし、その長さを返す。
|
718
|
+
**/
|
719
|
+
GRN_API int grn_table_cursor_get_value(grn_ctx *ctx, grn_table_cursor *tc, void **value);
|
720
|
+
|
721
|
+
/**
|
722
|
+
* grn_table_cursor_set_value:
|
723
|
+
* @tc: 対象cursor
|
724
|
+
* @value: 新しいvalueの値。
|
725
|
+
* @flags: grn_obj_set_valueのflagsと同様の値を指定できる。
|
726
|
+
*
|
727
|
+
* cursorのカレントレコードのvalueを引数の内容に置き換える。
|
728
|
+
* cursorのカレントレコードが存在しない場合はGRN_INVALID_ARGUMENTを返す。
|
729
|
+
**/
|
730
|
+
GRN_API grn_rc grn_table_cursor_set_value(grn_ctx *ctx, grn_table_cursor *tc,
|
731
|
+
void *value, int flags);
|
732
|
+
|
733
|
+
/**
|
734
|
+
* grn_table_cursor_delete:
|
735
|
+
* @tc: 対象cursor
|
736
|
+
*
|
737
|
+
* cursorのカレントレコードを削除する。
|
738
|
+
* cursorのカレントレコードが存在しない場合はGRN_INVALID_ARGUMENTを返す。
|
739
|
+
**/
|
740
|
+
GRN_API grn_rc grn_table_cursor_delete(grn_ctx *ctx, grn_table_cursor *tc);
|
741
|
+
|
742
|
+
/**
|
743
|
+
* grn_table_cursor_table:
|
744
|
+
* @tc: 対象cursor
|
745
|
+
*
|
746
|
+
* cursorが属するtableを返す。
|
747
|
+
**/
|
748
|
+
GRN_API grn_obj *grn_table_cursor_table(grn_ctx *ctx, grn_table_cursor *tc);
|
749
|
+
|
750
|
+
#define GRN_TABLE_EACH(ctx,table,head,tail,id,key,key_size,value,block) do {\
|
751
|
+
(ctx)->errlvl = GRN_LOG_NOTICE;\
|
752
|
+
(ctx)->rc = GRN_SUCCESS;\
|
753
|
+
if ((ctx)->seqno & 1) {\
|
754
|
+
(ctx)->subno++;\
|
755
|
+
} else {\
|
756
|
+
(ctx)->seqno++;\
|
757
|
+
}\
|
758
|
+
if (table) {\
|
759
|
+
switch ((table)->header.type) {\
|
760
|
+
case GRN_TABLE_PAT_KEY :\
|
761
|
+
GRN_PAT_EACH((ctx), (grn_pat *)(table), (id), (key), (key_size), (value), block);\
|
762
|
+
break;\
|
763
|
+
case GRN_TABLE_HASH_KEY :\
|
764
|
+
GRN_HASH_EACH((ctx), (grn_hash *)(table), (id), (key), (key_size), (value), block);\
|
765
|
+
break;\
|
766
|
+
case GRN_TABLE_NO_KEY :\
|
767
|
+
GRN_ARRAY_EACH((ctx), (grn_array *)(table), (head), (tail), (id), (value), block);\
|
768
|
+
break;\
|
769
|
+
}\
|
770
|
+
}\
|
771
|
+
if ((ctx)->subno) {\
|
772
|
+
(ctx)->subno--;\
|
773
|
+
} else {\
|
774
|
+
(ctx)->seqno++;\
|
775
|
+
}\
|
776
|
+
} while (0)
|
777
|
+
|
778
|
+
/**
|
779
|
+
* grn_table_sort:
|
780
|
+
* @table: 対象table
|
781
|
+
* @offset: sortされたレコードのうち、(0ベースで)offset番目から順にresにレコードを格納する
|
782
|
+
* @limit: resに格納するレコードの上限
|
783
|
+
* @result: 結果を格納するtable
|
784
|
+
* @keys: ソートキー配列へのポインタ
|
785
|
+
* @n_keys: ソートキー配列のサイズ
|
786
|
+
*
|
787
|
+
* table内のレコードをソートし、上位limit個の要素をresultに格納する。
|
788
|
+
* keys.keyには、tableのcolumn,accessor,procのいずれかが指定できる。
|
789
|
+
* keys.flagsには、GRN_TABLE_SORT_ASC/GRN_TABLE_SORT_DESCのいずれかを指定できる。
|
790
|
+
* GRN_TABLE_SORT_ASCでは昇順、GRN_TABLE_SORT_DESCでは降順でソートされる。
|
791
|
+
* keys.offsetは、内部利用のためのメンバである。
|
792
|
+
**/
|
793
|
+
|
794
|
+
typedef struct _grn_table_sort_key grn_table_sort_key;
|
795
|
+
typedef unsigned char grn_table_sort_flags;
|
796
|
+
|
797
|
+
#define GRN_TABLE_SORT_ASC (0x00<<0)
|
798
|
+
#define GRN_TABLE_SORT_DESC (0x01<<0)
|
799
|
+
|
800
|
+
struct _grn_table_sort_key {
|
801
|
+
grn_obj *key;
|
802
|
+
grn_table_sort_flags flags;
|
803
|
+
int offset;
|
804
|
+
};
|
805
|
+
|
806
|
+
GRN_API int grn_table_sort(grn_ctx *ctx, grn_obj *table, int offset, int limit,
|
807
|
+
grn_obj *result, grn_table_sort_key *keys, int n_keys);
|
808
|
+
|
809
|
+
/**
|
810
|
+
* grn_table_group:
|
811
|
+
* @table: 対象table
|
812
|
+
* @keys: group化キー構造体の配列へのポインタ
|
813
|
+
* @n_keys: group化キー構造体の配列のサイズ
|
814
|
+
* @results: group化の結果を格納する構造体の配列へのポインタ
|
815
|
+
* @n_results:group化の結果を格納する構造体の配列のサイズ
|
816
|
+
*
|
817
|
+
* tableのレコードを特定の条件でグループ化する
|
818
|
+
**/
|
819
|
+
|
820
|
+
typedef struct _grn_table_group_result grn_table_group_result;
|
821
|
+
typedef unsigned int grn_table_group_flags;
|
822
|
+
|
823
|
+
#define GRN_TABLE_GROUP_CALC_COUNT (0x01<<3)
|
824
|
+
#define GRN_TABLE_GROUP_CALC_MAX (0x01<<4)
|
825
|
+
#define GRN_TABLE_GROUP_CALC_MIN (0x01<<5)
|
826
|
+
#define GRN_TABLE_GROUP_CALC_SUM (0x01<<6)
|
827
|
+
#define GRN_TABLE_GROUP_CALC_AVG (0x01<<7)
|
828
|
+
|
829
|
+
typedef enum {
|
830
|
+
GRN_OP_PUSH = 0,
|
831
|
+
GRN_OP_POP,
|
832
|
+
GRN_OP_NOP,
|
833
|
+
GRN_OP_CALL,
|
834
|
+
GRN_OP_INTERN,
|
835
|
+
GRN_OP_GET_REF,
|
836
|
+
GRN_OP_GET_VALUE,
|
837
|
+
GRN_OP_AND,
|
838
|
+
GRN_OP_BUT,
|
839
|
+
GRN_OP_OR,
|
840
|
+
GRN_OP_ASSIGN,
|
841
|
+
GRN_OP_STAR_ASSIGN,
|
842
|
+
GRN_OP_SLASH_ASSIGN,
|
843
|
+
GRN_OP_MOD_ASSIGN,
|
844
|
+
GRN_OP_PLUS_ASSIGN,
|
845
|
+
GRN_OP_MINUS_ASSIGN,
|
846
|
+
GRN_OP_SHIFTL_ASSIGN,
|
847
|
+
GRN_OP_SHIFTR_ASSIGN,
|
848
|
+
GRN_OP_SHIFTRR_ASSIGN,
|
849
|
+
GRN_OP_AND_ASSIGN,
|
850
|
+
GRN_OP_XOR_ASSIGN,
|
851
|
+
GRN_OP_OR_ASSIGN,
|
852
|
+
GRN_OP_JUMP,
|
853
|
+
GRN_OP_CJUMP,
|
854
|
+
GRN_OP_COMMA,
|
855
|
+
GRN_OP_BITWISE_OR,
|
856
|
+
GRN_OP_BITWISE_XOR,
|
857
|
+
GRN_OP_BITWISE_AND,
|
858
|
+
GRN_OP_BITWISE_NOT,
|
859
|
+
GRN_OP_EQUAL,
|
860
|
+
GRN_OP_NOT_EQUAL,
|
861
|
+
GRN_OP_LESS,
|
862
|
+
GRN_OP_GREATER,
|
863
|
+
GRN_OP_LESS_EQUAL,
|
864
|
+
GRN_OP_GREATER_EQUAL,
|
865
|
+
GRN_OP_IN,
|
866
|
+
GRN_OP_MATCH,
|
867
|
+
GRN_OP_NEAR,
|
868
|
+
GRN_OP_NEAR2,
|
869
|
+
GRN_OP_SIMILAR,
|
870
|
+
GRN_OP_TERM_EXTRACT,
|
871
|
+
GRN_OP_SHIFTL,
|
872
|
+
GRN_OP_SHIFTR,
|
873
|
+
GRN_OP_SHIFTRR,
|
874
|
+
GRN_OP_PLUS,
|
875
|
+
GRN_OP_MINUS,
|
876
|
+
GRN_OP_STAR,
|
877
|
+
GRN_OP_SLASH,
|
878
|
+
GRN_OP_MOD,
|
879
|
+
GRN_OP_DELETE,
|
880
|
+
GRN_OP_INCR,
|
881
|
+
GRN_OP_DECR,
|
882
|
+
GRN_OP_INCR_POST,
|
883
|
+
GRN_OP_DECR_POST,
|
884
|
+
GRN_OP_NOT,
|
885
|
+
GRN_OP_ADJUST,
|
886
|
+
GRN_OP_EXACT,
|
887
|
+
GRN_OP_LCP,
|
888
|
+
GRN_OP_PARTIAL,
|
889
|
+
GRN_OP_UNSPLIT,
|
890
|
+
GRN_OP_PREFIX,
|
891
|
+
GRN_OP_SUFFIX,
|
892
|
+
GRN_OP_GEO_DISTANCE1,
|
893
|
+
GRN_OP_GEO_DISTANCE2,
|
894
|
+
GRN_OP_GEO_DISTANCE3,
|
895
|
+
GRN_OP_GEO_DISTANCE4,
|
896
|
+
GRN_OP_GEO_WITHINP5,
|
897
|
+
GRN_OP_GEO_WITHINP6,
|
898
|
+
GRN_OP_GEO_WITHINP8,
|
899
|
+
GRN_OP_OBJ_SEARCH,
|
900
|
+
GRN_OP_EXPR_GET_VAR,
|
901
|
+
GRN_OP_TABLE_CREATE,
|
902
|
+
GRN_OP_TABLE_SELECT,
|
903
|
+
GRN_OP_TABLE_SORT,
|
904
|
+
GRN_OP_TABLE_GROUP,
|
905
|
+
GRN_OP_JSON_PUT
|
906
|
+
} grn_operator;
|
907
|
+
|
908
|
+
struct _grn_table_group_result {
|
909
|
+
grn_obj *table;
|
910
|
+
unsigned char key_begin;
|
911
|
+
unsigned char key_end;
|
912
|
+
int limit;
|
913
|
+
grn_table_group_flags flags;
|
914
|
+
grn_operator op;
|
915
|
+
};
|
916
|
+
|
917
|
+
GRN_API grn_rc grn_table_group(grn_ctx *ctx, grn_obj *table,
|
918
|
+
grn_table_sort_key *keys, int n_keys,
|
919
|
+
grn_table_group_result *results, int n_results);
|
920
|
+
|
921
|
+
/**
|
922
|
+
* grn_table_setoperation:
|
923
|
+
* @table1: 対象table1
|
924
|
+
* @table2: 対象table2
|
925
|
+
* @res: 結果を格納するtable
|
926
|
+
* @op: 実行する演算の種類
|
927
|
+
*
|
928
|
+
* table1とtable2をopの指定に従って集合演算した結果をresに格納する。
|
929
|
+
* resにtable1あるいはtable2そのものを指定した場合を除けば、table1, table2は破壊されない。
|
930
|
+
**/
|
931
|
+
GRN_API grn_rc grn_table_setoperation(grn_ctx *ctx, grn_obj *table1, grn_obj *table2,
|
932
|
+
grn_obj *res, grn_operator op);
|
933
|
+
|
934
|
+
/**
|
935
|
+
* grn_table_difference:
|
936
|
+
* @table1: 対象table1
|
937
|
+
* @table2: 対象table2
|
938
|
+
* @res1: 結果を格納するtable
|
939
|
+
* @res2: 結果を格納するtable
|
940
|
+
*
|
941
|
+
* table1とtable2から重複するレコードを取り除いた結果をそれぞれres1, res2に格納する。
|
942
|
+
**/
|
943
|
+
GRN_API grn_rc grn_table_difference(grn_ctx *ctx, grn_obj *table1, grn_obj *table2,
|
944
|
+
grn_obj *res1, grn_obj *res2);
|
945
|
+
|
946
|
+
/**
|
947
|
+
* grn_table_columns:
|
948
|
+
* @table: 対象table
|
949
|
+
* @name: 取得したいカラム名のprefix
|
950
|
+
* @name_size: @nameの長さ
|
951
|
+
* @res: 結果を格納するGRN_TABLE_HASH_KEYのtable
|
952
|
+
*
|
953
|
+
* @nameから始まるtableのカラムIDを@resに格納する。
|
954
|
+
* @name_sizeが0の場合はすべてのカラムIDを格納する。格納した
|
955
|
+
* カラムIDの数を返す。
|
956
|
+
**/
|
957
|
+
GRN_API int grn_table_columns(grn_ctx *ctx, grn_obj *table,
|
958
|
+
const char *name, unsigned name_size,
|
959
|
+
grn_obj *res);
|
960
|
+
|
961
|
+
/**
|
962
|
+
* grn_obj_column:
|
963
|
+
* @table: 対象table
|
964
|
+
* @name: カラム名
|
965
|
+
*
|
966
|
+
* nameがカラム名の場合、それに対応するtableのカラムを返す。
|
967
|
+
* 対応するカラムが存在しなければNULLを返す。
|
968
|
+
* nameはアクセサ文字列の場合、それに対応するaccessorを返す。
|
969
|
+
* アクセサ文字列とは、カラム名等を'.'で連結した文字列である。
|
970
|
+
* '_id', '_key'は特殊なアクセサで、それぞれレコードID/keyを返す。
|
971
|
+
* 例) 'col1' / 'col2.col3' / 'col2._id'
|
972
|
+
**/
|
973
|
+
GRN_API grn_obj *grn_obj_column(grn_ctx *ctx, grn_obj *table,
|
974
|
+
const char *name, unsigned name_size);
|
975
|
+
|
976
|
+
|
977
|
+
/**
|
978
|
+
* grn_table_size:
|
979
|
+
* @table: 対象table
|
980
|
+
*
|
981
|
+
* tableに登録されているレコードの件数を返す。
|
982
|
+
**/
|
983
|
+
GRN_API unsigned int grn_table_size(grn_ctx *ctx, grn_obj *table);
|
984
|
+
|
985
|
+
/*-------------------------------------------------------------
|
986
|
+
* column操作のための関数
|
987
|
+
*/
|
988
|
+
|
989
|
+
/**
|
990
|
+
* grn_column_create:
|
991
|
+
* @table: 対象table
|
992
|
+
* @name: カラム名
|
993
|
+
* @name_size: @nameのsize(byte)
|
994
|
+
* @path: カラムを格納するファイルパス。
|
995
|
+
* flagsにGRN_OBJ_PERSISTENTが指定されている場合のみ有効。
|
996
|
+
* NULLなら自動的にファイルパスが付与される。
|
997
|
+
* @flags: GRN_OBJ_PERSISTENTを指定すると永続columnとなる。
|
998
|
+
* GRN_OBJ_COLUMN_INDEXを指定すると転置インデックスとなる。
|
999
|
+
* GRN_OBJ_COLUMN_SCALARを指定するとスカラ値(単独の値)を格納する。
|
1000
|
+
* GRN_OBJ_COLUMN_VECTORを指定すると値の配列を格納する。
|
1001
|
+
* GRN_OBJ_COMPRESS_ZLIBを指定すると値をzlib圧縮して格納する。
|
1002
|
+
* GRN_OBJ_COMPRESS_LZOを指定すると値をlzo圧縮して格納する。
|
1003
|
+
* GRN_OBJ_COLUMN_INDEXと共にGRN_OBJ_WITH_SECTIONを指定すると、
|
1004
|
+
* 転置索引にsection(段落情報)を合わせて格納する。
|
1005
|
+
* GRN_OBJ_COLUMN_INDEXと共にGRN_OBJ_WITH_WEIGHTを指定すると、
|
1006
|
+
* 転置索引にweight情報を合わせて格納する。
|
1007
|
+
* GRN_OBJ_COLUMN_INDEXと共にGRN_OBJ_WITH_POSITIONを指定すると、
|
1008
|
+
* 転置索引に出現位置情報を合わせて格納する。
|
1009
|
+
* @type: カラム値の型。定義済みのtypeあるいはtableを指定できる。
|
1010
|
+
*
|
1011
|
+
* tableに新たなカラムを定義する。nameは省略できない。
|
1012
|
+
* 一つのtableに同一のnameのcolumnを複数定義することはできない。
|
1013
|
+
**/
|
1014
|
+
GRN_API grn_obj *grn_column_create(grn_ctx *ctx, grn_obj *table,
|
1015
|
+
const char *name, unsigned name_size,
|
1016
|
+
const char *path, grn_obj_flags flags, grn_obj *type);
|
1017
|
+
|
1018
|
+
#define GRN_COLUMN_OPEN_OR_CREATE(ctx,table,name,name_size,path,flags,type,column) \
|
1019
|
+
(((column) = grn_obj_column((ctx), (table), (name), (name_size))) ||\
|
1020
|
+
((column) = grn_column_create((ctx), (table), (name), (name_size), (path), (flags), (type))))
|
1021
|
+
|
1022
|
+
/**
|
1023
|
+
* grn_column_index_update
|
1024
|
+
* @column: 対象column
|
1025
|
+
* @id: 対象レコードのID
|
1026
|
+
* @section: 対象レコードのセクション番号
|
1027
|
+
* @oldvalue: 更新前の値
|
1028
|
+
* @newvalue: 更新後の値
|
1029
|
+
*
|
1030
|
+
* oldvalue, newvalueの値から得られるキーに対応するcolumnの値の中の、
|
1031
|
+
* id, sectionに対応するエントリを更新する。
|
1032
|
+
* columnはGRN_OBJ_COLUMN_INDEX型のカラムでなければならない。
|
1033
|
+
**/
|
1034
|
+
GRN_API grn_rc grn_column_index_update(grn_ctx *ctx, grn_obj *column,
|
1035
|
+
grn_id id, unsigned int section,
|
1036
|
+
grn_obj *oldvalue, grn_obj *newvalue);
|
1037
|
+
|
1038
|
+
/**
|
1039
|
+
* grn_column_table:
|
1040
|
+
* @column: 対象column
|
1041
|
+
*
|
1042
|
+
* columnが属するtableを返す。
|
1043
|
+
**/
|
1044
|
+
GRN_API grn_obj *grn_column_table(grn_ctx *ctx, grn_obj *column);
|
1045
|
+
|
1046
|
+
/*-------------------------------------------------------------
|
1047
|
+
* db, table, columnの全てまたは幾つかで共通に使用できる関数
|
1048
|
+
*/
|
1049
|
+
|
1050
|
+
typedef enum {
|
1051
|
+
GRN_INFO_ENCODING = 0,
|
1052
|
+
GRN_INFO_SOURCE,
|
1053
|
+
GRN_INFO_DEFAULT_TOKENIZER,
|
1054
|
+
GRN_INFO_ELEMENT_SIZE,
|
1055
|
+
GRN_INFO_CURR_MAX,
|
1056
|
+
GRN_INFO_MAX_ELEMENT_SIZE,
|
1057
|
+
GRN_INFO_SEG_SIZE,
|
1058
|
+
GRN_INFO_CHUNK_SIZE,
|
1059
|
+
GRN_INFO_MAX_SECTION,
|
1060
|
+
GRN_INFO_HOOK_LOCAL_DATA,
|
1061
|
+
GRN_INFO_ELEMENT_A,
|
1062
|
+
GRN_INFO_ELEMENT_CHUNK,
|
1063
|
+
GRN_INFO_ELEMENT_CHUNK_SIZE,
|
1064
|
+
GRN_INFO_ELEMENT_BUFFER_FREE,
|
1065
|
+
GRN_INFO_ELEMENT_NTERMS,
|
1066
|
+
GRN_INFO_ELEMENT_NTERMS_VOID,
|
1067
|
+
GRN_INFO_ELEMENT_SIZE_IN_CHUNK,
|
1068
|
+
GRN_INFO_ELEMENT_POS_IN_CHUNK,
|
1069
|
+
GRN_INFO_ELEMENT_SIZE_IN_BUFFER,
|
1070
|
+
GRN_INFO_ELEMENT_POS_IN_BUFFER,
|
1071
|
+
GRN_INFO_ELEMENT_ESTIMATE_SIZE,
|
1072
|
+
GRN_INFO_NGRAM_UNIT_SIZE,
|
1073
|
+
/*
|
1074
|
+
GRN_INFO_VERSION,
|
1075
|
+
GRN_INFO_CONFIGURE_OPTIONS,
|
1076
|
+
GRN_INFO_CONFIG_PATH,
|
1077
|
+
*/
|
1078
|
+
GRN_INFO_PARTIAL_MATCH_THRESHOLD,
|
1079
|
+
GRN_INFO_II_SPLIT_THRESHOLD
|
1080
|
+
} grn_info_type;
|
1081
|
+
|
1082
|
+
/**
|
1083
|
+
* grn_obj_get_info:
|
1084
|
+
* @obj: 対象obj
|
1085
|
+
* @type: 取得する情報の種類
|
1086
|
+
* @valuebuf: 値を格納するバッファ(呼出側で準備)
|
1087
|
+
*
|
1088
|
+
* objのtypeに対応する情報をvaluebufに格納する。
|
1089
|
+
**/
|
1090
|
+
GRN_API grn_obj *grn_obj_get_info(grn_ctx *ctx, grn_obj *obj, grn_info_type type, grn_obj *valuebuf);
|
1091
|
+
|
1092
|
+
/**
|
1093
|
+
* grn_obj_set_info:
|
1094
|
+
* @obj: 対象obj
|
1095
|
+
* @type: 設定する情報の種類
|
1096
|
+
* @value: 設定しようとする値
|
1097
|
+
*
|
1098
|
+
* objのtypeに対応する情報をvalueの内容に更新する。
|
1099
|
+
**/
|
1100
|
+
GRN_API grn_rc grn_obj_set_info(grn_ctx *ctx, grn_obj *obj, grn_info_type type, grn_obj *value);
|
1101
|
+
|
1102
|
+
/**
|
1103
|
+
* grn_obj_get_element_info:
|
1104
|
+
* @obj: 対象obj
|
1105
|
+
* @id: 対象ID
|
1106
|
+
* @type: 取得する情報の種類
|
1107
|
+
* @value: 値を格納するバッファ(呼出側で準備)
|
1108
|
+
*
|
1109
|
+
* objのidに対応するレコードの、typeに対応する情報をvaluebufに格納する。
|
1110
|
+
* 呼出側ではtypeに応じて十分なサイズのバッファを確保しなければならない。
|
1111
|
+
**/
|
1112
|
+
GRN_API grn_obj *grn_obj_get_element_info(grn_ctx *ctx, grn_obj *obj, grn_id id,
|
1113
|
+
grn_info_type type, grn_obj *value);
|
1114
|
+
|
1115
|
+
/**
|
1116
|
+
* grn_obj_set_element_info:
|
1117
|
+
* @obj: 対象object
|
1118
|
+
* @id: 対象ID
|
1119
|
+
* @type: 設定する情報の種類
|
1120
|
+
* @value: 設定しようとする値
|
1121
|
+
*
|
1122
|
+
* objのidに対応するレコードのtypeに対応する情報をvalueの内容に更新する。
|
1123
|
+
**/
|
1124
|
+
GRN_API grn_rc grn_obj_set_element_info(grn_ctx *ctx, grn_obj *obj, grn_id id,
|
1125
|
+
grn_info_type type, grn_obj *value);
|
1126
|
+
|
1127
|
+
|
1128
|
+
/**
|
1129
|
+
* grn_obj_get_value:
|
1130
|
+
* @obj: 対象object
|
1131
|
+
* @id: 対象レコードのID
|
1132
|
+
* @value: 値を格納するバッファ(呼出側で準備する)
|
1133
|
+
*
|
1134
|
+
* objのIDに対応するレコードのvalueを取得する。
|
1135
|
+
* valueを戻り値として返す。
|
1136
|
+
**/
|
1137
|
+
GRN_API grn_obj *grn_obj_get_value(grn_ctx *ctx, grn_obj *obj, grn_id id, grn_obj *value);
|
1138
|
+
|
1139
|
+
/**
|
1140
|
+
* grn_obj_set_value:
|
1141
|
+
* @obj: 対象object
|
1142
|
+
* @id: 対象レコードのID
|
1143
|
+
* @value: 格納する値
|
1144
|
+
* @flags: 以下の値を指定できる
|
1145
|
+
* GRN_OBJ_SET: レコードの値をvalueと置き換える。
|
1146
|
+
* GRN_OBJ_INCR: レコードの値にvalueを加算する。
|
1147
|
+
* GRN_OBJ_DECR: レコードの値にvalueを減算する。
|
1148
|
+
* GRN_OBJ_APPEND: レコードの値の末尾にvalueを追加する。
|
1149
|
+
* GRN_OBJ_PREPEND: レコードの値の先頭にvalueを追加する。
|
1150
|
+
* GRN_OBJ_GET: 新しいレコードの値をvalueにセットする。
|
1151
|
+
* GRN_OBJ_COMPARE: レコードの値とvalueが等しいか調べる。
|
1152
|
+
* GRN_OBJ_LOCK: 当該レコードをロックする。GRN_OBJ_COMPAREと共に指定された場合は、
|
1153
|
+
* レコードの値とvalueが等しい場合に限ってロックする。
|
1154
|
+
* GRN_OBJ_UNLOCK: 当該レコードのロックを解除する。
|
1155
|
+
*
|
1156
|
+
* objのIDに対応するレコードの値を更新する。
|
1157
|
+
* 対応するレコードが存在しない場合はGRN_INVALID_ARGUMENTを返す。
|
1158
|
+
**/
|
1159
|
+
|
1160
|
+
#define GRN_OBJ_SET_MASK (0x07)
|
1161
|
+
#define GRN_OBJ_SET (0x01)
|
1162
|
+
#define GRN_OBJ_INCR (0x02)
|
1163
|
+
#define GRN_OBJ_DECR (0x03)
|
1164
|
+
#define GRN_OBJ_APPEND (0x04)
|
1165
|
+
#define GRN_OBJ_PREPEND (0x05)
|
1166
|
+
#define GRN_OBJ_GET (0x01<<4)
|
1167
|
+
#define GRN_OBJ_COMPARE (0x01<<5)
|
1168
|
+
#define GRN_OBJ_LOCK (0x01<<6)
|
1169
|
+
#define GRN_OBJ_UNLOCK (0x01<<7)
|
1170
|
+
|
1171
|
+
GRN_API grn_rc grn_obj_set_value(grn_ctx *ctx, grn_obj *obj, grn_id id, grn_obj *value, int flags);
|
1172
|
+
|
1173
|
+
/**
|
1174
|
+
* grn_obj_remove:
|
1175
|
+
* @obj: 対象object
|
1176
|
+
*
|
1177
|
+
* objをメモリから解放し、それが永続オブジェクトであった場合は、
|
1178
|
+
* 該当するファイル一式を削除する。
|
1179
|
+
**/
|
1180
|
+
GRN_API grn_rc grn_obj_remove(grn_ctx *ctx, grn_obj *obj);
|
1181
|
+
|
1182
|
+
/**
|
1183
|
+
* grn_obj_close:
|
1184
|
+
* @obj: 対象object
|
1185
|
+
*
|
1186
|
+
* 一時的なobjectであるobjをメモリから解放する。
|
1187
|
+
* objに属するobjectも再帰的にメモリから解放される。
|
1188
|
+
* 永続的な、table・column・exprなどは解放してはならない。
|
1189
|
+
* 一般的には、一時的か永続的かを気にしなくてよいgrn_obj_unlinkを用いるべき。
|
1190
|
+
**/
|
1191
|
+
GRN_API grn_rc grn_obj_close(grn_ctx *ctx, grn_obj *obj);
|
1192
|
+
|
1193
|
+
/**
|
1194
|
+
* grn_obj_reinit:
|
1195
|
+
* @obj: 対象object
|
1196
|
+
* @domain: 変更後のobjの型
|
1197
|
+
* @flags: GRN_OBJ_VECTORを指定するとdomain型の値のベクタを格納するオブジェクトになる。
|
1198
|
+
*
|
1199
|
+
* objの型を変更する。objはGRN_OBJ_INITマクロなどで初期化済みでなければならない。
|
1200
|
+
**/
|
1201
|
+
GRN_API grn_rc grn_obj_reinit(grn_ctx *ctx, grn_obj *obj, grn_id domain, unsigned char flags);
|
1202
|
+
|
1203
|
+
/**
|
1204
|
+
* grn_obj_unlink:
|
1205
|
+
* @obj: 対象object
|
1206
|
+
*
|
1207
|
+
* objをメモリから解放する。
|
1208
|
+
* objに属するobjectも再帰的にメモリから解放される。
|
1209
|
+
**/
|
1210
|
+
GRN_API void grn_obj_unlink(grn_ctx *ctx, grn_obj *obj);
|
1211
|
+
|
1212
|
+
/**
|
1213
|
+
* grn_obj_user_data
|
1214
|
+
* @obj: 対象object
|
1215
|
+
*
|
1216
|
+
* objectに登録できるユーザデータへのポインタを返す。table, column, proc, exprのみ使用可能。
|
1217
|
+
**/
|
1218
|
+
GRN_API grn_user_data *grn_obj_user_data(grn_ctx *ctx, grn_obj *obj);
|
1219
|
+
|
1220
|
+
/**
|
1221
|
+
* grn_obj_set_finalizer
|
1222
|
+
* @obj: 対象object
|
1223
|
+
* @func: objectを破棄するときに呼ばれる関数
|
1224
|
+
*
|
1225
|
+
* objectを破棄するときに呼ばれる関数を設定する。table, column, proc, exprのみ設定可能。
|
1226
|
+
**/
|
1227
|
+
GRN_API grn_rc grn_obj_set_finalizer(grn_ctx *ctx, grn_obj *obj, grn_proc_func *func);
|
1228
|
+
|
1229
|
+
/**
|
1230
|
+
* grn_obj_path:
|
1231
|
+
* @obj: 対象object
|
1232
|
+
*
|
1233
|
+
* objに対応するファイルパスを返す。一時objectならNULLを返す。
|
1234
|
+
**/
|
1235
|
+
GRN_API const char *grn_obj_path(grn_ctx *ctx, grn_obj *obj);
|
1236
|
+
|
1237
|
+
/**
|
1238
|
+
* grn_obj_name:
|
1239
|
+
* @obj: 対象object
|
1240
|
+
* @namebuf: 名前を格納するバッファ(呼出側で準備する)
|
1241
|
+
* @buf_size: namebufのサイズ(byte長)
|
1242
|
+
*
|
1243
|
+
* objの名前の長さを返す。無名objectなら0を返す。
|
1244
|
+
* 名前付きのobjectであり、buf_sizeの長さが名前の長以上であった場合は、
|
1245
|
+
* namebufに該当する名前をコピーする。
|
1246
|
+
**/
|
1247
|
+
GRN_API int grn_obj_name(grn_ctx *ctx, grn_obj *obj, char *namebuf, int buf_size);
|
1248
|
+
|
1249
|
+
/**
|
1250
|
+
* grn_column_name:
|
1251
|
+
* @obj: 対象object
|
1252
|
+
* @namebuf: 名前を格納するバッファ(呼出側で準備する)
|
1253
|
+
* @buf_size: namebufのサイズ(byte長)
|
1254
|
+
*
|
1255
|
+
* カラムobjの名前の長さを返す。
|
1256
|
+
* buf_sizeの長さが名前の長以上であった場合は、
|
1257
|
+
* namebufに該当する名前をコピーする。
|
1258
|
+
**/
|
1259
|
+
GRN_API int grn_column_name(grn_ctx *ctx, grn_obj *obj, char *namebuf, int buf_size);
|
1260
|
+
|
1261
|
+
/**
|
1262
|
+
* grn_obj_get_range:
|
1263
|
+
* @obj: 対象object
|
1264
|
+
*
|
1265
|
+
* @objのとる値の範囲を表わしているオブジェクトのIDを返す。
|
1266
|
+
* 例えば、grn_builtin_typeにあるGRN_DB_INTなどを返す。
|
1267
|
+
**/
|
1268
|
+
GRN_API grn_id grn_obj_get_range(grn_ctx *ctx, grn_obj *obj);
|
1269
|
+
|
1270
|
+
#define GRN_OBJ_GET_DOMAIN(obj) \
|
1271
|
+
((obj)->header.type == GRN_TABLE_NO_KEY ? GRN_ID_NIL : (obj)->header.domain)
|
1272
|
+
|
1273
|
+
/**
|
1274
|
+
* grn_obj_expire:
|
1275
|
+
* @obj: 対象object
|
1276
|
+
*
|
1277
|
+
* objの占有するメモリのうち、可能な領域をthresholdを指標として解放する。
|
1278
|
+
**/
|
1279
|
+
GRN_API int grn_obj_expire(grn_ctx *ctx, grn_obj *obj, int threshold);
|
1280
|
+
|
1281
|
+
/**
|
1282
|
+
* grn_obj_check:
|
1283
|
+
* @obj: 対象object
|
1284
|
+
*
|
1285
|
+
* objに対応するファイルの整合性を検査する。
|
1286
|
+
**/
|
1287
|
+
GRN_API int grn_obj_check(grn_ctx *ctx, grn_obj *obj);
|
1288
|
+
|
1289
|
+
/**
|
1290
|
+
* grn_obj_lock:
|
1291
|
+
* @obj: 対象object
|
1292
|
+
*
|
1293
|
+
* objをlockする。timeout(秒)経過してもlockを取得できない場合は
|
1294
|
+
* GRN_RESOURCE_DEADLOCK_AVOIDEDを返す。
|
1295
|
+
**/
|
1296
|
+
GRN_API grn_rc grn_obj_lock(grn_ctx *ctx, grn_obj *obj, grn_id id, int timeout);
|
1297
|
+
|
1298
|
+
/**
|
1299
|
+
* grn_obj_unlock:
|
1300
|
+
* @obj: 対象object
|
1301
|
+
*
|
1302
|
+
* objをunlockする。
|
1303
|
+
**/
|
1304
|
+
GRN_API grn_rc grn_obj_unlock(grn_ctx *ctx, grn_obj *obj, grn_id id);
|
1305
|
+
|
1306
|
+
/**
|
1307
|
+
* grn_obj_clear_lock:
|
1308
|
+
* @obj: 対象object
|
1309
|
+
*
|
1310
|
+
* 強制的にロックをクリアする。
|
1311
|
+
**/
|
1312
|
+
GRN_API grn_rc grn_obj_clear_lock(grn_ctx *ctx, grn_obj *obj);
|
1313
|
+
|
1314
|
+
/**
|
1315
|
+
* grn_obj_is_locked;
|
1316
|
+
* @obj: 対象object
|
1317
|
+
*
|
1318
|
+
* objが現在lockされていれば0以外の値を返す。
|
1319
|
+
**/
|
1320
|
+
GRN_API unsigned int grn_obj_is_locked(grn_ctx *ctx, grn_obj *obj);
|
1321
|
+
|
1322
|
+
/**
|
1323
|
+
* grn_obj_db:
|
1324
|
+
* @obj: 対象object
|
1325
|
+
*
|
1326
|
+
* objの属するdbを返す。
|
1327
|
+
**/
|
1328
|
+
GRN_API grn_obj *grn_obj_db(grn_ctx *ctx, grn_obj *obj);
|
1329
|
+
|
1330
|
+
/**
|
1331
|
+
* grn_obj_id:
|
1332
|
+
* @obj: 対象object
|
1333
|
+
*
|
1334
|
+
* objのidを返す。
|
1335
|
+
**/
|
1336
|
+
GRN_API grn_id grn_obj_id(grn_ctx *ctx, grn_obj *obj);
|
1337
|
+
|
1338
|
+
|
1339
|
+
/**
|
1340
|
+
* grn_obj_search:
|
1341
|
+
* @obj: 検索対象のobject
|
1342
|
+
* @query: 検索クエリ
|
1343
|
+
* @res: 検索結果を格納するテーブル
|
1344
|
+
* @op: GRN_OP_OR, GRN_OP_AND, GRN_OP_BUT, GRN_OP_ADJUSTのいずれかを指定する
|
1345
|
+
* @optarg: 詳細検索条件
|
1346
|
+
*
|
1347
|
+
* objを対象としてqueryにマッチするレコードを検索し、
|
1348
|
+
* opの指定に従ってresにレコードを追加あるいは削除する。
|
1349
|
+
**/
|
1350
|
+
|
1351
|
+
typedef struct _grn_search_optarg grn_search_optarg;
|
1352
|
+
|
1353
|
+
struct _grn_search_optarg {
|
1354
|
+
grn_operator mode;
|
1355
|
+
int similarity_threshold;
|
1356
|
+
int max_interval;
|
1357
|
+
int *weight_vector;
|
1358
|
+
int vector_size;
|
1359
|
+
grn_obj *proc;
|
1360
|
+
int max_size;
|
1361
|
+
};
|
1362
|
+
|
1363
|
+
GRN_API grn_rc grn_obj_search(grn_ctx *ctx, grn_obj *obj, grn_obj *query,
|
1364
|
+
grn_obj *res, grn_operator op, grn_search_optarg *optarg);
|
1365
|
+
|
1366
|
+
/*-------------------------------------------------------------
|
1367
|
+
* grn_vector
|
1368
|
+
*/
|
1369
|
+
|
1370
|
+
GRN_API unsigned int grn_vector_size(grn_ctx *ctx, grn_obj *vector);
|
1371
|
+
|
1372
|
+
GRN_API grn_rc grn_vector_add_element(grn_ctx *ctx, grn_obj *vector,
|
1373
|
+
const char *str, unsigned int str_len,
|
1374
|
+
unsigned int weight, grn_id domain);
|
1375
|
+
|
1376
|
+
GRN_API unsigned int grn_vector_get_element(grn_ctx *ctx, grn_obj *vector,
|
1377
|
+
unsigned int offset, const char **str,
|
1378
|
+
unsigned int *weight, grn_id *domain);
|
1379
|
+
|
1380
|
+
/*-------------------------------------------------------------
|
1381
|
+
* hook操作のための関数
|
1382
|
+
*/
|
1383
|
+
|
1384
|
+
GRN_API int grn_proc_call_next(grn_ctx *ctx, grn_obj *exec_info, grn_obj *in, grn_obj *out);
|
1385
|
+
GRN_API void *grn_proc_get_ctx_local_data(grn_ctx *ctx, grn_obj *exec_info);
|
1386
|
+
GRN_API void *grn_proc_get_hook_local_data(grn_ctx *ctx, grn_obj *exec_info);
|
1387
|
+
|
1388
|
+
typedef enum {
|
1389
|
+
GRN_HOOK_SET = 0,
|
1390
|
+
GRN_HOOK_GET,
|
1391
|
+
GRN_HOOK_INSERT,
|
1392
|
+
GRN_HOOK_DELETE,
|
1393
|
+
GRN_HOOK_SELECT
|
1394
|
+
} grn_hook_entry;
|
1395
|
+
|
1396
|
+
/**
|
1397
|
+
* grn_obj_add_hook:
|
1398
|
+
* @obj: 対象object
|
1399
|
+
* @entry: GRN_HOOK_GETは、objectの参照時に呼び出されるhookを定義する。
|
1400
|
+
GRN_HOOK_SETは、objectの更新時に呼び出されるhookを定義する。
|
1401
|
+
GRN_HOOK_SELECTは、検索処理の実行中に適時呼び出され、
|
1402
|
+
処理の実行状況を調べたり、実行の中断を指示することができる。
|
1403
|
+
* @offset: hookの実行順位。offsetに対応するhookの直前に新たなhookを挿入する。
|
1404
|
+
0を指定した場合は先頭に挿入される。-1を指定した場合は末尾に挿入される。
|
1405
|
+
objectに複数のhookが定義されている場合は順位の順に呼び出される。
|
1406
|
+
* @proc: 手続き
|
1407
|
+
* @data: hook固有情報
|
1408
|
+
*
|
1409
|
+
* objに対してhookを追加する。
|
1410
|
+
**/
|
1411
|
+
GRN_API grn_rc grn_obj_add_hook(grn_ctx *ctx, grn_obj *obj, grn_hook_entry entry,
|
1412
|
+
int offset, grn_obj *proc, grn_obj *data);
|
1413
|
+
|
1414
|
+
/**
|
1415
|
+
* grn_obj_get_nhooks:
|
1416
|
+
* @obj: 対象object
|
1417
|
+
* @entry: hookタイプ
|
1418
|
+
*
|
1419
|
+
* objに定義されているhookの数を返す。
|
1420
|
+
**/
|
1421
|
+
GRN_API int grn_obj_get_nhooks(grn_ctx *ctx, grn_obj *obj, grn_hook_entry entry);
|
1422
|
+
|
1423
|
+
/**
|
1424
|
+
* grn_obj_get_hook:
|
1425
|
+
* @obj: 対象object
|
1426
|
+
* @entry: hookタイプ
|
1427
|
+
* @offset: 実行順位
|
1428
|
+
* @data: hook固有情報格納バッファ
|
1429
|
+
*
|
1430
|
+
* objに定義されているhookの手続き(proc)を返す。hook固有情報が定義されている場合は、
|
1431
|
+
* その内容をdataにコピーして返す。
|
1432
|
+
**/
|
1433
|
+
GRN_API grn_obj *grn_obj_get_hook(grn_ctx *ctx, grn_obj *obj, grn_hook_entry entry,
|
1434
|
+
int offset, grn_obj *data);
|
1435
|
+
|
1436
|
+
/**
|
1437
|
+
* grn_obj_delete_hook:
|
1438
|
+
* @obj: 対象object
|
1439
|
+
* @entry: hookタイプ
|
1440
|
+
* @offset: 実行順位
|
1441
|
+
*
|
1442
|
+
* objに定義されているhookを削除する。
|
1443
|
+
**/
|
1444
|
+
GRN_API grn_rc grn_obj_delete_hook(grn_ctx *ctx, grn_obj *obj, grn_hook_entry entry, int offset);
|
1445
|
+
|
1446
|
+
GRN_API grn_obj *grn_obj_open(grn_ctx *ctx, unsigned char type, grn_obj_flags flags, grn_id domain);
|
1447
|
+
|
1448
|
+
/**
|
1449
|
+
* grn_column_index:
|
1450
|
+
* @column: 対象のcolumn
|
1451
|
+
* @op: indexで実行したい操作
|
1452
|
+
* @indexbuf: indexを格納するバッファ(呼出側で準備する)
|
1453
|
+
* @buf_size: namebufのサイズ(byte長)
|
1454
|
+
* @section: section番号を格納するint長バッファ(呼出側で準備する)
|
1455
|
+
*
|
1456
|
+
* columnに張られているindexのうち、opの操作を実行可能なものの数を返す。
|
1457
|
+
* またそれらのidを、buf_sizeに指定された個数を上限としてindexbufに返す。
|
1458
|
+
**/
|
1459
|
+
GRN_API int grn_column_index(grn_ctx *ctx, grn_obj *column, grn_operator op,
|
1460
|
+
grn_obj **indexbuf, int buf_size, int *section);
|
1461
|
+
|
1462
|
+
/* query & snippet */
|
1463
|
+
|
1464
|
+
#ifndef GRN_QUERY_AND
|
1465
|
+
#define GRN_QUERY_AND '+'
|
1466
|
+
#endif /* GRN_QUERY_AND */
|
1467
|
+
#ifndef GRN_QUERY_BUT
|
1468
|
+
#define GRN_QUERY_BUT '-'
|
1469
|
+
#endif /* GRN_QUERY_BUT */
|
1470
|
+
#ifndef GRN_QUERY_ADJ_INC
|
1471
|
+
#define GRN_QUERY_ADJ_INC '>'
|
1472
|
+
#endif /* GRN_QUERY_ADJ_POS2 */
|
1473
|
+
#ifndef GRN_QUERY_ADJ_DEC
|
1474
|
+
#define GRN_QUERY_ADJ_DEC '<'
|
1475
|
+
#endif /* GRN_QUERY_ADJ_POS1 */
|
1476
|
+
#ifndef GRN_QUERY_ADJ_NEG
|
1477
|
+
#define GRN_QUERY_ADJ_NEG '~'
|
1478
|
+
#endif /* GRN_QUERY_ADJ_NEG */
|
1479
|
+
#ifndef GRN_QUERY_PREFIX
|
1480
|
+
#define GRN_QUERY_PREFIX '*'
|
1481
|
+
#endif /* GRN_QUERY_PREFIX */
|
1482
|
+
#ifndef GRN_QUERY_PARENL
|
1483
|
+
#define GRN_QUERY_PARENL '('
|
1484
|
+
#endif /* GRN_QUERY_PARENL */
|
1485
|
+
#ifndef GRN_QUERY_PARENR
|
1486
|
+
#define GRN_QUERY_PARENR ')'
|
1487
|
+
#endif /* GRN_QUERY_PARENR */
|
1488
|
+
#ifndef GRN_QUERY_QUOTEL
|
1489
|
+
#define GRN_QUERY_QUOTEL '"'
|
1490
|
+
#endif /* GRN_QUERY_QUOTEL */
|
1491
|
+
#ifndef GRN_QUERY_QUOTER
|
1492
|
+
#define GRN_QUERY_QUOTER '"'
|
1493
|
+
#endif /* GRN_QUERY_QUOTER */
|
1494
|
+
#ifndef GRN_QUERY_ESCAPE
|
1495
|
+
#define GRN_QUERY_ESCAPE '\\'
|
1496
|
+
#endif /* GRN_QUERY_ESCAPE */
|
1497
|
+
#ifndef GRN_QUERY_COLUMN
|
1498
|
+
#define GRN_QUERY_COLUMN ':'
|
1499
|
+
#endif /* GRN_QUERY_COLUMN */
|
1500
|
+
|
1501
|
+
typedef struct _grn_snip grn_snip;
|
1502
|
+
typedef struct _grn_query grn_query;
|
1503
|
+
typedef struct _grn_snip_mapping grn_snip_mapping;
|
1504
|
+
|
1505
|
+
struct _grn_snip_mapping {
|
1506
|
+
void *dummy;
|
1507
|
+
};
|
1508
|
+
|
1509
|
+
GRN_API grn_query *grn_query_open(grn_ctx *ctx, const char *str, unsigned int str_len,
|
1510
|
+
grn_operator default_op, int max_exprs);
|
1511
|
+
GRN_API unsigned int grn_query_rest(grn_ctx *ctx, grn_query *q, const char ** const rest);
|
1512
|
+
GRN_API grn_rc grn_query_close(grn_ctx *ctx, grn_query *q);
|
1513
|
+
|
1514
|
+
GRN_API grn_rc grn_query_scan(grn_ctx *ctx, grn_query *q, const char **strs, unsigned int *str_lens,
|
1515
|
+
unsigned int nstrs, int flags, int *found, int *score);
|
1516
|
+
GRN_API grn_snip *grn_query_snip(grn_ctx *ctx, grn_query *query, int flags,
|
1517
|
+
unsigned int width, unsigned int max_results,
|
1518
|
+
unsigned int n_tags,
|
1519
|
+
const char **opentags, unsigned int *opentag_lens,
|
1520
|
+
const char **closetags, unsigned int *closetag_lens,
|
1521
|
+
grn_snip_mapping *mapping);
|
1522
|
+
|
1523
|
+
#define GRN_SNIP_NORMALIZE (0x01<<0)
|
1524
|
+
#define GRN_SNIP_COPY_TAG (0x01<<1)
|
1525
|
+
#define GRN_SNIP_SKIP_LEADING_SPACES (0x01<<2)
|
1526
|
+
#define GRN_QUERY_SCAN_NORMALIZE GRN_SNIP_NORMALIZE
|
1527
|
+
|
1528
|
+
GRN_API grn_snip *grn_snip_open(grn_ctx *ctx, int flags, unsigned int width,
|
1529
|
+
unsigned int max_results,
|
1530
|
+
const char *defaultopentag, unsigned int defaultopentag_len,
|
1531
|
+
const char *defaultclosetag, unsigned int defaultclosetag_len,
|
1532
|
+
grn_snip_mapping *mapping);
|
1533
|
+
GRN_API grn_rc grn_snip_close(grn_ctx *ctx, grn_snip *snip);
|
1534
|
+
GRN_API grn_rc grn_snip_add_cond(grn_ctx *ctx, grn_snip *snip,
|
1535
|
+
const char *keyword, unsigned int keyword_len,
|
1536
|
+
const char *opentag, unsigned int opentag_len,
|
1537
|
+
const char *closetag, unsigned int closetag_len);
|
1538
|
+
GRN_API grn_rc grn_snip_exec(grn_ctx *ctx, grn_snip *snip,
|
1539
|
+
const char *string, unsigned int string_len,
|
1540
|
+
unsigned int *nresults, unsigned int *max_tagged_len);
|
1541
|
+
GRN_API grn_rc grn_snip_get_result(grn_ctx *ctx, grn_snip *snip, const unsigned int index,
|
1542
|
+
char *result, unsigned int *result_len);
|
1543
|
+
|
1544
|
+
/* log */
|
1545
|
+
|
1546
|
+
#define GRN_LOG_TIME (0x01<<0)
|
1547
|
+
#define GRN_LOG_TITLE (0x01<<1)
|
1548
|
+
#define GRN_LOG_MESSAGE (0x01<<2)
|
1549
|
+
#define GRN_LOG_LOCATION (0x01<<3)
|
1550
|
+
|
1551
|
+
typedef struct _grn_logger_info grn_logger_info;
|
1552
|
+
|
1553
|
+
struct _grn_logger_info {
|
1554
|
+
grn_log_level max_level;
|
1555
|
+
int flags;
|
1556
|
+
void (*func)(int, const char *, const char *, const char *, const char *, void *);
|
1557
|
+
void *func_arg;
|
1558
|
+
};
|
1559
|
+
|
1560
|
+
GRN_API grn_rc grn_logger_info_set(grn_ctx *ctx, const grn_logger_info *info);
|
1561
|
+
|
1562
|
+
GRN_API void grn_logger_put(grn_ctx *ctx, grn_log_level level,
|
1563
|
+
const char *file, int line, const char *func, const char *fmt, ...);
|
1564
|
+
|
1565
|
+
GRN_API int grn_logger_pass(grn_ctx *ctx, grn_log_level level);
|
1566
|
+
|
1567
|
+
#ifndef GRN_LOG_DEFAULT_LEVEL
|
1568
|
+
#define GRN_LOG_DEFAULT_LEVEL GRN_LOG_NOTICE
|
1569
|
+
#endif /* GRN_LOG_DEFAULT_LEVEL */
|
1570
|
+
|
1571
|
+
#define GRN_LOG(ctx,level,...) do {\
|
1572
|
+
if (grn_logger_pass(ctx, level)) {\
|
1573
|
+
grn_logger_put(ctx, (level), __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); \
|
1574
|
+
}\
|
1575
|
+
} while (0)
|
1576
|
+
|
1577
|
+
/* grn_bulk */
|
1578
|
+
|
1579
|
+
#define GRN_BULK_BUFSIZE (sizeof(grn_obj) - sizeof(grn_obj_header))
|
1580
|
+
#define GRN_BULK_OUTP(bulk) ((bulk)->header.impl_flags & GRN_OBJ_OUTPLACE)
|
1581
|
+
#define GRN_BULK_REWIND(bulk) do {\
|
1582
|
+
if (GRN_BULK_OUTP(bulk)) {\
|
1583
|
+
(bulk)->u.b.curr = (bulk)->u.b.head;\
|
1584
|
+
} else {\
|
1585
|
+
(bulk)->header.flags = 0;\
|
1586
|
+
}\
|
1587
|
+
} while (0)
|
1588
|
+
#define GRN_BULK_WSIZE(bulk) \
|
1589
|
+
(GRN_BULK_OUTP(bulk)\
|
1590
|
+
? ((bulk)->u.b.tail - (bulk)->u.b.head)\
|
1591
|
+
: GRN_BULK_BUFSIZE)
|
1592
|
+
#define GRN_BULK_REST(bulk) \
|
1593
|
+
(GRN_BULK_OUTP(bulk)\
|
1594
|
+
? ((bulk)->u.b.tail - (bulk)->u.b.curr)\
|
1595
|
+
: GRN_BULK_BUFSIZE - (bulk)->header.flags)
|
1596
|
+
#define GRN_BULK_VSIZE(bulk) \
|
1597
|
+
(GRN_BULK_OUTP(bulk)\
|
1598
|
+
? ((bulk)->u.b.curr - (bulk)->u.b.head)\
|
1599
|
+
: (bulk)->header.flags)
|
1600
|
+
#define GRN_BULK_EMPTYP(bulk) \
|
1601
|
+
(GRN_BULK_OUTP(bulk)\
|
1602
|
+
? ((bulk)->u.b.curr == (bulk)->u.b.head)\
|
1603
|
+
: !((bulk)->header.flags))
|
1604
|
+
#define GRN_BULK_HEAD(bulk) \
|
1605
|
+
(GRN_BULK_OUTP(bulk)\
|
1606
|
+
? ((bulk)->u.b.head)\
|
1607
|
+
: (char *)&((bulk)->u.b.head))
|
1608
|
+
#define GRN_BULK_CURR(bulk) \
|
1609
|
+
(GRN_BULK_OUTP(bulk)\
|
1610
|
+
? ((bulk)->u.b.curr)\
|
1611
|
+
: (char *)&((bulk)->u.b.head) + (bulk)->header.flags)
|
1612
|
+
#define GRN_BULK_TAIL(bulk) \
|
1613
|
+
(GRN_BULK_OUTP(bulk)\
|
1614
|
+
? ((bulk)->u.b.tail)\
|
1615
|
+
: (char *)&((bulk)[1]))
|
1616
|
+
|
1617
|
+
GRN_API grn_rc grn_bulk_reinit(grn_ctx *ctx, grn_obj *bulk, unsigned int size);
|
1618
|
+
GRN_API grn_rc grn_bulk_resize(grn_ctx *ctx, grn_obj *bulk, unsigned int newsize);
|
1619
|
+
GRN_API grn_rc grn_bulk_write(grn_ctx *ctx, grn_obj *bulk,
|
1620
|
+
const char *str, unsigned int len);
|
1621
|
+
GRN_API grn_rc grn_bulk_write_from(grn_ctx *ctx, grn_obj *bulk,
|
1622
|
+
const char *str, unsigned int from, unsigned int len);
|
1623
|
+
GRN_API grn_rc grn_bulk_reserve(grn_ctx *ctx, grn_obj *bulk, unsigned int len);
|
1624
|
+
GRN_API grn_rc grn_bulk_space(grn_ctx *ctx, grn_obj *bulk, unsigned int len);
|
1625
|
+
GRN_API grn_rc grn_bulk_truncate(grn_ctx *ctx, grn_obj *bulk, unsigned int len);
|
1626
|
+
GRN_API grn_rc grn_bulk_fin(grn_ctx *ctx, grn_obj *bulk);
|
1627
|
+
|
1628
|
+
/* grn_text */
|
1629
|
+
|
1630
|
+
GRN_API grn_rc grn_text_itoa(grn_ctx *ctx, grn_obj *bulk, int i);
|
1631
|
+
GRN_API grn_rc grn_text_itoa_padded(grn_ctx *ctx, grn_obj *bulk, int i, char ch, unsigned int len);
|
1632
|
+
GRN_API grn_rc grn_text_lltoa(grn_ctx *ctx, grn_obj *bulk, long long int i);
|
1633
|
+
GRN_API grn_rc grn_text_ftoa(grn_ctx *ctx, grn_obj *bulk, double d);
|
1634
|
+
GRN_API grn_rc grn_text_itoh(grn_ctx *ctx, grn_obj *bulk, int i, unsigned int len);
|
1635
|
+
GRN_API grn_rc grn_text_itob(grn_ctx *ctx, grn_obj *bulk, grn_id id);
|
1636
|
+
GRN_API grn_rc grn_text_lltob32h(grn_ctx *ctx, grn_obj *bulk, long long int i);
|
1637
|
+
GRN_API grn_rc grn_text_benc(grn_ctx *ctx, grn_obj *bulk, unsigned int v);
|
1638
|
+
GRN_API grn_rc grn_text_esc(grn_ctx *ctx, grn_obj *bulk, const char *s, unsigned int len);
|
1639
|
+
GRN_API grn_rc grn_text_urlenc(grn_ctx *ctx, grn_obj *buf,
|
1640
|
+
const char *str, unsigned int len);
|
1641
|
+
GRN_API const char *grn_text_urldec(grn_ctx *ctx, grn_obj *buf,
|
1642
|
+
const char *s, const char *e, char d);
|
1643
|
+
GRN_API grn_rc grn_text_escape_xml(grn_ctx *ctx, grn_obj *buf,
|
1644
|
+
const char *s, unsigned int len);
|
1645
|
+
GRN_API grn_rc grn_text_time2rfc1123(grn_ctx *ctx, grn_obj *bulk, int sec);
|
1646
|
+
|
1647
|
+
typedef struct _grn_obj_format grn_obj_format;
|
1648
|
+
|
1649
|
+
#define GRN_OBJ_FORMAT_WITH_COLUMN_NAMES (0x01<<0)
|
1650
|
+
#define GRN_OBJ_FORMAT_ASARRAY (0x01<<3)
|
1651
|
+
|
1652
|
+
struct _grn_obj_format {
|
1653
|
+
grn_obj columns;
|
1654
|
+
const void *min;
|
1655
|
+
const void *max;
|
1656
|
+
unsigned min_size;
|
1657
|
+
unsigned max_size;
|
1658
|
+
int nhits;
|
1659
|
+
int offset;
|
1660
|
+
int limit;
|
1661
|
+
int flags;
|
1662
|
+
};
|
1663
|
+
|
1664
|
+
#define GRN_OBJ_FORMAT_INIT(format,format_nhits,format_offset,format_limit) do { \
|
1665
|
+
GRN_PTR_INIT(&(format)->columns, GRN_OBJ_VECTOR, GRN_ID_NIL);\
|
1666
|
+
(format)->nhits = (format_nhits);\
|
1667
|
+
(format)->offset = (format_offset);\
|
1668
|
+
(format)->limit = (format_limit);\
|
1669
|
+
} while (0)
|
1670
|
+
|
1671
|
+
#define GRN_OBJ_FORMAT_FIN(ctx,format) do {\
|
1672
|
+
int ncolumns = GRN_BULK_VSIZE(&(format)->columns) / sizeof(grn_obj *);\
|
1673
|
+
grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&(format)->columns);\
|
1674
|
+
while (ncolumns--) { grn_obj_unlink((ctx), *columns++); }\
|
1675
|
+
GRN_OBJ_FIN((ctx), &(format)->columns);\
|
1676
|
+
} while (0)
|
1677
|
+
|
1678
|
+
GRN_API grn_rc grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj,
|
1679
|
+
grn_obj_format *format);
|
1680
|
+
|
1681
|
+
/* various values exchanged via grn_obj */
|
1682
|
+
|
1683
|
+
#define GRN_OBJ_DO_SHALLOW_COPY (GRN_OBJ_REFER|GRN_OBJ_OUTPLACE)
|
1684
|
+
#define GRN_OBJ_VECTOR (0x01<<7)
|
1685
|
+
|
1686
|
+
#define GRN_OBJ_MUTABLE(obj) ((obj) && (obj)->header.type <= GRN_VECTOR)
|
1687
|
+
|
1688
|
+
#define GRN_VALUE_FIX_SIZE_INIT(obj,flags,domain)\
|
1689
|
+
GRN_OBJ_INIT((obj), ((flags) & GRN_OBJ_VECTOR) ? GRN_UVECTOR : GRN_BULK,\
|
1690
|
+
((flags) & GRN_OBJ_DO_SHALLOW_COPY), (domain))
|
1691
|
+
#define GRN_VALUE_VAR_SIZE_INIT(obj,flags,domain)\
|
1692
|
+
GRN_OBJ_INIT((obj), ((flags) & GRN_OBJ_VECTOR) ? GRN_VECTOR : GRN_BULK,\
|
1693
|
+
((flags) & GRN_OBJ_DO_SHALLOW_COPY), (domain))
|
1694
|
+
|
1695
|
+
#define GRN_VOID_INIT(obj) GRN_OBJ_INIT((obj), GRN_VOID, 0, GRN_DB_VOID)
|
1696
|
+
#define GRN_TEXT_INIT(obj,flags) \
|
1697
|
+
GRN_VALUE_VAR_SIZE_INIT(obj, flags, GRN_DB_TEXT)
|
1698
|
+
#define GRN_SHORT_TEXT_INIT(obj,flags) \
|
1699
|
+
GRN_VALUE_VAR_SIZE_INIT(obj, flags, GRN_DB_SHORT_TEXT)
|
1700
|
+
#define GRN_LONG_TEXT_INIT(obj,flags) \
|
1701
|
+
GRN_VALUE_VAR_SIZE_INIT(obj, flags, GRN_DB_LONG_TEXT)
|
1702
|
+
#define GRN_TEXT_SET_REF(obj,str,len) do {\
|
1703
|
+
(obj)->u.b.head = (char *)(str);\
|
1704
|
+
(obj)->u.b.curr = (char *)(str) + (len);\
|
1705
|
+
} while (0)
|
1706
|
+
#define GRN_TEXT_SET(ctx,obj,str,len) do {\
|
1707
|
+
if ((obj)->header.impl_flags & GRN_OBJ_REFER) {\
|
1708
|
+
GRN_TEXT_SET_REF((obj), (str), (len));\
|
1709
|
+
} else {\
|
1710
|
+
grn_bulk_write_from((ctx), (obj), (const char *)(str), 0, (unsigned int)(len));\
|
1711
|
+
}\
|
1712
|
+
} while (0)
|
1713
|
+
#define GRN_TEXT_PUT(ctx,obj,str,len) \
|
1714
|
+
grn_bulk_write((ctx), (obj), (const char *)(str), (unsigned int)(len))
|
1715
|
+
#define GRN_TEXT_PUTC(ctx,obj,c) do {\
|
1716
|
+
char _c = (c); grn_bulk_write((ctx), (obj), &_c, 1);\
|
1717
|
+
} while (0)
|
1718
|
+
|
1719
|
+
#define GRN_TEXT_PUTS(ctx,obj,str) GRN_TEXT_PUT((ctx), (obj), (str), strlen(str))
|
1720
|
+
#define GRN_TEXT_SETS(ctx,obj,str) GRN_TEXT_SET((ctx), (obj), (str), strlen(str))
|
1721
|
+
#define GRN_TEXT_VALUE(obj) GRN_BULK_HEAD(obj)
|
1722
|
+
#define GRN_TEXT_LEN(obj) GRN_BULK_VSIZE(obj)
|
1723
|
+
|
1724
|
+
#define GRN_BOOL_INIT(obj,flags) \
|
1725
|
+
GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_BOOL)
|
1726
|
+
#define GRN_INT8_INIT(obj,flags) \
|
1727
|
+
GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT8)
|
1728
|
+
#define GRN_UINT8_INIT(obj,flags) \
|
1729
|
+
GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT8)
|
1730
|
+
#define GRN_INT16_INIT(obj,flags) \
|
1731
|
+
GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT16)
|
1732
|
+
#define GRN_UINT16_INIT(obj,flags) \
|
1733
|
+
GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT16)
|
1734
|
+
#define GRN_INT32_INIT(obj,flags) \
|
1735
|
+
GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT32)
|
1736
|
+
#define GRN_UINT32_INIT(obj,flags) \
|
1737
|
+
GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT32)
|
1738
|
+
#define GRN_INT64_INIT(obj,flags) \
|
1739
|
+
GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_INT64)
|
1740
|
+
#define GRN_UINT64_INIT(obj,flags) \
|
1741
|
+
GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_UINT64)
|
1742
|
+
#define GRN_FLOAT_INIT(obj,flags) \
|
1743
|
+
GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_FLOAT)
|
1744
|
+
#define GRN_TIME_INIT(obj,flags) \
|
1745
|
+
GRN_VALUE_FIX_SIZE_INIT(obj, flags, GRN_DB_TIME)
|
1746
|
+
#define GRN_RECORD_INIT GRN_VALUE_FIX_SIZE_INIT
|
1747
|
+
#define GRN_PTR_INIT(obj,flags,domain)\
|
1748
|
+
GRN_OBJ_INIT((obj), ((flags) & GRN_OBJ_VECTOR) ? GRN_PVECTOR : GRN_PTR,\
|
1749
|
+
((flags) & GRN_OBJ_DO_SHALLOW_COPY), (domain))
|
1750
|
+
|
1751
|
+
#define GRN_BOOL_SET(ctx,obj,val) do {\
|
1752
|
+
unsigned char _val = (unsigned char)(val);\
|
1753
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(unsigned char));\
|
1754
|
+
} while (0)
|
1755
|
+
#define GRN_INT8_SET(ctx,obj,val) do {\
|
1756
|
+
signed char _val = (signed char)(val);\
|
1757
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(signed char));\
|
1758
|
+
} while (0)
|
1759
|
+
#define GRN_UINT8_SET(ctx,obj,val) do {\
|
1760
|
+
unsigned char _val = (unsigned char)(val);\
|
1761
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(unsigned char));\
|
1762
|
+
} while (0)
|
1763
|
+
#define GRN_INT16_SET(ctx,obj,val) do {\
|
1764
|
+
signed short _val = (signed short)(val);\
|
1765
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(signed short));\
|
1766
|
+
} while (0)
|
1767
|
+
#define GRN_UINT16_SET(ctx,obj,val) do {\
|
1768
|
+
unsigned short _val = (unsigned short)(val);\
|
1769
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(unsigned short));\
|
1770
|
+
} while (0)
|
1771
|
+
#define GRN_INT32_SET(ctx,obj,val) do {\
|
1772
|
+
int _val = (int)(val);\
|
1773
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(int));\
|
1774
|
+
} while (0)
|
1775
|
+
#define GRN_UINT32_SET(ctx,obj,val) do {\
|
1776
|
+
unsigned int _val = (unsigned int)(val);\
|
1777
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(unsigned int));\
|
1778
|
+
} while (0)
|
1779
|
+
#define GRN_INT64_SET(ctx,obj,val) do {\
|
1780
|
+
long long int _val = (long long int)(val);\
|
1781
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(long long int));\
|
1782
|
+
} while (0)
|
1783
|
+
#define GRN_UINT64_SET(ctx,obj,val) do {\
|
1784
|
+
long long unsigned int _val = (long long unsigned int)(val);\
|
1785
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(long long unsigned int));\
|
1786
|
+
} while (0)
|
1787
|
+
#define GRN_FLOAT_SET(ctx,obj,val) do {\
|
1788
|
+
double _val = (double)(val);\
|
1789
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(double));\
|
1790
|
+
} while (0)
|
1791
|
+
#define GRN_TIME_SET GRN_INT64_SET
|
1792
|
+
#define GRN_RECORD_SET(ctx,obj,val) do {\
|
1793
|
+
grn_id _val = (grn_id)(val);\
|
1794
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(grn_id));\
|
1795
|
+
} while (0)
|
1796
|
+
#define GRN_PTR_SET(ctx,obj,val) do {\
|
1797
|
+
grn_obj *_val = (grn_obj *)(val);\
|
1798
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(grn_obj *));\
|
1799
|
+
} while (0)
|
1800
|
+
|
1801
|
+
#define GRN_BOOL_SET_AT(ctx,obj,offset,val) do {\
|
1802
|
+
unsigned char _val = (unsigned char)(val);\
|
1803
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1804
|
+
(offset), sizeof(unsigned char));\
|
1805
|
+
} while (0)
|
1806
|
+
#define GRN_INT8_SET_AT(ctx,obj,offset,val) do {\
|
1807
|
+
signed char _val = (signed char)(val);\
|
1808
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1809
|
+
(offset) * sizeof(signed char), sizeof(signed char));\
|
1810
|
+
} while (0)
|
1811
|
+
#define GRN_UINT8_SET_AT(ctx,obj,offset,val) do { \
|
1812
|
+
unsigned char _val = (unsigned char)(val);\
|
1813
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1814
|
+
(offset) * sizeof(unsigned char), sizeof(unsigned char));\
|
1815
|
+
} while (0)
|
1816
|
+
#define GRN_INT16_SET_AT(ctx,obj,offset,val) do {\
|
1817
|
+
signed short _val = (signed short)(val);\
|
1818
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1819
|
+
(offset) * sizeof(signed short), sizeof(signed short));\
|
1820
|
+
} while (0)
|
1821
|
+
#define GRN_UINT16_SET_AT(ctx,obj,offset,val) do { \
|
1822
|
+
unsigned short _val = (unsigned short)(val);\
|
1823
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1824
|
+
(offset) * sizeof(unsigned short), sizeof(unsigned short));\
|
1825
|
+
} while (0)
|
1826
|
+
#define GRN_INT32_SET_AT(ctx,obj,offset,val) do {\
|
1827
|
+
int _val = (int)(val);\
|
1828
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1829
|
+
(offset) * sizeof(int), sizeof(int));\
|
1830
|
+
} while (0)
|
1831
|
+
#define GRN_UINT32_SET_AT(ctx,obj,offset,val) do { \
|
1832
|
+
unsigned int _val = (unsigned int)(val);\
|
1833
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1834
|
+
(offset) * sizeof(unsigned int), sizeof(unsigned int));\
|
1835
|
+
} while (0)
|
1836
|
+
#define GRN_INT64_SET_AT(ctx,obj,offset,val) do {\
|
1837
|
+
long long int _val = (long long int)(val);\
|
1838
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1839
|
+
(offset) * sizeof(long long int), sizeof(long long int));\
|
1840
|
+
} while (0)
|
1841
|
+
#define GRN_UINT64_SET_AT(ctx,obj,offset,val) do {\
|
1842
|
+
long long unsigned int _val = (long long unsigned int)(val);\
|
1843
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1844
|
+
(offset) * sizeof(long long unsigned int),\
|
1845
|
+
sizeof(long long unsigned int));\
|
1846
|
+
} while (0)
|
1847
|
+
#define GRN_FLOAT_SET_AT(ctx,obj,offset,val) do {\
|
1848
|
+
double _val = (double)(val);\
|
1849
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1850
|
+
(offset) * sizeof(double), sizeof(double));\
|
1851
|
+
} while (0)
|
1852
|
+
#define GRN_TIME_SET_AT GRN_INT64_SET_AT
|
1853
|
+
#define GRN_RECORD_SET_AT(ctx,obj,offset,val) do {\
|
1854
|
+
grn_id _val = (grn_id)(val);\
|
1855
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1856
|
+
(offset) * sizeof(grn_id), sizeof(grn_id));\
|
1857
|
+
} while (0)
|
1858
|
+
#define GRN_PTR_SET_AT(ctx,obj,offset,val) do {\
|
1859
|
+
grn_obj *_val = (grn_obj *)(val);\
|
1860
|
+
grn_bulk_write_from((ctx), (obj), (char *)&_val,\
|
1861
|
+
(offset) * sizeof(grn_obj *), sizeof(grn_obj *));\
|
1862
|
+
} while (0)
|
1863
|
+
|
1864
|
+
#define GRN_TIME_USEC_PER_SEC 1000000
|
1865
|
+
#define GRN_TIME_PACK(sec, usec) ((long long int)(sec) * GRN_TIME_USEC_PER_SEC + (usec))
|
1866
|
+
#define GRN_TIME_UNPACK(time_value, sec, usec) do {\
|
1867
|
+
sec = (time_value) / GRN_TIME_USEC_PER_SEC;\
|
1868
|
+
usec = (time_value) % GRN_TIME_USEC_PER_SEC;\
|
1869
|
+
} while (0)
|
1870
|
+
|
1871
|
+
GRN_API void grn_time_now(grn_ctx *ctx, grn_obj *obj);
|
1872
|
+
|
1873
|
+
#define GRN_TIME_NOW(ctx,obj) (grn_time_now((ctx), (obj)))
|
1874
|
+
|
1875
|
+
#define GRN_BOOL_VALUE(obj) (*((unsigned char *)GRN_BULK_HEAD(obj)))
|
1876
|
+
#define GRN_INT8_VALUE(obj) (*((signed char *)GRN_BULK_HEAD(obj)))
|
1877
|
+
#define GRN_UINT8_VALUE(obj) (*((unsigned char *)GRN_BULK_HEAD(obj)))
|
1878
|
+
#define GRN_INT16_VALUE(obj) (*((signed short *)GRN_BULK_HEAD(obj)))
|
1879
|
+
#define GRN_UINT16_VALUE(obj) (*((unsigned short *)GRN_BULK_HEAD(obj)))
|
1880
|
+
#define GRN_INT32_VALUE(obj) (*((int *)GRN_BULK_HEAD(obj)))
|
1881
|
+
#define GRN_UINT32_VALUE(obj) (*((unsigned int *)GRN_BULK_HEAD(obj)))
|
1882
|
+
#define GRN_INT64_VALUE(obj) (*((long long int *)GRN_BULK_HEAD(obj)))
|
1883
|
+
#define GRN_UINT64_VALUE(obj) (*((long long unsigned int *)GRN_BULK_HEAD(obj)))
|
1884
|
+
#define GRN_FLOAT_VALUE(obj) (*((double *)GRN_BULK_HEAD(obj)))
|
1885
|
+
#define GRN_TIME_VALUE GRN_INT64_VALUE
|
1886
|
+
#define GRN_RECORD_VALUE(obj) (*((grn_id *)GRN_BULK_HEAD(obj)))
|
1887
|
+
#define GRN_PTR_VALUE(obj) (*((grn_obj **)GRN_BULK_HEAD(obj)))
|
1888
|
+
|
1889
|
+
#define GRN_BOOL_VALUE_AT(obj,offset) (((unsigned char *)GRN_BULK_HEAD(obj))[offset])
|
1890
|
+
#define GRN_INT8_VALUE_AT(obj,offset) (((signed char *)GRN_BULK_HEAD(obj))[offset])
|
1891
|
+
#define GRN_UINT8_VALUE_AT(obj,offset) (((unsigned char *)GRN_BULK_HEAD(obj))[offset])
|
1892
|
+
#define GRN_INT16_VALUE_AT(obj,offset) (((signed short *)GRN_BULK_HEAD(obj))[offset])
|
1893
|
+
#define GRN_UINT16_VALUE_AT(obj,offset) (((unsigned short *)GRN_BULK_HEAD(obj))[offset])
|
1894
|
+
#define GRN_INT32_VALUE_AT(obj,offset) (((int *)GRN_BULK_HEAD(obj))[offset])
|
1895
|
+
#define GRN_UINT32_VALUE_AT(obj,offset) (((unsigned int *)GRN_BULK_HEAD(obj))[offset])
|
1896
|
+
#define GRN_INT64_VALUE_AT(obj,offset) (((long long int *)GRN_BULK_HEAD(obj))[offset])
|
1897
|
+
#define GRN_UINT64_VALUE_AT(obj,offset) (((long long unsigned int *)GRN_BULK_HEAD(obj))[offset])
|
1898
|
+
#define GRN_FLOAT_VALUE_AT(ob,offsetj) (((double *)GRN_BULK_HEAD(obj))[offset])
|
1899
|
+
#define GRN_TIME_VALUE_AT GRN_INT64_VALUE_AT
|
1900
|
+
#define GRN_RECORD_VALUE_AT(obj,offset) (((grn_id *)GRN_BULK_HEAD(obj))[offset])
|
1901
|
+
#define GRN_PTR_VALUE_AT(obj,offset) (((grn_obj **)GRN_BULK_HEAD(obj))[offset])
|
1902
|
+
|
1903
|
+
#define GRN_BOOL_PUT(ctx,obj,val) do {\
|
1904
|
+
unsigned char _val = (unsigned char)(val);\
|
1905
|
+
grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(unsigned char));\
|
1906
|
+
} while (0)
|
1907
|
+
#define GRN_INT8_PUT(ctx,obj,val) do {\
|
1908
|
+
signed char _val = (signed char)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(signed char));\
|
1909
|
+
} while (0)
|
1910
|
+
#define GRN_UINT8_PUT(ctx,obj,val) do {\
|
1911
|
+
unsigned char _val = (unsigned char)(val);\
|
1912
|
+
grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(unsigned char));\
|
1913
|
+
} while (0)
|
1914
|
+
#define GRN_INT16_PUT(ctx,obj,val) do {\
|
1915
|
+
signed short _val = (signed short)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(signed short));\
|
1916
|
+
} while (0)
|
1917
|
+
#define GRN_UINT16_PUT(ctx,obj,val) do {\
|
1918
|
+
unsigned short _val = (unsigned short)(val);\
|
1919
|
+
grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(unsigned short));\
|
1920
|
+
} while (0)
|
1921
|
+
#define GRN_INT32_PUT(ctx,obj,val) do {\
|
1922
|
+
int _val = (int)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(int));\
|
1923
|
+
} while (0)
|
1924
|
+
#define GRN_UINT32_PUT(ctx,obj,val) do {\
|
1925
|
+
unsigned int _val = (unsigned int)(val);\
|
1926
|
+
grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(unsigned int));\
|
1927
|
+
} while (0)
|
1928
|
+
#define GRN_INT64_PUT(ctx,obj,val) do {\
|
1929
|
+
long long int _val = (long long int)(val);\
|
1930
|
+
grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(long long int));\
|
1931
|
+
} while (0)
|
1932
|
+
#define GRN_UINT64_PUT(ctx,obj,val) do {\
|
1933
|
+
long long unsigned int _val = (long long unsigned int)(val);\
|
1934
|
+
grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(long long unsigned int));\
|
1935
|
+
} while (0)
|
1936
|
+
#define GRN_FLOAT_PUT(ctx,obj,val) do {\
|
1937
|
+
double _val = (double)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(double));\
|
1938
|
+
} while (0)
|
1939
|
+
#define GRN_TIME_PUT GRN_INT64_PUT
|
1940
|
+
#define GRN_RECORD_PUT(ctx,obj,val) do {\
|
1941
|
+
grn_id _val = (grn_id)(val); grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(grn_id));\
|
1942
|
+
} while (0)
|
1943
|
+
#define GRN_PTR_PUT(ctx,obj,val) do {\
|
1944
|
+
grn_obj *_val = (grn_obj *)(val);\
|
1945
|
+
grn_bulk_write((ctx), (obj), (char *)&_val, sizeof(grn_obj *));\
|
1946
|
+
} while (0)
|
1947
|
+
|
1948
|
+
/* grn_str */
|
1949
|
+
|
1950
|
+
typedef struct {
|
1951
|
+
const char *orig;
|
1952
|
+
char *norm;
|
1953
|
+
short *checks;
|
1954
|
+
unsigned char *ctypes;
|
1955
|
+
int flags;
|
1956
|
+
unsigned int orig_blen;
|
1957
|
+
unsigned int norm_blen;
|
1958
|
+
unsigned int length;
|
1959
|
+
grn_encoding encoding;
|
1960
|
+
} grn_str;
|
1961
|
+
|
1962
|
+
#define GRN_STR_REMOVEBLANK (0x01<<0)
|
1963
|
+
#define GRN_STR_WITH_CTYPES (0x01<<1)
|
1964
|
+
#define GRN_STR_WITH_CHECKS (0x01<<2)
|
1965
|
+
#define GRN_STR_NORMALIZE GRN_OBJ_KEY_NORMALIZE
|
1966
|
+
|
1967
|
+
GRN_API grn_str *grn_str_open(grn_ctx *ctx, const char *str, unsigned int str_len,
|
1968
|
+
int flags);
|
1969
|
+
GRN_API grn_rc grn_str_close(grn_ctx *ctx, grn_str *nstr);
|
1970
|
+
|
1971
|
+
GRN_API int grn_charlen(grn_ctx *ctx, const char *str, const char *end);
|
1972
|
+
|
1973
|
+
/* expr */
|
1974
|
+
|
1975
|
+
GRN_API grn_obj *grn_expr_create(grn_ctx *ctx, const char *name, unsigned name_size);
|
1976
|
+
GRN_API grn_rc grn_expr_close(grn_ctx *ctx, grn_obj *expr);
|
1977
|
+
GRN_API grn_obj *grn_expr_add_var(grn_ctx *ctx, grn_obj *expr,
|
1978
|
+
const char *name, unsigned name_size);
|
1979
|
+
GRN_API grn_obj *grn_expr_get_var(grn_ctx *ctx, grn_obj *expr,
|
1980
|
+
const char *name, unsigned name_size);
|
1981
|
+
GRN_API grn_obj *grn_expr_get_var_by_offset(grn_ctx *ctx, grn_obj *expr, unsigned int offset);
|
1982
|
+
|
1983
|
+
GRN_API grn_obj *grn_expr_append_obj(grn_ctx *ctx, grn_obj *expr, grn_obj *obj,
|
1984
|
+
grn_operator op, int nargs);
|
1985
|
+
GRN_API grn_obj *grn_expr_append_const(grn_ctx *ctx, grn_obj *expr, grn_obj *obj,
|
1986
|
+
grn_operator op, int nargs);
|
1987
|
+
GRN_API grn_obj *grn_expr_append_const_str(grn_ctx *ctx, grn_obj *expr,
|
1988
|
+
const char *str, unsigned str_size,
|
1989
|
+
grn_operator op, int nargs);
|
1990
|
+
GRN_API grn_obj *grn_expr_append_const_int(grn_ctx *ctx, grn_obj *expr, int i,
|
1991
|
+
grn_operator op, int nargs);
|
1992
|
+
GRN_API grn_rc grn_expr_append_op(grn_ctx *ctx, grn_obj *expr, grn_operator op, int nargs);
|
1993
|
+
|
1994
|
+
GRN_API grn_rc grn_expr_compile(grn_ctx *ctx, grn_obj *expr);
|
1995
|
+
GRN_API grn_rc grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs);
|
1996
|
+
GRN_API grn_rc grn_ctx_push(grn_ctx *ctx, grn_obj *obj);
|
1997
|
+
GRN_API grn_obj *grn_ctx_pop(grn_ctx *ctx);
|
1998
|
+
|
1999
|
+
#define GRN_EXPR_CALL(ctx,expr,nargs) \
|
2000
|
+
(grn_expr_exec((ctx), (expr), (nargs)), grn_ctx_pop(ctx))
|
2001
|
+
|
2002
|
+
GRN_API grn_obj *grn_expr_alloc(grn_ctx *ctx, grn_obj *expr,
|
2003
|
+
grn_id domain, grn_obj_flags flags);
|
2004
|
+
|
2005
|
+
GRN_API grn_obj *grn_table_select(grn_ctx *ctx, grn_obj *table, grn_obj *expr,
|
2006
|
+
grn_obj *res, grn_operator op);
|
2007
|
+
|
2008
|
+
GRN_API int grn_obj_columns(grn_ctx *ctx, grn_obj *table,
|
2009
|
+
const char *str, unsigned str_size, grn_obj *res);
|
2010
|
+
|
2011
|
+
#define GRN_EXPR_CREATE_FOR_QUERY(ctx,table,expr,var) \
|
2012
|
+
if (((expr) = grn_expr_create((ctx), NULL, 0)) &&\
|
2013
|
+
((var) = grn_expr_add_var((ctx), (expr), NULL, 0))) {\
|
2014
|
+
GRN_RECORD_INIT((var), 0, grn_obj_id((ctx), (table)));\
|
2015
|
+
} else {\
|
2016
|
+
(var) = NULL;\
|
2017
|
+
}
|
2018
|
+
|
2019
|
+
typedef unsigned int grn_expr_flags;
|
2020
|
+
|
2021
|
+
#define GRN_EXPR_SYNTAX_QUERY (0x00)
|
2022
|
+
#define GRN_EXPR_SYNTAX_SCRIPT (0x01)
|
2023
|
+
#define GRN_EXPR_ALLOW_PRAGMA (0x02)
|
2024
|
+
#define GRN_EXPR_ALLOW_COLUMN (0x04)
|
2025
|
+
#define GRN_EXPR_ALLOW_UPDATE (0x08)
|
2026
|
+
|
2027
|
+
GRN_API grn_rc grn_expr_parse(grn_ctx *ctx, grn_obj *expr,
|
2028
|
+
const char *str, unsigned str_size,
|
2029
|
+
grn_obj *default_column, grn_operator default_mode,
|
2030
|
+
grn_operator default_op, grn_expr_flags flags);
|
2031
|
+
|
2032
|
+
GRN_API grn_snip *grn_expr_snip(grn_ctx *ctx, grn_obj *expr, int flags,
|
2033
|
+
unsigned int width, unsigned int max_results,
|
2034
|
+
unsigned int n_tags,
|
2035
|
+
const char **opentags, unsigned int *opentag_lens,
|
2036
|
+
const char **closetags, unsigned int *closetag_lens,
|
2037
|
+
grn_snip_mapping *mapping);
|
2038
|
+
|
2039
|
+
GRN_API grn_table_sort_key *grn_table_sort_key_from_str(grn_ctx *ctx,
|
2040
|
+
const char *str, unsigned str_size,
|
2041
|
+
grn_obj *table, unsigned *nkeys);
|
2042
|
+
GRN_API grn_rc grn_table_sort_key_close(grn_ctx *ctx,
|
2043
|
+
grn_table_sort_key *keys, unsigned nkeys);
|
2044
|
+
|
2045
|
+
GRN_API grn_rc grn_select(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
|
2046
|
+
const char *table, unsigned table_len,
|
2047
|
+
const char *match_columns, unsigned match_columns_len,
|
2048
|
+
const char *query, unsigned query_len,
|
2049
|
+
const char *filter, unsigned filter_len,
|
2050
|
+
const char *scorer, unsigned scorer_len,
|
2051
|
+
const char *sortby, unsigned sortby_len,
|
2052
|
+
const char *output_columns, unsigned output_columns_len,
|
2053
|
+
int offset, int hits,
|
2054
|
+
const char *drilldown, unsigned drilldown_len,
|
2055
|
+
const char *drilldown_sortby, unsigned drilldown_sortby_len,
|
2056
|
+
const char *drilldown_output_columns,
|
2057
|
+
unsigned drilldown_output_columns_len,
|
2058
|
+
int drilldown_offset, int drilldown_hits);
|
2059
|
+
|
2060
|
+
GRN_API grn_rc grn_load(grn_ctx *ctx, grn_content_type input_type,
|
2061
|
+
const char *table, unsigned table_len,
|
2062
|
+
const char *columns, unsigned columns_len,
|
2063
|
+
const char *values, unsigned values_len,
|
2064
|
+
const char *ifexists, unsigned ifexists_len);
|
2065
|
+
|
2066
|
+
#define GRN_CTX_MORE (0x01<<0)
|
2067
|
+
#define GRN_CTX_TAIL (0x01<<1)
|
2068
|
+
#define GRN_CTX_HEAD (0x01<<2)
|
2069
|
+
#define GRN_CTX_QUIET (0x01<<3)
|
2070
|
+
#define GRN_CTX_QUIT (0x01<<4)
|
2071
|
+
|
2072
|
+
GRN_API grn_rc grn_ctx_connect(grn_ctx *ctx, const char *host, int port, int flags);
|
2073
|
+
GRN_API unsigned grn_ctx_send(grn_ctx *ctx, const char *str, unsigned int str_len, int flags);
|
2074
|
+
GRN_API unsigned grn_ctx_recv(grn_ctx *ctx, char **str, unsigned int *str_len, int *flags);
|
2075
|
+
|
2076
|
+
typedef struct _grn_ctx_info grn_ctx_info;
|
2077
|
+
|
2078
|
+
struct _grn_ctx_info {
|
2079
|
+
int fd;
|
2080
|
+
unsigned int com_status;
|
2081
|
+
grn_obj *outbuf;
|
2082
|
+
unsigned char stat;
|
2083
|
+
};
|
2084
|
+
|
2085
|
+
GRN_API grn_rc grn_ctx_info_get(grn_ctx *ctx, grn_ctx_info *info);
|
2086
|
+
|
2087
|
+
GRN_API grn_rc grn_set_segv_handler(void);
|
2088
|
+
|
2089
|
+
/* hash */
|
2090
|
+
|
2091
|
+
typedef struct _grn_hash grn_hash;
|
2092
|
+
typedef struct _grn_hash_cursor grn_hash_cursor;
|
2093
|
+
|
2094
|
+
GRN_API grn_hash *grn_hash_create(grn_ctx *ctx, const char *path, unsigned int key_size,
|
2095
|
+
unsigned int value_size, unsigned int flags);
|
2096
|
+
|
2097
|
+
GRN_API grn_hash *grn_hash_open(grn_ctx *ctx, const char *path);
|
2098
|
+
|
2099
|
+
GRN_API grn_rc grn_hash_close(grn_ctx *ctx, grn_hash *hash);
|
2100
|
+
|
2101
|
+
GRN_API grn_id grn_hash_add(grn_ctx *ctx, grn_hash *hash, const void *key,
|
2102
|
+
unsigned int key_size, void **value, int *added);
|
2103
|
+
GRN_API grn_id grn_hash_get(grn_ctx *ctx, grn_hash *hash, const void *key,
|
2104
|
+
unsigned int key_size, void **value);
|
2105
|
+
|
2106
|
+
GRN_API int grn_hash_get_key(grn_ctx *ctx, grn_hash *hash, grn_id id, void *keybuf, int bufsize);
|
2107
|
+
GRN_API int grn_hash_get_key2(grn_ctx *ctx, grn_hash *hash, grn_id id, grn_obj *bulk);
|
2108
|
+
GRN_API int grn_hash_get_value(grn_ctx *ctx, grn_hash *hash, grn_id id, void *valuebuf);
|
2109
|
+
GRN_API grn_rc grn_hash_set_value(grn_ctx *ctx, grn_hash *hash, grn_id id, void *value,
|
2110
|
+
int flags);
|
2111
|
+
|
2112
|
+
typedef struct _grn_table_delete_optarg grn_table_delete_optarg;
|
2113
|
+
|
2114
|
+
struct _grn_table_delete_optarg {
|
2115
|
+
int flags;
|
2116
|
+
int (*func)(grn_ctx *ctx, grn_obj *, grn_id, void *);
|
2117
|
+
void *func_arg;
|
2118
|
+
};
|
2119
|
+
|
2120
|
+
GRN_API grn_rc grn_hash_delete_by_id(grn_ctx *ctx, grn_hash *hash, grn_id id,
|
2121
|
+
grn_table_delete_optarg *optarg);
|
2122
|
+
GRN_API grn_rc grn_hash_delete(grn_ctx *ctx, grn_hash *hash,
|
2123
|
+
const void *key, unsigned int key_size,
|
2124
|
+
grn_table_delete_optarg *optarg);
|
2125
|
+
|
2126
|
+
GRN_API grn_hash_cursor *grn_hash_cursor_open(grn_ctx *ctx, grn_hash *hash,
|
2127
|
+
const void *min, unsigned int min_size,
|
2128
|
+
const void *max, unsigned int max_size,
|
2129
|
+
int offset, int limit, int flags);
|
2130
|
+
GRN_API grn_id grn_hash_cursor_next(grn_ctx *ctx, grn_hash_cursor *c);
|
2131
|
+
GRN_API void grn_hash_cursor_close(grn_ctx *ctx, grn_hash_cursor *c);
|
2132
|
+
|
2133
|
+
GRN_API int grn_hash_cursor_get_key(grn_ctx *ctx, grn_hash_cursor *c, void **key);
|
2134
|
+
GRN_API int grn_hash_cursor_get_value(grn_ctx *ctx, grn_hash_cursor *c, void **value);
|
2135
|
+
GRN_API grn_rc grn_hash_cursor_set_value(grn_ctx *ctx, grn_hash_cursor *c,
|
2136
|
+
void *value, int flags);
|
2137
|
+
|
2138
|
+
GRN_API int grn_hash_cursor_get_key_value(grn_ctx *ctx, grn_hash_cursor *c,
|
2139
|
+
void **key, unsigned int *key_size, void **value);
|
2140
|
+
|
2141
|
+
GRN_API grn_rc grn_hash_cursor_delete(grn_ctx *ctx, grn_hash_cursor *c,
|
2142
|
+
grn_table_delete_optarg *optarg);
|
2143
|
+
|
2144
|
+
#define GRN_HASH_EACH(ctx,hash,id,key,key_size,value,block) do {\
|
2145
|
+
grn_hash_cursor *_sc = grn_hash_cursor_open(ctx, hash, NULL, 0, NULL, 0, 0, -1, 0); \
|
2146
|
+
if (_sc) {\
|
2147
|
+
grn_id id;\
|
2148
|
+
while ((id = grn_hash_cursor_next(ctx, _sc))) {\
|
2149
|
+
grn_hash_cursor_get_key_value(ctx, _sc, (void **)(key),\
|
2150
|
+
(key_size), (void **)(value));\
|
2151
|
+
block\
|
2152
|
+
}\
|
2153
|
+
grn_hash_cursor_close(ctx, _sc);\
|
2154
|
+
}\
|
2155
|
+
} while (0)
|
2156
|
+
|
2157
|
+
/* array */
|
2158
|
+
|
2159
|
+
typedef struct _grn_array grn_array;
|
2160
|
+
typedef struct _grn_array_cursor grn_array_cursor;
|
2161
|
+
|
2162
|
+
GRN_API grn_array *grn_array_create(grn_ctx *ctx, const char *path,
|
2163
|
+
unsigned value_size, unsigned flags);
|
2164
|
+
GRN_API grn_array *grn_array_open(grn_ctx *ctx, const char *path);
|
2165
|
+
GRN_API grn_rc grn_array_close(grn_ctx *ctx, grn_array *array);
|
2166
|
+
GRN_API grn_id grn_array_add(grn_ctx *ctx, grn_array *array, void **value);
|
2167
|
+
GRN_API int grn_array_get_value(grn_ctx *ctx, grn_array *array, grn_id id, void *valuebuf);
|
2168
|
+
GRN_API grn_rc grn_array_set_value(grn_ctx *ctx, grn_array *array, grn_id id,
|
2169
|
+
void *value, int flags);
|
2170
|
+
GRN_API grn_array_cursor *grn_array_cursor_open(grn_ctx *ctx, grn_array *array,
|
2171
|
+
grn_id min, grn_id max,
|
2172
|
+
int offset, int limit, int flags);
|
2173
|
+
GRN_API grn_id grn_array_cursor_next(grn_ctx *ctx, grn_array_cursor *c);
|
2174
|
+
GRN_API int grn_array_cursor_get_value(grn_ctx *ctx, grn_array_cursor *c, void **value);
|
2175
|
+
GRN_API grn_rc grn_array_cursor_set_value(grn_ctx *ctx, grn_array_cursor *c,
|
2176
|
+
void *value, int flags);
|
2177
|
+
GRN_API grn_rc grn_array_cursor_delete(grn_ctx *ctx, grn_array_cursor *c,
|
2178
|
+
grn_table_delete_optarg *optarg);
|
2179
|
+
GRN_API void grn_array_cursor_close(grn_ctx *ctx, grn_array_cursor *c);
|
2180
|
+
GRN_API grn_rc grn_array_delete_by_id(grn_ctx *ctx, grn_array *array, grn_id id,
|
2181
|
+
grn_table_delete_optarg *optarg);
|
2182
|
+
|
2183
|
+
GRN_API grn_id grn_array_next(grn_ctx *ctx, grn_array *array, grn_id id);
|
2184
|
+
|
2185
|
+
GRN_API void *_grn_array_get_value(grn_ctx *ctx, grn_array *array, grn_id id);
|
2186
|
+
|
2187
|
+
#define GRN_ARRAY_EACH(ctx,array,head,tail,id,value,block) do {\
|
2188
|
+
grn_array_cursor *_sc = grn_array_cursor_open(ctx, array, head, tail, 0, -1, 0); \
|
2189
|
+
if (_sc) {\
|
2190
|
+
grn_id id;\
|
2191
|
+
while ((id = grn_array_cursor_next(ctx, _sc))) {\
|
2192
|
+
grn_array_cursor_get_value(ctx, _sc, (void **)(value));\
|
2193
|
+
block\
|
2194
|
+
}\
|
2195
|
+
grn_array_cursor_close(ctx, _sc); \
|
2196
|
+
}\
|
2197
|
+
} while (0)
|
2198
|
+
|
2199
|
+
/* pat */
|
2200
|
+
|
2201
|
+
typedef struct _grn_pat grn_pat;
|
2202
|
+
typedef struct _grn_pat_cursor grn_pat_cursor;
|
2203
|
+
|
2204
|
+
GRN_API grn_pat *grn_pat_create(grn_ctx *ctx, const char *path, unsigned int key_size,
|
2205
|
+
unsigned int value_size, unsigned int flags);
|
2206
|
+
|
2207
|
+
GRN_API grn_pat *grn_pat_open(grn_ctx *ctx, const char *path);
|
2208
|
+
|
2209
|
+
GRN_API grn_rc grn_pat_close(grn_ctx *ctx, grn_pat *pat);
|
2210
|
+
|
2211
|
+
GRN_API grn_rc grn_pat_remove(grn_ctx *ctx, const char *path);
|
2212
|
+
|
2213
|
+
GRN_API grn_id grn_pat_get(grn_ctx *ctx, grn_pat *pat, const void *key,
|
2214
|
+
unsigned int key_size, void **value);
|
2215
|
+
GRN_API grn_id grn_pat_add(grn_ctx *ctx, grn_pat *pat, const void *key,
|
2216
|
+
unsigned int key_size, void **value, int *added);
|
2217
|
+
|
2218
|
+
GRN_API int grn_pat_get_key(grn_ctx *ctx, grn_pat *pat, grn_id id, void *keybuf, int bufsize);
|
2219
|
+
GRN_API int grn_pat_get_key2(grn_ctx *ctx, grn_pat *pat, grn_id id, grn_obj *bulk);
|
2220
|
+
GRN_API int grn_pat_get_value(grn_ctx *ctx, grn_pat *pat, grn_id id, void *valuebuf);
|
2221
|
+
GRN_API grn_rc grn_pat_set_value(grn_ctx *ctx, grn_pat *pat, grn_id id,
|
2222
|
+
void *value, int flags);
|
2223
|
+
|
2224
|
+
GRN_API grn_rc grn_pat_delete_by_id(grn_ctx *ctx, grn_pat *pat, grn_id id,
|
2225
|
+
grn_table_delete_optarg *optarg);
|
2226
|
+
GRN_API grn_rc grn_pat_delete(grn_ctx *ctx, grn_pat *pat, const void *key, unsigned int key_size,
|
2227
|
+
grn_table_delete_optarg *optarg);
|
2228
|
+
GRN_API int grn_pat_delete_with_sis(grn_ctx *ctx, grn_pat *pat, grn_id id,
|
2229
|
+
grn_table_delete_optarg *optarg);
|
2230
|
+
|
2231
|
+
typedef struct _grn_pat_scan_hit grn_pat_scan_hit;
|
2232
|
+
|
2233
|
+
struct _grn_pat_scan_hit {
|
2234
|
+
grn_id id;
|
2235
|
+
unsigned int offset;
|
2236
|
+
unsigned int length;
|
2237
|
+
};
|
2238
|
+
|
2239
|
+
GRN_API int grn_pat_scan(grn_ctx *ctx, grn_pat *pat, const char *str, unsigned int str_len,
|
2240
|
+
grn_pat_scan_hit *sh, unsigned int sh_size, const char **rest);
|
2241
|
+
|
2242
|
+
GRN_API grn_rc grn_pat_prefix_search(grn_ctx *ctx, grn_pat *pat,
|
2243
|
+
const void *key, unsigned int key_size, grn_hash *h);
|
2244
|
+
GRN_API grn_rc grn_pat_suffix_search(grn_ctx *ctx, grn_pat *pat,
|
2245
|
+
const void *key, unsigned int key_size, grn_hash *h);
|
2246
|
+
GRN_API grn_id grn_pat_lcp_search(grn_ctx *ctx, grn_pat *pat,
|
2247
|
+
const void *key, unsigned int key_size);
|
2248
|
+
|
2249
|
+
GRN_API unsigned int grn_pat_size(grn_ctx *ctx, grn_pat *pat);
|
2250
|
+
|
2251
|
+
GRN_API grn_pat_cursor *grn_pat_cursor_open(grn_ctx *ctx, grn_pat *pat,
|
2252
|
+
const void *min, unsigned int min_size,
|
2253
|
+
const void *max, unsigned int max_size,
|
2254
|
+
int offset, int limit, int flags);
|
2255
|
+
GRN_API grn_id grn_pat_cursor_next(grn_ctx *ctx, grn_pat_cursor *c);
|
2256
|
+
GRN_API void grn_pat_cursor_close(grn_ctx *ctx, grn_pat_cursor *c);
|
2257
|
+
|
2258
|
+
GRN_API int grn_pat_cursor_get_key(grn_ctx *ctx, grn_pat_cursor *c, void **key);
|
2259
|
+
GRN_API int grn_pat_cursor_get_value(grn_ctx *ctx, grn_pat_cursor *c, void **value);
|
2260
|
+
|
2261
|
+
GRN_API int grn_pat_cursor_get_key_value(grn_ctx *ctx, grn_pat_cursor *c,
|
2262
|
+
void **key, unsigned int *key_size, void **value);
|
2263
|
+
GRN_API grn_rc grn_pat_cursor_set_value(grn_ctx *ctx, grn_pat_cursor *c,
|
2264
|
+
void *value, int flags);
|
2265
|
+
GRN_API grn_rc grn_pat_cursor_delete(grn_ctx *ctx, grn_pat_cursor *c,
|
2266
|
+
grn_table_delete_optarg *optarg);
|
2267
|
+
|
2268
|
+
#define GRN_PAT_EACH(ctx,pat,id,key,key_size,value,block) do { \
|
2269
|
+
grn_pat_cursor *_sc = grn_pat_cursor_open(ctx, pat, NULL, 0, NULL, 0, 0, -1, 0); \
|
2270
|
+
if (_sc) {\
|
2271
|
+
grn_id id;\
|
2272
|
+
while ((id = grn_pat_cursor_next(ctx, _sc))) {\
|
2273
|
+
grn_pat_cursor_get_key_value(ctx, _sc, (void **)(key),\
|
2274
|
+
(key_size), (void **)(value));\
|
2275
|
+
block\
|
2276
|
+
}\
|
2277
|
+
grn_pat_cursor_close(ctx, _sc);\
|
2278
|
+
}\
|
2279
|
+
} while (0)
|
2280
|
+
|
2281
|
+
#ifdef __cplusplus
|
2282
|
+
}
|
2283
|
+
#endif
|
2284
|
+
|
2285
|
+
#endif /* GROONGA_H */
|