~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/log.cc

  • Committer: Grant Limberg
  • Date: 2008-08-12 21:13:01 UTC
  • mto: (322.1.1 codestyle)
  • mto: This revision was merged to the branch mainline in revision 324.
  • Revision ID: grant@glsoftware.net-20080812211301-ym3wsowelkgp16s2
renamed all instances of MYSQL_ to DRIZZLE_

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
 
46
46
LOGGER logger;
47
47
 
48
 
MYSQL_BIN_LOG mysql_bin_log;
 
48
DRIZZLE_BIN_LOG mysql_bin_log;
49
49
ulong sync_binlog_counter= 0;
50
50
 
51
51
static bool test_if_number(const char *str,
228
228
}
229
229
 
230
230
 
231
 
/** Wrapper around MYSQL_LOG::write() for slow log. */
 
231
/** Wrapper around DRIZZLE_LOG::write() for slow log. */
232
232
 
233
233
bool Log_to_file_event_handler::
234
234
  log_slow(THD *thd, time_t current_time, time_t query_start_arg,
244
244
 
245
245
 
246
246
/**
247
 
   Wrapper around MYSQL_LOG::write() for general log. We need it since we
 
247
   Wrapper around DRIZZLE_LOG::write() for general log. We need it since we
248
248
   want all log event handlers to have the same signature.
249
249
*/
250
250
 
572
572
bool LOGGER::activate_log_handler(THD* thd __attribute__((unused)),
573
573
                                  uint log_type)
574
574
{
575
 
  MYSQL_QUERY_LOG *file_log;
 
575
  DRIZZLE_QUERY_LOG *file_log;
576
576
  bool res= false;
577
577
  lock_exclusive();
578
578
  switch (log_type) {
608
608
                                    uint log_type)
609
609
{
610
610
  bool *tmp_opt= 0;
611
 
  MYSQL_LOG *file_log;
 
611
  DRIZZLE_LOG *file_log;
612
612
 
613
613
  switch (log_type) {
614
614
  case QUERY_LOG_SLOW:
709
709
 
710
710
/*
711
711
  this function is mostly a placeholder.
712
 
  conceptually, binlog initialization (now mostly done in MYSQL_BIN_LOG::open)
 
712
  conceptually, binlog initialization (now mostly done in DRIZZLE_BIN_LOG::open)
713
713
  should be moved here.
714
714
*/
715
715
 
845
845
    do nothing.
846
846
    just pretend we can do 2pc, so that MySQL won't
847
847
    switch to 1pc.
848
 
    real work will be done in MYSQL_BIN_LOG::log_xid()
 
848
    real work will be done in DRIZZLE_BIN_LOG::log_xid()
849
849
  */
850
850
  return 0;
851
851
}
873
873
 
874
874
  if (trx_data->empty())
875
875
  {
876
 
    // we're here because trans_log was flushed in MYSQL_BIN_LOG::log_xid()
 
876
    // we're here because trans_log was flushed in DRIZZLE_BIN_LOG::log_xid()
877
877
    trx_data->reset();
878
878
    return(0);
879
879
  }
941
941
  if ((in_transaction && (all || (!trx_data->at_least_one_stmt && thd->transaction.stmt.modified_non_trans_table))) || (!in_transaction && !all))
942
942
  {
943
943
    Query_log_event qev(thd, STRING_WITH_LEN("COMMIT"), true, false);
944
 
    qev.error_code= 0; // see comment in MYSQL_LOG::write(THD, IO_CACHE)
 
944
    qev.error_code= 0; // see comment in DRIZZLE_LOG::write(THD, IO_CACHE)
945
945
    int error= binlog_end_trans(thd, trx_data, &qev, all);
946
946
    return(error);
947
947
  }
988
988
      rolled back on the slave.
989
989
    */
990
990
    Query_log_event qev(thd, STRING_WITH_LEN("ROLLBACK"), true, false);
991
 
    qev.error_code= 0; // see comment in MYSQL_LOG::write(THD, IO_CACHE)
 
991
    qev.error_code= 0; // see comment in DRIZZLE_LOG::write(THD, IO_CACHE)
992
992
    error= binlog_end_trans(thd, trx_data, &qev, all);
993
993
  }
994
994
  else if ((all && !thd->transaction.all.modified_non_trans_table) ||
1165
1165
}
1166
1166
 
1167
1167
 
1168
 
void MYSQL_LOG::init(enum_log_type log_type_arg,
 
1168
void DRIZZLE_LOG::init(enum_log_type log_type_arg,
1169
1169
                     enum cache_type io_cache_type_arg)
1170
1170
{
1171
1171
  log_type= log_type_arg;
1195
1195
    1   error
1196
1196
*/
1197
1197
 
1198
 
bool MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
 
1198
bool DRIZZLE_LOG::open(const char *log_name, enum_log_type log_type_arg,
1199
1199
                     const char *new_name, enum cache_type io_cache_type_arg)
1200
1200
{
1201
1201
  char buff[FN_REFLEN];
1237
1237
    char *end;
1238
1238
    int len=snprintf(buff, sizeof(buff), "%s, Version: %s (%s). "
1239
1239
                     "started with:\nTCP Port: %d, Named Pipe: %s\n",
1240
 
                     my_progname, server_version, MYSQL_COMPILATION_COMMENT,
 
1240
                     my_progname, server_version, DRIZZLE_COMPILATION_COMMENT,
1241
1241
                     mysqld_port, ""
1242
1242
                     );
1243
1243
    end= stpncpy(buff + len, "Time                 Id Command    Argument\n",
1263
1263
  return(1);
1264
1264
}
1265
1265
 
1266
 
MYSQL_LOG::MYSQL_LOG()
 
1266
DRIZZLE_LOG::DRIZZLE_LOG()
1267
1267
  : name(0), write_error(false), inited(false), log_type(LOG_UNKNOWN),
1268
1268
    log_state(LOG_CLOSED)
1269
1269
{
1276
1276
  memset(&log_file, 0, sizeof(log_file));
1277
1277
}
1278
1278
 
1279
 
void MYSQL_LOG::init_pthread_objects()
 
1279
void DRIZZLE_LOG::init_pthread_objects()
1280
1280
{
1281
1281
  assert(inited == 0);
1282
1282
  inited= 1;
1297
1297
    The internal structures are not freed until cleanup() is called
1298
1298
*/
1299
1299
 
1300
 
void MYSQL_LOG::close(uint exiting)
 
1300
void DRIZZLE_LOG::close(uint exiting)
1301
1301
{                                       // One can't set log_type here!
1302
1302
  if (log_state == LOG_OPENED)
1303
1303
  {
1323
1323
 
1324
1324
/** This is called only once. */
1325
1325
 
1326
 
void MYSQL_LOG::cleanup()
 
1326
void DRIZZLE_LOG::cleanup()
1327
1327
{
1328
1328
  if (inited)
1329
1329
  {
1335
1335
}
1336
1336
 
1337
1337
 
1338
 
int MYSQL_LOG::generate_new_name(char *new_name, const char *log_name)
 
1338
int DRIZZLE_LOG::generate_new_name(char *new_name, const char *log_name)
1339
1339
{
1340
1340
  fn_format(new_name, log_name, mysql_data_home, "", 4);
1341
1341
  if (log_type == LOG_BIN)
1365
1365
*/
1366
1366
 
1367
1367
 
1368
 
void MYSQL_QUERY_LOG::reopen_file()
 
1368
void DRIZZLE_QUERY_LOG::reopen_file()
1369
1369
{
1370
1370
  char *save_name;
1371
1371
 
1418
1418
    TRUE - error occured
1419
1419
*/
1420
1420
 
1421
 
bool MYSQL_QUERY_LOG::write(time_t event_time,
 
1421
bool DRIZZLE_QUERY_LOG::write(time_t event_time,
1422
1422
                            const char *user_host __attribute__((unused)),
1423
1423
                            uint user_host_len __attribute__((unused)),
1424
1424
                            int thread_id,
1520
1520
    TRUE - error occured
1521
1521
*/
1522
1522
 
1523
 
bool MYSQL_QUERY_LOG::write(THD *thd, time_t current_time,
 
1523
bool DRIZZLE_QUERY_LOG::write(THD *thd, time_t current_time,
1524
1524
                            time_t query_start_arg __attribute__((unused)),
1525
1525
                            const char *user_host,
1526
1526
                            uint user_host_len, uint64_t query_utime,
1652
1652
  The following should be using fn_format();  We just need to
1653
1653
  first change fn_format() to cut the file name if it's too long.
1654
1654
*/
1655
 
const char *MYSQL_LOG::generate_name(const char *log_name,
 
1655
const char *DRIZZLE_LOG::generate_name(const char *log_name,
1656
1656
                                      const char *suffix,
1657
1657
                                      bool strip_ext, char *buff)
1658
1658
{
1675
1675
 
1676
1676
 
1677
1677
 
1678
 
MYSQL_BIN_LOG::MYSQL_BIN_LOG()
 
1678
DRIZZLE_BIN_LOG::DRIZZLE_BIN_LOG()
1679
1679
  :bytes_written(0), prepared_xids(0), file_id(1), open_count(1),
1680
1680
   need_start_event(true), m_table_map_version(0),
1681
1681
   description_event_for_exec(0), description_event_for_queue(0)
1692
1692
 
1693
1693
/* this is called only once */
1694
1694
 
1695
 
void MYSQL_BIN_LOG::cleanup()
 
1695
void DRIZZLE_BIN_LOG::cleanup()
1696
1696
{
1697
1697
  if (inited)
1698
1698
  {
1709
1709
 
1710
1710
 
1711
1711
/* Init binlog-specific vars */
1712
 
void MYSQL_BIN_LOG::init(bool no_auto_events_arg, ulong max_size_arg)
 
1712
void DRIZZLE_BIN_LOG::init(bool no_auto_events_arg, ulong max_size_arg)
1713
1713
{
1714
1714
  no_auto_events= no_auto_events_arg;
1715
1715
  max_size= max_size_arg;
1717
1717
}
1718
1718
 
1719
1719
 
1720
 
void MYSQL_BIN_LOG::init_pthread_objects()
 
1720
void DRIZZLE_BIN_LOG::init_pthread_objects()
1721
1721
{
1722
1722
  assert(inited == 0);
1723
1723
  inited= 1;
1727
1727
}
1728
1728
 
1729
1729
 
1730
 
bool MYSQL_BIN_LOG::open_index_file(const char *index_file_name_arg,
 
1730
bool DRIZZLE_BIN_LOG::open_index_file(const char *index_file_name_arg,
1731
1731
                                const char *log_name)
1732
1732
{
1733
1733
  File index_file_nr= -1;
1782
1782
    1   error
1783
1783
*/
1784
1784
 
1785
 
bool MYSQL_BIN_LOG::open(const char *log_name,
 
1785
bool DRIZZLE_BIN_LOG::open(const char *log_name,
1786
1786
                         enum_log_type log_type_arg,
1787
1787
                         const char *new_name,
1788
1788
                         enum cache_type io_cache_type_arg,
1795
1795
  write_error=0;
1796
1796
 
1797
1797
  /* open the main log file */
1798
 
  if (MYSQL_LOG::open(log_name, log_type_arg, new_name, io_cache_type_arg))
 
1798
  if (DRIZZLE_LOG::open(log_name, log_type_arg, new_name, io_cache_type_arg))
1799
1799
    return(1);                            /* all warnings issued */
1800
1800
 
1801
1801
  init(no_auto_events_arg, max_size_arg);
1913
1913
}
1914
1914
 
1915
1915
 
1916
 
int MYSQL_BIN_LOG::get_current_log(LOG_INFO* linfo)
 
1916
int DRIZZLE_BIN_LOG::get_current_log(LOG_INFO* linfo)
1917
1917
{
1918
1918
  pthread_mutex_lock(&LOCK_log);
1919
1919
  int ret = raw_get_current_log(linfo);
1921
1921
  return ret;
1922
1922
}
1923
1923
 
1924
 
int MYSQL_BIN_LOG::raw_get_current_log(LOG_INFO* linfo)
 
1924
int DRIZZLE_BIN_LOG::raw_get_current_log(LOG_INFO* linfo)
1925
1925
{
1926
1926
  strmake(linfo->log_file_name, log_file_name, sizeof(linfo->log_file_name)-1);
1927
1927
  linfo->pos = my_b_tell(&log_file);
2002
2002
    LOG_INFO_IO         Got IO error while reading file
2003
2003
*/
2004
2004
 
2005
 
int MYSQL_BIN_LOG::find_log_pos(LOG_INFO *linfo, const char *log_name,
 
2005
int DRIZZLE_BIN_LOG::find_log_pos(LOG_INFO *linfo, const char *log_name,
2006
2006
                            bool need_lock)
2007
2007
{
2008
2008
  int error= 0;
2075
2075
    LOG_INFO_IO         Got IO error while reading file
2076
2076
*/
2077
2077
 
2078
 
int MYSQL_BIN_LOG::find_next_log(LOG_INFO* linfo, bool need_lock)
 
2078
int DRIZZLE_BIN_LOG::find_next_log(LOG_INFO* linfo, bool need_lock)
2079
2079
{
2080
2080
  int error= 0;
2081
2081
  uint length;
2122
2122
    1   error
2123
2123
*/
2124
2124
 
2125
 
bool MYSQL_BIN_LOG::reset_logs(THD* thd)
 
2125
bool DRIZZLE_BIN_LOG::reset_logs(THD* thd)
2126
2126
{
2127
2127
  LOG_INFO linfo;
2128
2128
  bool error=0;
2268
2268
 
2269
2269
#ifdef HAVE_REPLICATION
2270
2270
 
2271
 
int MYSQL_BIN_LOG::purge_first_log(Relay_log_info* rli, bool included)
 
2271
int DRIZZLE_BIN_LOG::purge_first_log(Relay_log_info* rli, bool included)
2272
2272
{
2273
2273
  int error;
2274
2274
 
2343
2343
  Update log index_file.
2344
2344
*/
2345
2345
 
2346
 
int MYSQL_BIN_LOG::update_log_index(LOG_INFO* log_info, bool need_update_threads)
 
2346
int DRIZZLE_BIN_LOG::update_log_index(LOG_INFO* log_info, bool need_update_threads)
2347
2347
{
2348
2348
  if (copy_up_file_and_fill(&index_file, log_info->index_file_start_offset))
2349
2349
    return LOG_INFO_IO;
2378
2378
                                stat() or my_delete()
2379
2379
*/
2380
2380
 
2381
 
int MYSQL_BIN_LOG::purge_logs(const char *to_log, 
 
2381
int DRIZZLE_BIN_LOG::purge_logs(const char *to_log, 
2382
2382
                          bool included,
2383
2383
                          bool need_mutex, 
2384
2384
                          bool need_update_threads, 
2512
2512
                                stat() or my_delete()
2513
2513
*/
2514
2514
 
2515
 
int MYSQL_BIN_LOG::purge_logs_before_date(time_t purge_time)
 
2515
int DRIZZLE_BIN_LOG::purge_logs_before_date(time_t purge_time)
2516
2516
{
2517
2517
  int error;
2518
2518
  LOG_INFO log_info;
2618
2618
    If file name will be longer then FN_REFLEN it will be truncated
2619
2619
*/
2620
2620
 
2621
 
void MYSQL_BIN_LOG::make_log_name(char* buf, const char* log_ident)
 
2621
void DRIZZLE_BIN_LOG::make_log_name(char* buf, const char* log_ident)
2622
2622
{
2623
2623
  uint dir_len = dirname_length(log_file_name); 
2624
2624
  if (dir_len >= FN_REFLEN)
2632
2632
  Check if we are writing/reading to the given log file.
2633
2633
*/
2634
2634
 
2635
 
bool MYSQL_BIN_LOG::is_active(const char *log_file_name_arg)
 
2635
bool DRIZZLE_BIN_LOG::is_active(const char *log_file_name_arg)
2636
2636
{
2637
2637
  return !strcmp(log_file_name, log_file_name_arg);
2638
2638
}
2646
2646
  method).
2647
2647
*/
2648
2648
 
2649
 
void MYSQL_BIN_LOG::new_file()
 
2649
void DRIZZLE_BIN_LOG::new_file()
2650
2650
{
2651
2651
  new_file_impl(1);
2652
2652
}
2653
2653
 
2654
2654
 
2655
 
void MYSQL_BIN_LOG::new_file_without_locking()
 
2655
void DRIZZLE_BIN_LOG::new_file_without_locking()
2656
2656
{
2657
2657
  new_file_impl(0);
2658
2658
}
2667
2667
    The new file name is stored last in the index file
2668
2668
*/
2669
2669
 
2670
 
void MYSQL_BIN_LOG::new_file_impl(bool need_lock)
 
2670
void DRIZZLE_BIN_LOG::new_file_impl(bool need_lock)
2671
2671
{
2672
2672
  char new_name[FN_REFLEN], *new_name_ptr, *old_name;
2673
2673
 
2764
2764
}
2765
2765
 
2766
2766
 
2767
 
bool MYSQL_BIN_LOG::append(Log_event* ev)
 
2767
bool DRIZZLE_BIN_LOG::append(Log_event* ev)
2768
2768
{
2769
2769
  bool error = 0;
2770
2770
  pthread_mutex_lock(&LOCK_log);
2790
2790
}
2791
2791
 
2792
2792
 
2793
 
bool MYSQL_BIN_LOG::appendv(const char* buf, uint len,...)
 
2793
bool DRIZZLE_BIN_LOG::appendv(const char* buf, uint len,...)
2794
2794
{
2795
2795
  bool error= 0;
2796
2796
  va_list(args);
2818
2818
}
2819
2819
 
2820
2820
 
2821
 
bool MYSQL_BIN_LOG::flush_and_sync()
 
2821
bool DRIZZLE_BIN_LOG::flush_and_sync()
2822
2822
{
2823
2823
  int err=0, fd=log_file.file;
2824
2824
  safe_mutex_assert_owner(&LOCK_log);
2832
2832
  return err;
2833
2833
}
2834
2834
 
2835
 
void MYSQL_BIN_LOG::start_union_events(THD *thd, query_id_t query_id_param)
 
2835
void DRIZZLE_BIN_LOG::start_union_events(THD *thd, query_id_t query_id_param)
2836
2836
{
2837
2837
  assert(!thd->binlog_evt_union.do_union);
2838
2838
  thd->binlog_evt_union.do_union= true;
2841
2841
  thd->binlog_evt_union.first_query_id= query_id_param;
2842
2842
}
2843
2843
 
2844
 
void MYSQL_BIN_LOG::stop_union_events(THD *thd)
 
2844
void DRIZZLE_BIN_LOG::stop_union_events(THD *thd)
2845
2845
{
2846
2846
  assert(thd->binlog_evt_union.do_union);
2847
2847
  thd->binlog_evt_union.do_union= false;
2848
2848
}
2849
2849
 
2850
 
bool MYSQL_BIN_LOG::is_query_in_union(THD *thd, query_id_t query_id_param)
 
2850
bool DRIZZLE_BIN_LOG::is_query_in_union(THD *thd, query_id_t query_id_param)
2851
2851
{
2852
2852
  return (thd->binlog_evt_union.do_union && 
2853
2853
          query_id_param >= thd->binlog_evt_union.first_query_id);
3016
3016
  event.
3017
3017
*/
3018
3018
int
3019
 
MYSQL_BIN_LOG::flush_and_set_pending_rows_event(THD *thd,
 
3019
DRIZZLE_BIN_LOG::flush_and_set_pending_rows_event(THD *thd,
3020
3020
                                                Rows_log_event* event)
3021
3021
{
3022
3022
  assert(mysql_bin_log.is_open());
3098
3098
  Write an event to the binary log.
3099
3099
*/
3100
3100
 
3101
 
bool MYSQL_BIN_LOG::write(Log_event *event_info)
 
3101
bool DRIZZLE_BIN_LOG::write(Log_event *event_info)
3102
3102
{
3103
3103
  THD *thd= event_info->thd;
3104
3104
  bool error= 1;
3342
3342
  return false;
3343
3343
}
3344
3344
 
3345
 
void MYSQL_BIN_LOG::rotate_and_purge(uint flags)
 
3345
void DRIZZLE_BIN_LOG::rotate_and_purge(uint flags)
3346
3346
{
3347
3347
  if (!(flags & RP_LOCK_LOG_IS_ALREADY_LOCKED))
3348
3348
    pthread_mutex_lock(&LOCK_log);
3363
3363
    pthread_mutex_unlock(&LOCK_log);
3364
3364
}
3365
3365
 
3366
 
uint MYSQL_BIN_LOG::next_file_id()
 
3366
uint DRIZZLE_BIN_LOG::next_file_id()
3367
3367
{
3368
3368
  uint res;
3369
3369
  pthread_mutex_lock(&LOCK_log);
3387
3387
    be reset as a READ_CACHE to be able to read the contents from it.
3388
3388
 */
3389
3389
 
3390
 
int MYSQL_BIN_LOG::write_cache(IO_CACHE *cache, bool lock_log, bool sync_log)
 
3390
int DRIZZLE_BIN_LOG::write_cache(IO_CACHE *cache, bool lock_log, bool sync_log)
3391
3391
{
3392
3392
  Mutex_sentry sentry(lock_log ? &LOCK_log : NULL);
3393
3393
 
3535
3535
    'cache' needs to be reinitialized after this functions returns.
3536
3536
*/
3537
3537
 
3538
 
bool MYSQL_BIN_LOG::write(THD *thd, IO_CACHE *cache, Log_event *commit_event)
 
3538
bool DRIZZLE_BIN_LOG::write(THD *thd, IO_CACHE *cache, Log_event *commit_event)
3539
3539
{
3540
3540
  VOID(pthread_mutex_lock(&LOCK_log));
3541
3541
 
3637
3637
    It will be released at the end of the function.
3638
3638
*/
3639
3639
 
3640
 
void MYSQL_BIN_LOG::wait_for_update_relay_log(THD* thd)
 
3640
void DRIZZLE_BIN_LOG::wait_for_update_relay_log(THD* thd)
3641
3641
{
3642
3642
  const char *old_msg;
3643
3643
  old_msg= thd->enter_cond(&update_cond, &LOCK_log,
3666
3666
    LOCK_log is released by the caller.
3667
3667
*/
3668
3668
 
3669
 
int MYSQL_BIN_LOG::wait_for_update_bin_log(THD* thd,
 
3669
int DRIZZLE_BIN_LOG::wait_for_update_bin_log(THD* thd,
3670
3670
                                           const struct timespec *timeout)
3671
3671
{
3672
3672
  int ret= 0;
3697
3697
    The internal structures are not freed until cleanup() is called
3698
3698
*/
3699
3699
 
3700
 
void MYSQL_BIN_LOG::close(uint exiting)
 
3700
void DRIZZLE_BIN_LOG::close(uint exiting)
3701
3701
{                                       // One can't set log_type here!
3702
3702
  if (log_state == LOG_OPENED)
3703
3703
  {
3721
3721
    }
3722
3722
 
3723
3723
    /* this will cleanup IO_CACHE, sync and close the file */
3724
 
    MYSQL_LOG::close(exiting);
 
3724
    DRIZZLE_LOG::close(exiting);
3725
3725
  }
3726
3726
 
3727
3727
  /*
3744
3744
}
3745
3745
 
3746
3746
 
3747
 
void MYSQL_BIN_LOG::set_max_size(ulong max_size_arg)
 
3747
void DRIZZLE_BIN_LOG::set_max_size(ulong max_size_arg)
3748
3748
{
3749
3749
  /*
3750
3750
    We need to take locks, otherwise this may happen:
3864
3864
   return result;
3865
3865
}
3866
3866
 
3867
 
void MYSQL_BIN_LOG::signal_update()
 
3867
void DRIZZLE_BIN_LOG::signal_update()
3868
3868
{
3869
3869
  pthread_cond_broadcast(&update_cond);
3870
3870
  return;
4204
4204
    threads waiting for a page, but then all these threads will be waiting
4205
4205
    for a fsync() anyway
4206
4206
 
4207
 
   If tc_log == MYSQL_LOG then tc_log writes transaction to binlog and
 
4207
   If tc_log == DRIZZLE_LOG then tc_log writes transaction to binlog and
4208
4208
   records XID in a special Xid_log_event.
4209
4209
   If tc_log = TC_LOG_MMAP then xid is written in a special memory-mapped
4210
4210
   log.
4464
4464
}
4465
4465
 
4466
4466
/****** transaction coordinator log for 2pc - binlog() based solution ******/
4467
 
#define TC_LOG_BINLOG MYSQL_BIN_LOG
 
4467
#define TC_LOG_BINLOG DRIZZLE_BIN_LOG
4468
4468
 
4469
4469
/**
4470
4470
  @todo
4672
4672
 
4673
4673
mysql_declare_plugin(binlog)
4674
4674
{
4675
 
  MYSQL_STORAGE_ENGINE_PLUGIN,
 
4675
  DRIZZLE_STORAGE_ENGINE_PLUGIN,
4676
4676
  "binlog",
4677
4677
  "1.0",
4678
4678
  "MySQL AB",