ha_tokudb.h 15.9 KB
Newer Older
1
#ifdef USE_PRAGMA_INTERFACE
2
#pragma interface               /* gcc class implementation */
3 4 5
#endif

#include <db.h>
Zardosht Kasheff's avatar
Zardosht Kasheff committed
6
#include "hatoku_cmp.h"
7

Zardosht Kasheff's avatar
Zardosht Kasheff committed
8 9 10 11 12 13 14 15 16
typedef struct st_col_pack_info {
    u_int32_t col_pack_val; //offset if fixed, pack_index if var
} COL_PACK_INFO;

typedef struct st_multi_col_pack_info {
    u_int32_t var_len_offset; //where the fixed length stuff ends and the offsets for var stuff begins
    u_int32_t len_of_offsets; //length of the offset bytes in a packed row
} MULTI_COL_PACK_INFO;

17 18 19 20 21 22 23
//
// This object stores table information that is to be shared
// among all ha_tokudb objects.
// There is one instance per table, shared among threads.
// Some of the variables here are the DB* pointers to indexes,
// and auto increment information.
//
24
typedef struct st_tokudb_share {
25 26 27 28 29 30
    char *table_name;
    uint table_name_length, use_count;
    pthread_mutex_t mutex;
    THR_LOCK lock;

    ulonglong auto_ident;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
31
    ulonglong last_auto_increment, auto_inc_create_value;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
32 33 34
    //
    // estimate on number of rows in table
    //
Zardosht Kasheff's avatar
Zardosht Kasheff committed
35
    ha_rows rows;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
36 37 38 39 40
    //
    // estimate on number of rows added in the process of a locked tables
    // this is so we can better estimate row count during a lock table
    //
    ha_rows rows_from_locked_table;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
41 42 43 44 45 46 47
    DB *status_block;
    //
    // DB that is indexed on the primary key
    //
    DB *file;
    //
    // array of all DB's that make up table, includes DB that
Zardosht Kasheff's avatar
Zardosht Kasheff committed
48 49
    // is indexed on the primary key, add 1 in case primary
    // key is hidden
Zardosht Kasheff's avatar
Zardosht Kasheff committed
50
    //
Zardosht Kasheff's avatar
Zardosht Kasheff committed
51 52
    DB *key_file[MAX_KEY +1];
    u_int32_t key_type[MAX_KEY +1];
Zardosht Kasheff's avatar
Zardosht Kasheff committed
53
    uint status, version, capabilities;
54
    uint ref_length;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
55 56 57 58 59 60 61 62
    //
    // whether table has an auto increment column
    //
    bool has_auto_inc;
    //
    // index of auto increment column in table->field, if auto_inc exists
    //
    uint ai_field_index;
63
    bool ai_first_col;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
64 65 66 67 68 69 70 71 72

    MY_BITMAP key_filters[MAX_KEY+1];
    uchar* field_lengths; //stores the field lengths of fixed size fields (255 max)
    uchar* length_bytes; // stores the length of lengths of varchars and varbinaries
    u_int32_t* blob_fields; // list of indexes of blob fields
    u_int32_t num_blobs;
    MULTI_COL_PACK_INFO mcp_info[MAX_KEY+1];
    COL_PACK_INFO* cp_info[MAX_KEY+1];
    u_int32_t num_offset_bytes; //number of bytes needed to encode the offset
73 74 75 76 77 78 79
    // 
    // we want the following optimization for bulk loads, if the table is empty, 
    // attempt to grab a table lock. emptiness check can be expensive, 
    // so we try it once for a table. After that, we keep this variable around 
    // to tell us to not try it again. 
    // 
    bool try_table_lock; 
80 81
} TOKUDB_SHARE;

Zardosht Kasheff's avatar
Zardosht Kasheff committed
82
#define HA_TOKU_VERSION 2
Zardosht Kasheff's avatar
Zardosht Kasheff committed
83 84 85
//
// no capabilities yet
//
Zardosht Kasheff's avatar
Zardosht Kasheff committed
86
#define HA_TOKU_CAP 0
Zardosht Kasheff's avatar
Zardosht Kasheff committed
87 88 89 90 91 92 93


