summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <mats@mysql.com>2006-06-15 10:29:06 +0200
committerunknown <mats@mysql.com>2006-06-15 10:29:06 +0200
commit684bda9a06a3967d83d25907a3077aa3849468ad (patch)
treeb0fa22d256018cde55ac6b03a135fcda41bac7e6
parentaab5228292404adb1c462f36fa7da7c881314961 (diff)
parentc437565cff2111fd0856b9dfed525cd9a921ff84 (diff)
downloadmariadb-git-684bda9a06a3967d83d25907a3077aa3849468ad.tar.gz
Merge mysql.com:/home/bkroot/mysql-5.1-new-rpl
into mysql.com:/home/bk/b19066-mysql-5.1-new
-rw-r--r--sql/handler.cc158
1 files changed, 83 insertions, 75 deletions
diff --git a/sql/handler.cc b/sql/handler.cc
index e6f2f564d39..7ab7e88ec9a 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -3221,99 +3221,107 @@ namespace {
THD::lock
THD::locked_tables
*/
-static int
-write_locked_table_maps(THD *thd)
+namespace
{
- DBUG_ENTER("write_locked_table_maps");
- DBUG_PRINT("enter", ("thd=%p, thd->lock=%p, thd->locked_tables=%p",
- thd, thd->lock, thd->locked_tables));
-
- if (thd->get_binlog_table_maps() == 0)
+ int write_locked_table_maps(THD *thd)
{
- /*
- Exactly one table has to be locked, otherwise this code is not
- guaranteed to work.
- */
- DBUG_ASSERT((thd->lock != NULL) + (thd->locked_tables != NULL) == 1);
-
- MYSQL_LOCK *lock= thd->lock ? thd->lock : thd->locked_tables;
- DBUG_ASSERT(lock->table_count > 0);
- TABLE **const end_ptr= lock->table + lock->table_count;
- for (TABLE **table_ptr= lock->table ;
- table_ptr != end_ptr ;
- ++table_ptr)
+ DBUG_ENTER("write_locked_table_maps");
+ DBUG_PRINT("enter", ("thd=%p, thd->lock=%p, thd->locked_tables=%p",
+ thd, thd->lock, thd->locked_tables));
+
+ if (thd->get_binlog_table_maps() == 0)
{
- TABLE *const table= *table_ptr;
- DBUG_PRINT("info", ("Checking table %s", table->s->table_name));
- if (table->current_lock == F_WRLCK &&
- check_table_binlog_row_based(thd, table))
+ /*
+ Exactly one table has to be locked, otherwise this code is not
+ guaranteed to work.
+ */
+ DBUG_ASSERT((thd->lock != NULL) + (thd->locked_tables != NULL) == 1);
+
+ MYSQL_LOCK *lock= thd->lock ? thd->lock : thd->locked_tables;
+ DBUG_ASSERT(lock->table_count > 0);
+ TABLE **const end_ptr= lock->table + lock->table_count;
+ for (TABLE **table_ptr= lock->table ;
+ table_ptr != end_ptr ;
+ ++table_ptr)
{
- int const has_trans= table->file->has_transactions();
- int const error= thd->binlog_write_table_map(table, has_trans);
- /*
- If an error occurs, it is the responsibility of the caller to
- roll back the transaction.
- */
- if (unlikely(error))
- DBUG_RETURN(1);
+ TABLE *const table= *table_ptr;
+ DBUG_PRINT("info", ("Checking table %s", table->s->table_name));
+ if (table->current_lock == F_WRLCK &&
+ check_table_binlog_row_based(thd, table))
+ {
+ int const has_trans= table->file->has_transactions();
+ int const error= thd->binlog_write_table_map(table, has_trans);
+ /*
+ If an error occurs, it is the responsibility of the caller to
+ roll back the transaction.
+ */
+ if (unlikely(error))
+ DBUG_RETURN(1);
+ }
}
}
+ DBUG_RETURN(0);
}
- DBUG_RETURN(0);
-}
-template<class RowsEventT> int binlog_log_row(TABLE* table,
- const byte *before_record,
- const byte *after_record)
-{
- if (table->file->is_injective())
- return 0;
- bool error= 0;
- THD *const thd= table->in_use;
-
- if (check_table_binlog_row_based(thd, table))
+ template<class RowsEventT> int
+ binlog_log_row(TABLE* table,
+ const byte *before_record,
+ const byte *after_record)
{
- MY_BITMAP cols;
- /* Potential buffer on the stack for the bitmap */
- uint32 bitbuf[BITMAP_STACKBUF_SIZE/sizeof(uint32)];
- uint n_fields= table->s->fields;
- my_bool use_bitbuf= n_fields <= sizeof(bitbuf)*8;
+ if (table->file->is_injective())
+ return 0;
+ bool error= 0;
+ THD *const thd= table->in_use;
- /*
- If there are no table maps written to the binary log, this is
- the first row handled in this statement. In that case, we need
- to write table maps for all locked tables to the binary log.
- */
- if (likely(!(error= bitmap_init(&cols,
- use_bitbuf ? bitbuf : NULL,
- (n_fields + 7) & ~7UL,
- false))))
+ if (check_table_binlog_row_based(thd, table))
{
- bitmap_set_all(&cols);
- if (likely(!(error= write_locked_table_maps(thd))))
+ MY_BITMAP cols;
+ /* Potential buffer on the stack for the bitmap */
+ uint32 bitbuf[BITMAP_STACKBUF_SIZE/sizeof(uint32)];
+ uint n_fields= table->s->fields;
+ my_bool use_bitbuf= n_fields <= sizeof(bitbuf)*8;
+
+ /*
+ If there are no table maps written to the binary log, this is
+ the first row handled in this statement. In that case, we need
+ to write table maps for all locked tables to the binary log.
+ */
+ if (likely(!(error= bitmap_init(&cols,
+ use_bitbuf ? bitbuf : NULL,
+ (n_fields + 7) & ~7UL,
+ false))))
{
- error=
- RowsEventT::binlog_row_logging_function(thd, table,
- table->file->has_transactions(),
- &cols, table->s->fields,
- before_record, after_record);
+ bitmap_set_all(&cols);
+ if (likely(!(error= write_locked_table_maps(thd))))
+ {
+ error=
+ RowsEventT::binlog_row_logging_function(thd, table,
+ table->file->has_transactions(),
+ &cols, table->s->fields,
+ before_record, after_record);
+ }
+ if (!use_bitbuf)
+ bitmap_free(&cols);
}
- if (!use_bitbuf)
- bitmap_free(&cols);
}
+ return error ? HA_ERR_RBR_LOGGING_FAILED : 0;
}
- return error ? HA_ERR_RBR_LOGGING_FAILED : 0;
-}
-/*
- Instantiate the versions we need for the above template function, because we
- have -fno-implicit-template as compiling option.
-*/
+ /*
+ Instantiate the versions we need for the above template function,
+ because we have -fno-implicit-template as compiling option.
+ */
-template int binlog_log_row<Write_rows_log_event>(TABLE *, const byte *, const byte *);
-template int binlog_log_row<Delete_rows_log_event>(TABLE *, const byte *, const byte *);
-template int binlog_log_row<Update_rows_log_event>(TABLE *, const byte *, const byte *);
+ template int
+ binlog_log_row<Write_rows_log_event>(TABLE *, const byte *, const byte *);
+
+ template int
+ binlog_log_row<Delete_rows_log_event>(TABLE *, const byte *, const byte *);
+
+ template int
+ binlog_log_row<Update_rows_log_event>(TABLE *, const byte *, const byte *);
+}
#endif /* HAVE_ROW_BASED_REPLICATION */