class ha_innobase: public handler

/** The class defining a handle to an Innodb table */
class ha_innobase: public handler
{
    row_prebuilt_t*    prebuilt;    /*!< prebuilt struct in InnoDB, used
                    to save CPU time with prebuilt data
                    structures*/
    THD*        user_thd;    /*!< the thread handle of the user
                    currently using the handle; this is
                    set in external_lock function */
    THR_LOCK_DATA    lock;
    INNOBASE_SHARE*    share;        /*!< information for MySQL
                    table locking */

    uchar*        upd_buf;    /*!< buffer used in updates */
    ulint        upd_buf_size;    /*!< the size of upd_buf in bytes */
    uchar        srch_key_val1[MAX_KEY_LENGTH + MAX_REF_PARTS*2];
    uchar        srch_key_val2[MAX_KEY_LENGTH + MAX_REF_PARTS*2];
                    /*!< buffers used in converting
                    search key values from MySQL format
                    to InnoDB format. For each column
                    2 bytes are used to store length,
                    hence MAX_REF_PARTS*2. */
    Table_flags    int_table_flags;
    uint        primary_key;
    ulong        start_of_scan;    /*!< this is set to 1 when we are
                    starting a table scan but have not
                    yet fetched any row, else 0 */
    uint        last_match_mode;/* match mode of the latest search:
                    ROW_SEL_EXACT, ROW_SEL_EXACT_PREFIX,
                    or undefined */
    uint        num_write_row;    /*!< number of write_row() calls */

    uint store_key_val_for_row(uint keynr, char* buff, uint buff_len,
                                   const uchar* record);
    inline void update_thd(THD* thd);
    void update_thd();
    int change_active_index(uint keynr);
    int general_fetch(uchar* buf, uint direction, uint match_mode);
    ulint innobase_lock_autoinc();
    ulonglong innobase_peek_autoinc();
    ulint innobase_set_max_autoinc(ulonglong auto_inc);
    ulint innobase_reset_autoinc(ulonglong auto_inc);
    ulint innobase_get_autoinc(ulonglong* value);
    ulint innobase_update_autoinc(ulonglong    auto_inc);
    void innobase_initialize_autoinc();
    dict_index_t* innobase_get_index(uint keynr);
    int info_low(uint flag, bool called_from_analyze);

    /* Init values for the class: */
 public:
    ha_innobase(handlerton *hton, TABLE_SHARE *table_arg);
    ~ha_innobase();
    /*
      Get the row type from the storage engine.  If this method returns
      ROW_TYPE_NOT_USED, the information in HA_CREATE_INFO should be used.
    */
    enum row_type get_row_type() const;

    const char* table_type() const;
    const char* index_type(uint key_number);
    const char** bas_ext() const;
    Table_flags table_flags() const;
    ulong index_flags(uint idx, uint part, bool all_parts) const;
    uint max_supported_keys() const;
    uint max_supported_key_length() const;
    uint max_supported_key_part_length() const;
    const key_map* keys_to_use_for_scanning();

    int open(const char *name, int mode, uint test_if_locked);
    handler* clone(const char *name, MEM_ROOT *mem_root);
    int close(void);
    double scan_time();
    double read_time(uint index, uint ranges, ha_rows rows);

    int write_row(uchar * buf);
    int update_row(const uchar * old_data, uchar * new_data);
    int delete_row(const uchar * buf);
    bool was_semi_consistent_read();
    void try_semi_consistent_read(bool yes);
    void unlock_row();

    int index_init(uint index, bool sorted);
    int index_end();
    int index_read(uchar * buf, const uchar * key,
        uint key_len, enum ha_rkey_function find_flag);
    int index_read_idx(uchar * buf, uint index, 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_next_same(uchar * buf, const uchar *key, uint keylen);
    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);

    void position(const uchar *record);
    int info(uint);
    int analyze(THD* thd,HA_CHECK_OPT* check_opt);
    int optimize(THD* thd,HA_CHECK_OPT* check_opt);
    int discard_or_import_tablespace(my_bool discard);
    int extra(enum ha_extra_function operation);
        int reset();
    int external_lock(THD *thd, int lock_type);
    int transactional_table_lock(THD *thd, int lock_type);
    int start_stmt(THD *thd, thr_lock_type lock_type);
    void position(uchar *record);
    ha_rows records_in_range(uint inx, key_range *min_key, key_range
                                *max_key);
    ha_rows estimate_rows_upper_bound();

