activerecord-rdb-adapter 0.9.4 → 0.9.5
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/README.md +8 -8
- data/extconf.rb +93 -93
- data/fb.c +3072 -3072
- data/fb_extensions.rb +21 -21
- data/lib/active_model/type/integer.rb +67 -67
- data/lib/active_record/connection_adapters/rdb/database_limits.rb +35 -35
- data/lib/active_record/connection_adapters/rdb/database_statements.rb +186 -183
- data/lib/active_record/connection_adapters/rdb/quoting.rb +152 -152
- data/lib/active_record/connection_adapters/rdb/schema_creation.rb +52 -52
- data/lib/active_record/connection_adapters/rdb/schema_dumper.rb +23 -23
- data/lib/active_record/connection_adapters/rdb/schema_statements.rb +431 -431
- data/lib/active_record/connection_adapters/rdb/table_definition.rb +28 -28
- data/lib/active_record/connection_adapters/rdb_adapter.rb +163 -163
- data/lib/active_record/connection_adapters/rdb_column.rb +69 -69
- data/lib/active_record/rdb_base.rb +34 -34
- data/lib/active_record/tasks/rdb_database_tasks.rb +78 -78
- data/lib/activerecord-rdb-adapter.rb +10 -10
- data/lib/arel/visitors/rdb_visitor.rb +135 -135
- metadata +3 -4
@@ -1,152 +1,152 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module ConnectionAdapters
|
3
|
-
module Rdb
|
4
|
-
module Quoting # :nodoc:
|
5
|
-
QUOTED_FALSE = "'false'".freeze
|
6
|
-
QUOTED_TRUE = "'true'".freeze
|
7
|
-
|
8
|
-
QUOTED_POSITION = '"POSITION"'.freeze
|
9
|
-
QUOTED_VALUE = '"VALUE"'.freeze
|
10
|
-
|
11
|
-
def quote_string(string) # :nodoc:
|
12
|
-
string.gsub(/'/, "''")
|
13
|
-
end
|
14
|
-
|
15
|
-
def quoted_date(time)
|
16
|
-
if time.is_a?(Time) || time.is_a?(DateTime)
|
17
|
-
time.localtime.strftime('%d.%m.%Y %H:%M:%S')
|
18
|
-
else
|
19
|
-
time.strftime('%d.%m.%Y')
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def quote_column_name(column_name) # :nodoc:
|
24
|
-
column = column_name.dup.to_s
|
25
|
-
column.gsub!(/(?<=[^"\w]|^)position(?=[^"\w]|$)/i, QUOTED_POSITION)
|
26
|
-
column.gsub!(/(?<=[^"\w]|^)value(?=[^"\w]|$)/i, QUOTED_VALUE)
|
27
|
-
column.delete!('"')
|
28
|
-
column.upcase!
|
29
|
-
@connection.dialect == 1 ? column.to_s : %("#{column}")
|
30
|
-
end
|
31
|
-
|
32
|
-
def quote_table_name_for_assignment(_table, attr)
|
33
|
-
quote_column_name(attr)
|
34
|
-
end
|
35
|
-
|
36
|
-
def unquoted_true
|
37
|
-
true
|
38
|
-
end
|
39
|
-
|
40
|
-
def quoted_true # :nodoc:
|
41
|
-
QUOTED_TRUE
|
42
|
-
end
|
43
|
-
|
44
|
-
def unquoted_false
|
45
|
-
false
|
46
|
-
end
|
47
|
-
|
48
|
-
def quoted_false # :nodoc:
|
49
|
-
QUOTED_FALSE
|
50
|
-
end
|
51
|
-
|
52
|
-
def type_cast_from_column(column, value) # :nodoc:
|
53
|
-
if column
|
54
|
-
type = column.type || lookup_cast_type_from_column(column)
|
55
|
-
if type.is_a?(ActiveRecord::Type::Serialized)
|
56
|
-
value
|
57
|
-
else
|
58
|
-
type.serialize(value)
|
59
|
-
end
|
60
|
-
else
|
61
|
-
value
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def lookup_cast_type_from_column(column) # :nodoc:
|
66
|
-
type = column.try(:sql_type) || column.try(:type)
|
67
|
-
lookup_cast_type(type)
|
68
|
-
end
|
69
|
-
|
70
|
-
def type_casted_binds(binds) # :nodoc:
|
71
|
-
if binds.first.is_a?(Array)
|
72
|
-
binds.map { |column, value| type_cast(value, column) }
|
73
|
-
else
|
74
|
-
binds.map { |attr| type_cast(attr.value_for_database, attr) }
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
def id_value_for_database(value)
|
81
|
-
primary_key = value.class.primary_key
|
82
|
-
if primary_key
|
83
|
-
value.instance_variable_get(:@attributes)[primary_key].value_for_database
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def _quote(value)
|
88
|
-
case value
|
89
|
-
when Time, DateTime
|
90
|
-
"'#{value.strftime('%d.%m.%Y %H:%M')}'"
|
91
|
-
when Date
|
92
|
-
"'#{value.strftime('%d.%m.%Y')}'"
|
93
|
-
else
|
94
|
-
super
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def _type_cast(value)
|
99
|
-
case value
|
100
|
-
when Symbol, ActiveSupport::Multibyte::Chars, Type::Binary::Data
|
101
|
-
value.to_s
|
102
|
-
when Array
|
103
|
-
value.to_yaml
|
104
|
-
when Hash then
|
105
|
-
encode_hash(value)
|
106
|
-
when true then
|
107
|
-
unquoted_true
|
108
|
-
when false then
|
109
|
-
unquoted_false
|
110
|
-
# BigDecimals need to be put in a non-normalized form and quoted.
|
111
|
-
when BigDecimal then
|
112
|
-
value.to_s('F')
|
113
|
-
when Type::Time::Value then
|
114
|
-
quoted_time(value)
|
115
|
-
when Date, Time, DateTime then
|
116
|
-
quoted_date(value)
|
117
|
-
when *types_which_need_no_typecasting
|
118
|
-
value
|
119
|
-
else
|
120
|
-
raise TypeError
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
def rdb_to_ar_case(column_name)
|
125
|
-
/[[:lower:]]/.match?(column_name) ? column_name : column_name.downcase
|
126
|
-
end
|
127
|
-
|
128
|
-
def ar_to_rdb_case(column_name)
|
129
|
-
/[[:upper:]]/.match?(column_name) ? column_name : column_name.upcase
|
130
|
-
end
|
131
|
-
|
132
|
-
def encode_hash(value)
|
133
|
-
if value.is_a?(Hash)
|
134
|
-
value.to_yaml
|
135
|
-
else
|
136
|
-
value
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
if defined? Encoding
|
141
|
-
def decode(str)
|
142
|
-
Base64.decode64(str).force_encoding(@connection.encoding)
|
143
|
-
end
|
144
|
-
else
|
145
|
-
def decode(str)
|
146
|
-
Base64.decode64(str)
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module Rdb
|
4
|
+
module Quoting # :nodoc:
|
5
|
+
QUOTED_FALSE = "'false'".freeze
|
6
|
+
QUOTED_TRUE = "'true'".freeze
|
7
|
+
|
8
|
+
QUOTED_POSITION = '"POSITION"'.freeze
|
9
|
+
QUOTED_VALUE = '"VALUE"'.freeze
|
10
|
+
|
11
|
+
def quote_string(string) # :nodoc:
|
12
|
+
string.gsub(/'/, "''")
|
13
|
+
end
|
14
|
+
|
15
|
+
def quoted_date(time)
|
16
|
+
if time.is_a?(Time) || time.is_a?(DateTime)
|
17
|
+
time.localtime.strftime('%d.%m.%Y %H:%M:%S')
|
18
|
+
else
|
19
|
+
time.strftime('%d.%m.%Y')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def quote_column_name(column_name) # :nodoc:
|
24
|
+
column = column_name.dup.to_s
|
25
|
+
column.gsub!(/(?<=[^"\w]|^)position(?=[^"\w]|$)/i, QUOTED_POSITION)
|
26
|
+
column.gsub!(/(?<=[^"\w]|^)value(?=[^"\w]|$)/i, QUOTED_VALUE)
|
27
|
+
column.delete!('"')
|
28
|
+
column.upcase!
|
29
|
+
@connection.dialect == 1 ? column.to_s : %("#{column}")
|
30
|
+
end
|
31
|
+
|
32
|
+
def quote_table_name_for_assignment(_table, attr)
|
33
|
+
quote_column_name(attr)
|
34
|
+
end
|
35
|
+
|
36
|
+
def unquoted_true
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
40
|
+
def quoted_true # :nodoc:
|
41
|
+
QUOTED_TRUE
|
42
|
+
end
|
43
|
+
|
44
|
+
def unquoted_false
|
45
|
+
false
|
46
|
+
end
|
47
|
+
|
48
|
+
def quoted_false # :nodoc:
|
49
|
+
QUOTED_FALSE
|
50
|
+
end
|
51
|
+
|
52
|
+
def type_cast_from_column(column, value) # :nodoc:
|
53
|
+
if column
|
54
|
+
type = column.type || lookup_cast_type_from_column(column)
|
55
|
+
if type.is_a?(ActiveRecord::Type::Serialized)
|
56
|
+
value
|
57
|
+
else
|
58
|
+
type.serialize(value)
|
59
|
+
end
|
60
|
+
else
|
61
|
+
value
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def lookup_cast_type_from_column(column) # :nodoc:
|
66
|
+
type = column.try(:sql_type) || column.try(:type)
|
67
|
+
lookup_cast_type(type)
|
68
|
+
end
|
69
|
+
|
70
|
+
def type_casted_binds(binds) # :nodoc:
|
71
|
+
if binds.first.is_a?(Array)
|
72
|
+
binds.map { |column, value| type_cast(value, column) }
|
73
|
+
else
|
74
|
+
binds.map { |attr| type_cast(attr.value_for_database, attr) }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def id_value_for_database(value)
|
81
|
+
primary_key = value.class.primary_key
|
82
|
+
if primary_key
|
83
|
+
value.instance_variable_get(:@attributes)[primary_key].value_for_database
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def _quote(value)
|
88
|
+
case value
|
89
|
+
when Time, DateTime
|
90
|
+
"'#{value.strftime('%d.%m.%Y %H:%M')}'"
|
91
|
+
when Date
|
92
|
+
"'#{value.strftime('%d.%m.%Y')}'"
|
93
|
+
else
|
94
|
+
super
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def _type_cast(value)
|
99
|
+
case value
|
100
|
+
when Symbol, ActiveSupport::Multibyte::Chars, Type::Binary::Data
|
101
|
+
value.to_s
|
102
|
+
when Array
|
103
|
+
value.to_yaml
|
104
|
+
when Hash then
|
105
|
+
encode_hash(value)
|
106
|
+
when true then
|
107
|
+
unquoted_true
|
108
|
+
when false then
|
109
|
+
unquoted_false
|
110
|
+
# BigDecimals need to be put in a non-normalized form and quoted.
|
111
|
+
when BigDecimal then
|
112
|
+
value.to_s('F')
|
113
|
+
when Type::Time::Value then
|
114
|
+
quoted_time(value)
|
115
|
+
when Date, Time, DateTime then
|
116
|
+
quoted_date(value)
|
117
|
+
when *types_which_need_no_typecasting
|
118
|
+
value
|
119
|
+
else
|
120
|
+
raise TypeError
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def rdb_to_ar_case(column_name)
|
125
|
+
/[[:lower:]]/.match?(column_name) ? column_name : column_name.downcase
|
126
|
+
end
|
127
|
+
|
128
|
+
def ar_to_rdb_case(column_name)
|
129
|
+
/[[:upper:]]/.match?(column_name) ? column_name : column_name.upcase
|
130
|
+
end
|
131
|
+
|
132
|
+
def encode_hash(value)
|
133
|
+
if value.is_a?(Hash)
|
134
|
+
value.to_yaml
|
135
|
+
else
|
136
|
+
value
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
if defined? Encoding
|
141
|
+
def decode(str)
|
142
|
+
Base64.decode64(str).force_encoding(@connection.encoding)
|
143
|
+
end
|
144
|
+
else
|
145
|
+
def decode(str)
|
146
|
+
Base64.decode64(str)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
@@ -1,53 +1,53 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module ConnectionAdapters
|
3
|
-
module Rdb
|
4
|
-
class SchemaCreation < AbstractAdapter::SchemaCreation # :nodoc:
|
5
|
-
|
6
|
-
private
|
7
|
-
|
8
|
-
def visit_ColumnDefinition(o)
|
9
|
-
o.sql_type = type_to_sql(o.type, o.options)
|
10
|
-
column_sql = "#{quote_column_name(o.name)} #{o.sql_type}"
|
11
|
-
add_column_options!(column_sql, column_options(o)) unless o.type == :primary_key
|
12
|
-
column_sql
|
13
|
-
end
|
14
|
-
|
15
|
-
def add_column_options!(sql, options)
|
16
|
-
sql << " DEFAULT #{quote_default_expression(options[:default], options[:column])}" if options_include_default?(options)
|
17
|
-
# must explicitly check for :null to allow change_column to work on migrations
|
18
|
-
if !options[:null].nil? && !options[:null]
|
19
|
-
sql << " NOT NULL"
|
20
|
-
end
|
21
|
-
if options[:auto_increment]
|
22
|
-
sql << " AUTO_INCREMENT"
|
23
|
-
end
|
24
|
-
if options[:primary_key]
|
25
|
-
sql << " PRIMARY KEY"
|
26
|
-
end
|
27
|
-
sql
|
28
|
-
end
|
29
|
-
|
30
|
-
def visit_TableDefinition(o)
|
31
|
-
create_sql = "CREATE#{' TEMPORARY' if o.temporary} TABLE #{quote_table_name(o.name)} "
|
32
|
-
|
33
|
-
statements = o.columns.map(&method(:accept))
|
34
|
-
statements << accept(o.primary_keys) if o.primary_keys
|
35
|
-
|
36
|
-
if supports_indexes_in_create?
|
37
|
-
statements.concat(o.indexes.map { |column_name, options| index_in_create(o.name, column_name, options) })
|
38
|
-
end
|
39
|
-
|
40
|
-
if supports_foreign_keys_in_create?
|
41
|
-
statements.concat(o.foreign_keys.map { |to_table, options| foreign_key_in_create(o.name, to_table, options) })
|
42
|
-
end
|
43
|
-
|
44
|
-
create_sql << "(#{statements.join(', ')})" if statements.present?
|
45
|
-
add_table_options!(create_sql, table_options(o))
|
46
|
-
create_sql << " AS #{@conn.to_sql(o.as)}" if o.as
|
47
|
-
create_sql
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module Rdb
|
4
|
+
class SchemaCreation < AbstractAdapter::SchemaCreation # :nodoc:
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def visit_ColumnDefinition(o)
|
9
|
+
o.sql_type = type_to_sql(o.type, o.options)
|
10
|
+
column_sql = "#{quote_column_name(o.name)} #{o.sql_type}"
|
11
|
+
add_column_options!(column_sql, column_options(o)) unless o.type == :primary_key
|
12
|
+
column_sql
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_column_options!(sql, options)
|
16
|
+
sql << " DEFAULT #{quote_default_expression(options[:default], options[:column])}" if options_include_default?(options)
|
17
|
+
# must explicitly check for :null to allow change_column to work on migrations
|
18
|
+
if !options[:null].nil? && !options[:null]
|
19
|
+
sql << " NOT NULL"
|
20
|
+
end
|
21
|
+
if options[:auto_increment]
|
22
|
+
sql << " AUTO_INCREMENT"
|
23
|
+
end
|
24
|
+
if options[:primary_key]
|
25
|
+
sql << " PRIMARY KEY"
|
26
|
+
end
|
27
|
+
sql
|
28
|
+
end
|
29
|
+
|
30
|
+
def visit_TableDefinition(o)
|
31
|
+
create_sql = "CREATE#{' TEMPORARY' if o.temporary} TABLE #{quote_table_name(o.name)} "
|
32
|
+
|
33
|
+
statements = o.columns.map(&method(:accept))
|
34
|
+
statements << accept(o.primary_keys) if o.primary_keys
|
35
|
+
|
36
|
+
if supports_indexes_in_create?
|
37
|
+
statements.concat(o.indexes.map { |column_name, options| index_in_create(o.name, column_name, options) })
|
38
|
+
end
|
39
|
+
|
40
|
+
if supports_foreign_keys_in_create?
|
41
|
+
statements.concat(o.foreign_keys.map { |to_table, options| foreign_key_in_create(o.name, to_table, options) })
|
42
|
+
end
|
43
|
+
|
44
|
+
create_sql << "(#{statements.join(', ')})" if statements.present?
|
45
|
+
add_table_options!(create_sql, table_options(o))
|
46
|
+
create_sql << " AS #{@conn.to_sql(o.as)}" if o.as
|
47
|
+
create_sql
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
53
|
end
|
@@ -1,23 +1,23 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module ConnectionAdapters
|
3
|
-
module Rdb
|
4
|
-
class SchemaDumper < ConnectionAdapters::SchemaDumper # :nodoc:
|
5
|
-
private
|
6
|
-
|
7
|
-
def column_spec_for_primary_key(column)
|
8
|
-
spec = super
|
9
|
-
spec.delete(:auto_increment) if column.type == :integer && column.auto_increment?
|
10
|
-
spec
|
11
|
-
end
|
12
|
-
|
13
|
-
def schema_type(column)
|
14
|
-
if column.bigint?
|
15
|
-
:bigint
|
16
|
-
else
|
17
|
-
column.type.type
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module Rdb
|
4
|
+
class SchemaDumper < ConnectionAdapters::SchemaDumper # :nodoc:
|
5
|
+
private
|
6
|
+
|
7
|
+
def column_spec_for_primary_key(column)
|
8
|
+
spec = super
|
9
|
+
spec.delete(:auto_increment) if column.type == :integer && column.auto_increment?
|
10
|
+
spec
|
11
|
+
end
|
12
|
+
|
13
|
+
def schema_type(column)
|
14
|
+
if column.bigint?
|
15
|
+
:bigint
|
16
|
+
else
|
17
|
+
column.type.type
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|