//
// These are keys that will be used for retrieving metadata in status.tokudb
// To get the version, one looks up the value associated with key hatoku_version
// in status.tokudb
//
Zardosht Kasheff's avatar
Zardosht Kasheff committed
94

Zardosht Kasheff's avatar
Zardosht Kasheff committed
95 96 97 98 99
typedef ulonglong HA_METADATA_KEY;
#define hatoku_version 0
#define hatoku_capabilities 1
#define hatoku_max_ai 2 //maximum auto increment value found so far
#define hatoku_ai_create_value 3
100
#define hatoku_key_name 4
Zardosht Kasheff's avatar
Zardosht Kasheff committed
101

Zardosht Kasheff's avatar
Zardosht Kasheff committed
102
typedef struct st_filter_key_part_info {
Zardosht Kasheff's avatar
Zardosht Kasheff committed
103 104
    uint offset;
    uint part_index;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
105
} FILTER_KEY_PART_INFO;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
106

Zardosht Kasheff's avatar
Zardosht Kasheff committed
107 108 109 110 111
typedef enum {
    lock_read = 0,
    lock_write
} TABLE_LOCK_TYPE;

112 113 114
int create_tokudb_trx_data_instance(tokudb_trx_data** out_trx);


115
class ha_tokudb : public handler {
116
private:
117 118 119
    THR_LOCK_DATA lock;         ///< MySQL lock
    TOKUDB_SHARE *share;        ///< Shared lock info

Zardosht Kasheff's avatar
Zardosht Kasheff committed
120 121 122 123 124
    //
    // last key returned by ha_tokudb's cursor
    //
    DBT last_key;
    //
Zardosht Kasheff's avatar
Zardosht Kasheff committed
125 126
    // pointer used for multi_alloc of key_buff, key_buff2, primary_key_buff
    //
127
    void *alloc_ptr;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
128 129 130 131 132
    //
    // buffer used to temporarily store a "packed row" 
    // data pointer of a DBT will end up pointing to this
    // see pack_row for usage
    //
133
    uchar *rec_buff;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
    //
    // number of bytes allocated in rec_buff
    //
    ulong alloced_rec_buff_length;
    //
    // buffer used to temporarily store a "packed key" 
    // data pointer of a DBT will end up pointing to this
    //
    uchar *key_buff; 
    //
    // buffer used to temporarily store a "packed key" 
    // data pointer of a DBT will end up pointing to this
    // This is used in functions that require the packing
    // of more than one key
    //
    uchar *key_buff2; 
Zardosht Kasheff's avatar
Zardosht Kasheff committed
150
    uchar *key_buff3; 
Zardosht Kasheff's avatar
Zardosht Kasheff committed
151 152 153 154 155 156 157 158
    //
    // buffer used to temporarily store a "packed key" 
    // data pointer of a DBT will end up pointing to this
    // currently this is only used for a primary key in
    // the function update_row, hence the name. It 
    // does not carry any state throughout the class.
    //
    uchar *primary_key_buff;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
159

Zardosht Kasheff's avatar
Zardosht Kasheff committed
160 161 162 163 164 165 166 167 168
    //
    // when unpacking blobs, we need to store it in a temporary
    // buffer that will persist because MySQL just gets a pointer to the 
    // blob data, a pointer we need to ensure is valid until the next
    // query
    //
    uchar* blob_buff;
    u_int32_t num_blob_bytes;

Zardosht Kasheff's avatar
Zardosht Kasheff committed
169 170 171 172 173 174 175 176 177 178 179 180 181
    bool unpack_entire_row;

