oinky 0.1.0

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.
Files changed (41) hide show
  1. data/LICENSE +22 -0
  2. data/README.md +141 -0
  3. data/ext/extconf.rb +79 -0
  4. data/ext/include/oinky.h +424 -0
  5. data/ext/include/oinky.hpp +63 -0
  6. data/ext/include/oinky/nky_base.hpp +1116 -0
  7. data/ext/include/oinky/nky_core.hpp +1603 -0
  8. data/ext/include/oinky/nky_cursor.hpp +665 -0
  9. data/ext/include/oinky/nky_dialect.hpp +107 -0
  10. data/ext/include/oinky/nky_error.hpp +164 -0
  11. data/ext/include/oinky/nky_fixed_table.hpp +710 -0
  12. data/ext/include/oinky/nky_handle.hpp +334 -0
  13. data/ext/include/oinky/nky_index.hpp +1038 -0
  14. data/ext/include/oinky/nky_log.hpp +15 -0
  15. data/ext/include/oinky/nky_merge_itr.hpp +403 -0
  16. data/ext/include/oinky/nky_model.hpp +110 -0
  17. data/ext/include/oinky/nky_pool.hpp +760 -0
  18. data/ext/include/oinky/nky_public.hpp +808 -0
  19. data/ext/include/oinky/nky_serializer.hpp +1625 -0
  20. data/ext/include/oinky/nky_strtable.hpp +504 -0
  21. data/ext/include/oinky/nky_table.hpp +1996 -0
  22. data/ext/nky_lib.cpp +390 -0
  23. data/ext/nky_lib_core.hpp +212 -0
  24. data/ext/nky_lib_index.cpp +158 -0
  25. data/ext/nky_lib_table.cpp +224 -0
  26. data/lib/oinky.rb +1284 -0
  27. data/lib/oinky/compiler.rb +106 -0
  28. data/lib/oinky/cpp_emitter.rb +311 -0
  29. data/lib/oinky/dsl.rb +167 -0
  30. data/lib/oinky/error.rb +19 -0
  31. data/lib/oinky/modelbase.rb +12 -0
  32. data/lib/oinky/nbuffer.rb +152 -0
  33. data/lib/oinky/normalize.rb +132 -0
  34. data/lib/oinky/oc_builder.rb +44 -0
  35. data/lib/oinky/query.rb +193 -0
  36. data/lib/oinky/rb_emitter.rb +147 -0
  37. data/lib/oinky/shard.rb +40 -0
  38. data/lib/oinky/testsup.rb +104 -0
  39. data/lib/oinky/version.rb +9 -0
  40. data/oinky.gemspec +36 -0
  41. metadata +120 -0
