activerecord-jdbc-adapter 70.0-java → 70.1-java
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/Rakefile +1 -1
- data/activerecord-jdbc-adapter.gemspec +1 -1
- data/lib/arel/visitors/compat.rb +5 -33
- data/lib/arel/visitors/h2.rb +1 -13
- data/lib/arel/visitors/hsqldb.rb +1 -21
- data/lib/arel/visitors/sql_server.rb +2 -103
- data/lib/arjdbc/abstract/database_statements.rb +8 -0
- data/lib/arjdbc/discover.rb +0 -67
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/column.rb +1 -26
- data/lib/arjdbc/jdbc.rb +0 -7
- data/lib/arjdbc/oracle/adapter.rb +3 -22
- data/lib/arjdbc/postgresql/adapter.rb +152 -3
- data/lib/arjdbc/postgresql/oid_types.rb +155 -108
- data/lib/arjdbc/sqlite3/adapter.rb +27 -18
- data/lib/arjdbc/tasks/database_tasks.rb +0 -15
- data/lib/arjdbc/util/serialized_attributes.rb +0 -22
- data/lib/arjdbc/version.rb +1 -1
- data/rakelib/02-test.rake +3 -18
- data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +5 -0
- metadata +2 -35
- data/lib/active_record/connection_adapters/as400_adapter.rb +0 -2
- data/lib/active_record/connection_adapters/db2_adapter.rb +0 -1
- data/lib/active_record/connection_adapters/derby_adapter.rb +0 -1
- data/lib/active_record/connection_adapters/informix_adapter.rb +0 -1
- data/lib/arel/visitors/db2.rb +0 -137
- data/lib/arel/visitors/derby.rb +0 -112
- data/lib/arel/visitors/firebird.rb +0 -79
- data/lib/arjdbc/db2/adapter.rb +0 -808
- data/lib/arjdbc/db2/as400.rb +0 -142
- data/lib/arjdbc/db2/column.rb +0 -131
- data/lib/arjdbc/db2/connection_methods.rb +0 -48
- data/lib/arjdbc/db2.rb +0 -4
- data/lib/arjdbc/derby/active_record_patch.rb +0 -13
- data/lib/arjdbc/derby/adapter.rb +0 -521
- data/lib/arjdbc/derby/connection_methods.rb +0 -20
- data/lib/arjdbc/derby/schema_creation.rb +0 -15
- data/lib/arjdbc/derby.rb +0 -3
- data/lib/arjdbc/firebird/adapter.rb +0 -413
- data/lib/arjdbc/firebird/connection_methods.rb +0 -23
- data/lib/arjdbc/firebird.rb +0 -4
- data/lib/arjdbc/informix/adapter.rb +0 -139
- data/lib/arjdbc/informix/connection_methods.rb +0 -9
- data/lib/arjdbc/sybase/adapter.rb +0 -47
- data/lib/arjdbc/sybase.rb +0 -2
- data/lib/arjdbc/tasks/db2_database_tasks.rb +0 -104
- data/lib/arjdbc/tasks/derby_database_tasks.rb +0 -95
- data/src/java/arjdbc/derby/DerbyModule.java +0 -178
- data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +0 -152
- data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +0 -174
- data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +0 -75
| @@ -1,5 +1,4 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 2 | 
             
            require 'thread'
         | 
| 4 3 |  | 
| 5 4 | 
             
            module ArJdbc
         | 
| @@ -91,8 +90,23 @@ module ArJdbc | |
| 91 90 | 
             
                  end
         | 
| 92 91 |  | 
| 93 92 | 
             
                  def get_oid_type(oid, fmod, column_name, sql_type = '') # :nodoc:
         | 
| 94 | 
            -
                     | 
| 95 | 
            -
             | 
| 93 | 
            +
                    # Note: type_map is storing a bunch of oid type prefixed with a namespace even
         | 
| 94 | 
            +
                    # if they are not namespaced (e.g. ""."oidvector").  builtin types which are
         | 
| 95 | 
            +
                    # common seem to not be prefixed (e.g. "varchar").  OID numbers are also keys
         | 
| 96 | 
            +
                    # but JDBC never returns those.  So the current scheme is to check with
         | 
| 97 | 
            +
                    # what we got and that covers number and plain strings and otherwise we will
         | 
| 98 | 
            +
                    # wrap with the namespace form.
         | 
| 99 | 
            +
                    found = type_map.key?(oid)
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                    if !found
         | 
| 102 | 
            +
                      key = oid.kind_of?(String) && oid != "oid" ? "\"\".\"#{oid}\"" : oid
         | 
| 103 | 
            +
                      found = type_map.key?(key)
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                      if !found
         | 
| 106 | 
            +
                        load_additional_types([oid])
         | 
| 107 | 
            +
                      else
         | 
| 108 | 
            +
                        oid = key
         | 
| 109 | 
            +
                      end
         | 
| 96 110 | 
             
                    end
         | 
| 97 111 |  | 
| 98 112 | 
             
                    type_map.fetch(oid, fmod, sql_type) {
         | 
| @@ -103,132 +117,165 @@ module ArJdbc | |
| 103 117 | 
             
                    }
         | 
| 104 118 | 
             
                  end
         | 
| 105 119 |  | 
| 120 | 
            +
                  def reload_type_map
         | 
| 121 | 
            +
                      type_map.clear
         | 
| 122 | 
            +
                      initialize_type_map
         | 
| 123 | 
            +
                  end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                    def initialize_type_map_inner(m)
         | 
| 126 | 
            +
                      m.register_type "int2", Type::Integer.new(limit: 2)
         | 
| 127 | 
            +
                      m.register_type "int4", Type::Integer.new(limit: 4)
         | 
| 128 | 
            +
                      m.register_type "int8", Type::Integer.new(limit: 8)
         | 
| 129 | 
            +
                      m.register_type "oid", OID::Oid.new
         | 
