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.
Files changed (4) hide show
  1. data/lib/ffi_helpers.rb +18 -0
  2. data/lib/mdb.rb +52 -17
  3. data/lib/mdbsql.rb +9 -8
  4. metadata +5 -4
@@ -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
- attach_function :mdb_open, [:string, :file_flags], MdbHandle.by_ref
253
- attach_function :mdb_close, [MdbTableDef], :void
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
- attach_function :mdb_free_tabledef, [MdbTableDef], :void
287
+ soft_attach :mdb_free_tabledef, [MdbTableDef], :void
267
288
  #extern MdbTableDef *mdb_read_table(MdbCatalogEntry *entry);
268
- attach_function :mdb_read_table_by_name, [MdbHandle, :string, :obj_type], MdbTableDef.by_ref
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
- attach_function :mdb_read_columns, [MdbTableDef], :pointer
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
- 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
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
- #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
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
- attach_function :mdb_set_default_backend, [MdbHandle, :string], :int
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
- attach_function :mdb_stats_on, [MdbHandle], :void
343
- attach_function :mdb_stats_off, [MdbHandle], :void
344
- attach_function :mdb_dump_stats, [MdbHandle], :void
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
- attach_function :mdb_sql_init, [], MdbSQL.by_ref
58
+ soft_attach :mdb_sql_init, [], MdbSQL.by_ref
58
59
  #extern MdbSQLSarg *mdb_sql_alloc_sarg();
59
- attach_function :mdb_sql_open, [MdbSQL, :string], MdbHandle.by_ref
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
- attach_function :mdb_sql_dump, [MdbSQL], :void
65
- attach_function :mdb_sql_exit, [MdbSQL], :void
66
- attach_function :mdb_sql_reset, [MdbSQL], :void
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
- attach_function :mdb_sql_dump_node, [MDB::MdbSargNode, :int], :void
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
- attach_function :mdb_sql_run_query, [MdbSQL, :string], MdbSQL.by_ref
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
- attach_function :mdb_sql_bind_all, [MdbSQL], :void
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: 25
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 1
10
- version: 0.1.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-11 00:00:00 Z
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