google-cloud-spanner 1.6.4 → 1.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/google/cloud/spanner/batch_snapshot.rb +43 -32
- data/lib/google/cloud/spanner/client.rb +221 -27
- data/lib/google/cloud/spanner/data.rb +1 -1
- data/lib/google/cloud/spanner/fields.rb +1 -1
- data/lib/google/cloud/spanner/partition.rb +16 -9
- data/lib/google/cloud/spanner/project.rb +2 -2
- data/lib/google/cloud/spanner/results.rb +73 -42
- data/lib/google/cloud/spanner/service.rb +18 -4
- data/lib/google/cloud/spanner/session.rb +39 -27
- data/lib/google/cloud/spanner/snapshot.rb +32 -24
- data/lib/google/cloud/spanner/transaction.rb +135 -25
- data/lib/google/cloud/spanner/version.rb +1 -1
- metadata +2 -2
@@ -33,7 +33,7 @@ module Google
|
|
33
33
|
# db = spanner.client "my-instance", "my-database"
|
34
34
|
#
|
35
35
|
# db.snapshot do |snp|
|
36
|
-
# results = snp.
|
36
|
+
# results = snp.execute_query "SELECT * FROM users"
|
37
37
|
#
|
38
38
|
# results.rows.each do |row|
|
39
39
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -128,7 +128,7 @@ module Google
|
|
128
128
|
# db = spanner.client "my-instance", "my-database"
|
129
129
|
#
|
130
130
|
# db.snapshot do |snp|
|
131
|
-
# results = snp.
|
131
|
+
# results = snp.execute_query "SELECT * FROM users"
|
132
132
|
#
|
133
133
|
# results.rows.each do |row|
|
134
134
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -142,7 +142,7 @@ module Google
|
|
142
142
|
# db = spanner.client "my-instance", "my-database"
|
143
143
|
#
|
144
144
|
# db.snapshot do |snp|
|
145
|
-
# results = snp.
|
145
|
+
# results = snp.execute_query "SELECT * FROM users " \
|
146
146
|
# "WHERE active = @active",
|
147
147
|
# params: { active: true }
|
148
148
|
#
|
@@ -160,11 +160,13 @@ module Google
|
|
160
160
|
# db.snapshot do |snp|
|
161
161
|
# user_hash = { id: 1, name: "Charlie", active: false }
|
162
162
|
#
|
163
|
-
# results = snp.
|
164
|
-
#
|
165
|
-
#
|
166
|
-
#
|
167
|
-
#
|
163
|
+
# results = snp.execute_query(
|
164
|
+
# "SELECT * FROM users WHERE " \
|
165
|
+
# "ID = @user_struct.id " \
|
166
|
+
# "AND name = @user_struct.name " \
|
167
|
+
# "AND active = @user_struct.active",
|
168
|
+
# params: { user_struct: user_hash }
|
169
|
+
# )
|
168
170
|
#
|
169
171
|
# results.rows.each do |row|
|
170
172
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -181,12 +183,14 @@ module Google
|
|
181
183
|
# user_type = snp.fields id: :INT64, name: :STRING, active: :BOOL
|
182
184
|
# user_hash = { id: 1, name: nil, active: false }
|
183
185
|
#
|
184
|
-
# results = snp.
|
185
|
-
#
|
186
|
-
#
|
187
|
-
#
|
188
|
-
#
|
189
|
-
#
|
186
|
+
# results = snp.execute_query(
|
187
|
+
# "SELECT * FROM users WHERE " \
|
188
|
+
# "ID = @user_struct.id " \
|
189
|
+
# "AND name = @user_struct.name " \
|
190
|
+
# "AND active = @user_struct.active",
|
191
|
+
# params: { user_struct: user_hash },
|
192
|
+
# types: { user_struct: user_type }
|
193
|
+
# )
|
190
194
|
#
|
191
195
|
# results.rows.each do |row|
|
192
196
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -203,30 +207,34 @@ module Google
|
|
203
207
|
# user_type = snp.fields id: :INT64, name: :STRING, active: :BOOL
|
204
208
|
# user_data = user_type.struct id: 1, name: nil, active: false
|
205
209
|
#
|
206
|
-
# results = snp.
|
207
|
-
#
|
208
|
-
#
|
209
|
-
#
|
210
|
-
#
|
210
|
+
# results = snp.execute_query(
|
211
|
+
# "SELECT * FROM users WHERE " \
|
212
|
+
# "ID = @user_struct.id " \
|
213
|
+
# "AND name = @user_struct.name " \
|
214
|
+
# "AND active = @user_struct.active",
|
215
|
+
# params: { user_struct: user_data }
|
216
|
+
# )
|
211
217
|
#
|
212
218
|
# results.rows.each do |row|
|
213
219
|
# puts "User #{row[:id]} is #{row[:name]}"
|
214
220
|
# end
|
215
221
|
# end
|
216
222
|
#
|
217
|
-
def
|
223
|
+
def execute_query sql, params: nil, types: nil
|
218
224
|
ensure_session!
|
219
225
|
|
220
226
|
params, types = Convert.to_input_params_and_types params, types
|
221
227
|
|
222
|
-
session.
|
223
|
-
|
228
|
+
session.execute_query sql, params: params, types: types,
|
229
|
+
transaction: tx_selector
|
224
230
|
end
|
225
|
-
alias
|
231
|
+
alias execute execute_query
|
232
|
+
alias query execute_query
|
233
|
+
alias execute_sql execute_query
|
226
234
|
|
227
235
|
##
|
228
236
|
# Read rows from a database table, as a simple alternative to
|
229
|
-
# {#
|
237
|
+
# {#execute_query}.
|
230
238
|
#
|
231
239
|
# @param [String] table The name of the table in the database to be
|
232
240
|
# read.
|
@@ -79,6 +79,7 @@ module Google
|
|
79
79
|
|
80
80
|
def initialize
|
81
81
|
@commit = Commit.new
|
82
|
+
@seqno = 0
|
82
83
|
end
|
83
84
|
|
84
85
|
##
|
@@ -157,7 +158,7 @@ module Google
|
|
157
158
|
# db = spanner.client "my-instance", "my-database"
|
158
159
|
#
|
159
160
|
# db.transaction do |tx|
|
160
|
-
# results = tx.
|
161
|
+
# results = tx.execute_query "SELECT * FROM users"
|
161
162
|
#
|
162
163
|
# results.rows.each do |row|
|
163
164
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -171,8 +172,10 @@ module Google
|
|
171
172
|
# db = spanner.client "my-instance", "my-database"
|
172
173
|
#
|
173
174
|
# db.transaction do |tx|
|
174
|
-
# results = tx.
|
175
|
-
#
|
175
|
+
# results = tx.execute_query(
|
176
|
+
# "SELECT * FROM users WHERE active = @active",
|
177
|
+
# params: { active: true }
|
178
|
+
# )
|
176
179
|
#
|
177
180
|
# results.rows.each do |row|
|
178
181
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -188,11 +191,13 @@ module Google
|
|
188
191
|
# db.transaction do |tx|
|
189
192
|
# user_hash = { id: 1, name: "Charlie", active: false }
|
190
193
|
#
|
191
|
-
# results = tx.
|
192
|
-
#
|
193
|
-
#
|
194
|
-
#
|
195
|
-
#
|
194
|
+
# results = tx.execute_query(
|
195
|
+
# "SELECT * FROM users WHERE " \
|
196
|
+
# "ID = @user_struct.id " \
|
197
|
+
# "AND name = @user_struct.name " \
|
198
|
+
# "AND active = @user_struct.active",
|
199
|
+
# params: { user_struct: user_hash }
|
200
|
+
# )
|
196
201
|
#
|
197
202
|
# results.rows.each do |row|
|
198
203
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -209,12 +214,14 @@ module Google
|
|
209
214
|
# user_type = tx.fields id: :INT64, name: :STRING, active: :BOOL
|
210
215
|
# user_hash = { id: 1, name: nil, active: false }
|
211
216
|
#
|
212
|
-
# results = tx.
|
213
|
-
#
|
214
|
-
#
|
215
|
-
#
|
216
|
-
#
|
217
|
-
#
|
217
|
+
# results = tx.execute_query(
|
218
|
+
# "SELECT * FROM users WHERE " \
|
219
|
+
# "ID = @user_struct.id " \
|
220
|
+
# "AND name = @user_struct.name " \
|
221
|
+
# "AND active = @user_struct.active",
|
222
|
+
# params: { user_struct: user_hash },
|
223
|
+
# types: { user_struct: user_type }
|
224
|
+
# )
|
218
225
|
#
|
219
226
|
# results.rows.each do |row|
|
220
227
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -231,30 +238,133 @@ module Google
|
|
231
238
|
# user_type = tx.fields id: :INT64, name: :STRING, active: :BOOL
|
232
239
|
# user_data = user_type.struct id: 1, name: nil, active: false
|
233
240
|
#
|
234
|
-
# results = tx.
|
235
|
-
#
|
236
|
-
#
|
237
|
-
#
|
238
|
-
#
|
241
|
+
# results = tx.execute_query(
|
242
|
+
# "SELECT * FROM users WHERE " \
|
243
|
+
# "ID = @user_struct.id " \
|
244
|
+
# "AND name = @user_struct.name " \
|
245
|
+
# "AND active = @user_struct.active",
|
246
|
+
# params: { user_struct: user_data }
|
247
|
+
# )
|
239
248
|
#
|
240
249
|
# results.rows.each do |row|
|
241
250
|
# puts "User #{row[:id]} is #{row[:name]}"
|
242
251
|
# end
|
243
252
|
# end
|
244
253
|
#
|
245
|
-
def
|
254
|
+
def execute_query sql, params: nil, types: nil
|
246
255
|
ensure_session!
|
247
256
|
|
257
|
+
@seqno += 1
|
258
|
+
|
248
259
|
params, types = Convert.to_input_params_and_types params, types
|
249
260
|
|
250
|
-
session.
|
251
|
-
|
261
|
+
session.execute_query sql, params: params, types: types,
|
262
|
+
transaction: tx_selector, seqno: @seqno
|
263
|
+
end
|
264
|
+
alias execute execute_query
|
265
|
+
alias query execute_query
|
266
|
+
alias execute_sql execute_query
|
267
|
+
|
268
|
+
##
|
269
|
+
# Executes a DML statement.
|
270
|
+
#
|
271
|
+
# @param [String] sql The DML statement string. See [Query
|
272
|
+
# syntax](https://cloud.google.com/spanner/docs/query-syntax).
|
273
|
+
#
|
274
|
+
# The DML statement string can contain parameter placeholders. A
|
275
|
+
# parameter placeholder consists of "@" followed by the parameter
|
276
|
+
# name. Parameter names consist of any combination of letters,
|
277
|
+
# numbers, and underscores.
|
278
|
+
# @param [Hash] params Parameters for the DML statement string. The
|
279
|
+
# parameter placeholders, minus the "@", are the the hash keys, and
|
280
|
+
# the literal values are the hash values. If the query string contains
|
281
|
+
# something like "WHERE id > @msg_id", then the params must contain
|
282
|
+
# something like `:msg_id => 1`.
|
283
|
+
#
|
284
|
+
# Ruby types are mapped to Spanner types as follows:
|
285
|
+
#
|
286
|
+
# | Spanner | Ruby | Notes |
|
287
|
+
# |-------------|----------------|---|
|
288
|
+
# | `BOOL` | `true`/`false` | |
|
289
|
+
# | `INT64` | `Integer` | |
|
290
|
+
# | `FLOAT64` | `Float` | |
|
291
|
+
# | `STRING` | `String` | |
|
292
|
+
# | `DATE` | `Date` | |
|
293
|
+
# | `TIMESTAMP` | `Time`, `DateTime` | |
|
294
|
+
# | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
|
295
|
+
# | `ARRAY` | `Array` | Nested arrays are not supported. |
|
296
|
+
# | `STRUCT` | `Hash`, {Data} | |
|
297
|
+
#
|
298
|
+
# See [Data
|
299
|
+
# types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
|
300
|
+
#
|
301
|
+
# See [Data Types - Constructing a
|
302
|
+
# STRUCT](https://cloud.google.com/spanner/docs/data-types#constructing-a-struct).
|
303
|
+
# @param [Hash] types Types of the SQL parameters in `params`. It is not
|
304
|
+
# always possible for Cloud Spanner to infer the right SQL type from a
|
305
|
+
# value in `params`. In these cases, the `types` hash can be used to
|
306
|
+
# specify the exact SQL type for some or all of the SQL query
|
307
|
+
# parameters.
|
308
|
+
#
|
309
|
+
# The keys of the hash should be query string parameter placeholders,
|
310
|
+
# minus the "@". The values of the hash should be Cloud Spanner type
|
311
|
+
# codes from the following list:
|
312
|
+
#
|
313
|
+
# * `:BOOL`
|
314
|
+
# * `:BYTES`
|
315
|
+
# * `:DATE`
|
316
|
+
# * `:FLOAT64`
|
317
|
+
# * `:INT64`
|
318
|
+
# * `:STRING`
|
319
|
+
# * `:TIMESTAMP`
|
320
|
+
# * `Array` - Lists are specified by providing the type code in an
|
321
|
+
# array. For example, an array of integers are specified as
|
322
|
+
# `[:INT64]`.
|
323
|
+
# * {Fields} - Nested Structs are specified by providing a Fields
|
324
|
+
# object.
|
325
|
+
#
|
326
|
+
# @return [Integer] The exact number of rows that were modified.
|
327
|
+
#
|
328
|
+
# @example
|
329
|
+
# require "google/cloud/spanner"
|
330
|
+
#
|
331
|
+
# spanner = Google::Cloud::Spanner.new
|
332
|
+
# db = spanner.client "my-instance", "my-database"
|
333
|
+
#
|
334
|
+
# db.transaction do |tx|
|
335
|
+
# row_count = tx.execute_update(
|
336
|
+
# "UPDATE users SET name = 'Charlie' WHERE id = 1",
|
337
|
+
# )
|
338
|
+
# end
|
339
|
+
#
|
340
|
+
# @example Update using SQL parameters:
|
341
|
+
# require "google/cloud/spanner"
|
342
|
+
#
|
343
|
+
# spanner = Google::Cloud::Spanner.new
|
344
|
+
# db = spanner.client "my-instance", "my-database"
|
345
|
+
#
|
346
|
+
# db.transaction do |tx|
|
347
|
+
# row_count = tx.execute_update(
|
348
|
+
# "UPDATE users SET name = @name WHERE id = @id",
|
349
|
+
# params: { id: 1, name: "Charlie" }
|
350
|
+
# )
|
351
|
+
# end
|
352
|
+
#
|
353
|
+
def execute_update sql, params: nil, types: nil
|
354
|
+
results = execute_query sql, params: params, types: types
|
355
|
+
# Stream all PartialResultSet to get ResultSetStats
|
356
|
+
results.rows.to_a
|
357
|
+
# Raise an error if there is not a row count returned
|
358
|
+
if results.row_count.nil?
|
359
|
+
raise Google::Cloud::InvalidArgumentError,
|
360
|
+
"DML statement is invalid."
|
361
|
+
end
|
362
|
+
results.row_count
|
252
363
|
end
|
253
|
-
alias query execute
|
254
364
|
|
255
365
|
##
|
256
366
|
# Read rows from a database table, as a simple alternative to
|
257
|
-
# {#
|
367
|
+
# {#execute_query}.
|
258
368
|
#
|
259
369
|
# @param [String] table The name of the table in the database to be
|
260
370
|
# read.
|
@@ -530,7 +640,7 @@ module Google
|
|
530
640
|
# end
|
531
641
|
#
|
532
642
|
def fields_for table
|
533
|
-
|
643
|
+
execute_query("SELECT * FROM #{table} WHERE 1 = 0").fields
|
534
644
|
end
|
535
645
|
|
536
646
|
##
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-cloud-spanner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Moore
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-10-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: google-cloud-core
|