fluent-plugin-mysql-appender 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/fluent-plugin-mysql-appender.gemspec +7 -12
- data/lib/fluent/plugin/in_mysql_appender.rb +122 -0
- data/test/fluent/plugin/in_mysql_appender_test.rb +8 -0
- data/test/test_helper.rb +3 -0
- metadata +36 -35
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/lib/fluent/plugin/mysql/appender/version.rb +0 -9
- data/lib/fluent/plugin/mysql/appender.rb +0 -130
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: e8aa25405eceba3f36603a7f675dfb3db91f457b
         | 
| 4 | 
            +
              data.tar.gz: ca191d84cf467bf6010ce68ce02ddadcee54a414
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: aebe8bf4e89a0bf3d9d7ee9beb15f42ab792043905a4347230ccc1df9006430b0e8b47e961aae37311c854daa66c69e1900a8d3a05a5ad64f8b4dafdf3596051
         | 
| 7 | 
            +
              data.tar.gz: 2a48bd6a93ab07536a8e5bff25482f64a1955325243559cb487633d8d17b1de9709d34f27c60fe47f71c5bd8fcc916a786e8993ea643e534f968799050a1af05
         | 
| @@ -1,11 +1,7 @@ | |
| 1 1 | 
             
            # coding: utf-8
         | 
| 2 | 
            -
            lib = File.expand_path('../lib', __FILE__)
         | 
| 3 | 
            -
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| 4 | 
            -
            require 'fluent/plugin/mysql/appender/version'
         | 
| 5 | 
            -
             | 
| 6 2 | 
             
            Gem::Specification.new do |spec|
         | 
| 7 3 | 
             
              spec.name          = "fluent-plugin-mysql-appender"
         | 
| 8 | 
            -
              spec.version       =  | 
| 4 | 
            +
              spec.version       = "0.1.1"
         | 
| 9 5 | 
             
              spec.authors       = ["tsuyoshi_terasaki"]
         | 
| 10 6 | 
             
              spec.email         = ["tsuyoshi_terasaki@realworld.jp"]
         | 
| 11 7 |  | 
| @@ -14,17 +10,16 @@ Gem::Specification.new do |spec| | |
| 14 10 | 
             
              spec.homepage      = "https://github.com/rw-hub/fluent-plugin-mysql-appender"
         | 
| 15 11 | 
             
              spec.license       = "MIT"
         | 