| 130 | 
            +
                      m.register_type "float4", Type::Float.new
         | 
| 131 | 
            +
                      m.alias_type "float8", "float4"
         | 
| 132 | 
            +
                      m.register_type "text", Type::Text.new
         | 
| 133 | 
            +
                      register_class_with_limit m, "varchar", Type::String
         | 
| 134 | 
            +
                      m.alias_type "char", "varchar"
         | 
| 135 | 
            +
                      m.alias_type "name", "varchar"
         | 
| 136 | 
            +
                      m.alias_type "bpchar", "varchar"
         | 
| 137 | 
            +
                      m.register_type "bool", Type::Boolean.new
         | 
| 138 | 
            +
                      register_class_with_limit m, "bit", OID::Bit
         | 
| 139 | 
            +
                      register_class_with_limit m, "varbit", OID::BitVarying
         | 
| 140 | 
            +
                      m.register_type "date", OID::Date.new
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                      m.register_type "money", OID::Money.new
         | 
| 143 | 
            +
                      m.register_type "bytea", OID::Bytea.new
         | 
| 144 | 
            +
                      m.register_type "point", OID::Point.new
         | 
| 145 | 
            +
                      m.register_type "hstore", OID::Hstore.new
         | 
| 146 | 
            +
                      m.register_type "json", Type::Json.new
         | 
| 147 | 
            +
                      m.register_type "jsonb", OID::Jsonb.new
         | 
| 148 | 
            +
                      m.register_type "cidr", OID::Cidr.new
         | 
| 149 | 
            +
                      m.register_type "inet", OID::Inet.new
         | 
| 150 | 
            +
                      m.register_type "uuid", OID::Uuid.new
         | 
| 151 | 
            +
                      m.register_type "xml", OID::Xml.new
         | 
| 152 | 
            +
                      m.register_type "tsvector", OID::SpecializedString.new(:tsvector)
         | 
| 153 | 
            +
                      m.register_type "macaddr", OID::Macaddr.new
         | 
| 154 | 
            +
                      m.register_type "citext", OID::SpecializedString.new(:citext)
         | 
| 155 | 
            +
                      m.register_type "ltree", OID::SpecializedString.new(:ltree)
         | 
| 156 | 
            +
                      m.register_type "line", OID::SpecializedString.new(:line)
         | 
| 157 | 
            +
                      m.register_type "lseg", OID::SpecializedString.new(:lseg)
         | 
| 158 | 
            +
                      m.register_type "box", OID::SpecializedString.new(:box)
         | 
| 159 | 
            +
                      m.register_type "path", OID::SpecializedString.new(:path)
         | 
| 160 | 
            +
                      m.register_type "polygon", OID::SpecializedString.new(:polygon)
         | 
| 161 | 
            +
                      m.register_type "circle", OID::SpecializedString.new(:circle)
         | 
| 162 | 
            +
                      m.register_type "regproc", OID::Enum.new
         | 
| 163 | 
            +
                      # FIXME: adding this vector type leads to quoting not handlign Array data in quoting.
         | 
| 164 | 
            +
                      #m.register_type "_int4", OID::Vector.new(",", m.lookup("int4"))
         | 
| 165 | 
            +
                      register_class_with_precision m, "time", Type::Time
         | 
| 166 | 
            +
                      register_class_with_precision m, "timestamp", OID::Timestamp
         | 
| 167 | 
            +
                      register_class_with_precision m, "timestamptz", OID::TimestampWithTimeZone
         | 
| 168 | 
            +
             | 
| 169 | 
            +
                      m.register_type "numeric" do |_, fmod, sql_type|
         | 
| 170 | 
            +
                        precision = extract_precision(sql_type)
         | 
| 171 | 
            +
                        scale = extract_scale(sql_type)
         | 
| 172 | 
            +
             | 
| 173 | 
            +
                        # The type for the numeric depends on the width of the field,
         | 
| 174 | 
            +
                        # so we'll do something special here.
         | 
| 175 | 
            +
                        #
         | 
| 176 | 
            +
                        # When dealing with decimal columns:
         | 
| 177 | 
            +
                        #
         | 
| 178 | 
            +
                        # places after decimal  = fmod - 4 & 0xffff
         | 
| 179 | 
            +
                        # places before decimal = (fmod - 4) >> 16 & 0xffff
         | 
| 180 | 
            +
                        if fmod && (fmod - 4 & 0xffff).zero?
         | 
| 181 | 
            +
                          # FIXME: Remove this class, and the second argument to
         | 
| 182 | 
            +
                          # lookups on PG
         | 
| 183 | 
            +
                          Type::DecimalWithoutScale.new(precision: precision)
         | 
| 184 | 
            +
                        else
         | 
| 185 | 
            +
                          OID::Decimal.new(precision: precision, scale: scale)
         | 
| 186 | 
            +
                        end
         | 
| 187 | 
            +
                      end
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                      m.register_type "interval" do |*args, sql_type|
         | 
| 190 | 
            +
                        precision = extract_precision(sql_type)
         | 
| 191 | 
            +
                        OID::Interval.new(precision: precision)
         | 
| 192 | 
            +
                      end
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                      # pgjdbc returns these if the column is auto-incrmenting
         | 
| 195 | 
            +
                      m.alias_type 'serial', 'int4'
         | 
| 196 | 
            +
                      m.alias_type 'bigserial', 'int8'
         | 
| 197 | 
            +
                    end
         | 
| 198 | 
            +
             | 
| 199 | 
            +
             | 
| 200 | 
            +
                  # We differ from AR here because we will initialize type_map when adapter initializes
         | 
| 106 201 | 
             
                  def type_map
         | 
| 107 202 | 
             
                    @type_map
         | 
| 108 203 | 
             
                  end
         | 
| 109 204 |  | 
| 110 | 
            -
                  def  | 
