akapu_firebird_adapter 6.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b8b56f53882af6b7e1422cf168f656c75c218a4e5793df59cc4510b43be72d5e
4
+ data.tar.gz: 8d0c9f253f74259ea4c53051ce9cea787ffae16bd9078af156f15b4e70d357b5
5
+ SHA512:
6
+ metadata.gz: 4a45a43df378b8c5a7cef865656ddb6089346c849b30bc5787cb8f5c611918fc9bd0c62afbc405b2831a920a0f95f2190a01d5dca2996c9a2eb217e526744450
7
+ data.tar.gz: 3966cf2f0ee811d26efd6dd241a20d9e17a93a03de46a39148952010cee8d0dcf8b2c3bbf34b87aa15df0b65cdb9998a67f05861df1063d294d6377edc2df35e
@@ -0,0 +1,18 @@
1
+ module ActiveRecord::ConnectionHandling
2
+ def firebird_connection(config)
3
+ require 'active_record/extensions'
4
+ require 'active_record/internal_metadata_extensions'
5
+
6
+ config = config.symbolize_keys.dup.reverse_merge(downcase_names: true, port: 3050, encoding: ActiveRecord::ConnectionAdapters::FirebirdAdapter::DEFAULT_ENCODING)
7
+
8
+ if config[:host]
9
+ config[:database] = "#{config[:host]}/#{config[:port]}:#{config[:database]}"
10
+ else
11
+ config[:database] = File.expand_path(config[:database], Rails.root)
12
+ end
13
+
14
+ connection = ::Fb::Database.new(config).connect
15
+
16
+ ActiveRecord::ConnectionAdapters::FirebirdAdapter.new(connection, logger, config)
17
+ end
18
+ end
@@ -0,0 +1,33 @@
1
+ module ActiveRecord::ConnectionAdapters::Firebird
2
+ module DatabaseLimits
3
+
4
+ def table_alias_length
5
+ 31
6
+ end
7
+
8
+ def column_name_length
9
+ 31
10
+ end
11
+
12
+ def table_name_length
13
+ 31
14
+ end
15
+
16
+ def index_name_length
17
+ 31
18
+ end
19
+
20
+ def indexes_per_table
21
+ 65_535
22
+ end
23
+
24
+ def in_clause_length
25
+ 1_499
26
+ end
27
+
28
+ def sql_query_length
29
+ 32_767
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,116 @@
1
+ module ActiveRecord::ConnectionAdapters::Firebird::DatabaseStatements
2
+
3
+ def native_database_types
4
+ {
5
+ primary_key: 'integer not null primary key',
6
+ string: { name: 'varchar', limit: 255 },
7
+ text: { name: 'blob sub_type text' },
8
+ integer: { name: 'integer' },
9
+ float: { name: 'float' },
10
+ decimal: { name: 'decimal' },
11
+ datetime: { name: 'timestamp' },
12
+ timestamp: { name: 'timestamp' },
13
+ date: { name: 'date' },
14
+ binary: { name: 'blob' },
15
+ boolean: { name: 'smallint' }
16
+ }
17
+ end
18
+
19
+ def execute(sql, name = nil)
20
+ sql = sql.encode(encoding, 'UTF-8')
21
+
22
+ log(sql, name) do
23
+ ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
24
+ @connection.query(sql)
25
+ end
26
+ end
27
+ end
28
+
29
+ def exec_query(sql, name = 'SQL', binds = [], prepare: false)
30
+ sql = sql.encode(encoding, 'UTF-8')
31
+
32
+ type_casted_binds = type_casted_binds(binds).map do |value|
33
+ value.encode(encoding) rescue value
34
+ end
35
+
36
+ log(sql, name, binds, type_casted_binds) do
37
+ ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
38
+ begin
39
+ result = @connection.execute(sql, *type_casted_binds)
40
+ if result.is_a?(Fb::Cursor)
41
+ fields = result.fields.map(&:name)
42
+ rows = result.fetchall.map do |row|
43
+ row.map do |col|
44
+ col.encode('UTF-8', @connection.encoding) rescue col
45
+ end
46
+ end
47
+
48
+ result.close
49
+ ActiveRecord::Result.new(fields, rows)
50
+ elsif name.end_with?(' Destroy')
51
+ result
52
+ else
53
+ ActiveRecord::Result.new([], [])
54
+ end
55
+ rescue RangeError => e
56
+ return ActiveRecord::Result.new([], []) if sql.downcase.start_with? 'select'
57
+ raise e
58
+ rescue Exception => e
59
+ result.close if result.is_a?(Fb::Cursor)
60
+ raise e.message.encode('UTF-8', @connection.encoding)
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ def begin_db_transaction
67
+ log("begin transaction", nil) { @connection.transaction('READ COMMITTED') }
68
+ end
69
+
70
+ def commit_db_transaction
71
+ log("commit transaction", nil) { @connection.commit }
72
+ end
73
+
74
+ def exec_rollback_db_transaction
75
+ log("rollback transaction", nil) { @connection.rollback }
76
+ end
77
+
78
+ def create_table(table_name, **options)
79
+ super
80
+
81
+ if options[:sequence] != false && options[:id] != false
82
+ sequence_name = options[:sequence] || default_sequence_name(table_name)
83
+ create_sequence(sequence_name)
84
+ end
85
+ end
86
+
87
+ def drop_table(table_name, options = {})
88
+ if options[:sequence] != false
89
+ sequence_name = options[:sequence] || default_sequence_name(table_name)
90
+ drop_sequence(sequence_name) if sequence_exists?(sequence_name)
91
+ end
92
+
93
+ super
94
+ end
95
+
96
+ def create_sequence(sequence_name)
97
+ execute("CREATE SEQUENCE #{sequence_name}") rescue nil
98
+ end
99
+
100
+ def drop_sequence(sequence_name)
101
+ execute("DROP SEQUENCE #{sequence_name}") rescue nil
102
+ end
103
+
104
+ def sequence_exists?(sequence_name)
105
+ @connection.generator_names.include?(sequence_name)
106
+ end
107
+
108
+ def default_sequence_name(table_name, _column = nil)
109
+ "#{table_name}_g01"
110
+ end
111
+
112
+ def next_sequence_value(sequence_name)
113
+ @connection.query("SELECT NEXT VALUE FOR #{sequence_name} FROM RDB$DATABASE")[0][0]
114
+ end
115
+
116
+ end
@@ -0,0 +1,5 @@
1
+ module ActiveRecord::ConnectionAdapters::Firebird::Quoting
2
+ def quoted_date(value)
3
+ super.sub(/(\.\d{6})\z/, $1.to_s.first(5))
4
+ end
5
+ end
@@ -0,0 +1,127 @@
1
+ require 'active_support/core_ext/string/strip'
2
+
3
+ module ActiveRecord::ConnectionAdapters::Firebird::SchemaStatements
4
+
5
+ def tables(_name = nil)
6
+ @connection.table_names
7
+ end
8
+
9
+ def views
10
+ @connection.view_names
11
+ end
12
+
13
+ def indexes(table_name)
14
+ result = query(<<~SQL, "SCHEMA")
15
+ SELECT
16
+ rdb$index_name,
17
+ rdb$unique_flag
18
+ FROM
19
+ rdb$indices
20
+ WHERE
21
+ rdb$relation_name = '#{table_name.upcase}';
22
+ SQL
23
+
24
+ result.map do |row|
25
+ index_name = row[0].strip
26
+ unique = row[1] == 1
27
+ columns = query_values(<<~SQL, "SCHEMA")
28
+ SELECT
29
+ rdb$field_name
30
+ FROM
31
+ rdb$index_segments
32
+ WHERE
33
+ rdb$index_name = '#{index_name}'
34
+ ORDER BY
35
+ rdb$field_position
36
+ SQL
37
+
38
+ ActiveRecord::ConnectionAdapters::IndexDefinition.new(
39
+ table_name.downcase,
40
+ index_name.downcase,
41
+ unique,
42
+ columns.map(&:strip).map(&:downcase),
43
+ )
44
+ end
45
+ end
46
+
47
+ def remove_index(table_name, column, options = {})
48
+ index_name = index_name_for_remove(table_name, column, options)
49
+ execute "DROP INDEX #{quote_column_name(index_name)}"
50
+ end
51
+
52
+ def foreign_keys(table_name)
53
+ result = query(<<-SQL.strip_heredoc, "SCHEMA")
54
+ WITH FK_FIELDS AS (
55
+ SELECT
56
+ AA2.RDB$RELATION_NAME,
57
+ AA2.RDB$CONSTRAINT_NAME,
58
+ BB2.RDB$CONST_NAME_UQ AS LINK_UK_OR_PK,
59
+ EE2.RDB$RELATION_NAME AS REFERENCE_TABLE,
60
+ CC2.RDB$FIELD_NAME,
61
+ AA2.RDB$CONSTRAINT_TYPE
62
+ FROM
63
+ RDB$RELATION_CONSTRAINTS AA2
64
+ LEFT JOIN RDB$REF_CONSTRAINTS BB2 ON BB2.RDB$CONSTRAINT_NAME = AA2.RDB$CONSTRAINT_NAME
65
+ LEFT JOIN RDB$INDEX_SEGMENTS CC2 ON CC2.RDB$INDEX_NAME = AA2.RDB$INDEX_NAME
66
+ LEFT JOIN RDB$RELATION_FIELDS DD2 ON DD2.RDB$FIELD_NAME = CC2.RDB$FIELD_NAME AND DD2.RDB$RELATION_NAME = AA2.RDB$RELATION_NAME
67
+ LEFT JOIN RDB$RELATION_CONSTRAINTS EE2 ON EE2.RDB$CONSTRAINT_NAME = BB2.RDB$CONST_NAME_UQ
68
+ )
69
+ SELECT
70
+ AA.RDB$CONSTRAINT_NAME,
71
+ BB.REFERENCE_TABLE,
72
+ BB.FIELDS,
73
+ BB.REFERENCE_FIELDS
74
+ FROM
75
+ RDB$RELATION_CONSTRAINTS AA
76
+ LEFT JOIN (
77
+ SELECT
78
+ AA1.RDB$RELATION_NAME,
79
+ AA1.RDB$CONSTRAINT_NAME,
80
+ AA1.LINK_UK_OR_PK,
81
+ AA1.REFERENCE_TABLE,
82
+ (
83
+ SELECT LIST(TRIM(AA3.RDB$FIELD_NAME), ', ') FROM FK_FIELDS AA3 WHERE AA3.RDB$CONSTRAINT_NAME = AA1.RDB$CONSTRAINT_NAME ROWS 1
84
+ ) AS FIELDS,
85
+ (
86
+ SELECT LIST(TRIM(AA4.RDB$FIELD_NAME), ', ') FROM FK_FIELDS AA4 WHERE AA4.RDB$CONSTRAINT_NAME = AA1.LINK_UK_OR_PK ROWS 1
87
+ ) AS REFERENCE_FIELDS
88
+ FROM
89
+ FK_FIELDS AA1
90
+ GROUP BY
91
+ AA1.RDB$RELATION_NAME,
92
+ AA1.RDB$CONSTRAINT_NAME,
93
+ AA1.REFERENCE_TABLE,
94
+ AA1.LINK_UK_OR_PK
95
+ ) BB ON BB.RDB$RELATION_NAME = AA.RDB$RELATION_NAME AND BB.RDB$CONSTRAINT_NAME = AA.RDB$CONSTRAINT_NAME
96
+ WHERE
97
+ AA.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'
98
+ AND AA.RDB$RELATION_NAME = '#{table_name.upcase}';
99
+ SQL
100
+
101
+ result.map do |row|
102
+ options = {
103
+ column: row[2].downcase,
104
+ name: row[0].strip.downcase,
105
+ primary_key: row[3].downcase
106
+ }
107
+
108
+ ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(table_name, row[1].strip.downcase, options)
109
+ end
110
+ end
111
+
112
+ private
113
+
114
+ def remove_column_for_alter(table_name, column_name, type = nil, options = {})
115
+ "DROP #{quote_column_name(column_name)}"
116
+ end
117
+
118
+ def column_definitions(table_name)
119
+ @connection.columns(table_name)
120
+ end
121
+
122
+ def new_column_from_field(table_name, field)
123
+ type_metadata = fetch_type_metadata(field["sql_type"])
124
+ ActiveRecord::ConnectionAdapters::Column.new(field["name"], field["default"], type_metadata, field["nullable"], table_name)
125
+ end
126
+
127
+ end
@@ -0,0 +1,98 @@
1
+ require 'fb'
2
+
3
+ require 'active_record/connection_adapters/firebird/connection'
4
+ require 'active_record/connection_adapters/firebird/database_limits'
5
+ require 'active_record/connection_adapters/firebird/database_statements'
6
+ require 'active_record/connection_adapters/firebird/schema_statements'
7
+ require 'active_record/connection_adapters/firebird/quoting'
8
+
9
+ require 'arel/visitors/firebird'
10
+
11
+ class ActiveRecord::ConnectionAdapters::FirebirdAdapter < ActiveRecord::ConnectionAdapters::AbstractAdapter
12
+
13
+ ADAPTER_NAME = "Firebird".freeze
14
+ DEFAULT_ENCODING = "Windows-1252".freeze
15
+
16
+ include ActiveRecord::ConnectionAdapters::Firebird::DatabaseLimits
17
+ include ActiveRecord::ConnectionAdapters::Firebird::DatabaseStatements
18
+ include ActiveRecord::ConnectionAdapters::Firebird::SchemaStatements
19
+ include ActiveRecord::ConnectionAdapters::Firebird::Quoting
20
+
21
+ def arel_visitor
22
+ @arel_visitor ||= Arel::Visitors::Firebird.new(self)
23
+ end
24
+
25
+ def prefetch_primary_key?(table_name = nil)
26
+ true
27
+ end
28
+
29
+ def active?
30
+ return false unless @connection.open?
31
+
32
+ @connection.query("SELECT 1 FROM RDB$DATABASE")
33
+ true
34
+ rescue
35
+ false
36
+ end
37
+
38
+ def reconnect!
39
+ disconnect!
40
+ @connection = ::Fb::Database.connect(@config)
41
+ end
42
+
43
+ def disconnect!
44
+ super
45
+ @connection.close rescue nil
46
+ end
47
+
48
+ def reset!
49
+ reconnect!
50
+ end
51
+
52
+ def primary_keys(table_name)
53
+ raise ArgumentError unless table_name.present?
54
+
55
+ names = query_values(<<~SQL, "SCHEMA")
56
+ SELECT
57
+ s.rdb$field_name
58
+ FROM
59
+ rdb$indices i
60
+ JOIN rdb$index_segments s ON i.rdb$index_name = s.rdb$index_name
61
+ LEFT JOIN rdb$relation_constraints c ON i.rdb$index_name = c.rdb$index_name
62
+ WHERE
63
+ i.rdb$relation_name = '#{table_name.upcase}'
64
+ AND c.rdb$constraint_type = 'PRIMARY KEY';
65
+ SQL
66
+
67
+ names.map(&:strip).map(&:downcase)
68
+ end
69
+
70
+ def encoding
71
+ @connection.encoding
72
+ end
73
+
74
+ def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil) # :doc:
75
+ sql = sql.encode('UTF-8', encoding) if sql.encoding.to_s == encoding
76
+ super
77
+ end
78
+
79
+ def supports_foreign_keys?
80
+ true
81
+ end
82
+
83
+ protected
84
+
85
+ def translate_exception(e, message)
86
+ case e.message
87
+ when /violation of FOREIGN KEY constraint/
88
+ ActiveRecord::InvalidForeignKey.new(message)
89
+ when /violation of PRIMARY or UNIQUE KEY constraint/, /attempt to store duplicate value/
90
+ ActiveRecord::RecordNotUnique.new(message)
91
+ when /This operation is not defined for system tables/
92
+ ActiveRecord::ActiveRecordError.new(message)
93
+ else
94
+ super
95
+ end
96
+ end
97
+
98
+ end
@@ -0,0 +1,15 @@
1
+ ActiveRecord::Calculations.module_eval do
2
+ def count(column_name = nil)
3
+ return super() if block_given?
4
+ calculate(:count, column_name || 1)
5
+ end
6
+ end
7
+
8
+ class ActiveRecord::ConnectionAdapters::AbstractAdapter
9
+ def combine_bind_parameters(from_clause: [], join_clause: [], where_clause: [], having_clause: [], limit: nil, offset: nil)
10
+ result = from_clause + join_clause + where_clause + having_clause
11
+ result.unshift(offset) if offset
12
+ result.unshift(limit) if limit
13
+ result
14
+ end
15
+ end if ActiveRecord::VERSION::STRING < '5.2.0'
@@ -0,0 +1,31 @@
1
+ class ActiveRecord::InternalMetadata
2
+ class << self
3
+ def adapter_name
4
+ connection.adapter_name.downcase.to_sym
5
+ end
6
+
7
+ def value_name
8
+ adapter_name == :firebird ? :value_ : :value
9
+ end
10
+
11
+ def []=(key, value)
12
+ find_or_initialize_by(key: key).update!(value_name => value)
13
+ end
14
+
15
+ def [](key)
16
+ where(key: key).pluck(value_name).first
17
+ end
18
+
19
+ def create_table
20
+ unless table_exists?
21
+ key_options = connection.internal_string_options_for_primary_key
22
+
23
+ connection.create_table(table_name, id: false) do |t|
24
+ t.string :key, key_options
25
+ t.string value_name
26
+ t.timestamps
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,87 @@
1
+ module Arel
2
+ class SelectManager
3
+ attr_reader :parentheses_ignored
4
+
5
+ def ignore_parentheses
6
+ @parentheses_ignored = true
7
+ self
8
+ end
9
+ end
10
+
11
+ class Visitors::Firebird < Arel::Visitors::ToSql
12
+ private
13
+
14
+ def visit_Arel_Nodes_SelectCore(o, collector, select_statement)
15
+ collector << 'SELECT'
16
+
17
+ visit_Arel_Nodes_SelectOptions(select_statement, collector)
18
+
19
+ collector = collect_optimizer_hints(o, collector)
20
+ collector = maybe_visit o.set_quantifier, collector
21
+
22
+ collect_nodes_for o.projections, collector, ' '
23
+
24
+ if o.source && !o.source.empty?
25
+ collector << ' FROM '
26
+ collector = visit o.source, collector
27
+ end
28
+
29
+ collect_nodes_for o.wheres, collector, ' WHERE ', ' AND '
30
+ collect_nodes_for o.groups, collector, ' GROUP BY '
31
+ unless o.havings.empty?
32
+ collector << ' HAVING '
33
+ inject_join o.havings, collector, ' AND '
34
+ end
35
+ collect_nodes_for o.windows, collector, ' WINDOW '
36
+
37
+ collector
38
+ end
39
+
40
+ def visit_Arel_Nodes_SelectStatement o, collector
41
+ if o.with
42
+ collector = visit o.with, collector
43
+ collector << ' '
44
+ end
45
+
46
+ collector = o.cores.inject(collector) { |c,x|
47
+ visit_Arel_Nodes_SelectCore(x, c, o)
48
+ }
49
+
50
+ unless o.orders.empty?
51
+ collector << ' ORDER BY '
52
+ len = o.orders.length - 1
53
+ o.orders.each_with_index { |x, i|
54
+ collector = visit(x, collector)
55
+ collector << ', ' unless len == i
56
+ }
57
+ end
58
+
59
+ collector
60
+ end
61
+
62
+ def visit_Arel_Nodes_Limit(o, collector)
63
+ collector << 'FIRST '
64
+ visit o.expr, collector
65
+ end
66
+
67
+ def visit_Arel_Nodes_Offset(o, collector)
68
+ collector << 'SKIP '
69
+ visit o.expr, collector
70
+ end
71
+
72
+ def visit_Arel_SelectManager o, collector
73
+ return visit(o.ast, collector) if o.parentheses_ignored
74
+
75
+ collector << '('
76
+ visit(o.ast, collector) << ')'
77
+ end
78
+
79
+ def visit_Arel_Nodes_Union o, collector
80
+ infix_value(o, collector, ' UNION ')
81
+ end
82
+
83
+ def visit_Arel_Nodes_UnionAll o, collector
84
+ infix_value(o, collector, ' UNION ALL ')
85
+ end
86
+ end
87
+ end
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: akapu_firebird_adapter
3
+ version: !ruby/object:Gem::Version
4
+ version: 6.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Fábio Rodrigues
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-09-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '6.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '6.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: fb
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 2.1.4
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 2.1.4
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.7'
83
+ - !ruby/object:Gem::Dependency
84
+ name: database_cleaner
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-meta
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.0.10
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.0.10
111
+ description:
112
+ email:
113
+ - fabio.info@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - lib/active_record/connection_adapters/firebird/connection.rb
119
+ - lib/active_record/connection_adapters/firebird/database_limits.rb
120
+ - lib/active_record/connection_adapters/firebird/database_statements.rb
121
+ - lib/active_record/connection_adapters/firebird/quoting.rb
122
+ - lib/active_record/connection_adapters/firebird/schema_statements.rb
123
+ - lib/active_record/connection_adapters/firebird_adapter.rb
124
+ - lib/active_record/extensions.rb
125
+ - lib/active_record/internal_metadata_extensions.rb
126
+ - lib/arel/visitors/firebird.rb
127
+ homepage: https://github.com/FabioMR/firebird_adapter
128
+ licenses:
129
+ - MIT
130
+ metadata: {}
131
+ post_install_message:
132
+ rdoc_options: []
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '3.0'
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ requirements: []
146
+ rubygems_version: 3.2.27
147
+ signing_key:
148
+ specification_version: 4
149
+ summary: Forked from "ActiveRecord Firebird Adapter for Rails 6." due to update dependencies
150
+ versions
151
+ test_files: []