1 | /* -*- c-basic-offset: 2 -*- */ |
2 | /* |
3 | Copyright(C) 2009-2016 Brazil |
4 | |
5 | This library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License version 2.1 as published by the Free Software Foundation. |
8 | |
9 | This library is distributed in the hope that it will be useful, |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | Lesser General Public License for more details. |
13 | |
14 | You should have received a copy of the GNU Lesser General Public |
15 | License along with this library; if not, write to the Free Software |
16 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
17 | */ |
18 | |
19 | #pragma once |
20 | |
21 | #ifndef GRN_CTX_H |
22 | # include "grn_ctx.h" |
23 | #endif /* GRN_CTX_H */ |
24 | |
25 | #ifndef GRN_COM_H |
26 | # include "grn_com.h" |
27 | #endif /* GRN_COM_H */ |
28 | |
29 | #include "grn_msgpack.h" |
30 | |
31 | #ifdef GRN_WITH_MRUBY |
32 | # include <mruby.h> |
33 | #endif |
34 | |
35 | #ifdef __cplusplus |
36 | extern "C" { |
37 | #endif |
38 | |
39 | /**** grn_expr ****/ |
40 | |
41 | #define GRN_EXPR_MISSING_NAME "expr_missing" |
42 | |
43 | /**** grn_ctx_impl ****/ |
44 | |
45 | #define GRN_CTX_INITED 0x00 |
46 | #define GRN_CTX_QUITTING 0x0f |
47 | |
48 | typedef enum { |
49 | GRN_LOADER_BEGIN = 0, |
50 | GRN_LOADER_TOKEN, |
51 | GRN_LOADER_STRING, |
52 | GRN_LOADER_SYMBOL, |
53 | GRN_LOADER_NUMBER, |
54 | GRN_LOADER_STRING_ESC, |
55 | GRN_LOADER_UNICODE0, |
56 | GRN_LOADER_UNICODE1, |
57 | GRN_LOADER_UNICODE2, |
58 | GRN_LOADER_UNICODE3, |
59 | GRN_LOADER_END |
60 | } grn_loader_stat; |
61 | |
62 | /* |
63 | * Status of target columns used in Format 1. |
64 | * Target columns are specified via --columns or the first array in a Format 1 |
65 | * JSON object. |
66 | */ |
67 | typedef enum { |
68 | GRN_LOADER_COLUMNS_UNSET = 0, /* Columns are not available. */ |
69 | GRN_LOADER_COLUMNS_SET, /* Columns are available. */ |
70 | GRN_LOADER_COLUMNS_BROKEN /* Columns are specified but broken. */ |
71 | } grn_loader_columns_status; |
72 | |
73 | typedef struct { |
74 | grn_obj values; |
75 | grn_obj level; |
76 | grn_obj columns; |
77 | grn_obj ids; |
78 | grn_obj return_codes; |
79 | grn_obj error_messages; |
80 | uint32_t emit_level; |
81 | int32_t id_offset; /* Position of _id in values or -1 if _id is N/A. */ |
82 | int32_t key_offset; /* Position of _key in values or -1 if _key is N/A. */ |
83 | grn_obj *table; |
84 | grn_obj *last; |
85 | grn_obj *ifexists; |
86 | grn_obj *each; |
87 | uint32_t unichar; |
88 | uint32_t values_size; |
89 | uint32_t nrecords; |
90 | grn_loader_stat stat; |
91 | grn_content_type input_type; |
92 | grn_loader_columns_status columns_status; |
93 | grn_rc rc; |
94 | char errbuf[GRN_CTX_MSGSIZE]; |
95 | grn_bool output_ids; |
96 | grn_bool output_errors; |
97 | } grn_loader; |
98 | |
99 | #define GRN_CTX_N_SEGMENTS 512 |
100 | |
101 | #ifdef USE_MEMORY_DEBUG |
102 | typedef struct _grn_alloc_info grn_alloc_info; |
103 | struct _grn_alloc_info |
104 | { |
105 | void *address; |
106 | int freed; |
107 | size_t size; |
108 | char alloc_backtrace[4096]; |
109 | char free_backtrace[4096]; |
110 | char *file; |
111 | int line; |
112 | char *func; |
113 | grn_alloc_info *next; |
114 | }; |
115 | #endif |
116 | |
117 | typedef struct _grn_mrb_data grn_mrb_data; |
118 | struct _grn_mrb_data { |
119 | grn_bool initialized; |
120 | #ifdef GRN_WITH_MRUBY |
121 | mrb_state *state; |
122 | char base_directory[PATH_MAX]; |
123 | struct RClass *module; |
124 | struct RClass *object_class; |
125 | grn_hash *checked_procs; |
126 | grn_hash *registered_plugins; |
127 | struct { |
128 | grn_obj from; |
129 | grn_obj to; |
130 | } buffer; |
131 | struct { |
132 | struct RClass *time_class; |
133 | } builtin; |
134 | struct { |
135 | struct RClass *operator_class; |
136 | } groonga; |
137 | #endif |
138 | }; |
139 | |
140 | struct _grn_ctx_impl { |
141 | grn_encoding encoding; |
142 | |
143 | /* memory pool portion */ |
144 | int32_t lifoseg; |
145 | int32_t currseg; |
146 | grn_critical_section lock; |
147 | grn_io_mapinfo segs[GRN_CTX_N_SEGMENTS]; |
148 | |
149 | #ifdef USE_DYNAMIC_MALLOC_CHANGE |
150 | /* memory allocation portion */ |
151 | grn_malloc_func malloc_func; |
152 | grn_calloc_func calloc_func; |
153 | grn_realloc_func realloc_func; |
154 | grn_strdup_func strdup_func; |
155 | grn_free_func free_func; |
156 | #endif |
157 | |
158 | #ifdef USE_MEMORY_DEBUG |
159 | /* memory debug portion */ |
160 | grn_alloc_info *alloc_info; |
161 | #endif |
162 | |
163 | /* expression portion */ |
164 | grn_obj *stack[GRN_STACK_SIZE]; |
165 | uint32_t stack_curr; |
166 | grn_hash *expr_vars; |
167 | grn_obj *curr_expr; |
168 | grn_obj current_request_id; |
169 | void *current_request_timer_id; |
170 | void *parser; |
171 | grn_timeval tv; |
172 | |
173 | /* loader portion */ |
174 | grn_edge *edge; |
175 | grn_loader loader; |
176 | |
177 | /* plugin portion */ |
178 | const char *plugin_path; |
179 | |
180 | /* output portion */ |
181 | struct { |
182 | grn_obj *buf; |
183 | void (*func)(grn_ctx *, int, void *); |
184 | union { |
185 | void *ptr; |
186 | int fd; |
187 | uint32_t u32; |
188 | uint64_t u64; |
189 | } data; |
190 | grn_content_type type; |
191 | const char *mime_type; |
192 | grn_bool is_pretty; |
193 | grn_obj names; |
194 | grn_obj levels; |
195 | #ifdef GRN_WITH_MESSAGE_PACK |
196 | msgpack_packer msgpacker; |
197 | #endif |
198 | } output; |
199 | |
200 | struct { |
201 | int flags; |
202 | grn_command_version version; |
203 | struct { |
204 | grn_obj *command; |
205 | grn_command_version version; |
206 | } keep; |
207 | } command; |
208 | |
209 | /* match escalation portion */ |
210 | int64_t match_escalation_threshold; |
211 | |
212 | /* lifetime portion */ |
213 | grn_proc_func *finalizer; |
214 | |
215 | grn_obj *db; |
216 | grn_array *values; /* temporary objects */ |
217 | grn_pat *temporary_columns; |
218 | grn_hash *ios; /* IOs */ |
219 | grn_com *com; |
220 | unsigned int com_status; |
221 | |
222 | grn_obj query_log_buf; |
223 | |
224 | char previous_errbuf[GRN_CTX_MSGSIZE]; |
225 | unsigned int n_same_error_messages; |
226 | |
227 | grn_mrb_data mrb; |
228 | |
229 | struct { |
230 | grn_obj stack; |
231 | grn_obj *current; |
232 | } temporary_open_spaces; |
233 | }; |
234 | |
235 | #ifdef __cplusplus |
236 | } |
237 | #endif |
238 | |