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