| 16 12 |  | 
| 17 | 
            -
              spec.files         = `git ls-files | 
| 18 | 
            -
             | 
| 19 | 
            -
               | 
| 20 | 
            -
              spec.bindir        = "exe"
         | 
| 21 | 
            -
              spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
         | 
| 13 | 
            +
              spec.files         = `git ls-files`.split($\)
         | 
| 14 | 
            +
              spec.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
         | 
| 15 | 
            +
              spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
         | 
| 22 16 | 
             
              spec.require_paths = ["lib"]
         | 
| 23 17 |  | 
| 18 | 
            +
              spec.add_runtime_dependency "fluentd"
         | 
| 19 | 
            +
              spec.add_runtime_dependency "mysql2"
         | 
| 20 | 
            +
             | 
| 24 21 | 
             
              spec.add_development_dependency "bundler", "~> 1.13"
         | 
| 25 22 | 
             
              spec.add_development_dependency "rake", "~> 10.0"
         | 
| 26 23 | 
             
              spec.add_development_dependency "minitest", "~> 5.0"
         | 
| 27 24 |  | 
| 28 | 
            -
              spec.add_runtime_dependency "fluentd"
         | 
| 29 | 
            -
              spec.add_runtime_dependency "mysql2"
         | 
| 30 25 | 
             
            end
         | 
| @@ -0,0 +1,122 @@ | |
| 1 | 
            +
            module Fluent
         | 
| 2 | 
            +
              class MysqlAppenderInput < Fluent::Input
         | 
| 3 | 
            +
                Plugin.register_input('mysql_appender', self)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                # Define `router` method to support v0.10.57 or earlier
         | 
| 6 | 
            +
                unless method_defined?(:router)
         | 
| 7 | 
            +
                  define_method("router") { Engine }
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def initialize
         | 
| 11 | 
            +
                  require 'mysql2'
         | 
| 12 | 
            +
                  super
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                config_param :host, :string, :default => 'localhost'
         | 
| 16 | 
            +
                config_param :port, :integer, :default => 3306
         | 
| 17 | 
            +
                config_param :username, :string, :default => 'root'
         | 
| 18 | 
            +
                config_param :password, :string, :default => nil, :secret => true
         | 
| 19 | 
            +
                config_param :database, :string, :default => nil
         | 
| 20 | 
            +
                config_param :encoding, :string, :default => 'utf8'
         | 
| 21 | 
            +
                config_param :query, :string
         | 
| 22 | 
            +
                config_param :primary_key, :string, :default => 'id'
         | 
| 23 | 
            +
                config_param :interval, :string, :default => '1m'
         | 
| 24 | 
            +
                config_param :tag, :string, :default => nil
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def configure(conf)
         | 
| 27 | 
            +
                  super
         | 
| 28 | 
            +
                  @interval = Config.time_value(@interval)
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  if @tag.nil?
         | 
| 31 | 
            +
                    raise Fluent::ConfigError, "mysql_appender: missing 'tag' parameter. Please add following line into config like 'tag replicator.mydatabase.mytable.${event}.${primary_key}'"
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  $log.info "adding mysql_appender worker. :tag=>#{tag} :query=>#{@query} :prepared_query=>#{@prepared_query} :interval=>#{@interval}sec"
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                def start
         | 
| 38 | 
            +
                  @thread = Thread.new(&method(:run))
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def shutdown
         | 
| 42 | 
            +
                  Thread.kill(@thread)
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                def run
         | 
| 46 | 
            +
                  begin
         | 
| 47 | 
            +
                    poll
         | 
| 48 | 
            +
                  rescue StandardError => e
         | 
| 49 | 
            +
                    $log.error "mysql_appender: failed to execute query."
         | 
| 50 | 
            +
                    $log.error "error: #{e.message}"
         | 
| 51 | 
            +
                    $log.error e.backtrace.join("\n")
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                def poll
         | 
| 56 | 
            +
                  con = get_connection()
         | 
| 57 | 
            +
                  max_id = -1
         | 
| 58 | 
            +
                  loop do
         | 
| 59 | 
            +
                    rows_count = 0
         | 
| 60 | 
            +
                    start_time = Time.now
         | 
| 61 | 
            +
                    if max_id == -1
         | 
| 62 | 
            +
                      select_query = @query + " order by #{primary_key} asc"
         | 
| 63 | 
            +
                    else
         | 
| 64 | 
            +
                      select_query = @query + " where #{primary_key} > #{max_id} order by #{primary_key} asc"
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
                    rows, con = query(select_query, con)
         | 
| 67 | 
            +
                    rows.each_with_index do |row, index|
         | 
| 68 | 
            +
                      tag = format_tag(@tag, {:event => :insert})
         | 
| 69 | 
            +
                      router.emit(tag, Engine.now, row)
         | 
| 70 | 
            +
                      rows_count += 1
         | 
| 71 | 
            +
                      if index == rows.size - 1
         | 
| 72 | 
            +
                        max_id = row[@primary_key]
         | 
| 73 | 
            +
                      end
         | 
| 74 | 
            +
                    end
         | 
| 75 | 
            +
                    con.close
         | 
| 76 | 
            +
                    elapsed_time = sprintf("%0.02f", Time.now - start_time)
         | 
| 77 | 
            +
                    $log.info "mysql_appender: finished execution :tag=>#{tag} :rows_count=>#{rows_count} :elapsed_time=>#{elapsed_time} sec"
         | 
| 78 | 
            +
                    sleep @interval
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                def format_tag(tag, param)
         | 
| 83 | 
            +
                  pattern = {'${event}' => param[:event].to_s, '${primary_key}' => @primary_key}
         | 
| 84 | 
            +
                  tag.gsub(/(\${[a-z_]+})/) do
         | 
| 85 | 
            +
                    $log.warn "mysql_appender: missing placeholder. :tag=>#{tag} :placeholder=>#{$1}" unless pattern.include?($1)
         | 
| 86 | 
            +
                    pattern[$1]
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                def query(query, con = nil)
         | 
| 91 | 
            +
                  begin
         | 
| 92 | 
            +
                    con = con.nil? ? get_connection : con
         | 
| 93 | 
            +
                    con = con.ping ? con : get_connection
         | 
| 94 | 
            +
                    return con.query(query), con
         | 
| 95 | 
            +
                  rescue Exception => e
         | 
| 96 | 
            +
                    $log.warn "mysql_appender: #{e}"
         | 
| 97 | 
            +
                    sleep @interval
         | 
| 98 | 
            +
                    retry
         | 
| 99 | 
            +
                  end
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                def get_connection
         | 
| 103 | 
            +
                  begin
         | 
| 104 | 
            +
                    return Mysql2::Client.new({
         | 
| 105 | 
            +
                      :host => @host,
         | 
| 106 | 
            +
                      :port => @port,
         | 
| 107 | 
            +
                      :username => @username,
         | 
| 108 | 
            +
                      :password => @password,
         | 
| 109 | 
            +
                      :database => @database,
         | 
| 110 | 
            +
                      :encoding => @encoding,
         | 
| 111 | 
            +
                      :reconnect => true,
         | 
| 112 | 
            +
                      :stream => true,
         | 
| 113 | 
            +
                      :cache_rows => false
         | 
| 114 | 
            +
                    })
         | 
| 115 | 
            +
                  rescue Exception => e
         | 
| 116 | 
            +
                    $log.warn "mysql_appender: #{e}"
         | 
| 117 | 
            +
                    sleep @interval
         | 
| 118 | 
            +
                    retry
         | 
| 119 | 
            +
                  end
         | 
| 120 | 
            +
                end
         | 
| 121 | 
            +
              end
         | 
| 122 | 
            +
            end
         | 
    
        data/test/test_helper.rb
    ADDED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,85 +1,85 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: fluent-plugin-mysql-appender
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - tsuyoshi_terasaki
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 | 
            -
            bindir:  | 
| 9 | 
            +
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016-11- | 
| 11 | 
            +
            date: 2016-11-08 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            -
              name:  | 
| 14 | 
            +
              name: fluentd
         | 
| 15 15 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 16 | 
             
                requirements:
         | 
| 17 | 
            -
                - - " | 
| 17 | 
            +
                - - ">="
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: ' | 
| 20 | 
            -
              type: : | 
| 19 | 
            +
                    version: '0'
         | 
| 20 | 
            +
              type: :runtime
         | 
| 21 21 | 
             
              prerelease: false
         | 
| 22 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 23 | 
             
                requirements:
         | 
| 24 | 
            -
                - - " | 
| 24 | 
            +
                - - ">="
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            -
                    version: ' | 
| 26 | 
            +
                    version: '0'
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            -
              name:  | 
| 28 | 
            +
              name: mysql2
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 30 | 
             
                requirements:
         | 
| 31 | 
            -
                - - " | 
| 31 | 
            +
                - - ">="
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: ' | 
| 34 | 
            -
              type: : | 
| 33 | 
            +
                    version: '0'
         | 
| 34 | 
            +
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 | 
            -
                - - " | 
| 38 | 
            +
                - - ">="
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: ' | 
| 40 | 
            +
                    version: '0'
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            -
              name:  | 
| 42 | 
            +
              name: bundler
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 44 | 
             
                requirements:
         | 
| 45 45 | 
             
                - - "~>"
         | 
| 46 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            -
                    version: ' | 
| 47 | 
            +
                    version: '1.13'
         | 
| 48 48 | 
             
              type: :development
         | 
| 49 49 | 
             
              prerelease: false
         | 
| 50 50 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 51 | 
             
                requirements:
         | 
| 52 52 | 
             
                - - "~>"
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            -
                    version: ' | 
| 54 | 
            +
                    version: '1.13'
         | 
| 55 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            -
              name:  | 
| 56 | 
            +
              name: rake
         | 
| 57 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 58 | 
             
                requirements:
         | 
| 59 | 
            -
                - - " | 
| 59 | 
            +
                - - "~>"
         | 
| 60 60 | 
             
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            -
                    version: '0'
         | 
| 62 | 
            -
              type: : | 
| 61 | 
            +
                    version: '10.0'
         | 
| 62 | 
            +
              type: :development
         | 
| 63 63 | 
             
              prerelease: false
         | 
| 64 64 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 65 | 
             
                requirements:
         | 
| 66 | 
            -
                - - " | 
| 66 | 
            +
                - - "~>"
         | 
| 67 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            -
                    version: '0'
         | 
| 68 | 
            +
                    version: '10.0'
         | 
| 69 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            -
              name:  | 
| 70 | 
            +
              name: minitest
         | 
| 71 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 72 | 
             
                requirements:
         | 
| 73 | 
            -
                - - " | 
| 73 | 
            +
                - - "~>"
         | 
| 74 74 | 
             
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            -
                    version: '0'
         | 
| 76 | 
            -
              type: : | 
| 75 | 
            +
                    version: '5.0'
         | 
| 76 | 
            +
              type: :development
         | 
| 77 77 | 
             
              prerelease: false
         | 
| 78 78 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 79 | 
             
                requirements:
         | 
| 80 | 
            -
                - - " | 
| 80 | 
            +
                - - "~>"
         | 
| 81 81 | 
             
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            -
                    version: '0'
         | 
| 82 | 
            +
                    version: '5.0'
         | 
| 83 83 | 
             
            description: Simple incremental id's insert.
         | 
| 84 84 | 
             
            email:
         | 
| 85 85 | 
             
            - tsuyoshi_terasaki@realworld.jp
         | 
| @@ -93,11 +93,10 @@ files: | |
| 93 93 | 
             
            - LICENSE.txt
         | 
| 94 94 | 
             
            - README.md
         | 
| 95 95 | 
             
            - Rakefile
         | 
| 96 | 
            -
            - bin/console
         | 
| 97 | 
            -
            - bin/setup
         | 
| 98 96 | 
             
            - fluent-plugin-mysql-appender.gemspec
         | 
| 99 | 
            -
            - lib/fluent/plugin/ | 
| 100 | 
            -
            -  | 
| 97 | 
            +
            - lib/fluent/plugin/in_mysql_appender.rb
         | 
| 98 | 
            +
            - test/fluent/plugin/in_mysql_appender_test.rb
         | 
| 99 | 
            +
            - test/test_helper.rb
         | 
| 101 100 | 
             
            homepage: https://github.com/rw-hub/fluent-plugin-mysql-appender
         | 
| 102 101 | 
             
            licenses:
         | 
| 103 102 | 
             
            - MIT
         | 
| @@ -122,4 +121,6 @@ rubygems_version: 2.5.1 | |
| 122 121 | 
             
            signing_key: 
         | 
| 123 122 | 
             
            specification_version: 4
         | 
| 124 123 | 
             
            summary: Fluentd input plugin to track insert event from MySQL database server.
         | 
| 125 | 
            -
            test_files: | 
| 124 | 
            +
            test_files:
         | 
| 125 | 
            +
            - test/fluent/plugin/in_mysql_appender_test.rb
         | 
| 126 | 
            +
            - test/test_helper.rb
         | 
    
        data/bin/console
    DELETED
    
    | @@ -1,14 +0,0 @@ | |
| 1 | 
            -
            #!/usr/bin/env ruby
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require "bundler/setup"
         | 
| 4 | 
            -
            require "fluent/plugin/mysql/appender"
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            # You can add fixtures and/or initialization code here to make experimenting
         | 
| 7 | 
            -
            # with your gem easier. You can also use a different console, if you like.
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            # (If you use this, don't forget to add pry to your Gemfile!)
         | 
| 10 | 
            -
            # require "pry"
         | 
| 11 | 
            -
            # Pry.start
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            require "irb"
         | 
| 14 | 
            -
            IRB.start
         | 
    
        data/bin/setup
    DELETED
    
    
| @@ -1,130 +0,0 @@ | |
| 1 | 
            -
            require "fluent/plugin/mysql/appender/version"
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module Fluent
         | 
| 4 | 
            -
              module Plugin
         | 
| 5 | 
            -
                module Mysql
         | 
| 6 | 
            -
                  module Appender
         | 
| 7 | 
            -
                    class MysqlAppenderInput < Fluent::Input
         | 
| 8 | 
            -
                      Plugin.register_input('mysql_appender', self)
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                      # Define `router` method to support v0.10.57 or earlier
         | 
| 11 | 
            -
                      unless method_defined?(:router)
         | 
| 12 | 
            -
                        define_method("router") { Engine }
         | 
| 13 | 
            -
                      end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                      def initialize
         | 
| 16 | 
            -
                        require 'mysql2'
         | 
| 17 | 
            -
                        super
         | 
| 18 | 
            -
                      end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                      config_param :host, :string, :default => 'localhost'
         | 
| 21 | 
            -
                      config_param :port, :integer, :default => 3306
         | 
| 22 | 
            -
                      config_param :username, :string, :default => 'root'
         | 
| 23 | 
            -
                      config_param :password, :string, :default => nil, :secret => true
         | 
| 24 | 
            -
                      config_param :database, :string, :default => nil
         | 
| 25 | 
            -
                      config_param :encoding, :string, :default => 'utf8'
         | 
| 26 | 
            -
                      config_param :query, :string
         | 
| 27 | 
            -
                      config_param :primary_key, :string, :default => 'id'
         | 
| 28 | 
            -
                      config_param :interval, :string, :default => '1m'
         | 
| 29 | 
            -
                      config_param :tag, :string, :default => nil
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                      def configure(conf)
         | 
| 32 | 
            -
                        super
         | 
| 33 | 
            -
                        @interval = Config.time_value(@interval)
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                        if @tag.nil?
         | 
| 36 | 
            -
                          raise Fluent::ConfigError, "mysql_appender: missing 'tag' parameter. Please add following line into config like 'tag replicator.mydatabase.mytable.${event}.${primary_key}'"
         | 
| 37 | 
            -
                        end
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                        $log.info "adding mysql_appender worker. :tag=>#{tag} :query=>#{@query} :prepared_query=>#{@prepared_query} :interval=>#{@interval}sec"
         | 
| 40 | 
            -
                      end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                      def start
         | 
| 43 | 
            -
                        @thread = Thread.new(&method(:run))
         | 
| 44 | 
            -
                      end
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                      def shutdown
         | 
| 47 | 
            -
                        Thread.kill(@thread)
         | 
| 48 | 
            -
                      end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                      def run
         | 
| 51 | 
            -
                        begin
         | 
| 52 | 
            -
                          poll
         | 
| 53 | 
            -
                        rescue StandardError => e
         | 
| 54 | 
            -
                          $log.error "mysql_appender: failed to execute query."
         | 
| 55 | 
            -
                          $log.error "error: #{e.message}"
         | 
| 56 | 
            -
                          $log.error e.backtrace.join("\n")
         | 
| 57 | 
            -
                        end
         | 
| 58 | 
            -
                      end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                      def poll
         | 
| 61 | 
            -
                        con = get_connection()
         | 
| 62 | 
            -
                        max_id = -1
         | 
| 63 | 
            -
                        loop do
         | 
| 64 | 
            -
                          rows_count = 0
         | 
| 65 | 
            -
                          start_time = Time.now
         | 
| 66 | 
            -
                          if max_id == -1
         | 
| 67 | 
            -
                            select_query = @query + " order by #{primary_key} asc"
         | 
| 68 | 
            -
                          else
         | 
| 69 | 
            -
                            select_query = @query + " where #{primary_key} > #{max_id} order by #{primary_key} asc"
         | 
| 70 | 
            -
                          end
         | 
| 71 | 
            -
                          rows, con = query(select_query, con)
         | 
| 72 | 
            -
                          rows.each_with_index do |row, index|
         | 
| 73 | 
            -
                            tag = format_tag(@tag, {:event => :insert})
         | 
| 74 | 
            -
                            router.emit(tag, Engine.now, row)
         | 
| 75 | 
            -
                            rows_count += 1
         | 
| 76 | 
            -
                            if index == rows.size - 1
         | 
| 77 | 
            -
                              max_id = row[@primary_key]
         | 
| 78 | 
            -
                            end
         | 
| 79 | 
            -
                          end
         | 
| 80 | 
            -
                          con.close
         | 
| 81 | 
            -
                          elapsed_time = sprintf("%0.02f", Time.now - start_time)
         | 
| 82 | 
            -
                          $log.info "mysql_appender: finished execution :tag=>#{tag} :rows_count=>#{rows_count} :elapsed_time=>#{elapsed_time} sec"
         | 
| 83 | 
            -
                          sleep @interval
         | 
| 84 | 
            -
                        end
         | 
| 85 | 
            -
                      end
         | 
| 86 | 
            -
             | 
| 87 | 
            -
                      def format_tag(tag, param)
         | 
| 88 | 
            -
                        pattern = {'${event}' => param[:event].to_s, '${primary_key}' => @primary_key}
         | 
| 89 | 
            -
                        tag.gsub(/(\${[a-z_]+})/) do
         | 
| 90 | 
            -
                          $log.warn "mysql_appender: missing placeholder. :tag=>#{tag} :placeholder=>#{$1}" unless pattern.include?($1)
         | 
| 91 | 
            -
                          pattern[$1]
         | 
| 92 | 
            -
                        end
         | 
| 93 | 
            -
                      end
         | 
| 94 | 
            -
             | 
| 95 | 
            -
                      def query(query, con = nil)
         | 
| 96 | 
            -
                        begin
         | 
| 97 | 
            -
                          con = con.nil? ? get_connection : con
         | 
| 98 | 
            -
                          con = con.ping ? con : get_connection
         | 
| 99 | 
            -
                          return con.query(query), con
         | 
| 100 | 
            -
                        rescue Exception => e
         | 
| 101 | 
            -
                          $log.warn "mysql_appender: #{e}"
         | 
| 102 | 
            -
                          sleep @interval
         | 
| 103 | 
            -
                          retry
         | 
| 104 | 
            -
                        end
         | 
| 105 | 
            -
                      end
         | 
| 106 | 
            -
             | 
| 107 | 
            -
                      def get_connection
         | 
| 108 | 
            -
                        begin
         | 
| 109 | 
            -
                          return Mysql2::Client.new({
         | 
| 110 | 
            -
                            :host => @host,
         | 
| 111 | 
            -
                            :port => @port,
         | 
| 112 | 
            -
                            :username => @username,
         | 
| 113 | 
            -
                            :password => @password,
         | 
| 114 | 
            -
                            :database => @database,
         | 
| 115 | 
            -
                            :encoding => @encoding,
         | 
| 116 | 
            -
                            :reconnect => true,
         | 
| 117 | 
            -
                            :stream => true,
         | 
| 118 | 
            -
                            :cache_rows => false
         | 
| 119 | 
            -
                          })
         | 
| 120 | 
            -
                        rescue Exception => e
         | 
| 121 | 
            -
                          $log.warn "mysql_appender: #{e}"
         | 
| 122 | 
            -
                          sleep @interval
         | 
| 123 | 
            -
                          retry
         | 
| 124 | 
            -
                        end
         | 
| 125 | 
            -
                      end
         | 
| 126 | 
            -
                    end
         | 
| 127 | 
            -
                  end
         | 
| 128 | 
            -
                end
         | 
| 129 | 
            -
              end
         | 
| 130 | 
            -
            end
         |