libmdb 0.1.1 → 0.1.2
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/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
|