~drizzle-trunk/drizzle/development

390.1.2 by Monty Taylor
Fixed copyright headers in drizzled/
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 *  Copyright (C) 2008 Sun Microsystems
5
 *
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.
9
 *
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.
14
 *
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
18
 */
1 by brian
clean slate
19
20
/**
21
  @addtogroup Replication
22
  @{
23
24
  @file
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
25
1 by brian
clean slate
26
  @brief Binary log event definitions.  This includes generic code
27
  common to all types of log events, as well as specific code for each
28
  type of log event.
29
*/
30
31
490 by Brian Aker
More effort around master.info (and relay.info)
32
#ifndef DRIZZLED_LOG_EVENT_H
33
#define DRIZZLED_LOG_EVENT_H
1 by brian
clean slate
34
35
575.4.6 by Monty Taylor
Removed my_getwd.
36
#include <mysys/my_bitmap.h>
37
#include <drizzled/replication/constants.h>
38
#include <drizzled/replication/record.h>
39
#include <drizzled/replication/reporting.h>
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
40
#include <drizzled/session.h>
490 by Brian Aker
More effort around master.info (and relay.info)
41
#include <string>
1 by brian
clean slate
42
243.1.5 by Jay Pipes
* Pulled the remainder of the log and parse stuff out into
43
#include <drizzled/sql_string.h>       /* append_query_string() needs String declaration */
44
1 by brian
clean slate
45
/**
46
   Either assert or return an error.
47
48
   In debug build, the condition will be checked, but in non-debug
49
   builds, the error code given will be returned instead.
50
51
   @param COND   Condition to check
52
   @param ERRNO  Error number to return in non-debug builds
53
*/
51.1.31 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
54
#define ASSERT_OR_RETURN_ERROR(COND, ERRNO) \
55
  assert(COND)
1 by brian
clean slate
56
57
#define LOG_READ_EOF    -1
58
#define LOG_READ_BOGUS  -2
59
#define LOG_READ_IO     -3
60
#define LOG_READ_MEM    -5
61
#define LOG_READ_TRUNC  -6
62
#define LOG_READ_TOO_LARGE -7
63
64
#define LOG_EVENT_OFFSET 4
65
66
/*
67
   3 is MySQL 4.x; 4 is MySQL 5.0.0.
68
   Compared to version 3, version 4 has:
69
   - a different Start_log_event, which includes info about the binary log
70
   (sizes of headers); this info is included for better compatibility if the
71
   master's MySQL version is different from the slave's.
72
   - all events have a unique ID (the triplet (server_id, timestamp at server
73
   start, other) to be sure an event is not executed more than once in a
74
   multimaster setup, example:
75
                M1
76
              /   \
77
             v     v
78
             M2    M3
79
             \     /
80
              v   v
81
                S
82
   if a query is run on M1, it will arrive twice on S, so we need that S
83
   remembers the last unique ID it has processed, to compare and know if the
84
   event should be skipped or not. Example of ID: we already have the server id
85
   (4 bytes), plus:
86
   timestamp_when_the_master_started (4 bytes), a counter (a sequence number
87
   which increments every time we write an event to the binlog) (3 bytes).
88
   Q: how do we handle when the counter is overflowed and restarts from 0 ?
89
90
   - Query and Load (Create or Execute) events may have a more precise
91
     timestamp (with microseconds), number of matched/affected/warnings rows
92
   and fields of session variables: SQL_MODE,
93
   FOREIGN_KEY_CHECKS, UNIQUE_CHECKS, SQL_AUTO_IS_NULL, the collations and
94
   charsets, the PASSWORD() version (old/new/...).
95
*/
96
#define BINLOG_VERSION    4
97
98
/*
99
 We could have used SERVER_VERSION_LENGTH, but this introduces an
100
 obscure dependency - if somebody decided to change SERVER_VERSION_LENGTH
101
 this would break the replication protocol
102
*/
103
#define ST_SERVER_VER_LEN 50
104
105
/*
106
  These are flags and structs to handle all the LOAD DATA INFILE options (LINES
107
  TERMINATED etc).
108
*/
109
110
/*
111
  These are flags and structs to handle all the LOAD DATA INFILE options (LINES
112
  TERMINATED etc).
113
  DUMPFILE_FLAG is probably useless (DUMPFILE is a clause of SELECT, not of LOAD
114
  DATA).
115
*/
116
#define DUMPFILE_FLAG		0x1
117
#define OPT_ENCLOSED_FLAG	0x2
118
#define REPLACE_FLAG		0x4
119
#define IGNORE_FLAG		0x8
120
121
#define FIELD_TERM_EMPTY	0x1
122
#define ENCLOSED_EMPTY		0x2
123
#define LINE_TERM_EMPTY		0x4
124
#define LINE_START_EMPTY	0x8
125
#define ESCAPED_EMPTY		0x10
126
127
#define NUM_LOAD_DELIM_STRS 5
128
129
/*****************************************************************************
130
131
  sql_ex_info struct
132
133
 ****************************************************************************/
134
struct sql_ex_info
135
{
136
  sql_ex_info() {}                            /* Remove gcc warning */
137
  const char* field_term;
138
  const char* enclosed;
139
  const char* line_term;
140
  const char* line_start;
141
  const char* escaped;
142
  int cached_new_format;
206 by Brian Aker
Removed final uint dead types.
143
  uint8_t field_term_len,enclosed_len,line_term_len,line_start_len, escaped_len;
1 by brian
clean slate
144
  char opt_flags;
145
  char empty_flags;
146
496 by Brian Aker
Removed dead code around SHOW commands (I_S exist for collations/charsets)
147
  /* store in new format even if old is possible */
1 by brian
clean slate
148
  void force_new_format() { cached_new_format = 1;}
149
  int data_size()
150
  {
151
    return (new_format() ?
152
	    field_term_len + enclosed_len + line_term_len +
153
	    line_start_len + escaped_len + 6 : 7);
154
  }
155
  bool write_data(IO_CACHE* file);
156
  const char* init(const char* buf, const char* buf_end, bool use_new_format);
157
  bool new_format()
158
  {
159
    return ((cached_new_format != -1) ? cached_new_format :
160
	    (cached_new_format=(field_term_len > 1 ||
161
				enclosed_len > 1 ||
162
				line_term_len > 1 || line_start_len > 1 ||
163
				escaped_len > 1)));
164
  }
165
};
166
167
/*****************************************************************************
168
169
  MySQL Binary Log
170
171
  This log consists of events.  Each event has a fixed-length header,
172
  possibly followed by a variable length data body.
173
174
  The data body consists of an optional fixed length segment (post-header)
175
  and  an optional variable length segment.
176
177
  See the #defines below for the format specifics.
178
179
  The events which really update data are Query_log_event,
180
  Execute_load_query_log_event and old Load_log_event and
181
  Execute_load_log_event events (Execute_load_query is used together with
182
  Begin_load_query and Append_block events to replicate LOAD DATA INFILE.
183
  Create_file/Append_block/Execute_load (which includes Load_log_event)
184
  were used to replicate LOAD DATA before the 5.0.3).
185
186
 ****************************************************************************/
187
188
#define LOG_EVENT_HEADER_LEN 19     /* the fixed header length */
189
#define OLD_HEADER_LEN       13     /* the fixed header length in 3.23 */
190
/*
191
   Fixed header length, where 4.x and 5.0 agree. That is, 5.0 may have a longer
192
   header (it will for sure when we have the unique event's ID), but at least
193
   the first 19 bytes are the same in 4.x and 5.0. So when we have the unique
194
   event's ID, LOG_EVENT_HEADER_LEN will be something like 26, but
195
   LOG_EVENT_MINIMAL_HEADER_LEN will remain 19.
196
*/
287.3.8 by Monty Taylor
Oy. Replaced max and min macros with std::max and std::min so that we get
197
#define LOG_EVENT_MINIMAL_HEADER_LEN (uint8_t)19
1 by brian
clean slate
198
199
/* event-specific post-header sizes */
200
// where 3.23, 4.x and 5.0 agree
201
#define QUERY_HEADER_MINIMAL_LEN     (4 + 4 + 1 + 2)
202
// where 5.0 differs: 2 for len of N-bytes vars.
203
#define QUERY_HEADER_LEN     (QUERY_HEADER_MINIMAL_LEN + 2)
204
#define LOAD_HEADER_LEN      (4 + 4 + 4 + 1 +1 + 4)
205
#define START_V3_HEADER_LEN     (2 + ST_SERVER_VER_LEN + 4)
206
#define ROTATE_HEADER_LEN    8 // this is FROZEN (the Rotate post-header is frozen)
207
#define CREATE_FILE_HEADER_LEN 4
208
#define APPEND_BLOCK_HEADER_LEN 4
209
#define EXEC_LOAD_HEADER_LEN   4
210
#define DELETE_FILE_HEADER_LEN 4
211
#define FORMAT_DESCRIPTION_HEADER_LEN (START_V3_HEADER_LEN+1+LOG_EVENT_TYPES)
212
#define ROWS_HEADER_LEN        8
213
#define TABLE_MAP_HEADER_LEN   8
214
#define EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN (4 + 4 + 4 + 1)
215
#define EXECUTE_LOAD_QUERY_HEADER_LEN  (QUERY_HEADER_LEN + EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN)
216
#define INCIDENT_HEADER_LEN    2
217
#define HEARTBEAT_HEADER_LEN   0
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
218
/*
1 by brian
clean slate
219
  Max number of possible extra bytes in a replication event compared to a
220
  packet (i.e. a query) sent from client to master;
221
  First, an auxiliary log_event status vars estimation:
222
*/
223
#define MAX_SIZE_LOG_EVENT_STATUS (4 /* flags2 */   + \
224
                                   8 /* sql mode */ + \
225
                                   1 + 1 + 255 /* catalog */ + \
226
                                   4 /* autoinc */ + \
227
                                   6 /* charset */ + \
228
                                   MAX_TIME_ZONE_NAME_LENGTH)
229
#define MAX_LOG_EVENT_HEADER   ( /* in order of Query_log_event::write */ \
230
  LOG_EVENT_HEADER_LEN + /* write_header */ \
231
  QUERY_HEADER_LEN     + /* write_data */   \
232
  EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN + /*write_post_header_for_derived */ \
233
  MAX_SIZE_LOG_EVENT_STATUS + /* status */ \
234
  NAME_LEN + 1)
235
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
236
/*
237
   Event header offsets;
1 by brian
clean slate
238
   these point to places inside the fixed header.
239
*/
240
241
#define EVENT_TYPE_OFFSET    4
242
#define SERVER_ID_OFFSET     5
243
#define EVENT_LEN_OFFSET     9
244
#define LOG_POS_OFFSET       13
245
#define FLAGS_OFFSET         17
246
247
/* start event post-header (for v3 and v4) */
248
249
#define ST_BINLOG_VER_OFFSET  0
250
#define ST_SERVER_VER_OFFSET  2
251
#define ST_CREATED_OFFSET     (ST_SERVER_VER_OFFSET + ST_SERVER_VER_LEN)
252
#define ST_COMMON_HEADER_LEN_OFFSET (ST_CREATED_OFFSET + 4)
253
254
/* slave event post-header (this event is never written) */
255
256
#define SL_MASTER_PORT_OFFSET   8
257
#define SL_MASTER_POS_OFFSET    0
258
#define SL_MASTER_HOST_OFFSET   10
259
260
/* query event post-header */
261
262
#define Q_THREAD_ID_OFFSET	0
263
#define Q_EXEC_TIME_OFFSET	4
264
#define Q_DB_LEN_OFFSET		8
265
#define Q_ERR_CODE_OFFSET	9
266
#define Q_STATUS_VARS_LEN_OFFSET 11
267
#define Q_DATA_OFFSET		QUERY_HEADER_LEN
268
/* these are codes, not offsets; not more than 256 values (1 byte). */
269
#define Q_FLAGS2_CODE           0
270
271
#define Q_LC_TIME_NAMES_CODE    7
272
273
#define Q_CHARSET_DATABASE_CODE 8
274
/* Intvar event post-header */
275
276
#define I_TYPE_OFFSET        0
277
#define I_VAL_OFFSET         1
278
279
/* Rand event post-header */
280
281
#define RAND_SEED1_OFFSET 0
282
#define RAND_SEED2_OFFSET 8
283
284
/* User_var event post-header */
285
286
#define UV_VAL_LEN_SIZE        4
287
#define UV_VAL_IS_NULL         1
288
#define UV_VAL_TYPE_SIZE       1
289
#define UV_NAME_LEN_SIZE       4
290
#define UV_CHARSET_NUMBER_SIZE 4
291
292
/* Load event post-header */
293
294
#define L_THREAD_ID_OFFSET   0
295
#define L_EXEC_TIME_OFFSET   4
296
#define L_SKIP_LINES_OFFSET  8
297
#define L_TBL_LEN_OFFSET     12
298
#define L_DB_LEN_OFFSET      13
299
#define L_NUM_FIELDS_OFFSET  14
300
#define L_SQL_EX_OFFSET      18
301
#define L_DATA_OFFSET        LOAD_HEADER_LEN
302
303
/* Rotate event post-header */
304
305
#define R_POS_OFFSET       0
306
#define R_IDENT_OFFSET     8
307
308
/* CF to DF handle LOAD DATA INFILE */
309
310
/* CF = "Create File" */
311
#define CF_FILE_ID_OFFSET  0
312
#define CF_DATA_OFFSET     CREATE_FILE_HEADER_LEN
313
314
/* AB = "Append Block" */
315
#define AB_FILE_ID_OFFSET  0
316
#define AB_DATA_OFFSET     APPEND_BLOCK_HEADER_LEN
317
318
/* EL = "Execute Load" */
319
#define EL_FILE_ID_OFFSET  0
320
321
/* DF = "Delete File" */
322
#define DF_FILE_ID_OFFSET  0
323
324
/* TM = "Table Map" */
325
#define TM_MAPID_OFFSET    0
326
#define TM_FLAGS_OFFSET    6
327
328
/* RW = "RoWs" */
329
#define RW_MAPID_OFFSET    0
330
#define RW_FLAGS_OFFSET    6
331
332
/* ELQ = "Execute Load Query" */
333
#define ELQ_FILE_ID_OFFSET QUERY_HEADER_LEN
334
#define ELQ_FN_POS_START_OFFSET ELQ_FILE_ID_OFFSET + 4
335
#define ELQ_FN_POS_END_OFFSET ELQ_FILE_ID_OFFSET + 8
336
#define ELQ_DUP_HANDLING_OFFSET ELQ_FILE_ID_OFFSET + 12
337
338
/* 4 bytes which all binlogs should begin with */
339
#define BINLOG_MAGIC        "\xfe\x62\x69\x6e"
340
341
/*
342
   This flag only makes sense for Format_description_log_event. It is set
343
   when the event is written, and *reset* when a binlog file is
344
   closed (yes, it's the only case when MySQL modifies already written
345
   part of binlog).  Thus it is a reliable indicator that binlog was
346
   closed correctly.  (Stop_log_event is not enough, there's always a
347
   small chance that mysqld crashes in the middle of insert and end of
348
   the binlog would look like a Stop_log_event).
349
350
   This flag is used to detect a restart after a crash, and to provide
351
   "unbreakable" binlog. The problem is that on a crash storage engines
352
   rollback automatically, while binlog does not.  To solve this we use this
353
   flag and automatically append ROLLBACK to every non-closed binlog (append
354
   virtually, on reading, file itself is not changed). If this flag is found,
355
   mysqlbinlog simply prints "ROLLBACK" Replication master does not abort on
356
   binlog corruption, but takes it as EOF, and replication slave forces a
357
   rollback in this case.
358
359
   Note, that old binlogs does not have this flag set, so we get a
360
   a backward-compatible behaviour.
361
*/
362
363
#define LOG_EVENT_BINLOG_IN_USE_F       0x1
364
365
/**
366
  @def LOG_EVENT_THREAD_SPECIFIC_F
367
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
368
  If the query depends on the thread (for example: TEMPORARY Table).
1 by brian
clean slate
369
  Currently this is used by mysqlbinlog to know it must print
370
  SET @@PSEUDO_THREAD_ID=xx; before the query (it would not hurt to print it
371
  for every query but this would be slow).
372
*/
373
#define LOG_EVENT_THREAD_SPECIFIC_F 0x4
374
375
/**
376
  @def LOG_EVENT_SUPPRESS_USE_F
377
378
  Suppress the generation of 'USE' statements before the actual
379
  statement. This flag should be set for any events that does not need
380
  the current database set to function correctly. Most notable cases
381
  are 'CREATE DATABASE' and 'DROP DATABASE'.
382
383
  This flags should only be used in exceptional circumstances, since
384
  it introduce a significant change in behaviour regarding the
385
  replication logic together with the flags --binlog-do-db and
386
  --replicated-do-db.
387
 */
