Class: ActiveRecord::ConnectionAdapters::SpannerAdapter
Defined Under Namespace
Modules: TypeMapBuilder
Constant Summary
collapse
- ADAPTER_NAME =
"spanner".freeze
- NATIVE_DATABASE_TYPES =
{
primary_key: "INT64",
parent_key: "INT64",
string: { name: "STRING", limit: "MAX" },
text: { name: "STRING", limit: "MAX" },
integer: { name: "INT64" },
bigint: { name: "INT64" },
float: { name: "FLOAT64" },
decimal: { name: "NUMERIC" },
numeric: { name: "NUMERIC" },
datetime: { name: "TIMESTAMP" },
time: { name: "TIMESTAMP" },
date: { name: "DATE" },
binary: { name: "BYTES", limit: "MAX" },
boolean: { name: "BOOL" },
json: { name: "JSON" }
}.freeze
- TYPE_MAP =
Type::TypeMap.new.tap { |m| initialize_type_map m }
ActiveRecord::ConnectionAdapters::Spanner::SchemaStatements::VERSION_6_0_3, ActiveRecord::ConnectionAdapters::Spanner::SchemaStatements::VERSION_6_1_0
ActiveRecord::ConnectionAdapters::Spanner::DatabaseStatements::COMMENT_REGEX
Class Method Summary
collapse
Instance Method Summary
collapse
#_add_foreign_key, #_remove_columns, #add_column, #add_foreign_key, #add_index, #add_reference, #change_column, #change_column_default, #change_column_null, #column_definitions, #create_join_table, #create_schema_dumper, #create_table, #current_database, #data_sources, #drop_table, #fetch_type_metadata, #foreign_keys, #index_name_exists?, #indexes, #new_column_from_field, #primary_and_parent_keys, #primary_keys, #quoted_scope, #remove_column, #remove_columns, #remove_foreign_key, #remove_index, #rename_column, #rename_index, #rename_table, #table_exists?, #type_to_sql
#begin_db_transaction, #begin_isolated_db_transaction, #commit_db_transaction, #exec_mutation, #exec_query, #exec_update, #execute, #execute_ddl, #query, #rollback_db_transaction, #transaction, #transaction_isolation_levels, #truncate, #update, #write_query?
#quote_column_name, #quote_string, #quote_table_name, #quoted_binary
Constructor Details
#initialize(connection, logger, connection_options, config) ⇒ SpannerAdapter
Returns a new instance of SpannerAdapter.
77
78
79
80
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 77
def initialize connection, logger, connection_options, config
super connection, logger, config
@connection_options = connection_options
end
|
Class Method Details
.database_exists?(config) ⇒ Boolean
92
93
94
95
96
97
98
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 92
def self.database_exists? config
connection = ActiveRecordSpannerAdapter::Connection.new config
connection.connect!
true
rescue ActiveRecord::NoDatabaseError
false
end
|
Instance Method Details
#active? ⇒ Boolean
102
103
104
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 102
def active?
@connection.active?
end
|
#arel_visitor ⇒ Object
178
179
180
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 178
def arel_visitor
Arel::Visitors::Spanner.new self
end
|
#build_insert_sql(insert) ⇒ Object
182
183
184
185
186
187
188
189
190
191
192
193
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 182
def build_insert_sql insert
if current_spanner_transaction&.isolation == :buffered_mutations
raise "ActiveRecordSpannerAdapter does not support insert_sql with buffered_mutations transaction."
end
if insert.skip_duplicates? || insert.update_duplicates?
raise NotImplementedError, "CloudSpanner does not support skip_duplicates and update_duplicates."
end
values_list, = insert.values_list
"INSERT #{insert.into} #{values_list}"
end
|
#current_spanner_transaction ⇒ Object
120
121
122
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 120
def current_spanner_transaction
@connection.current_transaction
end
|
#disconnect! ⇒ Object
106
107
108
109
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 106
def disconnect!
super
@connection.disconnect!
end
|
#max_identifier_length ⇒ Object
82
83
84
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 82
def max_identifier_length
128
end
|
#native_database_types ⇒ Object
86
87
88
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 86
def native_database_types
NATIVE_DATABASE_TYPES
end
|
#next_sequence_value(_sequence_name) ⇒ Object
Generate next sequence number for primary key
174
175
176
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 174
def next_sequence_value _sequence_name
SecureRandom.uuid.gsub("-", "").hex & 0x7FFFFFFFFFFFFFFF
end
|
#prefetch_primary_key?(_table_name = nil) ⇒ Boolean
169
170
171
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 169
def prefetch_primary_key? _table_name = nil
true
end
|
#reset! ⇒ Object
Also known as:
reconnect!
111
112
113
114
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 111
def reset!
super
@connection.reset!
end
|
#supports_bulk_alter? ⇒ Boolean
126
127
128
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 126
def supports_bulk_alter?
true
end
|
#supports_common_table_expressions? ⇒ Boolean
130
131
132
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 130
def supports_common_table_expressions?
true
end
|
#supports_explain? ⇒ Boolean
134
135
136
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 134
def supports_explain?
false
end
|
#supports_foreign_keys? ⇒ Boolean
138
139
140
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 138
def supports_foreign_keys?
true
end
|
#supports_index_sort_order? ⇒ Boolean
142
143
144
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 142
def supports_index_sort_order?
true
end
|
#supports_insert_on_conflict? ⇒ Boolean
Also known as:
supports_insert_on_duplicate_skip?, supports_insert_on_duplicate_update?, supports_insert_conflict_target?
146
147
148
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 146
def supports_insert_on_conflict?
true
end
|
#supports_insert_returning? ⇒ Boolean
153
154
155
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 153
def supports_insert_returning?
true
end
|
#supports_multi_insert? ⇒ Boolean
157
158
159
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 157
def supports_multi_insert?
true
end
|
#supports_optimizer_hints? ⇒ Boolean
161
162
163
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 161
def supports_optimizer_hints?
true
end
|
#supports_primary_key? ⇒ Boolean
165
166
167
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 165
def supports_primary_key?
true
end
|
#translate_exception(exception, message:, sql:, binds:) ⇒ Object
251
252
253
254
255
256
257
258
259
260
261
262
263
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 251
def translate_exception exception, message:, sql:, binds:
if exception.is_a? Google::Cloud::FailedPreconditionError
case exception.message
when /.*does not specify a non-null value for these NOT NULL columns.*/,
/.*must not be NULL.*/
NotNullViolation.new message, sql: sql, binds: binds
else
super
end
else
super
end
end
|