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
549
class DRIZZLE_BIN_LOG;
552
559
class Format_description_log_event;
553
560
class Relay_log_info;
563
enum enum_base64_output_mode {
564
BASE64_OUTPUT_NEVER= 0,
565
BASE64_OUTPUT_AUTO= 1,
566
BASE64_OUTPUT_ALWAYS= 2,
567
BASE64_OUTPUT_UNSPEC= 3,
568
/* insert new output modes here */
569
BASE64_OUTPUT_MODE_COUNT
573
A structure for mysqlbinlog to know how to print events
575
This structure is passed to the event's print() methods,
577
There are two types of settings stored here:
578
1. Last db, flags2, sql_mode etc comes from the last printed event.
579
They are stored so that only the necessary USE and SET commands
581
2. Other information on how to print the events, e.g. short_form,
582
hexdump_from. These are not dependent on the last event.
584
typedef struct st_print_event_info
587
Settings for database, sql_mode etc that comes from the last event
588
that was printed. We cache these so that we don't have to print
589
them if they are unchanged.
591
// TODO: have the last catalog here ??
592
char db[FN_REFLEN+1]; // TODO: make this a LEX_STRING when thd->db is
595
bool sql_mode_inited;
596
ulong sql_mode; /* must be same as THD.variables.sql_mode */
597
ulong auto_increment_increment, auto_increment_offset;
599
char charset[6]; // 3 variables, each of them storable in 2 bytes
600
char time_zone_str[MAX_TIME_ZONE_NAME_LENGTH];
601
uint lc_time_names_number;
602
uint charset_database_number;
604
bool thread_id_printed;
606
st_print_event_info();
608
~st_print_event_info() {
609
close_cached_file(&head_cache);
610
close_cached_file(&body_cache);
612
bool init_ok() /* tells if construction was successful */
613
{ return my_b_inited(&head_cache) && my_b_inited(&body_cache); }
616
/* Settings on how to print the events */
618
enum_base64_output_mode base64_output_mode;
620
This is set whenever a Format_description_event is printed.
621
Later, when an event is printed in base64, this flag is tested: if
622
no Format_description_event has been seen, it is unsafe to print
623
the base64 event, so an error message is generated.
625
bool printed_fd_event;
626
my_off_t hexdump_from;
627
uint8 common_header_len;
631
These two caches are used by the row-based replication events to
632
collect the header information and the main body of the events
633
making up a statement.
556
641
the struct aggregates two paramenters that identify an event
557
642
uniquely in scope of communication of a particular master and slave couple.
822
909
virtual void pack_info(Protocol *protocol);
911
#endif /* HAVE_REPLICATION */
824
912
virtual const char* get_db()
826
914
return thd ? thd->db : 0;
917
Log_event() : temp_buf(0) {}
918
/* avoid having to link mysqlbinlog against libpthread */
919
static Log_event* read_log_event(IO_CACHE* file,
920
const Format_description_log_event
922
/* print*() functions are used by mysqlbinlog */
923
virtual void print(FILE* file, PRINT_EVENT_INFO* print_event_info) = 0;
924
void print_timestamp(IO_CACHE* file, time_t *ts = 0);
925
void print_header(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info,
927
void print_base64(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info,
829
931
static void *operator new(size_t size)
1441
1547
bool sql_mode_inited;
1442
1548
bool charset_inited;
1445
1551
/* In connections sql_mode is 32 bits now but will be 64 bits soon */
1446
1552
ulong sql_mode;
1447
1553
ulong auto_increment_increment, auto_increment_offset;
1448
1554
char charset[6];
1449
uint32_t time_zone_len; /* 0 means uninited */
1555
uint time_zone_len; /* 0 means uninited */
1450
1556
const char *time_zone_str;
1451
uint32_t lc_time_names_number; /* 0 means en_US */
1452
uint32_t charset_database_number;
1557
uint lc_time_names_number; /* 0 means en_US */
1558
uint charset_database_number;
1560
#ifndef MYSQL_CLIENT
1455
1562
Query_log_event(THD* thd_arg, const char* query_arg, ulong query_length,
1456
1563
bool using_trans, bool suppress_use,
1457
1564
THD::killed_state killed_err_arg= THD::KILLED_NO_VALUE);
1458
1565
const char* get_db() { return db; }
1566
#ifdef HAVE_REPLICATION
1459
1567
void pack_info(Protocol* protocol);
1568
#endif /* HAVE_REPLICATION */
1570
void print_query_header(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info);
1571
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
1461
1574
Query_log_event();
1462
Query_log_event(const char* buf, uint32_t event_len,
1575
Query_log_event(const char* buf, uint event_len,
1463
1576
const Format_description_log_event *description_event,
1464
1577
Log_event_type event_type);
1465
1578
~Query_log_event()
1468
free((unsigned char*) data_buf);
1581
my_free((uchar*) data_buf, MYF(0));
1470
1583
Log_event_type get_type_code() { return QUERY_EVENT; }
1584
#ifndef MYSQL_CLIENT
1471
1585
bool write(IO_CACHE* file);
1472
virtual bool write_post_header_for_derived(IO_CACHE* file __attribute__((unused)))
1586
virtual bool write_post_header_for_derived(IO_CACHE* file) { return FALSE; }
1474
1588
bool is_valid() const { return query != 0; }
1543
1660
class Slave_log_event: public Log_event
1546
1663
char* mem_pool;
1547
void init_from_mem_pool();
1664
void init_from_mem_pool(int data_size);
1550
std::string master_host;
1551
std::string master_log;
1552
uint16_t master_port;
1666
my_off_t master_pos;
1669
int master_host_len;
1673
#ifndef MYSQL_CLIENT
1554
1674
Slave_log_event(THD* thd_arg, Relay_log_info* rli);
1555
1675
void pack_info(Protocol* protocol);
1677
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
1557
Slave_log_event(const char* buf, uint32_t event_len);
1680
Slave_log_event(const char* buf, uint event_len);
1558
1681
~Slave_log_event();
1559
1682
int get_data_size();
1560
bool is_valid() const { return master_host.length() != 0; }
1683
bool is_valid() const { return master_host != 0; }
1561
1684
Log_event_type get_type_code() { return SLAVE_EVENT; }
1685
#ifndef MYSQL_CLIENT
1562
1686
bool write(IO_CACHE* file);
1690
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
1565
1691
virtual int do_apply_event(Relay_log_info const* rli);
1695
#endif /* HAVE_REPLICATION */
1570
1699
@class Load_log_event
1965
2116
LOG_EVENT_HEADER_LEN), except FORMAT_DESCRIPTION_EVENT and ROTATE_EVENT
1966
2117
(those have a header of size LOG_EVENT_MINIMAL_HEADER_LEN).
1968
uint8_t common_header_len;
1969
uint8_t number_of_event_types;
2119
uint8 common_header_len;
2120
uint8 number_of_event_types;
1970
2121
/* 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;
2122
uint8 *post_header_len;
2123
uchar server_version_split[3];
2124
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,
2126
Format_description_log_event(uint8 binlog_ver, const char* server_ver=0);
2127
Format_description_log_event(const char* buf, uint event_len,
1977
2128
const Format_description_log_event
1978
2129
*description_event);
1979
2130
~Format_description_log_event()
1981
free((unsigned char*)post_header_len);
2132
my_free((uchar*)post_header_len, MYF(MY_ALLOW_ZERO_PTR));
1983
2134
Log_event_type get_type_code() { return FORMAT_DESCRIPTION_EVENT;}
2135
#ifndef MYSQL_CLIENT
1984
2136
bool write(IO_CACHE* file);
1985
2138
bool is_valid() const
1987
2140
return ((common_header_len >= ((binlog_version==1) ? OLD_HEADER_LEN :
2112
2277
class Rand_log_event: public Log_event
2118
Rand_log_event(THD* thd_arg, uint64_t seed1_arg, uint64_t seed2_arg)
2283
#ifndef MYSQL_CLIENT
2284
Rand_log_event(THD* thd_arg, ulonglong seed1_arg, ulonglong seed2_arg)
2119
2285
:Log_event(thd_arg,0,0),seed1(seed1_arg),seed2(seed2_arg)
2287
#ifdef HAVE_REPLICATION
2121
2288
void pack_info(Protocol* protocol);
2289
#endif /* HAVE_REPLICATION */
2291
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2123
2294
Rand_log_event(const char* buf,
2124
2295
const Format_description_log_event *description_event);
2125
2296
~Rand_log_event() {}
2126
2297
Log_event_type get_type_code() { return RAND_EVENT;}
2127
int get_data_size() { return 16; /* sizeof(uint64_t) * 2*/ }
2298
int get_data_size() { return 16; /* sizeof(ulonglong) * 2*/ }
2299
#ifndef MYSQL_CLIENT
2128
2300
bool write(IO_CACHE* file);
2129
2302
bool is_valid() const { return 1; }
2305
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2132
2306
virtual int do_apply_event(Relay_log_info const *rli);
2133
2307
virtual int do_update_pos(Relay_log_info *rli);
2134
2308
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2143
2318
@section Xid_log_event_binary_format Binary Format
2321
typedef ulonglong my_xid; // this line is the same as in handler.h
2145
2324
class Xid_log_event: public Log_event
2329
#ifndef MYSQL_CLIENT
2150
2330
Xid_log_event(THD* thd_arg, my_xid x): Log_event(thd_arg,0,0), xid(x) {}
2331
#ifdef HAVE_REPLICATION
2151
2332
void pack_info(Protocol* protocol);
2333
#endif /* HAVE_REPLICATION */
2335
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2153
2338
Xid_log_event(const char* buf,
2154
2339
const Format_description_log_event *description_event);
2155
2340
~Xid_log_event() {}
2156
2341
Log_event_type get_type_code() { return XID_EVENT;}
2157
2342
int get_data_size() { return sizeof(xid); }
2343
#ifndef MYSQL_CLIENT
2158
2344
bool write(IO_CACHE* file);
2159
2346
bool is_valid() const { return 1; }
2349
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2162
2350
virtual int do_apply_event(Relay_log_info const *rli);
2163
2351
enum_skip_reason do_shall_skip(Relay_log_info *rli);
2182
2371
Item_result type;
2183
uint32_t charset_number;
2372
uint charset_number;
2185
User_var_log_event(THD* thd_arg __attribute__((unused)),
2186
char *name_arg, uint32_t name_len_arg,
2374
#ifndef MYSQL_CLIENT
2375
User_var_log_event(THD* thd_arg, char *name_arg, uint name_len_arg,
2187
2376
char *val_arg, ulong val_len_arg, Item_result type_arg,
2188
uint32_t charset_number_arg)
2377
uint charset_number_arg)
2189
2378
:Log_event(), name(name_arg), name_len(name_len_arg), val(val_arg),
2190
2379
val_len(val_len_arg), type(type_arg), charset_number(charset_number_arg)
2191
2380
{ is_null= !val; }
2192
2381
void pack_info(Protocol* protocol);
2383
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2194
2386
User_var_log_event(const char* buf,
2195
2387
const Format_description_log_event *description_event);
2196
2388
~User_var_log_event() {}
2197
2389
Log_event_type get_type_code() { return USER_VAR_EVENT;}
2390
#ifndef MYSQL_CLIENT
2198
2391
bool write(IO_CACHE* file);
2199
2393
bool is_valid() const { return 1; }
2396
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2202
2397
virtual int do_apply_event(Relay_log_info const *rli);
2203
2398
virtual int do_update_pos(Relay_log_info *rli);
2204
2399
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2298
2500
DUP_NAME= 2 // if constructor should dup the string argument
2300
2502
const char* new_log_ident;
2506
#ifndef MYSQL_CLIENT
2304
2507
Rotate_log_event(const char* new_log_ident_arg,
2305
uint32_t ident_len_arg,
2306
uint64_t pos_arg, uint32_t flags);
2509
ulonglong pos_arg, uint flags);
2510
#ifdef HAVE_REPLICATION
2307
2511
void pack_info(Protocol* protocol);
2512
#endif /* HAVE_REPLICATION */
2514
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2309
Rotate_log_event(const char* buf, uint32_t event_len,
2517
Rotate_log_event(const char* buf, uint event_len,
2310
2518
const Format_description_log_event* description_event);
2311
2519
~Rotate_log_event()
2313
2521
if (flags & DUP_NAME)
2314
free((unsigned char*) new_log_ident);
2522
my_free((uchar*) new_log_ident, MYF(MY_ALLOW_ZERO_PTR));
2316
2524
Log_event_type get_type_code() { return ROTATE_EVENT;}
2317
2525
int get_data_size() { return ident_len + ROTATE_HEADER_LEN;}
2318
2526
bool is_valid() const { return new_log_ident != 0; }
2527
#ifndef MYSQL_CLIENT
2319
2528
bool write(IO_CACHE* file);
2532
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2322
2533
virtual int do_update_pos(Relay_log_info *rli);
2323
2534
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2343
2555
bool fake_base;
2345
unsigned char* block;
2346
2558
const char *event_buf;
2349
2561
bool inited_from_old;
2563
#ifndef MYSQL_CLIENT
2351
2564
Create_file_log_event(THD* thd, sql_exchange* ex, const char* db_arg,
2352
2565
const char* table_name_arg,
2353
2566
List<Item>& fields_arg,
2354
2567
enum enum_duplicates handle_dup, bool ignore,
2355
unsigned char* block_arg, uint32_t block_len_arg,
2568
uchar* block_arg, uint block_len_arg,
2356
2569
bool using_trans);
2570
#ifdef HAVE_REPLICATION
2357
2571
void pack_info(Protocol* protocol);
2572
#endif /* HAVE_REPLICATION */
2574
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2575
void print(FILE* file, PRINT_EVENT_INFO* print_event_info,
2359
Create_file_log_event(const char* buf, uint32_t event_len,
2579
Create_file_log_event(const char* buf, uint event_len,
2360
2580
const Format_description_log_event* description_event);
2361
2581
~Create_file_log_event()
2363
free((char*) event_buf);
2583
my_free((char*) event_buf, MYF(MY_ALLOW_ZERO_PTR));
2366
2586
Log_event_type get_type_code()
2413
2637
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);
2639
#ifndef MYSQL_CLIENT
2640
Append_block_log_event(THD* thd, const char* db_arg, uchar* block_arg,
2641
uint block_len_arg, bool using_trans);
2642
#ifdef HAVE_REPLICATION
2417
2643
void pack_info(Protocol* protocol);
2418
2644
virtual int get_create_or_append() const;
2645
#endif /* HAVE_REPLICATION */
2647
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2420
Append_block_log_event(const char* buf, uint32_t event_len,
2650
Append_block_log_event(const char* buf, uint event_len,
2421
2651
const Format_description_log_event
2422
2652
*description_event);
2423
2653
~Append_block_log_event() {}
2424
2654
Log_event_type get_type_code() { return APPEND_BLOCK_EVENT;}
2425
2655
int get_data_size() { return block_len + APPEND_BLOCK_HEADER_LEN ;}
2426
2656
bool is_valid() const { return block != 0; }
2657
#ifndef MYSQL_CLIENT
2427
2658
bool write(IO_CACHE* file);
2428
2659
const char* get_db() { return db; }
2663
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2431
2664
virtual int do_apply_event(Relay_log_info const *rli);
2441
2675
class Delete_file_log_event: public Log_event
2445
2679
const char* db; /* see comment in Append_block_log_event */
2681
#ifndef MYSQL_CLIENT
2447
2682
Delete_file_log_event(THD* thd, const char* db_arg, bool using_trans);
2683
#ifdef HAVE_REPLICATION
2448
2684
void pack_info(Protocol* protocol);
2685
#endif /* HAVE_REPLICATION */
2687
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2688
void print(FILE* file, PRINT_EVENT_INFO* print_event_info,
2450
Delete_file_log_event(const char* buf, uint32_t event_len,
2692
Delete_file_log_event(const char* buf, uint event_len,
2451
2693
const Format_description_log_event* description_event);
2452
2694
~Delete_file_log_event() {}
2453
2695
Log_event_type get_type_code() { return DELETE_FILE_EVENT;}
2454
2696
int get_data_size() { return DELETE_FILE_HEADER_LEN ;}
2455
2697
bool is_valid() const { return file_id != 0; }
2698
#ifndef MYSQL_CLIENT
2456
2699
bool write(IO_CACHE* file);
2457
2700
const char* get_db() { return db; }
2704
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2460
2705
virtual int do_apply_event(Relay_log_info const *rli);
2470
2716
class Execute_load_log_event: public Log_event
2474
2720
const char* db; /* see comment in Append_block_log_event */
2722
#ifndef MYSQL_CLIENT
2476
2723
Execute_load_log_event(THD* thd, const char* db_arg, bool using_trans);
2724
#ifdef HAVE_REPLICATION
2477
2725
void pack_info(Protocol* protocol);
2726
#endif /* HAVE_REPLICATION */
2728
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2479
Execute_load_log_event(const char* buf, uint32_t event_len,
2731
Execute_load_log_event(const char* buf, uint event_len,
2480
2732
const Format_description_log_event
2481
2733
*description_event);
2482
2734
~Execute_load_log_event() {}
2483
2735
Log_event_type get_type_code() { return EXEC_LOAD_EVENT;}
2484
2736
int get_data_size() { return EXEC_LOAD_HEADER_LEN ;}
2485
2737
bool is_valid() const { return file_id != 0; }
2738
#ifndef MYSQL_CLIENT
2486
2739
bool write(IO_CACHE* file);
2487
2740
const char* get_db() { return db; }
2744
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2490
2745
virtual int do_apply_event(Relay_log_info const *rli);
2503
2759
class Begin_load_query_log_event: public Append_block_log_event
2762
#ifndef MYSQL_CLIENT
2506
2763
Begin_load_query_log_event(THD* thd_arg, const char *db_arg,
2507
unsigned char* block_arg, uint32_t block_len_arg,
2764
uchar* block_arg, uint block_len_arg,
2508
2765
bool using_trans);
2766
#ifdef HAVE_REPLICATION
2509
2767
Begin_load_query_log_event(THD* thd);
2510
2768
int get_create_or_append() const;
2511
Begin_load_query_log_event(const char* buf, uint32_t event_len,
2769
#endif /* HAVE_REPLICATION */
2771
Begin_load_query_log_event(const char* buf, uint event_len,
2512
2772
const Format_description_log_event
2513
2773
*description_event);
2514
2774
~Begin_load_query_log_event() {}
2515
2775
Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; }
2777
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2517
2778
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2549
2811
enum_load_dup_handling dup_handling;
2813
#ifndef MYSQL_CLIENT
2551
2814
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,
2815
ulong query_length, uint fn_pos_start_arg,
2816
uint fn_pos_end_arg,
2554
2817
enum_load_dup_handling dup_handling_arg,
2555
2818
bool using_trans, bool suppress_use,
2556
2819
THD::killed_state
2557
2820
killed_err_arg= THD::KILLED_NO_VALUE);
2821
#ifdef HAVE_REPLICATION
2558
2822
void pack_info(Protocol* protocol);
2559
Execute_load_query_log_event(const char* buf, uint32_t event_len,
2823
#endif /* HAVE_REPLICATION */
2825
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2826
/* Prints the query as LOAD DATA LOCAL and with rewritten filename */
2827
void print(FILE* file, PRINT_EVENT_INFO* print_event_info,
2828
const char *local_fname);
2830
Execute_load_query_log_event(const char* buf, uint event_len,
2560
2831
const Format_description_log_event
2561
2832
*description_event);
2562
2833
~Execute_load_query_log_event() {}
2565
2836
bool is_valid() const { return Query_log_event::is_valid() && file_id != 0; }
2567
2838
ulong get_post_header_size_for_derived();
2839
#ifndef MYSQL_CLIENT
2568
2840
bool write_post_header_for_derived(IO_CACHE* file);
2844
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2571
2845
virtual int do_apply_event(Relay_log_info const *rli);
2575
char *str_to_hex(char *to, const char *from, uint32_t len);
2852
@class Unknown_log_event
2854
@section Unknown_log_event_binary_format Binary Format
2856
class Unknown_log_event: public Log_event
2860
Even if this is an unknown event, we still pass description_event to
2861
Log_event's ctor, this way we can extract maximum information from the
2862
event's header (the unique ID for example).
2864
Unknown_log_event(const char* buf,
2865
const Format_description_log_event *description_event):
2866
Log_event(buf, description_event)
2868
~Unknown_log_event() {}
2869
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2870
Log_event_type get_type_code() { return UNKNOWN_EVENT;}
2871
bool is_valid() const { return 1; }
2874
char *str_to_hex(char *to, const char *from, uint len);
2578
2877
@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>
3003
<td>MYSQL_TYPE_DECIMAL</td><td>0</td>
3005
<td>No column metadata.</td>
3009
<td>MYSQL_TYPE_TINY</td><td>1</td>
3011
<td>No column metadata.</td>
3015
<td>MYSQL_TYPE_SHORT</td><td>2</td>
3017
<td>No column metadata.</td>
3021
<td>MYSQL_TYPE_LONG</td><td>3</td>
3023
<td>No column metadata.</td>
3027
<td>MYSQL_TYPE_FLOAT</td><td>4</td>
3029
<td>1 byte unsigned integer, representing the "pack_length", which
3030
is equal to sizeof(float) on the server from which the event
3035
<td>MYSQL_TYPE_DOUBLE</td><td>5</td>
2723
3036
<td>1 byte</td>
2724
3037
<td>1 byte unsigned integer, representing the "pack_length", which
2725
3038
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>
3043
<td>MYSQL_TYPE_NULL</td><td>6</td>
3045
<td>No column metadata.</td>
3049
<td>MYSQL_TYPE_TIMESTAMP</td><td>7</td>
3051
<td>No column metadata.</td>
3055
<td>MYSQL_TYPE_LONGLONG</td><td>8</td>
3057
<td>No column metadata.</td>
3061
<td>MYSQL_TYPE_INT24</td><td>9</td>
3063
<td>No column metadata.</td>
3067
<td>MYSQL_TYPE_DATE</td><td>10</td>
3069
<td>No column metadata.</td>
3073
<td>MYSQL_TYPE_TIME</td><td>11</td>
3075
<td>No column metadata.</td>
3079
<td>MYSQL_TYPE_DATETIME</td><td>12</td>
3081
<td>No column metadata.</td>
3085
<td>MYSQL_TYPE_YEAR</td><td>13</td>
3087
<td>No column metadata.</td>
3091
<td><i>MYSQL_TYPE_NEWDATE</i></td><td><i>14</i></td>
2773
3092
<td>–</td>
2774
3093
<td><i>This enumeration value is only used internally and cannot
2775
3094
exist in a binlog.</i></td>
2779
<td>DRIZZLE_TYPE_VARCHAR</td><td>15</td>
3098
<td>MYSQL_TYPE_VARCHAR</td><td>15</td>
2780
3099
<td>2 bytes</td>
2781
3100
<td>2 byte unsigned integer representing the maximum length of
2782
3101
the string.</td>
2786
<td>DRIZZLE_TYPE_NEWDECIMAL</td><td>246</td>
3105
<td>MYSQL_TYPE_BIT</td><td>16</td>
3107
<td>A 1 byte unsigned int representing the length in bits of the
3108
bitfield (0 to 64), followed by a 1 byte unsigned int
3109
representing the number of bytes occupied by the bitfield. The
3110
number of bytes is either int((length+7)/8) or int(length/8).</td>
3114
<td>MYSQL_TYPE_NEWDECIMAL</td><td>246</td>
2787
3115
<td>2 bytes</td>
2788
3116
<td>A 1 byte unsigned int representing the precision, followed
2789
3117
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>
3121
<td><i>MYSQL_TYPE_ENUM</i></td><td><i>247</i></td>
3123
<td><i>This enumeration value is only used internally and cannot
3124
exist in a binlog.</i></td>
3128
<td><i>MYSQL_TYPE_SET</i></td><td><i>248</i></td>
3130
<td><i>This enumeration value is only used internally and cannot
3131
exist in a binlog.</i></td>
3135
<td>MYSQL_TYPE_TINY_BLOB</td><td>249</td>
3137
<td><i>This enumeration value is only used internally and cannot
3138
exist in a binlog.</i></td>
3142
<td><i>MYSQL_TYPE_MEDIUM_BLOB</i></td><td><i>250</i></td>
3144
<td><i>This enumeration value is only used internally and cannot
3145
exist in a binlog.</i></td>
3149
<td><i>MYSQL_TYPE_LONG_BLOB</i></td><td><i>251</i></td>
3151
<td><i>This enumeration value is only used internally and cannot
3152
exist in a binlog.</i></td>
3156
<td>MYSQL_TYPE_BLOB</td><td>252</td>
2808
3157
<td>1 byte</td>
2809
3158
<td>The pack length, i.e., the number of bytes needed to represent
2810
3159
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).
3163
<td>MYSQL_TYPE_VAR_STRING</td><td>253</td>
3165
<td>This is used to store both strings and enumeration values.
3166
The first byte is a enumeration value storing the <i>real
3167
type</i>, which may be either MYSQL_TYPE_VAR_STRING or
3168
MYSQL_TYPE_ENUM. The second byte is a 1 byte unsigned integer
3169
representing the field size, i.e., the number of bytes needed to
3170
store the length of the string.</td>
3174
<td>MYSQL_TYPE_STRING</td><td>254</td>
3176
<td>The first byte is always MYSQL_TYPE_VAR_STRING (i.e., 253).
2817
3177
The second byte is the field size, i.e., the number of bytes in
2818
3178
the representation of size of the string: 3 or 4.</td>
3182
<td>MYSQL_TYPE_GEOMETRY</td><td>255</td>
3184
<td>The pack length, i.e., the number of bytes needed to represent
3185
the length of the geometry: 1, 2, 3, or 4.</td>
2823
3190
class Table_map_log_event : public Log_event
2876
3247
virtual bool is_valid() const { return m_memory != NULL; /* we check malloc */ }
2878
3249
virtual int get_data_size() { return m_data_size; }
3250
#ifndef MYSQL_CLIENT
2879
3251
virtual int save_field_metadata();
2880
3252
virtual bool write_data_header(IO_CACHE *file);
2881
3253
virtual bool write_data_body(IO_CACHE *file);
2882
3254
virtual const char *get_db() { return m_dbnam; }
3257
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2883
3258
virtual void pack_info(Protocol *protocol);
3262
virtual void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3267
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2886
3268
virtual int do_apply_event(Relay_log_info const *rli);
2887
3269
virtual int do_update_pos(Relay_log_info *rli);
2888
3270
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
3273
#ifndef MYSQL_CLIENT
2891
3276
char const *m_dbnam;
2892
3277
size_t m_dblen;
2893
3278
char const *m_tblnam;
2894
3279
size_t m_tbllen;
2895
3280
ulong m_colcnt;
2896
unsigned char *m_coltype;
2898
unsigned char *m_memory;
2899
3284
ulong m_table_id;
2900
3285
flag_set m_flags;
2902
3287
size_t m_data_size;
2904
unsigned char *m_field_metadata; // buffer for field metadata
3289
uchar *m_field_metadata; // buffer for field metadata
2906
3291
The size of field metadata buffer set by calling save_field_metadata()
2908
3293
ulong m_field_metadata_size;
2909
unsigned char *m_null_bits;
2910
unsigned char *m_meta_memory;
3295
uchar *m_meta_memory;
3009
3405
return m_rows_buf && m_cols.bitmap;
3012
uint32_t m_row_count; /* The number of rows added to the event */
3408
uint m_row_count; /* The number of rows added to the event */
3016
3412
The constructors are protected since you're supposed to inherit
3017
3413
this class, not create instances of this class.
3019
Rows_log_event(THD*, Table*, ulong table_id,
3415
#ifndef MYSQL_CLIENT
3416
Rows_log_event(THD*, TABLE*, ulong table_id,
3020
3417
MY_BITMAP const *cols, bool is_transactional);
3021
Rows_log_event(const char *row_data, uint32_t event_len,
3419
Rows_log_event(const char *row_data, uint event_len,
3022
3420
Log_event_type event_type,
3023
3421
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 */
3424
void print_helper(FILE *, PRINT_EVENT_INFO *, char const *const name);
3427
#ifndef MYSQL_CLIENT
3428
virtual int do_add_row_data(uchar *data, size_t length);
3431
#ifndef MYSQL_CLIENT
3432
TABLE *m_table; /* The table the rows belong to */
3028
3434
ulong m_table_id; /* Table ID */
3029
3435
MY_BITMAP m_cols; /* Bitmap denoting columns available */
3030
3436
ulong m_width; /* The width of the columns bitmap */
3040
3446
ulong m_master_reclength; /* Length of record on master side */
3042
3448
/* 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)];
3449
uint32 m_bitbuf[128/(sizeof(uint32)*8)];
3450
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 */
3452
uchar *m_rows_buf; /* The rows in packed format */
3453
uchar *m_rows_cur; /* One-after the end of the data */
3454
uchar *m_rows_end; /* One-after the end of the allocated space */
3050
3456
flag_set m_flags; /* Flags for row-level events */
3052
3458
/* 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 */
3460
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3461
const uchar *m_curr_row; /* Start of the row being processed */
3462
const uchar *m_curr_row_end; /* One-after the end of the current row */
3463
uchar *m_key; /* Buffer to keep key value during searches */
3058
3465
int find_row(const Relay_log_info *const);
3059
3466
int write_row(const Relay_log_info *const, const bool);
3150
3560
TYPE_CODE = WRITE_ROWS_EVENT
3153
Write_rows_log_event(THD*, Table*, ulong table_id,
3563
#if !defined(MYSQL_CLIENT)
3564
Write_rows_log_event(THD*, TABLE*, ulong table_id,
3154
3565
bool is_transactional);
3155
Write_rows_log_event(const char *buf, uint32_t event_len,
3567
#ifdef HAVE_REPLICATION
3568
Write_rows_log_event(const char *buf, uint event_len,
3156
3569
const Format_description_log_event *description_event);
3157
static bool binlog_row_logging_function(THD *thd, Table *table,
3571
#if !defined(MYSQL_CLIENT)
3572
static bool binlog_row_logging_function(THD *thd, TABLE *table,
3158
3573
bool is_transactional,
3159
const unsigned char *before_record
3574
const uchar *before_record
3160
3575
__attribute__((unused)),
3161
const unsigned char *after_record)
3576
const uchar *after_record)
3163
3578
return thd->binlog_write_row(table, is_transactional, after_record);
3167
3583
virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; }
3586
void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3589
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3169
3590
virtual int do_before_row_operations(const Slave_reporting_capability *const);
3170
3591
virtual int do_after_row_operations(const Slave_reporting_capability *const,int);
3171
3592
virtual int do_exec_row(const Relay_log_info *const);
3193
3615
TYPE_CODE = UPDATE_ROWS_EVENT
3196
Update_rows_log_event(THD*, Table*, ulong table_id,
3618
#ifndef MYSQL_CLIENT
3619
Update_rows_log_event(THD*, TABLE*, ulong table_id,
3197
3620
bool is_transactional);
3199
3622
void init(MY_BITMAP const *cols);
3201
3625
virtual ~Update_rows_log_event();
3203
Update_rows_log_event(const char *buf, uint32_t event_len,
3627
#ifdef HAVE_REPLICATION
3628
Update_rows_log_event(const char *buf, uint event_len,
3204
3629
const Format_description_log_event *description_event);
3206
static bool binlog_row_logging_function(THD *thd, Table *table,
3632
#if !defined(MYSQL_CLIENT)
3633
static bool binlog_row_logging_function(THD *thd, TABLE *table,
3207
3634
bool is_transactional,
3208
const unsigned char *before_record,
3209
const unsigned char *after_record)
3635
const uchar *before_record,
3636
const uchar *after_record)
3211
3638
return thd->binlog_update_row(table, is_transactional,
3212
3639
before_record, after_record);
3215
3643
virtual bool is_valid() const
3254
3688
TYPE_CODE = DELETE_ROWS_EVENT
3257
Delete_rows_log_event(THD*, Table*, ulong,
3691
#ifndef MYSQL_CLIENT
3692
Delete_rows_log_event(THD*, TABLE*, ulong,
3258
3693
bool is_transactional);
3259
Delete_rows_log_event(const char *buf, uint32_t event_len,
3695
#ifdef HAVE_REPLICATION
3696
Delete_rows_log_event(const char *buf, uint event_len,
3260
3697
const Format_description_log_event *description_event);
3261
static bool binlog_row_logging_function(THD *thd, Table *table,
3699
#if !defined(MYSQL_CLIENT)
3700
static bool binlog_row_logging_function(THD *thd, TABLE *table,
3262
3701
bool is_transactional,
3263
const unsigned char *before_record,
3264
const unsigned char *after_record
3702
const uchar *before_record,
3703
const uchar *after_record
3265
3704
__attribute__((unused)))
3267
3706
return thd->binlog_delete_row(table, is_transactional, before_record);
3271
3711
virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; }
3714
void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3717
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3273
3718
virtual int do_before_row_operations(const Slave_reporting_capability *const);
3274
3719
virtual int do_after_row_operations(const Slave_reporting_capability *const,int);
3275
3720
virtual int do_exec_row(const Relay_log_info *const);
3315
3761
class Incident_log_event : public Log_event {
3763
#ifndef MYSQL_CLIENT
3317
3764
Incident_log_event(THD *thd_arg, Incident incident)
3318
: Log_event(thd_arg, 0, false), m_incident(incident)
3765
: Log_event(thd_arg, 0, FALSE), m_incident(incident)
3767
DBUG_ENTER("Incident_log_event::Incident_log_event");
3768
DBUG_PRINT("enter", ("m_incident: %d", m_incident));
3320
3769
m_message.str= NULL; /* Just as a precaution */
3321
3770
m_message.length= 0;
3325
3774
Incident_log_event(THD *thd_arg, Incident incident, LEX_STRING const msg)
3326
: Log_event(thd_arg, 0, false), m_incident(incident)
3775
: Log_event(thd_arg, 0, FALSE), m_incident(incident)
3777
DBUG_ENTER("Incident_log_event::Incident_log_event");
3778
DBUG_PRINT("enter", ("m_incident: %d", m_incident));
3328
3779
m_message= msg;
3784
#ifndef MYSQL_CLIENT
3332
3785
void pack_info(Protocol*);
3334
Incident_log_event(const char *buf, uint32_t event_len,
3788
Incident_log_event(const char *buf, uint event_len,
3335
3789
const Format_description_log_event *descr_event);
3337
3791
virtual ~Incident_log_event();
3794
virtual void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3797
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3339
3798
virtual int do_apply_event(Relay_log_info const *rli);
3341
3801
virtual bool write_data_header(IO_CACHE *file);
3342
3802
virtual bool write_data_body(IO_CACHE *file);