libmdb 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ffi_helpers.rb +18 -0
- data/lib/mdb.rb +52 -17
- data/lib/mdbsql.rb +9 -8
- metadata +5 -4
data/lib/ffi_helpers.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module FFIHelpers
|
2
|
+
def self.included(base)
|
3
|
+
base.extend(ClassMethods)
|
4
|
+
end
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
private
|
8
|
+
def soft_attach(method, *args)
|
9
|
+
begin
|
10
|
+
attach_function method, *args
|
11
|
+
rescue Exception => e
|
12
|
+
STDERR.puts "Warning, could not attach #{method} because #{e.message}"
|
13
|
+
return false
|
14
|
+
end
|
15
|
+
true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/mdb.rb
CHANGED
@@ -1,13 +1,17 @@
|
|
1
1
|
require 'ffi'
|
2
|
+
require 'ffi_helpers'
|
2
3
|
|
3
4
|
module MDB
|
4
5
|
extend FFI::Library
|
6
|
+
include FFIHelpers
|
7
|
+
|
5
8
|
ffi_lib "mdb"
|
6
9
|
|
7
10
|
BIND_SIZE = 16384
|
8
11
|
MAX_IDX_COLS = 10
|
9
12
|
MAX_INDEX_DEPTH = 10
|
10
13
|
MAX_OBJ_NAME = 256
|
14
|
+
MEMO_OVERHEAD = 12
|
11
15
|
PGSIZE = 4096
|
12
16
|
|
13
17
|
enum :file_flags, [:no_flags, 0x00, :writeable, 0x01]
|
@@ -22,6 +26,24 @@ module MDB
|
|
22
26
|
:text, 0x0a, :ole, 0x0b, :memo, 0x0c, :repid, 0x0f,
|
23
27
|
:numeric, 0x10, :complex, 0x12]
|
24
28
|
|
29
|
+
SHEXP_DROPTABLE = 1<<0
|
30
|
+
SHEXP_CST_NOTNULL = 1<<1
|
31
|
+
SHEXP_CST_NOTEMPTY = 1<<2
|
32
|
+
SHEXP_COMMENTS = 1<<3
|
33
|
+
SHEXP_DEFVALUES = 1<<4
|
34
|
+
SHEXP_INDEXES = 1<<5
|
35
|
+
SHEXP_RELATIONS = 1<<6
|
36
|
+
|
37
|
+
enum :shexp, [:drop_table, SHEXP_DROPTABLE,
|
38
|
+
:cst_not_null, SHEXP_CST_NOTNULL,
|
39
|
+
:cst__not_empty, SHEXP_CST_NOTEMPTY,
|
40
|
+
:comments, SHEXP_COMMENTS,
|
41
|
+
:def_values, SHEXP_DEFVALUES,
|
42
|
+
:indexes, SHEXP_INDEXES,
|
43
|
+
:relations, SHEXP_RELATIONS ]
|
44
|
+
|
45
|
+
SHEXP_DEFAULT = SHEXP_CST_NOTNULL | SHEXP_COMMENTS | SHEXP_INDEXES | SHEXP_RELATIONS
|
46
|
+
|
25
47
|
callback :quote_schema_name, [:string, :string], :string
|
26
48
|
|
27
49
|
class MdbAny < FFI::Union
|
@@ -234,7 +256,6 @@ module MDB
|
|
234
256
|
layout :len, :uint
|
235
257
|
end
|
236
258
|
|
237
|
-
|
238
259
|
# file
|
239
260
|
#extern ssize_t mdb_read_pg(MdbHandle *mdb, unsigned long pg);
|
240
261
|
#extern ssize_t mdb_read_alt_pg(MdbHandle *mdb, unsigned long pg);
|
@@ -249,8 +270,8 @@ module MDB
|
|
249
270
|
#extern long mdb_pg_get_int32(MdbHandle *mdb, int offset);
|
250
271
|
#extern float mdb_pg_get_single(MdbHandle *mdb, int offset);
|
251
272
|
#extern double mdb_pg_get_double(MdbHandle *mdb, int offset);
|
252
|
-
|
253
|
-
|
273
|
+
soft_attach :mdb_open, [:string, :file_flags], MdbHandle.by_ref
|
274
|
+
soft_attach :mdb_close, [MdbTableDef], :void
|
254
275
|
#extern MdbHandle *mdb_clone_handle(MdbHandle *mdb);
|
255
276
|
#extern void mdb_swap_pgbuf(MdbHandle *mdb);
|
256
277
|
|
@@ -263,12 +284,12 @@ module MDB
|
|
263
284
|
|
264
285
|
# table
|
265
286
|
#extern MdbTableDef *mdb_alloc_tabledef(MdbCatalogEntry *entry);
|
266
|
-
|
287
|
+
soft_attach :mdb_free_tabledef, [MdbTableDef], :void
|
267
288
|
#extern MdbTableDef *mdb_read_table(MdbCatalogEntry *entry);
|
268
|
-
|
289
|
+
soft_attach :mdb_read_table_by_name, [MdbHandle, :string, :obj_type], MdbTableDef.by_ref
|
269
290
|
#extern void mdb_append_column(GPtrArray *columns, MdbColumn *in_col);
|
270
291
|
#extern void mdb_free_columns(GPtrArray *columns);
|
271
|
-
|
292
|
+
soft_attach :mdb_read_columns, [MdbTableDef], :pointer
|
272
293
|
#extern void mdb_table_dump(MdbCatalogEntry *entry);
|
273
294
|
#extern guint8 read_pg_if_8(MdbHandle *mdb, int *cur_pos);
|
274
295
|
#extern guint16 read_pg_if_16(MdbHandle *mdb, int *cur_pos);
|
@@ -283,9 +304,9 @@ module MDB
|
|
283
304
|
#extern int mdb_bind_column_by_name(MdbTableDef *table, gchar *col_name, void *bind_ptr, int *len_ptr);
|
284
305
|
#extern void mdb_data_dump(MdbTableDef *table);
|
285
306
|
#extern void mdb_date_to_tm(double td, struct tm *t);
|
286
|
-
|
287
|
-
|
288
|
-
|
307
|
+
soft_attach :mdb_bind_column, [MdbTableDef, :int, :pointer, :pointer], :void
|
308
|
+
soft_attach :mdb_rewind_table, [MdbTableDef], :int
|
309
|
+
soft_attach :mdb_fetch_row, [MdbTableDef], :int
|
289
310
|
#extern int mdb_is_fixed_col(MdbColumn *col);
|
290
311
|
#extern char *mdb_col_to_string(MdbHandle *mdb, void *buf, int start, int datatype, int size);
|
291
312
|
#extern int mdb_find_pg_row(MdbHandle *mdb, int pg_row, void **buf, int *off, size_t *len);
|
@@ -293,10 +314,24 @@ module MDB
|
|
293
314
|
#extern int mdb_find_end_of_row(MdbHandle *mdb, int row);
|
294
315
|
#extern int mdb_col_fixed_size(MdbColumn *col);
|
295
316
|
#extern int mdb_col_disp_size(MdbColumn *col);
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
317
|
+
soft_attach :mdb_ole_read_next, [MdbHandle, MdbColumn, :pointer], :int
|
318
|
+
soft_attach :mdb_ole_read, [MdbHandle, MdbColumn, :pointer, :int], :int
|
319
|
+
unless soft_attach :mdb_ole_read_full, [MdbHandle, MdbColumn, :pointer], :string
|
320
|
+
# some older versions of mdbtools that are distributed with Ubuntu are missing this method
|
321
|
+
def self.mdb_ole_read_full(handle, column, length)
|
322
|
+
ole_ptr = FFI::MemoryPointer.new(:char, MEMO_OVERHEAD)
|
323
|
+
|
324
|
+
ole_ptr = col[:bind_ptr]
|
325
|
+
|
326
|
+
len = mdb_ole_read(mdb, col, ole_ptr, BIND_SIZE)
|
327
|
+
result = col[:bind_ptr].read_string
|
328
|
+
while (mdb_ole_read_next(mdb, col, ole_ptr) != 0 ) do
|
329
|
+
result += col[:bind_ptr].read_string
|
330
|
+
end
|
331
|
+
result
|
332
|
+
end
|
333
|
+
end
|
334
|
+
soft_attach :mdb_set_date_fmt, [:string], :void
|
300
335
|
#extern int mdb_read_row(MdbTableDef *table, unsigned int row);
|
301
336
|
|
302
337
|
#/* dump.c */
|
@@ -311,7 +346,7 @@ module MDB
|
|
311
346
|
#extern void __attribute__((deprecated)) mdb_init_backends();
|
312
347
|
#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
348
|
#extern void __attribute__((deprecated)) mdb_remove_backends();
|
314
|
-
|
349
|
+
soft_attach :mdb_set_default_backend, [MdbHandle, :string], :int
|
315
350
|
#extern void mdb_print_schema(MdbHandle *mdb, FILE *outfile, char *tabname, char *dbnamespace, guint32 export_options);
|
316
351
|
|
317
352
|
#/* sargs.c */
|
@@ -339,9 +374,9 @@ module MDB
|
|
339
374
|
#extern int mdb_index_pack_bitmap(MdbHandle *mdb, MdbIndexPage *ipg);
|
340
375
|
|
341
376
|
# stats
|
342
|
-
|
343
|
-
|
344
|
-
|
377
|
+
soft_attach :mdb_stats_on, [MdbHandle], :void
|
378
|
+
soft_attach :mdb_stats_off, [MdbHandle], :void
|
379
|
+
soft_attach :mdb_dump_stats, [MdbHandle], :void
|
345
380
|
|
346
381
|
#/* like.c */
|
347
382
|
#extern int mdb_like_cmp(char *s, char *r);
|
data/lib/mdbsql.rb
CHANGED
@@ -4,6 +4,7 @@ require "#{File.dirname(__FILE__)}/mdb"
|
|
4
4
|
module MDB
|
5
5
|
module SQL
|
6
6
|
extend FFI::Library
|
7
|
+
include FFIHelpers
|
7
8
|
ffi_lib "mdbsql"
|
8
9
|
|
9
10
|
class MdbSQL < FFI::Struct
|
@@ -54,28 +55,28 @@ module MDB
|
|
54
55
|
|
55
56
|
#void mdb_sql_error(MdbSQL* sql, char *fmt, ...);
|
56
57
|
#extern MdbSQL *_mdb_sql(MdbSQL *sql);
|
57
|
-
|
58
|
+
soft_attach :mdb_sql_init, [], MdbSQL.by_ref
|
58
59
|
#extern MdbSQLSarg *mdb_sql_alloc_sarg();
|
59
|
-
|
60
|
+
soft_attach :mdb_sql_open, [MdbSQL, :string], MdbHandle.by_ref
|
60
61
|
#extern int mdb_sql_add_sarg(MdbSQL *sql, char *col_name, int op, char *constant);
|
61
62
|
#extern void mdb_sql_all_columns(MdbSQL *sql);
|
62
63
|
#extern int mdb_sql_add_column(MdbSQL *sql, char *column_name);
|
63
64
|
#extern int mdb_sql_add_table(MdbSQL *sql, char *table_name);
|
64
|
-
|
65
|
-
|
66
|
-
|
65
|
+
soft_attach :mdb_sql_dump, [MdbSQL], :void
|
66
|
+
soft_attach :mdb_sql_exit, [MdbSQL], :void
|
67
|
+
soft_attach :mdb_sql_reset, [MdbSQL], :void
|
67
68
|
#extern void mdb_sql_listtables(MdbSQL *sql);
|
68
69
|
#extern void mdb_sql_select(MdbSQL *sql);
|
69
|
-
|
70
|
+
soft_attach :mdb_sql_dump_node, [MDB::MdbSargNode, :int], :void
|
70
71
|
#extern void mdb_sql_close(MdbSQL *sql);
|
71
72
|
#extern void mdb_sql_add_or(MdbSQL *sql);
|
72
73
|
#extern void mdb_sql_add_and(MdbSQL *sql);
|
73
74
|
#extern void mdb_sql_add_not(MdbSQL *sql);
|
74
75
|
#extern void mdb_sql_describe_table(MdbSQL *sql);
|
75
|
-
|
76
|
+
soft_attach :mdb_sql_run_query, [MdbSQL, :string], MdbSQL.by_ref
|
76
77
|
#extern void mdb_sql_set_maxrow(MdbSQL *sql, int maxrow);
|
77
78
|
#extern int mdb_sql_eval_expr(MdbSQL *sql, char *const1, int op, char *const2);
|
78
|
-
|
79
|
+
soft_attach :mdb_sql_bind_all, [MdbSQL], :void
|
79
80
|
#extern int mdb_sql_fetch_row(MdbSQL *sql, MdbTableDef *table);
|
80
81
|
#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
82
|
#extern void mdb_sql_bind_column(MdbSQL *sql, int colnum, void *varaddr, int *len_ptr);
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libmdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 2
|
10
|
+
version: 0.1.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Wesley Moxam
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-10-
|
18
|
+
date: 2012-10-12 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: ffi
|
@@ -43,6 +43,7 @@ extra_rdoc_files: []
|
|
43
43
|
|
44
44
|
files:
|
45
45
|
- README
|
46
|
+
- lib/ffi_helpers.rb
|
46
47
|
- lib/libmdb.rb
|
47
48
|
- lib/mdb.rb
|
48
49
|
- lib/mdbsql.rb
|