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_7_2
ActiveRecord::ConnectionAdapters::Spanner::DatabaseStatements::COMMENT_REGEX, ActiveRecord::ConnectionAdapters::Spanner::DatabaseStatements::RequestOptions, ActiveRecord::ConnectionAdapters::Spanner::DatabaseStatements::VERSION_7_1_0
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
-
#active? ⇒ Boolean
-
#arel_visitor ⇒ Object
-
#build_insert_sql(insert) ⇒ Object
-
#current_spanner_transaction ⇒ Object
-
#disconnect! ⇒ Object
-
#initialize(config_or_deprecated_connection, deprecated_logger = nil, deprecated_connection_options = nil, deprecated_config = nil) ⇒ SpannerAdapter
constructor
A new instance of SpannerAdapter.
-
#log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil, *args) ⇒ Object
-
#max_identifier_length ⇒ Object
-
#native_database_types ⇒ Object
-
#next_sequence_value(_sequence_name) ⇒ Object
Generate next sequence number for primary key.
-
#prefetch_primary_key?(_table_name = nil) ⇒ Boolean
-
#reset! ⇒ Object
(also: #reconnect!)
-
#return_value_after_insert?(column) ⇒ Boolean
-
#spanner_schema_cache ⇒ Object
-
#supports_bulk_alter? ⇒ Boolean
-
#supports_check_constraints? ⇒ Boolean
-
#supports_common_table_expressions? ⇒ Boolean
-
#supports_explain? ⇒ Boolean
-
#supports_foreign_keys? ⇒ Boolean
-
#supports_index_sort_order? ⇒ Boolean
-
#supports_insert_on_conflict? ⇒ Boolean
(also: #supports_insert_on_duplicate_skip?, #supports_insert_on_duplicate_update?, #supports_insert_conflict_target?)
-
#supports_insert_returning? ⇒ Boolean
-
#supports_multi_insert? ⇒ Boolean
-
#supports_optimizer_hints? ⇒ Boolean
-
#supports_primary_key? ⇒ Boolean
-
#supports_transaction_isolation? ⇒ Boolean
-
#supports_virtual_columns? ⇒ Boolean
-
#transform(sql) ⇒ Object
-
#translate_exception(exception, message:, sql:, binds:) ⇒ Object
-
#use_auto_increment? ⇒ Boolean
-
#use_identity? ⇒ Boolean
#_add_foreign_key, #_remove_columns, #add_column, #add_foreign_key, #add_index, #add_reference, #assume_migrated_upto_version, #change_column, #change_column_default, #change_column_null, #check_constraints, #column_definitions, #create_join_table, #create_schema_dumper, #create_table, #current_database, #data_sources, #drop_table, #extract_schema_qualified_name, #fetch_type_metadata, #foreign_keys, #index_name_exists?, #indexes, #insert_versions_sql, #migration_context, #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, #schema_migration, #table_exists?, #type_to_sql
#_has_pk_binding, #append_request_tag_from_query_logs, #append_request_tag_from_query_logs_with_format, #begin_db_transaction, #begin_isolated_db_transaction, #commit_db_transaction, #exec_mutation, #exec_query, #exec_update, #execute, #execute_ddl, #execute_query_or_dml, #internal_exec_query, #internal_execute, #query, #rollback_db_transaction, #sql_for_insert, #transaction, #transaction_isolation_levels, #truncate, #update, #write_query?
#_type_cast, #quote_column_name, #quote_string, #quote_table_name, #quoted_binary
Constructor Details
#initialize(config_or_deprecated_connection, deprecated_logger = nil, deprecated_connection_options = nil, deprecated_config = nil) ⇒ SpannerAdapter
Returns a new instance of SpannerAdapter.
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 77
def initialize config_or_deprecated_connection, deprecated_logger = nil,
deprecated_connection_options = nil, deprecated_config = nil
if config_or_deprecated_connection.is_a? Hash
@connection = ActiveRecordSpannerAdapter::Connection.new config_or_deprecated_connection
@connection.connect!
super config_or_deprecated_connection
@raw_connection ||= @connection
else
@connection = config_or_deprecated_connection
@connection_options = deprecated_connection_options
super config_or_deprecated_connection, deprecated_logger, deprecated_config
@raw_connection ||= config_or_deprecated_connection
end
@prepared_statements = true
@default_sequence_kind = @config.fetch :default_sequence_kind, "DISABLED"
@use_auto_increment = @default_sequence_kind&.casecmp? "AUTO_INCREMENT"
@auto_increment_disabled = @default_sequence_kind&.casecmp? "DISABLED"
@use_client_side_id_for_mutations = self.class.type_cast_config_to_boolean(
@config.fetch(:use_client_side_id_for_mutations, false)
)
end
|
Instance Attribute Details
#default_sequence_kind ⇒ Object
Returns the value of attribute default_sequence_kind.
74
75
76
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 74
def default_sequence_kind
@default_sequence_kind
end
|
#use_client_side_id_for_mutations ⇒ Object
Returns the value of attribute use_client_side_id_for_mutations.
75
76
77
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 75
def use_client_side_id_for_mutations
@use_client_side_id_for_mutations
end
|
Class Method Details
.database_exists?(config) ⇒ Boolean
123
124
125
126
127
128
129
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 123
def self.database_exists? config
connection = ActiveRecordSpannerAdapter::Connection.new config
connection.connect!
true
rescue ActiveRecord::NoDatabaseError
false
end
|
Instance Method Details
#active? ⇒ Boolean
133
134
135
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 133
def active?
@connection.active?
end
|
#arel_visitor ⇒ Object
230
231
232
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 230
def arel_visitor
Arel::Visitors::Spanner.new self
end
|
#build_insert_sql(insert) ⇒ Object
234
235
236
237
238
239
240
241
242
243
244
245
246
247
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 234
def build_insert_sql insert
if current_spanner_transaction&.isolation == :buffered_mutations
raise "ActiveRecordSpannerAdapter does not support insert_sql with buffered_mutations transaction."
end
values_list, = insert.values_list
prefix = "INSERT"
if insert.update_duplicates?
prefix += " OR UPDATE"
elsif insert.skip_duplicates?
prefix += " OR IGNORE"
end
"#{prefix} #{insert.into} #{values_list}"
end
|
#current_spanner_transaction ⇒ Object
156
157
158
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 156
def current_spanner_transaction
@connection.current_transaction
end
|
#disconnect! ⇒ Object
137
138
139
140
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 137
def disconnect!
super
@connection.disconnect!
end
|
#log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil, *args) ⇒ Object
318
319
320
321
322
323
324
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 318
def log sql, name = "SQL", binds = [], type_casted_binds = [], async: false, &block
super
rescue ActiveRecord::StatementInvalid
raise
rescue StandardError => e
raise translate_exception_class(e, sql, binds)
end
|
#max_identifier_length ⇒ Object
113
114
115
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 113
def max_identifier_length
128
end
|
#native_database_types ⇒ Object
117
118
119
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 117
def native_database_types
NATIVE_DATABASE_TYPES
end
|
#next_sequence_value(_sequence_name) ⇒ Object
Generate next sequence number for primary key
222
223
224
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 222
def next_sequence_value _sequence_name
SecureRandom.uuid.gsub("-", "").hex & 0x7FFFFFFFFFFFFFFF
end
|
#prefetch_primary_key?(_table_name = nil) ⇒ Boolean
209
210
211
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 209
def prefetch_primary_key? _table_name = nil
true
end
|
#reset! ⇒ Object
Also known as:
reconnect!
142
143
144
145
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 142
def reset!
super
@connection.reset!
end
|
#return_value_after_insert?(column) ⇒ Boolean
226
227
228
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 226
def return_value_after_insert? column
column.auto_incremented_by_db? || column.primary_key?
end
|
#spanner_schema_cache ⇒ Object
148
149
150
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 148
def spanner_schema_cache
@spanner_schema_cache ||= SpannerSchemaCache.new self
end
|
#supports_bulk_alter? ⇒ Boolean
162
163
164
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 162
def supports_bulk_alter?
true
end
|
#supports_check_constraints? ⇒ Boolean
213
214
215
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 213
def supports_check_constraints?
true
end
|
#supports_common_table_expressions? ⇒ Boolean
166
167
168
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 166
def supports_common_table_expressions?
true
end
|
#supports_explain? ⇒ Boolean
170
171
172
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 170
def supports_explain?
false
end
|
#supports_foreign_keys? ⇒ Boolean
178
179
180
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 178
def supports_foreign_keys?
true
end
|
#supports_index_sort_order? ⇒ Boolean
182
183
184
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 182
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?
186
187
188
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 186
def supports_insert_on_conflict?
true
end
|
#supports_insert_returning? ⇒ Boolean
193
194
195
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 193
def supports_insert_returning?
true
end
|
#supports_multi_insert? ⇒ Boolean
197
198
199
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 197
def supports_multi_insert?
true
end
|
#supports_optimizer_hints? ⇒ Boolean
201
202
203
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 201
def supports_optimizer_hints?
true
end
|
#supports_primary_key? ⇒ Boolean
205
206
207
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 205
def supports_primary_key?
true
end
|
#supports_transaction_isolation? ⇒ Boolean
174
175
176
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 174
def supports_transaction_isolation?
true
end
|
#supports_virtual_columns? ⇒ Boolean
217
218
219
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 217
def supports_virtual_columns?
true
end
|
305
306
307
308
309
310
311
312
313
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 305
def transform sql
if ActiveRecord::VERSION::MAJOR >= 8
preprocess_query sql
elsif ActiveRecord::VERSION::MAJOR == 7
transform_query sql
else
sql
end
end
|
#translate_exception(exception, message:, sql:, binds:) ⇒ Object
335
336
337
338
339
340
341
342
343
344
345
346
347
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 335
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
|
#use_auto_increment? ⇒ Boolean
103
104
105
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 103
def use_auto_increment?
"AUTO_INCREMENT".casecmp?(@default_sequence_kind || "")
end
|
#use_identity? ⇒ Boolean
107
108
109
110
111
|
# File 'lib/active_record/connection_adapters/spanner_adapter.rb', line 107
def use_identity?
!use_auto_increment? \
&& @default_sequence_kind \
&& !@default_sequence_kind.casecmp?("DISABLED")
end
|