    void update_create_info(HA_CREATE_INFO* create_info);
    int create(const char *name, register TABLE *form,
                    HA_CREATE_INFO *create_info);
    int truncate();
    int delete_table(const char *name);
    int rename_table(const char* from, const char* to);
    int check(THD* thd, HA_CHECK_OPT* check_opt);
    char* update_table_comment(const char* comment);
    char* get_foreign_key_create_info();
    int get_foreign_key_list(THD *thd, List<FOREIGN_KEY_INFO> *f_key_list);
    int get_parent_foreign_key_list(THD *thd,
                    List<FOREIGN_KEY_INFO> *f_key_list);
    bool can_switch_engines();
    uint referenced_by_foreign_key();
    void free_foreign_key_create_info(char* str);
    THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to,
                    enum thr_lock_type lock_type);
    void init_table_handle_for_HANDLER();
        virtual void get_auto_increment(ulonglong offset, ulonglong increment,
                                        ulonglong nb_desired_values,
                                        ulonglong *first_value,
                                        ulonglong *nb_reserved_values);
    int reset_auto_increment(ulonglong value);

    virtual bool get_error_message(int error, String *buf);

    uint8 table_cache_type();
    /*
      ask handler about permission to cache table during query registration
    */
    my_bool register_query_cache_table(THD *thd, char *table_key,
                       uint key_length,
                       qc_engine_callback *call_back,
                       ulonglong *engine_data);
    static char *get_mysql_bin_log_name();
    static ulonglong get_mysql_bin_log_pos();
    bool primary_key_is_clustered();
    int cmp_ref(const uchar *ref1, const uchar *ref2);
    /** Fast index creation (smart ALTER TABLE) @see handler0alter.cc @{ */
    int add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys,
              handler_add_index **add);
    int final_add_index(handler_add_index *add, bool commit);
    int prepare_drop_index(TABLE *table_arg, uint *key_num,
                   uint num_of_keys);
    int final_drop_index(TABLE *table_arg);
    /** @} */
    bool check_if_incompatible_data(HA_CREATE_INFO *info,
                    uint table_changes);
};
时间: 2024-11-03 20:12:58

class ha_innobase: public handler的相关文章

rebuild过程

/** The class defining a handle to an Innodb table */ class ha_innobase: public handler { row_prebuilt_t* prebuilt; /*!< prebuilt struct in InnoDB, used to save CPU time with prebuilt data structures*/ ..... } ha_innobase::open prebuilt = row_create_

Android中的Handler, Looper, MessageQueue和Thread

Android中的Handler, Looper, MessageQueue和Thread 前几天,和同事探讨了一下Android中的消息机制,探究了消息的发送和接收过程以及与线程之间的关系.虽然我们经常使用这些基础的东西,但对于其内部原理的了解,能使我们更加容易.合理地架构系统,并避免一些低级错误. 对于这部分的内容,将分成4小节来描述: 1.职责与关系 2.消息循环 3.线程与更新 4.几点小结 ------------------------------------------------

深入分析:Fragment与Activity交互的几种方式(一,使用Handler)

这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持久化,application全局变量,收发广播等等. 首先我们来介绍使用Handler来实现Fragment与Activity 的交互. 第一步,我们需要在Activity中定义一个方法用来设置Handler对象. public void setHandler(Handler handler) { mHandler = handler; } 第二步,在Fragment中的回调函数onAttach()中得到Fragment所在Acti

深入源码分析Handler的消息处理机制

学习Android的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Android学习交流群,群号码:364595326  我们一起学Android! handler的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MessageQueue被封装到Looper里面了,我们不会直接与MessageQueue打交道,因此我没将其作为核心类.下面一一介绍: 线程的魔法师Looper Looper的字面意

关于handler 和 looper 的问题

重新去学习回顾looper和handler ,还是需要重新认识这个经常使用的机制. 我首先是看任玉刚老师的书<android的开发艺术探索>的第十章. 里面一句话开始说出了我们大概的理解——handler的使用就是将一个人物切换到handler 所在的线程去执行. 在里面,我们需要理解handler运行需要两个底层looper 和 messagequeue messagequeue,叫做消息队列,但是存储的不是真正的队列,而是单链表. looper,使用来处理消息,而且对应也是每个对应线程的一

Handler机制(四)---Handler源码解析

Handler的主要用途有两个:(1).在将来的某个时刻执行消息或一个runnable,(2)把消息发送到消息队列. 主要依靠post(Runnable).postAtTime(Runnable, long).postDelayed(Runnable, long).sendEmptyMessage(int).sendMessage(Message).sendMessageAtTime(Message).sendMessageDelayed(Message, long)这些方法来来完成消息调度.p

Android:使用Handler在线程之间通信

概述 假设一个情景,在一个应用程序中,要完成一个比较复杂.耗时较长的计算任务,如果将这个任务直接在主线程中开始,那么用户界面就会停止对用户操作的响应,而去解决这个计算任务,直到任务完成. 显然,这不是我们想要的结果.那么就需要用到多线程来解决这个问题. 但是新的问题又出现了,在C#和Android中,子线程是不能直接修改用户界面的数据的.也就是说,子线程计算出的结果,不能直接在子线程中让它显示在用户界面上.那么就需要把数据首先传递给主线程,让主线程去修改用户界面. Handler就是为了解决这个

深入探索Android中的Handler

一.概述 1. 什么是Handler Handler是Android消息机制的上层接口,它为我们封装了许多底层的细节,让我们能够很方便的使用底层的消息机制.Handler的最常见应用场景之一便是通过Handler在子线程中间接更新UI.Handler的作用主要有两个:一是发送消息:二是处理消息,它的运作需要底层Looper和Message的支撑.MessageQueue即消息队列,它的底层用单链表实现:Looper则负责在一个循环中不断从MessageQueue中取消息,若取到了就交由Handl

Android开发学习之路-Handler消息派发机制源码分析

注:这里只是说一下sendmessage的一个过程,post就类似的 如果我们需要发送消息,会调用sendMessage方法 public final boolean sendMessage(Message msg) { return sendMessageDelayed(msg, 0); } 这个方法会调用如下的这个方法 public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMilli