google-cloud-spanner 2.3.0 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +64 -0
  3. data/CONTRIBUTING.md +1 -1
  4. data/LOGGING.md +1 -1
  5. data/OVERVIEW.md +1 -1
  6. data/lib/google-cloud-spanner.rb +2 -0
  7. data/lib/google/cloud/spanner/backup.rb +75 -4
  8. data/lib/google/cloud/spanner/backup/job.rb +8 -8
  9. data/lib/google/cloud/spanner/backup/job/list.rb +2 -2
  10. data/lib/google/cloud/spanner/backup/list.rb +2 -2
  11. data/lib/google/cloud/spanner/batch_snapshot.rb +11 -4
  12. data/lib/google/cloud/spanner/batch_update.rb +3 -1
  13. data/lib/google/cloud/spanner/client.rb +315 -83
  14. data/lib/google/cloud/spanner/commit.rb +4 -0
  15. data/lib/google/cloud/spanner/data.rb +4 -5
  16. data/lib/google/cloud/spanner/database.rb +111 -3
  17. data/lib/google/cloud/spanner/database/backup_info.rb +12 -3
  18. data/lib/google/cloud/spanner/database/job/list.rb +2 -2
  19. data/lib/google/cloud/spanner/database/list.rb +4 -4
  20. data/lib/google/cloud/spanner/fields.rb +5 -3
  21. data/lib/google/cloud/spanner/instance.rb +91 -3
  22. data/lib/google/cloud/spanner/instance/config/list.rb +4 -4
  23. data/lib/google/cloud/spanner/instance/list.rb +4 -4
  24. data/lib/google/cloud/spanner/partition.rb +4 -2
  25. data/lib/google/cloud/spanner/policy.rb +3 -2
  26. data/lib/google/cloud/spanner/pool.rb +10 -10
  27. data/lib/google/cloud/spanner/project.rb +65 -5
  28. data/lib/google/cloud/spanner/results.rb +13 -9
  29. data/lib/google/cloud/spanner/service.rb +44 -24
  30. data/lib/google/cloud/spanner/session.rb +38 -15
  31. data/lib/google/cloud/spanner/snapshot.rb +10 -2
  32. data/lib/google/cloud/spanner/status.rb +4 -1
  33. data/lib/google/cloud/spanner/transaction.rb +61 -6
  34. data/lib/google/cloud/spanner/version.rb +1 -1
  35. metadata +10 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62f5ce383d6aefe48214924e77b5a794bd0a0c03bb6acaedd383be12d47da9b9
4
- data.tar.gz: ed1e49a6ef47946d557f8cb768d6da33923179fa05551ea7fadd55f3f5cfe341
3
+ metadata.gz: e8347879380e3278cec1dee95179755b0f1ff4ffecea9fae6b04861bd43976d1
4
+ data.tar.gz: b6c66cb0637a396bfee1e590b6316826f24a5dc45739c57de19c14c0304bc501
5
5
  SHA512:
6
- metadata.gz: 4b22e83c54208f8961e267a81ef681f98ef7e2ffe9a48274e566899adfed7c514c3a124b9f747667908db89067cbe0715f8c1363635d75cd4461f9072f703819
7
- data.tar.gz: '085550ca4945d0436fd92f94adb16464d30224f5f466ca1f3becb24bdcf0b8bc4fa0416d2f26ecc375ca71eadface1856702dac02a7093bda001ce4e37be359d'
6
+ metadata.gz: 5a2caf305e7484bd7c17d89973ee3eb536a11b202fa7b85443f33b60ebafc65fb67a57106ca75fda2d448c45614479c44745344af17267f6577b37a5389c2d02
7
+ data.tar.gz: 3be51dc4c55d948f57c19e2be190cbc27b259793d63b77d366ae9bc8beb7e64c67135127e130b3837305576a41eb5ae370e810ec58ccbb46f627e0816c0359f8
data/CHANGELOG.md CHANGED
@@ -1,5 +1,69 @@
1
1
  # Release History
2
2
 