| 111 | 
            -
                     | 
| 112 | 
            -
             | 
| 113 | 
            -
                      initialize_type_map(@type_map)
         | 
| 114 | 
            -
                    end
         | 
| 205 | 
            +
                  def initialize_type_map(m = type_map)
         | 
| 206 | 
            +
                    initialize_type_map_inner(m)
         | 
| 207 | 
            +
                    load_additional_types
         | 
| 115 208 | 
             
                  end
         | 
| 116 209 |  | 
| 117 210 | 
             
                  private
         | 
| 118 211 |  | 
| 119 | 
            -
                  def  | 
| 120 | 
            -
                    register_class_with_limit | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 124 | 
            -
                     | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 127 | 
            -
             | 
| 128 | 
            -
                     | 
| 129 | 
            -
                     | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 132 | 
            -
             | 
| 133 | 
            -
                    register_class_with_limit m, 'varbit', OID::BitVarying
         | 
| 134 | 
            -
                    m.alias_type 'timestamptz', 'timestamp'
         | 
| 135 | 
            -
                    m.register_type 'date', OID::Date.new
         | 
| 136 | 
            -
             | 
| 137 | 
            -
                    m.register_type 'money', OID::Money.new
         | 
| 138 | 
            -
                    m.register_type 'bytea', OID::Bytea.new
         | 
| 139 | 
            -
                    m.register_type 'point', OID::Point.new
         | 
| 140 | 
            -
                    m.register_type 'hstore', OID::Hstore.new
         | 
| 141 | 
            -
                    m.register_type 'json', Type::Json.new
         | 
| 142 | 
            -
                    m.register_type 'jsonb', OID::Jsonb.new
         | 
| 143 | 
            -
                    m.register_type 'cidr', OID::Cidr.new
         | 
| 144 | 
            -
                    m.register_type 'inet', OID::Inet.new
         | 
| 145 | 
            -
                    m.register_type 'uuid', OID::Uuid.new
         | 
| 146 | 
            -
                    m.register_type 'xml', OID::Xml.new
         | 
| 147 | 
            -
                    m.register_type 'tsvector', OID::SpecializedString.new(:tsvector)
         | 
| 148 | 
            -
                    m.register_type 'macaddr', OID::Macaddr.new
         | 
| 149 | 
            -
                    m.register_type 'citext', OID::SpecializedString.new(:citext)
         | 
| 150 | 
            -
                    m.register_type 'ltree', OID::SpecializedString.new(:ltree)
         | 
| 151 | 
            -
                    m.register_type 'line', OID::SpecializedString.new(:line)
         | 
| 152 | 
            -
                    m.register_type 'lseg', OID::SpecializedString.new(:lseg)
         | 
| 153 | 
            -
                    m.register_type 'box', OID::SpecializedString.new(:box)
         | 
| 154 | 
            -
                    m.register_type 'path', OID::SpecializedString.new(:path)
         | 
| 155 | 
            -
                    m.register_type 'polygon', OID::SpecializedString.new(:polygon)
         | 
| 156 | 
            -
                    m.register_type 'circle', OID::SpecializedString.new(:circle)
         | 
| 157 | 
            -
             | 
| 158 | 
            -
                    m.register_type 'interval' do |*args, sql_type|
         | 
| 159 | 
            -
                      precision = extract_precision(sql_type)
         | 
| 160 | 
            -
                      OID::Interval.new(precision: precision)
         | 
| 212 | 
            +
                  def register_class_with_limit(...)
         | 
| 213 | 
            +
                    ::ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:register_class_with_limit, ...)
         | 
| 214 | 
            +
                  end
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                  def register_class_with_precision(...)
         | 
| 217 | 
            +
                    ::ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:register_class_with_precision, ...)
         | 
| 218 | 
            +
                  end
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                  def load_additional_types(oids = nil) # :nodoc:
         | 
| 221 | 
            +
                    initializer = ArjdbcTypeMapInitializer.new(type_map)
         | 
| 222 | 
            +
                    load_types_queries(initializer, oids) do |query|
         | 
| 223 | 
            +
                      execute_and_clear(query, "SCHEMA", []) do |records|
         | 
| 224 | 
            +
                        initializer.run(records)
         | 
| 225 | 
            +
                      end
         | 
| 161 226 | 
             
                    end
         | 
| 227 | 
            +
                  end
         | 
| 162 228 |  | 
| 163 | 
            -
             | 
| 164 | 
            -
                     | 
| 165 | 
            -
             | 
| 166 | 
            -
             | 
| 167 | 
            -
             | 
| 168 | 
            -
             | 
| 169 | 
            -
             | 
| 170 | 
            -
                       | 
| 171 | 
            -
             | 
| 172 | 
            -
                      #
         | 
| 173 | 
            -
                      # When dealing with decimal columns:
         | 
| 174 | 
            -
                      #
         | 
| 175 | 
            -
                      # places after decimal  = fmod - 4 & 0xffff
         | 
| 176 | 
            -
                      # places before decimal = (fmod - 4) >> 16 & 0xffff
         | 
| 177 | 
            -
                      if fmod && (fmod - 4 & 0xffff).zero?
         | 
| 178 | 
            -
                        # FIXME: Remove this class, and the second argument to
         | 
| 179 | 
            -
                        # lookups on PG
         | 
| 180 | 
            -
                        Type::DecimalWithoutScale.new(precision: precision)
         | 
| 229 | 
            +
                  def load_types_queries(initializer, oids)
         | 
| 230 | 
            +
                    query = <<~SQL
         | 
| 231 | 
            +
                        SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype
         | 
| 232 | 
            +
                        FROM pg_type as t
         | 
| 233 | 
            +
                        LEFT JOIN pg_range as r ON oid = rngtypid
         | 
| 234 | 
            +
                    SQL
         | 
| 235 | 
            +
                    if oids
         | 