388
#define LOG_EVENT_SUPPRESS_USE_F    0x8
389
390
/*
391
  The table map version internal to the log should be increased after
392
  the event has been written to the binary log.
393
 */
394
#define LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F 0x10
395
396
/**
397
  @def OPTIONS_WRITTEN_TO_BIN_LOG
398
520.1.22 by Brian Aker
Second pass of thd cleanup
399
  OPTIONS_WRITTEN_TO_BIN_LOG are the bits of session->options which must
1 by brian
clean slate
400
  be written to the binlog. OPTIONS_WRITTEN_TO_BIN_LOG could be
401
  written into the Format_description_log_event, so that if later we
402
  don't want to replicate a variable we did replicate, or the
403
  contrary, it's doable. But it should not be too hard to decide once
404
  for all of what we replicate and what we don't, among the fixed 32
520.1.22 by Brian Aker
Second pass of thd cleanup
405
  bits of session->options.
1 by brian
clean slate
406
407
  I (Guilhem) have read through every option's usage, and it looks
408
  like OPTION_AUTO_IS_NULL and OPTION_NO_FOREIGN_KEYS are the only
409
  ones which alter how the query modifies the table. It's good to
410
  replicate OPTION_RELAXED_UNIQUE_CHECKS too because otherwise, the
411
  slave may insert data slower than the master, in InnoDB.
412
  OPTION_BIG_SELECTS is not needed (the slave thread runs with
413
  max_join_size=HA_POS_ERROR) and OPTION_BIG_TABLES is not needed
414
  either, as the manual says (because a too big in-memory temp table
415
  is automatically written to disk).
416
*/
417
#define OPTIONS_WRITTEN_TO_BIN_LOG \
418
  (OPTION_AUTO_IS_NULL | OPTION_NO_FOREIGN_KEY_CHECKS |  \
419
   OPTION_RELAXED_UNIQUE_CHECKS | OPTION_NOT_AUTOCOMMIT)
420
421
/* Shouldn't be defined before */
422
#define EXPECTED_OPTIONS \
398.1.8 by Monty Taylor
Enabled -Wlong-long.
423
  ((1U << 14) | (1U << 26) | (1U << 27) | (1U << 19))
1 by brian
clean slate
424
425
#if OPTIONS_WRITTEN_TO_BIN_LOG != EXPECTED_OPTIONS
426
#error OPTIONS_WRITTEN_TO_BIN_LOG must NOT change their values!
427
#endif
428
#undef EXPECTED_OPTIONS         /* You shouldn't use this one */
429
430
/**
431
  @enum Log_event_type
432
433
  Enumeration type for the different types of log events.
434
*/
435
enum Log_event_type
436
{
437
  /*
438
    Every time you update this enum (when you add a type), you have to
439
    fix Format_description_log_event::Format_description_log_event().
440
  */
441
  UNKNOWN_EVENT= 0,
442
  START_EVENT_V3= 1,
443
  QUERY_EVENT= 2,
444
  STOP_EVENT= 3,
445
  ROTATE_EVENT= 4,
446
  INTVAR_EVENT= 5,
447
  LOAD_EVENT= 6,
448
  SLAVE_EVENT= 7,
449
  CREATE_FILE_EVENT= 8,
450
  APPEND_BLOCK_EVENT= 9,
451
  EXEC_LOAD_EVENT= 10,
452
  DELETE_FILE_EVENT= 11,
453
  /*
454
    NEW_LOAD_EVENT is like LOAD_EVENT except that it has a longer
455
    sql_ex, allowing multibyte TERMINATED BY etc; both types share the
456
    same class (Load_log_event)
457
  */
458
  NEW_LOAD_EVENT= 12,
459
  RAND_EVENT= 13,
460
  USER_VAR_EVENT= 14,
461
  FORMAT_DESCRIPTION_EVENT= 15,
462
  XID_EVENT= 16,
463
  BEGIN_LOAD_QUERY_EVENT= 17,
464
  EXECUTE_LOAD_QUERY_EVENT= 18,
465
466
  TABLE_MAP_EVENT = 19,
467
468
  /*
469
    These event numbers are used from 5.1.16 and forward
470
   */
471
  WRITE_ROWS_EVENT = 23,
472
  UPDATE_ROWS_EVENT = 24,
473
  DELETE_ROWS_EVENT = 25,
474
475
  /*
476
    Something out of the ordinary happened on the master
477
   */
478
  INCIDENT_EVENT= 26,
479
480
  /*
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
481
    Heartbeat event to be send by master at its idle time
482
    to ensure master's online status to slave
1 by brian
clean slate
483
  */
484
  HEARTBEAT_LOG_EVENT= 27,
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
485
1 by brian
clean slate
486
  /*
487
    Add new events here - right above this comment!
488
    Existing events (except ENUM_END_EVENT) should never change their numbers
489
  */
490
491
  ENUM_END_EVENT /* end marker */
492
};
493
494
/*
495
   The number of types we handle in Format_description_log_event (UNKNOWN_EVENT
496
   is not to be handled, it does not exist in binlogs, it does not have a
497
   format).
498
*/
499
#define LOG_EVENT_TYPES (ENUM_END_EVENT-1)
500
501
enum Int_event_type
502
{
503
  INVALID_INT_EVENT = 0, LAST_INSERT_ID_EVENT = 1, INSERT_ID_EVENT = 2
504
};
505
506
507
class String;
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
508
class DRIZZLE_BIN_LOG;
520.1.21 by Brian Aker
THD -> Session rename
509
class Session;
1 by brian
clean slate
510
511
class Format_description_log_event;
512
class Relay_log_info;
513
514
/**
515
  the struct aggregates two paramenters that identify an event
516
  uniquely in scope of communication of a particular master and slave couple.
517
  I.e there can not be 2 events from the same staying connected master which
518
  have the same coordinates.
519
  @note
520
  Such identifier is not yet unique generally as the event originating master
521
  is resetable. Also the crashed master can be replaced with some other.
522
*/
523
struct event_coordinates
524
{
525
  char * file_name; // binlog file name (directories stripped)
526
  my_off_t  pos;       // event's position in the binlog file
527
};
528
529
/**
530
  @class Log_event
531
532
  This is the abstract base class for binary log events.
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
533
1 by brian
clean slate
534
  @section Log_event_binary_format Binary Format
535
536
  Any @c Log_event saved on disk consists of the following three
537
  components.
538
539
  - Common-Header
540
  - Post-Header
541
  - Body
542
543
  The Common-Header, documented in the table @ref Table_common_header
544
  "below", always has the same form and length within one version of
545
  MySQL.  Each event type specifies a format and length of the
546
  Post-Header.  The length of the Common-Header is the same for all
547
  events of the same type.  The Body may be of different format and
548
  length even for different events of the same type.  The binary
549
  formats of Post-Header and Body are documented separately in each
550
  subclass.  The binary format of Common-Header is as follows.
551
552
  <table>
553
  <caption>Common-Header</caption>
554
555
  <tr>
556
    <th>Name</th>
557
    <th>Format</th>
558
    <th>Description</th>
559
  </tr>
560
561
  <tr>
562
    <td>timestamp</td>
563
    <td>4 byte unsigned integer</td>
564
    <td>The time when the query started, in seconds since 1970.
565
    </td>
566
  </tr>
567
568
  <tr>
569
    <td>type</td>
570
    <td>1 byte enumeration</td>
571
    <td>See enum #Log_event_type.</td>
572
  </tr>
573
574
  <tr>
575
    <td>server_id</td>
576
    <td>4 byte unsigned integer</td>
577
    <td>Server ID of the server that created the event.</td>
578
  </tr>
579
580
  <tr>
581
    <td>total_size</td>
582
    <td>4 byte unsigned integer</td>
583
    <td>The total size of this event, in bytes.  In other words, this
584
    is the sum of the sizes of Common-Header, Post-Header, and Body.
585
    </td>
586
  </tr>
587
588
  <tr>
589
    <td>master_position</td>
590
    <td>4 byte unsigned integer</td>
591
    <td>The position of the next event in the master binary log, in
592
    bytes from the beginning of the file.  In a binlog that is not a
593
    relay log, this is just the position of the next event, in bytes
594
    from the beginning of the file.  In a relay log, this is
595
    the position of the next event in the master's binlog.
596
    </td>
597
  </tr>
598
599
  <tr>
600
    <td>flags</td>
601
    <td>2 byte bitfield</td>
602
    <td>See Log_event::flags.</td>
603
  </tr>
604
  </table>
605
606
  Summing up the numbers above, we see that the total size of the
607
  common header is 19 bytes.
608
609
  @subsection Log_event_format_of_atomic_primitives Format of Atomic Primitives
610
611
  - All numbers, whether they are 16-, 24-, 32-, or 64-bit numbers,
612
  are stored in little endian, i.e., the least significant byte first,
613
  unless otherwise specified.
614
615
  @anchor packed_integer
616
  - Some events use a special format for efficient representation of
617
  unsigned integers, called Packed Integer.  A Packed Integer has the
618
  capacity of storing up to 8-byte integers, while small integers
619
  still can use 1, 3, or 4 bytes.  The value of the first byte
620
  determines how to read the number, according to the following table:
621
622
  <table>
623
  <caption>Format of Packed Integer</caption>
624
625
  <tr>
626
    <th>First byte</th>
627
    <th>Format</th>
628
  </tr>
629
630
  <tr>
631
    <td>0-250</td>
632
    <td>The first byte is the number (in the range 0-250), and no more
633
    bytes are used.</td>
634
  </tr>
635
636
  <tr>
637
    <td>252</td>
638
    <td>Two more bytes are used.  The number is in the range
639
    251-0xffff.</td>
640
  </tr>
641
642
  <tr>
643
    <td>253</td>
644
    <td>Three more bytes are used.  The number is in the range
645
    0xffff-0xffffff.</td>
646
  </tr>
647
648
  <tr>
649
    <td>254</td>
650
    <td>Eight more bytes are used.  The number is in the range
651
    0xffffff-0xffffffffffffffff.</td>
652
  </tr>
653
654
  </table>
655
656
  - Strings are stored in various formats.  The format of each string
657
  is documented separately.
658
*/
659
class Log_event
660
{
661
public:
662
  /**
663
     Enumeration of what kinds of skipping (and non-skipping) that can
664
     occur when the slave executes an event.
665
666
     @see shall_skip
667
     @see do_shall_skip
668
   */
669
  enum enum_skip_reason {
670
    /**
671
       Don't skip event.
672
    */
673
    EVENT_SKIP_NOT,
674
675
    /**
676
       Skip event by ignoring it.
677
678
       This means that the slave skip counter will not be changed.
679
    */
680
    EVENT_SKIP_IGNORE,
681
682
    /**
683
       Skip event and decrease skip counter.
684
    */
685
    EVENT_SKIP_COUNT
686
  };
687
688
689
  /*
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
690
    The following type definition is to be used whenever data is placed
1 by brian
clean slate
691
    and manipulated in a common buffer. Use this typedef for buffers
692
    that contain data containing binary and character data.
693
  */
694
  typedef unsigned char Byte;
695
696
  /*
697
    The offset in the log where this event originally appeared (it is
698
    preserved in relay logs, making SHOW SLAVE STATUS able to print
699
    coordinates of the event in the master's binlog). Note: when a
700
    transaction is written by the master to its binlog (wrapped in
701
    BEGIN/COMMIT) the log_pos of all the queries it contains is the
702
    one of the BEGIN (this way, when one does SHOW SLAVE STATUS it
703
    sees the offset of the BEGIN, which is logical as rollback may
704
    occur), except the COMMIT query which has its real offset.
705
  */
490 by Brian Aker
More effort around master.info (and relay.info)
706
  off_t log_pos;
1 by brian
clean slate
707
  /*
708
     A temp buffer for read_log_event; it is later analysed according to the
709
     event's type, and its content is distributed in the event-specific fields.
710
  */
711
  char *temp_buf;
712
  /*
713
    Timestamp on the master(for debugging and replication of
714
    NOW()/TIMESTAMP).  It is important for queries and LOAD DATA
715
    INFILE. This is set at the event's creation time, except for Query
716
    and Load (et al.) events where this is set at the query's
717
    execution time, which guarantees good replication (otherwise, we
718
    could have a query and its event with different timestamps).
719
  */
720
  time_t when;
721
  /* The number of seconds the query took to run on the master. */
722
  ulong exec_time;
723
  /* Number of bytes written by write() function */
724
  ulong data_written;
725
726
  /*
727
    The master's server id (is preserved in the relay log; used to
728
    prevent from infinite loops in circular replication).
729
  */
205 by Brian Aker
uint32 -> uin32_t
730
  uint32_t server_id;
1 by brian
clean slate
731
732
  /**
733
    Some 16 flags. See the definitions above for LOG_EVENT_TIME_F,
734
    LOG_EVENT_FORCED_ROTATE_F, LOG_EVENT_THREAD_SPECIFIC_F, and
735
    LOG_EVENT_SUPPRESS_USE_F for notes.
736
  */
206 by Brian Aker
Removed final uint dead types.
737
  uint16_t flags;
1 by brian
clean slate
738
739
  bool cache_stmt;
740
741
  /**
742
    A storage to cache the global system variable's value.
743
    Handling of a separate event will be governed its member.
744
  */
745
  ulong slave_exec_mode;
746
520.1.22 by Brian Aker
Second pass of thd cleanup
747
  Session* session;
1 by brian
clean slate
748
749
  Log_event();
520.1.22 by Brian Aker
Second pass of thd cleanup
750
  Log_event(Session* session_arg, uint16_t flags_arg, bool cache_stmt);
1 by brian
clean slate
751
  /*
752
    read_log_event() functions read an event from a binlog or relay
753
    log; used by SHOW BINLOG EVENTS, the binlog_dump thread on the
754
    master (reads master's binlog), the slave IO thread (reads the
755
    event sent by binlog_dump), the slave SQL thread (reads the event
756
    from the relay log).  If mutex is 0, the read will proceed without
757
    mutex.  We need the description_event to be able to parse the
758
    event (to know the post-header's size); in fact in read_log_event
759
    we detect the event's type, then call the specific event's
760
    constructor and pass description_event as an argument.
761
  */
762
  static Log_event* read_log_event(IO_CACHE* file,
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
763
                                   pthread_mutex_t* log_lock,
1 by brian
clean slate
764
                                   const Format_description_log_event
765
                                   *description_event);
766
  static int read_log_event(IO_CACHE* file, String* packet,
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
767
                            pthread_mutex_t* log_lock);
1 by brian
clean slate
768
  /*
769
    init_show_field_list() prepares the column names and types for the
770
    output of SHOW BINLOG EVENTS; it is used only by SHOW BINLOG
771
    EVENTS.
772
  */
773
  static void init_show_field_list(List<Item>* field_list);
774
  int net_send(Protocol *protocol, const char* log_name, my_off_t pos);
775
776
  /*
777
    pack_info() is used by SHOW BINLOG EVENTS; as print() it prepares and sends
778
    a string to display to the user, so it resembles print().
779
  */
780
781
  virtual void pack_info(Protocol *protocol);
782
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
783
  virtual const char* get_db();
1 by brian
clean slate
784
785
  static void *operator new(size_t size)
786
  {
641.3.8 by Monty Taylor
Removed my_malloc from drizzled.
787
    return (void*) malloc(size);
1 by brian
clean slate
788
  }
789
641.3.8 by Monty Taylor
Removed my_malloc from drizzled.
790
  static void operator delete(void *ptr, size_t)
1 by brian
clean slate
791
  {
481 by Brian Aker
Remove all of uchar.
792
    free((unsigned char*) ptr);
1 by brian
clean slate
793
  }
794
795
  /* Placement version of the above operators */
796
  static void *operator new(size_t, void* ptr) { return ptr; }
797
  static void operator delete(void*, void*) { }
798
799
  bool write_header(IO_CACHE* file, ulong data_length);
800
  virtual bool write(IO_CACHE* file)
801
  {
802
    return (write_header(file, get_data_size()) ||
803
            write_data_header(file) ||
804
            write_data_body(file));
805
  }
520.9.3 by mordred
zomg. Solaris actually builds all the way!!!
806
  virtual bool write_data_header(IO_CACHE*)
1 by brian
clean slate
807
  { return 0; }
520.9.3 by mordred
zomg. Solaris actually builds all the way!!!
808
  virtual bool write_data_body(IO_CACHE*)
1 by brian
clean slate
809
  { return 0; }
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
810
  time_t get_time();
1 by brian
clean slate
811
  virtual Log_event_type get_type_code() = 0;
812
  virtual bool is_valid() const = 0;
813
  virtual bool is_artificial_event() { return 0; }
814
  inline bool get_cache_stmt() const { return cache_stmt; }
815
  Log_event(const char* buf, const Format_description_log_event
816
            *description_event);
817
  virtual ~Log_event() { free_temp_buf();}
818
  void register_temp_buf(char* buf) { temp_buf = buf; }
819
  void free_temp_buf()
820
  {
821
    if (temp_buf)
822
    {
477 by Monty Taylor
Removed my_free(). It turns out that it had been def'd to ignore the flags passed to it in the second arg anyway. Gotta love that.
823
      free(temp_buf);
1 by brian
clean slate
824
      temp_buf = 0;
825
    }
826
  }
827
  /*
828
    Get event length for simple events. For complicated events the length
829
    is calculated during write()
830
  */
831
  virtual int get_data_size() { return 0;}
482 by Brian Aker
Remove uint.
832
  static Log_event* read_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
833
				   const char **error,
834
                                   const Format_description_log_event
835
                                   *description_event);
