Lớp Handler

Một phần của tài liệu Nghiên cứu phương pháp xây dựng Storage Engine cho hệ quản trị cơ sở dữ liệu MySQL (Trang 59)

L ỜI CAM ĐOAN

3.4. Lớp Handler

Lớp handler được dẫn xuất từ lớpsql_alloc, điều đó có nghĩa là mọi chương trình

con lưu trữ trong bộ nhớ trong được cung cấp thông qua kế thừa. Nó cung cấp một tập các phương thức nhất quán kết nối với máy chủ thông qua cấu trúc handlerton.

Handlerton và các thể hiện handler làm việc như là một đơn vị để đạt được lớp trừu tượng cho kiến trúc storage enngine. Hình 3.1 sau mô tả các lớp và cách chúng được

dẫn xuất tới một storage engine mới. Kiến trúc handlerton như là giao diện giữa

Hình 3.1. Lớp dẫn xuất của pluggable storage engine [4, pp.263]

Trong lớp handler có chứa đầy đủ các chức năng cần có của một storage engine như tạo mới, xóa, và sửa đổi bảng và các phương thức để tạo các trường và chỉ mục,

thậm chí có cả các phương thức bảo vệ khỏi đổ vỡ, khôi phục và sao chép dự phòng, ... Mặc dù lớp handler có thể giải quyết mọi tình huống có thể xảy ra đối với storage engine, nhưng hầu hết các storage engine không sử dụng tất cả các phương thức này.

Định nghĩa lớp handler như sau:

class handler :public Sql_alloc {

TABLE_SHARE *table_share; // khai báo bảng

TABLE *table; //bảng đang mở

ha_statistics stats; //thống kê

….

handler(handlerton *ht_arg, TABLE_SHARE *share_arg)

:table_share(share_arg), table(0), estimation_rows_to_insert(0), ht(ht_arg), ref(0), key_used_on_scan(MAX_KEY), active_index(MAX_KEY),

ref_length(sizeof(my_off_t)), ft_handler(0), inited(NONE), locked(FALSE),

implicit_emptied(0), pushed_cond(0), next_insert_id(0), insert_id_for_cur_row(0), auto_inc_intervals_count(0),

virtual ~handler(void)

virtual handler *clone(const char *name, MEM_ROOT *mem_root); void init() …..

// ha_ methods: pubilc wrappers for private virtual API

int ha_open(TABLE *table, const char *name, int mode, int test_if_locked); int ha_index_init(uint idx, bool sorted) ……..

int ha_index_end() ………..

int ha_rnd_init(bool scan) ……….. int ha_rnd_end() ………

int ha_reset(); ………

int ha_external_lock(THD *thd, int lock_type); int ha_write_row(uchar * buf);

int ha_update_row(const uchar * old_data, uchar * new_data); int ha_delete_row(const uchar * buf);

void ha_release_auto_increment(); int check_collation_compatibility();

int ha_check_for_upgrade(HA_CHECK_OPT *check_opt); void ha_start_bulk_insert(ha_rows rows) ………..

int ha_end_bulk_insert() ………

int ha_bulk_update_row(const uchar *old_data, uchar *new_data, uint *dup_key_found);

int ha_delete_all_rows(); int ha_truncate();

int ha_reset_auto_increment(ulonglong value);

int ha_optimize(THD* thd, HA_CHECK_OPT* check_opt); int ha_analyze(THD* thd, HA_CHECK_OPT* check_opt); bool ha_check_and_repair(THD *thd);

int ha_disable_indexes(uint mode); int ha_enable_indexes(uint mode);

int ha_rename_table(const char *from, const char *to); int ha_delete_table(const char *name);

void ha_drop_table(const char *name);

int ha_create(const char *name, TABLE *form, HA_CREATE_INFO *info); int ha_create_handler_files(const char *name, const char *old_name,

int action_flag, HA_CREATE_INFO *info);

virtual int index_read_idx_map(uchar * buf, uint index, const uchar * key, key_part_map keypart_map,

enum ha_rkey_function find_flag);

virtual int index_next(uchar * buf) {return HA_ERR_WRONG_COMMAND; } virtual int index_prev(uchar * buf){return HA_ERR_WRONG_COMMAND; } virtual int index_first(uchar * buf)

{ return HA_ERR_WRONG_COMMAND; } virtual int index_last(uchar * buf)

{ return HA_ERR_WRONG_COMMAND; }

virtual int index_next_same(uchar *buf, const uchar *key, uint keylen); …. virtual int index_read_last_map(uchar * buf, const uchar * key,

key_part_map keypart_map)

virtual int ft_read(uchar *buf) { return HA_ERR_WRONG_COMMAND; } virtual int rnd_next(uchar *buf)=0;

virtual int rnd_pos(uchar * buf, uchar *pos)=0; virtual int restart_rnd_next(uchar *buf, uchar *pos) { return HA_ERR_WRONG_COMMAND; } virtual int rnd_same(uchar *buf, uint inx) { return HA_ERR_WRONG_COMMAND; } virtual void position(const uchar *record)=0; virtual const char *table_type() const =0; virtual const char **bas_ext() const =0;

virtual int add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys, handler_add_index **add)