| 236 | 
            +
                      if oids.all? { |e| e.kind_of? Numeric }
         | 
| 237 | 
            +
                        yield query + "WHERE t.oid IN (%s)" % oids.join(", ")
         | 
| 181 238 | 
             
                      else
         | 
| 182 | 
            -
                         | 
| 239 | 
            +
                        in_list = oids.map { |e| %Q{'#{e}'} }.join(", ")
         | 
| 240 | 
            +
                        yield query + "WHERE t.typname IN (%s)" % in_list
         | 
| 183 241 | 
             
                      end
         | 
| 242 | 
            +
                    else
         | 
| 243 | 
            +
                      yield query + initializer.query_conditions_for_known_type_names
         | 
| 244 | 
            +
                      yield query + initializer.query_conditions_for_known_type_types
         | 
| 245 | 
            +
                      yield query + initializer.query_conditions_for_array_types
         | 
| 184 246 | 
             
                    end
         | 
| 185 | 
            -
             | 
| 186 | 
            -
                    load_additional_types(m)
         | 
| 187 | 
            -
             | 
| 188 | 
            -
                    # pgjdbc returns these if the column is auto-incrmenting
         | 
| 189 | 
            -
                    m.alias_type 'serial', 'int4'
         | 
| 190 | 
            -
                    m.alias_type 'bigserial', 'int8'
         | 
| 191 247 | 
             
                  end
         | 
| 192 248 |  | 
| 193 | 
            -
                  def  | 
| 194 | 
            -
                     | 
| 249 | 
            +
                  def update_typemap_for_default_timezone
         | 
| 250 | 
            +
                    if @default_timezone != ActiveRecord.default_timezone && @timestamp_decoder
         | 
| 251 | 
            +
                      decoder_class = ActiveRecord.default_timezone == :utc ?
         | 
| 252 | 
            +
                                        PG::TextDecoder::TimestampUtc :
         | 
| 253 | 
            +
                                        PG::TextDecoder::TimestampWithoutTimeZone
         | 
| 195 254 |  | 
| 196 | 
            -
             | 
| 197 | 
            -
                       | 
| 198 | 
            -
                          SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype,
         | 
| 199 | 
            -
                            ns.nspname, ns.nspname = ANY(current_schemas(true)) in_ns
         | 
| 200 | 
            -
                          FROM pg_type as t
         | 
| 201 | 
            -
                          LEFT JOIN pg_range as r ON oid = rngtypid
         | 
| 202 | 
            -
                          JOIN pg_namespace AS ns ON t.typnamespace = ns.oid
         | 
| 203 | 
            -
                      SQL
         | 
| 204 | 
            -
                    else
         | 
| 205 | 
            -
                      query = <<-SQL
         | 
| 206 | 
            -
                          SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, t.typtype, t.typbasetype,
         | 
| 207 | 
            -
                            ns.nspname, ns.nspname = ANY(current_schemas(true)) in_ns
         | 
| 208 | 
            -
                          FROM pg_type as t
         | 
| 209 | 
            -
                          JOIN pg_namespace AS ns ON t.typnamespace = ns.oid
         | 
| 210 | 
            -
                      SQL
         | 
| 211 | 
            -
                    end
         | 
| 255 | 
            +
                      @timestamp_decoder = decoder_class.new(@timestamp_decoder.to_h)
         | 
| 256 | 
            +
                      @connection.type_map_for_results.add_coder(@timestamp_decoder)
         | 
| 212 257 |  | 
| 213 | 
            -
             | 
| 214 | 
            -
                      if oid.is_a? Numeric || oid.match(/^\d+$/)
         | 
| 215 | 
            -
                        # numeric OID
         | 
| 216 | 
            -
                        query += "WHERE t.oid = %s" % oid
         | 
| 258 | 
            +
                      @default_timezone = ActiveRecord.default_timezone
         | 
| 217 259 |  | 
| 218 | 
            -
                       | 
| 219 | 
            -
             | 
| 220 | 
            -
             | 
| 260 | 
            +
                      # if default timezone has changed, we need to reconfigure the connection
         | 
| 261 | 
            +
                      # (specifically, the session time zone)
         | 
| 262 | 
            +
                      configure_connection
         | 
| 263 | 
            +
                    end
         | 
| 264 | 
            +
                  end
         | 
| 221 265 |  | 
| 222 | 
            -
             | 
| 223 | 
            -
             | 
| 224 | 
            -
             | 
| 225 | 
            -
             | 
| 226 | 
            -
                    else
         | 
| 227 | 
            -
                      query += initializer.query_conditions_for_initial_load
         | 
| 266 | 
            +
                  def extract_scale(sql_type)
         | 
| 267 | 
            +
                    case sql_type
         | 
| 268 | 
            +
                    when /\((\d+)\)/ then 0
         | 
| 269 | 
            +
                    when /\((\d+)(,(\d+))\)/ then $3.to_i
         | 
| 228 270 | 
             
                    end
         | 
| 271 | 
            +
                  end
         | 
| 272 | 
            +
             | 
| 273 | 
            +
                  def extract_precision(sql_type)
         | 
| 274 | 
            +
                    $1.to_i if sql_type =~ /\((\d+)(,\d+)?\)/
         | 
| 275 | 
            +
                  end
         | 
| 229 276 |  | 
| 230 | 
            -
             | 
| 231 | 
            -
                     | 
| 277 | 
            +
                  def extract_limit(sql_type)
         | 
| 278 | 
            +
                    $1.to_i if sql_type =~ /\((.*)\)/
         | 
| 232 279 | 
             
                  end
         | 
| 233 280 |  | 
| 234 281 | 
             
                  # Support arrays/ranges for defining attributes that don't exist in the db
         | 
| @@ -756,6 +756,29 @@ module ActiveRecord::ConnectionAdapters | |
| 756 756 | 
             
                # Note: This is not an override of ours but a moved line from AR Sqlite3Adapter to register ours vs our copied module (which would be their class).
         | 