836
  /**
837
    Returns the human readable name of the given event type.
838
  */
839
  static const char* get_type_str(Log_event_type type);
840
  /**
841
    Returns the human readable name of this event's type.
842
  */
843
  const char* get_type_str();
844
845
  /* Return start of query time or current time */
846
847
public:
848
849
  /**
850
     Apply the event to the database.
851
852
     This function represents the public interface for applying an
853
     event.
854
855
     @see do_apply_event
856
   */
857
  int apply_event(Relay_log_info const *rli)
858
  {
859
    return do_apply_event(rli);
860
  }
861
862
863
  /**
864
     Update the relay log position.
865
866
     This function represents the public interface for "stepping over"
867
     the event and will update the relay log information.
868
869
     @see do_update_pos
870
   */
871
  int update_pos(Relay_log_info *rli)
872
  {
873
    return do_update_pos(rli);
874
  }
875
876
  /**
877
     Decide if the event shall be skipped, and the reason for skipping
878
     it.
879
880
     @see do_shall_skip
881
   */
882
  enum_skip_reason shall_skip(Relay_log_info *rli)
883
  {
884
    return do_shall_skip(rli);
885
  }
886
887
protected:
888
889
  /**
890
     Helper function to ignore an event w.r.t. the slave skip counter.
891
892
     This function can be used inside do_shall_skip() for functions
893
     that cannot end a group. If the slave skip counter is 1 when
894
     seeing such an event, the event shall be ignored, the counter
895
     left intact, and processing continue with the next event.
896
897
     A typical usage is:
898
     @code
899
     enum_skip_reason do_shall_skip(Relay_log_info *rli) {
900
       return continue_group(rli);
901
     }
902
     @endcode
903
904
     @return Skip reason
905
   */
906
  enum_skip_reason continue_group(Relay_log_info *rli);
907
908
  /**
909
    Primitive to apply an event to the database.
910
911
    This is where the change to the database is made.
912
913
    @note The primitive is protected instead of private, since there
914
    is a hierarchy of actions to be performed in some cases.
915
916
    @see Format_description_log_event::do_apply_event()
917
918
    @param rli Pointer to relay log info structure
919
920
    @retval 0     Event applied successfully
921
    @retval errno Error code if event application failed
922
  */
520.9.3 by mordred
zomg. Solaris actually builds all the way!!!
923
  virtual int do_apply_event(Relay_log_info const *)
1 by brian
clean slate
924
  {
925
    return 0;                /* Default implementation does nothing */
926
  }
927
928
929
  /**
930
     Advance relay log coordinates.
931
932
     This function is called to advance the relay log coordinates to
933
     just after the event.  It is essential that both the relay log
934
     coordinate and the group log position is updated correctly, since
935
     this function is used also for skipping events.
936
937
     Normally, each implementation of do_update_pos() shall:
938
939
     - Update the event position to refer to the position just after
940
       the event.
941
942
     - Update the group log position to refer to the position just
943
       after the event <em>if the event is last in a group</em>
944
945
     @param rli Pointer to relay log info structure
946
947
     @retval 0     Coordinates changed successfully
948
     @retval errno Error code if advancing failed (usually just
949
                   1). Observe that handler errors are returned by the
950
                   do_apply_event() function, and not by this one.
951
   */
952
  virtual int do_update_pos(Relay_log_info *rli);
953
954
955
  /**
956
     Decide if this event shall be skipped or not and the reason for
957
     skipping it.
958
959
     The default implementation decide that the event shall be skipped
960
     if either:
961
962
     - the server id of the event is the same as the server id of the
963
       server and <code>rli->replicate_same_server_id</code> is true,
964
       or
965
966
     - if <code>rli->slave_skip_counter</code> is greater than zero.
967
968
     @see do_apply_event
969
     @see do_update_pos
970
971
     @retval Log_event::EVENT_SKIP_NOT
972
     The event shall not be skipped and should be applied.
973
974
     @retval Log_event::EVENT_SKIP_IGNORE
975
     The event shall be skipped by just ignoring it, i.e., the slave
976
     skip counter shall not be changed. This happends if, for example,
977
     the originating server id of the event is the same as the server
978
     id of the slave.
979
980
     @retval Log_event::EVENT_SKIP_COUNT
981
     The event shall be skipped because the slave skip counter was
982
     non-zero. The caller shall decrease the counter by one.
983
   */
984
  virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
985
};
986
987
988
/*
989
   One class for each type of event.
990
   Two constructors for each class:
991
   - one to create the event for logging (when the server acts as a master),
992
   called after an update to the database is done,
993
   which accepts parameters like the query, the database, the options for LOAD
994
   DATA INFILE...
995
   - one to create the event from a packet (when the server acts as a slave),
996
   called before reproducing the update, which accepts parameters (like a
997
   buffer). Used to read from the master, from the relay log, and in
998
   mysqlbinlog. This constructor must be format-tolerant.
999
*/
1000
1001
/**
1002
  @class Query_log_event
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1003
1 by brian
clean slate
1004
  A @c Query_log_event is created for each query that modifies the
1005
  database, unless the query is logged row-based.
1006
1007
  @section Query_log_event_binary_format Binary format
1008
1009
  See @ref Log_event_binary_format "Binary format for log events" for
1010
  a general discussion and introduction to the binary format of binlog
1011
  events.
1012
1013
  The Post-Header has five components:
1014
1015
  <table>
1016
  <caption>Post-Header for Query_log_event</caption>
1017
1018
  <tr>
1019
    <th>Name</th>
1020
    <th>Format</th>
1021
    <th>Description</th>
1022
  </tr>
1023
1024
  <tr>
1025
    <td>slave_proxy_id</td>
1026
    <td>4 byte unsigned integer</td>
1027
    <td>An integer identifying the client thread that issued the
1028
    query.  The id is unique per server.  (Note, however, that two
1029
    threads on different servers may have the same slave_proxy_id.)
1030
    This is used when a client thread creates a temporary table local
1031
    to the client.  The slave_proxy_id is used to distinguish
1032
    temporary tables that belong to different clients.
1033
    </td>
1034
  </tr>
1035
1036
  <tr>
1037
    <td>exec_time</td>
1038
    <td>4 byte unsigned integer</td>
1039
    <td>The time from when the query started to when it was logged in
1040
    the binlog, in seconds.</td>
1041
  </tr>
1042
1043
  <tr>
1044
    <td>db_len</td>
1045
    <td>1 byte integer</td>
1046
    <td>The length of the name of the currently selected database.</td>
1047
  </tr>
1048
1049
  <tr>
1050
    <td>error_code</td>
1051
    <td>2 byte unsigned integer</td>
1052
    <td>Error code generated by the master.  If the master fails, the
1053
    slave will fail with the same error code, except for the error
1054
    codes ER_DB_CREATE_EXISTS == 1007 and ER_DB_DROP_EXISTS == 1008.
1055
    </td>
1056
  </tr>
1057
1058
  <tr>
1059
    <td>status_vars_len</td>
1060
    <td>2 byte unsigned integer</td>
1061
    <td>The length of the status_vars block of the Body, in bytes. See
1062
    @ref query_log_event_status_vars "below".
1063
    </td>
1064
  </tr>
1065
  </table>
1066
1067
  The Body has the following components:
1068
1069
  <table>
1070
  <caption>Body for Query_log_event</caption>
1071
1072
  <tr>
1073
    <th>Name</th>
1074
    <th>Format</th>
1075
    <th>Description</th>
1076
  </tr>
1077
1078
  <tr>
1079
    <td>@anchor query_log_event_status_vars status_vars</td>
1080
    <td>status_vars_len bytes</td>
1081
    <td>Zero or more status variables.  Each status variable consists
1082
    of one byte identifying the variable stored, followed by the value
1083
    of the variable.  The possible variables are listed separately in
1084
    the table @ref Table_query_log_event_status_vars "below".  MySQL
1085
    always writes events in the order defined below; however, it is
1086
    capable of reading them in any order.  </td>
1087
  </tr>
1088
1089
  <tr>
1090
    <td>db</td>
1091
    <td>db_len+1</td>
1092
    <td>The currently selected database, as a null-terminated string.
1093
1094
    (The trailing zero is redundant since the length is already known;
1095
    it is db_len from Post-Header.)
1096
    </td>
1097
  </tr>
1098
1099
  <tr>
1100
    <td>query</td>
1101
    <td>variable length string without trailing zero, extending to the
1102
    end of the event (determined by the length field of the
1103
    Common-Header)
1104
    </td>
1105
    <td>The SQL query.</td>
1106
  </tr>
1107
  </table>
1108
1109
  The following table lists the status variables that may appear in
1110
  the status_vars field.
1111
1112
  @anchor Table_query_log_event_status_vars
1113
  <table>
1114
  <caption>Status variables for Query_log_event</caption>
1115
1116
  <tr>
1117
    <th>Status variable</th>
1118
    <th>1 byte identifier</th>
1119
    <th>Format</th>
1120
    <th>Description</th>
1121
  </tr>
1122
1123
  <tr>
1124
    <td>flags2</td>
1125
    <td>Q_FLAGS2_CODE == 0</td>
1126
    <td>4 byte bitfield</td>
520.1.22 by Brian Aker
Second pass of thd cleanup
1127
    <td>The flags in @c session->options, binary AND-ed with @c
1128
    OPTIONS_WRITTEN_TO_BIN_LOG.  The @c session->options bitfield contains
1 by brian
clean slate
1129
    options for "SELECT".  @c OPTIONS_WRITTEN identifies those options
1130
    that need to be written to the binlog (not all do).  Specifically,
1131
    @c OPTIONS_WRITTEN_TO_BIN_LOG equals (@c OPTION_AUTO_IS_NULL | @c
1132
    OPTION_NO_FOREIGN_KEY_CHECKS | @c OPTION_RELAXED_UNIQUE_CHECKS |
1133
    @c OPTION_NOT_AUTOCOMMIT), or 0x0c084000 in hex.
1134
1135
    These flags correspond to the SQL variables SQL_AUTO_IS_NULL,
1136
    FOREIGN_KEY_CHECKS, UNIQUE_CHECKS, and AUTOCOMMIT, documented in
1137
    the "SET Syntax" section of the MySQL Manual.
1138
1139
    This field is always written to the binlog in version >= 5.0, and
1140
    never written in version < 5.0.
1141
    </td>
1142
  </tr>
1143
1144
  <tr>
1145
    <td>sql_mode</td>
1146
    <td>Q_SQL_MODE_CODE == 1</td>
1147
    <td>8 byte bitfield</td>
1148
    <td>The @c sql_mode variable.  See the section "SQL Modes" in the
1149
    MySQL manual, and see mysql_priv.h for a list of the possible
1150
    flags. Currently (2007-10-04), the following flags are available:
1151
    <pre>
1152
    MODE_REAL_AS_FLOAT==0x1
1153
    MODE_PIPES_AS_CONCAT==0x2
1154
    MODE_ANSI_QUOTES==0x4
1155
    MODE_IGNORE_SPACE==0x8
1156
    MODE_NOT_USED==0x10
1157
    MODE_ONLY_FULL_GROUP_BY==0x20
1158
    MODE_NO_UNSIGNED_SUBTRACTION==0x40
1159
    MODE_NO_DIR_IN_CREATE==0x80
1160
    MODE_POSTGRESQL==0x100
1161
    MODE_ORACLE==0x200
1162
    MODE_MSSQL==0x400
1163
    MODE_DB2==0x800
1164
    MODE_MAXDB==0x1000
1165
    MODE_NO_KEY_OPTIONS==0x2000
1166
    MODE_NO_TABLE_OPTIONS==0x4000
1167
    MODE_NO_FIELD_OPTIONS==0x8000
1168
    MODE_MYSQL323==0x10000
1169
    MODE_MYSQL323==0x20000
1170
    MODE_MYSQL40==0x40000
1171
    MODE_ANSI==0x80000
1172
    MODE_NO_AUTO_VALUE_ON_ZERO==0x100000
1173
    MODE_NO_BACKSLASH_ESCAPES==0x200000
1174
    MODE_STRICT_TRANS_TABLES==0x400000
1175
    MODE_STRICT_ALL_TABLES==0x800000
1176
    MODE_NO_ZERO_IN_DATE==0x1000000
1177
    MODE_NO_ZERO_DATE==0x2000000
1178
    MODE_INVALID_DATES==0x4000000
1179
    MODE_ERROR_FOR_DIVISION_BY_ZERO==0x8000000
1180
    MODE_TRADITIONAL==0x10000000
1181
    MODE_NO_AUTO_CREATE_USER==0x20000000
1182
    MODE_HIGH_NOT_PRECEDENCE==0x40000000
1183
    MODE_PAD_CHAR_TO_FULL_LENGTH==0x80000000
1184
    </pre>
1185
    All these flags are replicated from the server.  However, all
1186
    flags except @c MODE_NO_DIR_IN_CREATE are honored by the slave;
1187
    the slave always preserves its old value of @c
1188
    MODE_NO_DIR_IN_CREATE.  For a rationale, see comment in
1189
    @c Query_log_event::do_apply_event in @c log_event.cc.
1190
1191
    This field is always written to the binlog.
1192
    </td>
1193
  </tr>
1194
1195
  <tr>
1196
    <td>catalog</td>
1197
    <td>Q_CATALOG_NZ_CODE == 6</td>
1198
    <td>Variable-length string: the length in bytes (1 byte) followed
1199
    by the characters (at most 255 bytes)
1200
    </td>
1201
    <td>Stores the client's current catalog.  Every database belongs
1202
    to a catalog, the same way that every table belongs to a
1203
    database.  Currently, there is only one catalog, "std".
1204
1205
    This field is written if the length of the catalog is > 0;
1206
    otherwise it is not written.
1207
    </td>
1208
  </tr>
1209
1210
  <tr>
1211
    <td>auto_increment</td>
1212
    <td>Q_AUTO_INCREMENT == 3</td>
1213
    <td>two 2 byte unsigned integers, totally 2+2=4 bytes</td>
1214
1215
    <td>The two variables auto_increment_increment and
1216
    auto_increment_offset, in that order.  For more information, see
1217
    "System variables" in the MySQL manual.
1218
1219
    This field is written if auto_increment > 1.  Otherwise, it is not
1220
    written.
1221
    </td>
1222
  </tr>
1223
1224
  <tr>
1225
    <td>charset</td>
1226
    <td>Q_CHARSET_CODE == 4</td>
1227
    <td>three 2 byte unsigned integers, totally 2+2+2=6 bytes</td>
1228
    <td>The three variables character_set_client,
1229
    collation_connection, and collation_server, in that order.
1230
    character_set_client is a code identifying the character set and
1231
    collation used by the client to encode the query.
1232
    collation_connection identifies the character set and collation
1233
    that the master converts the query to when it receives it; this is
1234
    useful when comparing literal strings.  collation_server is the
1235
    default character set and collation used when a new database is
1236
    created.
1237
1238
    See also "Connection Character Sets and Collations" in the MySQL
1239
    5.1 manual.
1240
1241
    All three variables are codes identifying a (character set,
1242
    collation) pair.  To see which codes map to which pairs, run the
1243
    query "SELECT id, character_set_name, collation_name FROM
1244
    COLLATIONS".
1245
1246
    Cf. Q_CHARSET_DATABASE_CODE below.
1247
1248
    This field is always written.
1249
    </td>
1250
  </tr>
1251
1252
  <tr>
1253
    <td>time_zone</td>
1254
    <td>Q_TIME_ZONE_CODE == 5</td>
1255
    <td>Variable-length string: the length in bytes (1 byte) followed
1256
    by the characters (at most 255 bytes).
1257
    <td>The time_zone of the master.
1258
1259
    See also "System Variables" and "MySQL Server Time Zone Support"
1260
    in the MySQL manual.
1261
1262
    This field is written if the length of the time zone string is >
1263
    0; otherwise, it is not written.
1264
    </td>
1265
  </tr>
1266
1267
  <tr>
1268
    <td>lc_time_names_number</td>
1269
    <td>Q_LC_TIME_NAMES_CODE == 7</td>
1270
    <td>2 byte integer</td>
1271
    <td>A code identifying a table of month and day names.  The
1272
    mapping from codes to languages is defined in @c sql_locale.cc.
1273
1274
    This field is written if it is not 0, i.e., if the locale is not
1275
    en_US.
1276
    </td>
1277
  </tr>
1278
1279
  <tr>
1280
    <td>charset_database_number</td>
1281
    <td>Q_CHARSET_DATABASE_CODE == 8</td>
1282
    <td>2 byte integer</td>
1283
1284
    <td>The value of the collation_database system variable (in the
520.1.22 by Brian Aker
Second pass of thd cleanup
1285
    source code stored in @c session->variables.collation_database), which
1 by brian
clean slate
1286
    holds the code for a (character set, collation) pair as described
1287
    above (see Q_CHARSET_CODE).
1288
1289
    collation_database was used in old versions (???WHEN).  Its value
1290
    was loaded when issuing a "use db" query and could be changed by
1291
    issuing a "SET collation_database=xxx" query.  It used to affect
1292
    the "LOAD DATA INFILE" and "CREATE TABLE" commands.
1293
1294
    In newer versions, "CREATE TABLE" has been changed to take the
1295
    character set from the database of the created table, rather than
1296
    the character set of the current database.  This makes a
1297
    difference when creating a table in another database than the
1298
    current one.  "LOAD DATA INFILE" has not yet changed to do this,
1299
    but there are plans to eventually do it, and to make
1300
    collation_database read-only.
1301
1302
    This field is written if it is not 0.
1303
    </td>
1304
  </tr>
1305
  </table>
1306
1307
  @subsection Query_log_event_notes_on_previous_versions Notes on Previous Versions
1308
1309
  * Status vars were introduced in version 5.0.  To read earlier
1310
  versions correctly, check the length of the Post-Header.
1311
1312
  * The status variable Q_CATALOG_CODE == 2 existed in MySQL 5.0.x,
1313
  where 0<=x<=3.  It was identical to Q_CATALOG_CODE, except that the
1314
  string had a trailing '\0'.  The '\0' was removed in 5.0.4 since it
1315
  was redundant (the string length is stored before the string).  The
1316
  Q_CATALOG_CODE will never be written by a new master, but can still
1317
  be understood by a new slave.
1318
1319
  * See Q_CHARSET_DATABASE_CODE in the table above.
1320
1321
*/
1322
class Query_log_event: public Log_event
1323
{
1324
protected:
1325
  Log_event::Byte* data_buf;
1326
public:
1327
  const char* query;
1328
  const char* catalog;
1329
  const char* db;
1330
  /*
1331
    If we already know the length of the query string
1332
    we pass it with q_len, so we would not have to call strlen()
1333
    otherwise, set it to 0, in which case, we compute it with strlen()
1334
  */
205 by Brian Aker
uint32 -> uin32_t
1335
  uint32_t q_len;
1336
  uint32_t db_len;
206 by Brian Aker
Removed final uint dead types.
1337
  uint16_t error_code;
1 by brian
clean slate
1338
  ulong thread_id;
1339
  /*
1340
    For events created by Query_log_event::do_apply_event (and
1341
    Load_log_event::do_apply_event()) we need the *original* thread
1342
    id, to be able to log the event with the original (=master's)
1343
    thread id (fix for BUG#1686).
1344
  */
1345
  ulong slave_proxy_id;
1346
1347
  /*
1348
    Binlog format 3 and 4 start to differ (as far as class members are
1349
    concerned) from here.
1350
  */
1351
482 by Brian Aker
Remove uint.
1352
  uint32_t catalog_len;			// <= 255 char; 0 means uninited
1 by brian
clean slate
1353
1354
  /*
1355
    We want to be able to store a variable number of N-bit status vars:
1356
    (generally N=32; but N=64 for SQL_MODE) a user may want to log the number
1357
    of affected rows (for debugging) while another does not want to lose 4
1358
    bytes in this.
1359
    The storage on disk is the following:
1360
    status_vars_len is part of the post-header,
1361
    status_vars are in the variable-length part, after the post-header, before
1362
    the db & query.
1363
    status_vars on disk is a sequence of pairs (code, value) where 'code' means
1364
    'sql_mode', 'affected' etc. Sometimes 'value' must be a short string, so
1365
    its first byte is its length. For now the order of status vars is:
1366
    flags2 - sql_mode - catalog - autoinc - charset
1367
    We should add the same thing to Load_log_event, but in fact
1368
    LOAD DATA INFILE is going to be logged with a new type of event (logging of
1369
    the plain text query), so Load_log_event would be frozen, so no need. The
1370
    new way of logging LOAD DATA INFILE would use a derived class of
1371
    Query_log_event, so automatically benefit from the work already done for
1372
    status variables in Query_log_event.
1373
 */
206 by Brian Aker
Removed final uint dead types.
1374
  uint16_t status_vars_len;
1 by brian
clean slate
1375
1376
  /*
1377
    'flags2' is a second set of flags (on top of those in Log_event), for
520.1.22 by Brian Aker
Second pass of thd cleanup
1378
    session variables. These are session->options which is & against a mask
1 by brian
clean slate
1379
    (OPTIONS_WRITTEN_TO_BIN_LOG).
1380
    flags2_inited helps make a difference between flags2==0 (3.23 or 4.x
1381
    master, we don't know flags2, so use the slave server's global options) and
1382
    flags2==0 (5.0 master, we know this has a meaning of flags all down which
1383
    must influence the query).
1384
  */
1385
  bool flags2_inited;
1386
  bool sql_mode_inited;
1387
  bool charset_inited;
1388
205 by Brian Aker
uint32 -> uin32_t
1389
  uint32_t flags2;
1 by brian
clean slate
1390
  /* In connections sql_mode is 32 bits now but will be 64 bits soon */
1391
  ulong sql_mode;
1392
  ulong auto_increment_increment, auto_increment_offset;
1393
  char charset[6];
482 by Brian Aker
Remove uint.
1394
  uint32_t time_zone_len; /* 0 means uninited */
1 by brian
clean slate
1395
  const char *time_zone_str;
482 by Brian Aker
Remove uint.
1396
  uint32_t lc_time_names_number; /* 0 means en_US */
1397
  uint32_t charset_database_number;
1 by brian
clean slate
1398
1399
520.1.22 by Brian Aker
Second pass of thd cleanup
1400
  Query_log_event(Session* session_arg, const char* query_arg, ulong query_length,
1 by brian
clean slate
1401
                  bool using_trans, bool suppress_use,
520.1.21 by Brian Aker
THD -> Session rename
1402
                  Session::killed_state killed_err_arg= Session::KILLED_NO_VALUE);
1 by brian
clean slate
1403
  const char* get_db() { return db; }
1404
  void pack_info(Protocol* protocol);
1405
1406
  Query_log_event();
482 by Brian Aker
Remove uint.
1407
  Query_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
1408
                  const Format_description_log_event *description_event,
1409
                  Log_event_type event_type);
