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 +7 -0
- data/lib/active_record/connection_adapters/firebird/connection.rb +18 -0
- data/lib/active_record/connection_adapters/firebird/database_limits.rb +33 -0
- data/lib/active_record/connection_adapters/firebird/database_statements.rb +116 -0
- data/lib/active_record/connection_adapters/firebird/quoting.rb +5 -0
- data/lib/active_record/connection_adapters/firebird/schema_statements.rb +127 -0
- data/lib/active_record/connection_adapters/firebird_adapter.rb +98 -0
- data/lib/active_record/extensions.rb +15 -0
- data/lib/active_record/internal_metadata_extensions.rb +31 -0
- data/lib/arel/visitors/firebird.rb +87 -0
- metadata +151 -0
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,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: []
|