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