1410
  ~Query_log_event()
1411
  {
1412
    if (data_buf)
481 by Brian Aker
Remove all of uchar.
1413
      free((unsigned char*) data_buf);
1 by brian
clean slate
1414
  }
1415
  Log_event_type get_type_code() { return QUERY_EVENT; }
1416
  bool write(IO_CACHE* file);
520.9.3 by mordred
zomg. Solaris actually builds all the way!!!
1417
  virtual bool write_post_header_for_derived(IO_CACHE*)
51.1.31 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1418
  { return false; }
1 by brian
clean slate
1419
  bool is_valid() const { return query != 0; }
1420
1421
  /*
1422
    Returns number of bytes additionaly written to post header by derived
1423
    events (so far it is only Execute_load_query event).
1424
  */
1425
  virtual ulong get_post_header_size_for_derived() { return 0; }
1426
  /* Writes derived event-specific part of post header. */
1427
1428
public:        /* !!! Public in this patch to allow old usage */
1429
  virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
1430
  virtual int do_apply_event(Relay_log_info const *rli);
1431
  virtual int do_update_pos(Relay_log_info *rli);
1432
1433
  int do_apply_event(Relay_log_info const *rli,
1434
                       const char *query_arg,
205 by Brian Aker
uint32 -> uin32_t
1435
                       uint32_t q_len_arg);