3
+ ### 2.8.0 / 2021-06-17
4
+
5
+ #### Features
6
+
7
+ * create instance using processing units/node count ([#11379](https://www.github.com/googleapis/google-cloud-ruby/issues/11379))
8
+ * create instance using processing units/node count
9
+ * fix typo
10
+ * removed node count and processing unit validations
11
+ * update orignal value on instance save
12
+ * remove orignal_values to current_valuess
13
+
14
+ ### 2.7.0 / 2021-06-09
15
+
16
+ #### Features
17
+
18
+ * add the support of optimizer statistics package ([#7591](https://www.github.com/googleapis/google-cloud-ruby/issues/7591))
19
+ * feat(spanner): add the support of optimizer statistics package
20
+ * Fix rubocop issues.
21
+ * Fix the env issue.
22
+ * database create time access method ([#11617](https://www.github.com/googleapis/google-cloud-ruby/issues/11617))
23
+ * added database create time method
24
+ * remove assert for databse create time
25
+ * RPC priority request option. ([#11258](https://www.github.com/googleapis/google-cloud-ruby/issues/11258))
26
+
27
+ #### Bug Fixes
28
+
29
+ * extract binary retry info from error ([#11656](https://www.github.com/googleapis/google-cloud-ruby/issues/11656))
30
+ * fix: extract binary retry info from error
31
+ * fix: remove unrelated frozen_string_literal change
32
+ * fix: remove unnecessary parentheses
33
+
34
+ ### 2.6.0 / 2021-03-31
35
+
36
+ #### Features
37
+
38
+ * add cmek backup support - ext of [#8142](https://www.github.com/googleapis/google-cloud-ruby/issues/8142) ([#8168](https://www.github.com/googleapis/google-cloud-ruby/issues/8168))
39
+ * feat(spanner): add cmek backup support
40
+ * Add encryption_config to restore database.
41
+ * doc example for backup create with encryption config
42
+ * create backup with encryption type
43
+ * backup restore with encryption type changes
44
+ * fix typo
45
+ * add cmek db support
46
+
47
+ ### 2.5.0 / 2021-03-10
48
+
49
+ #### Features
50
+
51
+ * Drop support for Ruby 2.4 and add support for Ruby 3.0
52
+
53
+ ### 2.4.0 / 2021-02-18
54
+
55
+ #### Features
56
+
57
+ * Point In Time Recovery (PITR) ([#8169](https://www.github.com/googleapis/google-cloud-ruby/issues/8169))
58
+ * feat(spanner): support pitr-lite
59
+ * feature(spanner): adds test for throttled
60
+ * feat(spanner): adds version time to backup
61
+ * test(spanner): adds unit test for create backup
62
+ * feat(spanner): exposes version time in backup
63
+ * chore: fixes rubocop violations
64
+ * fix: addresses PR comments
65
+ * test: adds integration tests for pitr backup
66
+
3
67
  ### 2.3.0 / 2021-02-09
4
68
 
5
69
  #### Features
data/CONTRIBUTING.md CHANGED
@@ -24,7 +24,7 @@ be able to accept your pull requests.
24
24
  In order to use the google-cloud-spanner console and run the project's tests,
25
25
  there is a small amount of setup:
26
26
 
27
- 1. Install Ruby. google-cloud-spanner requires Ruby 2.4+. You may choose to
27
+ 1. Install Ruby. google-cloud-spanner requires Ruby 2.5+. You may choose to
28
28
  manage your Ruby and gem installations with [RVM](https://rvm.io/),
29
29
  [rbenv](https://github.com/rbenv/rbenv), or
30
30
  [chruby](https://github.com/postmodern/chruby).
data/LOGGING.md CHANGED
@@ -3,7 +3,7 @@
3
3
  To enable logging for this library, set the logger for the underlying
4
4
  [gRPC](https://github.com/grpc/grpc/tree/master/src/ruby) library. The logger
5
5
  that you set may be a Ruby stdlib
6
- [`Logger`](https://ruby-doc.org/stdlib-2.5.0/libdoc/logger/rdoc/Logger.html) as
6
+ [`Logger`](https://ruby-doc.org/stdlib/libdoc/logger/rdoc/Logger.html) as
7
7
  shown below, or a
8
8
  [`Google::Cloud::Logging::Logger`](https://googleapis.dev/ruby/google-cloud-logging/latest)
9
9
  that will write logs to [Stackdriver
data/OVERVIEW.md CHANGED
@@ -316,7 +316,7 @@ spanner = Google::Cloud::Spanner.new
316
316
  instance = spanner.instance "my-instance"
317
317
 
318
318
  instance.delete
319
- ````
319
+ ```
320
320
 
321
321
  ## Additional information
322
322
 
@@ -156,7 +156,9 @@ Google::Cloud.configure.add_config! :spanner do |config|
156
156
  default_query_options = Google::Cloud::Config.deferred do
157
157
  query_options = {}
158
158
  optimizer_version = ENV["SPANNER_OPTIMIZER_VERSION"]
159
+ optimizer_stats_pkg = ENV["SPANNER_OPTIMIZER_STATISTICS_PACKAGE"]
159
160
  query_options[:optimizer_version] = optimizer_version if optimizer_version
161
+ query_options[:optimizer_statistics_package] = optimizer_stats_pkg if optimizer_stats_pkg
160
162
  query_options = nil if query_options.empty?
161
163
  query_options
162
164
  end
@@ -88,6 +88,12 @@ module Google
88
88
  @grpc.database.split("/")[5]
89
89
  end
90
90
 
91
+ # Encryption information for a given resource.
92
+ # @return [Google::Cloud::Spanner::Admin::Database::V1::EncryptionInfo, nil]
93
+ def encryption_info
94
+ @grpc.encryption_info
95
+ end
96
+
91
97
  ##
92
98
  # The full path for the backup. Values are of the form
93
99
  # `projects/<project>/instances/<instance>/backups/<backup_id>`.
@@ -155,9 +161,17 @@ module Google
155
161
  @grpc.expire_time = Convert.time_to_timestamp time
156
162
  update_mask = Google::Protobuf::FieldMask.new paths: ["expire_time"]
157
163
  @grpc = service.update_backup @grpc, update_mask
158
- rescue Google::Cloud::Error => error
164
+ rescue Google::Cloud::Error => e
159
165
  @grpc.expire_time = expire_time_was
160
- raise error
166
+ raise e
167
+ end
168
+
169
+ ##
170
+ # The timestamp when a consistent copy of the database for the backup was
171
+ # taken. The version time has microseconds granularity.
172
+ # @return [Time]
173
+ def version_time
174
+ Convert.timestamp_to_time @grpc.version_time
161
175
  end
162
176
 
163
177
  ##
@@ -237,6 +251,29 @@ module Google
237
251
  # project and have the same instance configuration as the instance
238
252
  # containing the source backup. Optional. Default value is same as a
239
253
  # backup instance.
254
+ # @param [Hash] encryption_config An encryption configuration describing
255
+ # the encryption type and key resources in Cloud KMS used to
256
+ # encrypt/decrypt the database to restore to. If this field is not
257
+ # specified, the restored database will use the same encryption
258
+ # configuration as the backup by default. Optional. The following
259
+ # settings can be provided:
260
+ #
261
+ # * `:kms_key_name` (String) The name of KMS key to use which should
262
+ # be the full path, e.g., `projects/<project>/locations/<location>\
263
+ # /keyRings/<key_ring>/cryptoKeys/<kms_key_name>`
264
+ # This field should be set only when encryption type
265
+ # `:CUSTOMER_MANAGED_ENCRYPTION`.
266
+ # * `:encryption_type` (Symbol) The encryption type of the backup.
267
+ # Valid values are:
268
+ # 1. `:USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION` - This is the default
269
+ # option when config is not specified.
270
+ # 2. `:GOOGLE_DEFAULT_ENCRYPTION` - Google default encryption.
271
+ # 3. `:CUSTOMER_MANAGED_ENCRYPTION` - Use customer managed encryption.
272
+ # If specified, `:kms_key_name` must contain a valid Cloud KMS key.
273
+ #
274
+ # @raise [ArgumentError] if `:CUSTOMER_MANAGED_ENCRYPTION` specified without
275
+ # customer managed kms key.
276
+ #
240
277
  # @return [Database] Restored database.
241
278
  #
242
279
  # @example
@@ -280,16 +317,50 @@ module Google
280
317
  # database = job.database
281
318
  # end
282
319
  #
283
- def restore database_id, instance_id: nil
320
+ # @example Restore database with encryption config
321
+ # require "google/cloud/spanner"
322
+ #
323
+ # spanner = Google::Cloud::Spanner.new
324
+ #
325
+ # instance = spanner.instance "my-instance"
326
+ # backup = instance.backup "my-backup"
327
+ # kms_key_name = "projects/<project>/locations/<location>/keyRings/<key_ring>/cryptoKeys/<kms_key_name>"
328
+ # encryption_config = {
329
+ # kms_key_name: kms_key_name,
330
+ # encryption_type: :CUSTOMER_MANAGED_ENCRYPTION
331
+ # }
332
+ # job = backup.restore(
333
+ # "my-restored-database",
334
+ # encryption_config: encryption_config
335
+ # )
336
+ #
337
+ # job.done? #=> false
338
+ # job.reload! # API call
339
+ # job.done? #=> true
340
+ #
341
+ # if job.error?
342
+ # status = job.error
343
+ # else
344
+ # database = job.database
345
+ # end
346
+ #
347
+ def restore database_id, instance_id: nil, encryption_config: nil
284
348
  ensure_service!
285
349
 
286
350
  instance_id ||= self.instance_id
287
351
 
352
+ if encryption_config&.include?(:kms_key_name) &&
353
+ encryption_config[:encryption_type] != :CUSTOMER_MANAGED_ENCRYPTION
354
+ raise Google::Cloud::InvalidArgumentError,
355
+ "kms_key_name only used with CUSTOMER_MANAGED_ENCRYPTION"
356
+ end
357
+
288
358
  grpc = service.restore_database \
289
359
  self.instance_id,
290
360
  backup_id,
291
361
  instance_id,
292
- database_id
362
+ database_id,
363
+ encryption_config: encryption_config
293
364
  Restore::Job.from_grpc grpc, service
294
365
  end
295
366
 
@@ -39,7 +39,7 @@ module Google
39
39
  #
40
40
  # database = spanner.database "my-instance", "my-database"
41
41
  # expire_time = Time.now + 36000
42
- # job = database.create_backup "my-backup", expire_time: expire_time
42
+ # job = database.create_backup "my-backup", expire_time
43
43
  #
44
44
  # job.done? #=> false
45
45
  # job.reload! # API call
@@ -80,7 +80,7 @@ module Google
80
80
  #
81
81
  # database = spanner.database "my-instance", "my-database"
82
82
  # expire_time = Time.now + 36000
83
- # job = database.create_backup "my-backup", expire_time: expire_time
83
+ # job = database.create_backup "my-backup", expire_time
84
84
  #
85
85
  # job.done? #=> false
86
86
  # job.reload!
@@ -105,7 +105,7 @@ module Google
105
105
  #
106
106
  # database = spanner.database "my-instance", "my-database"
107
107
  # expire_time = Time.now + 36000
108
- # job = database.create_backup "my-backup", expire_time: expire_time
108
+ # job = database.create_backup "my-backup", expire_time
109
109
  #
110
110
  # job.done? #=> false
111
111
  #
@@ -125,7 +125,7 @@ module Google
125
125
  #
126
126
  # database = spanner.database "my-instance", "my-database"
127
127
  # expire_time = Time.now + 36000
128
- # job = database.create_backup "my-backup", expire_time: expire_time
128
+ # job = database.create_backup "my-backup", expire_time
129
129
  #
130
130
  # job.error? #=> false
131
131
  #
@@ -147,7 +147,7 @@ module Google
147
147
  #
148
148
  # database = spanner.database "my-instance", "my-database"
149
149
  # expire_time = Time.now + 36000
150
- # job = database.create_backup "my-backup", expire_time: expire_time
150
+ # job = database.create_backup "my-backup", expire_time
151
151
  #
152
152
  # job.error? # true
153
153
  #
@@ -172,7 +172,7 @@ module Google
172
172
  #
173
173
  # database = spanner.database "my-instance", "my-database"
174
174
  # expire_time = Time.now + 36000
175
- # job = database.create_backup "my-backup", expire_time: expire_time
175
+ # job = database.create_backup "my-backup", expire_time
176
176
  #
177
177
  # job.done? #=> false
178
178
  # job.reload! # API call
@@ -195,7 +195,7 @@ module Google
195
195
  #
196
196
  # database = spanner.database "my-instance", "my-database"
197
197
  # expire_time = Time.now + 36000
198
- # job = database.create_backup "my-backup", expire_time: expire_time
198
+ # job = database.create_backup "my-backup", expire_time
199
199
  #
200
200
  # job.done? #=> false
201
201
  # job.wait_until_done!
@@ -215,7 +215,7 @@ module Google
215
215
  #
216
216
  # database = spanner.database "my-instance", "my-database"
217
217
  # expire_time = Time.now + 36000
218
- # job = database.create_backup "my-backup", expire_time: expire_time
218
+ # job = database.create_backup "my-backup", expire_time
219
219
  #
220
220
  # job.done? #=> false
221
221
  # job.cancel
@@ -130,12 +130,12 @@ module Google
130
130
  # job.backup.backup_id
131
131
  # end
132
132
  #
133
- def all
133
+ def all &block
134
134
  return enum_for :all unless block_given?
135
135
 
136
136
  results = self
137
137
  loop do
138
- results.each { |r| yield r }
138
+ results.each(&block)
139
139
  break unless next?
140
140
  grpc.next_page
141
141
  results = self.class.from_grpc grpc, service
@@ -128,12 +128,12 @@ module Google
128
128
  # backup.backup_id
129
129
  # end
130
130
  #
131
- def all
131
+ def all &block
132
132
  return enum_for :all unless block_given?
133
133
 
134
134
  results = self
135
135
  loop do
136
- results.each { |r| yield r }
136
+ results.each(&block)
137
137
  break unless next?
138
138
  grpc.next_page
139
139
  results = self.class.from_grpc grpc, service
@@ -173,6 +173,8 @@ module Google
173
173
  # * `:optimizer_version` (String) The version of optimizer to use.
174
174
  # Empty to use database default. "latest" to use the latest
175
175
  # available optimizer version.
176
+ # * `:optimizer_statistics_package` (String) Statistics package to
177
+ # use. Empty to use the database default.
176
178
  # @param [Hash] call_options A hash of values to specify the custom
177
179
  # call options, e.g., timeout, retries, etc. Call options are
178
180
  # optional. The following settings can be provided:
@@ -373,9 +375,9 @@ module Google
373
375
 
374
376
  opts = { call_options: call_options }
375
377
  if partition.execute?
376
- execute_partition_query partition, opts
378
+ execute_partition_query partition, **opts
377
379
  elsif partition.read?
378
- execute_partition_read partition, opts
380
+ execute_partition_read partition, **opts
379
381
  end
380
382
  end
381
383
 
@@ -473,6 +475,8 @@ module Google
473
475
  # * `:optimizer_version` (String) The version of optimizer to use.
474
476
  # Empty to use database default. "latest" to use the latest
475
477
  # available optimizer version.
478
+ # * `:optimizer_statistics_package` (String) Statistics package to
479
+ # use. Empty to use the database default.
476
480
  # @param [Hash] call_options A hash of values to specify the custom
477
481
  # call options, e.g., timeout, retries, etc. Call options are
478
482
  # optional. The following settings can be provided:
@@ -598,8 +602,11 @@ module Google
598
602
  # batch_snapshot = batch_client.batch_snapshot
599
603
  #
600
604
  # results = batch_snapshot.execute_query \
601
- # "SELECT * FROM users",
602
- # query_options: { optimizer_version: "1" }
605
+ # "SELECT * FROM users",
606
+ # query_options: {
607
+ # optimizer_version: "1",
608
+ # optimizer_statistics_package: "auto_20191128_14_47_22UTC"
609
+ # }
603
610
  #
604
611
  # results.rows.each do |row|
605
612
  # puts "User #{row[:id]} is #{row[:name]}"
@@ -142,7 +142,9 @@ module Google
142
142
 
143
143
  # @private
144
144
  class Statement
145
- attr_reader :sql, :params, :types
145
+ attr_reader :sql
146
+ attr_reader :params
147
+ attr_reader :types
146
148
 
147
149
  def initialize sql, params: nil, types: nil
148
150
  @sql = sql
@@ -42,12 +42,10 @@ module Google
42
42
  #
43
43
  # db = spanner.client "my-instance", "my-database"
44
44
  #
45
- # db.transaction do |tx|
46
- # results = tx.execute_query "SELECT * FROM users"
45
+ # results = db.execute_query "SELECT * FROM users"
47
46
  #
48
- # results.rows.each do |row|
49
- # puts "User #{row[:id]} is #{row[:name]}"
50
- # end
47
+ # results.rows.each do |row|
48
+ # puts "User #{row[:id]} is #{row[:name]}"
51
49
  # end
52
50
  #
53
51
  class Client
@@ -59,7 +57,7 @@ module Google
59
57
  @instance_id = instance_id
60
58
  @database_id = database_id
61
59
  @session_labels = session_labels
62
- @pool = Pool.new self, pool_opts
60
+ @pool = Pool.new self, **pool_opts
63
61
  @query_options = query_options
64
62
  end
65
63
 
@@ -129,6 +127,7 @@ module Google
129
127
  # | `BOOL` | `true`/`false` | |
130
128
  # | `INT64` | `Integer` | |
131
129
  # | `FLOAT64` | `Float` | |
130
+ # | `NUMERIC` | `BigDecimal` | |
132
131
  # | `STRING` | `String` | |
133
132
  # | `DATE` | `Date` | |
134
133
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -154,6 +153,7 @@ module Google
154
153
  # * `:BYTES`
155
154
  # * `:DATE`
156
155
  # * `:FLOAT64`
156
+ # * `:NUMERIC`
157
157
  # * `:INT64`
158
158
  # * `:STRING`
159
159
  # * `:TIMESTAMP`
@@ -167,6 +167,9 @@ module Google
167
167
  # @param [Hash] single_use Perform the read with a single-use snapshot
168
168
  # (read-only transaction). (See
169
169
  # [TransactionOptions](https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.v1#transactionoptions).)
170
+ # If no value is specified for this parameter, Cloud Spanner will use
171
+ # a single use read-only transaction with strong timestamp bound as
172
+ # default.
170
173
  # The snapshot can be created by providing exactly one of the
171
174
  # following options in the hash:
172
175
  #
@@ -223,6 +226,16 @@ module Google
223
226
  # * `:optimizer_version` (String) The version of optimizer to use.
224
227
  # Empty to use database default. "latest" to use the latest
225
228
  # available optimizer version.
229
+ # * `:optimizer_statistics_package` (String) Statistics package to
230
+ # use. Empty to use the database default.
231
+ # @param [Hash] request_options Common request options.
232
+ #
233
+ # * `:priority` (Symbol) The relative priority for requests.
234
+ # The priority acts as a hint to the Cloud Spanner scheduler
235
+ # and does not guarantee priority or order of execution.
236
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
237
+ # `:PRIORITY_HIGH`. If priority not set then default is
238
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
226
239
  # @param [Hash] call_options A hash of values to specify the custom
227
240
  # call options, e.g., timeout, retries, etc. Call options are
228
241
  # optional. The following settings can be provided:
@@ -343,7 +356,10 @@ module Google
343
356
  # db = spanner.client "my-instance", "my-database"
344
357
  #
345
358
  # results = db.execute_query \
346
- # "SELECT * FROM users", query_options: { optimizer_version: "1" }
359
+ # "SELECT * FROM users", query_options: {
360
+ # optimizer_version: "1",
361
+ # optimizer_statistics_package: "auto_20191128_14_47_22UTC"
362
+ # }
347
363
  #
348
364
  # results.rows.each do |row|
349
365
  # puts "User #{row[:id]} is #{row[:name]}"
@@ -372,8 +388,24 @@ module Google
372
388
  # puts "User #{row[:id]} is #{row[:name]}"
373
389
  # end
374
390
  #
391
+ # @example Using request options.
392
+ # require "google/cloud/spanner"
393
+ #
394
+ # spanner = Google::Cloud::Spanner.new
395
+ #
396
+ # db = spanner.client "my-instance", "my-database"
397
+ #
398
+ # request_options = { priority: :PRIORITY_MEDIUM }
399
+ # results = db.execute_query "SELECT * FROM users",
400
+ # request_options: request_options
401
+ #
402
+ # results.rows.each do |row|
403
+ # puts "User #{row[:id]} is #{row[:name]}"
404
+ # end
405
+ #
375
406
  def execute_query sql, params: nil, types: nil, single_use: nil,
376
- query_options: nil, call_options: nil
407
+ query_options: nil, request_options: nil,
408
+ call_options: nil
377
409
  validate_single_use_args! single_use
378
410
  ensure_service!
379
411
 
@@ -384,7 +416,8 @@ module Google
384
416
  @pool.with_session do |session|
385
417
  results = session.execute_query \
386
418
  sql, params: params, types: types, transaction: single_use_tx,
387
- query_options: query_options, call_options: call_options
419
+ query_options: query_options, request_options: request_options,
420
+ call_options: call_options
388
421
  end
389
422
  results
390
423
  end
@@ -408,7 +441,7 @@ module Google
408
441
  # once" semantics.
409
442
  #
410
443
  # Where DML statements must be executed using Transaction (see
411
- # {Transaction#execute_update}), Paritioned DML statements are executed
444
+ # {Transaction#execute_update}), Partitioned DML statements are executed
412
445
  # outside of a read/write transaction.
413
446
  #
414
447
  # Not all DML statements can be executed in the Partitioned DML mode and
@@ -494,6 +527,7 @@ module Google
494
527
  # | `BOOL` | `true`/`false` | |
495
528
  # | `INT64` | `Integer` | |
496
529
  # | `FLOAT64` | `Float` | |
530
+ # | `NUMERIC` | `BigDecimal` | |
497
531
  # | `STRING` | `String` | |
498
532
  # | `DATE` | `Date` | |
499
533
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -520,6 +554,7 @@ module Google
520
554
  # * `:BYTES`
521
555
  # * `:DATE`
522
556
  # * `:FLOAT64`
557
+ # * `:NUMERIC`
523
558
  # * `:INT64`
524
559
  # * `:STRING`
525
560
  # * `:TIMESTAMP`
@@ -535,6 +570,16 @@ module Google
535
570
  # * `:optimizer_version` (String) The version of optimizer to use.
536
571
  # Empty to use database default. "latest" to use the latest
537
572
  # available optimizer version.
573
+ # * `:optimizer_statistics_package` (String) Statistics package to
574
+ # use. Empty to use the database default.
575
+ # @param [Hash] request_options Common request options.
576
+ #
577
+ # * `:priority` (String) The relative priority for requests.
578
+ # The priority acts as a hint to the Cloud Spanner scheduler
579
+ # and does not guarantee priority or order of execution.
580
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
581
+ # `:PRIORITY_HIGH`. If priority not set then default is
582
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
538
583
  # @param [Hash] call_options A hash of values to specify the custom
539
584
  # call options, e.g., timeout, retries, etc. Call options are
540
585
  # optional. The following settings can be provided:
@@ -577,7 +622,10 @@ module Google
577
622
  #
578
623
  # row_count = db.execute_partition_update \
579
624
  # "UPDATE users SET friends = NULL WHERE active = false",
580
- # query_options: { optimizer_version: "1" }
625
+ # query_options: {
626
+ # optimizer_version: "1",
627
+ # optimizer_statistics_package: "auto_20191128_14_47_22UTC"
628
+ # }
581
629
  #
582
630
  # @example Query using custom timeout and retry policy:
583
631
  # require "google/cloud/spanner"
@@ -598,8 +646,20 @@ module Google
598
646
  # "UPDATE users SET friends = NULL WHERE active = false",
599
647
  # call_options: call_options
600
648
  #
649
+ # @example Using request options.
650
+ # require "google/cloud/spanner"
651
+ #
652
+ # spanner = Google::Cloud::Spanner.new
653
+ # db = spanner.client "my-instance", "my-database"
654
+ #
655
+ # request_options = { priority: :PRIORITY_MEDIUM }
656
+ # row_count = db.execute_partition_update \
657
+ # "UPDATE users SET friends = NULL WHERE active = @active",
658
+ # params: { active: false }, request_options: request_options
659
+ #
601
660
  def execute_partition_update sql, params: nil, types: nil,
602
- query_options: nil, call_options: nil
661
+ query_options: nil, request_options: nil,
662
+ call_options: nil
603
663
  ensure_service!
604
664
 
605
665
  params, types = Convert.to_input_params_and_types params, types
@@ -608,7 +668,8 @@ module Google
608
668
  results = session.execute_query \
609
669
  sql, params: params, types: types,
610
670
  transaction: pdml_transaction(session),
611
- query_options: query_options, call_options: call_options
671
+ query_options: query_options, request_options: request_options,
672
+ call_options: call_options
612
673
  end
613
674
  # Stream all PartialResultSet to get ResultSetStats
614
675
  results.rows.to_a
@@ -640,6 +701,9 @@ module Google
640
701
  # @param [Hash] single_use Perform the read with a single-use snapshot
641
702
  # (read-only transaction). (See
642
703
  # [TransactionOptions](https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.v1#transactionoptions).)
704
+ # If no value is specified for this parameter, Cloud Spanner will use
705
+ # a single use read-only transaction with strong timestamp bound as
706
+ # default.
643
707
  # The snapshot can be created by providing exactly one of the
644
708
  # following options in the hash:
645
709
  #
@@ -689,6 +753,14 @@ module Google
689
753
  # Useful for reading the freshest data available at a nearby
690
754
  # replica, while bounding the possible staleness if the local
691
755
  # replica has fallen behind.
756
+ # @param [Hash] request_options Common request options.
757
+ #
758
+ # * `:priority` (Symbol) The relative priority for requests.
759
+ # The priority acts as a hint to the Cloud Spanner scheduler
760
+ # and does not guarantee priority or order of execution.
761
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
762
+ # `:PRIORITY_HIGH`. If priority not set then default is
763
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
692
764
  # @param [Hash] call_options A hash of values to specify the custom
693
765
  # call options, e.g., timeout, retries, etc. Call options are
694
766
  # optional. The following settings can be provided:
@@ -753,8 +825,23 @@ module Google
753
825
  # puts "User #{row[:id]} is #{row[:name]}"
754
826
  # end
755
827
  #
828
+ # @example Using request options.
829
+ # require "google/cloud/spanner"
830
+ #
831
+ # spanner = Google::Cloud::Spanner.new
832
+ #
833
+ # db = spanner.client "my-instance", "my-database"
834
+ #
835
+ # request_options = { priority: :PRIORITY_MEDIUM }
836
+ # results = db.read "users", [:id, :name],
837
+ # request_options: request_options
838
+ #
839
+ # results.rows.each do |row|
840
+ # puts "User #{row[:id]} is #{row[:name]}"
841
+ # end
842
+ #
756
843
  def read table, columns, keys: nil, index: nil, limit: nil,
757
- single_use: nil, call_options: nil
844
+ single_use: nil, request_options: nil, call_options: nil
758
845
  validate_single_use_args! single_use
759
846
  ensure_service!
760
847
 
@@ -767,6 +854,7 @@ module Google
767
854
  results = session.read \
768
855
  table, columns, keys: keys, index: index, limit: limit,
769
856
  transaction: single_use_tx,
857
+ request_options: request_options,
770
858
  call_options: call_options
771
859
  end
772
860
  results
@@ -801,6 +889,7 @@ module Google
801
889
  # | `BOOL` | `true`/`false` | |
802
890
  # | `INT64` | `Integer` | |
803
891
  # | `FLOAT64` | `Float` | |
892
+ # | `NUMERIC` | `BigDecimal` | |
804
893
  # | `STRING` | `String` | |
805
894
  # | `DATE` | `Date` | |
806
895
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -817,6 +906,14 @@ module Google
817
906
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
818
907
  # then statistics related to the transaction will be included in
819
908
  # {CommitResponse}. Default value is `false`
909
+ # @param [Hash] request_options Common request options.
910
+ #
911
+ # * `:priority` (String) The relative priority for requests.
912
+ # The priority acts as a hint to the Cloud Spanner scheduler
913
+ # and does not guarantee priority or order of execution.
914
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
915
+ # `:PRIORITY_HIGH`. If priority not set then default is
916
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
820
917
  #
821
918
  # @return [Time, CommitResponse] The timestamp at which the operation
822
919
  # committed. If commit options are set it returns {CommitResponse}.
@@ -846,9 +943,21 @@ module Google
846
943
  # puts commit_resp.timestamp
847
944
  # puts commit_resp.stats.mutation_count
848
945
  #
849
- def upsert table, rows, commit_options: nil
946
+ # @example Using request options.
947
+ # require "google/cloud/spanner"
948
+ #
949
+ # spanner = Google::Cloud::Spanner.new
950
+ #
951
+ # db = spanner.client "my-instance", "my-database"
952
+ #
953
+ # request_options = { priority: :PRIORITY_MEDIUM }
954
+ # db.upsert "users", [{ id: 1, name: "Charlie", active: false }],
955
+ # request_options: request_options
956
+ #
957
+ def upsert table, rows, commit_options: nil, request_options: nil
850
958
  @pool.with_session do |session|
851
- session.upsert table, rows, commit_options: commit_options
959
+ session.upsert table, rows, commit_options: commit_options,
960
+ request_options: request_options
852
961
  end
853
962
  end
854
963
  alias save upsert
@@ -881,6 +990,7 @@ module Google
881
990
  # | `BOOL` | `true`/`false` | |
882
991
  # | `INT64` | `Integer` | |
883
992
  # | `FLOAT64` | `Float` | |
993
+ # | `NUMERIC` | `BigDecimal` | |
884
994
  # | `STRING` | `String` | |
885
995
  # | `DATE` | `Date` | |
886
996
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -897,6 +1007,14 @@ module Google
897
1007
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
898
1008
  # then statistics related to the transaction will be included in
899
1009
  # {CommitResponse}. Default value is `false`
1010
+ # @param [Hash] request_options Common request options.
1011
+ #
1012
+ # * `:priority` (String) The relative priority for requests.
1013
+ # The priority acts as a hint to the Cloud Spanner scheduler
1014
+ # and does not guarantee priority or order of execution.
1015
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1016
+ # `:PRIORITY_HIGH`. If priority not set then default is
1017
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
900
1018
  #
901
1019
  # @return [Time, CommitResponse] The timestamp at which the operation
902
1020
  # committed. If commit options are set it returns {CommitResponse}.
@@ -926,9 +1044,21 @@ module Google
926
1044
  # puts commit_resp.timestamp
927
1045
  # puts commit_resp.stats.mutation_count
928
1046
  #
929
- def insert table, rows, commit_options: nil
1047
+ # @example Using request options.
1048
+ # require "google/cloud/spanner"
1049
+ #
1050
+ # spanner = Google::Cloud::Spanner.new
1051
+ #
1052
+ # db = spanner.client "my-instance", "my-database"
1053
+ #
1054
+ # request_options = { priority: :PRIORITY_MEDIUM }
1055
+ # db.insert "users", [{ id: 1, name: "Charlie", active: false }],
1056
+ # request_options: request_options
1057
+ #
1058
+ def insert table, rows, commit_options: nil, request_options: nil
930
1059
  @pool.with_session do |session|
931
- session.insert table, rows, commit_options: commit_options
1060
+ session.insert table, rows, commit_options: commit_options,
1061
+ request_options: request_options
932
1062
  end
933
1063
  end
934
1064
 
@@ -960,6 +1090,7 @@ module Google
960
1090
  # | `BOOL` | `true`/`false` | |
961
1091
  # | `INT64` | `Integer` | |
962
1092
  # | `FLOAT64` | `Float` | |
1093
+ # | `NUMERIC` | `BigDecimal` | |
963
1094
  # | `STRING` | `String` | |
964
1095
  # | `DATE` | `Date` | |
965
1096
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -976,6 +1107,14 @@ module Google
976
1107
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
977
1108
  # then statistics related to the transaction will be included in
978
1109
  # {CommitResponse}. Default value is `false`
1110
+ # @param [Hash] request_options Common request options.
1111
+ #
1112
+ # * `:priority` (String) The relative priority for requests.
1113
+ # The priority acts as a hint to the Cloud Spanner scheduler
1114
+ # and does not guarantee priority or order of execution.
1115
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1116
+ # `:PRIORITY_HIGH`. If priority not set then default is
1117
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
979
1118
  #
980
1119
  # @return [Time, CommitResponse] The timestamp at which the operation
981
1120
  # committed. If commit options are set it returns {CommitResponse}.
@@ -1005,9 +1144,21 @@ module Google
1005
1144
  # puts commit_resp.timestamp
1006
1145
  # puts commit_resp.stats.mutation_count
1007
1146
  #
1008
- def update table, rows, commit_options: nil
1147
+ # @example Using request options.
1148
+ # require "google/cloud/spanner"
1149
+ #
1150
+ # spanner = Google::Cloud::Spanner.new
1151
+ #
1152
+ # db = spanner.client "my-instance", "my-database"
1153
+ #
1154
+ # request_options = { priority: :PRIORITY_MEDIUM }
1155
+ # db.update "users", [{ id: 1, name: "Charlie", active: false }],
1156
+ # request_options: request_options
1157
+ #
1158
+ def update table, rows, commit_options: nil, request_options: nil
1009
1159
  @pool.with_session do |session|
1010
- session.update table, rows, commit_options: commit_options
1160
+ session.update table, rows, commit_options: commit_options,
1161
+ request_options: request_options
1011
1162
  end
1012
1163
  end
1013
1164
 
@@ -1041,6 +1192,7 @@ module Google
1041
1192
  # | `BOOL` | `true`/`false` | |
1042
1193
  # | `INT64` | `Integer` | |
1043
1194
  # | `FLOAT64` | `Float` | |
1195
+ # | `NUMERIC` | `BigDecimal` | |
1044
1196
  # | `STRING` | `String` | |
1045
1197
  # | `DATE` | `Date` | |
1046
1198
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -1057,6 +1209,14 @@ module Google
1057
1209
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1058
1210
  # then statistics related to the transaction will be included in
1059
1211
  # {CommitResponse}. Default value is `false`
1212
+ # @param [Hash] request_options Common request options.
1213
+ #
1214
+ # * `:priority` (String) The relative priority for requests.
1215
+ # The priority acts as a hint to the Cloud Spanner scheduler
1216
+ # and does not guarantee priority or order of execution.
1217
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1218
+ # `:PRIORITY_HIGH`. If priority not set then default is
1219
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
1060
1220
  #
1061
1221
  # @return [Time, CommitResponse] The timestamp at which the operation
1062
1222
  # committed. If commit options are set it returns {CommitResponse}.
@@ -1086,9 +1246,21 @@ module Google
1086
1246
  # puts commit_resp.timestamp
1087
1247
  # puts commit_resp.stats.mutation_count
1088
1248
  #
1089
- def replace table, rows, commit_options: nil
1249
+ # @example Using request options.
1250
+ # require "google/cloud/spanner"
1251
+ #
1252
+ # spanner = Google::Cloud::Spanner.new
1253
+ #
1254
+ # db = spanner.client "my-instance", "my-database"
1255
+ #
1256
+ # request_options = { priority: :PRIORITY_MEDIUM }
1257
+ # db.replace "users", [{ id: 1, name: "Charlie", active: false }],
1258
+ # request_options: request_options
1259
+ #
1260
+ def replace table, rows, commit_options: nil, request_options: nil
1090
1261
  @pool.with_session do |session|
1091
- session.replace table, rows, commit_options: commit_options
1262
+ session.replace table, rows, commit_options: commit_options,
1263
+ request_options: request_options
1092
1264
  end
1093
1265
  end
1094
1266
 
@@ -1119,7 +1291,14 @@ module Google
1119
1291
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1120
1292
  # then statistics related to the transaction will be included in
1121
1293
  # {CommitResponse}. Default value is `false`
1122
- #
1294
+ # @param [Hash] request_options Common request options.
1295
+ #
1296
+ # * `:priority` (String) The relative priority for requests.
1297
+ # The priority acts as a hint to the Cloud Spanner scheduler
1298
+ # and does not guarantee priority or order of execution.
1299
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1300
+ # `:PRIORITY_HIGH`. If priority not set then default is
1301
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
1123
1302
  # @param [Hash] call_options A hash of values to specify the custom
1124
1303
  # call options, e.g., timeout, retries, etc. Call options are
1125
1304
  # optional. The following settings can be provided:
@@ -1159,9 +1338,21 @@ module Google
1159
1338
  # puts commit_resp.timestamp
1160
1339
  # puts commit_resp.stats.mutation_count
1161
1340
  #
1162
- def delete table, keys = [], commit_options: nil, call_options: nil
1341
+ # @example With request optinos
1342
+ # require "google/cloud/spanner"
1343
+ #
1344
+ # spanner = Google::Cloud::Spanner.new
1345
+ #
1346
+ # db = spanner.client "my-instance", "my-database"
1347
+ #
1348
+ # request_options = { priority: :PRIORITY_MEDIUM }
1349
+ # db.delete "users", [1, 2, 3], request_options: request_options
1350
+ #
1351
+ def delete table, keys = [], commit_options: nil, request_options: nil,
1352
+ call_options: nil
1163
1353
  @pool.with_session do |session|
1164
1354
  session.delete table, keys, commit_options: commit_options,
1355
+ request_options: request_options,
1165
1356
  call_options: call_options
1166
1357
  end
1167
1358
  end
@@ -1188,7 +1379,14 @@ module Google
1188
1379
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1189
1380
  # then statistics related to the transaction will be included in
1190
1381
  # {CommitResponse}. Default value is `false`
1191
- #
1382
+ # @param [Hash] request_options Common request options.
1383
+ #
1384
+ # * `:priority` (String) The relative priority for requests.
1385
+ # The priority acts as a hint to the Cloud Spanner scheduler
1386
+ # and does not guarantee priority or order of execution.
1387
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1388
+ # `:PRIORITY_HIGH`. If priority not set then default is
1389
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
1192
1390
  # @param [Hash] call_options A hash of values to specify the custom
1193
1391
  # call options, e.g., timeout, retries, etc. Call options are
1194
1392
  # optional. The following settings can be provided:
@@ -1237,19 +1435,33 @@ module Google
1237
1435
  # puts commit_resp.timestamp
1238
1436
  # puts commit_resp.stats.mutation_count
1239
1437
  #
1240
- def commit commit_options: nil, call_options: nil, &block
1438
+ # @example With request options
1439
+ # require "google/cloud/spanner"
1440
+ #
1441
+ # spanner = Google::Cloud::Spanner.new
1442
+ #
1443
+ # db = spanner.client "my-instance", "my-database"
1444
+ #
1445
+ # db.commit request_options: { priority: :PRIORITY_MEDIUM } do |c|
1446
+ # c.update "users", [{ id: 1, name: "Charlie", active: false }]
1447
+ # c.insert "users", [{ id: 2, name: "Harvey", active: true }]
1448
+ # end
1449
+ #
1450
+ def commit commit_options: nil, request_options: nil,
1451
+ call_options: nil, &block
1241
1452
  raise ArgumentError, "Must provide a block" unless block_given?
1242
1453
 
1243
1454
  @pool.with_session do |session|
1244
1455
  session.commit(
1245
- commit_options: commit_options, call_options: call_options, &block
1456
+ commit_options: commit_options, request_options: request_options,
1457
+ call_options: call_options, &block
1246
1458
  )
1247
1459
  end
1248
1460
  end
1249
1461
 
1250
1462
  # rubocop:disable Metrics/AbcSize
1251
- # rubocop:disable Metrics/BlockLength
1252
1463
  # rubocop:disable Metrics/MethodLength
1464
+ # rubocop:disable Metrics/BlockLength
1253
1465
 
1254
1466
  ##
1255
1467
  # Creates a transaction for reads and writes that execute atomically at
@@ -1274,7 +1486,14 @@ module Google
1274
1486
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1275
1487
  # then statistics related to the transaction will be included in
1276
1488
  # {CommitResponse}. Default value is `false`
1277
- #
1489
+ # @param [Hash] request_options Common request options.
1490
+ #
1491
+ # * `:priority` (String) The relative priority for requests.
1492
+ # The priority acts as a hint to the Cloud Spanner scheduler
1493
+ # and does not guarantee priority or order of execution.
1494
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1495
+ # `:PRIORITY_HIGH`. If priority not set then default is
1496
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
1278
1497
  # @param [Hash] call_options A hash of values to specify the custom
1279
1498
  # call options, e.g., timeout, retries, etc. Call options are
1280
1499
  # optional. The following settings can be provided:
@@ -1351,7 +1570,23 @@ module Google
1351
1570
  # puts commit_resp.timestamp
1352
1571
  # puts commit_resp.stats.mutation_count
1353
1572
  #
1354
- def transaction deadline: 120, commit_options: nil, call_options: nil
1573
+ # @example Using request options.
1574
+ # require "google/cloud/spanner"
1575
+ #
1576
+ # spanner = Google::Cloud::Spanner.new
1577
+ # db = spanner.client "my-instance", "my-database"
1578
+ #
1579
+ # db.transaction request_options: { priority: :PRIORITY_MEDIUM } do |tx|
1580
+ # tx.update "users", [{ id: 1, name: "Charlie", active: false }]
1581
+ # tx.insert "users", [{ id: 2, name: "Harvey", active: true }]
1582
+ #
1583
+ # request_options = { priority: :PRIORITY_LOW }
1584
+ # results = tx.execute_query "SELECT * FROM users",
1585
+ # request_options: request_options
1586
+ # end
1587
+ #
1588
+ def transaction deadline: 120, commit_options: nil,
1589
+ request_options: nil, call_options: nil
1355
1590
  ensure_service!
1356
1591
  unless Thread.current[:transaction_id].nil?
1357
1592
  raise "Nested transactions are not allowed"
@@ -1362,45 +1597,44 @@ module Google
1362
1597
  start_time = current_time
1363
1598
 
1364
1599
  @pool.with_transaction do |tx|
1365
- begin
1366
- Thread.current[:transaction_id] = tx.transaction_id
1367
- yield tx
1368
- commit_resp = @project.service.commit \
1369
- tx.session.path, tx.mutations,
1370
- transaction_id: tx.transaction_id,
1371
- commit_options: commit_options,
1372
- call_options: call_options
1373
- resp = CommitResponse.from_grpc commit_resp
1374
- commit_options ? resp : resp.timestamp
1375
- rescue GRPC::Aborted, Google::Cloud::AbortedError => err
1376
- # Re-raise if deadline has passed
1377
- if current_time - start_time > deadline
1378
- if err.is_a? GRPC::BadStatus
1379
- err = Google::Cloud::Error.from_error err
1380
- end
1381
- raise err
1600
+ Thread.current[:transaction_id] = tx.transaction_id
1601
+ yield tx
1602
+ commit_resp = @project.service.commit \
1603
+ tx.session.path, tx.mutations,
1604
+ transaction_id: tx.transaction_id,
1605
+ commit_options: commit_options,
1606
+ request_options: request_options,
1607
+ call_options: call_options
1608
+ resp = CommitResponse.from_grpc commit_resp
1609
+ commit_options ? resp : resp.timestamp
1610
+ rescue GRPC::Aborted, Google::Cloud::AbortedError => e
1611
+ # Re-raise if deadline has passed
1612
+ if current_time - start_time > deadline
1613
+ if e.is_a? GRPC::BadStatus
1614
+ e = Google::Cloud::Error.from_error e
1382
1615
  end
1383
- # Sleep the amount from RetryDelay, or incremental backoff
1384
- sleep(delay_from_aborted(err) || backoff *= 1.3)
1385
- # Create new transaction on the session and retry the block
1386
- tx = tx.session.create_transaction
1387
- retry
1388
- rescue StandardError => err
1389
- # Rollback transaction when handling unexpected error
1390
- tx.session.rollback tx.transaction_id
1391
- # Return nil if raised with rollback.
1392
- return nil if err.is_a? Rollback
1393
- # Re-raise error.
1394
- raise err
1395
- ensure
1396
- Thread.current[:transaction_id] = nil
1616
+ raise e
1397
1617
  end
1618
+ # Sleep the amount from RetryDelay, or incremental backoff
1619
+ sleep(delay_from_aborted(e) || backoff *= 1.3)
1620
+ # Create new transaction on the session and retry the block
1621
+ tx = tx.session.create_transaction
1622
+ retry
1623
+ rescue StandardError => e
1624
+ # Rollback transaction when handling unexpected error
1625
+ tx.session.rollback tx.transaction_id
1626
+ # Return nil if raised with rollback.
1627
+ return nil if e.is_a? Rollback
1628
+ # Re-raise error.
1629
+ raise e
1630
+ ensure
1631
+ Thread.current[:transaction_id] = nil
1398
1632
  end
1399
1633
  end
1400
1634
 
1401
1635
  # rubocop:enable Metrics/AbcSize
1402
- # rubocop:enable Metrics/BlockLength
1403
1636
  # rubocop:enable Metrics/MethodLength
1637
+ # rubocop:enable Metrics/BlockLength
1404
1638
 
1405
1639
  ##
1406
1640
  # Creates a snapshot read-only transaction for reads that execute
@@ -1481,18 +1715,16 @@ module Google
1481
1715
  end
1482
1716
 
1483
1717
  @pool.with_session do |session|
1484
- begin
1485
- snp_grpc = @project.service.create_snapshot \
1486
- session.path, strong: strong,
1487
- timestamp: (timestamp || read_timestamp),
1488
- staleness: (staleness || exact_staleness),
1489
- call_options: call_options
1490
- Thread.current[:transaction_id] = snp_grpc.id
1491
- snp = Snapshot.from_grpc snp_grpc, session
1492
- yield snp if block_given?
1493
- ensure
1494
- Thread.current[:transaction_id] = nil
1495
- end
1718
+ snp_grpc = @project.service.create_snapshot \
1719
+ session.path, strong: strong,
1720
+ timestamp: (timestamp || read_timestamp),
1721
+ staleness: (staleness || exact_staleness),
1722
+ call_options: call_options
1723
+ Thread.current[:transaction_id] = snp_grpc.id
1724
+ snp = Snapshot.from_grpc snp_grpc, session
1725
+ yield snp if block_given?
1726
+ ensure
1727
+ Thread.current[:transaction_id] = nil
1496
1728
  end
1497
1729
  nil
1498
1730
  end
@@ -1514,12 +1746,13 @@ module Google
1514
1746
  # Hash values must contain the type value. If a Hash is used the
1515
1747
  # fields will be created using the same order as the Hash keys.
1516
1748
  #
1517
- # Supported type values incude:
1749
+ # Supported type values include:
1518
1750
  #
1519
1751
  # * `:BOOL`
1520
1752
  # * `:BYTES`
1521
1753
  # * `:DATE`
1522
1754
  # * `:FLOAT64`
1755
+ # * `:NUMERIC`
1523
1756
  # * `:INT64`
1524
1757
  # * `:STRING`
1525
1758
  # * `:TIMESTAMP`
@@ -1691,7 +1924,7 @@ module Google
1691
1924
  def batch_create_new_sessions total
1692
1925
  sessions = []
1693
1926
  remaining = total
1694
- while remaining > 0
1927
+ while remaining.positive?
1695
1928
  sessions += batch_create_sessions remaining
1696
1929
  remaining = total - sessions.count
1697
1930
  end
@@ -1795,7 +2028,7 @@ module Google
1795
2028
 
1796
2029
  def validate_deadline deadline
1797
2030
  return 120 unless deadline.is_a? Numeric
1798
- return 120 if deadline < 0
2031
+ return 120 if deadline.negative?
1799
2032
  deadline
1800
2033
  end
1801
2034
 
@@ -1810,13 +2043,12 @@ module Google
1810
2043
  # GRPC::Aborted
1811
2044
  def delay_from_aborted err
1812
2045
  return nil if err.nil?
1813
- if err.respond_to?(:metadata) && err.metadata["retryDelay"]
1814
- # a correct metadata will look like this:
1815
- # "{\"retryDelay\":{\"seconds\":60}}"
1816
- seconds = err.metadata["retryDelay"]["seconds"].to_i
1817
- nanos = err.metadata["retryDelay"]["nanos"].to_i
2046
+ if err.respond_to?(:metadata) && err.metadata["google.rpc.retryinfo-bin"]
2047
+ retry_info = Google::Rpc::RetryInfo.decode err.metadata["google.rpc.retryinfo-bin"]
2048
+ seconds = retry_info["retry_delay"].seconds
2049
+ nanos = retry_info["retry_delay"].nanos
1818
2050
  return seconds if nanos.zero?
1819
- return seconds + (nanos / 1000000000.0)
2051
+ return seconds + (nanos / 1_000_000_000.0)
1820
2052
  end
1821
2053
  # No metadata? Try the inner error
1822
2054
  delay_from_aborted err.cause