@@ -0,0 +1,390 @@
1
+ // This source is distributed under the terms of the MIT License. Refer
2
+ // to the 'LICENSE' file for details.
3
+ //
4
+ // Copyright (c) Jacob Lacouture, 2012
5
+
6
+ #include "nky_lib_core.hpp"
7
+
8
+
9
+ const char *convert_oinky_error(oinky_error err)
10
+ {
11
+ return Oinky::Errors::oinky_category_impl::messagebytes(-(int)err);
12
+ }
13
+
14
+ oinky_db_variant _nky_variant_from_immediate_s(const char *str) {
15
+ return nky_variant_from_immediate_s(str);
16
+ }
17
+ oinky_db_variant _nky_variant_from_immediate_dt(oinky_datetime_t dt) {
18
+ return nky_variant_from_immediate_dt(dt);
19
+ }
20
+ //int
21
+ oinky_db_variant _nky_variant_from_immediate_i64(int64_t x) {
22
+ return nky_variant_from_immediate_i64(x);
23
+ }
24
+ oinky_db_variant _nky_variant_from_immediate_i32(int32_t x) {
25
+ return nky_variant_from_immediate_i32(x);
26
+ }
27
+ oinky_db_variant _nky_variant_from_immediate_i16(int16_t x) {
28
+ return nky_variant_from_immediate_i16(x);
29
+ }
30
+ oinky_db_variant _nky_variant_from_immediate_i8(int8_t x) {
31
+ return nky_variant_from_immediate_i8(x);
32
+ }
33
+ //uint
34
+ oinky_db_variant _nky_variant_from_immediate_ui64(uint64_t x) {
35
+ return nky_variant_from_immediate_ui64(x);
36
+ }
37
+ oinky_db_variant _nky_variant_from_immediate_ui32(uint32_t x) {
38
+ return nky_variant_from_immediate_ui32(x);
39
+ }
40
+ oinky_db_variant _nky_variant_from_immediate_ui16(uint16_t x) {
41
+ return nky_variant_from_immediate_ui16(x);
42
+ }
43
+ oinky_db_variant _nky_variant_from_immediate_ui8(uint8_t x) {
44
+ return nky_variant_from_immediate_ui8(x);
45
+ }
46
+ //float
47
+ oinky_db_variant _nky_variant_from_immediate_f64(float64_t x) {
48
+ return nky_variant_from_immediate_f64(x);
49
+ }
50
+ oinky_db_variant _nky_variant_from_immediate_f32(float32_t x) {
51
+ return nky_variant_from_immediate_f32(x);
52
+ }
53
+
54
+ oinky_db_variant _nky_variant_from_immediate_bit(int x) {
55
+ return nky_variant_from_immediate_bit(x);
56
+ }
57
+
58
+ oinky_error nky_pack_datetime(oinky_datetime_t *dt, nky_datetime_unpacked unpacked)
59
+ {
60
+ dt->value = datetime_t::compose(
61
+ unpacked.years_since_1900,
62
+ unpacked.months_since_january,
63
+ unpacked.days_since_first_of_month,
64
+ unpacked.hours_since_midnight,
65
+ unpacked.minutes_since_hour,
66
+ unpacked.seconds_since_minute,
67
+ unpacked.microseconds_since_second)._val;
68
+ return nky_success;
69
+ }
70
+
71
+ oinky_error nky_unpack_datetime(oinky_datetime_t packed, nky_datetime_unpacked *unpacked)
72
+ {
73
+ datetime_t dt;
74
+ dt._val = packed.value;
75
+ unpacked->years_since_1900 = dt.years_since_1900();
76
+ unpacked->months_since_january = dt.months_since_january();
77
+ unpacked->days_since_first_of_month = dt.days_since_first_of_month();
78
+ unpacked->hours_since_midnight = dt.hours_since_midnight();
79
+ unpacked->minutes_since_hour = dt.minutes_since_hour();
80
+ unpacked->seconds_since_minute = dt.seconds_since_minute();
81
+ unpacked->microseconds_since_second = dt.microseconds_since_second();
82
+ return nky_success;
83
+ }
84
+
85
+
86
+ //#############################################################################
87
+ // Managing DB instances
88
+
89
+ // Allocate a new, empty DB instance. This must be freed with oinky_db_free.
90
+ // Returns NULL on error.
91
+ oinky_db_handle_t *oinky_db_new()
92
+ {
93
+ oinky_db_handle_t *db = new oinky_db_handle_t();
94
+ return db;
95
+ }
96
+
97
+ // Create a new DB instance from serialized bytes. The new handle will
98
+ // continue to access the given buffer until it is destroyed and the caller
99
+ // should manage the lifetimes of both the DB handle and bytestring appropriately.
100
+ static oinky_error oinky_db_mount_impl(oinky_db_handle_t **handle, size_t bufferlen, const char *bytes)
101
+ {
102
+ if (bufferlen > (1 << 30)) {
103
+ throw_error(Oinky::Errors::invalid_argument());
104
+ }
105
+ auto_ptr<oinky_db_handle_t> db(new oinky_db_handle_t());
106
+ db_t::mount(&db->db, bytes, (uint32) bufferlen);
107
+ // Caller now owns the reference.
108
+ *handle = db.release();
109
+ return nky_success;
110
+ }
111
+
112
+ oinky_error oinky_db_mount(oinky_db_handle_t **handle, size_t bufferlen, const char *bytes)
113
+ {
114
+ return wrap_exception(boost::bind(oinky_db_mount_impl, handle, bufferlen, bytes));
115
+ }
116
+
117
+ // Destroy and deallocate an oinky DB instance.
118
+ void oinky_db_free(oinky_db_handle_t *db)
119
+ {
120
+ delete db;
121
+ }
122
+
123
+ static oinky_error oinky_db_prepare_pack_impl(oinky_db_handle_t *db, size_t *required_bytes)
124
+ {
125
+ *required_bytes = db->db.prepare_pack();
126
+ return nky_success;
127
+ }
128
+
129
+ // Compute the number of bytes required to serialize the given database.
130
+ oinky_error oinky_db_prepare_pack(oinky_db_handle_t *db, size_t *required_bytes)
131
+ {
132
+ return wrap_exception(boost::bind(oinky_db_prepare_pack_impl, db, required_bytes));
133
+ }
134
+ // Serialize the database to the given buffer.
135
+ static oinky_error oinky_db_complete_pack_impl(oinky_db_handle_t *db, size_t bufferlen, char *buffer)
136
+ {
137
+ if (bufferlen > (1 << 30)) {
138
+ throw_error(Oinky::Errors::invalid_argument());
139
+ }
140
+ db->db.complete_pack(buffer, (uint32) bufferlen);
141
+ return nky_success;
142
+ }
143
+ oinky_error oinky_db_complete_pack(oinky_db_handle_t *db, size_t bufferlen, char *buffer)
144
+ {
145
+ return wrap_exception(boost::bind(oinky_db_complete_pack_impl, db, bufferlen, buffer));
146
+ }
147
+
148
+ // Create a savepoint and save the marker at the given address.
149
+ static oinky_error oinky_db_create_savepoint_impl(oinky_db_handle_t *db, oinky_savepoint_t *sp)
150
+ {
151
+ sp_marker_t spmarker = db->db.new_sp();
152
+ *sp = (uint64_t) spmarker.val;
153
+ return nky_success;
154
+ }
155
+ oinky_error oinky_db_create_savepoint(oinky_db_handle_t *db, oinky_savepoint_t *sp)
156
+ {
157
+ return wrap_exception(boost::bind(oinky_db_create_savepoint_impl, db, sp));
158
+ }
159
+ static oinky_error oinky_db_savepoint_rollback_impl(oinky_db_handle_t *db, oinky_savepoint_t sp)
160
+ {
161
+ sp_marker_t spmarker;
162
+ spmarker.val = (uint32_t) sp;
163
+ db->db.sp_rollback(spmarker);
164
+ return nky_success;
165
+ }
166
+ oinky_error oinky_db_savepoint_rollback(oinky_db_handle_t *db, oinky_savepoint_t sp)
167
+ {
168
+ return wrap_exception(boost::bind(oinky_db_savepoint_rollback_impl, db, sp));
169
+ }
170
+
171
+ //##############
172
+ // Stats/Properties
173
+
174
+ int oinky_db_is_modified_since(oinky_db_handle_t *db, oinky_savepoint_t sp)
175
+ {
176
+ sp_marker_t spmarker;
177
+ spmarker.val = (uint32_t) sp;
178
+ return db->db.modified_since(spmarker) ? 1 : 0;
179
+ }
180
+
181
+ size_t oinky_table_count(oinky_db_handle_t *db)
182
+ {
183
+ //TBD: This should be more efficient.
184
+ return std::distance(db->db.tables().begin(), db->db.tables().end());
185
+ }
186
+
187
+ size_t oinky_tbl_column_count(oinky_table_handle_t *table)
188
+ {
189
+ return make_handle(table).columns().count();
190
+ }
191
+
192
+ size_t oinky_idx_column_count(oinky_index_handle_t *index)
193
+ {
194
+ return make_handle(index).column_count();
195
+ }
196
+
197
+ size_t oinky_tbl_index_count(oinky_table_handle_t *table)
198
+ {
199
+ return make_handle(table).indices().count();
200
+ }
201
+
202
+ size_t oinky_tbl_row_count(oinky_table_handle_t *table)
203
+ {
204
+ return make_handle(table).row_count();
205
+ }
206
+
207
+ size_t oinky_idx_row_count(oinky_index_handle_t *index)
208
+ {
209
+ return make_handle(index).row_count();
210
+ }
211
+
212
+ oinky_db_string oinky_table_name(oinky_table_handle_t *table)
213
+ {
214
+ return make_str(make_handle(table).name());
215
+ }
216
+
217
+ oinky_db_string oinky_index_name(oinky_index_handle_t *index)
218
+ {
219
+ return make_str(make_handle(index).name());
220
+ }
221
+
222
+
223
+ //#############################################################################
224
+ // Enumerating objects
225
+
226
+ size_t oinky_db_get_table_handles(oinky_db_handle_t *db, oinky_table_handle_t **handle_array, size_t array_size)
227
+ {
228
+ db_t::table_itr i = db->db.tables().begin();
229
+ db_t::table_itr end = db->db.tables().end();
230
+ size_t idx=0;
231
+ for (;idx < array_size; ++idx, ++i) {
232
+ if (i == end) {
233
+ break;
234
+ }
235
+ handle_array[idx] = (oinky_table_handle_t *) i->raw();
236
+ }
237
+ return idx;
238
+ }
239
+
240
+ size_t oinky_table_get_index_handles(oinky_table_handle_t *table, oinky_index_handle_t **handle_array, size_t array_size)
241
+ {
242
+ db_t::index_itr i = make_handle(table).indices().begin();
243
+ db_t::index_itr end = make_handle(table).indices().end();
244
+ size_t idx=0;
245
+ for (;idx < array_size; ++idx, ++i) {
246
+ if (i == end) {
247
+ break;
248
+ }
249
+ handle_array[idx] = (oinky_index_handle_t *) i->raw();
250
+ }
251
+ return idx;
252
+ }
253
+
254
+ static void oinky_table_get_column_defs_impl(oinky_table_handle_t *table, oinky_column_def *def_array, size_t array_size, size_t *result)
255
+ {
256
+ db_t::column_itr i = make_handle(table).columns().begin();
257
+ db_t::column_itr end = make_handle(table).columns().end();
258
+ size_t idx=0;
259
+ for (;idx < array_size; ++idx, ++i) {
260
+ if (i == end) {
261
+ break;
262
+ }
263
+ def_array[idx].column_name = make_str(i->column_name);
264
+ def_array[idx].column_type = (oinky_column_type_code_t) i->column_type;
265
+ def_array[idx].default_value = nky_variant_from_variant(i->default_value);
266
+ }
267
+ *result = idx;
268
+ }
269
+
270
+ size_t oinky_table_get_column_defs(oinky_table_handle_t *table, oinky_column_def *def_array, size_t array_size)
271
+ {
272
+ size_t result = 0;
273
+ wrap_void(boost::bind(oinky_table_get_column_defs_impl, table, def_array, array_size, &result));
274
+ return result;
275
+ }
276
+
277
+ static oinky_error oinky_index_get_definition_impl(oinky_index_handle_t *index, oinky_db_string *name, char *is_unique, oinky_index_column_def *def_array, size_t array_size)
278
+ {
279
+ db_t::index_handle ih(make_handle(index));
280
+
281
+ if (array_size != ih.column_count()) {
282
+ return nky_invalid_argument;
283
+ }
284
+
285
+ *name = make_str(ih.name());
286
+ *is_unique = ih.is_unique() ? 1 : 0;
287
+
288
+ db_t::index_column_itr i = make_handle(index).columns().begin();
289
+ db_t::index_column_itr end = make_handle(index).columns().end();
290
+ size_t idx=0;
291
+ for (;idx < array_size; ++idx, ++i) {
292
+ if (i == end) {
293
+ break;
294
+ }
295
+ def_array[idx].column_name = make_str(i->column_name);
296
+ def_array[idx].sort_ascending = i->sort_ascending ? 1 : 0;
297
+ }
298
+ return nky_success;
299
+ }
300
+
301
+ oinky_error oinky_index_get_definition(oinky_index_handle_t *index, oinky_db_string *name, char *is_unique, oinky_index_column_def *def_array, size_t array_size)
302
+ {
303
+ return wrap_exception(boost::bind(oinky_index_get_definition_impl, index, name, is_unique, def_array, array_size));
304
+ }
305
+
306
+
307
+ //#############################################################################
308
+ // Schema Modification
309
+ static oinky_error oinky_db_create_table_impl(oinky_db_handle_t *db, const char *name, oinky_table_handle_t **handle)
310
+ {
311
+ db_t::table_itr i = db->db.tables().create(name);
312
+ *handle = (oinky_table_handle_t *) i->raw();
313
+ return nky_success;
314
+ }
315
+ oinky_error oinky_db_create_table(oinky_db_handle_t *db, const char *name, oinky_table_handle_t **handle)
316
+ {
317
+ return wrap_exception(boost::bind(oinky_db_create_table_impl, db, name, handle));
318
+ }
319
+
320
+ static oinky_error oinky_db_drop_table_impl(oinky_db_handle_t *db, db_string tblname)
321
+ {
322
+ db_t::tables_accessor_t tbs(db->db.tables());
323
+ db_t::table_itr i = tbs.find(tblname);
324
+ if (i == tbs.end()) {
325
+
326
+ throw_error(object_not_found());
327
+ }
328
+ tbs.drop(i);
329
+ return nky_success;
330
+ }
331
+ oinky_error oinky_db_drop_table(oinky_db_handle_t *db, oinky_db_string tblname)
332
+ {
333
+ return wrap_exception(boost::bind(oinky_db_drop_table_impl, db, nky_string_xform(tblname)));
334
+ }
335
+
336
+ static oinky_error oinky_table_add_index_impl(oinky_table_handle_t *table, const char *idxname, char unique, size_t col_count, const oinky_index_column_def *coldefs, oinky_index_handle_t **ih)
337
+ {
338
+ db_t::table_handle th(make_handle(table));
339
+
340
+ db_t::index_column_def *defs = (db_t::index_column_def *) alloca(sizeof(db_t::index_column_def) * col_count);
341
+ for (size_t i=0;i<col_count;++i) {
342
+ defs[i].column_name = nky_string_xform(coldefs[i].column_name);
343
+ defs[i].sort_ascending = coldefs[i].sort_ascending != 0;
344
+ }
345
+
346
+ // db_t::column_selector_t cs = th.select(colnames, colnames + col_count);
347
+ db_t::index_itr it = th.indices().create(
348
+ db_string(idxname),
349
+ unique ? Oinky::Unique : Oinky::NonUnique,
350
+ defs, defs + col_count);
351
+ *ih = (oinky_index_handle_t *) it->raw();
352
+ return nky_success;
353
+ }
354
+
355
+ oinky_error oinky_table_add_index(oinky_table_handle_t *table, const char *idxname, char unique, size_t col_count, const oinky_index_column_def *coldefs, oinky_index_handle_t **ih)
356
+ {
357
+ return wrap_exception(boost::bind(oinky_table_add_index_impl, table, idxname, unique, col_count, coldefs, ih));
358
+ }
359
+
360
+ //##############
361
+ // Data Access
362
+
363
+ static oinky_error oinky_table_make_column_selector_impl(oinky_table_handle_t *table, size_t col_count, char **colnames, oinky_column_selector_t **selector)
364
+ {
365
+ auto_ptr<oinky_column_selector_t> s(new oinky_column_selector_t());
366
+ s->cs = make_handle(table).make_selector(colnames, colnames + col_count);
367
+ *selector = s.get();
368
+ s.release();
369
+ return nky_success;
370
+ }
371
+
372
+ oinky_error oinky_table_make_column_selector(oinky_table_handle_t *table, size_t col_count, char **colnames, oinky_column_selector_t **selector)
373
+ {
374
+ return wrap_exception(boost::bind(oinky_table_make_column_selector_impl, table, col_count, colnames, selector));
375
+ }
376
+
377
+ oinky_error oinky_table_delete_column_selector(oinky_table_handle_t *table, oinky_column_selector_t *selector)
378
+
379
+ {
380
+ // This actually has no reference whatsoever on the table or the DB, so
381
+ // it is safe even to delete it out of order, or at any time.
382
+ delete selector;
383
+ return nky_success;
384
+ }
385
+
386
+ //###############
387
+ // Test support
388
+ void oinky_debug_break()
389
+ {
390
+ }
@@ -0,0 +1,212 @@
1
+ // This source is distributed under the terms of the MIT License. Refer
2
+ // to the 'LICENSE' file for details.
3
+ //
4
+ // Copyright (c) Jacob Lacouture, 2012
5
+
6
+ #include <iostream>
7
+
8
+ // C function definitions.
9
+ #include "oinky.h"
10
+ #include "oinky.hpp"
11
+
12
+ using namespace std;
13
+ using namespace Oinky;
14
+
15
+ using Oinky::variant_cv_t;
16
+ using Oinky::sp_marker_t;
17
+ using Oinky::db_t;
18
+
19
+ struct _oinky_db_handle_t {
20
+ db_t db;
21
+ };
22
+
23
+ struct _oinky_column_selector_t {
24
+ db_t::column_selector_t cs;
25
+ };
26
+
27
+ // These types are merely tags.
28
+ struct _oinky_table_handle_t {};
29
+ struct _oinky_index_handle_t {};
30
+ struct _oinky_table_row_cursor_t {};
31
+ struct _oinky_index_row_cursor_t {};
32
+
33
+
34
+ static Oinky::column_type_code_t nky_column_type_xform(oinky_column_type_code_t cc)
35
+ {
36
+ switch (cc) {
37
+ case nky_Variant : return column_types::Variant;
38
+ case nky_Bit : return column_types::Bit;
39
+
40
+ case nky_Int8 : return column_types::Int8;
41
+ case nky_Int16 : return column_types::Int16;
42
+ case nky_Int32 : return column_types::Int32;
43
+ case nky_Int64 : return column_types::Int64;
44
+
45
+ case nky_Uint8 : return column_types::Uint8;
46
+ case nky_Uint16 : return column_types::Uint16;
47
+ case nky_Uint32 : return column_types::Uint32;
48
+ case nky_Uint64 : return column_types::Uint64;
49
+
50
+ case nky_Float32 : return column_types::Float32;
51
+ case nky_Float64 : return column_types::Float64;
52
+
53
+ case nky_String : return column_types::String;
54
+ case nky_Datetime : return column_types::Datetime;
55
+ }
56
+ throw_error(Oinky::Errors::invalid_argument());
57
+ }
58
+
59
+ static db_string nky_string_xform(const oinky_db_string &str)
60
+ {
61
+ if (str.length > (1 << 30)) {
62
+ throw_error(Oinky::Errors::invalid_argument());
63
+ }
64
+ return db_string(str.bytes, (uint32) str.length);
65
+ }
66
+
67
+ static variant_cv_t nky_variant_xform(const oinky_db_variant &var)
68
+ {
69
+ switch (var.type) {
70
+ case nky_Bit :
71
+ return variant_cv_t(var.value.int_value != 0);
72
+ case nky_Int8 :
73
+ case nky_Int16 :
74
+ case nky_Int32 :
75
+ case nky_Int64 :
76
+ return variant_cv_t(var.value.int_value);
77
+ case nky_Uint8 :
78
+ case nky_Uint16 :
79
+ case nky_Uint32 :
80
+ case nky_Uint64 :
81
+ return variant_cv_t(var.value.uint_value);
82
+ case nky_Float32 :
83
+ return variant_cv_t(var.value.f32_value);
84
+ case nky_Float64 :
85
+ return variant_cv_t(var.value.f64_value);
86
+ case nky_String :
87
+ return variant_cv_t(nky_string_xform(var.value.string_value));
88
+ case nky_Datetime : {
89
+ datetime_t x;
90
+ *(oinky_datetime_t *)&x = var.value.dt_value;
91
+ return variant_cv_t(x);
92
+ }
93
+ case nky_Variant:
94
+ // This is bogus. A column can have variant type, but not a value.
95
+ // Fall through.
96
+ break;
97
+ }
98
+ throw_error(Oinky::Errors::invalid_argument());
99
+ return variant_cv_t();
100
+ }
101
+
102
+
103
+
104
+
105
+ //##############
106
+ // Auto-convert the C-types to our familiar object instances.
107
+ static inline oinky_db_string make_str(const db_string &dbs)
108
+ {
109
+ oinky_db_string r;
110
+ r.bytes = dbs.begin();
111
+ r.length = dbs.length();
112
+ return r;
113
+ }
114
+
115
+ static inline oinky_datetime_t make_dt(const datetime_t &dt) {
116
+ return *(const oinky_datetime_t *)&dt;
117
+ }
118
+
119
+ //
120
+ // Construct a legit index handle from the opaque context pointer.
121
+ // The handle objects are all trivially copyable, but contain no more
122
+ // information than a simple pointer value, and can be cast to/from
123
+ // this raw format to fit them into container/host objects without
124
+ // requiring an extra level of indirection.
125
+ //
126
+ static inline db_t::table_handle make_handle(oinky_table_handle_t *table)
127
+ {
128
+ return db_t::table_handle((db_t::table_handle::raw_handle_t *)table);
129
+ }
130
+ static inline db_t::index_handle make_handle(oinky_index_handle_t *index)
131
+ {
132
+ return db_t::index_handle((db_t::index_handle::raw_handle_t *)index);
133
+ }
134
+ static inline db_t::table_cursor_handle make_handle(oinky_table_row_cursor_t *tc)
135
+ {
136
+ return db_t::table_cursor_handle((db_t::table_cursor_handle::raw_handle_t *)tc);
137
+ }
138
+ static inline db_t::index_cursor_handle make_handle(oinky_index_row_cursor_t *ic)
139
+ {
140
+ return db_t::index_cursor_handle((db_t::index_cursor_handle::raw_handle_t *)ic);
141
+ }
142
+
143
+
144
+ static oinky_db_variant nky_variant_from_variant(const variant_cv_t &v) {
145
+ if (v.is_string()) {
146
+ return nky_variant_from_immediate_dbs(make_str(v.string_value()));
147
+ }
148
+ if (v.is_f32()) {
149
+ return nky_variant_from_immediate_f32(v.f32_value());
150
+ }
151
+ if (v.is_f64()) {
152
+ return nky_variant_from_immediate_f64(v.f64_value());
153
+ }
154
+ if (v.is_int()) {
155
+ return nky_variant_from_immediate_i64(v.int_value());
156
+ }
157
+ if (v.is_uint()) {
158
+ return nky_variant_from_immediate_ui64(v.uint_value());
159
+ }
160
+ if (v.is_date()) {
161
+ return nky_variant_from_immediate_dt(make_dt(v.dt_value()));
162
+ }
163
+ if (v.is_bit()) {
164
+ return nky_variant_from_immediate_bit(v.bit_value() ? 1 : 0);
165
+ }
166
+ throw_error(bad_encoding());
167
+ return nky_variant_from_immediate_i64(0);
168
+ }
169
+
170
+
171
+ template<typename FN>
172
+ static oinky_error wrap_exception(FN fn)
173
+ {
174
+ try {
175
+ return fn();
176
+ } catch (boost::system::system_error err) {
177
+ return (oinky_error) -err.code().value();
178
+ } catch (...) {
179
+ return nky_unknown_exception;
180
+ }
181
+ }
182
+ template<typename FN>
183
+ static oinky_error wrap_void(FN fn)
184
+ {
185
+ try {
186
+ fn();
187
+ } catch (boost::system::system_error err) {
188
+ return (oinky_error) -err.code().value();
189
+ } catch (...) {
190
+ return nky_unknown_exception;
191
+ }
192
+ return nky_success;
193
+ }
194
+
195
+
196
+ template<typename FN>
197
+ static oinky_error wrap_unpack_variant_list(FN fn, size_t count, const oinky_db_variant *values)
198
+ {
199
+ try {
200
+ variant_cv_t *vars = (variant_cv_t *) alloca(count * sizeof(variant_cv_t));
201
+ for (size_t i = 0;i < count; ++i) {
202
+ vars[i] = nky_variant_xform(values[i]);
203
+ }
204
+ fn(vars);
205
+ } catch (boost::system::system_error err) {
206
+ return (oinky_error) -err.code().value();
207
+ } catch (...) {
208
+ return nky_unknown_exception;
209
+ }
210
+ return nky_success;
211
+ }
212
+