Groonga
Loading...
Searching...
No Matches
command_arguments.hpp
Go to the documentation of this file.
1/*
2 Copyright (C) 2022-2023 Sutou Kouhei <kou@clear-code.com>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
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#include <groonga.h>
22#include <groonga/plugin.h>
23
24#include <string>
25
26namespace grn {
37
39 class Cursor {
40 public:
41 Cursor(grn_ctx *ctx, grn_table_cursor *cursor)
42 : ctx_(ctx),
43 cursor_(cursor),
44 id_(cursor ? grn_table_cursor_next(ctx_, cursor_) : GRN_ID_NIL)
45 {
46 }
47
48 ~Cursor()
49 {
50 if (cursor_) {
51 grn_table_cursor_close(ctx_, cursor_);
52 }
53 }
54
55 Cursor &
56 operator++()
57 {
58 id_ = grn_table_cursor_next(ctx_, cursor_);
59 return *this;
60 }
61
63 operator*() const
64 {
65 void *key;
66 uint32_t key_size;
67 void *value;
68 grn_table_cursor_get_key_value(ctx_, cursor_, &key, &key_size, &value);
69 return CommandArgument(
70 grn_raw_string{static_cast<const char *>(key), key_size},
71 static_cast<grn_obj *>(value));
72 }
73
74 bool
75 operator==(Cursor &other)
76 {
77 return id_ == other.id_;
78 }
79
80 bool
81 operator!=(Cursor &other)
82 {
83 return id_ != other.id_;
84 }
85
86 private:
87 grn_ctx *ctx_;
88 grn_table_cursor *cursor_;
89 grn_id id_;
90 };
91
92 public:
94 : ctx_(ctx),
95 user_data_(user_data)
96 {
97 }
98
100
101 Cursor
103 {
104 auto vars = grn_plugin_proc_get_vars(ctx_, user_data_);
105 auto cursor = grn_table_cursor_open(ctx_,
106 vars,
107 NULL,
108 0,
109 NULL,
110 0,
111 0,
112 -1,
114 return Cursor(ctx_, cursor);
115 }
116
117 Cursor
119 {
120 return Cursor(ctx_, nullptr);
121 }
122
123 grn_obj *
124 get(const char *prefix, const char *name, const char *fallback_name)
125 {
126 std::string name_buffer;
127 const char *full_name;
128 if (prefix) {
129 name_buffer = prefix;
130 name_buffer += name;
131 full_name = name_buffer.c_str();
132 } else {
133 full_name = name;
134 }
135 auto arg = grn_plugin_proc_get_var(ctx_, user_data_, full_name, -1);
136 if (arg && GRN_TEXT_LEN(arg) > 0) {
137 return arg;
138 }
139
140 if (fallback_name) {
141 const char *full_fallback_name;
142 if (prefix) {
143 name_buffer = prefix;
144 name_buffer += fallback_name;
145 full_fallback_name = name_buffer.c_str();
146 } else {
147 full_fallback_name = fallback_name;
148 }
149 arg = grn_plugin_proc_get_var(ctx_, user_data_, full_fallback_name, -1);
150 if (arg && GRN_TEXT_LEN(arg) > 0) {
151 return arg;
152 }
153 }
154
155 return arg;
156 }
157
158 grn_obj *
159 get(const char *name)
160 {
161 return get(nullptr, name, nullptr);
162 }
163
164 grn_obj *
165 get(const char *prefix, const char *name)
166 {
167 return get(prefix, name, nullptr);
168 }
169
170 grn_obj *
171 get(const char *prefix,
172 const char *fallback_prefix,
173 const char *name,
174 const char *fallback_name)
175 {
176 auto arg = get(prefix, name, fallback_name);
177 if (arg && GRN_TEXT_LEN(arg) > 0) {
178 return arg;
179 }
180 if (!fallback_prefix) {
181 return arg;
182 }
183 return get(fallback_prefix, name, fallback_name);
184 }
185
186 bool
187 get_bool(const char *name, bool default_value)
188 {
189 return arg_to_bool(get(name), default_value);
190 }
191
192 bool
193 get_bool(const char *prefix, const char *name, bool default_value)
194 {
195 return arg_to_bool(get(prefix, name), default_value);
196 }
197
198 bool
199 get_bool(const char *prefix,
200 const char *name,
201 const char *fallback_name,
202 bool default_value)
203 {
204 return arg_to_bool(get(prefix, name, fallback_name), default_value);
205 }
206
207 bool
208 get_bool(const char *prefix,
209 const char *fallback_prefix,
210 const char *name,
211 const char *fallback_name,
212 bool default_value)
213 {
214 return arg_to_bool(get(prefix, fallback_prefix, name, fallback_name),
215 default_value);
216 }
217
219 get_string(const char *name,
220 grn_raw_string default_value = default_string_value())
221 {
222 return arg_to_string(get(name), default_value);
223 }
224
226 get_string(const char *prefix,
227 const char *name,
228 grn_raw_string default_value = default_string_value())
229 {
230 return arg_to_string(get(prefix, name), default_value);
231 }
232
234 get_string(const char *prefix,
235 const char *name,
236 const char *fallback_name,
237 grn_raw_string default_value = default_string_value())
238 {
239 return arg_to_string(get(prefix, name, fallback_name), default_value);
240 }
241
243 get_string(const char *prefix,
244 const char *fallback_prefix,
245 const char *name,
246 const char *fallback_name,
247 grn_raw_string default_value = default_string_value())
248 {
249 return arg_to_string(get(prefix, fallback_prefix, name, fallback_name),
250 default_value);
251 }
252
253 int32_t
254 get_int32(const char *name, int32_t default_value)
255 {
256 return arg_to_int32(get(name), default_value);
257 }
258
259 int32_t
260 get_int32(const char *prefix, const char *name, int32_t default_value)
261 {
262 return arg_to_int32(get(prefix, name), default_value);
263 }
264
265 int32_t
266 get_int32(const char *prefix,
267 const char *name,
268 const char *fallback_name,
269 int32_t default_value)
270 {
271 return arg_to_int32(get(prefix, name, fallback_name), default_value);
272 }
273
274 int32_t
275 get_int32(const char *prefix,
276 const char *fallback_prefix,
277 const char *name,
278 const char *fallback_name,
279 int32_t default_value)
280 {
281 return arg_to_int32(get(prefix, fallback_prefix, name, fallback_name),
282 default_value);
283 }
284
285 uint32_t
286 get_uint32(const char *name, uint32_t default_value)
287 {
288 return arg_to_uint32(get(name), default_value);
289 }
290
291 uint32_t
292 get_uint32(const char *prefix, const char *name, uint32_t default_value)
293 {
294 return arg_to_uint32(get(prefix, name), default_value);
295 }
296
297 uint32_t
298 get_uint32(const char *prefix,
299 const char *name,
300 const char *fallback_name,
301 uint32_t default_value)
302 {
303 return arg_to_uint32(get(prefix, name, fallback_name), default_value);
304 }
305
306 uint32_t
307 get_uint32(const char *prefix,
308 const char *fallback_prefix,
309 const char *name,
310 const char *fallback_name,
311 uint32_t default_value)
312 {
313 return arg_to_uint32(get(prefix, fallback_prefix, name, fallback_name),
314 default_value);
315 }
316
317 float
318 get_float(const char *name, float default_value)
319 {
320 return arg_to_float(get(name), default_value);
321 }
322
323 float
324 get_float(const char *prefix, const char *name, float default_value)
325 {
326 return arg_to_float(get(prefix, name), default_value);
327 }
328
329 float
330 get_float(const char *prefix,
331 const char *name,
332 const char *fallback_name,
333 float default_value)
334 {
335 return arg_to_float(get(prefix, name, fallback_name), default_value);
336 }
337
338 float
339 get_float(const char *prefix,
340 const char *fallback_prefix,
341 const char *name,
342 const char *fallback_name,
343 float default_value)
344 {
345 return arg_to_float(get(prefix, fallback_prefix, name, fallback_name),
346 default_value);
347 }
348
349 private:
350 grn_ctx *ctx_;
351 grn_user_data *user_data_;
352
353 bool
354 arg_to_bool(grn_obj *arg, bool default_value);
355
356 static grn_raw_string
357 default_string_value()
358 {
359 return grn_raw_string{nullptr, 0};
360 }
361
363 arg_to_string(grn_obj *arg, grn_raw_string default_value)
364 {
365 if (arg && GRN_TEXT_LEN(arg) > 0) {
366 return grn_raw_string{GRN_TEXT_VALUE(arg), GRN_TEXT_LEN(arg)};
367 } else {
368 return default_value;
369 }
370 }
371
372 int32_t
373 arg_to_int32(grn_obj *arg, int32_t default_value);
374
375 uint32_t
376 arg_to_uint32(grn_obj *arg, uint32_t default_value);
377
378 float
379 arg_to_float(grn_obj *arg, float default_value);
380 };
381} // namespace grn
Definition command_arguments.hpp:38
float get_float(const char *prefix, const char *fallback_prefix, const char *name, const char *fallback_name, float default_value)
Definition command_arguments.hpp:339
int32_t get_int32(const char *prefix, const char *fallback_prefix, const char *name, const char *fallback_name, int32_t default_value)
Definition command_arguments.hpp:275
~CommandArguments()
Definition command_arguments.hpp:99
grn_obj * get(const char *name)
Definition command_arguments.hpp:159
bool get_bool(const char *prefix, const char *name, bool default_value)
Definition command_arguments.hpp:193
uint32_t get_uint32(const char *name, uint32_t default_value)
Definition command_arguments.hpp:286
grn_raw_string get_string(const char *prefix, const char *name, const char *fallback_name, grn_raw_string default_value=default_string_value())
Definition command_arguments.hpp:234
bool get_bool(const char *prefix, const char *fallback_prefix, const char *name, const char *fallback_name, bool default_value)
Definition command_arguments.hpp:208
uint32_t get_uint32(const char *prefix, const char *fallback_prefix, const char *name, const char *fallback_name, uint32_t default_value)
Definition command_arguments.hpp:307
float get_float(const char *name, float default_value)
Definition command_arguments.hpp:318
int32_t get_int32(const char *prefix, const char *name, const char *fallback_name, int32_t default_value)
Definition command_arguments.hpp:266
grn_obj * get(const char *prefix, const char *name)
Definition command_arguments.hpp:165
CommandArguments(grn_ctx *ctx, grn_user_data *user_data)
Definition command_arguments.hpp:93
uint32_t get_uint32(const char *prefix, const char *name, uint32_t default_value)
Definition command_arguments.hpp:292
int32_t get_int32(const char *prefix, const char *name, int32_t default_value)
Definition command_arguments.hpp:260
grn_raw_string get_string(const char *prefix, const char *name, grn_raw_string default_value=default_string_value())
Definition command_arguments.hpp:226
bool get_bool(const char *prefix, const char *name, const char *fallback_name, bool default_value)
Definition command_arguments.hpp:199
Cursor end()
Definition command_arguments.hpp:118
Cursor begin()
Definition command_arguments.hpp:102
grn_obj * get(const char *prefix, const char *name, const char *fallback_name)
Definition command_arguments.hpp:124
grn_obj * get(const char *prefix, const char *fallback_prefix, const char *name, const char *fallback_name)
Definition command_arguments.hpp:171
bool get_bool(const char *name, bool default_value)
Definition command_arguments.hpp:187
int32_t get_int32(const char *name, int32_t default_value)
Definition command_arguments.hpp:254
float get_float(const char *prefix, const char *name, const char *fallback_name, float default_value)
Definition command_arguments.hpp:330
grn_raw_string get_string(const char *name, grn_raw_string default_value=default_string_value())
Definition command_arguments.hpp:219
uint32_t get_uint32(const char *prefix, const char *name, const char *fallback_name, uint32_t default_value)
Definition command_arguments.hpp:298
grn_raw_string get_string(const char *prefix, const char *fallback_prefix, const char *name, const char *fallback_name, grn_raw_string default_value=default_string_value())
Definition command_arguments.hpp:243
float get_float(const char *prefix, const char *name, float default_value)
Definition command_arguments.hpp:324
uint32_t grn_id
Definition groonga.h:44
#define GRN_TEXT_VALUE(obj)
Definition groonga.h:2785
#define GRN_ID_NIL
Means "does not exist".
Definition groonga.h:55
#define GRN_TEXT_LEN(obj)
Definition groonga.h:2786
Definition arrow.hpp:25
GRN_API grn_obj * grn_plugin_proc_get_var(grn_ctx *ctx, grn_user_data *user_data, const char *name, int name_size)
GRN_API grn_obj * grn_plugin_proc_get_vars(grn_ctx *ctx, grn_user_data *user_data)
Definition groonga.h:351
Definition groonga.h:919
Definition command_arguments.hpp:27
CommandArgument(grn_raw_string name, grn_obj *value)
Definition command_arguments.hpp:28
grn_obj * value
Definition command_arguments.hpp:35
grn_raw_string name
Definition command_arguments.hpp:34
Definition raw_string.h:83
GRN_API grn_rc grn_table_cursor_close(grn_ctx *ctx, grn_table_cursor *tc)
Free the cursor created by grn_table_cursor_open()
GRN_API grn_id grn_table_cursor_next(grn_ctx *ctx, grn_table_cursor *tc)
Move the cursur forward to the next and return its record ID. Return GRN_ID_NIL when the end is reach...
GRN_API grn_table_cursor * grn_table_cursor_open(grn_ctx *ctx, grn_obj *table, const void *min, unsigned int min_size, const void *max, unsigned int max_size, int offset, int limit, int flags)
Creates and returns a cursor to retrieve the records registered in the table in order.
#define GRN_CURSOR_ASCENDING
Definition table.h:273
GRN_API uint32_t grn_table_cursor_get_key_value(grn_ctx *ctx, grn_table_cursor *tc, void **key, uint32_t *key_size, void **value)
Definition groonga.h:339