    //
    // buffers (and their sizes) that will hold the indexes
    // of fields that need to be read for a query
    //
    u_int32_t* fixed_cols_for_query;
    u_int32_t num_fixed_cols_for_query;
    u_int32_t* var_cols_for_query;
    u_int32_t num_var_cols_for_query;
    bool read_blobs;
    bool read_key;

Zardosht Kasheff's avatar
Zardosht Kasheff committed
182 183 184
    //
    // transaction used by ha_tokudb's cursor
    //
185
    DB_TXN *transaction;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
186

Zardosht Kasheff's avatar
Zardosht Kasheff committed
187 188 189
    //
    // instance of cursor being used for init_xxx and rnd_xxx functions
    //
190
    DBC *cursor;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
191 192 193
    //
    // flags that are returned in table_flags()
    //
Zardosht Kasheff's avatar
Zardosht Kasheff committed
194
    ulonglong int_table_flags;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
195
    // 
Zardosht Kasheff's avatar
Zardosht Kasheff committed
196 197
    // count on the number of rows that gets changed, such as when write_row occurs
    // this is meant to help keep estimate on number of elements in DB
Zardosht Kasheff's avatar
Zardosht Kasheff committed
198 199 200
    // 
    ulonglong added_rows;
    ulonglong deleted_rows;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
201 202


Zardosht Kasheff's avatar
Zardosht Kasheff committed
203 204 205 206 207 208
    uint last_dup_key;
    //
    // if set to 0, then the primary key is not hidden
    // if non-zero (not necessarily 1), primary key is hidden
    //
    uint hidden_primary_key;
209
    bool key_read, using_ignore;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
210

Zardosht Kasheff's avatar
Zardosht Kasheff committed
211 212 213 214 215 216 217
    //
    // After a cursor encounters an error, the cursor will be unusable
    // In case MySQL attempts to do a cursor operation (such as rnd_next
    // or index_prev), we will gracefully return this error instead of crashing
    //
    int last_cursor_error;

Zardosht Kasheff's avatar
Zardosht Kasheff committed
218 219 220 221 222
    //
    // For instances where we successfully prelock a range or a table,
    // we set this to TRUE so that successive cursor calls can know
    // know to limit the locking overhead in a call to the fractal tree
    //
Zardosht Kasheff's avatar
Zardosht Kasheff committed
223
    bool range_lock_grabbed;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
224

Zardosht Kasheff's avatar
Zardosht Kasheff committed
225 226 227 228
    //
    // For bulk inserts, we want option of not updating auto inc
    // until all inserts are done. By default, is false
    //
229 230
    bool delay_updating_ai_metadata; // if true, don't update auto-increment metadata until bulk load completes
    bool ai_metadata_update_required; // if true, autoincrement metadata must be updated 
Zardosht Kasheff's avatar
Zardosht Kasheff committed
231

Zardosht Kasheff's avatar
Zardosht Kasheff committed
232 233 234 235 236 237 238 239
    //
    // buffer for updating the status of long insert, delete, and update
    // statements. Right now, the the messages are 
    // "[inserted|updated|deleted] about %llu rows",
    // so a buffer of 200 is good enough.
    //
    char write_status_msg[200]; //buffer of 200 should be a good upper bound.

240 241 242 243
    bool fix_rec_buff_for_blob(ulong length);
    uchar current_ident[TOKUDB_HIDDEN_PRIMARY_KEY_LENGTH];