| 757 757 | 
             
            #    ActiveSupport.run_load_hooks(:active_record_sqlite3adapter, SQLite3Adapter)
         | 
| 758 758 |  | 
| 759 | 
            +
                # DIFFERENCE: FQN
         | 
| 760 | 
            +
                class SQLite3Integer < ::ActiveRecord::Type::Integer # :nodoc:
         | 
| 761 | 
            +
                  private
         | 
| 762 | 
            +
                  def _limit
         | 
| 763 | 
            +
                    # INTEGER storage class can be stored 8 bytes value.
         | 
| 764 | 
            +
                    # See https://www.sqlite.org/datatype3.html#storage_classes_and_datatypes
         | 
| 765 | 
            +
                    limit || 8
         | 
| 766 | 
            +
                  end
         | 
| 767 | 
            +
                end
         | 
| 768 | 
            +
             | 
| 769 | 
            +
                # DIFFERENCE: FQN
         | 
| 770 | 
            +
                ::ActiveRecord::Type.register(:integer, SQLite3Integer, adapter: :sqlite3)
         | 
| 771 | 
            +
             | 
| 772 | 
            +
                class << self
         | 
| 773 | 
            +
                  private
         | 
| 774 | 
            +
                    def initialize_type_map(m)
         | 
| 775 | 
            +
                      super
         | 
| 776 | 
            +
                      register_class_with_limit m, %r(int)i, SQLite3Integer
         | 
| 777 | 
            +
                    end
         | 
| 778 | 
            +
                end
         | 
| 779 | 
            +
             | 
| 780 | 
            +
                TYPE_MAP = ActiveRecord::Type::TypeMap.new.tap { |m| initialize_type_map(m) }
         | 
| 781 | 
            +
             | 
| 759 782 | 
             
                private
         | 
| 760 783 |  | 
| 761 784 | 
             
                # because the JDBC driver doesn't like multiple SQL statements in one JDBC statement
         | 
| @@ -763,6 +786,10 @@ module ActiveRecord::ConnectionAdapters | |
| 763 786 | 
             
                  total_sql
         | 
| 764 787 | 
             
                end
         | 
| 765 788 |  | 
| 789 | 
            +
                def type_map
         | 
| 790 | 
            +
                  TYPE_MAP
         | 
| 791 | 
            +
                end
         | 
| 792 | 
            +
             | 
| 766 793 | 
             
                # combine
         | 
| 767 794 | 
             
                def write_query?(sql) # :nodoc:
         | 
| 768 795 | 
             
                  return sql.any? { |stmt| super(stmt) } if sql.kind_of? Array
         | 
| @@ -770,23 +797,5 @@ module ActiveRecord::ConnectionAdapters | |
| 770 797 | 
             
                rescue ArgumentError # Invalid encoding
         | 
| 771 798 | 
             
                  !READ_QUERY.match?(sql.b)
         | 
| 772 799 | 
             
                end
         | 
| 773 | 
            -
             | 
| 774 | 
            -
                def initialize_type_map(m = type_map)
         | 
| 775 | 
            -
                  super
         | 
| 776 | 
            -
                  register_class_with_limit m, %r(int)i, SQLite3Integer
         | 
| 777 | 
            -
                end
         | 
| 778 | 
            -
             | 
| 779 | 
            -
                # DIFFERENCE: FQN
         | 
| 780 | 
            -
                class SQLite3Integer < ::ActiveRecord::Type::Integer # :nodoc:
         | 
| 781 | 
            -
                  private
         | 
| 782 | 
            -
                  def _limit
         | 
| 783 | 
            -
                    # INTEGER storage class can be stored 8 bytes value.
         | 
| 784 | 
            -
                    # See https://www.sqlite.org/datatype3.html#storage_classes_and_datatypes
         | 
| 785 | 
            -
                    limit || 8
         | 
| 786 | 
            -
                  end
         | 
| 787 | 
            -
                end
         | 
| 788 | 
            -
             | 
| 789 | 
            -
                # DIFFERENCE: FQN
         | 
| 790 | 
            -
                ::ActiveRecord::Type.register(:integer, SQLite3Integer, adapter: :sqlite3)
         | 
| 791 800 | 
             
              end
         | 
| 792 801 | 
             
            end
         | 
| @@ -10,21 +10,6 @@ module ArJdbc | |
| 10 10 |  | 
| 11 11 | 
             
                require 'arjdbc/tasks/jdbc_database_tasks'
         | 
| 12 12 | 
             
                require 'arjdbc/tasks/sqlite_database_tasks_patch'
         | 
| 13 | 
            -
                #require 'arjdbc/tasks/db2_database_tasks'
         | 
| 14 | 
            -
                #require 'arjdbc/tasks/derby_database_tasks'
         | 
| 15 | 
            -
                #require 'arjdbc/tasks/h2_database_tasks'
         | 
| 16 | 
            -
                #require 'arjdbc/tasks/hsqldb_database_tasks'
         | 
| 17 | 
            -
                #require 'arjdbc/tasks/mssql_database_tasks'
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                # re-invent built-in (but deprecated on 4.0) tasks :
         | 
| 20 | 
            -
                #register_tasks(/sqlserver/, MSSQLDatabaseTasks)
         | 
| 21 | 
            -
                #register_tasks(/mssql/, MSSQLDatabaseTasks) # (built-in) alias
         | 
| 22 | 
            -
                # tasks for custom (JDBC) adapters :
         | 
| 23 | 
            -
                #register_tasks(/db2/, DB2DatabaseTasks)
         | 
| 24 | 
            -
                #register_tasks(/derby/, DerbyDatabaseTasks)
         | 
| 25 | 
            -
                #register_tasks(/h2/, H2DatabaseTasks)
         | 
