Drizzled Public API Documentation

myisam.h

00001 /* Copyright (C) 2000 MySQL AB
00002 
00003    This program is free software; you can redistribute it and/or modify
00004    it under the terms of the GNU General Public License as published by
00005    the Free Software Foundation; version 2 of the License.
00006 
00007    This program is distributed in the hope that it will be useful,
00008    but WITHOUT ANY WARRANTY; without even the implied warranty of
00009    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00010    GNU General Public License for more details.
00011 
00012    You should have received a copy of the GNU General Public License
00013    along with this program; if not, write to the Free Software
00014    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */
00015 
00016 /* This file should be included when using myisam_funktions */
00017 
00018 #pragma once
00019 
00020 #include <drizzled/identifier.h>
00021 
00022 #include <drizzled/key_map.h>
00023 
00024 #include <drizzled/base.h>
00025 #ifndef _m_ctype_h
00026 #include <drizzled/charset_info.h>
00027 #endif
00028 #ifndef _keycache_h
00029 #include "keycache.h"
00030 #endif
00031 #include <plugin/myisam/my_handler.h>
00032 #include <drizzled/internal/iocache.h>
00033 
00034 /*
00035   Limit max keys according to HA_MAX_POSSIBLE_KEY
00036 */
00037 
00038 #if MAX_INDEXES > HA_MAX_POSSIBLE_KEY
00039 #define MI_MAX_KEY                  HA_MAX_POSSIBLE_KEY /* Max allowed keys */
00040 #else
00041 #define MI_MAX_KEY                  MAX_INDEXES         /* Max allowed keys */
00042 #endif
00043 
00044 /*
00045   The following defines can be increased if necessary.
00046   But beware the dependency of MI_MAX_POSSIBLE_KEY_BUFF and MI_MAX_KEY_LENGTH.
00047 */
00048 #define MI_MAX_KEY_LENGTH           1332            /* Max length in bytes */
00049 #define MI_MAX_KEY_SEG              16              /* Max segments for key */
00050 
00051 #define MI_MAX_POSSIBLE_KEY_BUFF (MI_MAX_KEY_LENGTH + 6 + 6) /* For mi_check */
00052 
00053 #define MI_MAX_KEY_BUFF  (MI_MAX_KEY_LENGTH+MI_MAX_KEY_SEG*6+8+8)
00054 #define MI_MAX_MSG_BUF      1024 /* used in CHECK TABLE, REPAIR TABLE */
00055 #define MI_NAME_IEXT  ".MYI"
00056 #define MI_NAME_DEXT  ".MYD"
00057 /* Max extra space to use when sorting keys */
00058 #define MI_MAX_TEMP_LENGTH  2*1024L*1024L*1024L
00059 
00060 /* Possible values for myisam_block_size (must be power of 2) */
00061 #define MI_KEY_BLOCK_LENGTH 1024  /* default key block length */
00062 #define MI_MIN_KEY_BLOCK_LENGTH 1024  /* Min key block length */
00063 #define MI_MAX_KEY_BLOCK_LENGTH 16384
00064 
00065 /*
00066   In the following macros '_keyno_' is 0 .. keys-1.
00067   If there can be more keys than bits in the key_map, the highest bit
00068   is for all upper keys. They cannot be switched individually.
00069   This means that clearing of high keys is ignored, setting one high key
00070   sets all high keys.
00071 */
00072 #define MI_KEYMAP_BITS      (64)
00073 #define MI_KEYMAP_HIGH_MASK (1UL << (MI_KEYMAP_BITS - 1))
00074 #define mi_get_mask_all_keys_active(_keys_) \
00075                             (((_keys_) < MI_KEYMAP_BITS) ? \
00076                              ((1UL << (_keys_)) - 1UL) : \
00077                              (~ 0UL))
00078 
00079 #if MI_MAX_KEY > MI_KEYMAP_BITS
00080 
00081 #define mi_is_key_active(_keymap_,_keyno_) \
00082                             (((_keyno_) < MI_KEYMAP_BITS) ? \
00083                              test((_keymap_) & (1UL << (_keyno_))) : \
00084                              test((_keymap_) & MI_KEYMAP_HIGH_MASK))
00085 #define mi_set_key_active(_keymap_,_keyno_) \
00086                             (_keymap_)|= (((_keyno_) < MI_KEYMAP_BITS) ? \
00087                                           (1UL << (_keyno_)) : \
00088                                           MI_KEYMAP_HIGH_MASK)
00089 #define mi_clear_key_active(_keymap_,_keyno_) \
00090                             (_keymap_)&= (((_keyno_) < MI_KEYMAP_BITS) ? \
00091                                           (~ (1UL << (_keyno_))) : \
00092                                           (~ (0UL)) /*ignore*/ )
00093 
00094 #else
00095 
00096 #define mi_is_key_active(_keymap_,_keyno_) \
00097                             test((_keymap_) & (1UL << (_keyno_)))
00098 #define mi_set_key_active(_keymap_,_keyno_) \
00099                             (_keymap_)|= (1UL << (_keyno_))
00100 #define mi_clear_key_active(_keymap_,_keyno_) \
00101                             (_keymap_)&= (~ (1UL << (_keyno_)))
00102 
00103 #endif
00104 
00105 #define mi_is_any_key_active(_keymap_) \
00106                             test((_keymap_))
00107 #define mi_is_all_keys_active(_keymap_,_keys_) \
00108                             ((_keymap_) == mi_get_mask_all_keys_active(_keys_))
00109 #define mi_set_all_keys_active(_keymap_,_keys_) \
00110                             (_keymap_)= mi_get_mask_all_keys_active(_keys_)
00111 #define mi_clear_all_keys_active(_keymap_) \
00112                             (_keymap_)= 0
00113 #define mi_intersect_keys_active(_to_,_from_) \
00114                             (_to_)&= (_from_)
00115 #define mi_is_any_intersect_keys_active(_keymap1_,_keys_,_keymap2_) \
00116                             ((_keymap1_) & (_keymap2_) & \
00117                              mi_get_mask_all_keys_active(_keys_))
00118 #define mi_copy_keys_active(_to_,_maxkeys_,_from_) \
00119                             (_to_)= (mi_get_mask_all_keys_active(_maxkeys_) & \
00120                                      (_from_))
00121 
00122   /* Param to/from mi_status */
00123 
00124 typedef struct st_mi_isaminfo   /* Struct from h_info */
00125 {
00126   drizzled::ha_rows records;      /* Records in database */
00127   drizzled::ha_rows deleted;      /* Deleted records in database */
00128   drizzled::internal::my_off_t recpos;      /* Pos for last used record */
00129   drizzled::internal::my_off_t newrecpos;     /* Pos if we write new record */
00130   drizzled::internal::my_off_t dupp_key_pos;    /* Position to record with dupp key */
00131   drizzled::internal::my_off_t data_file_length,    /* Length of data file */
00132            max_data_file_length,
00133            index_file_length,
00134            max_index_file_length,
00135            delete_length;
00136   ulong reclength;      /* Recordlength */
00137   ulong mean_reclength;     /* Mean recordlength (if packed) */
00138   uint64_t auto_increment;
00139   uint64_t key_map;     /* Which keys are used */
00140   char  *data_file_name, *index_file_name;
00141   uint32_t  keys;       /* Number of keys in use */
00142   uint  options;      /* HA_OPTION_... used */
00143   int errkey,       /* With key was dupplicated on err */
00144   sortkey;      /* clustered by this key */
00145   int filenr;       /* (uniq) filenr for datafile */
00146   time_t create_time;     /* When table was created */
00147   time_t check_time;
00148   time_t update_time;
00149   uint32_t  reflength;
00150   ulong record_offset;
00151   ulong *rec_per_key;     /* for sql optimizing */
00152 } MI_ISAMINFO;
00153 
00154 
00155 typedef struct st_mi_create_info
00156 {
00157   const char *index_file_name, *data_file_name; /* If using symlinks */
00158   drizzled::ha_rows max_rows;
00159   drizzled::ha_rows reloc_rows;
00160   uint64_t auto_increment;
00161   uint64_t data_file_length;
00162   uint64_t key_file_length;
00163   uint32_t old_options;
00164   uint8_t language;
00165   bool with_auto_increment;
00166 
00167   st_mi_create_info():
00168     index_file_name(0),
00169     data_file_name(0),
00170     max_rows(0),
00171     reloc_rows(0),
00172     auto_increment(0),
00173     data_file_length(0),
00174     key_file_length(0),
00175     old_options(0),
00176     language(0),
00177     with_auto_increment(0)
00178   { }
00179 
00180 } MI_CREATE_INFO;
00181 
00182 struct st_myisam_info;      /* For referense */
00183 struct st_mi_isam_share;
00184 typedef struct st_myisam_info MI_INFO;
00185 struct st_mi_s_param;
00186 
00187 typedef struct st_mi_keydef   /* Key definition with open & info */
00188 {
00189   struct st_mi_isam_share *share;       /* Pointer to base (set in mi_open) */
00190   uint16_t keysegs;     /* Number of key-segment */
00191   uint16_t flag;        /* NOSAME, PACK_USED */
00192 
00193   uint8_t  key_alg;     /* BTREE, RTREE */
00194   uint16_t block_length;      /* Length of keyblock (auto) */
00195   uint16_t underflow_block_length;  /* When to execute underflow */
00196   uint16_t keylength;     /* Tot length of keyparts (auto) */
00197   uint16_t minlength;     /* min length of (packed) key (auto) */
00198   uint16_t maxlength;     /* max length of (packed) key (auto) */
00199   uint16_t block_size_index;    /* block_size (auto) */
00200   uint32_t version;     /* For concurrent read/write */
00201 
00202   HA_KEYSEG *seg,*end;
00203 
00204   int (*bin_search)(struct st_myisam_info *info,struct st_mi_keydef *keyinfo,
00205         unsigned char *page,unsigned char *key,
00206         uint32_t key_len,uint32_t comp_flag,unsigned char * *ret_pos,
00207         unsigned char *buff, bool *was_last_key);
00208   uint32_t (*get_key)(struct st_mi_keydef *keyinfo,uint32_t nod_flag,unsigned char * *page,
00209       unsigned char *key);
00210   int (*pack_key)(struct st_mi_keydef *keyinfo,uint32_t nod_flag,unsigned char *next_key,
00211       unsigned char *org_key, unsigned char *prev_key, unsigned char *key,
00212       struct st_mi_s_param *s_temp);
00213   void (*store_key)(struct st_mi_keydef *keyinfo, unsigned char *key_pos,
00214         struct st_mi_s_param *s_temp);
00215   int (*ck_insert)(struct st_myisam_info *inf, uint32_t k_nr, unsigned char *k, uint32_t klen);
00216   int (*ck_delete)(struct st_myisam_info *inf, uint32_t k_nr, unsigned char *k, uint32_t klen);
00217 } MI_KEYDEF;
00218 
00219 
00220 #define MI_UNIQUE_HASH_LENGTH 4
00221 
00222 typedef struct st_unique_def    /* Segment definition of unique */
00223 {
00224   uint16_t keysegs;     /* Number of key-segment */
00225   unsigned char key;        /* Mapped to which key */
00226   uint8_t null_are_equal;
00227   HA_KEYSEG *seg,*end;
00228 } MI_UNIQUEDEF;
00229 
00230 typedef struct st_mi_decode_tree  /* Decode huff-table */
00231 {
00232   uint16_t *table;
00233   uint   quick_table_bits;
00234   unsigned char  *intervalls;
00235 } MI_DECODE_TREE;
00236 
00237 
00238 struct st_mi_bit_buff;
00239 
00240 /*
00241   Note that null markers should always be first in a row !
00242   When creating a column, one should only specify:
00243   type, length, null_bit and null_pos
00244 */
00245 
00246 namespace drizzled
00247 {
00248 
00249 typedef struct st_columndef   /* column information */
00250 {
00251   int16_t  type;        /* en_fieldtype */
00252   uint16_t length;      /* length of field */
00253   uint32_t offset;      /* Offset to position in row */
00254   uint8_t  null_bit;      /* If column may be 0 */
00255   uint16_t null_pos;      /* position for null marker */
00256 
00257 #ifndef NOT_PACKED_DATABASES
00258   void (*unpack)(struct st_columndef *rec,struct st_mi_bit_buff *buff,
00259      unsigned char *start,unsigned char *end);
00260   enum drizzled::en_fieldtype base_type;
00261   uint32_t space_length_bits,pack_type;
00262   MI_DECODE_TREE *huff_tree;
00263 #endif
00264 } MI_COLUMNDEF;
00265 
00266 }
00267 
00268 
00269 extern char * myisam_log_filename;    /* Name of logfile */
00270 extern uint32_t myisam_block_size;
00271 extern uint32_t myisam_concurrent_insert;
00272 extern uint32_t myisam_bulk_insert_tree_size; 
00273 extern uint32_t data_pointer_size;
00274 
00275   /* Prototypes for myisam-functions */
00276 
00277 extern int mi_close(struct st_myisam_info *file);
00278 extern int mi_delete(struct st_myisam_info *file,const unsigned char *buff);
00279 extern struct st_myisam_info *mi_open(const drizzled::identifier::Table &identifier,
00280                                       int mode,
00281               uint32_t wait_if_locked);
00282 extern int mi_panic(enum drizzled::ha_panic_function function);
00283 extern int mi_rfirst(struct st_myisam_info *file,unsigned char *buf,int inx);
00284 extern int mi_rkey(MI_INFO *info, unsigned char *buf, int inx, const unsigned char *key,
00285                    drizzled::key_part_map keypart_map, enum drizzled::ha_rkey_function search_flag);
00286 extern int mi_rlast(struct st_myisam_info *file,unsigned char *buf,int inx);
00287 extern int mi_rnext(struct st_myisam_info *file,unsigned char *buf,int inx);
00288 extern int mi_rnext_same(struct st_myisam_info *info, unsigned char *buf);
00289 extern int mi_rprev(struct st_myisam_info *file,unsigned char *buf,int inx);
00290 extern int mi_rrnd(struct st_myisam_info *file,unsigned char *buf, drizzled::internal::my_off_t pos);
00291 extern int mi_scan_init(struct st_myisam_info *file);
00292 extern int mi_scan(struct st_myisam_info *file,unsigned char *buf);
00293 extern int mi_rsame(struct st_myisam_info *file,unsigned char *record,int inx);
00294 extern int mi_update(struct st_myisam_info *file,const unsigned char *old,
00295          unsigned char *new_record);
00296 extern int mi_write(struct st_myisam_info *file,unsigned char *buff);
00297 extern drizzled::internal::my_off_t mi_position(struct st_myisam_info *file);
00298 extern int mi_status(struct st_myisam_info *info, MI_ISAMINFO *x, uint32_t flag);
00299 extern int mi_lock_database(struct st_myisam_info *file,int lock_type);
00300 extern int mi_create(const char *name,uint32_t keys,MI_KEYDEF *keydef,
00301          uint32_t columns, drizzled::MI_COLUMNDEF *columndef,
00302          uint32_t uniques, MI_UNIQUEDEF *uniquedef,
00303          MI_CREATE_INFO *create_info, uint32_t flags);
00304 extern int mi_delete_table(const char *name);
00305 extern int mi_rename(const char *from, const char *to);
00306 extern int mi_extra(struct st_myisam_info *file,
00307         enum drizzled::ha_extra_function function,
00308         void *extra_arg);
00309 extern int mi_reset(struct st_myisam_info *file);
00310 extern drizzled::ha_rows mi_records_in_range(MI_INFO *info, int inx,
00311                                    drizzled::key_range *min_key, drizzled::key_range *max_key);
00312 extern int mi_log(int activate_log);
00313 extern int mi_delete_all_rows(struct st_myisam_info *info);
00314 extern ulong _mi_calc_blob_length(uint32_t length , const unsigned char *pos);
00315 extern uint32_t mi_get_pointer_length(uint64_t file_length, uint32_t def);
00316 
00317 /* this is used to pass to mysql_myisamchk_table */
00318 
00319 #define   MYISAMCHK_REPAIR 1  /* equivalent to myisamchk -r */
00320 #define   MYISAMCHK_VERIFY 2  /* Verify, run repair if failure */
00321 
00322 /*
00323   Definitions needed for myisamchk.c
00324 
00325   Entries marked as "QQ to be removed" are NOT used to
00326   pass check/repair options to mi_check.c. They are used
00327   internally by myisamchk.c or/and ha_myisam.cc and should NOT
00328   be stored together with other flags. They should be removed
00329   from the following list to make addition of new flags possible.
00330 */
00331 
00332 #define T_AUTO_INC              1
00333 #define T_AUTO_REPAIR           2              /* QQ to be removed */
00334 #define T_BACKUP_DATA           4
00335 #define T_CALC_CHECKSUM         8
00336 #define T_CHECK                 16             /* QQ to be removed */
00337 #define T_CHECK_ONLY_CHANGED    32             /* QQ to be removed */
00338 #define T_CREATE_MISSING_KEYS   64
00339 #define T_DESCRIPT              128
00340 #define T_DONT_CHECK_CHECKSUM   256
00341 #define T_EXTEND                512
00342 #define T_FAST                  (1L << 10)     /* QQ to be removed */
00343 #define T_FORCE_CREATE          (1L << 11)     /* QQ to be removed */
00344 #define T_FORCE_UNIQUENESS      (1L << 12)
00345 #define T_INFO                  (1L << 13)
00346 #define T_MEDIUM                (1L << 14)
00347 #define T_QUICK                 (1L << 15)     /* QQ to be removed */
00348 #define T_READONLY              (1L << 16)     /* QQ to be removed */
00349 #define T_REP                   (1L << 17)
00350 #define T_REP_BY_SORT           (1L << 18)     /* QQ to be removed */
00351 #define T_REP_PARALLEL          (1L << 19)     /* QQ to be removed */
00352 #define T_RETRY_WITHOUT_QUICK   (1L << 20)
00353 #define T_SAFE_REPAIR           (1L << 21)
00354 #define T_SILENT                (1L << 22)
00355 #define T_SORT_INDEX            (1L << 23)     /* QQ to be removed */
00356 #define T_SORT_RECORDS          (1L << 24)     /* QQ to be removed */
00357 #define T_STATISTICS            (1L << 25)
00358 #define T_UNPACK                (1L << 26)
00359 #define T_UPDATE_STATE          (1L << 27)
00360 #define T_VERBOSE               (1L << 28)
00361 #define T_VERY_SILENT           (1L << 29)
00362 #define T_WAIT_FOREVER          (1L << 30)
00363 #define T_WRITE_LOOP            ((ulong) 1L << 31)
00364 
00365 #define T_REP_ANY               (T_REP | T_REP_BY_SORT | T_REP_PARALLEL)
00366 
00367 #define O_NEW_INDEX 1   /* Bits set in out_flag */
00368 #define O_NEW_DATA  2
00369 #define O_DATA_LOST 4
00370 
00371 /* these struct is used by my_check to tell it what to do */
00372 
00373 typedef struct st_sort_key_blocks   /* Used when sorting */
00374 {
00375   unsigned char *buff,*end_pos;
00376   unsigned char lastkey[MI_MAX_POSSIBLE_KEY_BUFF];
00377   uint32_t last_length;
00378   int inited;
00379 } SORT_KEY_BLOCKS;
00380 
00381 
00382 /*
00383   MyISAM supports several statistics collection methods. Currently statistics
00384   collection method is not stored in MyISAM file and has to be specified for
00385   each table analyze/repair operation in  MI_CHECK::stats_method.
00386 */
00387 
00388 typedef enum
00389 {
00390   /* Treat NULLs as inequal when collecting statistics (default for 4.1/5.0) */
00391   MI_STATS_METHOD_NULLS_NOT_EQUAL,
00392   /* Treat NULLs as equal when collecting statistics (like 4.0 did) */
00393   MI_STATS_METHOD_NULLS_EQUAL,
00394   /* Ignore NULLs - count only tuples without NULLs in the index components */
00395   MI_STATS_METHOD_IGNORE_NULLS
00396 } enum_mi_stats_method;
00397 
00398 typedef struct st_mi_check_param
00399 {
00400   uint64_t auto_increment_value;
00401   uint64_t max_data_file_length;
00402   uint64_t keys_in_use;
00403   uint64_t max_record_length;
00404   drizzled::internal::my_off_t search_after_block;
00405   drizzled::internal::my_off_t new_file_pos,key_file_blocks;
00406   drizzled::internal::my_off_t keydata,totaldata,key_blocks,start_check_pos;
00407   drizzled::ha_rows total_records,total_deleted;
00408   drizzled::internal::ha_checksum record_checksum,glob_crc;
00409   uint64_t use_buffers;
00410   size_t read_buffer_length, write_buffer_length,
00411          sort_buffer_length, sort_key_blocks;
00412   uint32_t out_flag,warning_printed,error_printed,verbose;
00413   uint32_t opt_sort_key,total_files,max_level;
00414   uint32_t testflag, key_cache_block_size;
00415   uint8_t language;
00416   bool using_global_keycache, opt_lock_memory, opt_follow_links;
00417   bool retry_repair, force_sort;
00418   char temp_filename[FN_REFLEN],*isam_file_name;
00419   int tmpfile_createflag;
00420   drizzled::myf myf_rw;
00421   drizzled::internal::IO_CACHE read_cache;
00422 
00423   /*
00424     The next two are used to collect statistics, see update_key_parts for
00425     description.
00426   */
00427   uint64_t unique_count[MI_MAX_KEY_SEG+1];
00428   uint64_t notnull_count[MI_MAX_KEY_SEG+1];
00429 
00430   drizzled::internal::ha_checksum key_crc[HA_MAX_POSSIBLE_KEY];
00431   ulong rec_per_key_part[MI_MAX_KEY_SEG*HA_MAX_POSSIBLE_KEY];
00432   void *session;
00433   const char *db_name, *table_name;
00434   const char *op_name;
00435   enum_mi_stats_method stats_method;
00436 } MI_CHECK;
00437 
00438 typedef struct st_sort_info
00439 {
00440   drizzled::internal::my_off_t filelength,dupp,buff_length;
00441   drizzled::ha_rows max_records;
00442   uint32_t current_key, total_keys;
00443   drizzled::myf myf_rw;
00444   enum drizzled::data_file_type new_data_file_type;
00445   MI_INFO *info;
00446   MI_CHECK *param;
00447   unsigned char *buff;
00448   SORT_KEY_BLOCKS *key_block,*key_block_end;
00449   /* sync things */
00450   uint32_t got_error, threads_running;
00451   pthread_mutex_t mutex;
00452   pthread_cond_t  cond;
00453 } SORT_INFO;
00454 
00455 /* functions in mi_check */
00456 void myisamchk_init(MI_CHECK *param);
00457 int chk_status(MI_CHECK *param, MI_INFO *info);
00458 int chk_del(MI_CHECK *param, register MI_INFO *info, uint32_t test_flag);
00459 int chk_size(MI_CHECK *param, MI_INFO *info);
00460 int chk_key(MI_CHECK *param, MI_INFO *info);
00461 int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend);
00462 int mi_repair(MI_CHECK *param, register MI_INFO *info,
00463         char * name, int rep_quick);
00464 int mi_sort_index(MI_CHECK *param, register MI_INFO *info, char * name);
00465 int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
00466           const char * name, int rep_quick);
00467 int change_to_newfile(const char * filename, const char * old_ext,
00468           const char * new_ext, uint32_t raid_chunks,
00469           drizzled::myf myflags);
00470 void lock_memory(MI_CHECK *param);
00471 void update_auto_increment_key(MI_CHECK *param, MI_INFO *info,
00472              bool repair);
00473 int update_state_info(MI_CHECK *param, MI_INFO *info,uint32_t update);
00474 void update_key_parts(MI_KEYDEF *keyinfo, ulong *rec_per_key_part,
00475                       uint64_t *unique, uint64_t *notnull,
00476                       uint64_t records);
00477 int filecopy(MI_CHECK *param, int to,int from,drizzled::internal::my_off_t start,
00478        drizzled::internal::my_off_t length, const char *type);
00479 int movepoint(MI_INFO *info,unsigned char *record,drizzled::internal::my_off_t oldpos,
00480         drizzled::internal::my_off_t newpos, uint32_t prot_key);
00481 int write_data_suffix(SORT_INFO *sort_info, bool fix_datafile);
00482 int test_if_almost_full(MI_INFO *info);
00483 bool mi_test_if_sort_rep(MI_INFO *info, drizzled::ha_rows rows, uint64_t key_map,
00484           bool force);
00485 
00486 int mi_init_bulk_insert(MI_INFO *info, uint32_t cache_size, drizzled::ha_rows rows);
00487 void mi_flush_bulk_insert(MI_INFO *info, uint32_t inx);
00488 void mi_end_bulk_insert(MI_INFO *info);
00489 int mi_preload(MI_INFO *info, uint64_t key_map, bool ignore_leaves);
00490