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