1 by brian
clean slate
1436
};
1437
1438
1439
/**
1440
  @class Slave_log_event
1441
1442
  Note that this class is currently not used at all; no code writes a
1443
  @c Slave_log_event (though some code in @c repl_failsafe.cc reads @c
1444
  Slave_log_event).  So it's not a problem if this code is not
1445
  maintained.
1446
1447
  @section Slave_log_event_binary_format Binary Format
1448
1449
  This event type has no Post-Header. The Body has the following
1450
  four components.
1451
1452
  <table>
1453
  <caption>Body for Slave_log_event</caption>
1454
1455
  <tr>
1456
    <th>Name</th>
1457
    <th>Format</th>
1458
    <th>Description</th>
1459
  </tr>
1460
1461
  <tr>
1462
    <td>master_pos</td>
1463
    <td>8 byte integer</td>
1464
    <td>???TODO
1465
    </td>
1466
  </tr>
1467
1468
  <tr>
1469
    <td>master_port</td>
1470
    <td>2 byte integer</td>
1471
    <td>???TODO</td>
1472
  </tr>
1473
1474
  <tr>
1475
    <td>master_host</td>
1476
    <td>null-terminated string</td>
1477
    <td>???TODO</td>
1478
  </tr>
1479
1480
  <tr>
1481
    <td>master_log</td>
1482
    <td>null-terminated string</td>
1483
    <td>???TODO</td>
1484
  </tr>
1485
  </table>
1486
*/
490 by Brian Aker
More effort around master.info (and relay.info)
1487
1 by brian
clean slate
1488
class Slave_log_event: public Log_event
1489
{
1490
protected:
1491
  char* mem_pool;
490 by Brian Aker
More effort around master.info (and relay.info)
1492
  void init_from_mem_pool();
1 by brian
clean slate
1493
public:
490 by Brian Aker
More effort around master.info (and relay.info)
1494
  off_t master_pos;
1495
  std::string master_host;
1496
  std::string master_log;
206 by Brian Aker
Removed final uint dead types.
1497
  uint16_t master_port;
1 by brian
clean slate
1498
520.1.22 by Brian Aker
Second pass of thd cleanup
1499
  Slave_log_event(Session* session_arg, Relay_log_info* rli);
1 by brian
clean slate
1500
  void pack_info(Protocol* protocol);
1501
482 by Brian Aker
Remove uint.
1502
  Slave_log_event(const char* buf, uint32_t event_len);
1 by brian
clean slate
1503
  ~Slave_log_event();
1504
  int get_data_size();
490 by Brian Aker
More effort around master.info (and relay.info)
1505
  bool is_valid() const { return master_host.length() != 0; }
1 by brian
clean slate
1506
  Log_event_type get_type_code() { return SLAVE_EVENT; }
1507
  bool write(IO_CACHE* file);
1508
1509
private:
1510
  virtual int do_apply_event(Relay_log_info const* rli);
1511
};
1512
1513
1514
/**
1515
  @class Load_log_event
1516
1517
  This log event corresponds to a "LOAD DATA INFILE" SQL query on the
1518
  following form:
1519
1520
  @verbatim
1521
   (1)    USE db;
1522
   (2)    LOAD DATA [LOCAL] INFILE 'file_name'
1523
   (3)    [REPLACE | IGNORE]
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1524
   (4)    INTO Table 'table_name'
1 by brian
clean slate
1525
   (5)    [FIELDS
1526
   (6)      [TERMINATED BY 'field_term']
1527
   (7)      [[OPTIONALLY] ENCLOSED BY 'enclosed']
1528
   (8)      [ESCAPED BY 'escaped']
1529
   (9)    ]
1530
  (10)    [LINES
1531
  (11)      [TERMINATED BY 'line_term']
1532
  (12)      [LINES STARTING BY 'line_start']
1533
  (13)    ]
1534
  (14)    [IGNORE skip_lines LINES]
1535
  (15)    (field_1, field_2, ..., field_n)@endverbatim
1536
1537
  @section Load_log_event_binary_format Binary Format
1538
1539
  The Post-Header consists of the following six components.
1540
1541
  <table>
1542
  <caption>Post-Header for Load_log_event</caption>
1543
1544
  <tr>
1545
    <th>Name</th>
1546
    <th>Format</th>
1547
    <th>Description</th>
1548
  </tr>
1549
1550
  <tr>
1551
    <td>slave_proxy_id</td>
1552
    <td>4 byte unsigned integer</td>
1553
    <td>An integer identifying the client thread that issued the
1554
    query.  The id is unique per server.  (Note, however, that two
1555
    threads on different servers may have the same slave_proxy_id.)
1556
    This is used when a client thread creates a temporary table local
1557
    to the client.  The slave_proxy_id is used to distinguish
1558
    temporary tables that belong to different clients.
1559
    </td>
1560
  </tr>
1561
1562
  <tr>
1563
    <td>exec_time</td>
1564
    <td>4 byte unsigned integer</td>
1565
    <td>The time from when the query started to when it was logged in
1566
    the binlog, in seconds.</td>
1567
  </tr>
1568
1569
  <tr>
1570
    <td>skip_lines</td>
1571
    <td>4 byte unsigned integer</td>
1572
    <td>The number on line (14) above, if present, or 0 if line (14)
1573
    is left out.
1574
    </td>
1575
  </tr>
1576
1577
  <tr>
1578
    <td>table_name_len</td>
1579
    <td>1 byte unsigned integer</td>
1580
    <td>The length of 'table_name' on line (4) above.</td>
1581
  </tr>
1582
1583
  <tr>
1584
    <td>db_len</td>
1585
    <td>1 byte unsigned integer</td>
1586
    <td>The length of 'db' on line (1) above.</td>
1587
  </tr>
1588
1589
  <tr>
1590
    <td>num_fields</td>
1591
    <td>4 byte unsigned integer</td>
1592
    <td>The number n of fields on line (15) above.</td>
1593
  </tr>
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1594
  </table>
1 by brian
clean slate
1595
1596
  The Body contains the following components.
1597
1598
  <table>
1599
  <caption>Body of Load_log_event</caption>
1600
1601
  <tr>
1602
    <th>Name</th>
1603
    <th>Format</th>
1604
    <th>Description</th>
1605
  </tr>
1606
1607
  <tr>
1608
    <td>sql_ex</td>
1609
    <td>variable length</td>
1610
1611
    <td>Describes the part of the query on lines (3) and
1612
    (5)&ndash;(13) above.  More precisely, it stores the five strings
1613
    (on lines) field_term (6), enclosed (7), escaped (8), line_term
1614
    (11), and line_start (12); as well as a bitfield indicating the
1615
    presence of the keywords REPLACE (3), IGNORE (3), and OPTIONALLY
1616
    (7).
1617
1618
    The data is stored in one of two formats, called "old" and "new".
1619
    The type field of Common-Header determines which of these two
1620
    formats is used: type LOAD_EVENT means that the old format is
1621
    used, and type NEW_LOAD_EVENT means that the new format is used.
1622
    When MySQL writes a Load_log_event, it uses the new format if at
1623
    least one of the five strings is two or more bytes long.
1624
    Otherwise (i.e., if all strings are 0 or 1 bytes long), the old
1625
    format is used.
1626
1627
    The new and old format differ in the way the five strings are
1628
    stored.
1629
1630
    <ul>
1631
    <li> In the new format, the strings are stored in the order
1632
    field_term, enclosed, escaped, line_term, line_start. Each string
1633
    consists of a length (1 byte), followed by a sequence of
1634
    characters (0-255 bytes).  Finally, a boolean combination of the
1635
    following flags is stored in 1 byte: REPLACE_FLAG==0x4,
1636
    IGNORE_FLAG==0x8, and OPT_ENCLOSED_FLAG==0x2.  If a flag is set,
1637
    it indicates the presence of the corresponding keyword in the SQL
1638
    query.
1639
1640
    <li> In the old format, we know that each string has length 0 or
1641
    1.  Therefore, only the first byte of each string is stored.  The
1642
    order of the strings is the same as in the new format.  These five
1643
    bytes are followed by the same 1 byte bitfield as in the new
1644
    format.  Finally, a 1 byte bitfield called empty_flags is stored.
1645
    The low 5 bits of empty_flags indicate which of the five strings
1646
    have length 0.  For each of the following flags that is set, the
1647
    corresponding string has length 0; for the flags that are not set,
1648
    the string has length 1: FIELD_TERM_EMPTY==0x1,
1649
    ENCLOSED_EMPTY==0x2, LINE_TERM_EMPTY==0x4, LINE_START_EMPTY==0x8,
1650
    ESCAPED_EMPTY==0x10.
1651
    </ul>
1652
1653
    Thus, the size of the new format is 6 bytes + the sum of the sizes
1654
    of the five strings.  The size of the old format is always 7
1655
    bytes.
1656
    </td>
1657
  </tr>
1658
1659
  <tr>
1660
    <td>field_lens</td>
1661
    <td>num_fields 1 byte unsigned integers</td>
1662
    <td>An array of num_fields integers representing the length of
1663
    each field in the query.  (num_fields is from the Post-Header).
1664
    </td>
1665
  </tr>
1666
1667
  <tr>
1668
    <td>fields</td>
1669
    <td>num_fields null-terminated strings</td>
1670
    <td>An array of num_fields null-terminated strings, each
1671
    representing a field in the query.  (The trailing zero is
1672
    redundant, since the length are stored in the num_fields array.)
1673
    The total length of all strings equals to the sum of all
1674
    field_lens, plus num_fields bytes for all the trailing zeros.
1675
    </td>
1676
  </tr>
1677
1678
  <tr>
1679
    <td>table_name</td>
1680
    <td>null-terminated string of length table_len+1 bytes</td>
1681
    <td>The 'table_name' from the query, as a null-terminated string.
1682
    (The trailing zero is actually redundant since the table_len is
1683
    known from Post-Header.)
1684
    </td>
1685
  </tr>
1686
1687
  <tr>
1688
    <td>db</td>
1689
    <td>null-terminated string of length db_len+1 bytes</td>
1690
    <td>The 'db' from the query, as a null-terminated string.
1691
    (The trailing zero is actually redundant since the db_len is known
1692
    from Post-Header.)
1693
    </td>
1694
  </tr>
1695
1696
  <tr>
1697
    <td>file_name</td>
1698
    <td>variable length string without trailing zero, extending to the
1699
    end of the event (determined by the length field of the
1700
    Common-Header)
1701
    </td>
1702
    <td>The 'file_name' from the query.
1703
    </td>
1704
  </tr>
1705
1706
  </table>
1707
1708
  @subsection Load_log_event_notes_on_previous_versions Notes on Previous Versions
1709
1710
  This event type is understood by current versions, but only
1711
  generated by MySQL 3.23 and earlier.
1712
*/
1713
class Load_log_event: public Log_event
1714
{
1715
private:
482 by Brian Aker
Remove uint.
1716
  uint32_t get_query_buffer_length();
1 by brian
clean slate
1717
  void print_query(bool need_db, char *buf, char **end,
1718
                   char **fn_start, char **fn_end);
1719
protected:
1720
  int copy_log_event(const char *buf, ulong event_len,
1721
                     int body_offset,
1722
                     const Format_description_log_event* description_event);
1723
1724
public:
1725
  ulong thread_id;
1726
  ulong slave_proxy_id;
205 by Brian Aker
uint32 -> uin32_t
1727
  uint32_t table_name_len;
1 by brian
clean slate
1728
  /*
1729
    No need to have a catalog, as these events can only come from 4.x.
1730
    TODO: this may become false if Dmitri pushes his new LOAD DATA INFILE in
1731
    5.0 only (not in 4.x).
1732
  */
205 by Brian Aker
uint32 -> uin32_t
1733
  uint32_t db_len;
1734
  uint32_t fname_len;
1735
  uint32_t num_fields;
1 by brian
clean slate
1736
  const char* fields;
481 by Brian Aker
Remove all of uchar.
1737
  const unsigned char* field_lens;
205 by Brian Aker
uint32 -> uin32_t
1738
  uint32_t field_block_len;
1 by brian
clean slate
1739
1740
  const char* table_name;
1741
  const char* db;
1742
  const char* fname;
205 by Brian Aker
uint32 -> uin32_t
1743
  uint32_t skip_lines;
1 by brian
clean slate
1744
  sql_ex_info sql_ex;
1745
  bool local_fname;
1746
1747
  /* fname doesn't point to memory inside Log_event::temp_buf  */
482 by Brian Aker
Remove uint.
1748
  void set_fname_outside_temp_buf(const char *afname, uint32_t alen)
1 by brian
clean slate
1749
  {
1750
    fname= afname;
1751
    fname_len= alen;
51.1.31 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1752
    local_fname= true;
1 by brian
clean slate
1753
  }
1754
  /* fname doesn't point to memory inside Log_event::temp_buf  */
1755
  int  check_fname_outside_temp_buf()
1756
  {
1757
    return local_fname;
1758
  }
1759
1760
  String field_lens_buf;
1761
  String fields_buf;
1762
520.1.22 by Brian Aker
Second pass of thd cleanup
1763
  Load_log_event(Session* session, sql_exchange* ex, const char* db_arg,
1 by brian
clean slate
1764
		 const char* table_name_arg,
1765
		 List<Item>& fields_arg, enum enum_duplicates handle_dup, bool ignore,
1766
		 bool using_trans);
1767
  void set_fields(const char* db, List<Item> &fields_arg,
1768
                  Name_resolution_context *context);
1769
  const char* get_db() { return db; }
1770
  void pack_info(Protocol* protocol);
1771
1772
  /*
1773
    Note that for all the events related to LOAD DATA (Load_log_event,
1774
    Create_file/Append/Exec/Delete, we pass description_event; however as
1775
    logging of LOAD DATA is going to be changed in 4.1 or 5.0, this is only used
1776
    for the common_header_len (post_header_len will not be changed).
1777
  */
482 by Brian Aker
Remove uint.
1778
  Load_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
1779
                 const Format_description_log_event* description_event);
1780
  ~Load_log_event()
1781
  {}
1782
  Log_event_type get_type_code()
1783
  {
1784
    return sql_ex.new_format() ? NEW_LOAD_EVENT: LOAD_EVENT;
1785
  }
1786
  bool write_data_header(IO_CACHE* file);
1787
  bool write_data_body(IO_CACHE* file);
1788
  bool is_valid() const { return table_name != 0; }
1789
  int get_data_size()
1790
  {
1791
    return (table_name_len + db_len + 2 + fname_len
1792
	    + LOAD_HEADER_LEN
1793
	    + sql_ex.data_size() + field_block_len + num_fields);
1794
  }
1795
1796
public:        /* !!! Public in this patch to allow old usage */
1797
  virtual int do_apply_event(Relay_log_info const* rli)
1798
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
1799
    return do_apply_event(session->slave_net,rli,0);
1 by brian
clean slate
1800
  }
1801
1802
  int do_apply_event(NET *net, Relay_log_info const *rli,
1803
                     bool use_rli_only_for_errors);
1804
};
1805
1806
extern char server_version[SERVER_VERSION_LENGTH];
1807
1808
/**
1809
  @class Start_log_event_v3
1810
1811
  Start_log_event_v3 is the Start_log_event of binlog format 3 (MySQL 3.23 and
1812
  4.x).
1813
1814
  Format_description_log_event derives from Start_log_event_v3; it is
1815
  the Start_log_event of binlog format 4 (MySQL 5.0), that is, the
1816
  event that describes the other events' Common-Header/Post-Header
1817
  lengths. This event is sent by MySQL 5.0 whenever it starts sending
1818
  a new binlog if the requested position is >4 (otherwise if ==4 the
1819
  event will be sent naturally).
1820
1821
  @section Start_log_event_v3_binary_format Binary Format
1822
*/
1823
class Start_log_event_v3: public Log_event
1824
{
1825
public:
1826
  /*
1827
    If this event is at the start of the first binary log since server
1828
    startup 'created' should be the timestamp when the event (and the
1829
    binary log) was created.  In the other case (i.e. this event is at
1830
    the start of a binary log created by FLUSH LOGS or automatic
1831
    rotation), 'created' should be 0.  This "trick" is used by MySQL
1832
    >=4.0.14 slaves to know whether they must drop stale temporary
1833
    tables and whether they should abort unfinished transaction.
1834
1835
    Note that when 'created'!=0, it is always equal to the event's
1836
    timestamp; indeed Start_log_event is written only in log.cc where
1837
    the first constructor below is called, in which 'created' is set
1838
    to 'when'.  So in fact 'created' is a useless variable. When it is
1839
    0 we can read the actual value from timestamp ('when') and when it
1840
    is non-zero we can read the same value from timestamp
1841
    ('when'). Conclusion:
1842
     - we use timestamp to print when the binlog was created.
1843
     - we use 'created' only to know if this is a first binlog or not.
1844
     In 3.23.57 we did not pay attention to this identity, so mysqlbinlog in
1845
     3.23.57 does not print 'created the_date' if created was zero. This is now
1846
     fixed.
1847
  */
1848
  time_t created;
206 by Brian Aker
Removed final uint dead types.
1849
  uint16_t binlog_version;
1 by brian
clean slate
1850
  char server_version[ST_SERVER_VER_LEN];
1851
  /*
1852
    artifical_event is 1 in the case where this is a generated event that
1853
    should not case any cleanup actions. We handle this in the log by
1854
    setting log_event == 0 (for now).
1855
  */
1856
  bool artificial_event;
1857
  /*
1858
    We set this to 1 if we don't want to have the created time in the log,
1859
    which is the case when we rollover to a new log.
1860
  */
1861
  bool dont_set_created;
1862
1863
  Start_log_event_v3();
1864
  void pack_info(Protocol* protocol);
1865
1866
  Start_log_event_v3(const char* buf,
1867
                     const Format_description_log_event* description_event);
1868
  ~Start_log_event_v3() {}
1869
  Log_event_type get_type_code() { return START_EVENT_V3;}
1870
  bool write(IO_CACHE* file);
1871
  bool is_valid() const { return 1; }
1872
  int get_data_size()
1873
  {
1874
    return START_V3_HEADER_LEN; //no variable-sized part
1875
  }
1876
  virtual bool is_artificial_event() { return artificial_event; }
1877
1878
protected:
1879
  virtual int do_apply_event(Relay_log_info const *rli);
1880
  virtual enum_skip_reason do_shall_skip(Relay_log_info*)
1881
  {
1882
    /*
1883
      Events from ourself should be skipped, but they should not
1884
      decrease the slave skip counter.
1885
     */
1886
    if (this->server_id == ::server_id)
1887
      return Log_event::EVENT_SKIP_IGNORE;
1888
    else
1889
      return Log_event::EVENT_SKIP_NOT;
1890
  }
1891
};
1892
1893
1894
/**
1895
  @class Format_description_log_event
1896
1897
  For binlog version 4.
1898
  This event is saved by threads which read it, as they need it for future
1899
  use (to decode the ordinary events).
1900
1901
  @section Format_description_log_event_binary_format Binary Format
1902
*/
1903
1904
class Format_description_log_event: public Start_log_event_v3
1905
{
1906
public:
1907
  /*
1908
     The size of the fixed header which _all_ events have
1909
     (for binlogs written by this version, this is equal to
1910
     LOG_EVENT_HEADER_LEN), except FORMAT_DESCRIPTION_EVENT and ROTATE_EVENT
1911
     (those have a header of size LOG_EVENT_MINIMAL_HEADER_LEN).
1912
  */
206 by Brian Aker
Removed final uint dead types.
1913
  uint8_t common_header_len;
1914
  uint8_t number_of_event_types;
1 by brian
clean slate
1915
  /* The list of post-headers' lengthes */
206 by Brian Aker
Removed final uint dead types.
1916
  uint8_t *post_header_len;
481 by Brian Aker
Remove all of uchar.
1917
  unsigned char server_version_split[3];
206 by Brian Aker
Removed final uint dead types.
1918
  const uint8_t *event_type_permutation;
1 by brian
clean slate
1919
206 by Brian Aker
Removed final uint dead types.
1920
  Format_description_log_event(uint8_t binlog_ver, const char* server_ver=0);
482 by Brian Aker
Remove uint.
1921
  Format_description_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
1922
                               const Format_description_log_event
1923
                               *description_event);
1924
  ~Format_description_log_event()
1925
  {
481 by Brian Aker
Remove all of uchar.
1926
    free((unsigned char*)post_header_len);
1 by brian
clean slate
1927
  }
1928
  Log_event_type get_type_code() { return FORMAT_DESCRIPTION_EVENT;}
1929
  bool write(IO_CACHE* file);
1930
  bool is_valid() const
1931
  {
1932
    return ((common_header_len >= ((binlog_version==1) ? OLD_HEADER_LEN :
1933
                                   LOG_EVENT_MINIMAL_HEADER_LEN)) &&
1934
            (post_header_len != NULL));
1935
  }
1936
  int get_data_size()
1937
  {
1938
    /*
1939
      The vector of post-header lengths is considered as part of the
1940
      post-header, because in a given version it never changes (contrary to the
1941
      query in a Query_log_event).
1942
    */
1943
    return FORMAT_DESCRIPTION_HEADER_LEN;
1944
  }
1945
1946
  void calc_server_version_split();
1947
1948
protected:
1949
  virtual int do_apply_event(Relay_log_info const *rli);
1950
  virtual int do_update_pos(Relay_log_info *rli);
1951
  virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