    ulong max_row_length(const uchar * buf);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
244 245 246 247 248
    int pack_row(
        DBT * row, 
        const uchar* record,
        uint index
        );
Zardosht Kasheff's avatar
Zardosht Kasheff committed
249
    u_int32_t place_key_into_mysql_buff(KEY* key_info, uchar * record, uchar* data);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
250
    void unpack_key(uchar * record, DBT const *key, uint index);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
251
    u_int32_t place_key_into_dbt_buff(KEY* key_info, uchar * buff, const uchar * record, bool* has_null, int key_length);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
252 253
    DBT* create_dbt_key_from_key(DBT * key, KEY* key_info, uchar * buff, const uchar * record, bool* has_null, int key_length = MAX_KEY_LENGTH);
    DBT *create_dbt_key_from_table(DBT * key, uint keynr, uchar * buff, const uchar * record, bool* has_null, int key_length = MAX_KEY_LENGTH);
254
    DBT *pack_key(DBT * key, uint keynr, uchar * buff, const uchar * key_ptr, uint key_length, int8_t inf_byte);
255
    int remove_key(DB_TXN * trans, uint keynr, const uchar * record, DBT * prim_key);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
256
    int remove_keys(DB_TXN * trans, const uchar * record, DBT * prim_key);
257
    int key_cmp(uint keynr, const uchar * old_row, const uchar * new_row);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
258
    int update_primary_key(DB_TXN * trans, bool primary_key_changed, const uchar * old_row, DBT * old_key, const uchar * new_row, DBT * prim_key);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
259
    int handle_cursor_error(int error, int err_to_return, uint keynr);
260
    DBT *get_pos(DBT * to, uchar * pos);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
261
 
262 263 264
    int open_main_dictionary(const char* name, int mode, DB_TXN* txn);
    int open_secondary_dictionary(DB** ptr, KEY* key_info, const char* name, int mode, u_int32_t* key_type, DB_TXN* txn);
    int open_status_dictionary(DB** ptr, const char* name, DB_TXN* txn);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
265
    int acquire_table_lock (DB_TXN* trans, TABLE_LOCK_TYPE lt);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
266
    int estimate_num_rows(DB* db, u_int64_t* num_rows);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
267
    bool has_auto_increment_flag(uint* index);
268 269 270
    int write_to_status(DB* db, HA_METADATA_KEY curr_key_data, void* data, uint size, DB_TXN* txn );
    int write_metadata(DB* db, void* key, uint key_size, void* data, uint data_size, DB_TXN* txn );
    int remove_metadata(DB* db, void* key_data, uint key_size, DB_TXN* transaction);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
271
    int update_max_auto_inc(DB* db, ulonglong val);
272 273 274
    int remove_key_name_from_status(DB* status_block, char* key_name, DB_TXN* txn);
    int write_key_name_to_status(DB* status_block, char* key_name, DB_TXN* txn);
    int write_auto_inc_create(DB* db, ulonglong val, DB_TXN* txn);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
275
    void init_auto_increment();
Zardosht Kasheff's avatar
Zardosht Kasheff committed
276 277 278 279 280 281
    int initialize_share(
        const char* name,
        int mode
        );

    void set_query_columns(uint keynr);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
282
    int prelock_range ( const key_range *start_key, const key_range *end_key);
283
    int create_txn(THD* thd, tokudb_trx_data* trx);
284
    bool may_table_be_empty();
285 286 287 288 289 290
    int delete_or_rename_table (const char* from_name, const char* to_name, bool is_delete);
    int delete_or_rename_dictionary( const char* from_name, const char* to_name, char* index_name, bool is_key, DB_TXN* txn, bool is_delete);
    int truncate_dictionary( uint keynr, DB_TXN* txn );
    int create_secondary_dictionary(const char* name, TABLE* form, KEY* key_info, DB_TXN* txn);
    int create_main_dictionary(const char* name, TABLE* form, DB_TXN* txn);
    void trace_create_table_info(const char *name, TABLE * form);
291

Zardosht Kasheff's avatar
Zardosht Kasheff committed
292
 
293 294 295 296 297
public:
    ha_tokudb(handlerton * hton, TABLE_SHARE * table_arg);
    ~ha_tokudb() {
    } 
    const char *table_type() const {
298
        return "TOKUDB";
299 300
    } 
    const char *index_type(uint inx) {
301 302 303
        return "BTREE";
    }
    const char **bas_ext() const;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
304 305 306 307 308