| 26 | 
            -
                #register_tasks(/hsqldb/, HSQLDBDatabaseTasks)
         | 
| 27 | 
            -
                # (default) generic JDBC task :
         | 
| 28 13 | 
             
                register_tasks(/^jdbc$/, JdbcDatabaseTasks)
         | 
| 29 14 |  | 
| 30 15 | 
             
                # NOTE: no need to register "built-in" adapters such as MySQL
         | 
| @@ -31,33 +31,11 @@ module ArJdbc | |
| 31 31 | 
             
                    SerializedAttributes.dump_column_value(self, column)
         | 
| 32 32 | 
             
                  end
         | 
| 33 33 |  | 
| 34 | 
            -
                  if defined? ActiveRecord::Type::Serialized # ArJdbc::AR42
         | 
| 35 | 
            -
             | 
| 36 34 | 
             
                  def self.dump_column_value(record, column)
         | 
| 37 35 | 
             
                    value = record[ column.name.to_s ]
         | 
| 38 36 | 
             
                    column.cast_type.type_cast_for_database(value)
         | 
| 39 37 | 
             
                  end
         | 
| 40 38 |  | 
| 41 | 
            -
                  else
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                  def self.dump_column_value(record, column)
         | 
| 44 | 
            -
                    value = record[ name = column.name.to_s ]
         | 
| 45 | 
            -
                    if record.class.respond_to?(:serialized_attributes)
         | 
| 46 | 
            -
                      if coder = record.class.serialized_attributes[name]
         | 
| 47 | 
            -
                        value = coder.respond_to?(:dump) ? coder.dump(value) : value.to_yaml
         | 
| 48 | 
            -
                      end
         | 
| 49 | 
            -
                    else
         | 
| 50 | 
            -
                      if record.respond_to?(:unserializable_attribute?)
         | 
| 51 | 
            -
                        value = value.to_yaml if record.unserializable_attribute?(name, column)
         | 
| 52 | 
            -
                      else
         | 
| 53 | 
            -
                        value = value.to_yaml if value.is_a?(Hash)
         | 
| 54 | 
            -
                      end
         | 
| 55 | 
            -
                    end
         | 
| 56 | 
            -
                    value
         | 
| 57 | 
            -
                  end
         | 
| 58 | 
            -
             | 
| 59 | 
            -
                  end
         | 
| 60 | 
            -
             | 
| 61 39 | 
             
                  def self.setup(lob_type = nil, after_save_alias = nil)
         | 
| 62 40 | 
             
                    ActiveRecord::Base.send :include, self # include SerializedAttributes
         | 
| 63 41 | 
             
                    ActiveRecord::Base.lob_type = lob_type unless lob_type.nil?
         | 
    
        data/lib/arjdbc/version.rb
    CHANGED
    
    
    
        data/rakelib/02-test.rake
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 |  | 
| 2 2 | 
             
            test_tasks = [ 'test_mysql', 'test_sqlite3', 'test_postgresql_with_hint' ]
         | 
| 3 3 | 
             
            if defined?(JRUBY_VERSION)
         | 
| 4 | 
            -
              test_tasks.push : | 
| 4 | 
            +
              test_tasks.push :test_hsqldb, :test_h2
         | 
| 5 5 | 
             
              test_tasks.push :test_jndi, :test_jdbc
         | 
| 6 6 | 
             
            end
         | 
| 7 7 |  | 
| @@ -55,7 +55,6 @@ def test_task_for(adapter, options = {}) | |
| 55 55 | 
             
              test_task
         | 
| 56 56 | 
             
            end
         | 
| 57 57 |  | 
| 58 | 
            -
            test_task_for :Derby, :desc => 'Run tests against (embedded) DerbyDB'
         | 
| 59 58 | 
             
            test_task_for :H2, :desc => 'Run tests against H2 database engine'
         | 
| 60 59 | 
             
            test_task_for :HSQLDB, :desc => 'Run tests against HyperSQL (Java) database'
         | 
| 61 60 | 
             
            test_task_for :MySQL #, :prereqs => 'db:mysql'
         | 
| @@ -64,29 +63,22 @@ test_task_for :PostgreSQL, :driver => ENV['JDBC_POSTGRES_VERSION'] || 'postgres' | |
| 64 63 | 
             
            task :test_postgres => :test_postgresql # alias
         | 
| 65 64 | 
             
            test_task_for :SQLite3, :driver => ENV['JDBC_SQLITE_VERSION']
         | 
| 66 65 | 
             
            task :test_sqlite => :test_sqlite3 # alias
         | 
| 67 | 
            -
            test_task_for :Firebird
         | 
| 68 66 |  | 
| 69 67 | 
             
            test_task_for :MariaDB, :files => FileList["test/db/mysql/*_test.rb"] do |test_task| #, :prereqs => 'db:mysql'
         | 
| 70 68 | 
             
              test_task.ruby_opts << '-rdb/mariadb_config'
         | 
| 71 69 | 
             
            end
         | 
| 72 70 |  | 
| 73 71 | 
             
            # ensure driver for these DBs is on your class-path
         | 