1952
};
1953
1954
/**
1955
  @class Xid_log_event
1956
1957
  Logs xid of the transaction-to-be-committed in the 2pc protocol.
1958
  Has no meaning in replication, slaves ignore it.
1959
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1960
  @section Xid_log_event_binary_format Binary Format
1 by brian
clean slate
1961
*/
1962
class Xid_log_event: public Log_event
1963
{
1964
 public:
1965
   my_xid xid;
1966
520.1.22 by Brian Aker
Second pass of thd cleanup
1967
  Xid_log_event(Session* session_arg, my_xid x): Log_event(session_arg,0,0), xid(x) {}
1 by brian
clean slate
1968
  void pack_info(Protocol* protocol);
1969
1970
  Xid_log_event(const char* buf,
1971
                const Format_description_log_event *description_event);
1972
  ~Xid_log_event() {}
1973
  Log_event_type get_type_code() { return XID_EVENT;}
1974
  int get_data_size() { return sizeof(xid); }
1975
  bool write(IO_CACHE* file);
1976
  bool is_valid() const { return 1; }
1977
1978
private:
1979
  virtual int do_apply_event(Relay_log_info const *rli);
1980
  enum_skip_reason do_shall_skip(Relay_log_info *rli);
1981
};
1982
1983
1984
/**
1985
  @class Stop_log_event
1986
1987
  @section Stop_log_event_binary_format Binary Format
1988
1989
  The Post-Header and Body for this event type are empty; it only has
1990
  the Common-Header.
1991
*/
1992
class Stop_log_event: public Log_event
1993
{
1994
public:
1995
  Stop_log_event() :Log_event()
1996
  {}
1997
1998
  Stop_log_event(const char* buf,
1999
                 const Format_description_log_event *description_event):
2000
    Log_event(buf, description_event)
2001
  {}
2002
  ~Stop_log_event() {}
2003
  Log_event_type get_type_code() { return STOP_EVENT;}
2004
  bool is_valid() const { return 1; }
2005
2006
private:
2007
  virtual int do_update_pos(Relay_log_info *rli);
520.9.3 by mordred
zomg. Solaris actually builds all the way!!!
2008
  virtual enum_skip_reason do_shall_skip(Relay_log_info *)
1 by brian
clean slate
2009
  {
2010
    /*
2011
      Events from ourself should be skipped, but they should not
2012
      decrease the slave skip counter.
2013
     */
2014
    if (this->server_id == ::server_id)
2015
      return Log_event::EVENT_SKIP_IGNORE;
2016
    else
2017
      return Log_event::EVENT_SKIP_NOT;
2018
  }
2019
};
2020
2021
/**
2022
  @class Rotate_log_event
2023
2024
  This will be deprecated when we move to using sequence ids.
2025
2026
  @section Rotate_log_event_binary_format Binary Format
2027
2028
  The Post-Header has one component:
2029
2030
  <table>
2031
  <caption>Post-Header for Rotate_log_event</caption>
2032
2033
  <tr>
2034
    <th>Name</th>
2035
    <th>Format</th>
2036
    <th>Description</th>
2037
  </tr>
2038
2039
  <tr>
2040
    <td>position</td>
2041
    <td>8 byte integer</td>
2042
    <td>The position within the binlog to rotate to.</td>
2043
  </tr>
2044
2045
  </table>
2046
2047
  The Body has one component:
2048
2049
  <table>
2050
  <caption>Body for Rotate_log_event</caption>
2051
2052
  <tr>
2053
    <th>Name</th>
2054
    <th>Format</th>
2055
    <th>Description</th>
2056
  </tr>
2057
2058
  <tr>
2059
    <td>new_log</td>
2060
    <td>variable length string without trailing zero, extending to the
2061
    end of the event (determined by the length field of the
2062
    Common-Header)
2063
    </td>
2064
    <td>Name of the binlog to rotate to.</td>
2065
  </tr>
2066
2067
  </table>
2068
*/
2069
2070
class Rotate_log_event: public Log_event
2071
{
2072
public:
2073
  enum {
2074
    DUP_NAME= 2 // if constructor should dup the string argument
2075
  };
656.1.42 by Monty Taylor
Changed a char * to a string.
2076
  std::string new_log_ident;
151 by Brian Aker
Ulonglong to uint64_t
2077
  uint64_t pos;
482 by Brian Aker
Remove uint.
2078
  uint32_t ident_len;
2079
  uint32_t flags;
1 by brian
clean slate
2080
  Rotate_log_event(const char* new_log_ident_arg,
656.1.42 by Monty Taylor
Changed a char * to a string.
2081
		               uint32_t ident_len_arg,
2082
		               uint64_t pos_arg, uint32_t flags);
1 by brian
clean slate
2083
  void pack_info(Protocol* protocol);
2084
482 by Brian Aker
Remove uint.
2085
  Rotate_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
2086
                   const Format_description_log_event* description_event);
2087
  Log_event_type get_type_code() { return ROTATE_EVENT;}
2088
  int get_data_size() { return  ident_len + ROTATE_HEADER_LEN;}
656.1.42 by Monty Taylor
Changed a char * to a string.
2089
  bool is_valid() const { return new_log_ident.size() != 0; }
1 by brian
clean slate
2090
  bool write(IO_CACHE* file);
2091
2092
private:
2093
  virtual int do_update_pos(Relay_log_info *rli);
2094
  virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2095
};
2096
2097
2098
/* the classes below are for the new LOAD DATA INFILE logging */
2099
2100
/**
2101
  @class Create_file_log_event
2102
2103
  @section Create_file_log_event_binary_format Binary Format
2104
*/
2105
2106
class Create_file_log_event: public Load_log_event
2107
{
2108
protected:
2109
  /*
2110
    Pretend we are Load event, so we can write out just
2111
    our Load part - used on the slave when writing event out to
2112
    SQL_LOAD-*.info file
2113
  */
2114
  bool fake_base;
2115
public:
481 by Brian Aker
Remove all of uchar.
2116
  unsigned char* block;
1 by brian
clean slate
2117
  const char *event_buf;
482 by Brian Aker
Remove uint.
2118
  uint32_t block_len;
2119
  uint32_t file_id;
1 by brian
clean slate
2120
  bool inited_from_old;
2121
520.1.22 by Brian Aker
Second pass of thd cleanup
2122
  Create_file_log_event(Session* session, sql_exchange* ex, const char* db_arg,
1 by brian
clean slate
2123
			const char* table_name_arg,
2124
			List<Item>& fields_arg,
2125
			enum enum_duplicates handle_dup, bool ignore,
482 by Brian Aker
Remove uint.
2126
			unsigned char* block_arg, uint32_t block_len_arg,
1 by brian
clean slate
2127
			bool using_trans);
2128
  void pack_info(Protocol* protocol);
2129
482 by Brian Aker
Remove uint.
2130
  Create_file_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
2131
                        const Format_description_log_event* description_event);
2132
  ~Create_file_log_event()
2133
  {
477 by Monty Taylor
Removed my_free(). It turns out that it had been def'd to ignore the flags passed to it in the second arg anyway. Gotta love that.
2134
    free((char*) event_buf);
1 by brian
clean slate
2135
  }
2136
2137
  Log_event_type get_type_code()
2138
  {
2139
    return fake_base ? Load_log_event::get_type_code() : CREATE_FILE_EVENT;
2140
  }
2141
  int get_data_size()
2142
  {
2143
    return (fake_base ? Load_log_event::get_data_size() :
2144
	    Load_log_event::get_data_size() +
2145
	    4 + 1 + block_len);
2146
  }
2147
  bool is_valid() const { return inited_from_old || block != 0; }
2148
  bool write_data_header(IO_CACHE* file);
2149
  bool write_data_body(IO_CACHE* file);
2150
  /*
2151
    Cut out Create_file extentions and
2152
    write it as Load event - used on the slave
2153
  */
2154
  bool write_base(IO_CACHE* file);
2155
2156
private:
2157
  virtual int do_apply_event(Relay_log_info const *rli);
2158
};
2159
2160
2161
/**
2162
  @class Append_block_log_event
2163
2164
  @section Append_block_log_event_binary_format Binary Format
2165
*/
2166
2167
class Append_block_log_event: public Log_event
2168
{
2169
public:
481 by Brian Aker
Remove all of uchar.
2170
  unsigned char* block;
482 by Brian Aker
Remove uint.
2171
  uint32_t block_len;
2172
  uint32_t file_id;
1 by brian
clean slate
2173
  /*
2174
    'db' is filled when the event is created in mysql_load() (the
2175
    event needs to have a 'db' member to be well filtered by
2176
    binlog-*-db rules). 'db' is not written to the binlog (it's not
2177
    used by Append_block_log_event::write()), so it can't be read in
2178
    the Append_block_log_event(const char* buf, int event_len)
2179
    constructor.  In other words, 'db' is used only for filtering by
2180
    binlog-*-db rules.  Create_file_log_event is different: it's 'db'
2181
    (which is inherited from Load_log_event) is written to the binlog
2182
    and can be re-read.
2183
  */
2184
  const char* db;
2185
520.1.22 by Brian Aker
Second pass of thd cleanup
2186
  Append_block_log_event(Session* session, const char* db_arg, unsigned char* block_arg,
482 by Brian Aker
Remove uint.
2187
			 uint32_t block_len_arg, bool using_trans);
1 by brian
clean slate
2188
  void pack_info(Protocol* protocol);
2189
  virtual int get_create_or_append() const;
2190
482 by Brian Aker
Remove uint.
2191
  Append_block_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
2192
                         const Format_description_log_event
2193
                         *description_event);
2194
  ~Append_block_log_event() {}
2195
  Log_event_type get_type_code() { return APPEND_BLOCK_EVENT;}
2196
  int get_data_size() { return  block_len + APPEND_BLOCK_HEADER_LEN ;}
2197
  bool is_valid() const { return block != 0; }
2198
  bool write(IO_CACHE* file);
2199
  const char* get_db() { return db; }
2200
2201
private:
2202
  virtual int do_apply_event(Relay_log_info const *rli);
2203
};
2204
2205
2206
/**
2207
  @class Delete_file_log_event
2208
2209
  @section Delete_file_log_event_binary_format Binary Format
2210
*/
2211
2212
class Delete_file_log_event: public Log_event
2213
{
2214
public:
482 by Brian Aker
Remove uint.
2215
  uint32_t file_id;
1 by brian
clean slate
2216
  const char* db; /* see comment in Append_block_log_event */
2217
520.1.22 by Brian Aker
Second pass of thd cleanup
2218
  Delete_file_log_event(Session* session, const char* db_arg, bool using_trans);
1 by brian
clean slate
2219
  void pack_info(Protocol* protocol);
2220
482 by Brian Aker
Remove uint.
2221
  Delete_file_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
2222
                        const Format_description_log_event* description_event);
2223
  ~Delete_file_log_event() {}
2224
  Log_event_type get_type_code() { return DELETE_FILE_EVENT;}
2225
  int get_data_size() { return DELETE_FILE_HEADER_LEN ;}
2226
  bool is_valid() const { return file_id != 0; }
2227
  bool write(IO_CACHE* file);
2228
  const char* get_db() { return db; }
2229
2230
private:
2231
  virtual int do_apply_event(Relay_log_info const *rli);
2232
};
2233
2234
2235
/**
2236
  @class Execute_load_log_event
2237
2238
  @section Delete_file_log_event_binary_format Binary Format
2239
*/
2240
2241
class Execute_load_log_event: public Log_event
2242
{
2243
public:
482 by Brian Aker
Remove uint.
2244
  uint32_t file_id;
1 by brian
clean slate
2245
  const char* db; /* see comment in Append_block_log_event */
2246
520.1.22 by Brian Aker
Second pass of thd cleanup
2247
  Execute_load_log_event(Session* session, const char* db_arg, bool using_trans);
1 by brian
clean slate
2248
  void pack_info(Protocol* protocol);
2249
482 by Brian Aker
Remove uint.
2250
  Execute_load_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
2251
                         const Format_description_log_event
2252
                         *description_event);
2253
  ~Execute_load_log_event() {}
2254
  Log_event_type get_type_code() { return EXEC_LOAD_EVENT;}
2255
  int get_data_size() { return  EXEC_LOAD_HEADER_LEN ;}
2256
  bool is_valid() const { return file_id != 0; }
2257
  bool write(IO_CACHE* file);
2258
  const char* get_db() { return db; }
2259
2260
private:
2261
  virtual int do_apply_event(Relay_log_info const *rli);
2262
};
2263
2264
2265
/**
2266
  @class Begin_load_query_log_event
2267
2268
  Event for the first block of file to be loaded, its only difference from
2269
  Append_block event is that this event creates or truncates existing file
2270
  before writing data.
2271
2272
  @section Begin_load_query_log_event_binary_format Binary Format
2273
*/
2274
class Begin_load_query_log_event: public Append_block_log_event
2275
{
2276
public:
520.1.22 by Brian Aker
Second pass of thd cleanup
2277
  Begin_load_query_log_event(Session* session_arg, const char *db_arg,
482 by Brian Aker
Remove uint.
2278
                             unsigned char* block_arg, uint32_t block_len_arg,
1 by brian
clean slate
2279
                             bool using_trans);
520.1.22 by Brian Aker
Second pass of thd cleanup
2280
  Begin_load_query_log_event(Session* session);
1 by brian
clean slate
2281
  int get_create_or_append() const;
482 by Brian Aker
Remove uint.
2282
  Begin_load_query_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
2283
                             const Format_description_log_event
2284
                             *description_event);
2285
  ~Begin_load_query_log_event() {}
2286
  Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; }
2287
private:
2288
  virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2289
};
2290
2291
2292
/*
2293
  Elements of this enum describe how LOAD DATA handles duplicates.
2294
*/
2295
enum enum_load_dup_handling { LOAD_DUP_ERROR= 0, LOAD_DUP_IGNORE,
2296
                              LOAD_DUP_REPLACE };
2297
2298
/**
2299
  @class Execute_load_query_log_event
2300
2301
  Event responsible for LOAD DATA execution, it similar to Query_log_event
2302
  but before executing the query it substitutes original filename in LOAD DATA
2303
  query with name of temporary file.
2304
2305
  @section Execute_load_query_log_event_binary_format Binary Format
2306
*/
2307
class Execute_load_query_log_event: public Query_log_event
2308
{
2309
public:
482 by Brian Aker
Remove uint.
2310
  uint32_t file_id;       // file_id of temporary file
2311
  uint32_t fn_pos_start;  // pointer to the part of the query that should
1 by brian
clean slate
2312
                      // be substituted
482 by Brian Aker
Remove uint.
2313
  uint32_t fn_pos_end;    // pointer to the end of this part of query
1 by brian
clean slate
2314
  /*
2315
    We have to store type of duplicate handling explicitly, because
2316
    for LOAD DATA it also depends on LOCAL option. And this part
2317
    of query will be rewritten during replication so this information
2318
    may be lost...
2319
  */
2320
  enum_load_dup_handling dup_handling;
2321
520.1.22 by Brian Aker
Second pass of thd cleanup
2322
  Execute_load_query_log_event(Session* session, const char* query_arg,
482 by Brian Aker
Remove uint.
2323
                               ulong query_length, uint32_t fn_pos_start_arg,
2324
                               uint32_t fn_pos_end_arg,
1 by brian
clean slate
2325
                               enum_load_dup_handling dup_handling_arg,
2326
                               bool using_trans, bool suppress_use,
520.1.21 by Brian Aker
THD -> Session rename
2327
                               Session::killed_state
2328
                               killed_err_arg= Session::KILLED_NO_VALUE);
1 by brian
clean slate
2329
  void pack_info(Protocol* protocol);
482 by Brian Aker
Remove uint.
2330
  Execute_load_query_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
2331
                               const Format_description_log_event
2332
                               *description_event);
2333
  ~Execute_load_query_log_event() {}
2334
2335
  Log_event_type get_type_code() { return EXECUTE_LOAD_QUERY_EVENT; }
2336
  bool is_valid() const { return Query_log_event::is_valid() && file_id != 0; }
2337
2338
  ulong get_post_header_size_for_derived();
2339
  bool write_post_header_for_derived(IO_CACHE* file);
2340
2341
private:
2342
  virtual int do_apply_event(Relay_log_info const *rli);
