1 /* MDB Tools - A library for reading MS Access database files
2  * Copyright (C) 2000 Brian Bruns
3  *
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.
8  *
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.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 #ifndef _mdbtools_h_
19 #define _mdbtools_h_
20 
21 #include <glib.h>
22 
23 #ifdef __cplusplus
24   extern "C" {
25 #endif
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <stdarg.h>
29 #include <sys/types.h>
30 #include <sys/stat.h>
31 #include <fcntl.h>
32 #ifndef _WIN32
33 #include <unistd.h>
34 #endif
35 #include <ctype.h>
36 #include <string.h>
37 
38 #ifdef HAVE_ICONV
39 #include <iconv.h>
40 #endif
41 
42 #ifdef _WIN32
43 #include <io.h>
44 #endif
45 
46 #define MDB_DEBUG 0
47 
48 #define MDB_PGSIZE 4096
49 //#define MDB_MAX_OBJ_NAME (256*3) /* unicode 16 -> utf-8 worst case */
50 #define MDB_MAX_OBJ_NAME 256
51 #define MDB_MAX_COLS 256
52 #define MDB_MAX_IDX_COLS 10
53 #define MDB_CATALOG_PG 18
54 #define MDB_MEMO_OVERHEAD 12
55 #define MDB_BIND_SIZE 16384
56 
57 #define MDB_NO_BACKENDS 1
58 #define MDB_NO_STATS 1
59 
60 #ifdef _WIN32
61 #if BUILDING_LIBMDB
62 #define LIBMDB_DLL __declspec(dllexport)
63 #else
64 #define LIBMDB_DLL __declspec(dllimport)
65 #endif
66 #else
67 #define LIBMDB_DLL
68 #endif
69 
70 #ifndef _WIN32
71 #define MDB_DEPRECATED(type, func) type __attribute__((deprecated)) func
72 #else
73 #define MDB_DEPRECATED(type, func) __declspec(deprecated) type func
74 #endif
75 
76 enum {
77 	MDB_PAGE_DB = 0,
78 	MDB_PAGE_DATA,
79 	MDB_PAGE_TABLE,
80 	MDB_PAGE_INDEX,
81 	MDB_PAGE_LEAF,
82 	MDB_PAGE_MAP
83 };
84 enum {
85 	MDB_VER_JET3 = 0,
86 	MDB_VER_JET4 = 1,
87 	MDB_VER_ACCDB_2007 = 0x02,
88 	MDB_VER_ACCDB_2010 = 0x0103
89 };
90 enum {
91 	MDB_FORM = 0,
92 	MDB_TABLE,
93 	MDB_MACRO,
94 	MDB_SYSTEM_TABLE,
95 	MDB_REPORT,
96 	MDB_QUERY,
97 	MDB_LINKED_TABLE,
98 	MDB_MODULE,
99 	MDB_RELATIONSHIP,
100 	MDB_UNKNOWN_09,
101 	MDB_UNKNOWN_0A, /* User access */
102 	MDB_DATABASE_PROPERTY,
103 	MDB_ANY = -1
104 };
105 enum {
106 	MDB_BOOL = 0x01,
107 	MDB_BYTE = 0x02,
108 	MDB_INT = 0x03,
109 	MDB_LONGINT = 0x04,
110 	MDB_MONEY = 0x05,
111 	MDB_FLOAT = 0x06,
112 	MDB_DOUBLE = 0x07,
113 	MDB_DATETIME = 0x08,
114 	MDB_BINARY = 0x09,
115 	MDB_TEXT = 0x0a,
116 	MDB_OLE = 0x0b,
117 	MDB_MEMO = 0x0c,
118 	MDB_REPID = 0x0f,
119 	MDB_NUMERIC = 0x10,
120 	MDB_COMPLEX = 0x12
121 };
122 
123 /* SARG operators */
124 enum {
125 	MDB_OR = 1,
126 	MDB_AND,
127 	MDB_NOT,
128 	MDB_EQUAL,
129 	MDB_GT,
130 	MDB_LT,
131 	MDB_GTEQ,
132 	MDB_LTEQ,
133 	MDB_LIKE,
134 	MDB_ISNULL,
135 	MDB_NOTNULL
136 };
137 
138 typedef enum {
139 	MDB_TABLE_SCAN,
140 	MDB_LEAF_SCAN,
141 	MDB_INDEX_SCAN
142 } MdbStrategy;
143 
144 typedef enum {
145 	MDB_NOFLAGS = 0x00,
146 	MDB_WRITABLE = 0x01
147 } MdbFileFlags;
148 
149 enum {
150 	MDB_DEBUG_LIKE = 0x0001,
151 	MDB_DEBUG_WRITE = 0x0002,
152 	MDB_DEBUG_USAGE = 0x0004,
153 	MDB_DEBUG_OLE = 0x0008,
154 	MDB_DEBUG_ROW = 0x0010,
155 	MDB_DEBUG_PROPS = 0x0020,
156 	MDB_USE_INDEX = 0x0040,
157 	MDB_NO_MEMO = 0x0080, /* don't follow memo fields */
158 };
159 
160 #define mdb_is_logical_op(x) (x == MDB_OR || \
161 				x == MDB_AND || \
162 				x == MDB_NOT )
163 
164 #define mdb_is_relational_op(x) (x == MDB_EQUAL || \
165 				x == MDB_GT || \
166 				x == MDB_LT || \
167 				x == MDB_GTEQ || \
168 				x == MDB_LTEQ || \
169 				x == MDB_LIKE || \
170 				x == MDB_ISNULL || \
171 				x == MDB_NOTNULL )
172 
173 enum {
174 	MDB_ASC,
175 	MDB_DESC
176 };
177 
178 enum {
179 	MDB_IDX_UNIQUE = 0x01,
180 	MDB_IDX_IGNORENULLS = 0x02,
181 	MDB_IDX_REQUIRED = 0x08
182 };
183 
184 /* export schema options */
185 enum {
186 	MDB_SHEXP_DROPTABLE = 1<<0, /* issue drop table during export */
187 	MDB_SHEXP_CST_NOTNULL = 1<<1, /* generate NOT NULL constraints */
188 	MDB_SHEXP_CST_NOTEMPTY = 1<<2, /* <>'' constraints */
189 	MDB_SHEXP_COMMENTS = 1<<3, /* export comments on columns & tables */
190 	MDB_SHEXP_DEFVALUES = 1<<4, /* export default values */
191 	MDB_SHEXP_INDEXES = 1<<5, /* export indices */
192 	MDB_SHEXP_RELATIONS = 1<<6 /* export relation (foreign keys) */
193 };
194 #define MDB_SHEXP_DEFAULT (MDB_SHEXP_CST_NOTNULL | MDB_SHEXP_COMMENTS | MDB_SHEXP_INDEXES | MDB_SHEXP_RELATIONS)
195 
196 /* csv export binary options */
197 enum {
198 	MDB_BINEXPORT_STRIP,
199 	MDB_BINEXPORT_RAW,
200 	MDB_BINEXPORT_OCTAL
201 };
202 
203 #define IS_JET4(mdb) (mdb->f->jet_version==MDB_VER_JET4) /* obsolete */
204 #define IS_JET3(mdb) (mdb->f->jet_version==MDB_VER_JET3)
205 
206 /* forward declarations */
207 typedef struct mdbindex MdbIndex;
208 typedef struct mdbsargtree MdbSargNode;
209 
210 #if !MDB_NO_BACKENDS
211 typedef struct {
212 	char *name;
213 	unsigned char needs_length; /* or precision */
214 	unsigned char needs_scale;
215 	unsigned char needs_quotes;
216 } MdbBackendType;
217 
218 enum {
219 	MDB_BACKEND_ACCESS = 1,
220 	MDB_BACKEND_ORACLE,
221 	MDB_BACKEND_SYBASE,
222 	MDB_BACKEND_POSTGRES,
223 	MDB_BACKEND_MYSQL,
224 	MDB_BACKEND_SQLITE,
225 };
226 
227 enum {
228 	MDB_BACKEND_ACCESS = 1,
229 	MDB_BACKEND_ORACLE,
230 	MDB_BACKEND_SYBASE,
231 	MDB_BACKEND_POSTGRES,
232 	MDB_BACKEND_MYSQL,
233 	MDB_BACKEND_SQLITE,
234 };
235 
236 typedef struct {
237 	guint32 capabilities; /* see MDB_SHEXP_* */
238 	MdbBackendType *types_table;
239 	MdbBackendType *type_shortdate;
240 	MdbBackendType *type_autonum;
241 	const char *short_now;
242 	const char *long_now;
243 	const char *charset_statement;
244 	const char *drop_statement;
245 	const char *constaint_not_empty_statement;
246 	const char *column_comment_statement;
247 	const char *table_comment_statement;
248 	gchar* (*quote_schema_name)(const gchar*, const gchar*);
249 } MdbBackend;
250 #endif
251 
252 #if !MDB_NO_STATS
253 typedef struct {
254 	gboolean collect;
255 	unsigned long pg_reads;
256 } MdbStatistics;
257 #endif
258 
259 typedef struct {
260 	int           fd;
261 	gboolean      writable;
262 	char          *filename;
263 	guint32		jet_version;
264 	guint32		db_key;
265 	char		db_passwd[14];
266 #if !MDB_NO_BACKENDS
267 	MdbBackend	*default_backend;
268 	char			*backend_name;
269 #endif
270 #if !MDB_NO_STATS
271 	MdbStatistics	*stats;
272 #endif
273 	/* free map */
274 	int  map_sz;
275 	unsigned char *free_map;
276 	/* reference count */
277 	int refs;
278 } MdbFile;
279 
280 /* offset to row count on data pages...version dependant */
281 #ifdef  _WIN64
282 typedef __int64    ssize_t;
283 #elif defined _WIN32
284 typedef _W64 int   ssize_t;
285 #endif
286 typedef struct {
287 	ssize_t		pg_size;
288 	guint16		row_count_offset;
289 	guint16		tab_num_rows_offset;
290 	guint16		tab_num_cols_offset;
291 	guint16		tab_num_idxs_offset;
292 	guint16		tab_num_ridxs_offset;
293 	guint16		tab_usage_map_offset;
294 	guint16		tab_first_dpg_offset;
295 	guint16		tab_cols_start_offset;
296 	guint16		tab_ridx_entry_size;
297 	guint16		col_flags_offset;
298 	guint16		col_size_offset;
299 	guint16		col_num_offset;
300 	guint16		tab_col_entry_size;
301 	guint16         tab_free_map_offset;
302 	guint16		tab_col_offset_var;
303 	guint16		tab_col_offset_fixed;
304 	guint16		tab_row_col_num_offset;
305 } MdbFormatConstants;
306 
307 typedef struct {
308 	MdbFile       *f;
309 	guint32       cur_pg;
310 	guint16       row_num;
311 	unsigned int  cur_pos;
312 	unsigned char pg_buf[MDB_PGSIZE];
313 	unsigned char alt_pg_buf[MDB_PGSIZE];
314 	unsigned int  num_catalog;
315 	GPtrArray	*catalog;
316 #if !MDB_NO_BACKENDS
317 	MdbBackend	*default_backend;
318 	char		*backend_name;
319 #endif
320 	MdbFormatConstants *fmt;
321 #if !MDB_NO_STATS
322 	MdbStatistics *stats;
323 #endif
324 #ifdef HAVE_ICONV
325 	char*	jet3_iconv_code;
326 	iconv_t	iconv_in;
327 	iconv_t	iconv_out;
328 #endif
329 } MdbHandle;
330 
331 typedef struct {
332 	MdbHandle	*mdb;
333 	char           object_name[MDB_MAX_OBJ_NAME+1];
334 	int            object_type;
335 	unsigned long  table_pg; /* misnomer since object may not be a table */
336 	//int			num_props; please use props->len
337 	GArray		*props; /* GArray of MdbProperties */
338 	GArray		*columns;
339 	int		flags;
340 } MdbCatalogEntry;
341 
342 typedef struct {
343 	gchar *name;
344 	GHashTable	*hash;
345 } MdbProperties;
346 
347 typedef union {
348 	int	i;
349 	double	d;
350 	char	s[256];
351 } MdbAny;
352 
353 struct S_MdbTableDef; /* forward definition */
354 typedef struct {
355 	struct S_MdbTableDef *table;
356 	char		name[MDB_MAX_OBJ_NAME+1];
357 	int		col_type;
358 	int		col_size;
359 	void	*bind_ptr;
360 	int		*len_ptr;
361 	GHashTable	*properties;
362 	unsigned int	num_sargs;
363 	GPtrArray	*sargs;
364 	GPtrArray	*idx_sarg_cache;
365 	unsigned char   is_fixed;
366 	int		query_order;
367 	/* col_num is the current column order,
368 	 * does not include deletes */
369 	int		col_num;
370 	int		cur_value_start;
371 	int 		cur_value_len;
372 	/* MEMO/OLE readers */
373 	guint32		cur_blob_pg_row;
374 	int		chunk_size;
375 	/* numerics only */
376 	int		col_prec;
377 	int		col_scale;
378 	unsigned char     is_long_auto;
379 	unsigned char     is_uuid_auto;
380 	MdbProperties	*props;
381 	/* info needed for handling deleted/added columns */
382 	int 		fixed_offset;
383 	unsigned int	var_col_num;
384 	/* row_col_num is the row column number order,
385 	 * including deleted columns */
386 	int		row_col_num;
387 } MdbColumn;
388 
389 struct mdbsargtree {
390 	int       op;
391 	MdbColumn *col;
392 	MdbAny    value;
393 	void      *parent;
394 	MdbSargNode *left;
395 	MdbSargNode *right;
396 };
397 
398 typedef struct {
399 	guint32 pg;
400 	int start_pos;
401 	int offset;
402 	int len;
403 	guint16 idx_starts[2000];
404 	unsigned char cache_value[256];
405 } MdbIndexPage;
406 
407 typedef int (*MdbSargTreeFunc)(MdbSargNode *, gpointer data);
408 
409 #define MDB_MAX_INDEX_DEPTH 10
410 
411 typedef struct {
412 	int cur_depth;
413 	guint32 last_leaf_found;
414 	int clean_up_mode;
415 	MdbIndexPage pages[MDB_MAX_INDEX_DEPTH];
416 } MdbIndexChain;
417 
418 typedef struct S_MdbTableDef {
419 	MdbCatalogEntry *entry;
420 	char	name[MDB_MAX_OBJ_NAME+1];
421 	unsigned int    num_cols;
422 	GPtrArray	*columns;
423 	unsigned int    num_rows;
424 	int	index_start;
425 	unsigned int    num_real_idxs;
426 	unsigned int    num_idxs;
427 	GPtrArray	*indices;
428 	guint32	first_data_pg;
429 	guint32	cur_pg_num;
430 	guint32	cur_phys_pg;
431 	unsigned int    cur_row;
432 	int  noskip_del;  /* don't skip deleted rows */
433 	/* object allocation map */
434 	guint32  map_base_pg;
435 	size_t map_sz;
436 	unsigned char *usage_map;
437 	/* pages with free space left */
438 	guint32  freemap_base_pg;
439 	size_t freemap_sz;
440 	unsigned char *free_usage_map;
441 	/* query planner */
442 	MdbSargNode *sarg_tree;
443 	MdbStrategy strategy;
444 	MdbIndex *scan_idx;
445 	MdbHandle *mdbidx;
446 	MdbIndexChain *chain;
447 	MdbProperties	*props;
448 	unsigned int num_var_cols;  /* to know if row has variable columns */
449 	/* temp table */
450 	unsigned int  is_temp_table;
451 	GPtrArray     *temp_table_pages;
452 } MdbTableDef;
453 
454 struct mdbindex {
455 	int		index_num;
456 	char		name[MDB_MAX_OBJ_NAME+1];
457 	unsigned char	index_type;
458 	guint32		first_pg;
459 	int		num_rows;  /* number rows in index */
460 	unsigned int	num_keys;
461 	short	key_col_num[MDB_MAX_IDX_COLS];
462 	unsigned char	key_col_order[MDB_MAX_IDX_COLS];
463 	unsigned char	flags;
464 	MdbTableDef	*table;
465 };
466 
467 typedef struct {
468 	char		name[MDB_MAX_OBJ_NAME+1];
469 } MdbColumnProp;
470 
471 typedef struct {
472 	void *value;
473 	int siz;
474 	int start;
475 	unsigned char is_null;
476 	unsigned char is_fixed;
477 	int colnum;
478 	int offset;
479 } MdbField;
480 
481 typedef struct {
482 	int	op;
483 	MdbAny	value;
484 } MdbSarg;
485 
486 /* mem.c */
487 extern LIBMDB_DLL MDB_DEPRECATED(void, mdb_init());
488 extern LIBMDB_DLL MDB_DEPRECATED(void, mdb_exit());
489 /* glib - to allow static linking of glib in mdbtools */
490 extern LIBMDB_DLL void	 mdb_g_free	          (gpointer	 mem);
491 extern LIBMDB_DLL gpointer mdb_g_malloc         (gsize	 n_bytes);
492 extern LIBMDB_DLL gpointer mdb_g_malloc0        (gsize	 n_bytes);
493 
494 /* file.c */
495 extern LIBMDB_DLL ssize_t mdb_read_pg(MdbHandle *mdb, unsigned long pg);
496 extern LIBMDB_DLL ssize_t mdb_read_alt_pg(MdbHandle *mdb, unsigned long pg);
497 extern LIBMDB_DLL unsigned char mdb_get_byte(void *buf, int offset);
498 extern LIBMDB_DLL int    mdb_get_int16(char *buf, int offset);
499 extern LIBMDB_DLL long   mdb_get_int32(char *buf, int offset);
500 extern LIBMDB_DLL long   mdb_get_int32_msb(char *buf, int offset);
501 extern LIBMDB_DLL float  mdb_get_single(char *buf, int offset);
502 extern LIBMDB_DLL double mdb_get_double(char *buf, int offset);
503 extern LIBMDB_DLL unsigned char mdb_pg_get_byte(MdbHandle *mdb, int offset);
504 extern LIBMDB_DLL int    mdb_pg_get_int16(MdbHandle *mdb, int offset);
505 extern LIBMDB_DLL long   mdb_pg_get_int32(MdbHandle *mdb, int offset);
506 extern LIBMDB_DLL float  mdb_pg_get_single(MdbHandle *mdb, int offset);
507 extern LIBMDB_DLL double mdb_pg_get_double(MdbHandle *mdb, int offset);
508 extern LIBMDB_DLL void mdb_set_encoding(MdbHandle *mdb, const char *encoding_name);
509 extern LIBMDB_DLL MdbHandle *mdb_open(const char *filename, MdbFileFlags flags);
510 extern LIBMDB_DLL void mdb_close(MdbHandle *mdb);
511 extern LIBMDB_DLL MdbHandle *mdb_clone_handle(MdbHandle *mdb);
512 extern LIBMDB_DLL void mdb_swap_pgbuf(MdbHandle *mdb);
513 
514 /* catalog.c */
515 extern LIBMDB_DLL void mdb_free_catalog(MdbHandle *mdb);
516 extern LIBMDB_DLL GPtrArray *mdb_read_catalog(MdbHandle *mdb, int obj_type);
517 MdbCatalogEntry *mdb_get_catalogentry_by_name(MdbHandle *mdb, const gchar* name);
518 extern LIBMDB_DLL void mdb_dump_catalog(MdbHandle *mdb, int obj_type);
519 extern LIBMDB_DLL const char *mdb_get_objtype_string(int obj_type);
520 
521 /* table.c */
522 extern LIBMDB_DLL MdbTableDef *mdb_alloc_tabledef(MdbCatalogEntry *entry);
523 extern LIBMDB_DLL void mdb_free_tabledef(MdbTableDef *table);
524 extern LIBMDB_DLL MdbTableDef *mdb_read_table(MdbCatalogEntry *entry);
525 extern LIBMDB_DLL MdbTableDef *mdb_read_table_by_name(MdbHandle *mdb, gchar *table_name, int obj_type);
526 extern LIBMDB_DLL void mdb_append_column(GPtrArray *columns, MdbColumn *in_col);
527 extern LIBMDB_DLL void mdb_free_columns(GPtrArray *columns);
528 extern LIBMDB_DLL GPtrArray *mdb_read_columns(MdbTableDef *table);
529 extern LIBMDB_DLL void mdb_table_dump(MdbCatalogEntry *entry);
530 extern LIBMDB_DLL guint8 read_pg_if_8(MdbHandle *mdb, int *cur_pos);
531 extern LIBMDB_DLL guint16 read_pg_if_16(MdbHandle *mdb, int *cur_pos);
532 extern LIBMDB_DLL guint32 read_pg_if_32(MdbHandle *mdb, int *cur_pos);
533 extern LIBMDB_DLL void *read_pg_if_n(MdbHandle *mdb, char *buf, int *cur_pos, size_t len);
534 extern LIBMDB_DLL int mdb_is_user_table(MdbCatalogEntry *entry);
535 extern LIBMDB_DLL int mdb_is_system_table(MdbCatalogEntry *entry);
536 extern LIBMDB_DLL const char *mdb_table_get_prop(const MdbTableDef *table, const gchar *key);
537 extern LIBMDB_DLL const char *mdb_col_get_prop(const MdbColumn *col, const gchar *key);
538 
539 /* data.c */
540 extern LIBMDB_DLL int mdb_bind_column_by_name(MdbTableDef *table, const gchar *col_name, void *bind_ptr, int *len_ptr);
541 extern LIBMDB_DLL void mdb_data_dump(MdbTableDef *table);
542 extern LIBMDB_DLL void mdb_date_to_tm(double td, struct tm *t);
543 extern LIBMDB_DLL void mdb_bind_column(MdbTableDef *table, int col_num, void *bind_ptr, int *len_ptr);
544 extern LIBMDB_DLL int mdb_rewind_table(MdbTableDef *table);
545 extern LIBMDB_DLL int mdb_fetch_row(MdbTableDef *table);
546 extern LIBMDB_DLL int mdb_is_fixed_col(MdbColumn *col);
547 extern LIBMDB_DLL char *mdb_col_to_string(MdbHandle *mdb, char *buf, int start, int datatype, int size);
548 extern LIBMDB_DLL int mdb_find_pg_row(MdbHandle *mdb, int pg_row, char **buf, int *off, size_t *len);
549 extern LIBMDB_DLL int mdb_find_row(MdbHandle *mdb, int row, int *start, size_t *len);
550 extern LIBMDB_DLL int mdb_find_end_of_row(MdbHandle *mdb, int row);
551 extern LIBMDB_DLL int mdb_col_fixed_size(MdbColumn *col);
552 extern LIBMDB_DLL int mdb_col_disp_size(MdbColumn *col);
553 extern LIBMDB_DLL size_t mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr);
554 extern LIBMDB_DLL size_t mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size);
555 extern LIBMDB_DLL void* mdb_ole_read_full(MdbHandle *mdb, MdbColumn *col, size_t *size);
556 extern LIBMDB_DLL void mdb_set_date_fmt(const char *);
557 extern LIBMDB_DLL void mdb_set_boolean_fmt_words();
558 extern LIBMDB_DLL int mdb_read_row(MdbTableDef *table, unsigned int row);
559 
560 /* dump.c */
561 extern LIBMDB_DLL void mdb_buffer_dump(const void *buf, int start, size_t len);
562 
563 #if !MDB_NO_BACKENDS
564 /* backend.c */
565 extern MDB_DEPRECATED(char*, mdb_get_coltype_string(MdbBackend *backend, int col_type));
566 extern MDB_DEPRECATED(int, mdb_coltype_takes_length(MdbBackend *backend, int col_type));
567 extern const MdbBackendType* mdb_get_colbacktype(const MdbColumn *col);
568 extern const char* mdb_get_colbacktype_string(const MdbColumn *col);
569 extern int mdb_colbacktype_takes_length(const MdbColumn *col);
570 extern MDB_DEPRECATED(void, mdb_init_backends());
571 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*));
572 extern MDB_DEPRECATED(void, mdb_remove_backends());
573 extern int  mdb_set_default_backend(MdbHandle *mdb, const char *backend_name);
574 extern void mdb_print_schema(MdbHandle *mdb, FILE *outfile, char *tabname, char *dbnamespace, guint32 export_options);
575 #endif
576 
577 /* sargs.c */
578 extern LIBMDB_DLL int mdb_test_sargs(MdbTableDef *table, MdbField *fields, int num_fields);
579 extern LIBMDB_DLL int mdb_test_sarg(MdbHandle *mdb, MdbColumn *col, MdbSargNode *node, MdbField *field);
580 extern LIBMDB_DLL void mdb_sql_walk_tree(MdbSargNode *node, MdbSargTreeFunc func, gpointer data);
581 extern LIBMDB_DLL int mdb_find_indexable_sargs(MdbSargNode *node, gpointer data);
582 extern LIBMDB_DLL int mdb_add_sarg_by_name(MdbTableDef *table, char *colname, MdbSarg *in_sarg);
583 extern LIBMDB_DLL int mdb_test_string(MdbSargNode *node, char *s);
584 extern LIBMDB_DLL int mdb_test_int(MdbSargNode *node, gint32 i);
585 extern LIBMDB_DLL int mdb_add_sarg(MdbColumn *col, MdbSarg *in_sarg);
586 
587 
588 
589 /* index.c */
590 extern LIBMDB_DLL GPtrArray *mdb_read_indices(MdbTableDef *table);
591 extern LIBMDB_DLL void mdb_index_dump(MdbTableDef *table, MdbIndex *idx);
592 extern LIBMDB_DLL void mdb_index_scan_free(MdbTableDef *table);
593 extern LIBMDB_DLL int mdb_index_find_next_on_page(MdbHandle *mdb, MdbIndexPage *ipg);
594 extern LIBMDB_DLL int mdb_index_find_next(MdbHandle *mdb, MdbIndex *idx, MdbIndexChain *chain, guint32 *pg, guint16 *row);
595 extern LIBMDB_DLL void mdb_index_hash_text(char *text, char *hash);
596 extern LIBMDB_DLL void mdb_index_scan_init(MdbHandle *mdb, MdbTableDef *table);
597 extern LIBMDB_DLL int mdb_index_find_row(MdbHandle *mdb, MdbIndex *idx, MdbIndexChain *chain, guint32 pg, guint16 row);
598 extern LIBMDB_DLL void mdb_index_swap_n(unsigned char *src, int sz, unsigned char *dest);
599 extern LIBMDB_DLL void mdb_free_indices(GPtrArray *indices);
600 void mdb_index_page_reset(MdbIndexPage *ipg);
601 extern LIBMDB_DLL int mdb_index_pack_bitmap(MdbHandle *mdb, MdbIndexPage *ipg);
602 
603 #if !MDB_NO_STATS
604 /* stats.c */
605 extern LIBMDB_DLL void mdb_stats_on(MdbHandle *mdb);
606 extern LIBMDB_DLL void mdb_stats_off(MdbHandle *mdb);
607 extern LIBMDB_DLL void mdb_dump_stats(MdbHandle *mdb);
608 #endif
609 
610 /* like.c */
611 extern LIBMDB_DLL int mdb_like_cmp(char *s, char *r);
612 
613 /* write.c */
614 extern LIBMDB_DLL void mdb_put_int16(char *buf, guint32 offset, guint32 value);
615 extern LIBMDB_DLL void mdb_put_int32(char *buf, guint32 offset, guint32 value);
616 extern LIBMDB_DLL void mdb_put_int32_msb(char *buf, guint32 offset, guint32 value);
617 extern LIBMDB_DLL int mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbField *fields);
618 extern LIBMDB_DLL guint16 mdb_add_row_to_pg(MdbTableDef *table, unsigned char *row_buffer, int new_row_size);
619 extern LIBMDB_DLL int mdb_update_index(MdbTableDef *table, MdbIndex *idx, unsigned int num_fields, MdbField *fields, guint32 pgnum, guint16 rownum);
620 extern LIBMDB_DLL int mdb_insert_row(MdbTableDef *table, int num_fields, MdbField *fields);
621 extern LIBMDB_DLL int mdb_pack_row(MdbTableDef *table, unsigned char *row_buffer, unsigned int num_fields, MdbField *fields);
622 extern LIBMDB_DLL int mdb_replace_row(MdbTableDef *table, int row, void *new_row, int new_row_size);
623 extern LIBMDB_DLL int mdb_pg_get_freespace(MdbHandle *mdb);
624 extern LIBMDB_DLL int mdb_update_row(MdbTableDef *table);
625 extern LIBMDB_DLL void *mdb_new_data_pg(MdbCatalogEntry *entry);
626 
627 /* map.c */
628 extern LIBMDB_DLL guint32 mdb_map_find_next_freepage(MdbTableDef *table, int row_size);
629 extern LIBMDB_DLL gint32 mdb_map_find_next(MdbHandle *mdb, unsigned char *map, unsigned int map_sz, guint32 start_pg);
630 
631 /* props.c */
632 extern LIBMDB_DLL void mdb_free_props(MdbProperties *props);
633 extern LIBMDB_DLL void mdb_dump_props(MdbProperties *props, FILE *outfile, int show_name);
634 extern LIBMDB_DLL GArray* mdb_kkd_to_props(MdbHandle *mdb, char *kkd, size_t len);
635 
636 
637 /* worktable.c */
638 extern LIBMDB_DLL MdbTableDef *mdb_create_temp_table(MdbHandle *mdb, char *name);
639 extern LIBMDB_DLL void mdb_temp_table_add_col(MdbTableDef *table, MdbColumn *col);
640 extern LIBMDB_DLL void mdb_fill_temp_col(MdbColumn *tcol, char *col_name, int col_size, int col_type, int is_fixed);
641 extern LIBMDB_DLL void mdb_fill_temp_field(MdbField *field, void *value, int siz, int is_fixed, int is_null, int start, int column);
642 extern LIBMDB_DLL void mdb_temp_columns_end(MdbTableDef *table);
643 
644 /* options.c */
645 extern LIBMDB_DLL int mdb_get_option(unsigned long optnum);
646 extern LIBMDB_DLL void mdb_debug(int klass, const char *fmt, ...);
647 
648 /* iconv.c */
649 extern LIBMDB_DLL int mdb_unicode2ascii(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen);
650 extern LIBMDB_DLL int mdb_ascii2unicode(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen);
651 extern LIBMDB_DLL void mdb_iconv_init(MdbHandle *mdb);
652 extern LIBMDB_DLL void mdb_iconv_close(MdbHandle *mdb);
653 extern LIBMDB_DLL const char* mdb_target_charset(MdbHandle *mdb);
654 
655 #ifdef __cplusplus
656   }
657 #endif
658 
659 #endif /* _mdbtools_h_ */
660