| 74 | 
            -
            [ :Oracle | 
| 72 | 
            +
            [ :Oracle ].each do |adapter|
         | 
| 75 73 | 
             
              test_task_for adapter, :desc => "Run tests against #{adapter} (ensure driver is on class-path)"
         | 
| 76 74 | 
             
            end
         | 
| 77 75 |  | 
| 78 | 
            -
            test_task_for :AS400, :desc => "Run tests against AS400 (DB2) (ensure driver is on class-path)",
         | 
| 79 | 
            -
                          :files => FileList["test/db2*_test.rb"] + FileList["test/db/db2/*_test.rb"]
         | 
| 80 | 
            -
             | 
| 81 | 
            -
            #task :test_jdbc => [ :test_jdbc_mysql, :test_jdbc_derby ] if defined?(JRUBY_VERSION)
         | 
| 82 | 
            -
             | 
| 83 76 | 
             
            test_task_for 'JDBC', :desc => 'Run tests against plain JDBC adapter (uses MySQL and Derby)',
         | 
| 84 77 | 
             
              :prereqs => [ 'db:mysql' ], :files => FileList['test/*jdbc_*test.rb'] do |test_task|
         | 
| 85 | 
            -
              test_task.libs << 'jdbc-mysql/lib' | 
| 78 | 
            +
              test_task.libs << 'jdbc-mysql/lib'
         | 
| 86 79 | 
             
            end
         | 
| 87 80 |  | 
| 88 81 | 
             
            # TODO since Derby AR 5.x support is not implemented we only run JNDI with MySQL :
         | 
| 89 | 
            -
            #task :test_jndi => [ :test_jndi_mysql, :test_jndi_derby ] if defined?(JRUBY_VERSION)
         | 
| 90 82 | 
             
            task :test_jndi => [ :test_jndi_mysql ] if defined?(JRUBY_VERSION)
         | 
| 91 83 |  | 
| 92 84 | 
             
            jndi_classpath = [ 'test/jars/tomcat-juli.jar', 'test/jars/tomcat-catalina.jar' ]
         | 
| @@ -100,13 +92,6 @@ get_jndi_classpath_opt = lambda do | |
| 100 92 | 
             
              "-J-cp \"#{cp.join(File::PATH_SEPARATOR)}\""
         | 
| 101 93 | 
             
            end
         | 
| 102 94 |  | 
| 103 | 
            -
            test_task_for 'JNDI_Derby', :desc => 'Run tests against a Derby JNDI connection',
         | 
| 104 | 
            -
              :prereqs => jndi_classpath, :files => FileList['test/*jndi_derby*test.rb'] do |test_task|
         | 
| 105 | 
            -
              test_task.libs << 'jdbc-derby/lib'
         | 
| 106 | 
            -
              test_task.ruby_opts << get_jndi_classpath_opt.call
         | 
| 107 | 
            -
              #test_task.verbose = true
         | 
| 108 | 
            -
            end
         | 
| 109 | 
            -
             | 
| 110 95 | 
             
            test_task_for 'JNDI_MySQL', :desc => 'Run tests against a MySQL JNDI connection',
         | 
| 111 96 | 
             
              :prereqs => [ 'db:mysql' ] + jndi_classpath, :files => FileList['test/*jndi_mysql*test.rb'] do |test_task|
         | 
| 112 97 | 
             
              test_task.libs << 'jdbc-mysql/lib'
         | 
| @@ -214,6 +214,11 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection | |
| 214 214 | 
             
                    });
         | 
| 215 215 | 
             
                }
         | 
| 216 216 |  | 
| 217 | 
            +
                @JRubyMethod
         | 
| 218 | 
            +
                public IRubyObject exec_params(ThreadContext context, IRubyObject sql, IRubyObject binds) {
         | 
| 219 | 
            +
                    return execute_prepared_query(context, sql, binds, null);
         | 
| 220 | 
            +
                }
         | 
| 221 | 
            +
             | 
| 217 222 | 
             
                private transient RubyClass oidArray; // PostgreSQL::OID::Array
         | 