438.1.10 by Brian Aker
Removed binlog tool (we need to rewrite it) and removed all the hooks for
2343
};
2344
2345
482 by Brian Aker
Remove uint.
2346
char *str_to_hex(char *to, const char *from, uint32_t len);
1 by brian
clean slate
2347
2348
/**
2349
  @class Table_map_log_event
2350
2351
  In row-based mode, every row operation event is preceded by a
2352
  Table_map_log_event which maps a table definition to a number.  The
2353
  table definition consists of database name, table name, and column
2354
  definitions.
2355
2356
  @section Table_map_log_event_binary_format Binary Format
2357
2358
  The Post-Header has the following components:
2359
2360
  <table>
2361
  <caption>Post-Header for Table_map_log_event</caption>
2362
2363
  <tr>
2364
    <th>Name</th>
2365
    <th>Format</th>
2366
    <th>Description</th>
2367
  </tr>
2368
2369
  <tr>
2370
    <td>table_id</td>
2371
    <td>6 bytes unsigned integer</td>
2372
    <td>The number that identifies the table.</td>
2373
  </tr>
2374
2375
  <tr>
2376
    <td>flags</td>
2377
    <td>2 byte bitfield</td>
2378
    <td>Reserved for future use; currently always 0.</td>
2379
  </tr>
2380
2381
  </table>
2382
2383
  The Body has the following components:
2384
2385
  <table>
2386
  <caption>Body for Table_map_log_event</caption>
2387
2388
  <tr>
2389
    <th>Name</th>
2390
    <th>Format</th>
2391
    <th>Description</th>
2392
  </tr>
2393
2394
  <tr>
2395
    <td>database_name</td>
2396
    <td>one byte string length, followed by null-terminated string</td>
2397
    <td>The name of the database in which the table resides.  The name
2398
    is represented as a one byte unsigned integer representing the
2399
    number of bytes in the name, followed by length bytes containing
2400
    the database name, followed by a terminating 0 byte.  (Note the
2401
    redundancy in the representation of the length.)  </td>
2402
  </tr>
2403
2404
  <tr>
2405
    <td>table_name</td>
2406
    <td>one byte string length, followed by null-terminated string</td>
2407
    <td>The name of the table, encoded the same way as the database
2408
    name above.</td>
2409
  </tr>
2410
2411
  <tr>
2412
    <td>column_count</td>
2413
    <td>@ref packed_integer "Packed Integer"</td>
2414
    <td>The number of columns in the table, represented as a packed
2415
    variable-length integer.</td>
2416
  </tr>
2417
2418
  <tr>
2419
    <td>column_type</td>
2420
    <td>List of column_count 1 byte enumeration values</td>
2421
    <td>The type of each column in the table, listed from left to
2422
    right.  Each byte is mapped to a column type according to the
2423
    enumeration type enum_field_types defined in mysql_com.h.  The
2424
    mapping of types to numbers is listed in the table @ref
2425
    Table_table_map_log_event_column_types "below" (along with
2426
    description of the associated metadata field).  </td>
2427
  </tr>
2428
2429
  <tr>
2430
    <td>metadata_length</td>
2431
    <td>@ref packed_integer "Packed Integer"</td>
2432
    <td>The length of the following metadata block</td>
2433
  </tr>
2434
2435
  <tr>
2436
    <td>metadata</td>
2437
    <td>list of metadata for each column</td>
2438
    <td>For each column from left to right, a chunk of data who's
2439
    length and semantics depends on the type of the column.  The
2440
    length and semantics for the metadata for each column are listed
2441
    in the table @ref Table_table_map_log_event_column_types
2442
    "below".</td>
2443
  </tr>
2444
2445
  <tr>
2446
    <td>null_bits</td>
2447
    <td>column_count bits, rounded up to nearest byte</td>
2448
    <td>For each column, a bit indicating whether data in the column
2449
    can be NULL or not.  The number of bytes needed for this is
2450
    int((column_count+7)/8).  The flag for the first column from the
2451
    left is in the least-significant bit of the first byte, the second
2452
    is in the second least significant bit of the first byte, the
2453
    ninth is in the least significant bit of the second byte, and so
2454
    on.  </td>
2455
  </tr>
2456
2457
  </table>
2458
2459
  The table below lists all column types, along with the numerical
2460
  identifier for it and the size and interpretation of meta-data used
2461
  to describe the type.
2462
2463
  @anchor Table_table_map_log_event_column_types
2464
  <table>
2465
  <caption>Table_map_log_event column types: numerical identifier and
2466
  metadata</caption>
2467
  <tr>
2468
    <th>Name</th>
2469
    <th>Identifier</th>
2470
    <th>Size of metadata in bytes</th>
2471
    <th>Description of metadata</th>
2472
  </tr>
2473
2474
  <tr>
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
2475
    <td>DRIZZLE_TYPE_TINY</td><td>1</td>
2476
    <td>0</td>
2477
    <td>No column metadata.</td>
2478
  </tr>
2479
2480
  <tr>
2481
    <td>DRIZZLE_TYPE_SHORT</td><td>2</td>
2482
    <td>0</td>
2483
    <td>No column metadata.</td>
2484
  </tr>
2485
2486
  <tr>
2487
    <td>DRIZZLE_TYPE_LONG</td><td>3</td>
2488
    <td>0</td>
2489
    <td>No column metadata.</td>
2490
  </tr>
2491
2492
  <tr>
2493
    <td>DRIZZLE_TYPE_DOUBLE</td><td>5</td>
1 by brian
clean slate
2494
    <td>1 byte</td>
2495
    <td>1 byte unsigned integer, representing the "pack_length", which
2496
    is equal to sizeof(double) on the server from which the event
2497
    originates.</td>
2498
  </tr>
2499
2500
  <tr>
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
2501
    <td>DRIZZLE_TYPE_NULL</td><td>6</td>
2502
    <td>0</td>
2503
    <td>No column metadata.</td>
2504
  </tr>
2505
2506
  <tr>
2507
    <td>DRIZZLE_TYPE_TIMESTAMP</td><td>7</td>
2508
    <td>0</td>
2509
    <td>No column metadata.</td>
2510
  </tr>
2511
2512
  <tr>
2513
    <td>DRIZZLE_TYPE_LONGLONG</td><td>8</td>
2514
    <td>0</td>
2515
    <td>No column metadata.</td>
2516
  </tr>
2517
2518
  <tr>
2519
    <td>DRIZZLE_TYPE_DATE</td><td>10</td>
2520
    <td>0</td>
2521
    <td>No column metadata.</td>
2522
  </tr>
2523
2524
  <tr>
2525
    <td>DRIZZLE_TYPE_TIME</td><td>11</td>
2526
    <td>0</td>
2527
    <td>No column metadata.</td>
2528
  </tr>
2529
2530
  <tr>
2531
    <td>DRIZZLE_TYPE_DATETIME</td><td>12</td>
2532
    <td>0</td>
2533
    <td>No column metadata.</td>
2534
  </tr>
2535
2536
  <tr>
2537
    <td>DRIZZLE_TYPE_YEAR</td><td>13</td>
2538
    <td>0</td>
2539
    <td>No column metadata.</td>
2540
  </tr>
2541
2542
  <tr>
575.5.1 by David Axmark
Changed NEWDATE to DATE. One failing test but I think its somewhere else in the code
2543
    <td><i>DRIZZLE_TYPE_DATE</i></td><td><i>14</i></td>
1 by brian
clean slate
2544
    <td>&ndash;</td>
2545
    <td><i>This enumeration value is only used internally and cannot
2546
    exist in a binlog.</i></td>
2547
  </tr>
2548
2549
  <tr>
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
2550
    <td>DRIZZLE_TYPE_VARCHAR</td><td>15</td>
1 by brian
clean slate
2551
    <td>2 bytes</td>
2552
    <td>2 byte unsigned integer representing the maximum length of
2553
    the string.</td>
2554
  </tr>
2555
2556
  <tr>
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
2557
    <td>DRIZZLE_TYPE_NEWDECIMAL</td><td>246</td>
1 by brian
clean slate
2558
    <td>2 bytes</td>
2559
    <td>A 1 byte unsigned int representing the precision, followed
2560
    by a 1 byte unsigned int representing the number of decimals.</td>
2561
  </tr>
2562
2563
  <tr>
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
2564
    <td><i>DRIZZLE_TYPE_ENUM</i></td><td><i>247</i></td>
2565
    <td>&ndash;</td>
2566
    <td><i>This enumeration value is only used internally and cannot
2567
    exist in a binlog.</i></td>
2568
  </tr>
2569
2570
  <tr>
2571
    <td><i>DRIZZLE_TYPE_SET</i></td><td><i>248</i></td>
2572
    <td>&ndash;</td>
2573
    <td><i>This enumeration value is only used internally and cannot
2574
    exist in a binlog.</i></td>
2575
  </tr>
2576
2577
  <tr>
2578
    <td>DRIZZLE_TYPE_BLOB</td><td>252</td>
1 by brian
clean slate
2579
    <td>1 byte</td>
2580
    <td>The pack length, i.e., the number of bytes needed to represent
2581
    the length of the blob: 1, 2, 3, or 4.</td>
2582
  </tr>
2583
2584
  <tr>
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
2585
    <td>DRIZZLE_TYPE_STRING</td><td>254</td>
1 by brian
clean slate
2586
    <td>2 bytes</td>
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
2587
    <td>The first byte is always DRIZZLE_TYPE_VAR_STRING (i.e., 253).
1 by brian
clean slate
2588
    The second byte is the field size, i.e., the number of bytes in
2589
    the representation of size of the string: 3 or 4.</td>
2590
  </tr>
2591
2592
  </table>
2593
*/
2594
class Table_map_log_event : public Log_event
2595
{
2596
public:
2597
  /* Constants */
2598
  enum
2599
  {
2600
    TYPE_CODE = TABLE_MAP_EVENT
2601
  };
2602
2603
  /**
2604
     Enumeration of the errors that can be returned.
2605
   */
2606
  enum enum_error
2607
  {
2608
    ERR_OPEN_FAILURE = -1,               /**< Failure to open table */
2609
    ERR_OK = 0,                                 /**< No error */
2610
    ERR_TABLE_LIMIT_EXCEEDED = 1,      /**< No more room for tables */
2611
    ERR_OUT_OF_MEM = 2,                         /**< Out of memory */
2612
    ERR_BAD_TABLE_DEF = 3,     /**< Table definition does not match */
2613
    ERR_RBR_TO_SBR = 4  /**< daisy-chanining RBR to SBR not allowed */
2614
  };
2615
2616
  enum enum_flag
2617
  {
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2618
    /*
1 by brian
clean slate
2619
       Nothing here right now, but the flags support is there in
2620
       preparation for changes that are coming.  Need to add a
2621
       constant to make it compile under HP-UX: aCC does not like
2622
       empty enumerations.
2623
    */
2624
    ENUM_FLAG_COUNT
2625
  };
2626
206 by Brian Aker
Removed final uint dead types.
2627
  typedef uint16_t flag_set;
1 by brian
clean slate
2628
2629
  /* Special constants representing sets of flags */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2630
  enum
1 by brian
clean slate
2631
  {
2632
    TM_NO_FLAGS = 0U
2633
  };
2634
2635
  void set_flags(flag_set flag) { m_flags |= flag; }
2636
  void clear_flags(flag_set flag) { m_flags &= ~flag; }
2637
  flag_set get_flags(flag_set flag) const { return m_flags & flag; }
2638
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2639
  Table_map_log_event(Session *session, Table *tbl, ulong tid,
206 by Brian Aker
Removed final uint dead types.
2640
		      bool is_transactional, uint16_t flags);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2641
  Table_map_log_event(const char *buf, uint32_t event_len,
1 by brian
clean slate
2642
                      const Format_description_log_event *description_event);
2643
2644
  ~Table_map_log_event();
2645
2646
  virtual Log_event_type get_type_code() { return TABLE_MAP_EVENT; }
2647
  virtual bool is_valid() const { return m_memory != NULL; /* we check malloc */ }
2648
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2649
  virtual int get_data_size() { return m_data_size; }
1 by brian
clean slate
2650
  virtual int save_field_metadata();
2651
  virtual bool write_data_header(IO_CACHE *file);
2652
  virtual bool write_data_body(IO_CACHE *file);
2653
  virtual const char *get_db() { return m_dbnam; }
2654
  virtual void pack_info(Protocol *protocol);
2655
2656
private:
2657
  virtual int do_apply_event(Relay_log_info const *rli);
2658
  virtual int do_update_pos(Relay_log_info *rli);
2659
  virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2660
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2661
  Table         *m_table;
1 by brian
clean slate
2662
  char const    *m_dbnam;
2663
  size_t         m_dblen;
2664
  char const    *m_tblnam;
2665
  size_t         m_tbllen;
2666
  ulong          m_colcnt;
481 by Brian Aker
Remove all of uchar.
2667
  unsigned char         *m_coltype;
1 by brian
clean slate
2668
481 by Brian Aker
Remove all of uchar.
2669
  unsigned char         *m_memory;
1 by brian
clean slate
2670
  ulong          m_table_id;
2671
  flag_set       m_flags;
2672
2673
  size_t         m_data_size;
2674
481 by Brian Aker
Remove all of uchar.
2675
  unsigned char          *m_field_metadata;        // buffer for field metadata
1 by brian
clean slate
2676
  /*
2677
    The size of field metadata buffer set by calling save_field_metadata()
2678
  */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2679
  ulong          m_field_metadata_size;
481 by Brian Aker
Remove all of uchar.
2680
  unsigned char         *m_null_bits;
2681
  unsigned char         *m_meta_memory;
1 by brian
clean slate
2682
};
2683
2684
2685
/**
2686
  @class Rows_log_event
2687
2688
 Common base class for all row-containing log events.
2689
2690
 RESPONSIBILITIES
2691
2692
   Encode the common parts of all events containing rows, which are:
2693
   - Write data header and data body to an IO_CACHE.
2694
   - Provide an interface for adding an individual row to the event.
2695
2696
  @section Rows_log_event_binary_format Binary Format
2697
*/
2698
2699
2700
class Rows_log_event : public Log_event
2701
{
2702
public:
2703
  /**
2704
     Enumeration of the errors that can be returned.
2705
   */
2706
  enum enum_error
2707
  {
2708
    ERR_OPEN_FAILURE = -1,               /**< Failure to open table */
2709
    ERR_OK = 0,                                 /**< No error */
2710
    ERR_TABLE_LIMIT_EXCEEDED = 1,      /**< No more room for tables */
2711
    ERR_OUT_OF_MEM = 2,                         /**< Out of memory */
2712
    ERR_BAD_TABLE_DEF = 3,     /**< Table definition does not match */
2713
    ERR_RBR_TO_SBR = 4  /**< daisy-chanining RBR to SBR not allowed */
2714
  };
2715
2716
  /*
2717
    These definitions allow you to combine the flags into an
2718
    appropriate flag set using the normal bitwise operators.  The
2719
    implicit conversion from an enum-constant to an integer is
2720
    accepted by the compiler, which is then used to set the real set
2721
    of flags.
2722
  */
2723
  enum enum_flag
2724
  {
2725
    /* Last event of a statement */
2726
    STMT_END_F = (1U << 0),
2727
520.1.22 by Brian Aker
Second pass of thd cleanup
2728
    /* Value of the OPTION_NO_FOREIGN_KEY_CHECKS flag in session->options */
1 by brian
clean slate
2729
    NO_FOREIGN_KEY_CHECKS_F = (1U << 1),
2730
520.1.22 by Brian Aker
Second pass of thd cleanup
2731
    /* Value of the OPTION_RELAXED_UNIQUE_CHECKS flag in session->options */
1 by brian
clean slate
2732
    RELAXED_UNIQUE_CHECKS_F = (1U << 2),
2733
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2734
    /**
1 by brian
clean slate
2735
      Indicates that rows in this event are complete, that is contain
2736
      values for all columns of the table.
2737
     */
2738
    COMPLETE_ROWS_F = (1U << 3)
2739
  };
2740
206 by Brian Aker
Removed final uint dead types.
2741
  typedef uint16_t flag_set;
1 by brian
clean slate
2742
2743
  /* Special constants representing sets of flags */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2744
  enum
1 by brian
clean slate
2745
  {
2746
      RLE_NO_FLAGS = 0U
2747
  };
2748
2749
  virtual ~Rows_log_event();
2750
2751
  void set_flags(flag_set flags_arg) { m_flags |= flags_arg; }
2752
  void clear_flags(flag_set flags_arg) { m_flags &= ~flags_arg; }
2753
  flag_set get_flags(flag_set flags_arg) const { return m_flags & flags_arg; }
2754
2755
  virtual void pack_info(Protocol *protocol);
438.1.10 by Brian Aker
Removed binlog tool (we need to rewrite it) and removed all the hooks for
2756
481 by Brian Aker
Remove all of uchar.
2757
  int add_row_data(unsigned char *data, size_t length)
1 by brian
clean slate
2758
  {
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2759
    return do_add_row_data(data,length);
1 by brian
clean slate
2760
  }
2761
2762
  /* Member functions to implement superclass interface */
2763
  virtual int get_data_size();
2764
2765
  MY_BITMAP const *get_cols() const { return &m_cols; }
2766
  size_t get_width() const          { return m_width; }
2767
  ulong get_table_id() const        { return m_table_id; }
2768
2769
  virtual bool write_data_header(IO_CACHE *file);
2770
  virtual bool write_data_body(IO_CACHE *file);
2771
  virtual const char *get_db() { return m_table->s->db.str; }
2772
  /*
2773
    Check that malloc() succeeded in allocating memory for the rows
2774
    buffer and the COLS vector. Checking that an Update_rows_log_event
2775
    is valid is done in the Update_rows_log_event::is_valid()
2776
    function.
2777
  */
2778
  virtual bool is_valid() const
2779
  {
2780
    return m_rows_buf && m_cols.bitmap;
2781
  }
2782
482 by Brian Aker
Remove uint.
2783
  uint32_t     m_row_count;         /* The number of rows added to the event */
1 by brian
clean slate
2784
2785
protected:
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2786
  /*
1 by brian
clean slate
2787
     The constructors are protected since you're supposed to inherit
2788
     this class, not create instances of this class.
2789
  */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2790
  Rows_log_event(Session*, Table*, ulong table_id,
1 by brian
clean slate
2791
		 MY_BITMAP const *cols, bool is_transactional);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2792
  Rows_log_event(const char *row_data, uint32_t event_len,
1 by brian
clean slate
2793
		 Log_event_type event_type,
2794
		 const Format_description_log_event *description_event);
2795
481 by Brian Aker
Remove all of uchar.
2796
  virtual int do_add_row_data(unsigned char *data, size_t length);
1 by brian
clean slate
2797
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2798
  Table *m_table;		/* The table the rows belong to */
1 by brian
clean slate
2799
  ulong       m_table_id;	/* Table ID */
2800
  MY_BITMAP   m_cols;		/* Bitmap denoting columns available */
2801
  ulong       m_width;          /* The width of the columns bitmap */
2802
  /*
2803
    Bitmap for columns available in the after image, if present. These
2804
    fields are only available for Update_rows events. Observe that the
2805
    width of both the before image COLS vector and the after image
2806
    COLS vector is the same: the number of columns of the table on the
2807
    master.
2808
  */
2809
  MY_BITMAP   m_cols_ai;
2810
2811
  ulong       m_master_reclength; /* Length of record on master side */
2812
2813
  /* Bit buffers in the same memory as the class */
205 by Brian Aker
uint32 -> uin32_t
2814
  uint32_t    m_bitbuf[128/(sizeof(uint32_t)*8)];
2815
  uint32_t    m_bitbuf_ai[128/(sizeof(uint32_t)*8)];
1 by brian
clean slate
2816
481 by Brian Aker
Remove all of uchar.
2817
  unsigned char    *m_rows_buf;		/* The rows in packed format */
2818
  unsigned char    *m_rows_cur;		/* One-after the end of the data */
2819
  unsigned char    *m_rows_end;		/* One-after the end of the allocated space */
1 by brian
clean slate
2820
2821
  flag_set m_flags;		/* Flags for row-level events */
2822
2823
  /* helper functions */
2824
481 by Brian Aker
Remove all of uchar.
2825
  const unsigned char *m_curr_row;     /* Start of the row being processed */
2826
  const unsigned char *m_curr_row_end; /* One-after the end of the current row */
2827
  unsigned char    *m_key;      /* Buffer to keep key value during searches */
1 by brian
clean slate
2828
2829
  int find_row(const Relay_log_info *const);
2830
  int write_row(const Relay_log_info *const, const bool);
2831
2832
  // Unpack the current row into m_table->record[0]
2833
  int unpack_current_row(const Relay_log_info *const rli,
550 by Monty Taylor
Moved error.h into just the files that need it.
2834
                         MY_BITMAP const *cols);
1 by brian
clean slate
2835
2836
private:
2837
2838
  virtual int do_apply_event(Relay_log_info const *rli);
2839
  virtual int do_update_pos(Relay_log_info *rli);
2840
  virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
2841
2842
  /*
2843
    Primitive to prepare for a sequence of row executions.
2844
2845
    DESCRIPTION
2846
2847
      Before doing a sequence of do_prepare_row() and do_exec_row()
2848
      calls, this member function should be called to prepare for the
2849
      entire sequence. Typically, this member function will allocate
2850
      space for any buffers that are needed for the two member
2851
      functions mentioned above.
2852
2853
    RETURN VALUE
2854
2855
      The member function will return 0 if all went OK, or a non-zero
2856
      error code otherwise.
2857
  */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2858
  virtual
1 by brian
clean slate
2859
  int do_before_row_operations(const Slave_reporting_capability *const log) = 0;
2860
2861
  /*
2862
    Primitive to clean up after a sequence of row executions.
2863
2864
    DESCRIPTION
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2865
1 by brian
clean slate
2866
      After doing a sequence of do_prepare_row() and do_exec_row(),
2867
      this member function should be called to clean up and release
2868
      any allocated buffers.
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2869
1 by brian
clean slate
2870
      The error argument, if non-zero, indicates an error which happened during
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2871
      row processing before this function was called. In this case, even if
1 by brian
clean slate
2872
      function is successful, it should return the error code given in the argument.
2873
  */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2874
  virtual
1 by brian
clean slate
2875
  int do_after_row_operations(const Slave_reporting_capability *const log,
2876
                              int error) = 0;
2877
2878
  /*
2879
    Primitive to do the actual execution necessary for a row.
2880
2881
    DESCRIPTION
2882
      The member function will do the actual execution needed to handle a row.
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2883
      The row is located at m_curr_row. When the function returns,
1 by brian
clean slate
2884
      m_curr_row_end should point at the next row (one byte after the end
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2885
      of the current row).
1 by brian
clean slate
2886
2887
    RETURN VALUE
2888
      0 if execution succeeded, 1 if execution failed.
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2889
1 by brian
clean slate
2890
  */
2891
  virtual int do_exec_row(const Relay_log_info *const rli) = 0;
2892
2893
  friend class Old_rows_log_event;
2894
};
2895
2896
/**
2897
  @class Write_rows_log_event
2898
2899
  Log row insertions and updates. The event contain several
2900
  insert/update rows for a table. Note that each event contains only
2901
  rows for one table.
2902
2903
  @section Write_rows_log_event_binary_format Binary Format
2904
*/
2905
class Write_rows_log_event : public Rows_log_event
2906
{
2907
public:
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2908
  enum
1 by brian
clean slate
2909
  {
520.1.21 by Brian Aker
THD -> Session rename
2910
    /* Support interface to Session::binlog_prepare_pending_rows_event */
1 by brian
clean slate
2911
    TYPE_CODE = WRITE_ROWS_EVENT
2912
  };
2913
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2914
  Write_rows_log_event(Session*, Table*, ulong table_id,
1 by brian
clean slate
2915
		       bool is_transactional);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2916
  Write_rows_log_event(const char *buf, uint32_t event_len,
1 by brian
clean slate
2917
                       const Format_description_log_event *description_event);
2918
2919
private:
2920
  virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; }
