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