libmdb 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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