Sha256: 5d4e9da166f5fd21503015d4e6f426a9f1f1419b2b1bc08e733d80209d58f276

Contents?: true

Size: 1.9 KB

Versions: 2

Compression:

Stored size: 1.9 KB

Contents

module JDBC
  class PreparedStatementBuilder
    def initialize(statement:, binding_values:)
      @statement = statement
      @binding_values = binding_values
    end

    def self.for_command(connection:, jdbc_sql:, binding_values:)
      new(
        statement: connection.prepare_statement(jdbc_sql, java.sql.Statement::RETURN_GENERATED_KEYS),
        binding_values: binding_values
      ).build
    end

    def self.for_query(connection:, jdbc_sql:, binding_values:)
      new(
        statement: connection.prepare_statement(jdbc_sql),
        binding_values: binding_values
      ).build
    end

    def build
      binding_values.each_with_index do |(value, type), index|
        method_name, method_parameters = ParameterSetter.new(
          index: index,
          value: value,
          type: type
        ).build

        statement.public_send(method_name, *method_parameters)
      end

      statement
    end

    private

    attr_reader :statement, :binding_values

    class ParameterSetter
      def initialize(index:, value:, type:)
        @index = index
        @value = value
        @type = type
      end

      def build
        [method_name, method_parameters]
      end

      private

      attr_reader :index, :value, :type

      def method_name
        value.nil? ? :set_null : :set_object
      end

      def method_parameters
        if value.nil?
          [parameter_index, jdbc_type || java.sql.Types::NULL]
        else
          [parameter_index, java_value, jdbc_type].compact
        end
      end

      def parameter_index
        index + 1
      end

      def jdbc_type
        type ? java.sql.Types.const_get(type) : nil
      end

      def uuid_value
        @uuid_value ||= UUID.new(value)
      end

      def java_value
        if uuid_value.valid?
          uuid_value
        else
          value
        end.to_java
      end
    end
    private_constant :ParameterSetter
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
jdbc-0.1.1-java lib/jdbc/prepared_statement_builder.rb
jdbc-0.1.0-jruby lib/jdbc/prepared_statement_builder.rb