Esempio n. 1
0
int MyBinlog::get_next_event(MyEvent *my_event) {

    Binary_log_event *event;

    int result;
    std::pair<unsigned char *, size_t> buffer_buflen;
    result = m_drv->get_next_event(&buffer_buflen);
    if (result == ERR_OK) {
        if (!(event = m_decode.decode_event((char *) buffer_buflen.first, buffer_buflen.second, NULL, 1))) {
            return ERR_FAIL;
        }
    }
    else {
        return ERR_FAIL;
    }

    my_event->set_type(event->get_event_type());
    my_event->set_position(event->header()->log_pos);

    if (event->header()->type_code == binary_log::TABLE_MAP_EVENT) {
        m_handler.handle_event(&event);
        return ERR_OK;
    }

    m_handler.handle_event(&event);

    if(my_event->is_rows_event()) {
        for(Row_map::iterator row_it = contentHandler.rows_val.begin();
            row_it != contentHandler.rows_val.end();
            ++ row_it)
        {
            for(Row_Fields_map::iterator filed_it = row_it->begin();
                filed_it != row_it->end();
                ++ filed_it)
            {
                std::cout << filed_it->second << "\t";
            }
            std::cout << std::endl;
        }
    }

    if (event->header()->type_code == binary_log::QUERY_EVENT) {
        binary_log::Query_event *qev = dynamic_cast<binary_log::Query_event *>(event);

        std::cout << "Query = "
        << qev->query
        << " DB = "
        << qev->db
        << std::endl;
    }

    delete event;

    return ERR_OK;
}
int main(int argc, char** argv)
{
  string uri;
  int number_of_args= argc;
  char cwd[PATH_MAX];

  getcwd(cwd, PATH_MAX);
  parse_args(&argc, argv);

  while (argc != number_of_args)
  {
    uri= argv[argc++];
    if ( strncmp("mysql://", uri.c_str(), 8) != 0)
    {
      uri.insert(0, "file://");
      if (uri[7] == '.')
      {
        uri.insert(7, cwd);
        uri.insert((7 + strlen(cwd)), "/");
      }
      cout << uri << endl;
    }

    Binary_log binlog(create_transport(uri.c_str()));
    int error_number= binlog.connect();

    if (const char* msg= str_error(error_number))
        cerr << msg << endl;

    if (error_number != ERR_OK)
    {
      cerr << "Unable to setup connection" << endl;
      exit(2);
    }

    if (binlog.set_position(opt_start_pos) != ERR_OK)
    {
      cerr << "The specified position "
           << opt_start_pos
           << " cannot be set"
           << endl;
      exit(2);
    }

    if (opt_format_flag)
    {
      map<string, int>::iterator it;
      for (it= opt_format.begin(); it != opt_format.end(); ++it)
      {
        if (it->second > 10 && it->second != 15)
        {
          cout << setw(17) << left
               << it->first;
        }
      }
      cout << endl;
    }
    else
    {
      cout << setw(17) << left
           << "Start Position"
           << setw(15) << left
           << "End Position"
           << setw(15) << left
           << "Event Length"
           << setw(25) << left
           << "Event Type"
           << endl;
    }

    while (true)
    {
      Binary_log_event *event;
      long int event_start_pos;
      string event_type;
      string database_dot_table;
      error_number= binlog.wait_for_next_event(&event);

      if (const char* msg=  str_error(error_number))
        cerr << msg << endl;

      if (error_number != ERR_OK)
        exit(2);

      if (event->get_event_type() == mysql::INCIDENT_EVENT ||
         (event->get_event_type() == mysql::ROTATE_EVENT &&
          event->header()->next_position == 0 ||
          event->header()->next_position == 0))
      {
          /*
            If the event type is an Incident event or a Rotate event
            which occurs when a server starts on a fresh binlog file,
            the event will not be written in the binlog file.
          */
          event_start_pos= 0;

      }
      else
      {
        event_start_pos= binlog.get_position() -
                       (event->header())->event_length;
      }

      if (event_start_pos >= opt_stop_pos)
        break;

      if ((opt_offset > 0 && opt_offset--) ||
          (opt_db_flag && check_event_db(&event)) ||
          (opt_event_flag && check_event_type(&event)))
        continue;

      /* Filtering events if --include or --exclude option is specified */
      if ((opt_exclude_flag || opt_include_flag) &&
          (event->get_event_type() == mysql::TABLE_MAP_EVENT ||
          event->get_event_type() == mysql::PRE_GA_WRITE_ROWS_EVENT ||
          event->get_event_type() == mysql::PRE_GA_UPDATE_ROWS_EVENT ||
          event->get_event_type() == mysql::PRE_GA_DELETE_ROWS_EVENT ||
          event->get_event_type() == mysql::WRITE_ROWS_EVENT ||
          event->get_event_type() == mysql::WRITE_ROWS_EVENT_V1 ||
          event->get_event_type() == mysql::UPDATE_ROWS_EVENT ||
          event->get_event_type() == mysql::UPDATE_ROWS_EVENT_V1 ||
          event->get_event_type() == mysql::DELETE_ROWS_EVENT ||
          event->get_event_type() == mysql::DELETE_ROWS_EVENT_V1))
      {

         if (event->get_event_type() == mysql::TABLE_MAP_EVENT)
         {
           Table_map_event *table_map_event= static_cast<Table_map_event*>(event);
           database_dot_table= table_map_event->db_name;
           database_dot_table.append(".");
           database_dot_table.append(table_map_event->table_name);
           tid2tname[table_map_event->table_id]= database_dot_table;
        }
        else
        {
          // It is a row event
          Row_event *row_event= static_cast<Row_event*>(event);
          tb_it= tid2tname.begin();
          tb_it= tid2tname.find(row_event->table_id);
          if (tb_it != tid2tname.end())
          {
            database_dot_table= tb_it->second;
            if (row_event->flags == Row_event::STMT_END_F)
              tid2tname.erase(tb_it);
          }

        }
        bool match;
        if (opt_include_flag)
        {
          match= filter_table_by_regex(database_dot_table, 'i');
          if (!match)
            continue;
        }
        if (opt_exclude_flag)
        {
          match= filter_table_by_regex(database_dot_table, 'e');
          if (match)
            continue;
        }
      }
      if (opt_format_flag)
      {
        int info_flag= 0;
        map<string, int>::iterator it= opt_format.begin();
        for (it= opt_format.begin(); it != opt_format.end(); ++it)
        {
          cout << setw(17) << left;
          if (it->second == 11)
            cout << event_start_pos;
          if (it->second == 12)
            cout << (event->header())->next_position;
          if (it->second == 13)
            cout << (event->header())->event_length;
          if (it->second == 14)
            cout << get_event_type_str(event->get_event_type())
                 << "[" << event->get_event_type()
                 << "]";
          if (it->second == 15)
            info_flag= 1;
        }
        cout << endl;
        if (info_flag)
        {
           cout << "Event info: ";
           opt_para_flag ?
             event->print_long_info(cout) : event->print_event_info(cout);
           cout << endl;
        }
      }
      else
      {
        cout << setw(17) << left
             << event_start_pos
             << setw(15) << left
             << (event->header())->next_position
             << setw(15) << left
             << (event->header())->event_length
             << get_event_type_str(event->get_event_type())
             << "[" << event->get_event_type()
             << "]"
             << endl;
        cout << "Event Info: ";
        opt_para_flag ?
          event->print_long_info(cout) : event->print_event_info(cout);
        cout << endl;
      }
    }
  }//end of outer while loop
}
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);
}