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
36extern "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
48typedef 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 */
67typedef 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
73typedef 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
102typedef struct _grn_alloc_info grn_alloc_info;
103struct _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
117typedef struct _grn_mrb_data grn_mrb_data;
118struct _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
140struct _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