| 218 223 |  | 
| 219 224 | 
             
                private RubyClass oidArray(final ThreadContext context) {
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: activerecord-jdbc-adapter
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: '70. | 
| 4 | 
            +
              version: '70.1'
         | 
| 5 5 | 
             
            platform: java
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Nick Sieger, Ola Bini, Karol Bucek and JRuby contributors
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2023-03-15 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -48,13 +48,9 @@ files: | |
| 48 48 | 
             
            - Rakefile
         | 
| 49 49 | 
             
            - Rakefile.jdbc
         | 
| 50 50 | 
             
            - activerecord-jdbc-adapter.gemspec
         | 
| 51 | 
            -
            - lib/active_record/connection_adapters/as400_adapter.rb
         | 
| 52 | 
            -
            - lib/active_record/connection_adapters/db2_adapter.rb
         | 
| 53 | 
            -
            - lib/active_record/connection_adapters/derby_adapter.rb
         | 
| 54 51 | 
             
            - lib/active_record/connection_adapters/firebird_adapter.rb
         | 
| 55 52 | 
             
            - lib/active_record/connection_adapters/h2_adapter.rb
         | 
| 56 53 | 
             
            - lib/active_record/connection_adapters/hsqldb_adapter.rb
         | 
| 57 | 
            -
            - lib/active_record/connection_adapters/informix_adapter.rb
         | 
| 58 54 | 
             
            - lib/active_record/connection_adapters/jdbc_adapter.rb
         | 
| 59 55 | 
             
            - lib/active_record/connection_adapters/jndi_adapter.rb
         | 
| 60 56 | 
             
            - lib/active_record/connection_adapters/mariadb_adapter.rb
         | 
| @@ -64,9 +60,6 @@ files: | |
| 64 60 | 
             
            - lib/active_record/connection_adapters/sqlite3_adapter.rb
         | 
| 65 61 | 
             
            - lib/activerecord-jdbc-adapter.rb
         | 
| 66 62 | 
             
            - lib/arel/visitors/compat.rb
         | 
| 67 | 
            -
            - lib/arel/visitors/db2.rb
         | 
| 68 | 
            -
            - lib/arel/visitors/derby.rb
         | 
| 69 | 
            -
            - lib/arel/visitors/firebird.rb
         | 
| 70 63 | 
             
            - lib/arel/visitors/h2.rb
         | 
| 71 64 | 
             
            - lib/arel/visitors/hsqldb.rb
         | 
| 72 65 | 
             
            - lib/arel/visitors/postgresql_jdbc.rb
         | 
| @@ -78,20 +71,7 @@ files: | |
| 78 71 | 
             
            - lib/arjdbc/abstract/database_statements.rb
         | 
| 79 72 | 
             
            - lib/arjdbc/abstract/statement_cache.rb
         | 
| 80 73 | 
             
            - lib/arjdbc/abstract/transaction_support.rb
         | 
| 81 | 
            -
            - lib/arjdbc/db2.rb
         | 
| 82 | 
            -
            - lib/arjdbc/db2/adapter.rb
         | 
| 83 | 
            -
            - lib/arjdbc/db2/as400.rb
         | 
| 84 | 
            -
            - lib/arjdbc/db2/column.rb
         | 
| 85 | 
            -
            - lib/arjdbc/db2/connection_methods.rb
         | 
| 86 | 
            -
            - lib/arjdbc/derby.rb
         | 
| 87 | 
            -
            - lib/arjdbc/derby/active_record_patch.rb
         | 
| 88 | 
            -
            - lib/arjdbc/derby/adapter.rb
         | 
| 89 | 
            -
            - lib/arjdbc/derby/connection_methods.rb
         | 
| 90 | 
            -
            - lib/arjdbc/derby/schema_creation.rb
         | 
| 91 74 | 
             
            - lib/arjdbc/discover.rb
         | 
| 92 | 
            -
            - lib/arjdbc/firebird.rb
         | 
| 93 | 
            -
            - lib/arjdbc/firebird/adapter.rb
         | 
| 94 | 
            -
            - lib/arjdbc/firebird/connection_methods.rb
         | 
| 95 75 | 
             
            - lib/arjdbc/h2.rb
         | 
| 96 76 | 
             
            - lib/arjdbc/h2/adapter.rb
         | 
| 97 77 | 
             
            - lib/arjdbc/h2/connection_methods.rb
         | 
| @@ -101,8 +81,6 @@ files: | |
| 101 81 | 
             
            - lib/arjdbc/hsqldb/explain_support.rb
         | 
| 102 82 | 
             
            - lib/arjdbc/hsqldb/schema_creation.rb
         | 
| 103 83 | 
             
            - lib/arjdbc/informix.rb
         | 
| 104 | 
            -
            - lib/arjdbc/informix/adapter.rb
         | 
| 105 | 
            -
            - lib/arjdbc/informix/connection_methods.rb
         | 
| 106 84 | 
             
            - lib/arjdbc/jdbc.rb
         | 
| 107 85 | 
             
            - lib/arjdbc/jdbc/adapter.rb
         | 
| 108 86 | 
             
            - lib/arjdbc/jdbc/adapter_java.jar
         | 
| @@ -138,13 +116,9 @@ files: | |
| 138 116 | 
             
            - lib/arjdbc/sqlite3.rb
         | 
| 139 117 | 
             
            - lib/arjdbc/sqlite3/adapter.rb
         | 
| 140 118 | 
             
            - lib/arjdbc/sqlite3/connection_methods.rb
         | 
| 141 | 
            -
            - lib/arjdbc/sybase.rb
         | 
| 142 | 
            -
            - lib/arjdbc/sybase/adapter.rb
         | 
| 143 119 | 
             
            - lib/arjdbc/tasks.rb
         | 
| 144 120 | 
             
            - lib/arjdbc/tasks/database_tasks.rb
         | 
| 145 121 | 
             
            - lib/arjdbc/tasks/databases.rake
         | 
| 146 | 
            -
            - lib/arjdbc/tasks/db2_database_tasks.rb
         | 
| 147 | 
            -
            - lib/arjdbc/tasks/derby_database_tasks.rb
         | 
| 148 122 | 
             
            - lib/arjdbc/tasks/h2_database_tasks.rb
         | 
| 149 123 | 
             
            - lib/arjdbc/tasks/hsqldb_database_tasks.rb
         | 
| 150 124 | 
             
            - lib/arjdbc/tasks/jdbc_database_tasks.rb
         | 
| @@ -171,13 +145,9 @@ files: | |
| 171 145 | 
             
            - src/java/arjdbc/ArJdbcModule.java
         | 
| 172 146 | 
             
            - src/java/arjdbc/db2/DB2Module.java
         | 
| 173 147 | 
             
            - src/java/arjdbc/db2/DB2RubyJdbcConnection.java
         | 
| 174 | 
            -
            - src/java/arjdbc/derby/DerbyModule.java
         | 
| 175 | 
            -
            - src/java/arjdbc/derby/DerbyRubyJdbcConnection.java
         | 
| 176 | 
            -
            - src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java
         | 
| 177 148 | 
             
            - src/java/arjdbc/h2/H2Module.java
         | 
| 178 149 | 
             
            - src/java/arjdbc/h2/H2RubyJdbcConnection.java
         | 
| 179 150 | 
             
            - src/java/arjdbc/hsqldb/HSQLDBModule.java
         | 
| 180 | 
            -
            - src/java/arjdbc/informix/InformixRubyJdbcConnection.java
         | 
| 181 151 | 
             
            - src/java/arjdbc/jdbc/AdapterJavaService.java
         | 
| 182 152 | 
             
            - src/java/arjdbc/jdbc/Callable.java
         | 
| 183 153 | 
             
            - src/java/arjdbc/jdbc/ConnectionFactory.java
         | 
| @@ -215,9 +185,6 @@ post_install_message: | |
| 215 185 | 
             
            rdoc_options:
         | 
| 216 186 | 
             
            - "--main"
         | 
| 217 187 | 
             
            - README.md
         | 
| 218 | 
            -
            - "-SHN"
         | 
| 219 | 
            -
            - "-f"
         | 
| 220 | 
            -
            - darkfish
         | 
| 221 188 | 
             
            require_paths:
         | 
| 222 189 | 
             
            - lib
         | 
| 223 190 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            require 'arjdbc/db2'
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            require 'arjdbc/derby'
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            require 'arjdbc/informix'
         |