    //
    // Returns a bit mask of capabilities of storage engine. Capabilities 
    // defined in sql/handler.h
    //
309 310
    ulonglong table_flags(void) const {
        return int_table_flags;
311 312
    } 
    ulong index_flags(uint inx, uint part, bool all_parts) const;
313

Zardosht Kasheff's avatar
Zardosht Kasheff committed
314 315 316
    //
    // Returns limit on the number of keys imposed by tokudb.
    //
317
    uint max_supported_keys() const {
Zardosht Kasheff's avatar
Zardosht Kasheff committed
318
        return MAX_KEY;
319
    } 
Zardosht Kasheff's avatar
Zardosht Kasheff committed
320

321
    uint extra_rec_buf_length() const {
322
        return TOKUDB_HIDDEN_PRIMARY_KEY_LENGTH;
323 324
    } 
    ha_rows estimate_rows_upper_bound();
Zardosht Kasheff's avatar
Zardosht Kasheff committed
325 326 327 328

    //
    // Returns the limit on the key length imposed by tokudb.
    //
329 330
    uint max_supported_key_length() const {
        return UINT_MAX32;
331
    } 
Zardosht Kasheff's avatar
Zardosht Kasheff committed
332 333 334 335

    //
    // Returns limit on key part length imposed by tokudb.
    //
336
    uint max_supported_key_part_length() const {
337
        return UINT_MAX32;
338 339
    } 
    const key_map *keys_to_use_for_scanning() {
340 341 342 343
        return &key_map_full;
    }

    double scan_time();
Zardosht Kasheff's avatar
Zardosht Kasheff committed
344
    double read_time(uint index, uint ranges, ha_rows rows);
345 346 347

    int open(const char *name, int mode, uint test_if_locked);
    int close(void);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
348
    void update_create_info(HA_CREATE_INFO* create_info);
349 350 351
    int create(const char *name, TABLE * form, HA_CREATE_INFO * create_info);
    int delete_table(const char *name);
    int rename_table(const char *from, const char *to);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
352
    int optimize(THD * thd, HA_CHECK_OPT * check_opt);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
353
#if 0
354
    int analyze(THD * thd, HA_CHECK_OPT * check_opt);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
355
#endif
356 357 358 359
    int write_row(uchar * buf);
    int update_row(const uchar * old_data, uchar * new_data);
    int delete_row(const uchar * buf);

Zardosht Kasheff's avatar
Zardosht Kasheff committed
360 361 362
    void start_bulk_insert(ha_rows rows);
    int end_bulk_insert();

Zardosht Kasheff's avatar
Zardosht Kasheff committed
363
    int prepare_index_scan();
Zardosht Kasheff's avatar
Zardosht Kasheff committed
364
    int prepare_index_key_scan( const uchar * key, uint key_len );
Zardosht Kasheff's avatar
Zardosht Kasheff committed
365
    int prepare_range_scan( const key_range *start_key, const key_range *end_key);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
366
    void column_bitmaps_signal();
367 368
    int index_init(uint index, bool sorted);
    int index_end();
Zardosht Kasheff's avatar
Zardosht Kasheff committed
369
    int index_next_same(uchar * buf, const uchar * key, uint keylen); 
370 371 372 373 374 375 376 377 378 379 380 381
    int index_read(uchar * buf, const uchar * key, uint key_len, enum ha_rkey_function find_flag);
    int index_read_last(uchar * buf, const uchar * key, uint key_len);
    int index_next(uchar * buf);
    int index_prev(uchar * buf);
    int index_first(uchar * buf);
    int index_last(uchar * buf);

    int rnd_init(bool scan);
    int rnd_end();
    int rnd_next(uchar * buf);
    int rnd_pos(uchar * buf, uchar * pos);

Zardosht Kasheff's avatar
Zardosht Kasheff committed
382 383 384 385 386 387
    int read_range_first(const key_range *start_key,
                                 const key_range *end_key,
                                 bool eq_range, bool sorted);
    int read_range_next();


388 389 390 391 392 393 394 395 396 397 398
    void position(const uchar * record);
    int info(uint);
    int extra(enum ha_extra_function operation);
    int reset(void);
    int external_lock(THD * thd, int lock_type);
    int start_stmt(THD * thd, thr_lock_type lock_type);

