1
/* MDB Tools - A library for reading MS Access database files
2
* Copyright (C) 2000 Brian Bruns
4
* This library is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Library General Public
6
* License as published by the Free Software Foundation; either
7
* version 2 of the License, or (at your option) any later version.
9
* This library is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Library General Public License for more details.
14
* You should have received a copy of the GNU Library General Public
15
* License along with this library; if not, write to the
16
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17
* Boston, MA 02111-1307, USA.
28
#include <sys/types.h>
43
#define MDB_PGSIZE 4096
44
#define MDB_MAX_OBJ_NAME 256
45
#define MDB_MAX_COLS 256
46
#define MDB_MAX_IDX_COLS 10
47
#define MDB_CATALOG_PG 18
48
#define MDB_MEMO_OVERHEAD 12
49
#define MDB_BIND_SIZE 16384
75
MDB_DATABASE_PROPERTY,
121
MDB_DEBUG_LIKE = 0x0001,
122
MDB_DEBUG_WRITE = 0x0002,
123
MDB_DEBUG_USAGE = 0x0004,
124
MDB_DEBUG_OLE = 0x0008,
125
MDB_DEBUG_ROW = 0x0010,
126
MDB_USE_INDEX = 0x0020,
127
MDB_NO_MEMO = 0x0040 /* don't follow memo fields */
130
#define mdb_is_logical_op(x) (x == MDB_OR || \
134
#define mdb_is_relational_op(x) (x == MDB_EQUAL || \
149
MDB_IDX_UNIQUE = 0x01,
150
MDB_IDX_IGNORENULLS = 0x02,
151
MDB_IDX_REQUIRED = 0x08
154
#define IS_JET4(mdb) (mdb->f->jet_version==MDB_VER_JET4)
155
#define IS_JET3(mdb) (mdb->f->jet_version==MDB_VER_JET3)
157
/* hash to store registered backends */
158
extern GHashTable *mdb_backends;
160
/* forward declarations */
161
typedef struct mdbindex MdbIndex;
162
typedef struct mdbsargtree MdbSargNode;
166
unsigned char needs_length; /* or precision */
167
unsigned char needs_scale;
168
unsigned char needs_quotes;
172
MdbBackendType *types_table;
177
unsigned long pg_reads;
187
MdbBackend *default_backend;
189
MdbStatistics *stats;
192
unsigned char *free_map;
193
/* reference count */
197
/* offset to row count on data pages...version dependant */
200
guint16 row_count_offset;
201
guint16 tab_num_rows_offset;
202
guint16 tab_num_cols_offset;
203
guint16 tab_num_idxs_offset;
204
guint16 tab_num_ridxs_offset;
205
guint16 tab_usage_map_offset;
206
guint16 tab_first_dpg_offset;
207
guint16 tab_cols_start_offset;
208
guint16 tab_ridx_entry_size;
209
guint16 col_fixed_offset;
210
guint16 col_size_offset;
211
guint16 col_num_offset;
212
guint16 tab_col_entry_size;
213
guint16 tab_free_map_offset;
214
guint16 tab_col_offset_var;
215
guint16 tab_col_offset_fixed;
216
guint16 tab_row_col_num_offset;
217
} MdbFormatConstants;
223
unsigned int cur_pos;
224
unsigned char pg_buf[MDB_PGSIZE];
225
unsigned char alt_pg_buf[MDB_PGSIZE];
226
unsigned int num_catalog;
228
MdbBackend *default_backend;
230
MdbFormatConstants *fmt;
231
MdbStatistics *stats;
240
char object_name[MDB_MAX_OBJ_NAME+1];
242
unsigned long table_pg; /* misnomer since object may not be a table */
243
unsigned long kkd_pg;
244
unsigned int kkd_rowid;
263
char name[MDB_MAX_OBJ_NAME+1];
268
GHashTable *properties;
269
unsigned int num_sargs;
271
GPtrArray *idx_sarg_cache;
272
unsigned char is_fixed;
274
/* col_num is the current column order,
275
* does not include deletes */
279
/* MEMO/OLE readers */
280
guint32 cur_blob_pg_row;
285
MdbProperties *props;
286
/* info needed for handling deleted/added columns */
288
unsigned int var_col_num;
289
/* row_col_num is the row column number order,
290
* including deleted columns */
308
guint16 idx_starts[2000];
309
unsigned char cache_value[256];
312
typedef int (*MdbSargTreeFunc)(MdbSargNode *, gpointer data);
314
#define MDB_MAX_INDEX_DEPTH 10
318
guint32 last_leaf_found;
320
MdbIndexPage pages[MDB_MAX_INDEX_DEPTH];
324
MdbCatalogEntry *entry;
325
char name[MDB_MAX_OBJ_NAME+1];
326
unsigned int num_cols;
328
unsigned int num_rows;
330
unsigned int num_real_idxs;
331
unsigned int num_idxs;
333
guint32 first_data_pg;
336
unsigned int cur_row;
337
int noskip_del; /* don't skip deleted rows */
338
/* object allocation map */
341
unsigned char *usage_map;
342
/* pages with free space left */
343
guint32 freemap_base_pg;
344
unsigned int freemap_sz;
345
unsigned char *free_usage_map;
347
MdbSargNode *sarg_tree;
348
MdbStrategy strategy;
351
MdbIndexChain *chain;
352
MdbProperties *props;
353
unsigned int num_var_cols; /* to know if row has variable columns */
355
unsigned int is_temp_table;
356
GPtrArray *temp_table_pages;
361
char name[MDB_MAX_OBJ_NAME+1];
362
unsigned char index_type;
364
int num_rows; /* number rows in index */
365
unsigned int num_keys;
366
short key_col_num[MDB_MAX_IDX_COLS];
367
unsigned char key_col_order[MDB_MAX_IDX_COLS];
373
char name[MDB_MAX_OBJ_NAME+1];
380
unsigned char is_null;
381
unsigned char is_fixed;
392
extern void mdb_init();
393
extern void mdb_exit();
396
extern ssize_t mdb_read_pg(MdbHandle *mdb, unsigned long pg);
397
extern ssize_t mdb_read_alt_pg(MdbHandle *mdb, unsigned long pg);
398
extern unsigned char mdb_get_byte(unsigned char *buf, int offset);
399
extern int mdb_get_int16(unsigned char *buf, int offset);
400
extern gint32 mdb_get_int24(unsigned char *buf, int offset);
401
extern long mdb_get_int32(unsigned char *buf, int offset);
402
extern float mdb_get_single(unsigned char *buf, int offset);
403
extern double mdb_get_double(unsigned char *buf, int offset);
404
extern unsigned char mdb_pg_get_byte(MdbHandle *mdb, int offset);
405
extern int mdb_pg_get_int16(MdbHandle *mdb, int offset);
406
extern gint32 mdb_pg_get_int24(MdbHandle *mdb, int offset);
407
extern long mdb_pg_get_int32(MdbHandle *mdb, int offset);
408
extern float mdb_pg_get_single(MdbHandle *mdb, int offset);
409
extern double mdb_pg_get_double(MdbHandle *mdb, int offset);
410
extern gint32 mdb_pg_get_int24_msb(MdbHandle *mdb, int offset);
411
extern MdbHandle *mdb_open(const char *filename, MdbFileFlags flags);
412
extern void mdb_close(MdbHandle *mdb);
413
extern MdbHandle *mdb_clone_handle(MdbHandle *mdb);
414
extern void mdb_swap_pgbuf(MdbHandle *mdb);
415
extern long _mdb_get_int32(unsigned char *buf, int offset);
418
extern void mdb_free_catalog(MdbHandle *mdb);
419
extern GPtrArray *mdb_read_catalog(MdbHandle *mdb, int obj_type);
420
extern void mdb_dump_catalog(MdbHandle *mdb, int obj_type);
421
extern char *mdb_get_objtype_string(int obj_type);
424
extern MdbTableDef *mdb_alloc_tabledef(MdbCatalogEntry *entry);
425
extern void mdb_free_tabledef(MdbTableDef *table);
426
extern MdbTableDef *mdb_read_table(MdbCatalogEntry *entry);
427
extern MdbTableDef *mdb_read_table_by_name(MdbHandle *mdb, gchar *table_name, int obj_type);
428
extern void mdb_append_column(GPtrArray *columns, MdbColumn *in_col);
429
extern void mdb_free_columns(GPtrArray *columns);
430
extern GPtrArray *mdb_read_columns(MdbTableDef *table);
431
extern void mdb_table_dump(MdbCatalogEntry *entry);
432
extern guint16 read_pg_if_16(MdbHandle *mdb, int *cur_pos);
433
extern guint32 read_pg_if_32(MdbHandle *mdb, int *cur_pos);
434
extern int read_pg_if(MdbHandle *mdb, int *cur_pos, int offset);
435
extern guint16 read_pg_if_n(MdbHandle *mdb, unsigned char *buf, int *cur_pos, int len);
436
extern int mdb_is_user_table(MdbCatalogEntry *entry);
437
extern int mdb_is_system_table(MdbCatalogEntry *entry);
440
extern int mdb_bind_column_by_name(MdbTableDef *table, gchar *col_name, void *bind_ptr, int *len_ptr);
441
extern void mdb_data_dump(MdbTableDef *table);
442
extern void mdb_bind_column(MdbTableDef *table, int col_num, void *bind_ptr, int *len_ptr);
443
extern int mdb_rewind_table(MdbTableDef *table);
444
extern int mdb_fetch_row(MdbTableDef *table);
445
extern int mdb_is_fixed_col(MdbColumn *col);
446
extern char *mdb_col_to_string(MdbHandle *mdb, unsigned char *buf, int start, int datatype, int size);
447
extern int mdb_find_pg_row(MdbHandle *mdb, int pg_row, char **buf, int *off, int *len);
448
extern int mdb_find_row(MdbHandle *mdb, int row, int *start, int *len);
449
extern int mdb_find_end_of_row(MdbHandle *mdb, int row);
450
extern int mdb_col_fixed_size(MdbColumn *col);
451
extern int mdb_col_disp_size(MdbColumn *col);
452
extern int mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr);
453
extern int mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size);
454
extern void mdb_set_date_fmt(const char *);
455
extern int mdb_read_row(MdbTableDef *table, unsigned int row);
458
extern void buffer_dump(const unsigned char* buf, int start, int end);
461
extern char *mdb_get_coltype_string(MdbBackend *backend, int col_type);
462
extern int mdb_coltype_takes_length(MdbBackend *backend, int col_type);
463
extern void mdb_init_backends();
464
extern void mdb_register_backend(MdbBackendType *backend, char *backend_name);
465
extern void mdb_remove_backends();
466
extern int mdb_set_default_backend(MdbHandle *mdb, char *backend_name);
467
extern char *mdb_get_relationships(MdbHandle *mdb);
470
extern int mdb_test_sargs(MdbTableDef *table, MdbField *fields, int num_fields);
471
extern int mdb_test_sarg(MdbHandle *mdb, MdbColumn *col, MdbSargNode *node, MdbField *field);
472
extern void mdb_sql_walk_tree(MdbSargNode *node, MdbSargTreeFunc func, gpointer data);
473
extern int mdb_find_indexable_sargs(MdbSargNode *node, gpointer data);
474
extern int mdb_add_sarg_by_name(MdbTableDef *table, char *colname, MdbSarg *in_sarg);
475
extern int mdb_test_string(MdbSargNode *node, char *s);
476
extern int mdb_test_int(MdbSargNode *node, gint32 i);
477
extern int mdb_add_sarg(MdbColumn *col, MdbSarg *in_sarg);
482
extern GPtrArray *mdb_read_indices(MdbTableDef *table);
483
extern void mdb_index_dump(MdbTableDef *table, MdbIndex *idx);
484
extern void mdb_index_scan_free(MdbTableDef *table);
485
extern int mdb_index_find_next_on_page(MdbHandle *mdb, MdbIndexPage *ipg);
486
extern int mdb_index_find_next(MdbHandle *mdb, MdbIndex *idx, MdbIndexChain *chain, guint32 *pg, guint16 *row);
487
extern void mdb_index_hash_text(guchar *text, guchar *hash);
488
extern void mdb_index_scan_init(MdbHandle *mdb, MdbTableDef *table);
489
extern int mdb_index_find_row(MdbHandle *mdb, MdbIndex *idx, MdbIndexChain *chain, guint32 pg, guint16 row);
490
extern void mdb_index_swap_n(unsigned char *src, int sz, unsigned char *dest);
491
extern void mdb_free_indices(GPtrArray *indices);
492
void mdb_index_page_reset(MdbIndexPage *ipg);
493
extern int mdb_index_pack_bitmap(MdbHandle *mdb, MdbIndexPage *ipg);
496
extern void mdb_stats_on(MdbHandle *mdb);
497
extern void mdb_stats_off(MdbHandle *mdb);
498
extern void mdb_dump_stats(MdbHandle *mdb);
501
extern int mdb_like_cmp(char *s, char *r);
504
extern int mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbField *fields);
505
extern guint16 mdb_add_row_to_pg(MdbTableDef *table, unsigned char *row_buffer, int new_row_size);
506
extern int mdb_update_index(MdbTableDef *table, MdbIndex *idx, unsigned int num_fields, MdbField *fields, guint32 pgnum, guint16 rownum);
507
extern int mdb_pack_row(MdbTableDef *table, unsigned char *row_buffer, unsigned int num_fields, MdbField *fields);
508
extern int mdb_replace_row(MdbTableDef *table, int row, unsigned char *new_row, int new_row_size);
509
extern int mdb_pg_get_freespace(MdbHandle *mdb);
510
extern int mdb_update_row(MdbTableDef *table);
511
extern unsigned char *mdb_new_data_pg(MdbCatalogEntry *entry);
514
extern guint32 mdb_map_find_next_freepage(MdbTableDef *table, int row_size);
515
extern guint32 mdb_map_find_next(MdbHandle *mdb, unsigned char *map, unsigned int map_sz, guint32 start_pg);
518
extern GPtrArray *mdb_read_props_list(gchar *kkd, int len);
519
extern void mdb_free_props(MdbProperties *props);
520
extern MdbProperties *mdb_read_props(MdbHandle *mdb, GPtrArray *names, gchar *kkd, int len);
523
extern MdbTableDef *mdb_create_temp_table(MdbHandle *mdb, char *name);
524
extern void mdb_temp_table_add_col(MdbTableDef *table, MdbColumn *col);
525
extern void mdb_fill_temp_col(MdbColumn *tcol, char *col_name, int col_size, int col_type, int is_fixed);
526
extern void mdb_fill_temp_field(MdbField *field, void *value, int siz, int is_fixed, int is_null, int start, int column);
527
extern void mdb_temp_columns_end(MdbTableDef *table);
530
extern int mdb_get_option(unsigned long optnum);
531
extern void mdb_debug(int klass, char *fmt, ...);
534
extern int mdb_unicode2ascii(MdbHandle *mdb, unsigned char *src, unsigned int slen, unsigned char *dest, unsigned int dlen);
535
extern int mdb_ascii2unicode(MdbHandle *mdb, unsigned char *src, unsigned int slen, unsigned char *dest, unsigned int dlen);
536
extern void mdb_iconv_init(MdbHandle *mdb);
537
extern void mdb_iconv_close(MdbHandle *mdb);
543
#endif /* _mdbtools_h_ */