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
551
class DRIZZLE_BIN_LOG;
554
554
class Format_description_log_event;
555
555
class Relay_log_info;
558
enum enum_base64_output_mode {
559
BASE64_OUTPUT_NEVER= 0,
560
BASE64_OUTPUT_AUTO= 1,
561
BASE64_OUTPUT_ALWAYS= 2,
562
BASE64_OUTPUT_UNSPEC= 3,
563
/* insert new output modes here */
564
BASE64_OUTPUT_MODE_COUNT
568
A structure for mysqlbinlog to know how to print events
570
This structure is passed to the event's print() methods,
572
There are two types of settings stored here:
573
1. Last db, flags2, sql_mode etc comes from the last printed event.
574
They are stored so that only the necessary USE and SET commands
576
2. Other information on how to print the events, e.g. short_form,
577
hexdump_from. These are not dependent on the last event.
579
typedef struct st_print_event_info
582
Settings for database, sql_mode etc that comes from the last event
583
that was printed. We cache these so that we don't have to print
584
them if they are unchanged.
586
// TODO: have the last catalog here ??
587
char db[FN_REFLEN+1]; // TODO: make this a LEX_STRING when thd->db is
590
bool sql_mode_inited;
591
ulong sql_mode; /* must be same as THD.variables.sql_mode */
592
ulong auto_increment_increment, auto_increment_offset;
594
char charset[6]; // 3 variables, each of them storable in 2 bytes
595
char time_zone_str[MAX_TIME_ZONE_NAME_LENGTH];
596
uint lc_time_names_number;
597
uint charset_database_number;
599
bool thread_id_printed;
601
st_print_event_info();
603
~st_print_event_info() {
604
close_cached_file(&head_cache);
605
close_cached_file(&body_cache);
607
bool init_ok() /* tells if construction was successful */
608
{ return my_b_inited(&head_cache) && my_b_inited(&body_cache); }
611
/* Settings on how to print the events */
613
enum_base64_output_mode base64_output_mode;
615
This is set whenever a Format_description_event is printed.
616
Later, when an event is printed in base64, this flag is tested: if
617
no Format_description_event has been seen, it is unsafe to print
618
the base64 event, so an error message is generated.
620
bool printed_fd_event;
621
my_off_t hexdump_from;
622
uint8 common_header_len;
626
These two caches are used by the row-based replication events to
627
collect the header information and the main body of the events
628
making up a statement.
558
636
the struct aggregates two paramenters that identify an event
559
637
uniquely in scope of communication of a particular master and slave couple.
824
904
virtual void pack_info(Protocol *protocol);
906
#endif /* HAVE_REPLICATION */
826
907
virtual const char* get_db()
828
909
return thd ? thd->db : 0;
912
Log_event() : temp_buf(0) {}
913
/* avoid having to link mysqlbinlog against libpthread */
914
static Log_event* read_log_event(IO_CACHE* file,
915
const Format_description_log_event
917
/* print*() functions are used by mysqlbinlog */
918
virtual void print(FILE* file, PRINT_EVENT_INFO* print_event_info) = 0;
919
void print_timestamp(IO_CACHE* file, time_t *ts = 0);
920
void print_header(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info,
922
void print_base64(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info,
831
926
static void *operator new(size_t size)
836
931
static void operator delete(void *ptr,
837
size_t size __attribute__((unused)))
932
size_t size __attribute__((__unused__)))
839
free((unsigned char*) ptr);
934
my_free((uchar*) ptr, MYF(MY_WME|MY_ALLOW_ZERO_PTR));
842
937
/* Placement version of the above operators */
843
938
static void *operator new(size_t, void* ptr) { return ptr; }
844
939
static void operator delete(void*, void*) { }
846
942
bool write_header(IO_CACHE* file, ulong data_length);
847
943
virtual bool write(IO_CACHE* file)
1443
1542
bool sql_mode_inited;
1444
1543
bool charset_inited;
1447
1546
/* In connections sql_mode is 32 bits now but will be 64 bits soon */
1448
1547
ulong sql_mode;
1449
1548
ulong auto_increment_increment, auto_increment_offset;
1450
1549
char charset[6];
1451
uint32_t time_zone_len; /* 0 means uninited */
1550
uint time_zone_len; /* 0 means uninited */
1452
1551
const char *time_zone_str;
1453
uint32_t lc_time_names_number; /* 0 means en_US */
1454
uint32_t charset_database_number;
1552
uint lc_time_names_number; /* 0 means en_US */
1553
uint charset_database_number;
1555
#ifndef MYSQL_CLIENT
1457
1557
Query_log_event(THD* thd_arg, const char* query_arg, ulong query_length,
1458
1558
bool using_trans, bool suppress_use,
1459
1559
THD::killed_state killed_err_arg= THD::KILLED_NO_VALUE);
1460
1560
const char* get_db() { return db; }
1561
#ifdef HAVE_REPLICATION
1461
1562
void pack_info(Protocol* protocol);
1563
#endif /* HAVE_REPLICATION */
1565
void print_query_header(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info);
1566
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
1463
1569
Query_log_event();
1464
Query_log_event(const char* buf, uint32_t event_len,
1570
Query_log_event(const char* buf, uint event_len,
1465
1571
const Format_description_log_event *description_event,
1466
1572
Log_event_type event_type);
1467
1573
~Query_log_event()
1470
free((unsigned char*) data_buf);
1576
my_free((uchar*) data_buf, MYF(0));
1472
1578
Log_event_type get_type_code() { return QUERY_EVENT; }
1579
#ifndef MYSQL_CLIENT
1473
1580
bool write(IO_CACHE* file);
1474
virtual bool write_post_header_for_derived(IO_CACHE* file __attribute__((unused)))
1581
virtual bool write_post_header_for_derived(IO_CACHE* file __attribute__((__unused__)))
1475
1582
{ return false; }
1476
1584
bool is_valid() const { return query != 0; }
1552
1664
char* master_log;
1553
1665
int master_host_len;
1554
1666
int master_log_len;
1555
uint16_t master_port;
1669
#ifndef MYSQL_CLIENT
1557
1670
Slave_log_event(THD* thd_arg, Relay_log_info* rli);
1558
1671
void pack_info(Protocol* protocol);
1673
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
1560
Slave_log_event(const char* buf, uint32_t event_len);
1676
Slave_log_event(const char* buf, uint event_len);
1561
1677
~Slave_log_event();
1562
1678
int get_data_size();
1563
1679
bool is_valid() const { return master_host != 0; }
1564
1680
Log_event_type get_type_code() { return SLAVE_EVENT; }
1681
#ifndef MYSQL_CLIENT
1565
1682
bool write(IO_CACHE* file);
1686
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
1568
1687
virtual int do_apply_event(Relay_log_info const* rli);
1691
#endif /* HAVE_REPLICATION */
1573
1695
@class Load_log_event
1825
1948
void set_fields(const char* db, List<Item> &fields_arg,
1826
1949
Name_resolution_context *context);
1827
1950
const char* get_db() { return db; }
1951
#ifdef HAVE_REPLICATION
1828
1952
void pack_info(Protocol* protocol);
1953
#endif /* HAVE_REPLICATION */
1955
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
1956
void print(FILE* file, PRINT_EVENT_INFO* print_event_info, bool commented);
1831
1960
Note that for all the events related to LOAD DATA (Load_log_event,
1968
2112
LOG_EVENT_HEADER_LEN), except FORMAT_DESCRIPTION_EVENT and ROTATE_EVENT
1969
2113
(those have a header of size LOG_EVENT_MINIMAL_HEADER_LEN).
1971
uint8_t common_header_len;
1972
uint8_t number_of_event_types;
2115
uint8 common_header_len;
2116
uint8 number_of_event_types;
1973
2117
/* The list of post-headers' lengthes */
1974
uint8_t *post_header_len;
1975
unsigned char server_version_split[3];
1976
const uint8_t *event_type_permutation;
2118
uint8 *post_header_len;
2119
uchar server_version_split[3];
2120
const uint8 *event_type_permutation;
1978
Format_description_log_event(uint8_t binlog_ver, const char* server_ver=0);
1979
Format_description_log_event(const char* buf, uint32_t event_len,
2122
Format_description_log_event(uint8 binlog_ver, const char* server_ver=0);
2123
Format_description_log_event(const char* buf, uint event_len,
1980
2124
const Format_description_log_event
1981
2125
*description_event);
1982
2126
~Format_description_log_event()
1984
free((unsigned char*)post_header_len);
2128
my_free((uchar*)post_header_len, MYF(MY_ALLOW_ZERO_PTR));
1986
2130
Log_event_type get_type_code() { return FORMAT_DESCRIPTION_EVENT;}
2131
#ifndef MYSQL_CLIENT
1987
2132
bool write(IO_CACHE* file);
1988
2134
bool is_valid() const
1990
2136
return ((common_header_len >= ((binlog_version==1) ? OLD_HEADER_LEN :
2050
2198
class Intvar_log_event: public Log_event
2056
Intvar_log_event(THD* thd_arg,unsigned char type_arg, uint64_t val_arg)
2204
#ifndef MYSQL_CLIENT
2205
Intvar_log_event(THD* thd_arg,uchar type_arg, ulonglong val_arg)
2057
2206
:Log_event(thd_arg,0,0),val(val_arg),type(type_arg)
2208
#ifdef HAVE_REPLICATION
2059
2209
void pack_info(Protocol* protocol);
2210
#endif /* HAVE_REPLICATION */
2212
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2061
2215
Intvar_log_event(const char* buf,
2062
2216
const Format_description_log_event *description_event);
2115
2273
class Rand_log_event: public Log_event
2121
Rand_log_event(THD* thd_arg, uint64_t seed1_arg, uint64_t seed2_arg)
2279
#ifndef MYSQL_CLIENT
2280
Rand_log_event(THD* thd_arg, ulonglong seed1_arg, ulonglong seed2_arg)
2122
2281
:Log_event(thd_arg,0,0),seed1(seed1_arg),seed2(seed2_arg)
2283
#ifdef HAVE_REPLICATION
2124
2284
void pack_info(Protocol* protocol);
2285
#endif /* HAVE_REPLICATION */
2287
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2126
2290
Rand_log_event(const char* buf,
2127
2291
const Format_description_log_event *description_event);
2128
2292
~Rand_log_event() {}
2129
2293
Log_event_type get_type_code() { return RAND_EVENT;}
2130
int get_data_size() { return 16; /* sizeof(uint64_t) * 2*/ }
2294
int get_data_size() { return 16; /* sizeof(ulonglong) * 2*/ }
2295
#ifndef MYSQL_CLIENT
2131
2296
bool write(IO_CACHE* file);
2132
2298
bool is_valid() const { return 1; }
2301
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2135
2302
virtual int do_apply_event(Relay_log_info const *rli);
2136
2303
virtual int do_update_pos(Relay_log_info *rli);
2137
2304
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2146
2314
@section Xid_log_event_binary_format Binary Format
2317
typedef ulonglong my_xid; // this line is the same as in handler.h
2148
2320
class Xid_log_event: public Log_event
2325
#ifndef MYSQL_CLIENT
2153
2326
Xid_log_event(THD* thd_arg, my_xid x): Log_event(thd_arg,0,0), xid(x) {}
2327
#ifdef HAVE_REPLICATION
2154
2328
void pack_info(Protocol* protocol);
2329
#endif /* HAVE_REPLICATION */
2331
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2156
2334
Xid_log_event(const char* buf,
2157
2335
const Format_description_log_event *description_event);
2158
2336
~Xid_log_event() {}
2159
2337
Log_event_type get_type_code() { return XID_EVENT;}
2160
2338
int get_data_size() { return sizeof(xid); }
2339
#ifndef MYSQL_CLIENT
2161
2340
bool write(IO_CACHE* file);
2162
2342
bool is_valid() const { return 1; }
2345
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2165
2346
virtual int do_apply_event(Relay_log_info const *rli);
2166
2347
enum_skip_reason do_shall_skip(Relay_log_info *rli);
2185
2367
Item_result type;
2186
uint32_t charset_number;
2368
uint charset_number;
2188
User_var_log_event(THD* thd_arg __attribute__((unused)),
2189
char *name_arg, uint32_t name_len_arg,
2370
#ifndef MYSQL_CLIENT
2371
User_var_log_event(THD* thd_arg __attribute__((__unused__)),
2372
char *name_arg, uint name_len_arg,
2190
2373
char *val_arg, ulong val_len_arg, Item_result type_arg,
2191
uint32_t charset_number_arg)
2374
uint charset_number_arg)
2192
2375
:Log_event(), name(name_arg), name_len(name_len_arg), val(val_arg),
2193
2376
val_len(val_len_arg), type(type_arg), charset_number(charset_number_arg)
2194
2377
{ is_null= !val; }
2195
2378
void pack_info(Protocol* protocol);
2380
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2197
2383
User_var_log_event(const char* buf,
2198
2384
const Format_description_log_event *description_event);
2199
2385
~User_var_log_event() {}
2200
2386
Log_event_type get_type_code() { return USER_VAR_EVENT;}
2387
#ifndef MYSQL_CLIENT
2201
2388
bool write(IO_CACHE* file);
2202
2390
bool is_valid() const { return 1; }
2393
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2205
2394
virtual int do_apply_event(Relay_log_info const *rli);
2206
2395
virtual int do_update_pos(Relay_log_info *rli);
2207
2396
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2301
2497
DUP_NAME= 2 // if constructor should dup the string argument
2303
2499
const char* new_log_ident;
2503
#ifndef MYSQL_CLIENT
2307
2504
Rotate_log_event(const char* new_log_ident_arg,
2308
uint32_t ident_len_arg,
2309
uint64_t pos_arg, uint32_t flags);
2506
ulonglong pos_arg, uint flags);
2507
#ifdef HAVE_REPLICATION
2310
2508
void pack_info(Protocol* protocol);
2509
#endif /* HAVE_REPLICATION */
2511
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2312
Rotate_log_event(const char* buf, uint32_t event_len,
2514
Rotate_log_event(const char* buf, uint event_len,
2313
2515
const Format_description_log_event* description_event);
2314
2516
~Rotate_log_event()
2316
2518
if (flags & DUP_NAME)
2317
free((unsigned char*) new_log_ident);
2519
my_free((uchar*) new_log_ident, MYF(MY_ALLOW_ZERO_PTR));
2319
2521
Log_event_type get_type_code() { return ROTATE_EVENT;}
2320
2522
int get_data_size() { return ident_len + ROTATE_HEADER_LEN;}
2321
2523
bool is_valid() const { return new_log_ident != 0; }
2524
#ifndef MYSQL_CLIENT
2322
2525
bool write(IO_CACHE* file);
2529
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2325
2530
virtual int do_update_pos(Relay_log_info *rli);
2326
2531
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2346
2552
bool fake_base;
2348
unsigned char* block;
2349
2555
const char *event_buf;
2352
2558
bool inited_from_old;
2560
#ifndef MYSQL_CLIENT
2354
2561
Create_file_log_event(THD* thd, sql_exchange* ex, const char* db_arg,
2355
2562
const char* table_name_arg,
2356
2563
List<Item>& fields_arg,
2357
2564
enum enum_duplicates handle_dup, bool ignore,
2358
unsigned char* block_arg, uint32_t block_len_arg,
2565
uchar* block_arg, uint block_len_arg,
2359
2566
bool using_trans);
2567
#ifdef HAVE_REPLICATION
2360
2568
void pack_info(Protocol* protocol);
2569
#endif /* HAVE_REPLICATION */
2571
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2572
void print(FILE* file, PRINT_EVENT_INFO* print_event_info,
2362
Create_file_log_event(const char* buf, uint32_t event_len,
2576
Create_file_log_event(const char* buf, uint event_len,
2363
2577
const Format_description_log_event* description_event);
2364
2578
~Create_file_log_event()
2366
free((char*) event_buf);
2580
my_free((char*) event_buf, MYF(MY_ALLOW_ZERO_PTR));
2369
2583
Log_event_type get_type_code()
2416
2634
const char* db;
2418
Append_block_log_event(THD* thd, const char* db_arg, unsigned char* block_arg,
2419
uint32_t block_len_arg, bool using_trans);
2636
#ifndef MYSQL_CLIENT
2637
Append_block_log_event(THD* thd, const char* db_arg, uchar* block_arg,
2638
uint block_len_arg, bool using_trans);
2639
#ifdef HAVE_REPLICATION
2420
2640
void pack_info(Protocol* protocol);
2421
2641
virtual int get_create_or_append() const;
2642
#endif /* HAVE_REPLICATION */
2644
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2423
Append_block_log_event(const char* buf, uint32_t event_len,
2647
Append_block_log_event(const char* buf, uint event_len,
2424
2648
const Format_description_log_event
2425
2649
*description_event);
2426
2650
~Append_block_log_event() {}
2427
2651
Log_event_type get_type_code() { return APPEND_BLOCK_EVENT;}
2428
2652
int get_data_size() { return block_len + APPEND_BLOCK_HEADER_LEN ;}
2429
2653
bool is_valid() const { return block != 0; }
2654
#ifndef MYSQL_CLIENT
2430
2655
bool write(IO_CACHE* file);
2431
2656
const char* get_db() { return db; }
2660
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2434
2661
virtual int do_apply_event(Relay_log_info const *rli);
2444
2672
class Delete_file_log_event: public Log_event
2448
2676
const char* db; /* see comment in Append_block_log_event */
2678
#ifndef MYSQL_CLIENT
2450
2679
Delete_file_log_event(THD* thd, const char* db_arg, bool using_trans);
2680
#ifdef HAVE_REPLICATION
2451
2681
void pack_info(Protocol* protocol);
2682
#endif /* HAVE_REPLICATION */
2684
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2685
void print(FILE* file, PRINT_EVENT_INFO* print_event_info,
2453
Delete_file_log_event(const char* buf, uint32_t event_len,
2689
Delete_file_log_event(const char* buf, uint event_len,
2454
2690
const Format_description_log_event* description_event);
2455
2691
~Delete_file_log_event() {}
2456
2692
Log_event_type get_type_code() { return DELETE_FILE_EVENT;}
2457
2693
int get_data_size() { return DELETE_FILE_HEADER_LEN ;}
2458
2694
bool is_valid() const { return file_id != 0; }
2695
#ifndef MYSQL_CLIENT
2459
2696
bool write(IO_CACHE* file);
2460
2697
const char* get_db() { return db; }
2701
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2463
2702
virtual int do_apply_event(Relay_log_info const *rli);
2473
2713
class Execute_load_log_event: public Log_event
2477
2717
const char* db; /* see comment in Append_block_log_event */
2719
#ifndef MYSQL_CLIENT
2479
2720
Execute_load_log_event(THD* thd, const char* db_arg, bool using_trans);
2721
#ifdef HAVE_REPLICATION
2480
2722
void pack_info(Protocol* protocol);
2723
#endif /* HAVE_REPLICATION */
2725
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2482
Execute_load_log_event(const char* buf, uint32_t event_len,
2728
Execute_load_log_event(const char* buf, uint event_len,
2483
2729
const Format_description_log_event
2484
2730
*description_event);
2485
2731
~Execute_load_log_event() {}
2486
2732
Log_event_type get_type_code() { return EXEC_LOAD_EVENT;}
2487
2733
int get_data_size() { return EXEC_LOAD_HEADER_LEN ;}
2488
2734
bool is_valid() const { return file_id != 0; }
2735
#ifndef MYSQL_CLIENT
2489
2736
bool write(IO_CACHE* file);
2490
2737
const char* get_db() { return db; }
2741
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2493
2742
virtual int do_apply_event(Relay_log_info const *rli);
2506
2756
class Begin_load_query_log_event: public Append_block_log_event
2759
#ifndef MYSQL_CLIENT
2509
2760
Begin_load_query_log_event(THD* thd_arg, const char *db_arg,
2510
unsigned char* block_arg, uint32_t block_len_arg,
2761
uchar* block_arg, uint block_len_arg,
2511
2762
bool using_trans);
2763
#ifdef HAVE_REPLICATION
2512
2764
Begin_load_query_log_event(THD* thd);
2513
2765
int get_create_or_append() const;
2514
Begin_load_query_log_event(const char* buf, uint32_t event_len,
2766
#endif /* HAVE_REPLICATION */
2768
Begin_load_query_log_event(const char* buf, uint event_len,
2515
2769
const Format_description_log_event
2516
2770
*description_event);
2517
2771
~Begin_load_query_log_event() {}
2518
2772
Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; }
2774
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2520
2775
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2539
2795
class Execute_load_query_log_event: public Query_log_event
2542
uint32_t file_id; // file_id of temporary file
2543
uint32_t fn_pos_start; // pointer to the part of the query that should
2798
uint file_id; // file_id of temporary file
2799
uint fn_pos_start; // pointer to the part of the query that should
2544
2800
// be substituted
2545
uint32_t fn_pos_end; // pointer to the end of this part of query
2801
uint fn_pos_end; // pointer to the end of this part of query
2547
2803
We have to store type of duplicate handling explicitly, because
2548
2804
for LOAD DATA it also depends on LOCAL option. And this part
2552
2808
enum_load_dup_handling dup_handling;
2810
#ifndef MYSQL_CLIENT
2554
2811
Execute_load_query_log_event(THD* thd, const char* query_arg,
2555
ulong query_length, uint32_t fn_pos_start_arg,
2556
uint32_t fn_pos_end_arg,
2812
ulong query_length, uint fn_pos_start_arg,
2813
uint fn_pos_end_arg,
2557
2814
enum_load_dup_handling dup_handling_arg,
2558
2815
bool using_trans, bool suppress_use,
2559
2816
THD::killed_state
2560
2817
killed_err_arg= THD::KILLED_NO_VALUE);
2818
#ifdef HAVE_REPLICATION
2561
2819
void pack_info(Protocol* protocol);
2562
Execute_load_query_log_event(const char* buf, uint32_t event_len,
2820
#endif /* HAVE_REPLICATION */
2822
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2823
/* Prints the query as LOAD DATA LOCAL and with rewritten filename */
2824
void print(FILE* file, PRINT_EVENT_INFO* print_event_info,
2825
const char *local_fname);
2827
Execute_load_query_log_event(const char* buf, uint event_len,
2563
2828
const Format_description_log_event
2564
2829
*description_event);
2565
2830
~Execute_load_query_log_event() {}
2568
2833
bool is_valid() const { return Query_log_event::is_valid() && file_id != 0; }
2570
2835
ulong get_post_header_size_for_derived();
2836
#ifndef MYSQL_CLIENT
2571
2837
bool write_post_header_for_derived(IO_CACHE* file);
2841
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2574
2842
virtual int do_apply_event(Relay_log_info const *rli);
2578
char *str_to_hex(char *to, const char *from, uint32_t len);
2849
@class Unknown_log_event
2851
@section Unknown_log_event_binary_format Binary Format
2853
class Unknown_log_event: public Log_event
2857
Even if this is an unknown event, we still pass description_event to
2858
Log_event's ctor, this way we can extract maximum information from the
2859
event's header (the unique ID for example).
2861
Unknown_log_event(const char* buf,
2862
const Format_description_log_event *description_event):
2863
Log_event(buf, description_event)
2865
~Unknown_log_event() {}
2866
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
2867
Log_event_type get_type_code() { return UNKNOWN_EVENT;}
2868
bool is_valid() const { return 1; }
2871
char *str_to_hex(char *to, const char *from, uint len);
2581
2874
@class Table_map_log_event
2707
<td>DRIZZLE_TYPE_TINY</td><td>1</td>
2709
<td>No column metadata.</td>
2713
<td>DRIZZLE_TYPE_SHORT</td><td>2</td>
2715
<td>No column metadata.</td>
2719
<td>DRIZZLE_TYPE_LONG</td><td>3</td>
2721
<td>No column metadata.</td>
2725
<td>DRIZZLE_TYPE_DOUBLE</td><td>5</td>
3000
<td>MYSQL_TYPE_TINY</td><td>1</td>
3002
<td>No column metadata.</td>
3006
<td>MYSQL_TYPE_SHORT</td><td>2</td>
3008
<td>No column metadata.</td>
3012
<td>MYSQL_TYPE_LONG</td><td>3</td>
3014
<td>No column metadata.</td>
3018
<td>MYSQL_TYPE_FLOAT</td><td>4</td>
3020
<td>1 byte unsigned integer, representing the "pack_length", which
3021
is equal to sizeof(float) on the server from which the event
3026
<td>MYSQL_TYPE_DOUBLE</td><td>5</td>
2726
3027
<td>1 byte</td>
2727
3028
<td>1 byte unsigned integer, representing the "pack_length", which
2728
3029
is equal to sizeof(double) on the server from which the event
2733
<td>DRIZZLE_TYPE_NULL</td><td>6</td>
2735
<td>No column metadata.</td>
2739
<td>DRIZZLE_TYPE_TIMESTAMP</td><td>7</td>
2741
<td>No column metadata.</td>
2745
<td>DRIZZLE_TYPE_LONGLONG</td><td>8</td>
2747
<td>No column metadata.</td>
2751
<td>DRIZZLE_TYPE_DATE</td><td>10</td>
2753
<td>No column metadata.</td>
2757
<td>DRIZZLE_TYPE_TIME</td><td>11</td>
2759
<td>No column metadata.</td>
2763
<td>DRIZZLE_TYPE_DATETIME</td><td>12</td>
2765
<td>No column metadata.</td>
2769
<td>DRIZZLE_TYPE_YEAR</td><td>13</td>
2771
<td>No column metadata.</td>
2775
<td><i>DRIZZLE_TYPE_NEWDATE</i></td><td><i>14</i></td>
3034
<td>MYSQL_TYPE_NULL</td><td>6</td>
3036
<td>No column metadata.</td>
3040
<td>MYSQL_TYPE_TIMESTAMP</td><td>7</td>
3042
<td>No column metadata.</td>
3046
<td>MYSQL_TYPE_LONGLONG</td><td>8</td>
3048
<td>No column metadata.</td>
3052
<td>MYSQL_TYPE_DATE</td><td>10</td>
3054
<td>No column metadata.</td>
3058
<td>MYSQL_TYPE_TIME</td><td>11</td>
3060
<td>No column metadata.</td>
3064
<td>MYSQL_TYPE_DATETIME</td><td>12</td>
3066
<td>No column metadata.</td>
3070
<td>MYSQL_TYPE_YEAR</td><td>13</td>
3072
<td>No column metadata.</td>
3076
<td><i>MYSQL_TYPE_NEWDATE</i></td><td><i>14</i></td>
2776
3077
<td>–</td>
2777
3078
<td><i>This enumeration value is only used internally and cannot
2778
3079
exist in a binlog.</i></td>
2782
<td>DRIZZLE_TYPE_VARCHAR</td><td>15</td>
3083
<td>MYSQL_TYPE_VARCHAR</td><td>15</td>
2783
3084
<td>2 bytes</td>
2784
3085
<td>2 byte unsigned integer representing the maximum length of
2785
3086
the string.</td>
2789
<td>DRIZZLE_TYPE_NEWDECIMAL</td><td>246</td>
3090
<td>MYSQL_TYPE_NEWDECIMAL</td><td>246</td>
2790
3091
<td>2 bytes</td>
2791
3092
<td>A 1 byte unsigned int representing the precision, followed
2792
3093
by a 1 byte unsigned int representing the number of decimals.</td>
2796
<td><i>DRIZZLE_TYPE_ENUM</i></td><td><i>247</i></td>
2798
<td><i>This enumeration value is only used internally and cannot
2799
exist in a binlog.</i></td>
2803
<td><i>DRIZZLE_TYPE_SET</i></td><td><i>248</i></td>
2805
<td><i>This enumeration value is only used internally and cannot
2806
exist in a binlog.</i></td>
2810
<td>DRIZZLE_TYPE_BLOB</td><td>252</td>
3097
<td><i>MYSQL_TYPE_ENUM</i></td><td><i>247</i></td>
3099
<td><i>This enumeration value is only used internally and cannot
3100
exist in a binlog.</i></td>
3104
<td><i>MYSQL_TYPE_SET</i></td><td><i>248</i></td>
3106
<td><i>This enumeration value is only used internally and cannot
3107
exist in a binlog.</i></td>
3111
<td>MYSQL_TYPE_BLOB</td><td>252</td>
2811
3112
<td>1 byte</td>
2812
3113
<td>The pack length, i.e., the number of bytes needed to represent
2813
3114
the length of the blob: 1, 2, 3, or 4.</td>
2817
<td>DRIZZLE_TYPE_STRING</td><td>254</td>
3118
<td>MYSQL_TYPE_STRING</td><td>254</td>
2818
3119
<td>2 bytes</td>
2819
<td>The first byte is always DRIZZLE_TYPE_VAR_STRING (i.e., 253).
3120
<td>The first byte is always MYSQL_TYPE_VAR_STRING (i.e., 253).
2820
3121
The second byte is the field size, i.e., the number of bytes in
2821
3122
the representation of size of the string: 3 or 4.</td>
2868
3169
void clear_flags(flag_set flag) { m_flags &= ~flag; }
2869
3170
flag_set get_flags(flag_set flag) const { return m_flags & flag; }
2871
Table_map_log_event(THD *thd, Table *tbl, ulong tid,
2872
bool is_transactional, uint16_t flags);
2873
Table_map_log_event(const char *buf, uint32_t event_len,
3172
#ifndef MYSQL_CLIENT
3173
Table_map_log_event(THD *thd, TABLE *tbl, ulong tid,
3174
bool is_transactional, uint16 flags);
3176
#ifdef HAVE_REPLICATION
3177
Table_map_log_event(const char *buf, uint event_len,
2874
3178
const Format_description_log_event *description_event);
2876
3181
~Table_map_log_event();
2879
3184
virtual bool is_valid() const { return m_memory != NULL; /* we check malloc */ }
2881
3186
virtual int get_data_size() { return m_data_size; }
3187
#ifndef MYSQL_CLIENT
2882
3188
virtual int save_field_metadata();
2883
3189
virtual bool write_data_header(IO_CACHE *file);
2884
3190
virtual bool write_data_body(IO_CACHE *file);
2885
3191
virtual const char *get_db() { return m_dbnam; }
3194
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2886
3195
virtual void pack_info(Protocol *protocol);
3199
virtual void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3204
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2889
3205
virtual int do_apply_event(Relay_log_info const *rli);
2890
3206
virtual int do_update_pos(Relay_log_info *rli);
2891
3207
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
3210
#ifndef MYSQL_CLIENT
2894
3213
char const *m_dbnam;
2895
3214
size_t m_dblen;
2896
3215
char const *m_tblnam;
2897
3216
size_t m_tbllen;
2898
3217
ulong m_colcnt;
2899
unsigned char *m_coltype;
2901
unsigned char *m_memory;
2902
3221
ulong m_table_id;
2903
3222
flag_set m_flags;
2905
3224
size_t m_data_size;
2907
unsigned char *m_field_metadata; // buffer for field metadata
3226
uchar *m_field_metadata; // buffer for field metadata
2909
3228
The size of field metadata buffer set by calling save_field_metadata()
2911
3230
ulong m_field_metadata_size;
2912
unsigned char *m_null_bits;
2913
unsigned char *m_meta_memory;
3232
uchar *m_meta_memory;
2984
3303
void clear_flags(flag_set flags_arg) { m_flags &= ~flags_arg; }
2985
3304
flag_set get_flags(flag_set flags_arg) const { return m_flags & flags_arg; }
3306
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
2987
3307
virtual void pack_info(Protocol *protocol);
2989
int add_row_data(unsigned char *data, size_t length)
3311
/* not for direct call, each derived has its own ::print() */
3312
virtual void print(FILE *file, PRINT_EVENT_INFO *print_event_info)= 0;
3315
#ifndef MYSQL_CLIENT
3316
int add_row_data(uchar *data, size_t length)
2991
3318
return do_add_row_data(data,length);
2994
3322
/* Member functions to implement superclass interface */
2995
3323
virtual int get_data_size();
3012
3342
return m_rows_buf && m_cols.bitmap;
3015
uint32_t m_row_count; /* The number of rows added to the event */
3345
uint m_row_count; /* The number of rows added to the event */
3019
3349
The constructors are protected since you're supposed to inherit
3020
3350
this class, not create instances of this class.
3022
Rows_log_event(THD*, Table*, ulong table_id,
3352
#ifndef MYSQL_CLIENT
3353
Rows_log_event(THD*, TABLE*, ulong table_id,
3023
3354
MY_BITMAP const *cols, bool is_transactional);
3024
Rows_log_event(const char *row_data, uint32_t event_len,
3356
Rows_log_event(const char *row_data, uint event_len,
3025
3357
Log_event_type event_type,
3026
3358
const Format_description_log_event *description_event);
3028
virtual int do_add_row_data(unsigned char *data, size_t length);
3030
Table *m_table; /* The table the rows belong to */
3361
void print_helper(FILE *, PRINT_EVENT_INFO *, char const *const name);
3364
#ifndef MYSQL_CLIENT
3365
virtual int do_add_row_data(uchar *data, size_t length);
3368
#ifndef MYSQL_CLIENT
3369
TABLE *m_table; /* The table the rows belong to */
3031
3371
ulong m_table_id; /* Table ID */
3032
3372
MY_BITMAP m_cols; /* Bitmap denoting columns available */
3033
3373
ulong m_width; /* The width of the columns bitmap */
3043
3383
ulong m_master_reclength; /* Length of record on master side */
3045
3385
/* Bit buffers in the same memory as the class */
3046
uint32_t m_bitbuf[128/(sizeof(uint32_t)*8)];
3047
uint32_t m_bitbuf_ai[128/(sizeof(uint32_t)*8)];
3386
uint32 m_bitbuf[128/(sizeof(uint32)*8)];
3387
uint32 m_bitbuf_ai[128/(sizeof(uint32)*8)];
3049
unsigned char *m_rows_buf; /* The rows in packed format */
3050
unsigned char *m_rows_cur; /* One-after the end of the data */
3051
unsigned char *m_rows_end; /* One-after the end of the allocated space */
3389
uchar *m_rows_buf; /* The rows in packed format */
3390
uchar *m_rows_cur; /* One-after the end of the data */
3391
uchar *m_rows_end; /* One-after the end of the allocated space */
3053
3393
flag_set m_flags; /* Flags for row-level events */
3055
3395
/* helper functions */
3057
const unsigned char *m_curr_row; /* Start of the row being processed */
3058
const unsigned char *m_curr_row_end; /* One-after the end of the current row */
3059
unsigned char *m_key; /* Buffer to keep key value during searches */
3397
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3398
const uchar *m_curr_row; /* Start of the row being processed */
3399
const uchar *m_curr_row_end; /* One-after the end of the current row */
3400
uchar *m_key; /* Buffer to keep key value during searches */
3061
3402
int find_row(const Relay_log_info *const);
3062
3403
int write_row(const Relay_log_info *const, const bool);
3153
3497
TYPE_CODE = WRITE_ROWS_EVENT
3156
Write_rows_log_event(THD*, Table*, ulong table_id,
3500
#if !defined(MYSQL_CLIENT)
3501
Write_rows_log_event(THD*, TABLE*, ulong table_id,
3157
3502
bool is_transactional);
3158
Write_rows_log_event(const char *buf, uint32_t event_len,
3504
#ifdef HAVE_REPLICATION
3505
Write_rows_log_event(const char *buf, uint event_len,
3159
3506
const Format_description_log_event *description_event);
3160
static bool binlog_row_logging_function(THD *thd, Table *table,
3508
#if !defined(MYSQL_CLIENT)
3509
static bool binlog_row_logging_function(THD *thd, TABLE *table,
3161
3510
bool is_transactional,
3162
const unsigned char *before_record
3511
const uchar *before_record
3163
3512
__attribute__((unused)),
3164
const unsigned char *after_record)
3513
const uchar *after_record)
3166
3515
return thd->binlog_write_row(table, is_transactional, after_record);
3170
3520
virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; }
3523
void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3526
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3172
3527
virtual int do_before_row_operations(const Slave_reporting_capability *const);
3173
3528
virtual int do_after_row_operations(const Slave_reporting_capability *const,int);
3174
3529
virtual int do_exec_row(const Relay_log_info *const);
3196
3552
TYPE_CODE = UPDATE_ROWS_EVENT
3199
Update_rows_log_event(THD*, Table*, ulong table_id,
3555
#ifndef MYSQL_CLIENT
3556
Update_rows_log_event(THD*, TABLE*, ulong table_id,
3200
3557
bool is_transactional);
3202
3559
void init(MY_BITMAP const *cols);
3204
3562
virtual ~Update_rows_log_event();
3206
Update_rows_log_event(const char *buf, uint32_t event_len,
3564
#ifdef HAVE_REPLICATION
3565
Update_rows_log_event(const char *buf, uint event_len,
3207
3566
const Format_description_log_event *description_event);
3209
static bool binlog_row_logging_function(THD *thd, Table *table,
3569
#if !defined(MYSQL_CLIENT)
3570
static bool binlog_row_logging_function(THD *thd, TABLE *table,
3210
3571
bool is_transactional,
3211
const unsigned char *before_record,
3212
const unsigned char *after_record)
3572
const uchar *before_record,
3573
const uchar *after_record)
3214
3575
return thd->binlog_update_row(table, is_transactional,
3215
3576
before_record, after_record);
3218
3580
virtual bool is_valid() const
3257
3625
TYPE_CODE = DELETE_ROWS_EVENT
3260
Delete_rows_log_event(THD*, Table*, ulong,
3628
#ifndef MYSQL_CLIENT
3629
Delete_rows_log_event(THD*, TABLE*, ulong,
3261
3630
bool is_transactional);
3262
Delete_rows_log_event(const char *buf, uint32_t event_len,
3632
#ifdef HAVE_REPLICATION
3633
Delete_rows_log_event(const char *buf, uint event_len,
3263
3634
const Format_description_log_event *description_event);
3264
static bool binlog_row_logging_function(THD *thd, Table *table,
3636
#if !defined(MYSQL_CLIENT)
3637
static bool binlog_row_logging_function(THD *thd, TABLE *table,
3265
3638
bool is_transactional,
3266
const unsigned char *before_record,
3267
const unsigned char *after_record
3639
const uchar *before_record,
3640
const uchar *after_record
3268
3641
__attribute__((unused)))
3270
3643
return thd->binlog_delete_row(table, is_transactional, before_record);
3274
3648
virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; }
3651
void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3654
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3276
3655
virtual int do_before_row_operations(const Slave_reporting_capability *const);
3277
3656
virtual int do_after_row_operations(const Slave_reporting_capability *const,int);
3278
3657
virtual int do_exec_row(const Relay_log_info *const);
3328
3709
Incident_log_event(THD *thd_arg, Incident incident, LEX_STRING const msg)
3329
: Log_event(thd_arg, 0, false), m_incident(incident)
3710
: Log_event(thd_arg, 0, FALSE), m_incident(incident)
3331
3712
m_message= msg;
3717
#ifndef MYSQL_CLIENT
3335
3718
void pack_info(Protocol*);
3337
Incident_log_event(const char *buf, uint32_t event_len,
3721
Incident_log_event(const char *buf, uint event_len,
3338
3722
const Format_description_log_event *descr_event);
3340
3724
virtual ~Incident_log_event();
3727
virtual void print(FILE *file, PRINT_EVENT_INFO *print_event_info);
3730
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
3342
3731
virtual int do_apply_event(Relay_log_info const *rli);
3344
3734
virtual bool write_data_header(IO_CACHE *file);
3345
3735
virtual bool write_data_body(IO_CACHE *file);