2921
2922
  virtual int do_before_row_operations(const Slave_reporting_capability *const);
2923
  virtual int do_after_row_operations(const Slave_reporting_capability *const,int);
2924
  virtual int do_exec_row(const Relay_log_info *const);
2925
};
2926
2927
2928
/**
2929
  @class Update_rows_log_event
2930
2931
  Log row updates with a before image. The event contain several
2932
  update rows for a table. Note that each event contains only rows for
2933
  one table.
2934
2935
  Also note that the row data consists of pairs of row data: one row
2936
  for the old data and one row for the new data.
2937
2938
  @section Update_rows_log_event_binary_format Binary Format
2939
*/
2940
class Update_rows_log_event : public Rows_log_event
2941
{
2942
public:
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2943
  enum
1 by brian
clean slate
2944
  {
520.1.21 by Brian Aker
THD -> Session rename
2945
    /* Support interface to Session::binlog_prepare_pending_rows_event */
1 by brian
clean slate
2946
    TYPE_CODE = UPDATE_ROWS_EVENT
2947
  };
2948
520.1.21 by Brian Aker
THD -> Session rename
2949
  Update_rows_log_event(Session*, Table*, ulong table_id,
1 by brian
clean slate
2950
                        bool is_transactional);
2951
2952
  void init(MY_BITMAP const *cols);
2953
2954
  virtual ~Update_rows_log_event();
2955
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2956
  Update_rows_log_event(const char *buf, uint32_t event_len,
1 by brian
clean slate
2957
			const Format_description_log_event *description_event);
2958
2959
  virtual bool is_valid() const
2960
  {
2961
    return Rows_log_event::is_valid() && m_cols_ai.bitmap;
2962
  }
2963
2964
protected:
2965
  virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; }
2966
2967
  virtual int do_before_row_operations(const Slave_reporting_capability *const);
2968
  virtual int do_after_row_operations(const Slave_reporting_capability *const,int);
2969
  virtual int do_exec_row(const Relay_log_info *const);
2970
};
2971
2972
/**
2973
  @class Delete_rows_log_event
2974
2975
  Log row deletions. The event contain several delete rows for a
2976
  table. Note that each event contains only rows for one table.
2977
2978
  RESPONSIBILITIES
2979
2980
    - Act as a container for rows that has been deleted on the master
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2981
      and should be deleted on the slave.
1 by brian
clean slate
2982
2983
  COLLABORATION
2984
2985
    Row_writer
2986
      Create the event and add rows to the event.
2987
    Row_reader
2988
      Extract the rows from the event.
2989
2990
  @section Delete_rows_log_event_binary_format Binary Format
2991
*/
2992
class Delete_rows_log_event : public Rows_log_event
2993
{
2994
public:
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2995
  enum
1 by brian
clean slate
2996
  {
520.1.21 by Brian Aker
THD -> Session rename
2997
    /* Support interface to Session::binlog_prepare_pending_rows_event */
1 by brian
clean slate
2998
    TYPE_CODE = DELETE_ROWS_EVENT
2999
  };
3000
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
3001
  Delete_rows_log_event(Session*, Table*, ulong,
1 by brian
clean slate
3002
			bool is_transactional);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
3003
  Delete_rows_log_event(const char *buf, uint32_t event_len,
1 by brian
clean slate
3004
			const Format_description_log_event *description_event);
3005
protected:
3006
  virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; }
3007
3008
  virtual int do_before_row_operations(const Slave_reporting_capability *const);
3009
  virtual int do_after_row_operations(const Slave_reporting_capability *const,int);
3010
  virtual int do_exec_row(const Relay_log_info *const);
3011
};
3012
3013
3014
/**
3015
  @class Incident_log_event
3016
3017
   Class representing an incident, an occurance out of the ordinary,
3018
   that happened on the master.
3019
3020
   The event is used to inform the slave that something out of the
3021
   ordinary happened on the master that might cause the database to be
3022
   in an inconsistent state.
3023
3024
   <table id="IncidentFormat">
3025
   <caption>Incident event format</caption>
3026
   <tr>
3027
     <th>Symbol</th>
3028
     <th>Format</th>
3029
     <th>Description</th>
3030
   </tr>
3031
   <tr>
3032
     <td>INCIDENT</td>
3033
     <td align="right">2</td>
3034
     <td>Incident number as an unsigned integer</td>
3035
   </tr>
3036
   <tr>
3037
     <td>MSGLEN</td>
3038
     <td align="right">1</td>
3039
     <td>Message length as an unsigned integer</td>
3040
   </tr>
3041
   <tr>
3042
     <td>MESSAGE</td>
3043
     <td align="right">MSGLEN</td>
3044
     <td>The message, if present. Not null terminated.</td>
3045
   </tr>
3046
   </table>
3047
3048
  @section Delete_rows_log_event_binary_format Binary Format
3049
*/
3050
class Incident_log_event : public Log_event {
3051
public:
520.1.22 by Brian Aker
Second pass of thd cleanup
3052
  Incident_log_event(Session *session_arg, Incident incident)
3053
    : Log_event(session_arg, 0, false), m_incident(incident)
1 by brian
clean slate
3054
  {
3055
    m_message.str= NULL;                    /* Just as a precaution */
3056
    m_message.length= 0;
51.1.31 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3057
    return;
1 by brian
clean slate
3058
  }
3059
520.1.22 by Brian Aker
Second pass of thd cleanup
3060
  Incident_log_event(Session *session_arg, Incident incident, LEX_STRING const msg)
3061
    : Log_event(session_arg, 0, false), m_incident(incident)
1 by brian
clean slate
3062
  {
3063
    m_message= msg;
51.1.31 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3064
    return;
1 by brian
clean slate
3065
  }
3066
3067
  void pack_info(Protocol*);
3068
482 by Brian Aker
Remove uint.
3069
  Incident_log_event(const char *buf, uint32_t event_len,
1 by brian
clean slate
3070
                     const Format_description_log_event *descr_event);
3071
3072
  virtual ~Incident_log_event();
3073
3074
  virtual int do_apply_event(Relay_log_info const *rli);
3075
3076
  virtual bool write_data_header(IO_CACHE *file);
3077
  virtual bool write_data_body(IO_CACHE *file);
3078
3079
  virtual Log_event_type get_type_code() { return INCIDENT_EVENT; }
3080
3081
  virtual bool is_valid() const { return 1; }
3082
  virtual int get_data_size() {
3083
    return INCIDENT_HEADER_LEN + 1 + m_message.length;
3084
  }
3085
3086
private:
3087
  const char *description() const;
3088
3089
  Incident m_incident;
3090
  LEX_STRING m_message;
3091
};
3092
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
3093
int append_query_string(const CHARSET_INFO * const csinfo,
243.1.5 by Jay Pipes
* Pulled the remainder of the log and parse stuff out into
3094
                        String const *from, String *to);
3095
1 by brian
clean slate
3096
static inline bool copy_event_cache_to_file_and_reinit(IO_CACHE *cache,
3097
                                                       FILE *file)
3098
{
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
3099
  return
1 by brian
clean slate
3100
    my_b_copy_to_file(cache, file) ||
51.1.31 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3101
    reinit_io_cache(cache, WRITE_CACHE, 0, false, true);
1 by brian
clean slate
3102
}
3103
3104
/*****************************************************************************
3105
3106
  Heartbeat Log Event class
3107
3108
  Replication event to ensure to slave that master is alive.
3109
  The event is originated by master's dump thread and sent straight to
3110
  slave without being logged. Slave itself does not store it in relay log
3111
  but rather uses a data for immediate checks and throws away the event.
3112
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
3113
  Two members of the class log_ident and Log_event::log_pos comprise
1 by brian
clean slate
3114
  @see the event_coordinates instance. The coordinates that a heartbeat
3115
  instance carries correspond to the last event master has sent from
3116
  its binlog.
3117
3118
 ****************************************************************************/
3119
class Heartbeat_log_event: public Log_event
3120
{
3121
public:
482 by Brian Aker
Remove uint.
3122
  Heartbeat_log_event(const char* buf, uint32_t event_len,
1 by brian
clean slate
3123
                      const Format_description_log_event* description_event);
3124
  Log_event_type get_type_code() { return HEARTBEAT_LOG_EVENT; }
3125
  bool is_valid() const
3126
    {
3127
      return (log_ident != NULL &&
3128
              log_pos >= BIN_LOG_HEADER_SIZE);
3129
    }
3130
  const char * get_log_ident() { return log_ident; }
482 by Brian Aker
Remove uint.
3131
  uint32_t get_ident_len() { return ident_len; }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
3132
1 by brian
clean slate
3133
private:
3134
  const char* log_ident;
482 by Brian Aker
Remove uint.
3135
  uint32_t ident_len;
1 by brian
clean slate
3136
};
3137
3138
/**
3139
  @} (end of group Replication)
3140
*/
3141
490 by Brian Aker
More effort around master.info (and relay.info)
3142
#endif /* DRIZZLED_LOG_EVENT_H */