akapu_firebird_adapter 6.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []