Exemplo n.º 1
0
int main(int argc, char **argv) {
    
    std::string connectionStr("mysql://*****:*****@localhost:13000");
    if (argc > 1) {
        if (argv[1] == strstr(argv[1], "mysql://")) {
            connectionStr.assign(argv[1]);
        }
    }
    std::cout << "Trying to connect to <" << connectionStr << ">\n";

    std::unique_ptr<system::Binary_log_driver> drv(mysql::system::create_transport(connectionStr.c_str()));

    mysql::Binary_log binlog(drv.get());

    /*
      Attach a custom event parser which produces user defined events
    */
    mysql::Basic_transaction_parser transaction_parser;
    Incident_handler incident_handler;
    Replay_binlog replay_handler;

    binlog.content_handler_pipeline()->push_back(&transaction_parser);
    binlog.content_handler_pipeline()->push_back(&incident_handler);
    binlog.content_handler_pipeline()->push_back(&replay_handler);

    int ret = binlog.connect();
    if (0 != ret) {
        std::cerr << "Can't connect to the master.\n";
        return -1;
    }

    if (binlog.set_position(4) != ERR_OK) {
        std::cerr << "Can't reposition the binary log reader.\n";
        return -1;
    }

    Binary_log_event *event;

    bool quit = false;
    while (!quit) {
        /*
         Pull events from the master. This is the heart beat of the event listener.
        */
        if (binlog.wait_for_next_event(&event)) {
            quit = true;
            continue;
        }

        /*
         Print the event
        */
        std::cout << "MainLoop: Event type: [" << mysql::system::get_event_type_str(event->get_event_type())
        << "] length: " << event->header()->event_length
        << " next pos: " << event->header()->next_position
        << std::endl;

        /*
         Perform a special action based on event type
        */

        switch (event->get_event_type()) {
            case mysql::QUERY_EVENT: {
                const mysql::Query_event *qev = static_cast<const mysql::Query_event *>(event);

                std::cout << "query= " << qev->query
                << " db= " << qev->db_name
                << std::endl
                << std::endl;

                if (qev->query.find("DROP TABLE REPLICATION_LISTENER") !=
                    std::string::npos ||
                    qev->query.find("DROP TABLE `REPLICATION_LISTENER`") !=
                    std::string::npos) {
                    quit = true;
                }
            }
                break;

            case mysql::ROTATE_EVENT: {
                mysql::Rotate_event *rot = static_cast<mysql::Rotate_event *>(event);

                std::cout << "filename= " << rot->binlog_file.c_str()
                << " pos= " << rot->binlog_pos
                << std::endl
                << std::endl;
            }
                break;

        }
        delete event;
    }
    return 0;
}
int main(int argc, char** argv)
{
  if (argc < 2)
  {
    fprintf(stderr,"Usage:\n\treplaybinlog URL\n\nExample:\n\treplaybinlog mysql://root:[email protected]:3306\n\n");
    return (EXIT_FAILURE);
  }

  mysql::Binary_log binlog(mysql::system::create_transport(argv[1]));

  if (argc > 2)
  {
    // Set ssl ca certificate
    binlog.set_ssl_ca(std::string(argv[2]));

    // Set ssl cipher list
    //binlog.set_ssl_cipher("AES256-SHA");
    //RDS ssl_cipher list
    //binlog.set_ssl_cipher("EXP1024-RC4-SHA:EXP1024-DES-CBC-SHA:AES256-SHA:AES128-SHA:DES-CBC3-SHA:DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:RC4-SHA:RC4-MD5:EXP-RC4-MD5:NULL-SHA:NULL-MD5:DES-CBC3-MD5:DES-CBC-MD5:EXP-RC2-CBC-MD5:RC2-CBC-MD5:EXP-RC4-MD5:RC4-MD5:KRB5-DES-CBC3-MD5:KRB5-DES-CBC3-SHA:ADH-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:ADH-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:ADH-AES128-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:EXP-KRB5-RC4-MD5:EXP-KRB5-RC2-CBC-MD5:EXP-KRB5-DES-CBC-MD5:KRB5-RC4-MD5:KRB5-DES-CBC-MD5:ADH-RC4-MD5:EXP-ADH-RC4-MD5:DHE-DSS-RC4-SHA:EXP1024-DHE-DSS-RC4-SHA:EXP1024-DHE-DSS-DES-CBC-SHA:EXP-KRB5-RC4-SHA:EXP-KRB5-RC2-CBC-SHA:EXP-KRB5-DES-CBC-SHA:KRB5-RC4-SHA:KRB5-DES-CBC-SHA:ADH-DES-CBC-SHA:EXP-ADH-DES-CBC-SHA:EDH-RSA-DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA");
  }

  /*
    Attach a custom event parser which produces user defined events
  */
  mysql::Basic_transaction_parser transaction_parser;
  Incident_handler incident_hndlr;
  Replay_binlog replay_hndlr;

  binlog.content_handler_pipeline()->push_back(&transaction_parser);
  binlog.content_handler_pipeline()->push_back(&incident_hndlr);
  binlog.content_handler_pipeline()->push_back(&replay_hndlr);

  if (binlog.connect())
  {
    fprintf(stderr,"Can't connect to the master.\n");
    return (EXIT_FAILURE);
  }

  if (binlog.set_position(4) != ERR_OK)
  {
    fprintf(stderr,"Can't reposition the binary log reader.\n");
    return (EXIT_FAILURE);
  }

  Binary_log_event  *event;

  bool quit= false;
  while(!quit)
  {
    /*
     Pull events from the master. This is the heart beat of the event listener.
    */
    if (binlog.wait_for_next_event(&event))
    {
      quit= true;
      continue;
    }

    /*
     Print the event
    */
    std::cout << "Event type: "
              << mysql::system::get_event_type_str(event->get_event_type())
              << " length: " << event->header()->event_length
              << " next pos: " << event->header()->next_position
              << std::endl;

    /*
     Perform a special action based on event type
    */

    switch(event->header()->type_code)
    {
    case mysql::QUERY_EVENT:
      {
        const mysql::Query_event *qev= static_cast<const mysql::Query_event *>(event);
        std::cout << "query= "
                  << qev->query
                  << " db= "
                  << qev->db_name
                  <<  std::endl
                  <<  std::endl;
        if (qev->query.find("DROP TABLE REPLICATION_LISTENER") != std::string::npos ||
            qev->query.find("DROP TABLE `REPLICATION_LISTENER`") != std::string::npos)
        {
          quit= true;
        }
      }
      break;

    case mysql::ROTATE_EVENT:
      {
        mysql::Rotate_event *rot= static_cast<mysql::Rotate_event *>(event);
        std::cout << "filename= "
                  << rot->binlog_file.c_str()
                  << " pos= "
                  << rot->binlog_pos
                  << std::endl
                  << std::endl;
      }
      break;

    } // end switch
    delete event;
  } // end loop
  return (EXIT_SUCCESS);
}