lib/logstash/inputs/jdbc.rb in logstash-input-jdbc-3.0.2 vs lib/logstash/inputs/jdbc.rb in logstash-input-jdbc-3.1.0

- old
+ new

@@ -158,10 +158,30 @@ config :record_last_run, :validate => :boolean, :default => true # Whether to force the lowercasing of identifier fields config :lowercase_column_names, :validate => :boolean, :default => true + # The character encoding of all columns, leave empty if the columns are already properly UTF-8 + # encoded. Specific columns charsets using :columns_charset can override this setting. + config :charset, :validate => :string + + # The character encoding for specific columns. This option will override the `:charset` option + # for the specified columns. + # + # Example: + # [source,ruby] + # ---------------------------------- + # input { + # jdbc { + # ... + # columns_charset => { "column0" => "ISO-8859-1" } + # ... + # } + # } + # this will only convert column0 that has ISO-8859-1 as an original encoding. + config :columns_charset, :validate => :hash, :default => {} + public def register require "rufus/scheduler" prepare_jdbc_connection @@ -171,10 +191,12 @@ if @tracking_column.nil? raise(LogStash::ConfigurationError, "Must set :tracking_column if :use_column_value is true.") end end + @enable_encoding = !@charset.nil? || !@columns_charset.empty? + # load sql_last_value from file if exists if @clean_run && File.exist?(@last_run_metadata_path) File.delete(@last_run_metadata_path) elsif File.exist?(@last_run_metadata_path) @sql_last_value = YAML.load(File.read(@last_run_metadata_path)) @@ -183,10 +205,24 @@ unless @statement.nil? ^ @statement_filepath.nil? raise(LogStash::ConfigurationError, "Must set either :statement or :statement_filepath. Only one may be set at a time.") end @statement = File.read(@statement_filepath) if @statement_filepath + + if (@jdbc_password_filepath and @jdbc_password) + raise(LogStash::ConfigurationError, "Only one of :jdbc_password, :jdbc_password_filepath may be set at a time.") + end + + @jdbc_password = File.read(@jdbc_password_filepath).strip if @jdbc_password_filepath + + if enable_encoding? + @converters = {} + @columns_charset.each do |column_name, encoding| + @converters[encoding] = LogStash::Util::Charset.new(encoding) + end + @converters[@charset] = LogStash::Util::Charset.new(@charset) if @charset + end end # def register def run(queue) if @schedule @scheduler = Rufus::Scheduler.new(:max_work_threads => 1) @@ -212,10 +248,14 @@ def execute_query(queue) # update default parameters @parameters['sql_last_value'] = @sql_last_value execute_statement(@statement, @parameters) do |row| + if enable_encoding? + ## do the necessary conversions to string elements + row = Hash[row.map { |k, v| [k.to_s, convert(k, v)] }] + end event = LogStash::Event.new(row) decorate(event) queue << event end end @@ -224,6 +264,26 @@ if @record_last_run File.write(@last_run_metadata_path, YAML.dump(@sql_last_value)) end end + private + + def enable_encoding? + @enable_encoding + end + + # make sure the encoding is uniform over fields + def convert(column_name, value) + return value unless value.is_a?(String) + column_charset = @columns_charset[column_name] + if column_charset + converter = @converters[column_charset] + converter.convert(value) + elsif @charset + converter = @converters[@charset] + converter.convert(value) + else + value + end + end end # class LogStash::Inputs::Jdbc