From 1005ac5a18846600261a6e0775062dbe044adb2c Mon Sep 17 00:00:00 2001 From: unknown <mikron@mikael-ronstr-ms-dator.local> Date: Tue, 7 Feb 2006 16:26:34 +0100 Subject: [PATCH] WL 2826: Step 12 More table log code sql/mysql_priv.h: Added new call sql/sql_table.cc: New table log code --- sql/mysql_priv.h | 1 + sql/sql_table.cc | 121 +++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 113 insertions(+), 9 deletions(-) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 7c7cc0b42d7..a8f73ac1915 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -1182,6 +1182,7 @@ bool execute_table_log_entry(uint first_entry); bool execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry); void lock_global_table_log(); void unlock_global_table_log(); +bool sync_table_log(); bool write_log_shadow_frm(ALTER_PARTITION_PARAM_TYPE *lpt, bool install_flag); bool write_log_drop_partition(ALTER_PARTITION_PARAM_TYPE *lpt); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 7fe130c5ec3..7a6b24c0b66 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -281,6 +281,7 @@ typedef struct st_global_table_log char *file_name; List<TABLE_LOG_MEMORY_ENTRY> free_entries; List<TABLE_LOG_MEMORY_ENTRY> log_entries; + uint no_entries; File file_id; uint name_len; uint handler_type_len; @@ -291,6 +292,52 @@ GLOBAL_TABLE_LOG global_table_log; pthread_mutex_t LOCK_gtl; +/* + Sync table log file + SYNOPSIS + sync_table_log() + RETURN VALUES + TRUE Error + FALSE Success +*/ + +bool +sync_table_log() +{ + bool error= FALSE; + DBUG_ENTER("sync_table_log"); + + if (my_sync(global_table_log.file_id, MYF(0))) + error= TRUE; + DBUG_RETURN(error); +} + + +/* + Write one entry from table log file + SYNOPSIS + write_table_log_file_entry() + file_id File identifier + file_entry Memory area to read entry into + entry_no Entry number to read + RETURN VALUES + TRUE Error + FALSE Success +*/ + +static +bool +write_table_log_file_entry(File file_id, byte *file_entry, uint entry_no) +{ + bool error= FALSE; + DBUG_ENTER("read_table_log_file_entry"); + + if (my_pwrite(file_id, file_entry, IO_SIZE, IO_SIZE * entry_no, MYF(0))) + error= TRUE; + DBUG_RETURN(error); +} + + /* SYNOPSIS write_table_log_entry() @@ -308,10 +355,67 @@ pthread_mutex_t LOCK_gtl; bool write_table_log_entry(TABLE_LOG_ENTRY *table_log_entry, - uint next_entry, uint *entry_written) { + bool write_header, error; DBUG_ENTER("write_table_log_entry"); + + global_table_log.file_entry[0]= 'i'; + global_table_log.file_entry[1]= table_log_entry->action_type; + int4store(&global_table_log.file_entry[2], + table_log_entry->next_entry); + strcpy(&global_table_log.file_entry[6], table_log_entry->name); + if (table_log_entry.action_type == 'r') + global_table_log.file_entry[6 + NAMELEN]= 0; + else + strcpy(&global_table_log.file_entry[6 + NAMELEN], + table_log_entry->from_name); + strcpy(&global_table_log.file_entry[6 + (2*NAMELEN)], + table_log_entry->handler_type); + if (global_table_log.free_entries.is_empty()) + { + global_table_log.no_entries++; + entry_no= global_table_log.no_entries; + write_header= TRUE; + } + else + { + TABLE_LOG_MEMORY *tmp= global_table_log.free_entries.pop(); + global_table_log.log_entries.push_back(tmp); + entry_no= tmp->entry_pos; + write_header= FALSE; + } + error= FALSE; + if (write_table_log_entry(global_table_log.file_id, + global_table_log.file_entry, + entry_no)) + error= TRUE; + else if (write_header || !(write_table_log_header())) + error= TRUE; + DBUG_RETURN(error); +} + + +/* + Write table log header + SYNOPSIS + write_table_log_header() + RETURN VALUES + TRUE Error + FALSE Success +*/ + +bool +write_table_log_header() +{ + uint16 const_var; + DBUG_ENTER("write_table_log_header"); + + int4store(&global_table_log.file_entry[0], global_table_log.no_entries); + const_var= NAMELEN; + int2store(&global_table_log.file_entry[4], const_var); + const_var= 32; + int2store(&global_table_log.file_entry[6], const_var); DBUG_RETURN(FALSE); } @@ -398,6 +502,8 @@ read_table_log_header() global_table_log.name_len= uint2korr(&file_entry[4]); global_table_log.handler_type_len= uint2korr(&file_entry[6]); global_table_log.free_entries.clear(); + global_table_log.log_entries.clear(); + global_table_log.no_entries= 0; VOID(pthread_mutex_init(&LOCK_gtl, MY_MUTEX_INIT_FAST)); DBUG_RETURN(entry_no); } @@ -439,18 +545,15 @@ read_table_log_entry(uint read_entry, TABLE_LOG_ENTRY *table_log_entry) bool init_table_log() { - uint no_entries= 0; - uint16 const_var; + bool error= FALSE; DBUG_ENTER("init_table_log"); + VOID(my_delete(global_table_log.file_name)); global_table_log.file_id= my_open(global_table_log.file_name, 0, 0, MYF(0)); - int4store(&global_table_log.file_entry[0], &no_entries); - const_var= NAMELEN; - int2store(&global_table_log.file_entry[4], &const_var); - const_var= 32; - int2store(&global_table_log.file_entry[6], &const_var); - DBUG_RETURN(FALSE); + if (write_table_log_header()) + error= TRUE; + DBUG_RETURN(error); } -- 2.30.9