class OCI8::BindType::String

def self.create(con, val, param, max_array_size)

def self.create(con, val, param, max_array_size)
  case param
  when Hash
    param[:length_semantics] = OCI8::properties[:length_semantics] unless param.has_key? :length_semantics
    unless param[:length]
      if val.respond_to? :to_str
        val = val.to_str
        if param[:length_semantics] == :char
          # character semantics
          param[:length] = val.size
        else
          # byte semantics
          if OCI8.encoding != val.encoding
            # If the string encoding is different with NLS_LANG character set,
            # convert it to get the length.
            val = val.encode(OCI8.encoding)
          end
          param[:length] = val.bytesize
        end
      else
        param[:length] = @@minimum_bind_length
      end
    end
    # use the default value when :nchar is not set explicitly.
    param[:nchar] = OCI8.properties[:bind_string_as_nchar] unless param.has_key?(:nchar)
  when OCI8::Metadata::Base
    case param.data_type
    when :char, :varchar2
      length_semantics = OCI8.properties[:length_semantics]
      if length_semantics == :char
        length = param.char_size
      else
        length = param.data_size * OCI8.nls_ratio
      end
      param = {
        :length => length,
        :length_semantics => length_semantics,
        :nchar => (param.charset_form == :nchar),
      }
    when :raw
      # HEX needs twice space.
      param = {:length => param.data_size * 2}
    else
      param = {:length => @@minimum_bind_length}
    end
  end
  self.new(con, val, param, max_array_size)
end

def self.minimum_bind_length

def self.minimum_bind_length
  @@minimum_bind_length
end

def self.minimum_bind_length=(val)

def self.minimum_bind_length=(val)
  @@minimum_bind_length = val
end