{ return (HA_ERR_WRONG_COMMAND); }

virtual int final_add_index(handler_add_index *add, bool commit) …. virtual int prepare_drop_index(TABLE *table_arg, uint *key_num, uint num_of_keys) ….

virtual int final_drop_index(TABLE *table_arg) ….. virtual int rename_table(const char *from, const char *to);

virtual int delete_table(const char *name);

virtual int open(const char *name, int mode, uint test_if_locked)=0; virtual int index_init(uint idx, bool sorted) { active_index= idx; return 0; } virtual int index_end() { active_index= MAX_KEY; return 0; }

virtual int rnd_init(bool scan)= 0; virtual int rnd_end() { return 0; }

virtual int write_row(uchar *buf __attribute__((unused)))……. virtual int update_row(const uchar *old_data __attribute__((unused)), uchar *new_data __attribute__((unused))) …..

virtual int delete_row(const uchar *buf __attribute__((unused))) …… virtual int reset() { return 0; }

virtual void start_bulk_insert(ha_rows rows) {} virtual int end_bulk_insert() { return 0; }

virtual int index_read(uchar * buf, const uchar * key, uint key_len, enum ha_rkey_function find_flag)

{ return HA_ERR_WRONG_COMMAND; }

virtual int index_read_last(uchar * buf, const uchar * key, uint key_len) { return (my_errno= HA_ERR_WRONG_COMMAND); }

virtual void drop_table(const char *name);

virtual int create(const char *name, TABLE *form, HA_CREATE_INFO *info)=0; handlerton *ha_default_handlerton(THD *thd);

plugin_ref ha_resolve_by_name(THD *thd, const LEX_STRING *name); plugin_ref ha_lock_engine(THD *thd, const handlerton *hton);

handlerton *ha_resolve_by_legacy_type(THD *thd, enum legacy_db_type db_type); handler *get_new_handler(TABLE_SHARE *share, MEM_ROOT *alloc,

handlerton *db_type);

handlerton *ha_checktype(THD *thd, enum legacy_db_type database_type, bool no_substitute, bool report_error);

static inline enum legacy_db_type ha_legacy_type(const handlerton *db_type) …………..

static inline const char *ha_resolve_storage_engine_name(const handlerton *db_type) …….

static inline bool ha_storage_engine_is_enabled(const handlerton *db_type); …………..

int ha_create_table(THD *thd, const char *path, const char *db, const char *table_name, HA_CREATE_INFO *create_info,

bool update_create_info);

int ha_delete_table(THD *thd, handlerton *db_type, const char *path, const char *db, const char *alias, bool generate_warning); ……….

};

Một phần của tài liệu Nghiên cứu phương pháp xây dựng Storage Engine cho hệ quản trị cơ sở dữ liệu MySQL (Trang 59)

Tải bản đầy đủ (PDF)

(75 trang)