1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1
/* Copyright (C) 2000-2006 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
21
17
@addtogroup Replication
372
375
#define BINLOG_MAGIC "\xfe\x62\x69\x6e"
378
The 2 flags below were useless :
379
- the first one was never set
380
- the second one was set in all Rotate events on the master, but not used for
382
So they are now removed and their place may later be reused for other
383
flags. Then one must remember that Rotate events in 4.x have
384
LOG_EVENT_FORCED_ROTATE_F set, so one should not rely on the value of the
385
replacing flag when reading a Rotate event.
386
I keep the defines here just to remember what they were.
389
#define LOG_EVENT_TIME_F 0x1
390
#define LOG_EVENT_FORCED_ROTATE_F 0x2
375
394
This flag only makes sense for Format_description_log_event. It is set
376
395
when the event is written, and *reset* when a binlog file is
377
396
closed (yes, it's the only case when MySQL modifies already written
549
class DRIZZLE_BIN_LOG;
552
573
class Format_description_log_event;
553
574
class Relay_log_info;
577
enum enum_base64_output_mode {
578
BASE64_OUTPUT_NEVER= 0,
579
BASE64_OUTPUT_AUTO= 1,
580
BASE64_OUTPUT_ALWAYS= 2,
581
BASE64_OUTPUT_UNSPEC= 3,
582
/* insert new output modes here */
583
BASE64_OUTPUT_MODE_COUNT
587
A structure for mysqlbinlog to know how to print events
589
This structure is passed to the event's print() methods,
591
There are two types of settings stored here:
592
1. Last db, flags2, sql_mode etc comes from the last printed event.
593
They are stored so that only the necessary USE and SET commands
595
2. Other information on how to print the events, e.g. short_form,
596
hexdump_from. These are not dependent on the last event.
598
typedef struct st_print_event_info
601
Settings for database, sql_mode etc that comes from the last event
602
that was printed. We cache these so that we don't have to print
603
them if they are unchanged.
605
// TODO: have the last catalog here ??
606
char db[FN_REFLEN+1]; // TODO: make this a LEX_STRING when thd->db is
609
bool sql_mode_inited;
610
ulong sql_mode; /* must be same as THD.variables.sql_mode */
611
ulong auto_increment_increment, auto_increment_offset;
613
char charset[6]; // 3 variables, each of them storable in 2 bytes
614
char time_zone_str[MAX_TIME_ZONE_NAME_LENGTH];
615
uint lc_time_names_number;
616
uint charset_database_number;
618
bool thread_id_printed;
620
st_print_event_info();
622
~st_print_event_info() {
623
close_cached_file(&head_cache);
624
close_cached_file(&body_cache);
626
bool init_ok() /* tells if construction was successful */
627
{ return my_b_inited(&head_cache) && my_b_inited(&body_cache); }
630
/* Settings on how to print the events */
632
enum_base64_output_mode base64_output_mode;
634
This is set whenever a Format_description_event is printed.
635
Later, when an event is printed in base64, this flag is tested: if
636
no Format_description_event has been seen, it is unsafe to print
637
the base64 event, so an error message is generated.
639
bool printed_fd_event;
640
my_off_t hexdump_from;
641
uint8 common_header_len;
645
These two caches are used by the row-based replication events to
646
collect the header information and the main body of the events
647
making up a statement.
556
655
the struct aggregates two paramenters that identify an event
557
656
uniquely in scope of communication of a particular master and slave couple.
822
923
virtual void pack_info(Protocol *protocol);
925
#endif /* HAVE_REPLICATION */
824
926
virtual const char* get_db()
826
928
return thd ? thd->db : 0;
931
Log_event() : temp_buf(0) {}
932
/* avoid having to link mysqlbinlog against libpthread */
933
static Log_event* read_log_event(IO_CACHE* file,
934
const Format_description_log_event
936
/* print*() functions are used by mysqlbinlog */
937
virtual void print(FILE* file, PRINT_EVENT_INFO* print_event_info) = 0;
938
void print_timestamp(IO_CACHE* file, time_t *ts = 0);
939
void print_header(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info,
941
void print_base64(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info,
829
945
static void *operator new(size_t size)
831
947
return (void*) my_malloc((uint)size, MYF(MY_WME|MY_FAE));
834
static void operator delete(void *ptr,
835
size_t size __attribute__((unused)))
950
static void operator delete(void *ptr, size_t size)
837
free((unsigned char*) ptr);
952
my_free((uchar*) ptr, MYF(MY_WME|MY_ALLOW_ZERO_PTR));
840
955
/* Placement version of the above operators */
841
956
static void *operator new(size_t, void* ptr) { return ptr; }
842
957
static void operator delete(void*, void*) { }
844
960
bool write_header(IO_CACHE* file, ulong data_length);
845
961
virtual bool write(IO_CACHE* file)
1441
1560
bool sql_mode_inited;
1442
1561
bool charset_inited;
1445
1564
/* In connections sql_mode is 32 bits now but will be 64 bits soon */
1446
1565
ulong sql_mode;
1447
1566
ulong auto_increment_increment, auto_increment_offset;
1448
1567
char charset[6];
1449
uint32_t time_zone_len; /* 0 means uninited */
1568
uint time_zone_len; /* 0 means uninited */
1450
1569
const char *time_zone_str;
1451
uint32_t lc_time_names_number; /* 0 means en_US */
1452
uint32_t charset_database_number;
1570
uint lc_time_names_number; /* 0 means en_US */
1571
uint charset_database_number;
1573
#ifndef MYSQL_CLIENT
1455
1575
Query_log_event(THD* thd_arg, const char* query_arg, ulong query_length,
1456
1576
bool using_trans, bool suppress_use,
1457
1577
THD::killed_state killed_err_arg= THD::KILLED_NO_VALUE);
1458
1578
const char* get_db() { return db; }
1579
#ifdef HAVE_REPLICATION
1459
1580
void pack_info(Protocol* protocol);
1581
#endif /* HAVE_REPLICATION */
1583
void print_query_header(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info);
1584
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
1461
1587
Query_log_event();
1462
Query_log_event(const char* buf, uint32_t event_len,
1588
Query_log_event(const char* buf, uint event_len,
1463
1589
const Format_description_log_event *description_event,
1464
1590
Log_event_type event_type);
1465
1591
~Query_log_event()
1468
free((unsigned char*) data_buf);
1594
my_free((uchar*) data_buf, MYF(0));
1470
1596
Log_event_type get_type_code() { return QUERY_EVENT; }
1597
#ifndef MYSQL_CLIENT
1471
1598
bool write(IO_CACHE* file);
1472
virtual bool write_post_header_for_derived(IO_CACHE* file __attribute__((unused)))
1599
virtual bool write_post_header_for_derived(IO_CACHE* file) { return FALSE; }
1474
1601
bool is_valid() const { return query != 0; }
1543
1673
class Slave_log_event: public Log_event
1546
1676
char* mem_pool;
1547
void init_from_mem_pool();
1677
void init_from_mem_pool(int data_size);
1550
std::string master_host;
1551
std::string master_log;
1552
uint16_t master_port;
1679
my_off_t master_pos;
1682
int master_host_len;
1686
#ifndef MYSQL_CLIENT
1554
1687
Slave_log_event(THD* thd_arg, Relay_log_info* rli);
1555
1688
void pack_info(Protocol* protocol);
1690
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
1557
Slave_log_event(const char* buf, uint32_t event_len);
1693
Slave_log_event(const char* buf, uint event_len);
1558
1694
~Slave_log_event();
1559
1695
int get_data_size();
1560
bool is_valid() const { return master_host.length() != 0; }
1696
bool is_valid() const { return master_host != 0; }
1561
1697
Log_event_type get_type_code() { return SLAVE_EVENT; }
1698
#ifndef MYSQL_CLIENT
1562
1699
bool write(IO_CACHE* file);
1703
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
1565
1704
virtual int do_apply_event(Relay_log_info const* rli);
1708
#endif /* HAVE_REPLICATION */
1570
1712
@class Load_log_event
1965
2129
LOG_EVENT_HEADER_LEN), except FORMAT_DESCRIPTION_EVENT and ROTATE_EVENT
1966
2130
(those have a header of size LOG_EVENT_MINIMAL_HEADER_LEN).
1968
uint8_t common_header_len;
1969
uint8_t number_of_event_types;
2132
uint8 common_header_len;
2133
uint8 number_of_event_types;
1970
2134
/* The list of post-headers' lengthes */
1971
uint8_t *post_header_len;
1972
unsigned char server_version_split[3];
1973
const uint8_t *event_type_permutation;
2135
uint8 *post_header_len;
2136
uchar server_version_split[3];
2137
const uint8 *event_type_permutation;
1975
Format_description_log_event(uint8_t binlog_ver, const char* server_ver=0);
1976
Format_description_log_event(const char* buf, uint32_t event_len,
2139
Format_description_log_event(uint8 binlog_ver, const char* server_ver=0);
2140
Format_description_log_event(const char* buf, uint event_len,
1977
2141
const Format_description_log_event
1978
2142
*description_event);
1979
2143
~Format_description_log_event()
1981
free((unsigned char*)post_header_len);
2145
my_free((uchar*)post_header_len, MYF(MY_ALLOW_ZERO_PTR));
1983
2147
Log_event_type get_type_code() { return FORMAT_DESCRIPTION_EVENT;}
2148
#ifndef MYSQL_CLIENT
1984
2149
bool write(IO_CACHE* file);
1985
2151
bool is_valid() const
1987
2153
return ((common_header_len >= ((binlog_version==1) ? OLD_HEADER_LEN :
2112
2290
class Rand_log_event: public Log_event
2118
Rand_log_event(THD* thd_arg, uint64_t seed1_arg, uint64_t seed2_arg)
2296
#ifndef MYSQL_CLIENT
2297
Rand_log_event(THD* thd_arg, ulonglong seed1_arg, ulonglong seed2_arg)
2119
2298
:Log_event(thd_arg,0,0),seed1(seed1_arg),seed2(seed2_arg)
2300
#ifdef HAVE_REPLICATION
2121
2301
void pack_info(Protocol* protocol);
2302
#endif /* HAVE_REPLICATION */
2304
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2123
2307
Rand_log_event(const char* buf,
2124
2308
const Format_description_log_event *description_event);
2125
2309
~Rand_log_event() {}
2126
2310
Log_event_type get_type_code() { return RAND_EVENT;}
2127
int get_data_size() { return 16; /* sizeof(uint64_t) * 2*/ }
2311
int get_data_size() { return 16; /* sizeof(ulonglong) * 2*/ }
2312
#ifndef MYSQL_CLIENT
2128
2313
bool write(IO_CACHE* file);
2129
2315
bool is_valid() const { return 1; }
2318
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2132
2319
virtual int do_apply_event(Relay_log_info const *rli);
2133
2320
virtual int do_update_pos(Relay_log_info *rli);
2134
2321
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2143
2331
@section Xid_log_event_binary_format Binary Format
2334
typedef ulonglong my_xid; // this line is the same as in handler.h
2145
2337
class Xid_log_event: public Log_event
2342
#ifndef MYSQL_CLIENT
2150
2343
Xid_log_event(THD* thd_arg, my_xid x): Log_event(thd_arg,0,0), xid(x) {}
2344
#ifdef HAVE_REPLICATION
2151
2345
void pack_info(Protocol* protocol);
2346
#endif /* HAVE_REPLICATION */
2348
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2153
2351
Xid_log_event(const char* buf,
2154
2352
const Format_description_log_event *description_event);
2155
2353
~Xid_log_event() {}
2156
2354
Log_event_type get_type_code() { return XID_EVENT;}
2157
2355
int get_data_size() { return sizeof(xid); }
2356
#ifndef MYSQL_CLIENT
2158
2357
bool write(IO_CACHE* file);
2159
2359
bool is_valid() const { return 1; }
2362
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2162
2363
virtual int do_apply_event(Relay_log_info const *rli);
2163
2364
enum_skip_reason do_shall_skip(Relay_log_info *rli);
2182
2384
Item_result type;
2183
uint32_t charset_number;
2385
uint charset_number;
2185
User_var_log_event(THD* thd_arg __attribute__((unused)),
2186
char *name_arg, uint32_t name_len_arg,
2387
#ifndef MYSQL_CLIENT
2388
User_var_log_event(THD* thd_arg, char *name_arg, uint name_len_arg,
2187
2389
char *val_arg, ulong val_len_arg, Item_result type_arg,
2188
uint32_t charset_number_arg)
2390
uint charset_number_arg)
2189
2391
:Log_event(), name(name_arg), name_len(name_len_arg), val(val_arg),
2190
2392
val_len(val_len_arg), type(type_arg), charset_number(charset_number_arg)
2191
2393
{ is_null= !val; }
2192
2394
void pack_info(Protocol* protocol);
2396
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2194
2399
User_var_log_event(const char* buf,
2195
2400
const Format_description_log_event *description_event);
2196
2401
~User_var_log_event() {}
2197
2402
Log_event_type get_type_code() { return USER_VAR_EVENT;}
2403
#ifndef MYSQL_CLIENT
2198
2404
bool write(IO_CACHE* file);
2199
2406
bool is_valid() const { return 1; }
2409
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2202
2410
virtual int do_apply_event(Relay_log_info const *rli);
2203
2411
virtual int do_update_pos(Relay_log_info *rli);
2204
2412
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2298
2513
DUP_NAME= 2 // if constructor should dup the string argument
2300
2515
const char* new_log_ident;
2519
#ifndef MYSQL_CLIENT
2304
2520
Rotate_log_event(const char* new_log_ident_arg,
2305
uint32_t ident_len_arg,
2306
uint64_t pos_arg, uint32_t flags);
2522
ulonglong pos_arg, uint flags);
2523
#ifdef HAVE_REPLICATION
2307
2524
void pack_info(Protocol* protocol);
2525
#endif /* HAVE_REPLICATION */
2527
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2309
Rotate_log_event(const char* buf, uint32_t event_len,
2530
Rotate_log_event(const char* buf, uint event_len,
2310
2531
const Format_description_log_event* description_event);
2311
2532
~Rotate_log_event()
2313
2534
if (flags & DUP_NAME)
2314
free((unsigned char*) new_log_ident);
2535
my_free((uchar*) new_log_ident, MYF(MY_ALLOW_ZERO_PTR));
2316
2537
Log_event_type get_type_code() { return ROTATE_EVENT;}
2317
2538
int get_data_size() { return ident_len + ROTATE_HEADER_LEN;}
2318
2539
bool is_valid() const { return new_log_ident != 0; }
2540
#ifndef MYSQL_CLIENT
2319
2541
bool write(IO_CACHE* file);
2545
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2322
2546
virtual int do_update_pos(Relay_log_info *rli);
2323
2547
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2343
2568
bool fake_base;
2345
unsigned char* block;
2346
2571
const char *event_buf;
2349
2574
bool inited_from_old;
2576
#ifndef MYSQL_CLIENT
2351
2577
Create_file_log_event(THD* thd, sql_exchange* ex, const char* db_arg,
2352
2578
const char* table_name_arg,
2353
2579
List<Item>& fields_arg,
2354
2580
enum enum_duplicates handle_dup, bool ignore,
2355
unsigned char* block_arg, uint32_t block_len_arg,
2581
uchar* block_arg, uint block_len_arg,
2356
2582
bool using_trans);
2583
#ifdef HAVE_REPLICATION
2357
2584
void pack_info(Protocol* protocol);
2585
#endif /* HAVE_REPLICATION */
2587
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2588
void print(FILE* file, PRINT_EVENT_INFO* print_event_info,
2359
Create_file_log_event(const char* buf, uint32_t event_len,
2592
Create_file_log_event(const char* buf, uint event_len,
2360
2593
const Format_description_log_event* description_event);
2361
2594
~Create_file_log_event()
2363
free((char*) event_buf);
2596
my_free((char*) event_buf, MYF(MY_ALLOW_ZERO_PTR));
2366
2599
Log_event_type get_type_code()
2413
2650
const char* db;
2415
Append_block_log_event(THD* thd, const char* db_arg, unsigned char* block_arg,
2416
uint32_t block_len_arg, bool using_trans);
2652
#ifndef MYSQL_CLIENT
2653
Append_block_log_event(THD* thd, const char* db_arg, uchar* block_arg,
2654
uint block_len_arg, bool using_trans);
2655
#ifdef HAVE_REPLICATION
2417
2656
void pack_info(Protocol* protocol);
2418
2657
virtual int get_create_or_append() const;
2658
#endif /* HAVE_REPLICATION */
2660
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2420
Append_block_log_event(const char* buf, uint32_t event_len,
2663
Append_block_log_event(const char* buf, uint event_len,
2421
2664
const Format_description_log_event
2422
2665
*description_event);
2423
2666
~Append_block_log_event() {}
2424
2667
Log_event_type get_type_code() { return APPEND_BLOCK_EVENT;}
2425
2668
int get_data_size() { return block_len + APPEND_BLOCK_HEADER_LEN ;}
2426
2669
bool is_valid() const { return block != 0; }
2670
#ifndef MYSQL_CLIENT
2427
2671
bool write(IO_CACHE* file);
2428
2672
const char* get_db() { return db; }
2676
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2431
2677
virtual int do_apply_event(Relay_log_info const *rli);
2441
2688
class Delete_file_log_event: public Log_event
2445
2692
const char* db; /* see comment in Append_block_log_event */
2694
#ifndef MYSQL_CLIENT
2447
2695
Delete_file_log_event(THD* thd, const char* db_arg, bool using_trans);
2696
#ifdef HAVE_REPLICATION
2448
2697
void pack_info(Protocol* protocol);
2698
#endif /* HAVE_REPLICATION */
2700
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2701
void print(FILE* file, PRINT_EVENT_INFO* print_event_info,
2450
Delete_file_log_event(const char* buf, uint32_t event_len,
2705
Delete_file_log_event(const char* buf, uint event_len,
2451
2706
const Format_description_log_event* description_event);
2452
2707
~Delete_file_log_event() {}
2453
2708
Log_event_type get_type_code() { return DELETE_FILE_EVENT;}
2454
2709
int get_data_size() { return DELETE_FILE_HEADER_LEN ;}
2455
2710
bool is_valid() const { return file_id != 0; }
2711
#ifndef MYSQL_CLIENT
2456
2712
bool write(IO_CACHE* file);
2457
2713
const char* get_db() { return db; }
2717
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2460
2718
virtual int do_apply_event(Relay_log_info const *rli);
2470
2729
class Execute_load_log_event: public Log_event
2474
2733
const char* db; /* see comment in Append_block_log_event */
2735
#ifndef MYSQL_CLIENT
2476
2736
Execute_load_log_event(THD* thd, const char* db_arg, bool using_trans);
2737
#ifdef HAVE_REPLICATION
2477
2738
void pack_info(Protocol* protocol);
2739
#endif /* HAVE_REPLICATION */
2741
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2479
Execute_load_log_event(const char* buf, uint32_t event_len,
2744
Execute_load_log_event(const char* buf, uint event_len,
2480
2745
const Format_description_log_event
2481
2746
*description_event);
2482
2747
~Execute_load_log_event() {}
2483
2748
Log_event_type get_type_code() { return EXEC_LOAD_EVENT;}
2484
2749
int get_data_size() { return EXEC_LOAD_HEADER_LEN ;}
2485
2750
bool is_valid() const { return file_id != 0; }
2751
#ifndef MYSQL_CLIENT
2486
2752
bool write(IO_CACHE* file);
2487
2753
const char* get_db() { return db; }
2757
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2490
2758
virtual int do_apply_event(Relay_log_info const *rli);
2503
2772
class Begin_load_query_log_event: public Append_block_log_event
2775
#ifndef MYSQL_CLIENT
2506
2776
Begin_load_query_log_event(THD* thd_arg, const char *db_arg,
2507
unsigned char* block_arg, uint32_t block_len_arg,
2777
uchar* block_arg, uint block_len_arg,
2508
2778
bool using_trans);
2779
#ifdef HAVE_REPLICATION
2509
2780
Begin_load_query_log_event(THD* thd);
2510
2781
int get_create_or_append() const;
2511
Begin_load_query_log_event(const char* buf, uint32_t event_len,
2782
#endif /* HAVE_REPLICATION */
2784
Begin_load_query_log_event(const char* buf, uint event_len,
2512
2785
const Format_description_log_event
2513
2786
*description_event);
2514
2787
~Begin_load_query_log_event() {}
2515
2788
Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; }
2790
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2517
2791
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2549
2824
enum_load_dup_handling dup_handling;
2826
#ifndef MYSQL_CLIENT
2551
2827
Execute_load_query_log_event(THD* thd, const char* query_arg,
2552
ulong query_length, uint32_t fn_pos_start_arg,
2553
uint32_t fn_pos_end_arg,
2828
ulong query_length, uint fn_pos_start_arg,
2829
uint fn_pos_end_arg,
2554
2830
enum_load_dup_handling dup_handling_arg,
2555
2831
bool using_trans, bool suppress_use,
2556
2832
THD::killed_state
2557
2833
killed_err_arg= THD::KILLED_NO_VALUE);
2834
#ifdef HAVE_REPLICATION
2558
2835
void pack_info(Protocol* protocol);
2559
Execute_load_query_log_event(const char* buf, uint32_t event_len,
2836
#endif /* HAVE_REPLICATION */
2838
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2839
/* Prints the query as LOAD DATA LOCAL and with rewritten filename */
2840
void print(FILE* file, PRINT_EVENT_INFO* print_event_info,
2841
const char *local_fname);
2843
Execute_load_query_log_event(const char* buf, uint event_len,
2560
2844
const Format_description_log_event
2561
2845
*description_event);
2562
2846
~Execute_load_query_log_event() {}
2565
2849
bool is_valid() const { return Query_log_event::is_valid() && file_id != 0; }
2567
2851
ulong get_post_header_size_for_derived();
2852
#ifndef MYSQL_CLIENT
2568
2853
bool write_post_header_for_derived(IO_CACHE* file);
2857
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2571
2858
virtual int do_apply_event(Relay_log_info const *rli);
2575
char *str_to_hex(char *to, const char *from, uint32_t len);
2865
@class Unknown_log_event
2867
@section Unknown_log_event_binary_format Binary Format
2869
class Unknown_log_event: public Log_event
2873
Even if this is an unknown event, we still pass description_event to
2874
Log_event's ctor, this way we can extract maximum information from the
2875
event's header (the unique ID for example).
2877
Unknown_log_event(const char* buf,
2878
const Format_description_log_event *description_event):
2879
Log_event(buf, description_event)
2881
~Unknown_log_event() {}
2882
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2883
Log_event_type get_type_code() { return UNKNOWN_EVENT;}
2884
bool is_valid() const { return 1; }
2887
char *str_to_hex(char *to, const char *from, uint len);
2578
2890
@class Table_map_log_event
2704
<td>DRIZZLE_TYPE_TINY</td><td>1</td>
2706
<td>No column metadata.</td>
2710
<td>DRIZZLE_TYPE_SHORT</td><td>2</td>
2712
<td>No column metadata.</td>
2716
<td>DRIZZLE_TYPE_LONG</td><td>3</td>
2718
<td>No column metadata.</td>
2722
<td>DRIZZLE_TYPE_DOUBLE</td><td>5</td>
3016
<td>MYSQL_TYPE_DECIMAL</td><td>0</td>
3018
<td>No column metadata.</td>
3022
<td>MYSQL_TYPE_TINY</td><td>1</td>
3024
<td>No column metadata.</td>
3028
<td>MYSQL_TYPE_SHORT</td><td>2</td>
3030
<td>No column metadata.</td>
3034
<td>MYSQL_TYPE_LONG</td><td>3</td>
3036
<td>No column metadata.</td>
3040
<td>MYSQL_TYPE_FLOAT</td><td>4</td>
3042
<td>1 byte unsigned integer, representing the "pack_length", which
3043
is equal to sizeof(float) on the server from which the event
3048
<td>MYSQL_TYPE_DOUBLE</td><td>5</td>
2723
3049
<td>1 byte</td>
2724
3050
<td>1 byte unsigned integer, representing the "pack_length", which
2725
3051
is equal to sizeof(double) on the server from which the event
2730
<td>DRIZZLE_TYPE_NULL</td><td>6</td>
2732
<td>No column metadata.</td>
2736
<td>DRIZZLE_TYPE_TIMESTAMP</td><td>7</td>
2738
<td>No column metadata.</td>
2742
<td>DRIZZLE_TYPE_LONGLONG</td><td>8</td>
2744
<td>No column metadata.</td>
2748
<td>DRIZZLE_TYPE_DATE</td><td>10</td>
2750
<td>No column metadata.</td>
2754
<td>DRIZZLE_TYPE_TIME</td><td>11</td>
2756
<td>No column metadata.</td>
2760
<td>DRIZZLE_TYPE_DATETIME</td><td>12</td>
2762
<td>No column metadata.</td>
2766
<td>DRIZZLE_TYPE_YEAR</td><td>13</td>
2768
<td>No column metadata.</td>
2772
<td><i>DRIZZLE_TYPE_NEWDATE</i></td><td><i>14</i></td>
3056
<td>MYSQL_TYPE_NULL</td><td>6</td>
3058
<td>No column metadata.</td>
3062
<td>MYSQL_TYPE_TIMESTAMP</td><td>7</td>
3064
<td>No column metadata.</td>
3068
<td>MYSQL_TYPE_LONGLONG</td><td>8</td>
3070
<td>No column metadata.</td>
3074
<td>MYSQL_TYPE_INT24</td><td>9</td>
3076
<td>No column metadata.</td>
3080
<td>MYSQL_TYPE_DATE</td><td>10</td>
3082
<td>No column metadata.</td>
3086
<td>MYSQL_TYPE_TIME</td><td>11</td>
3088
<td>No column metadata.</td>
3092
<td>MYSQL_TYPE_DATETIME</td><td>12</td>
3094
<td>No column metadata.</td>
3098
<td>MYSQL_TYPE_YEAR</td><td>13</td>
3100
<td>No column metadata.</td>
3104
<td><i>MYSQL_TYPE_NEWDATE</i></td><td><i>14</i></td>
2773
3105
<td>–</td>
2774
3106
<td><i>This enumeration value is only used internally and cannot
2775
3107
exist in a binlog.</i></td>
2779
<td>DRIZZLE_TYPE_VARCHAR</td><td>15</td>
3111
<td>MYSQL_TYPE_VARCHAR</td><td>15</td>
2780
3112
<td>2 bytes</td>
2781
3113
<td>2 byte unsigned integer representing the maximum length of
2782
3114
the string.</td>
2786
<td>DRIZZLE_TYPE_NEWDECIMAL</td><td>246</td>
3118
<td>MYSQL_TYPE_BIT</td><td>16</td>
3120
<td>A 1 byte unsigned int representing the length in bits of the
3121
bitfield (0 to 64), followed by a 1 byte unsigned int
3122
representing the number of bytes occupied by the bitfield. The
3123
number of bytes is either int((length+7)/8) or int(length/8).</td>
3127
<td>MYSQL_TYPE_NEWDECIMAL</td><td>246</td>
2787
3128
<td>2 bytes</td>
2788
3129
<td>A 1 byte unsigned int representing the precision, followed
2789
3130
by a 1 byte unsigned int representing the number of decimals.</td>
2793
<td><i>DRIZZLE_TYPE_ENUM</i></td><td><i>247</i></td>
2795
<td><i>This enumeration value is only used internally and cannot
2796
exist in a binlog.</i></td>
2800
<td><i>DRIZZLE_TYPE_SET</i></td><td><i>248</i></td>
2802
<td><i>This enumeration value is only used internally and cannot
2803
exist in a binlog.</i></td>
2807
<td>DRIZZLE_TYPE_BLOB</td><td>252</td>
3134
<td><i>MYSQL_TYPE_ENUM</i></td><td><i>247</i></td>
3136
<td><i>This enumeration value is only used internally and cannot
3137
exist in a binlog.</i></td>
3141
<td><i>MYSQL_TYPE_SET</i></td><td><i>248</i></td>
3143
<td><i>This enumeration value is only used internally and cannot
3144
exist in a binlog.</i></td>
3148
<td>MYSQL_TYPE_TINY_BLOB</td><td>249</td>
3150
<td><i>This enumeration value is only used internally and cannot
3151
exist in a binlog.</i></td>
3155
<td><i>MYSQL_TYPE_MEDIUM_BLOB</i></td><td><i>250</i></td>
3157
<td><i>This enumeration value is only used internally and cannot
3158
exist in a binlog.</i></td>
3162
<td><i>MYSQL_TYPE_LONG_BLOB</i></td><td><i>251</i></td>
3164
<td><i>This enumeration value is only used internally and cannot
3165
exist in a binlog.</i></td>
3169
<td>MYSQL_TYPE_BLOB</td><td>252</td>
2808
3170
<td>1 byte</td>
2809
3171
<td>The pack length, i.e., the number of bytes needed to represent
2810
3172
the length of the blob: 1, 2, 3, or 4.</td>
2814
<td>DRIZZLE_TYPE_STRING</td><td>254</td>
2816
<td>The first byte is always DRIZZLE_TYPE_VAR_STRING (i.e., 253).
3176
<td>MYSQL_TYPE_VAR_STRING</td><td>253</td>
3178
<td>This is used to store both strings and enumeration values.
3179
The first byte is a enumeration value storing the <i>real
3180
type</i>, which may be either MYSQL_TYPE_VAR_STRING or
3181
MYSQL_TYPE_ENUM. The second byte is a 1 byte unsigned integer
3182
representing the field size, i.e., the number of bytes needed to
3183
store the length of the string.</td>
3187
<td>MYSQL_TYPE_STRING</td><td>254</td>
3189
<td>The first byte is always MYSQL_TYPE_VAR_STRING (i.e., 253).
2817
3190
The second byte is the field size, i.e., the number of bytes in
2818
3191
the representation of size of the string: 3 or 4.</td>
3195
<td>MYSQL_TYPE_GEOMETRY</td><td>255</td>
3197
<td>The pack length, i.e., the number of bytes needed to represent
3198
the length of the geometry: 1, 2, 3, or 4.</td>
2823
3203
class Table_map_log_event : public Log_event
2876
3260
virtual bool is_valid() const { return m_memory != NULL; /* we check malloc */ }
2878
3262
virtual int get_data_size() { return m_data_size; }
3263
#ifndef MYSQL_CLIENT
2879
3264
virtual int save_field_metadata();
2880
3265
virtual bool write_data_header(IO_CACHE *file);
2881
3266
virtual bool write_data_body(IO_CACHE *file);
2882
3267
virtual const char *get_db() { return m_dbnam; }
3270
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2883
3271
virtual void pack_info(Protocol *protocol);
3275
virtual void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3280
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2886
3281
virtual int do_apply_event(Relay_log_info const *rli);
2887
3282
virtual int do_update_pos(Relay_log_info *rli);
2888
3283
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
3286
#ifndef MYSQL_CLIENT
2891
3289
char const *m_dbnam;
2892
3290
size_t m_dblen;
2893
3291
char const *m_tblnam;
2894
3292
size_t m_tbllen;
2895
3293
ulong m_colcnt;
2896
unsigned char *m_coltype;
2898
unsigned char *m_memory;
2899
3297
ulong m_table_id;
2900
3298
flag_set m_flags;
2902
3300
size_t m_data_size;
2904
unsigned char *m_field_metadata; // buffer for field metadata
3302
uchar *m_field_metadata; // buffer for field metadata
2906
3304
The size of field metadata buffer set by calling save_field_metadata()
2908
3306
ulong m_field_metadata_size;
2909
unsigned char *m_null_bits;
2910
unsigned char *m_meta_memory;
3308
uchar *m_meta_memory;
3009
3418
return m_rows_buf && m_cols.bitmap;
3012
uint32_t m_row_count; /* The number of rows added to the event */
3421
uint m_row_count; /* The number of rows added to the event */
3016
3425
The constructors are protected since you're supposed to inherit
3017
3426
this class, not create instances of this class.
3019
Rows_log_event(THD*, Table*, ulong table_id,
3428
#ifndef MYSQL_CLIENT
3429
Rows_log_event(THD*, TABLE*, ulong table_id,
3020
3430
MY_BITMAP const *cols, bool is_transactional);
3021
Rows_log_event(const char *row_data, uint32_t event_len,
3432
Rows_log_event(const char *row_data, uint event_len,
3022
3433
Log_event_type event_type,
3023
3434
const Format_description_log_event *description_event);
3025
virtual int do_add_row_data(unsigned char *data, size_t length);
3027
Table *m_table; /* The table the rows belong to */
3437
void print_helper(FILE *, PRINT_EVENT_INFO *, char const *const name);
3440
#ifndef MYSQL_CLIENT
3441
virtual int do_add_row_data(uchar *data, size_t length);
3444
#ifndef MYSQL_CLIENT
3445
TABLE *m_table; /* The table the rows belong to */
3028
3447
ulong m_table_id; /* Table ID */
3029
3448
MY_BITMAP m_cols; /* Bitmap denoting columns available */
3030
3449
ulong m_width; /* The width of the columns bitmap */
3040
3459
ulong m_master_reclength; /* Length of record on master side */
3042
3461
/* Bit buffers in the same memory as the class */
3043
uint32_t m_bitbuf[128/(sizeof(uint32_t)*8)];
3044
uint32_t m_bitbuf_ai[128/(sizeof(uint32_t)*8)];
3462
uint32 m_bitbuf[128/(sizeof(uint32)*8)];
3463
uint32 m_bitbuf_ai[128/(sizeof(uint32)*8)];
3046
unsigned char *m_rows_buf; /* The rows in packed format */
3047
unsigned char *m_rows_cur; /* One-after the end of the data */
3048
unsigned char *m_rows_end; /* One-after the end of the allocated space */
3465
uchar *m_rows_buf; /* The rows in packed format */
3466
uchar *m_rows_cur; /* One-after the end of the data */
3467
uchar *m_rows_end; /* One-after the end of the allocated space */
3050
3469
flag_set m_flags; /* Flags for row-level events */
3052
3471
/* helper functions */
3054
const unsigned char *m_curr_row; /* Start of the row being processed */
3055
const unsigned char *m_curr_row_end; /* One-after the end of the current row */
3056
unsigned char *m_key; /* Buffer to keep key value during searches */
3473
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3474
const uchar *m_curr_row; /* Start of the row being processed */
3475
const uchar *m_curr_row_end; /* One-after the end of the current row */
3476
uchar *m_key; /* Buffer to keep key value during searches */
3058
3478
int find_row(const Relay_log_info *const);
3059
3479
int write_row(const Relay_log_info *const, const bool);
3150
3573
TYPE_CODE = WRITE_ROWS_EVENT
3153
Write_rows_log_event(THD*, Table*, ulong table_id,
3576
#if !defined(MYSQL_CLIENT)
3577
Write_rows_log_event(THD*, TABLE*, ulong table_id,
3154
3578
bool is_transactional);
3155
Write_rows_log_event(const char *buf, uint32_t event_len,
3580
#ifdef HAVE_REPLICATION
3581
Write_rows_log_event(const char *buf, uint event_len,
3156
3582
const Format_description_log_event *description_event);
3157
static bool binlog_row_logging_function(THD *thd, Table *table,
3584
#if !defined(MYSQL_CLIENT)
3585
static bool binlog_row_logging_function(THD *thd, TABLE *table,
3158
3586
bool is_transactional,
3159
const unsigned char *before_record
3587
const uchar *before_record
3160
3588
__attribute__((unused)),
3161
const unsigned char *after_record)
3589
const uchar *after_record)
3163
3591
return thd->binlog_write_row(table, is_transactional, after_record);
3167
3596
virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; }
3599
void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3602
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3169
3603
virtual int do_before_row_operations(const Slave_reporting_capability *const);
3170
3604
virtual int do_after_row_operations(const Slave_reporting_capability *const,int);
3171
3605
virtual int do_exec_row(const Relay_log_info *const);
3193
3628
TYPE_CODE = UPDATE_ROWS_EVENT
3196
Update_rows_log_event(THD*, Table*, ulong table_id,
3631
#ifndef MYSQL_CLIENT
3632
Update_rows_log_event(THD*, TABLE*, ulong table_id,
3197
3633
bool is_transactional);
3199
3635
void init(MY_BITMAP const *cols);
3201
3638
virtual ~Update_rows_log_event();
3203
Update_rows_log_event(const char *buf, uint32_t event_len,
3640
#ifdef HAVE_REPLICATION
3641
Update_rows_log_event(const char *buf, uint event_len,
3204
3642
const Format_description_log_event *description_event);
3206
static bool binlog_row_logging_function(THD *thd, Table *table,
3645
#if !defined(MYSQL_CLIENT)
3646
static bool binlog_row_logging_function(THD *thd, TABLE *table,
3207
3647
bool is_transactional,
3208
const unsigned char *before_record,
3209
const unsigned char *after_record)
3648
const uchar *before_record,
3649
const uchar *after_record)
3211
3651
return thd->binlog_update_row(table, is_transactional,
3212
3652
before_record, after_record);
3215
3656
virtual bool is_valid() const
3254
3701
TYPE_CODE = DELETE_ROWS_EVENT
3257
Delete_rows_log_event(THD*, Table*, ulong,
3704
#ifndef MYSQL_CLIENT
3705
Delete_rows_log_event(THD*, TABLE*, ulong,
3258
3706
bool is_transactional);
3259
Delete_rows_log_event(const char *buf, uint32_t event_len,
3708
#ifdef HAVE_REPLICATION
3709
Delete_rows_log_event(const char *buf, uint event_len,
3260
3710
const Format_description_log_event *description_event);
3261
static bool binlog_row_logging_function(THD *thd, Table *table,
3712
#if !defined(MYSQL_CLIENT)
3713
static bool binlog_row_logging_function(THD *thd, TABLE *table,
3262
3714
bool is_transactional,
3263
const unsigned char *before_record,
3264
const unsigned char *after_record
3715
const uchar *before_record,
3716
const uchar *after_record
3265
3717
__attribute__((unused)))
3267
3719
return thd->binlog_delete_row(table, is_transactional, before_record);
3271
3724
virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; }
3727
void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3730
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3273
3731
virtual int do_before_row_operations(const Slave_reporting_capability *const);
3274
3732
virtual int do_after_row_operations(const Slave_reporting_capability *const,int);
3275
3733
virtual int do_exec_row(const Relay_log_info *const);
3315
3774
class Incident_log_event : public Log_event {
3776
#ifndef MYSQL_CLIENT
3317
3777
Incident_log_event(THD *thd_arg, Incident incident)
3318
: Log_event(thd_arg, 0, false), m_incident(incident)
3778
: Log_event(thd_arg, 0, FALSE), m_incident(incident)
3780
DBUG_ENTER("Incident_log_event::Incident_log_event");
3781
DBUG_PRINT("enter", ("m_incident: %d", m_incident));
3320
3782
m_message.str= NULL; /* Just as a precaution */
3321
3783
m_message.length= 0;
3325
3787
Incident_log_event(THD *thd_arg, Incident incident, LEX_STRING const msg)
3326
: Log_event(thd_arg, 0, false), m_incident(incident)
3788
: Log_event(thd_arg, 0, FALSE), m_incident(incident)
3790
DBUG_ENTER("Incident_log_event::Incident_log_event");
3791
DBUG_PRINT("enter", ("m_incident: %d", m_incident));
3328
3792
m_message= msg;
3797
#ifndef MYSQL_CLIENT
3332
3798
void pack_info(Protocol*);
3334
Incident_log_event(const char *buf, uint32_t event_len,
3801
Incident_log_event(const char *buf, uint event_len,
3335
3802
const Format_description_log_event *descr_event);
3337
3804
virtual ~Incident_log_event();
3807
virtual void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3810
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3339
3811
virtual int do_apply_event(Relay_log_info const *rli);
3341
3814
virtual bool write_data_header(IO_CACHE *file);
3342
3815
virtual bool write_data_body(IO_CACHE *file);