    ha_rows records_in_range(uint inx, key_range * min_key, key_range * max_key);

    THR_LOCK_DATA **store_lock(THD * thd, THR_LOCK_DATA ** to, enum thr_lock_type lock_type);

Zardosht Kasheff's avatar
Zardosht Kasheff committed
399
    int get_status();
Zardosht Kasheff's avatar
Zardosht Kasheff committed
400
    void init_hidden_prim_key_info();
401 402 403
    inline void get_auto_primary_key(uchar * to) {
        pthread_mutex_lock(&share->mutex);
        share->auto_ident++;
Zardosht Kasheff's avatar
Zardosht Kasheff committed
404
        hpk_num_to_char(to, share->auto_ident);
405 406 407
        pthread_mutex_unlock(&share->mutex);
    }
    virtual void get_auto_increment(ulonglong offset, ulonglong increment, ulonglong nb_desired_values, ulonglong * first_value, ulonglong * nb_reserved_values);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
408
    bool is_auto_inc_singleton();
409 410 411 412 413 414 415
    void print_error(int error, myf errflag);
    uint8 table_cache_type() {
        return HA_CACHE_TBL_TRANSACT;
    }
    bool primary_key_is_clustered() {
        return true;
    }
Zardosht Kasheff's avatar
Zardosht Kasheff committed
416 417 418
    bool supports_clustered_keys() {
        return true;
    }
419 420 421
    int cmp_ref(const uchar * ref1, const uchar * ref2);
    bool check_if_incompatible_data(HA_CREATE_INFO * info, uint table_changes);

Zardosht Kasheff's avatar
Zardosht Kasheff committed
422 423 424 425
    int add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys);
    int prepare_drop_index(TABLE *table_arg, uint *key_num, uint num_of_keys);
    int final_drop_index(TABLE *table_arg);

426 427
    // delete all rows from the table
    // effect: all dictionaries, including the main and indexes, should be empty
428
    int discard_or_import_tablespace(my_bool discard);
429
    int delete_all_rows();
Zardosht Kasheff's avatar
Zardosht Kasheff committed
430 431
    void extract_hidden_primary_key(uint keynr, DBT const *row, DBT const *found_key);
    void read_key_only(uchar * buf, uint keynr, DBT const *row, DBT const *found_key);
432
    int read_row_callback (uchar * buf, uint keynr, DBT const *row, DBT const *found_key);
Zardosht Kasheff's avatar
Zardosht Kasheff committed
433 434
    int read_primary_key(uchar * buf, uint keynr, DBT const *row, DBT const *found_key);
    int unpack_blobs(
Zardosht Kasheff's avatar
Zardosht Kasheff committed
435 436 437 438
        uchar* record,
        const uchar* from_tokudb_blob,
        u_int32_t num_blob_bytes
        );
Zardosht Kasheff's avatar
Zardosht Kasheff committed
439
    int unpack_row(
Zardosht Kasheff's avatar
Zardosht Kasheff committed
440 441 442 443 444
        uchar* record, 
        DBT const *row, 
        DBT const *key,
        uint index
        );
445

446 447 448 449
    int prefix_cmp_dbts( uint keynr, const DBT* first_key, const DBT* second_key) {
        return tokudb_prefix_cmp_dbt_key(share->key_file[keynr], first_key, second_key);
    }

450 451
    void track_progress(THD* thd);

Zardosht Kasheff's avatar
Zardosht Kasheff committed
452 453
    int heavi_ret_val;

Zardosht Kasheff's avatar
Zardosht Kasheff committed
454 455 456 457 458 459
    //
    // index into key_file that holds DB* that is indexed on
    // the primary_key. this->key_file[primary_index] == this->file
    //
    uint primary_key;

460
private:
Zardosht Kasheff's avatar
Zardosht Kasheff committed
461
    int read_full_row(uchar * buf);
462
    int __close(int mutex_is_locked);
463 464
    int read_last(uint keynr);
    bool is_auto_inc_first_column (uint* keynr);
465
};