libmdb 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.
- data/README +4 -0
- data/lib/mdb.rb +389 -0
- data/lib/mdbsql.rb +83 -0
- metadata +84 -0
data/README
ADDED
data/lib/mdb.rb
ADDED
@@ -0,0 +1,389 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module MDB
|
4
|
+
extend FFI::Library
|
5
|
+
ffi_lib "mdb"
|
6
|
+
|
7
|
+
BIND_SIZE = 16384
|
8
|
+
MAX_IDX_COLS = 10
|
9
|
+
MAX_INDEX_DEPTH = 10
|
10
|
+
MAX_OBJ_NAME = 256
|
11
|
+
PGSIZE = 4096
|
12
|
+
|
13
|
+
enum :file_flags, [:no_flags, 0x00, :writeable, 0x01]
|
14
|
+
|
15
|
+
enum :obj_type, [:form, 0, :table, :macro, :system_table, :report, :query, :linked_table, :module,
|
16
|
+
:relationship, :unknown_09, :unknown_0a, :database_property, :any, -1]
|
17
|
+
|
18
|
+
enum :strategy, [:table_scan, :leaf_scan, :index_scan]
|
19
|
+
|
20
|
+
enum :column_type, [:bool, 0x01, :byte, 0x02, :int, 0x03, :longint, 0x04, :money, 0x05,
|
21
|
+
:float, 0x06, :double, 0x07, :datetime, 0x08, :binary, 0x09,
|
22
|
+
:text, 0x0a, :ole, 0x0b, :memo, 0x0c, :repid, 0x0f,
|
23
|
+
:numeric, 0x10, :complex, 0x12]
|
24
|
+
|
25
|
+
callback :quote_schema_name, [:string, :string], :string
|
26
|
+
|
27
|
+
class MdbAny < FFI::Union
|
28
|
+
layout :i, :int,
|
29
|
+
:d, :double,
|
30
|
+
:s, [:char, 256]
|
31
|
+
end
|
32
|
+
|
33
|
+
class PtrArray < FFI::Struct
|
34
|
+
layout :pdata, :pointer,
|
35
|
+
:len, :uint
|
36
|
+
end
|
37
|
+
|
38
|
+
class MdbBackendType < FFI::Struct
|
39
|
+
layout :name, :string,
|
40
|
+
:needs_length, :uchar,
|
41
|
+
:needs_scale, :uchar,
|
42
|
+
:needs_quotes, :uchar
|
43
|
+
end
|
44
|
+
|
45
|
+
class MdbBackend < FFI::Struct
|
46
|
+
layout :capabilities, :uint32,
|
47
|
+
:types_table, MdbBackendType,
|
48
|
+
:type_shortdate, MdbBackendType,
|
49
|
+
:type_autonum, MdbBackendType,
|
50
|
+
:short_now, :string,
|
51
|
+
:long_now, :string,
|
52
|
+
:charset_statement, :string,
|
53
|
+
:drop_statement, :string,
|
54
|
+
:constaint_not_empty_statement, :string,
|
55
|
+
:column_comment_statement, :string,
|
56
|
+
:table_comment_statement, :string,
|
57
|
+
:quote_schema_name, :string
|
58
|
+
end
|
59
|
+
|
60
|
+
class MdbStatistics < FFI::Struct
|
61
|
+
layout :collect, :bool,
|
62
|
+
:pg_reads, :ulong
|
63
|
+
end
|
64
|
+
|
65
|
+
class MdbFile < FFI::Struct
|
66
|
+
layout :fd, :int,
|
67
|
+
:writable, :bool,
|
68
|
+
:filename, :string,
|
69
|
+
:jet_version, :uint32,
|
70
|
+
:db_key, :uint32,
|
71
|
+
:db_passwd, [:char, 14],
|
72
|
+
:default_backend, MdbBackend,
|
73
|
+
:backend_name, :string,
|
74
|
+
:stats, MdbStatistics,
|
75
|
+
:map_sz, :int,
|
76
|
+
:free_map, :pointer,
|
77
|
+
:refs, :int
|
78
|
+
end
|
79
|
+
|
80
|
+
class MdbFormatConstants < FFI::Struct
|
81
|
+
layout :pg_size, :size_t,
|
82
|
+
:row_count_offset, :uint16,
|
83
|
+
:tab_num_rows_offset, :uint16,
|
84
|
+
:tab_num_cols_offset, :uint16,
|
85
|
+
:tab_num_idxs_offset, :uint16,
|
86
|
+
:tab_num_ridxs_offset, :uint16,
|
87
|
+
:tab_usage_map_offset, :uint16,
|
88
|
+
:tab_first_dpg_offset, :uint16,
|
89
|
+
:tab_cols_start_offset, :uint16,
|
90
|
+
:tab_ridx_entry_size, :uint16,
|
91
|
+
:col_flags_offset, :uint16,
|
92
|
+
:col_size_offset, :uint16,
|
93
|
+
:col_num_offset, :uint16,
|
94
|
+
:tab_col_entry_size, :uint16,
|
95
|
+
:tab_free_map_offset, :uint16,
|
96
|
+
:tab_col_offset_var, :uint16,
|
97
|
+
:tab_col_offset_fixed, :uint16,
|
98
|
+
:tab_row_col_num_offset, :uint16
|
99
|
+
end
|
100
|
+
|
101
|
+
class MdbHandle < FFI::Struct
|
102
|
+
layout :f, MdbFile,
|
103
|
+
:cur_pg, :uint32,
|
104
|
+
:row_num, :uint16,
|
105
|
+
:cur_pos, :uint,
|
106
|
+
:pg_buf, [:uchar, PGSIZE],
|
107
|
+
:alt_pg_buf, [:uchar, PGSIZE],
|
108
|
+
:num_catalog, :uint,
|
109
|
+
:catalog, PtrArray,
|
110
|
+
:default_backend, MdbBackend,
|
111
|
+
:backend_name, :string,
|
112
|
+
:fmt, MdbFormatConstants,
|
113
|
+
:stats, MdbStatistics
|
114
|
+
end
|
115
|
+
|
116
|
+
class MdbCatalogEntry < FFI::Struct
|
117
|
+
layout :mdb, MdbHandle,
|
118
|
+
:object_name, [:char, MAX_OBJ_NAME+1],
|
119
|
+
:object_type, :int,
|
120
|
+
:table_pg, :ulong,
|
121
|
+
:props, :pointer, # PtrArray,
|
122
|
+
:columns, :pointer, # PtrArray,
|
123
|
+
:flags, :int
|
124
|
+
end
|
125
|
+
|
126
|
+
class MdbProperties < FFI::Struct
|
127
|
+
layout :name, :string,
|
128
|
+
:hash, :pointer # GHashTable, not implementing for now
|
129
|
+
end
|
130
|
+
|
131
|
+
class MdbColumn < FFI::Struct
|
132
|
+
layout :table, :pointer, #MdbTableDef,
|
133
|
+
:name, [:char, MAX_OBJ_NAME+1],
|
134
|
+
:col_type, :column_type,
|
135
|
+
:col_size, :int,
|
136
|
+
:bind_ptr, :pointer, # void *
|
137
|
+
:len_ptr, :pointer, # int *
|
138
|
+
:properties, :pointer, #GHashTable
|
139
|
+
:num_sargs, :uint,
|
140
|
+
:sargs, :pointer, #PtrArray,
|
141
|
+
:idx_sarg_cache, :pointer, #PtrArray,
|
142
|
+
:is_fixed, :uchar,
|
143
|
+
:query_order, :int,
|
144
|
+
:col_num, :int,
|
145
|
+
:cur_value_start, :int,
|
146
|
+
:cur_value_len, :int,
|
147
|
+
:cur_blob_pg_row, :uint32,
|
148
|
+
:chunk_size, :int,
|
149
|
+
:col_prec, :int,
|
150
|
+
:col_scale, :int,
|
151
|
+
:is_long_auto, :uchar,
|
152
|
+
:is_uuid_auto, :uchar,
|
153
|
+
:props, :pointer, #MdbProperties,
|
154
|
+
:fixed_offset, :int,
|
155
|
+
:var_col_num, :uint,
|
156
|
+
:row_col_num, :int
|
157
|
+
end
|
158
|
+
|
159
|
+
class MdbSargNode < FFI::Struct
|
160
|
+
layout :op, :int,
|
161
|
+
:col, MdbColumn,
|
162
|
+
:value, MdbAny,
|
163
|
+
:parent, :pointer,
|
164
|
+
:left, :pointer,
|
165
|
+
:right, :pointer
|
166
|
+
end
|
167
|
+
|
168
|
+
class MdbIndex < FFI::Struct
|
169
|
+
layout :index_num, :int,
|
170
|
+
:name, [:char, MAX_OBJ_NAME+1],
|
171
|
+
:index_type, :uchar,
|
172
|
+
:first_pg, :uint32,
|
173
|
+
:num_rows, :int,
|
174
|
+
:num_keys, :uint,
|
175
|
+
:key_col_num, [:short, MAX_IDX_COLS],
|
176
|
+
:key_col_order, [:uchar, MAX_IDX_COLS],
|
177
|
+
:flags, :uchar,
|
178
|
+
:table, :pointer
|
179
|
+
end
|
180
|
+
|
181
|
+
class MdbIndexPage < FFI::Struct
|
182
|
+
layout :pg, :uint32,
|
183
|
+
:start_pos, :int,
|
184
|
+
:offset, :int,
|
185
|
+
:len, :int,
|
186
|
+
:idx_starts, [:uint16, 2000],
|
187
|
+
:cache_value, [:uchar, 256]
|
188
|
+
end
|
189
|
+
|
190
|
+
class MdbIndexChain < FFI::Struct
|
191
|
+
layout :cur_depth, :int,
|
192
|
+
:last_leaf_found, :uint32,
|
193
|
+
:clean_up_mode, :int,
|
194
|
+
:pages, [MdbIndexPage, MAX_INDEX_DEPTH]
|
195
|
+
end
|
196
|
+
|
197
|
+
class MdbTableDef < FFI::Struct # The real deal
|
198
|
+
layout :entry, :pointer, #MdbCatalogEntry,
|
199
|
+
:name, [:char, MAX_OBJ_NAME+1],
|
200
|
+
:num_cols, :uint,
|
201
|
+
:columns, :pointer,
|
202
|
+
:num_rows, :uint,
|
203
|
+
:index_start, :int,
|
204
|
+
:num_real_idxs, :uint,
|
205
|
+
:num_idxs, :uint,
|
206
|
+
:indices, :pointer, #PtrArray,
|
207
|
+
:first_data_pg, :uint32,
|
208
|
+
:cur_pg_num, :uint32,
|
209
|
+
:cur_phys_pg, :uint32,
|
210
|
+
:cur_row, :uint,
|
211
|
+
:noskip_del, :int,
|
212
|
+
:map_base_pg, :uint32,
|
213
|
+
:map_sz, :size_t,
|
214
|
+
:usage_map, :pointer, # unsigned char *
|
215
|
+
:freemap_base_pg, :uint32,
|
216
|
+
:freemap_sz, :size_t,
|
217
|
+
:free_usage_map, :pointer, # unsigned char *
|
218
|
+
:sarg_tree, :pointer, # MdbSargNode,
|
219
|
+
:strategy, :strategy,
|
220
|
+
:scan_idx, :pointer, # MdbIndex,
|
221
|
+
:mdbidx, :pointer, # MdbHandle,
|
222
|
+
:chain, :pointer, # MdbIndexChain,
|
223
|
+
:props, :pointer, # MdbProperties,
|
224
|
+
:num_var_cols, :uint,
|
225
|
+
:is_temp_table, :uint,
|
226
|
+
:temp_table_pages, :pointer # PtrArray
|
227
|
+
end
|
228
|
+
|
229
|
+
class BoundValue < FFI::Struct
|
230
|
+
layout :value, [:char, 256]
|
231
|
+
end
|
232
|
+
|
233
|
+
class BoundLength < FFI::Struct
|
234
|
+
layout :len, :uint
|
235
|
+
end
|
236
|
+
|
237
|
+
|
238
|
+
# file
|
239
|
+
#extern ssize_t mdb_read_pg(MdbHandle *mdb, unsigned long pg);
|
240
|
+
#extern ssize_t mdb_read_alt_pg(MdbHandle *mdb, unsigned long pg);
|
241
|
+
#extern unsigned char mdb_get_byte(void *buf, int offset);
|
242
|
+
#extern int mdb_get_int16(void *buf, int offset);
|
243
|
+
#extern long mdb_get_int32(void *buf, int offset);
|
244
|
+
#extern long mdb_get_int32_msb(void *buf, int offset);
|
245
|
+
#extern float mdb_get_single(void *buf, int offset);
|
246
|
+
#extern double mdb_get_double(void *buf, int offset);
|
247
|
+
#extern unsigned char mdb_pg_get_byte(MdbHandle *mdb, int offset);
|
248
|
+
#extern int mdb_pg_get_int16(MdbHandle *mdb, int offset);
|
249
|
+
#extern long mdb_pg_get_int32(MdbHandle *mdb, int offset);
|
250
|
+
#extern float mdb_pg_get_single(MdbHandle *mdb, int offset);
|
251
|
+
#extern double mdb_pg_get_double(MdbHandle *mdb, int offset);
|
252
|
+
attach_function :mdb_open, [:string, :file_flags], MdbHandle.by_ref
|
253
|
+
attach_function :mdb_close, [MdbTableDef], :void
|
254
|
+
#extern MdbHandle *mdb_clone_handle(MdbHandle *mdb);
|
255
|
+
#extern void mdb_swap_pgbuf(MdbHandle *mdb);
|
256
|
+
|
257
|
+
# catalog
|
258
|
+
#extern void mdb_free_catalog(MdbHandle *mdb);
|
259
|
+
#extern GPtrArray *mdb_read_catalog(MdbHandle *mdb, int obj_type);
|
260
|
+
#MdbCatalogEntry *mdb_get_catalogentry_by_name(MdbHandle *mdb, const gchar* name);
|
261
|
+
#extern void mdb_dump_catalog(MdbHandle *mdb, int obj_type);
|
262
|
+
#extern char *mdb_get_objtype_string(int obj_type);
|
263
|
+
|
264
|
+
# table
|
265
|
+
#extern MdbTableDef *mdb_alloc_tabledef(MdbCatalogEntry *entry);
|
266
|
+
attach_function :mdb_free_tabledef, [MdbTableDef], :void
|
267
|
+
#extern MdbTableDef *mdb_read_table(MdbCatalogEntry *entry);
|
268
|
+
attach_function :mdb_read_table_by_name, [MdbHandle, :string, :obj_type], MdbTableDef.by_ref
|
269
|
+
#extern void mdb_append_column(GPtrArray *columns, MdbColumn *in_col);
|
270
|
+
#extern void mdb_free_columns(GPtrArray *columns);
|
271
|
+
attach_function :mdb_read_columns, [MdbTableDef], :pointer
|
272
|
+
#extern void mdb_table_dump(MdbCatalogEntry *entry);
|
273
|
+
#extern guint8 read_pg_if_8(MdbHandle *mdb, int *cur_pos);
|
274
|
+
#extern guint16 read_pg_if_16(MdbHandle *mdb, int *cur_pos);
|
275
|
+
#extern guint32 read_pg_if_32(MdbHandle *mdb, int *cur_pos);
|
276
|
+
#extern void *read_pg_if_n(MdbHandle *mdb, void *buf, int *cur_pos, size_t len);
|
277
|
+
#extern int mdb_is_user_table(MdbCatalogEntry *entry);
|
278
|
+
#extern int mdb_is_system_table(MdbCatalogEntry *entry);
|
279
|
+
#extern const char *mdb_table_get_prop(const MdbTableDef *table, const gchar *key);
|
280
|
+
#extern const char *mdb_col_get_prop(const MdbColumn *col, const gchar *key);
|
281
|
+
|
282
|
+
#/* data.c */
|
283
|
+
#extern int mdb_bind_column_by_name(MdbTableDef *table, gchar *col_name, void *bind_ptr, int *len_ptr);
|
284
|
+
#extern void mdb_data_dump(MdbTableDef *table);
|
285
|
+
#extern void mdb_date_to_tm(double td, struct tm *t);
|
286
|
+
attach_function :mdb_bind_column, [MdbTableDef, :int, :pointer, :pointer], :void
|
287
|
+
attach_function :mdb_rewind_table, [MdbTableDef], :int
|
288
|
+
attach_function :mdb_fetch_row, [MdbTableDef], :int
|
289
|
+
#extern int mdb_is_fixed_col(MdbColumn *col);
|
290
|
+
#extern char *mdb_col_to_string(MdbHandle *mdb, void *buf, int start, int datatype, int size);
|
291
|
+
#extern int mdb_find_pg_row(MdbHandle *mdb, int pg_row, void **buf, int *off, size_t *len);
|
292
|
+
#extern int mdb_find_row(MdbHandle *mdb, int row, int *start, size_t *len);
|
293
|
+
#extern int mdb_find_end_of_row(MdbHandle *mdb, int row);
|
294
|
+
#extern int mdb_col_fixed_size(MdbColumn *col);
|
295
|
+
#extern int mdb_col_disp_size(MdbColumn *col);
|
296
|
+
#extern size_t mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr);
|
297
|
+
#extern size_t mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size);
|
298
|
+
attach_function :mdb_ole_read_full, [MdbHandle, MdbColumn, :pointer], :string
|
299
|
+
attach_function :mdb_set_date_fmt, [:string], :void
|
300
|
+
#extern int mdb_read_row(MdbTableDef *table, unsigned int row);
|
301
|
+
|
302
|
+
#/* dump.c */
|
303
|
+
#extern void mdb_buffer_dump(const void *buf, int start, size_t len);
|
304
|
+
|
305
|
+
#/* backend.c */
|
306
|
+
#extern char* __attribute__((deprecated)) mdb_get_coltype_string(MdbBackend *backend, int col_type);
|
307
|
+
#extern int __attribute__((deprecated)) mdb_coltype_takes_length(MdbBackend *backend, int col_type);
|
308
|
+
#extern const MdbBackendType* mdb_get_colbacktype(const MdbColumn *col);
|
309
|
+
#extern const char* mdb_get_colbacktype_string(const MdbColumn *col);
|
310
|
+
#extern int mdb_colbacktype_takes_length(const MdbColumn *col);
|
311
|
+
#extern void __attribute__((deprecated)) mdb_init_backends();
|
312
|
+
#extern void mdb_register_backend(char *backend_name, guint32 capabilities, MdbBackendType *backend_type, MdbBackendType *type_shortdate, MdbBackendType *type_autonum, const char *short_now, const char *long_now, const char *charset_statement, const char *drop_statement, const char *constaint_not_empty_statement, const char *column_comment_statement, const char *table_comment_statement, gchar* (*quote_schema_name)(const gchar*, const gchar*));
|
313
|
+
#extern void __attribute__((deprecated)) mdb_remove_backends();
|
314
|
+
attach_function :mdb_set_default_backend, [MdbHandle, :string], :int
|
315
|
+
#extern void mdb_print_schema(MdbHandle *mdb, FILE *outfile, char *tabname, char *dbnamespace, guint32 export_options);
|
316
|
+
|
317
|
+
#/* sargs.c */
|
318
|
+
#extern int mdb_test_sargs(MdbTableDef *table, MdbField *fields, int num_fields);
|
319
|
+
#extern int mdb_test_sarg(MdbHandle *mdb, MdbColumn *col, MdbSargNode *node, MdbField *field);
|
320
|
+
#extern void mdb_sql_walk_tree(MdbSargNode *node, MdbSargTreeFunc func, gpointer data);
|
321
|
+
#extern int mdb_find_indexable_sargs(MdbSargNode *node, gpointer data);
|
322
|
+
#extern int mdb_add_sarg_by_name(MdbTableDef *table, char *colname, MdbSarg *in_sarg);
|
323
|
+
#extern int mdb_test_string(MdbSargNode *node, char *s);
|
324
|
+
#extern int mdb_test_int(MdbSargNode *node, gint32 i);
|
325
|
+
#extern int mdb_add_sarg(MdbColumn *col, MdbSarg *in_sarg);
|
326
|
+
|
327
|
+
#/* index.c */
|
328
|
+
#extern GPtrArray *mdb_read_indices(MdbTableDef *table);
|
329
|
+
#extern void mdb_index_dump(MdbTableDef *table, MdbIndex *idx);
|
330
|
+
#extern void mdb_index_scan_free(MdbTableDef *table);
|
331
|
+
#extern int mdb_index_find_next_on_page(MdbHandle *mdb, MdbIndexPage *ipg);
|
332
|
+
#extern int mdb_index_find_next(MdbHandle *mdb, MdbIndex *idx, MdbIndexChain *chain, guint32 *pg, guint16 *row);
|
333
|
+
#extern void mdb_index_hash_text(char *text, char *hash);
|
334
|
+
#extern void mdb_index_scan_init(MdbHandle *mdb, MdbTableDef *table);
|
335
|
+
#extern int mdb_index_find_row(MdbHandle *mdb, MdbIndex *idx, MdbIndexChain *chain, guint32 pg, guint16 row);
|
336
|
+
#extern void mdb_index_swap_n(unsigned char *src, int sz, unsigned char *dest);
|
337
|
+
#extern void mdb_free_indices(GPtrArray *indices);
|
338
|
+
#void mdb_index_page_reset(MdbIndexPage *ipg);
|
339
|
+
#extern int mdb_index_pack_bitmap(MdbHandle *mdb, MdbIndexPage *ipg);
|
340
|
+
|
341
|
+
# stats
|
342
|
+
attach_function :mdb_stats_on, [MdbHandle], :void
|
343
|
+
attach_function :mdb_stats_off, [MdbHandle], :void
|
344
|
+
attach_function :mdb_dump_stats, [MdbHandle], :void
|
345
|
+
|
346
|
+
#/* like.c */
|
347
|
+
#extern int mdb_like_cmp(char *s, char *r);
|
348
|
+
|
349
|
+
#/* write.c */
|
350
|
+
#extern void mdb_put_int16(void *buf, guint32 offset, guint32 value);
|
351
|
+
#extern void mdb_put_int32(void *buf, guint32 offset, guint32 value);
|
352
|
+
#extern void mdb_put_int32_msb(void *buf, guint32 offset, guint32 value);
|
353
|
+
#extern int mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbField *fields);
|
354
|
+
#extern guint16 mdb_add_row_to_pg(MdbTableDef *table, unsigned char *row_buffer, int new_row_size);
|
355
|
+
#extern int mdb_update_index(MdbTableDef *table, MdbIndex *idx, unsigned int num_fields, MdbField *fields, guint32 pgnum, guint16 rownum);
|
356
|
+
#extern int mdb_insert_row(MdbTableDef *table, int num_fields, MdbField *fields);
|
357
|
+
#extern int mdb_pack_row(MdbTableDef *table, unsigned char *row_buffer, unsigned int num_fields, MdbField *fields);
|
358
|
+
#extern int mdb_replace_row(MdbTableDef *table, int row, void *new_row, int new_row_size);
|
359
|
+
#extern int mdb_pg_get_freespace(MdbHandle *mdb);
|
360
|
+
#extern int mdb_update_row(MdbTableDef *table);
|
361
|
+
#extern void *mdb_new_data_pg(MdbCatalogEntry *entry);
|
362
|
+
|
363
|
+
#/* map.c */
|
364
|
+
#extern guint32 mdb_map_find_next_freepage(MdbTableDef *table, int row_size);
|
365
|
+
#extern gint32 mdb_map_find_next(MdbHandle *mdb, unsigned char *map, unsigned int map_sz, guint32 start_pg);
|
366
|
+
|
367
|
+
#/* props.c */
|
368
|
+
#extern void mdb_free_props(MdbProperties *props);
|
369
|
+
#extern void mdb_dump_props(MdbProperties *props, FILE *outfile, int show_name);
|
370
|
+
#extern GArray* mdb_kkd_to_props(MdbHandle *mdb, void *kkd, size_t len);
|
371
|
+
|
372
|
+
#/* worktable.c */
|
373
|
+
#extern MdbTableDef *mdb_create_temp_table(MdbHandle *mdb, char *name);
|
374
|
+
#extern void mdb_temp_table_add_col(MdbTableDef *table, MdbColumn *col);
|
375
|
+
#extern void mdb_fill_temp_col(MdbColumn *tcol, char *col_name, int col_size, int col_type, int is_fixed);
|
376
|
+
#extern void mdb_fill_temp_field(MdbField *field, void *value, int siz, int is_fixed, int is_null, int start, int column);
|
377
|
+
#extern void mdb_temp_columns_end(MdbTableDef *table);
|
378
|
+
|
379
|
+
## options.c
|
380
|
+
#extern int mdb_get_option(unsigned long optnum);
|
381
|
+
#extern void mdb_debug(int klass, char *fmt, ...);
|
382
|
+
|
383
|
+
# iconv
|
384
|
+
#extern int mdb_unicode2ascii(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen);
|
385
|
+
#extern int mdb_ascii2unicode(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen);
|
386
|
+
#extern void mdb_iconv_init(MdbHandle *mdb);
|
387
|
+
#extern void mdb_iconv_close(MdbHandle *mdb);
|
388
|
+
#extern const char* mdb_target_charset(MdbHandle *mdb);
|
389
|
+
end
|
data/lib/mdbsql.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
require "#{File.dirname(__FILE__)}/mdb"
|
3
|
+
|
4
|
+
module MDB
|
5
|
+
module SQL
|
6
|
+
extend FFI::Library
|
7
|
+
ffi_lib "mdbsql"
|
8
|
+
|
9
|
+
class MdbSQL < FFI::Struct
|
10
|
+
layout :mdb, :pointer,
|
11
|
+
:all_columns, :int,
|
12
|
+
:num_columns, :uint,
|
13
|
+
:columns, :pointer, # PtrArray,
|
14
|
+
:num_tables, :uint,
|
15
|
+
:tables, :pointer, # PtrArray,
|
16
|
+
:cur_table, :pointer, # MdbTableDef
|
17
|
+
:sarg_tree, :pointer, # MdbSargNode
|
18
|
+
:sarg_stack, :pointer, # GList
|
19
|
+
:bound_values, [:pointer, 256],
|
20
|
+
:kludge_ttable_pg, :pointer,
|
21
|
+
:max_rows, :int,
|
22
|
+
:error_msg, [:char, 256]
|
23
|
+
end
|
24
|
+
|
25
|
+
class MdbSQLColumn < FFI::Struct
|
26
|
+
layout :name, :string,
|
27
|
+
:disp_size, :int,
|
28
|
+
:bind_addr, :pointer, # void*
|
29
|
+
:bind_type, :int,
|
30
|
+
:bind_len, :pointer, # int
|
31
|
+
:bind_max, :int
|
32
|
+
end
|
33
|
+
|
34
|
+
#typedef struct {
|
35
|
+
# char *name;
|
36
|
+
# char *alias;
|
37
|
+
#} MdbSQLTable;
|
38
|
+
|
39
|
+
#typedef struct {
|
40
|
+
# char *col_name;
|
41
|
+
# MdbSarg *sarg;
|
42
|
+
#} MdbSQLSarg;
|
43
|
+
|
44
|
+
#extern char *g_input_ptr;
|
45
|
+
|
46
|
+
##undef YY_INPUT
|
47
|
+
##define YY_INPUT(b, r, ms) (r = mdb_sql_yyinput(b, ms));
|
48
|
+
|
49
|
+
def self.mdb_sql_has_error?(sql)
|
50
|
+
sql[:error_msg][0] > 0
|
51
|
+
end
|
52
|
+
|
53
|
+
##define mdb_sql_last_error(sql) ((sql)->error_msg)
|
54
|
+
|
55
|
+
#void mdb_sql_error(MdbSQL* sql, char *fmt, ...);
|
56
|
+
#extern MdbSQL *_mdb_sql(MdbSQL *sql);
|
57
|
+
attach_function :mdb_sql_init, [], MdbSQL.by_ref
|
58
|
+
#extern MdbSQLSarg *mdb_sql_alloc_sarg();
|
59
|
+
attach_function :mdb_sql_open, [MdbSQL, :string], MdbHandle.by_ref
|
60
|
+
#extern int mdb_sql_add_sarg(MdbSQL *sql, char *col_name, int op, char *constant);
|
61
|
+
#extern void mdb_sql_all_columns(MdbSQL *sql);
|
62
|
+
#extern int mdb_sql_add_column(MdbSQL *sql, char *column_name);
|
63
|
+
#extern int mdb_sql_add_table(MdbSQL *sql, char *table_name);
|
64
|
+
attach_function :mdb_sql_dump, [MdbSQL], :void
|
65
|
+
attach_function :mdb_sql_exit, [MdbSQL], :void
|
66
|
+
attach_function :mdb_sql_reset, [MdbSQL], :void
|
67
|
+
#extern void mdb_sql_listtables(MdbSQL *sql);
|
68
|
+
#extern void mdb_sql_select(MdbSQL *sql);
|
69
|
+
attach_function :mdb_sql_dump_node, [MDB::MdbSargNode, :int], :void
|
70
|
+
#extern void mdb_sql_close(MdbSQL *sql);
|
71
|
+
#extern void mdb_sql_add_or(MdbSQL *sql);
|
72
|
+
#extern void mdb_sql_add_and(MdbSQL *sql);
|
73
|
+
#extern void mdb_sql_add_not(MdbSQL *sql);
|
74
|
+
#extern void mdb_sql_describe_table(MdbSQL *sql);
|
75
|
+
attach_function :mdb_sql_run_query, [MdbSQL, :string], MdbSQL.by_ref
|
76
|
+
#extern void mdb_sql_set_maxrow(MdbSQL *sql, int maxrow);
|
77
|
+
#extern int mdb_sql_eval_expr(MdbSQL *sql, char *const1, int op, char *const2);
|
78
|
+
attach_function :mdb_sql_bind_all, [MdbSQL], :void
|
79
|
+
#extern int mdb_sql_fetch_row(MdbSQL *sql, MdbTableDef *table);
|
80
|
+
#extern int mdb_sql_add_temp_col(MdbSQL *sql, MdbTableDef *ttable, int col_num, char *name, int col_type, int col_size, int is_fixed);
|
81
|
+
#extern void mdb_sql_bind_column(MdbSQL *sql, int colnum, void *varaddr, int *len_ptr);
|
82
|
+
end
|
83
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: libmdb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Wesley Moxam
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-10-09 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: ffi
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 25
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 1
|
32
|
+
- 5
|
33
|
+
version: 1.1.5
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
description: A low level Ruby wrapper for mdbtools
|
37
|
+
email: wesley.moxam@learnhub.com
|
38
|
+
executables: []
|
39
|
+
|
40
|
+
extensions: []
|
41
|
+
|
42
|
+
extra_rdoc_files: []
|
43
|
+
|
44
|
+
files:
|
45
|
+
- README
|
46
|
+
- lib/mdb.rb
|
47
|
+
- lib/mdbsql.rb
|
48
|
+
homepage: https://github.com/wmoxam/libmdb
|
49
|
+
licenses: []
|
50
|
+
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 57
|
62
|
+
segments:
|
63
|
+
- 1
|
64
|
+
- 8
|
65
|
+
- 7
|
66
|
+
version: 1.8.7
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
requirements: []
|
77
|
+
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 1.8.10
|
80
|
+
signing_key:
|
81
|
+
specification_version: 3
|
82
|
+
summary: MS Access DB raw API
|
83
|
+
test_files: []
|
84
|
+
|