google-cloud-spanner 1.16.2 → 2.4.0

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.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHENTICATION.md +1 -1
  3. data/CHANGELOG.md +66 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/lib/google-cloud-spanner.rb +11 -13
  6. data/lib/google/cloud/spanner.rb +13 -13
  7. data/lib/google/cloud/spanner/admin/database/credentials.rb +2 -2
  8. data/lib/google/cloud/spanner/admin/instance/credentials.rb +2 -2
  9. data/lib/google/cloud/spanner/backup.rb +9 -1
  10. data/lib/google/cloud/spanner/backup/job.rb +2 -2
  11. data/lib/google/cloud/spanner/backup/job/list.rb +2 -2
  12. data/lib/google/cloud/spanner/backup/list.rb +1 -2
  13. data/lib/google/cloud/spanner/backup/restore/job.rb +2 -2
  14. data/lib/google/cloud/spanner/batch_client.rb +2 -2
  15. data/lib/google/cloud/spanner/batch_snapshot.rb +120 -23
  16. data/lib/google/cloud/spanner/batch_update.rb +1 -1
  17. data/lib/google/cloud/spanner/client.rb +388 -47
  18. data/lib/google/cloud/spanner/commit.rb +14 -14
  19. data/lib/google/cloud/spanner/commit_response.rb +87 -0
  20. data/lib/google/cloud/spanner/commit_response/commit_stats.rb +51 -0
  21. data/lib/google/cloud/spanner/convert.rb +16 -7
  22. data/lib/google/cloud/spanner/credentials.rb +2 -2
  23. data/lib/google/cloud/spanner/data.rb +2 -2
  24. data/lib/google/cloud/spanner/database.rb +47 -25
  25. data/lib/google/cloud/spanner/database/backup_info.rb +13 -4
  26. data/lib/google/cloud/spanner/database/job.rb +3 -3
  27. data/lib/google/cloud/spanner/database/job/list.rb +2 -2
  28. data/lib/google/cloud/spanner/database/list.rb +1 -1
  29. data/lib/google/cloud/spanner/database/restore_info.rb +1 -1
  30. data/lib/google/cloud/spanner/fields.rb +8 -8
  31. data/lib/google/cloud/spanner/instance.rb +5 -12
  32. data/lib/google/cloud/spanner/instance/config.rb +1 -1
  33. data/lib/google/cloud/spanner/instance/config/list.rb +1 -1
  34. data/lib/google/cloud/spanner/instance/job.rb +2 -2
  35. data/lib/google/cloud/spanner/instance/list.rb +1 -1
  36. data/lib/google/cloud/spanner/partition.rb +4 -4
  37. data/lib/google/cloud/spanner/policy.rb +2 -2
  38. data/lib/google/cloud/spanner/results.rb +103 -24
  39. data/lib/google/cloud/spanner/service.rb +369 -350
  40. data/lib/google/cloud/spanner/session.rb +370 -39
  41. data/lib/google/cloud/spanner/snapshot.rb +60 -6
  42. data/lib/google/cloud/spanner/transaction.rb +116 -10
  43. data/lib/google/cloud/spanner/version.rb +1 -1
  44. metadata +20 -107
  45. data/lib/google/cloud/spanner/admin/database.rb +0 -149
  46. data/lib/google/cloud/spanner/admin/database/v1.rb +0 -147
  47. data/lib/google/cloud/spanner/admin/database/v1/credentials.rb +0 -46
  48. data/lib/google/cloud/spanner/admin/database/v1/database_admin_client.rb +0 -1513
  49. data/lib/google/cloud/spanner/admin/database/v1/database_admin_client_config.json +0 -111
  50. data/lib/google/cloud/spanner/admin/database/v1/doc/google/iam/v1/iam_policy.rb +0 -64
  51. data/lib/google/cloud/spanner/admin/database/v1/doc/google/iam/v1/options.rb +0 -33
  52. data/lib/google/cloud/spanner/admin/database/v1/doc/google/iam/v1/policy.rb +0 -151
  53. data/lib/google/cloud/spanner/admin/database/v1/doc/google/longrunning/operations.rb +0 -51
  54. data/lib/google/cloud/spanner/admin/database/v1/doc/google/protobuf/any.rb +0 -131
  55. data/lib/google/cloud/spanner/admin/database/v1/doc/google/protobuf/empty.rb +0 -29
  56. data/lib/google/cloud/spanner/admin/database/v1/doc/google/protobuf/field_mask.rb +0 -222
  57. data/lib/google/cloud/spanner/admin/database/v1/doc/google/protobuf/timestamp.rb +0 -113
  58. data/lib/google/cloud/spanner/admin/database/v1/doc/google/rpc/status.rb +0 -39
  59. data/lib/google/cloud/spanner/admin/database/v1/doc/google/spanner/admin/database/v1/backup.rb +0 -325
  60. data/lib/google/cloud/spanner/admin/database/v1/doc/google/spanner/admin/database/v1/spanner_database_admin.rb +0 -368
  61. data/lib/google/cloud/spanner/admin/database/v1/doc/google/type/expr.rb +0 -45
  62. data/lib/google/cloud/spanner/admin/instance.rb +0 -164
  63. data/lib/google/cloud/spanner/admin/instance/v1.rb +0 -162
  64. data/lib/google/cloud/spanner/admin/instance/v1/credentials.rb +0 -46
  65. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/iam/v1/iam_policy.rb +0 -64
  66. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/iam/v1/options.rb +0 -33
  67. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/iam/v1/policy.rb +0 -151
  68. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/longrunning/operations.rb +0 -51
  69. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/protobuf/any.rb +0 -131
  70. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/protobuf/empty.rb +0 -29
  71. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/protobuf/field_mask.rb +0 -222
  72. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/rpc/status.rb +0 -39
  73. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/spanner/admin/instance/v1/spanner_instance_admin.rb +0 -334
  74. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/type/expr.rb +0 -45
  75. data/lib/google/cloud/spanner/admin/instance/v1/instance_admin_client.rb +0 -975
  76. data/lib/google/cloud/spanner/admin/instance/v1/instance_admin_client_config.json +0 -76
  77. data/lib/google/cloud/spanner/v1.rb +0 -16
  78. data/lib/google/cloud/spanner/v1/credentials.rb +0 -42
  79. data/lib/google/cloud/spanner/v1/doc/google/protobuf/any.rb +0 -131
  80. data/lib/google/cloud/spanner/v1/doc/google/protobuf/duration.rb +0 -91
  81. data/lib/google/cloud/spanner/v1/doc/google/protobuf/empty.rb +0 -29
  82. data/lib/google/cloud/spanner/v1/doc/google/protobuf/struct.rb +0 -74
  83. data/lib/google/cloud/spanner/v1/doc/google/protobuf/timestamp.rb +0 -113
  84. data/lib/google/cloud/spanner/v1/doc/google/rpc/status.rb +0 -39
  85. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/keys.rb +0 -150
  86. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/mutation.rb +0 -95
  87. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/query_plan.rb +0 -121
  88. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/result_set.rb +0 -190
  89. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/spanner.rb +0 -570
  90. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/transaction.rb +0 -432
  91. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/type.rb +0 -112
  92. data/lib/google/cloud/spanner/v1/spanner_client.rb +0 -1485
  93. data/lib/google/cloud/spanner/v1/spanner_client_config.json +0 -121
  94. data/lib/google/spanner/admin/database/v1/backup_pb.rb +0 -98
  95. data/lib/google/spanner/admin/database/v1/common_pb.rb +0 -28
  96. data/lib/google/spanner/admin/database/v1/spanner_database_admin_pb.rb +0 -141
  97. data/lib/google/spanner/admin/database/v1/spanner_database_admin_services_pb.rb +0 -169
  98. data/lib/google/spanner/admin/instance/v1/spanner_instance_admin_pb.rb +0 -125
  99. data/lib/google/spanner/admin/instance/v1/spanner_instance_admin_services_pb.rb +0 -181
  100. data/lib/google/spanner/v1/keys_pb.rb +0 -34
  101. data/lib/google/spanner/v1/mutation_pb.rb +0 -39
  102. data/lib/google/spanner/v1/query_plan_pb.rb +0 -48
  103. data/lib/google/spanner/v1/result_set_pb.rb +0 -48
  104. data/lib/google/spanner/v1/spanner_pb.rb +0 -179
  105. data/lib/google/spanner/v1/spanner_services_pb.rb +0 -179
  106. data/lib/google/spanner/v1/transaction_pb.rb +0 -56
  107. data/lib/google/spanner/v1/type_pb.rb +0 -44
@@ -155,7 +155,7 @@ module Google
155
155
  Convert.to_input_params_and_types params, types
156
156
  # param_types is a grpc map field, can't be nil
157
157
  converted_types ||= {}
158
- Google::Spanner::V1::ExecuteBatchDmlRequest::Statement.new(
158
+ V1::ExecuteBatchDmlRequest::Statement.new(
159
159
  sql: sql,
160
160
  params: converted_params,
161
161
  param_types: converted_types
@@ -23,6 +23,7 @@ require "google/cloud/spanner/snapshot"
23
23
  require "google/cloud/spanner/range"
24
24
  require "google/cloud/spanner/column_value"
25
25
  require "google/cloud/spanner/convert"
26
+ require "google/cloud/spanner/commit_response"
26
27
 
27
28
  module Google
28
29
  module Cloud
@@ -222,6 +223,19 @@ module Google
222
223
  # * `:optimizer_version` (String) The version of optimizer to use.
223
224
  # Empty to use database default. "latest" to use the latest
224
225
  # available optimizer version.
226
+ # @param [Hash] call_options A hash of values to specify the custom
227
+ # call options, e.g., timeout, retries, etc. Call options are
228
+ # optional. The following settings can be provided:
229
+ #
230
+ # * `:timeout` (Numeric) A numeric value of custom timeout in seconds
231
+ # that overrides the default setting.
232
+ # * `:retry_policy` (Hash) A hash of values that overrides the default
233
+ # setting of retry policy with the following keys:
234
+ # * `:initial_delay` (`Numeric`) - The initial delay in seconds.
235
+ # * `:max_delay` (`Numeric`) - The max delay in seconds.
236
+ # * `:multiplier` (`Numeric`) - The incremental backoff multiplier.
237
+ # * `:retry_codes` (`Array<String>`) - The error codes that should
238
+ # trigger a retry.
225
239
  #
226
240
  # @return [Google::Cloud::Spanner::Results] The results of the query
227
241
  # execution.
@@ -335,8 +349,31 @@ module Google
335
349
  # puts "User #{row[:id]} is #{row[:name]}"
336
350
  # end
337
351
  #
352
+ # @example Query using custom timeout and retry policy:
353
+ # require "google/cloud/spanner"
354
+ #
355
+ # spanner = Google::Cloud::Spanner.new
356
+ #
357
+ # db = spanner.client "my-instance", "my-database"
358
+ #
359
+ # timeout = 30.0
360
+ # retry_policy = {
361
+ # initial_delay: 0.25,
362
+ # max_delay: 32.0,
363
+ # multiplier: 1.3,
364
+ # retry_codes: ["UNAVAILABLE"]
365
+ # }
366
+ # call_options = { timeout: timeout, retry_policy: retry_policy }
367
+ #
368
+ # results = db.execute_query \
369
+ # "SELECT * FROM users", call_options: call_options
370
+ #
371
+ # results.rows.each do |row|
372
+ # puts "User #{row[:id]} is #{row[:name]}"
373
+ # end
374
+ #
338
375
  def execute_query sql, params: nil, types: nil, single_use: nil,
339
- query_options: nil
376
+ query_options: nil, call_options: nil
340
377
  validate_single_use_args! single_use
341
378
  ensure_service!
342
379
 
@@ -347,7 +384,7 @@ module Google
347
384
  @pool.with_session do |session|
348
385
  results = session.execute_query \
349
386
  sql, params: params, types: types, transaction: single_use_tx,
350
- query_options: query_options
387
+ query_options: query_options, call_options: call_options
351
388
  end
352
389
  results
353
390
  end
@@ -474,14 +511,6 @@ module Google
474
511
  # value in `params`. In these cases, the `types` hash can be used to
475
512
  # specify the exact SQL type for some or all of the SQL query
476
513
  # parameters.
477
- # @param [Hash] query_options A hash of values to specify the custom
478
- # query options for executing SQL query. Query options are optional.
479
- # The following settings can be provided:
480
- #
481
- # * `:optimizer_version` (String) The version of optimizer to use.
482
- # Empty to use database default. "latest" to use the latest
483
- # available optimizer version.
484
- #
485
514
  #
486
515
  # The keys of the hash should be query string parameter placeholders,
487
516
  # minus the "@". The values of the hash should be Cloud Spanner type
@@ -499,6 +528,26 @@ module Google
499
528
  # `[:INT64]`.
500
529
  # * {Fields} - Nested Structs are specified by providing a Fields
501
530
  # object.
531
+ # @param [Hash] query_options A hash of values to specify the custom
532
+ # query options for executing SQL query. Query options are optional.
533
+ # The following settings can be provided:
534
+ #
535
+ # * `:optimizer_version` (String) The version of optimizer to use.
536
+ # Empty to use database default. "latest" to use the latest
537
+ # available optimizer version.
538
+ # @param [Hash] call_options A hash of values to specify the custom
539
+ # call options, e.g., timeout, retries, etc. Call options are
540
+ # optional. The following settings can be provided:
541
+ #
542
+ # * `:timeout` (Numeric) A numeric value of custom timeout in seconds
543
+ # that overrides the default setting.
544
+ # * `:retry_policy` (Hash) A hash of values that overrides the default
545
+ # setting of retry policy with the following keys:
546
+ # * `:initial_delay` (`Numeric`) - The initial delay in seconds.
547
+ # * `:max_delay` (`Numeric`) - The max delay in seconds.
548
+ # * `:multiplier` (`Numeric`) - The incremental backoff multiplier.
549
+ # * `:retry_codes` (`Array<String>`) - The error codes that should
550
+ # trigger a retry.
502
551
  # @return [Integer] The lower bound number of rows that were modified.
503
552
  #
504
553
  # @example
@@ -529,8 +578,28 @@ module Google
529
578
  # row_count = db.execute_partition_update \
530
579
  # "UPDATE users SET friends = NULL WHERE active = false",
531
580
  # query_options: { optimizer_version: "1" }
581
+ #
582
+ # @example Query using custom timeout and retry policy:
583
+ # require "google/cloud/spanner"
584
+ #
585
+ # spanner = Google::Cloud::Spanner.new
586
+ # db = spanner.client "my-instance", "my-database"
587
+ #
588
+ # timeout = 30.0
589
+ # retry_policy = {
590
+ # initial_delay: 0.25,
591
+ # max_delay: 32.0,
592
+ # multiplier: 1.3,
593
+ # retry_codes: ["UNAVAILABLE"]
594
+ # }
595
+ # call_options = { timeout: timeout, retry_policy: retry_policy }
596
+ #
597
+ # row_count = db.execute_partition_update \
598
+ # "UPDATE users SET friends = NULL WHERE active = false",
599
+ # call_options: call_options
600
+ #
532
601
  def execute_partition_update sql, params: nil, types: nil,
533
- query_options: nil
602
+ query_options: nil, call_options: nil
534
603
  ensure_service!
535
604
 
536
605
  params, types = Convert.to_input_params_and_types params, types
@@ -539,7 +608,7 @@ module Google
539
608
  results = session.execute_query \
540
609
  sql, params: params, types: types,
541
610
  transaction: pdml_transaction(session),
542
- query_options: query_options
611
+ query_options: query_options, call_options: call_options
543
612
  end
544
613
  # Stream all PartialResultSet to get ResultSetStats
545
614
  results.rows.to_a
@@ -620,6 +689,19 @@ module Google
620
689
  # Useful for reading the freshest data available at a nearby
621
690
  # replica, while bounding the possible staleness if the local
622
691
  # replica has fallen behind.
692
+ # @param [Hash] call_options A hash of values to specify the custom
693
+ # call options, e.g., timeout, retries, etc. Call options are
694
+ # optional. The following settings can be provided:
695
+ #
696
+ # * `:timeout` (Numeric) A numeric value of custom timeout in seconds
697
+ # that overrides the default setting.
698
+ # * `:retry_policy` (Hash) A hash of values that overrides the default
699
+ # setting of retry policy with the following keys:
700
+ # * `:initial_delay` (`Numeric`) - The initial delay in seconds.
701
+ # * `:max_delay` (`Numeric`) - The max delay in seconds.
702
+ # * `:multiplier` (`Numeric`) - The incremental backoff multiplier.
703
+ # * `:retry_codes` (`Array<String>`) - The error codes that should
704
+ # trigger a retry.
623
705
  #
624
706
  # @return [Google::Cloud::Spanner::Results] The results of the read.
625
707
  #
@@ -649,8 +731,30 @@ module Google
649
731
  # puts "User #{row[:id]} is #{row[:name]}"
650
732
  # end
651
733
  #
734
+ # @example Read using custom timeout and retry.
735
+ # require "google/cloud/spanner"
736
+ #
737
+ # spanner = Google::Cloud::Spanner.new
738
+ #
739
+ # db = spanner.client "my-instance", "my-database"
740
+ #
741
+ # timeout = 30.0
742
+ # retry_policy = {
743
+ # initial_delay: 0.25,
744
+ # max_delay: 32.0,
745
+ # multiplier: 1.3,
746
+ # retry_codes: ["UNAVAILABLE"]
747
+ # }
748
+ # call_options = { timeout: timeout, retry_policy: retry_policy }
749
+ #
750
+ # results = db.read "users", [:id, :name], call_options: call_options
751
+ #
752
+ # results.rows.each do |row|
753
+ # puts "User #{row[:id]} is #{row[:name]}"
754
+ # end
755
+ #
652
756
  def read table, columns, keys: nil, index: nil, limit: nil,
653
- single_use: nil
757
+ single_use: nil, call_options: nil
654
758
  validate_single_use_args! single_use
655
759
  ensure_service!
656
760
 
@@ -662,7 +766,8 @@ module Google
662
766
  @pool.with_session do |session|
663
767
  results = session.read \
664
768
  table, columns, keys: keys, index: index, limit: limit,
665
- transaction: single_use_tx
769
+ transaction: single_use_tx,
770
+ call_options: call_options
666
771
  end
667
772
  results
668
773
  end
@@ -705,7 +810,16 @@ module Google
705
810
  # See [Data
706
811
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
707
812
  #
708
- # @return [Time] The timestamp at which the operation committed.
813
+ # @param [Hash] commit_options A hash of commit options.
814
+ # e.g., return_commit_stats. Commit options are optional.
815
+ # The following options can be provided:
816
+ #
817
+ # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
818
+ # then statistics related to the transaction will be included in
819
+ # {CommitResponse}. Default value is `false`
820
+ #
821
+ # @return [Time, CommitResponse] The timestamp at which the operation
822
+ # committed. If commit options are set it returns {CommitResponse}.
709
823
  #
710
824
  # @example
711
825
  # require "google/cloud/spanner"
@@ -717,9 +831,24 @@ module Google
717
831
  # db.upsert "users", [{ id: 1, name: "Charlie", active: false },
718
832
  # { id: 2, name: "Harvey", active: true }]
719
833
  #
720
- def upsert table, *rows
834
+ # @example Get commit stats
835
+ # require "google/cloud/spanner"
836
+ #
837
+ # spanner = Google::Cloud::Spanner.new
838
+ #
839
+ # db = spanner.client "my-instance", "my-database"
840
+ #
841
+ # records = [{ id: 1, name: "Charlie", active: false },
842
+ # { id: 2, name: "Harvey", active: true }]
843
+ # commit_options = { return_commit_stats: true }
844
+ # commit_resp = db.upsert "users", records, commit_options: commit_options
845
+ #
846
+ # puts commit_resp.timestamp
847
+ # puts commit_resp.stats.mutation_count
848
+ #
849
+ def upsert table, rows, commit_options: nil
721
850
  @pool.with_session do |session|
722
- session.upsert table, rows
851
+ session.upsert table, rows, commit_options: commit_options
723
852
  end
724
853
  end
725
854
  alias save upsert
@@ -761,7 +890,16 @@ module Google
761
890
  # See [Data
762
891
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
763
892
  #
764
- # @return [Time] The timestamp at which the operation committed.
893
+ # @param [Hash] commit_options A hash of commit options.
894
+ # e.g., return_commit_stats. Commit options are optional.
895
+ # The following options can be provided:
896
+ #
897
+ # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
898
+ # then statistics related to the transaction will be included in
899
+ # {CommitResponse}. Default value is `false`
900
+ #
901
+ # @return [Time, CommitResponse] The timestamp at which the operation
902
+ # committed. If commit options are set it returns {CommitResponse}.
765
903
  #
766
904
  # @example
767
905
  # require "google/cloud/spanner"
@@ -773,9 +911,24 @@ module Google
773
911
  # db.insert "users", [{ id: 1, name: "Charlie", active: false },
774
912
  # { id: 2, name: "Harvey", active: true }]
775
913
  #
776
- def insert table, *rows
914
+ # @example Get commit stats
915
+ # require "google/cloud/spanner"
916
+ #
917
+ # spanner = Google::Cloud::Spanner.new
918
+ #
919
+ # db = spanner.client "my-instance", "my-database"
920
+ #
921
+ # records = [{ id: 1, name: "Charlie", active: false },
922
+ # { id: 2, name: "Harvey", active: true }]
923
+ # commit_options = { return_commit_stats: true }
924
+ # commit_resp = db.insert "users", records, commit_options: commit_options
925
+ #
926
+ # puts commit_resp.timestamp
927
+ # puts commit_resp.stats.mutation_count
928
+ #
929
+ def insert table, rows, commit_options: nil
777
930
  @pool.with_session do |session|
778
- session.insert table, rows
931
+ session.insert table, rows, commit_options: commit_options
779
932
  end
780
933
  end
781
934
 
@@ -816,7 +969,16 @@ module Google
816
969
  # See [Data
817
970
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
818
971
  #
819
- # @return [Time] The timestamp at which the operation committed.
972
+ # @param [Hash] commit_options A hash of commit options.
973
+ # e.g., return_commit_stats. Commit options are optional.
974
+ # The following options can be provided:
975
+ #
976
+ # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
977
+ # then statistics related to the transaction will be included in
978
+ # {CommitResponse}. Default value is `false`
979
+ #
980
+ # @return [Time, CommitResponse] The timestamp at which the operation
981
+ # committed. If commit options are set it returns {CommitResponse}.
820
982
  #
821
983
  # @example
822
984
  # require "google/cloud/spanner"
@@ -828,9 +990,24 @@ module Google
828
990
  # db.update "users", [{ id: 1, name: "Charlie", active: false },
829
991
  # { id: 2, name: "Harvey", active: true }]
830
992
  #
831
- def update table, *rows
993
+ # @example Get commit stats
994
+ # require "google/cloud/spanner"
995
+ #
996
+ # spanner = Google::Cloud::Spanner.new
997
+ #
998
+ # db = spanner.client "my-instance", "my-database"
999
+ #
1000
+ # records = [{ id: 1, name: "Charlie", active: false },
1001
+ # { id: 2, name: "Harvey", active: true }]
1002
+ # commit_options = { return_commit_stats: true }
1003
+ # commit_resp = db.update "users", records, commit_options: commit_options
1004
+ #
1005
+ # puts commit_resp.timestamp
1006
+ # puts commit_resp.stats.mutation_count
1007
+ #
1008
+ def update table, rows, commit_options: nil
832
1009
  @pool.with_session do |session|
833
- session.update table, rows
1010
+ session.update table, rows, commit_options: commit_options
834
1011
  end
835
1012
  end
836
1013
 
@@ -873,7 +1050,16 @@ module Google
873
1050
  # See [Data
874
1051
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
875
1052
  #
876
- # @return [Time] The timestamp at which the operation committed.
1053
+ # @param [Hash] commit_options A hash of commit options.
1054
+ # e.g., return_commit_stats. Commit options are optional.
1055
+ # The following options can be provided:
1056
+ #
1057
+ # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1058
+ # then statistics related to the transaction will be included in
1059
+ # {CommitResponse}. Default value is `false`
1060
+ #
1061
+ # @return [Time, CommitResponse] The timestamp at which the operation
1062
+ # committed. If commit options are set it returns {CommitResponse}.
877
1063
  #
878
1064
  # @example
879
1065
  # require "google/cloud/spanner"
@@ -885,9 +1071,24 @@ module Google
885
1071
  # db.replace "users", [{ id: 1, name: "Charlie", active: false },
886
1072
  # { id: 2, name: "Harvey", active: true }]
887
1073
  #
888
- def replace table, *rows
1074
+ # @example Get commit stats
1075
+ # require "google/cloud/spanner"
1076
+ #
1077
+ # spanner = Google::Cloud::Spanner.new
1078
+ #
1079
+ # db = spanner.client "my-instance", "my-database"
1080
+ #
1081
+ # records = [{ id: 1, name: "Charlie", active: false },
1082
+ # { id: 2, name: "Harvey", active: true }]
1083
+ # commit_options = { return_commit_stats: true }
1084
+ # commit_resp = db.replace "users", records, commit_options: commit_options
1085
+ #
1086
+ # puts commit_resp.timestamp
1087
+ # puts commit_resp.stats.mutation_count
1088
+ #
1089
+ def replace table, rows, commit_options: nil
889
1090
  @pool.with_session do |session|
890
- session.replace table, rows
1091
+ session.replace table, rows, commit_options: commit_options
891
1092
  end
892
1093
  end
893
1094
 
@@ -911,8 +1112,30 @@ module Google
911
1112
  # @param [Object, Array<Object>] keys A single, or list of keys or key
912
1113
  # ranges to match returned data to. Values should have exactly as many
913
1114
  # elements as there are columns in the primary key.
914
- #
915
- # @return [Time] The timestamp at which the operation committed.
1115
+ # @param [Hash] commit_options A hash of commit options.
1116
+ # e.g., return_commit_stats. Commit options are optional.
1117
+ # The following options can be provided:
1118
+ #
1119
+ # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1120
+ # then statistics related to the transaction will be included in
1121
+ # {CommitResponse}. Default value is `false`
1122
+ #
1123
+ # @param [Hash] call_options A hash of values to specify the custom
1124
+ # call options, e.g., timeout, retries, etc. Call options are
1125
+ # optional. The following settings can be provided:
1126
+ #
1127
+ # * `:timeout` (Numeric) A numeric value of custom timeout in seconds
1128
+ # that overrides the default setting.
1129
+ # * `:retry_policy` (Hash) A hash of values that overrides the default
1130
+ # setting of retry policy with the following keys:
1131
+ # * `:initial_delay` (`Numeric`) - The initial delay in seconds.
1132
+ # * `:max_delay` (`Numeric`) - The max delay in seconds.
1133
+ # * `:multiplier` (`Numeric`) - The incremental backoff multiplier.
1134
+ # * `:retry_codes` (`Array<String>`) - The error codes that should
1135
+ # trigger a retry.
1136
+ #
1137
+ # @return [Time, CommitResponse] The timestamp at which the operation
1138
+ # committed. If commit options are set it returns {CommitResponse}.
916
1139
  #
917
1140
  # @example
918
1141
  # require "google/cloud/spanner"
@@ -923,9 +1146,23 @@ module Google
923
1146
  #
924
1147
  # db.delete "users", [1, 2, 3]
925
1148
  #
926
- def delete table, keys = []
1149
+ # @example Get commit stats
1150
+ # require "google/cloud/spanner"
1151
+ #
1152
+ # spanner = Google::Cloud::Spanner.new
1153
+ #
1154
+ # db = spanner.client "my-instance", "my-database"
1155
+ #
1156
+ # commit_options = { return_commit_stats: true }
1157
+ # commit_resp = db.delete "users", [1, 2, 3], commit_options: commit_options
1158
+ #
1159
+ # puts commit_resp.timestamp
1160
+ # puts commit_resp.stats.mutation_count
1161
+ #
1162
+ def delete table, keys = [], commit_options: nil, call_options: nil
927
1163
  @pool.with_session do |session|
928
- session.delete table, keys
1164
+ session.delete table, keys, commit_options: commit_options,
1165
+ call_options: call_options
929
1166
  end
930
1167
  end
931
1168
 
@@ -944,10 +1181,33 @@ module Google
944
1181
  # this method may be appropriate for latency sensitive and/or high
945
1182
  # throughput blind changes.
946
1183
  #
1184
+ # @param [Hash] commit_options A hash of commit options.
1185
+ # e.g., return_commit_stats. Commit options are optional.
1186
+ # The following options can be provided:
1187
+ #
1188
+ # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1189
+ # then statistics related to the transaction will be included in
1190
+ # {CommitResponse}. Default value is `false`
1191
+ #
1192
+ # @param [Hash] call_options A hash of values to specify the custom
1193
+ # call options, e.g., timeout, retries, etc. Call options are
1194
+ # optional. The following settings can be provided:
1195
+ #
1196
+ # * `:timeout` (Numeric) A numeric value of custom timeout in seconds
1197
+ # that overrides the default setting.
1198
+ # * `:retry_policy` (Hash) A hash of values that overrides the default
1199
+ # setting of retry policy with the following keys:
1200
+ # * `:initial_delay` (`Numeric`) - The initial delay in seconds.
1201
+ # * `:max_delay` (`Numeric`) - The max delay in seconds.
1202
+ # * `:multiplier` (`Numeric`) - The incremental backoff multiplier.
1203
+ # * `:retry_codes` (`Array<String>`) - The error codes that should
1204
+ # trigger a retry.
1205
+ #
947
1206
  # @yield [commit] The block for mutating the data.
948
1207
  # @yieldparam [Google::Cloud::Spanner::Commit] commit The Commit object.
949
1208
  #
950
- # @return [Time] The timestamp at which the operation committed.
1209
+ # @return [Time, CommitResponse] The timestamp at which the operation
1210
+ # committed. If commit options are set it returns {CommitResponse}.
951
1211
  #
952
1212
  # @example
953
1213
  # require "google/cloud/spanner"
@@ -961,15 +1221,34 @@ module Google
961
1221
  # c.insert "users", [{ id: 2, name: "Harvey", active: true }]
962
1222
  # end
963
1223
  #
964
- def commit &block
1224
+ # @example Get commit stats
1225
+ # require "google/cloud/spanner"
1226
+ #
1227
+ # spanner = Google::Cloud::Spanner.new
1228
+ #
1229
+ # db = spanner.client "my-instance", "my-database"
1230
+ #
1231
+ # commit_options = { return_commit_stats: true }
1232
+ # commit_resp = db.commit commit_options: commit_options do |c|
1233
+ # c.update "users", [{ id: 1, name: "Charlie", active: false }]
1234
+ # c.insert "users", [{ id: 2, name: "Harvey", active: true }]
1235
+ # end
1236
+ #
1237
+ # puts commit_resp.timestamp
1238
+ # puts commit_resp.stats.mutation_count
1239
+ #
1240
+ def commit commit_options: nil, call_options: nil, &block
965
1241
  raise ArgumentError, "Must provide a block" unless block_given?
966
1242
 
967
1243
  @pool.with_session do |session|
968
- session.commit(&block)
1244
+ session.commit(
1245
+ commit_options: commit_options, call_options: call_options, &block
1246
+ )
969
1247
  end
970
1248
  end
971
1249
 
972
1250
  # rubocop:disable Metrics/AbcSize
1251
+ # rubocop:disable Metrics/BlockLength
973
1252
  # rubocop:disable Metrics/MethodLength
974
1253
 
975
1254
  ##
@@ -988,12 +1267,34 @@ module Google
988
1267
  #
989
1268
  # @param [Numeric] deadline The total amount of time in seconds the
990
1269
  # transaction has to succeed. The default is `120`.
1270
+ # @param [Hash] commit_options A hash of commit options.
1271
+ # e.g., return_commit_stats. Commit options are optional.
1272
+ # The following options can be provided:
1273
+ #
1274
+ # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1275
+ # then statistics related to the transaction will be included in
1276
+ # {CommitResponse}. Default value is `false`
1277
+ #
1278
+ # @param [Hash] call_options A hash of values to specify the custom
1279
+ # call options, e.g., timeout, retries, etc. Call options are
1280
+ # optional. The following settings can be provided:
1281
+ #
1282
+ # * `:timeout` (Numeric) A numeric value of custom timeout in seconds
1283
+ # that overrides the default setting.
1284
+ # * `:retry_policy` (Hash) A hash of values that overrides the default
1285
+ # setting of retry policy with the following keys:
1286
+ # * `:initial_delay` (`Numeric`) - The initial delay in seconds.
1287
+ # * `:max_delay` (`Numeric`) - The max delay in seconds.
1288
+ # * `:multiplier` (`Numeric`) - The incremental backoff multiplier.
1289
+ # * `:retry_codes` (`Array<String>`) - The error codes that should
1290
+ # trigger a retry.
991
1291
  #
992
1292
  # @yield [transaction] The block for reading and writing data.
993
1293
  # @yieldparam [Google::Cloud::Spanner::Transaction] transaction The
994
1294
  # Transaction object.
995
1295
  #
996
- # @return [Time] The timestamp at which the transaction committed.
1296
+ # @return [Time, CommitResponse] The timestamp at which the operation
1297
+ # committed. If commit options are set it returns {CommitResponse}.
997
1298
  #
998
1299
  # @example
999
1300
  # require "google/cloud/spanner"
@@ -1029,7 +1330,28 @@ module Google
1029
1330
  # end
1030
1331
  # end
1031
1332
  #
1032
- def transaction deadline: 120
1333
+ # @example Get commit stats
1334
+ # require "google/cloud/spanner"
1335
+ #
1336
+ # spanner = Google::Cloud::Spanner.new
1337
+ # db = spanner.client "my-instance", "my-database"
1338
+ #
1339
+ # commit_options = { return_commit_stats: true }
1340
+ # commit_resp = db.transaction commit_options: commit_options do |tx|
1341
+ # results = tx.execute_query "SELECT * FROM users"
1342
+ #
1343
+ # results.rows.each do |row|
1344
+ # puts "User #{row[:id]} is #{row[:name]}"
1345
+ # end
1346
+ #
1347
+ # tx.update "users", [{ id: 1, name: "Charlie", active: false }]
1348
+ # tx.insert "users", [{ id: 2, name: "Harvey", active: true }]
1349
+ # end
1350
+ #
1351
+ # puts commit_resp.timestamp
1352
+ # puts commit_resp.stats.mutation_count
1353
+ #
1354
+ def transaction deadline: 120, commit_options: nil, call_options: nil
1033
1355
  ensure_service!
1034
1356
  unless Thread.current[:transaction_id].nil?
1035
1357
  raise "Nested transactions are not allowed"
@@ -1044,8 +1366,12 @@ module Google
1044
1366
  Thread.current[:transaction_id] = tx.transaction_id
1045
1367
  yield tx
1046
1368
  commit_resp = @project.service.commit \
1047
- tx.session.path, tx.mutations, transaction_id: tx.transaction_id
1048
- return Convert.timestamp_to_time commit_resp.commit_timestamp
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
1049
1375
  rescue GRPC::Aborted, Google::Cloud::AbortedError => err
1050
1376
  # Re-raise if deadline has passed
1051
1377
  if current_time - start_time > deadline
@@ -1073,6 +1399,7 @@ module Google
1073
1399
  end
1074
1400
 
1075
1401
  # rubocop:enable Metrics/AbcSize
1402
+ # rubocop:enable Metrics/BlockLength
1076
1403
  # rubocop:enable Metrics/MethodLength
1077
1404
 
1078
1405
  ##
@@ -1109,6 +1436,19 @@ module Google
1109
1436
  # timestamp negotiation overhead of single-use `staleness`. (See
1110
1437
  # [TransactionOptions](https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.v1#transactionoptions).)
1111
1438
  # @param [Numeric] exact_staleness Same as `staleness`.
1439
+ # @param [Hash] call_options A hash of values to specify the custom
1440
+ # call options, e.g., timeout, retries, etc. Call options are
1441
+ # optional. The following settings can be provided:
1442
+ #
1443
+ # * `:timeout` (Numeric) A numeric value of custom timeout in seconds
1444
+ # that overrides the default setting.
1445
+ # * `:retry_policy` (Hash) A hash of values that overrides the default
1446
+ # setting of retry policy with the following keys:
1447
+ # * `:initial_delay` (`Numeric`) - The initial delay in seconds.
1448
+ # * `:max_delay` (`Numeric`) - The max delay in seconds.
1449
+ # * `:multiplier` (`Numeric`) - The incremental backoff multiplier.
1450
+ # * `:retry_codes` (`Array<String>`) - The error codes that should
1451
+ # trigger a retry.
1112
1452
  #
1113
1453
  # @yield [snapshot] The block for reading and writing data.
1114
1454
  # @yieldparam [Google::Cloud::Spanner::Snapshot] snapshot The Snapshot
@@ -1129,7 +1469,7 @@ module Google
1129
1469
  # end
1130
1470
  #
1131
1471
  def snapshot strong: nil, timestamp: nil, read_timestamp: nil,
1132
- staleness: nil, exact_staleness: nil
1472
+ staleness: nil, exact_staleness: nil, call_options: nil
1133
1473
  validate_snapshot_args! strong: strong, timestamp: timestamp,
1134
1474
  read_timestamp: read_timestamp,
1135
1475
  staleness: staleness,
@@ -1145,7 +1485,8 @@ module Google
1145
1485
  snp_grpc = @project.service.create_snapshot \
1146
1486
  session.path, strong: strong,
1147
1487
  timestamp: (timestamp || read_timestamp),
1148
- staleness: (staleness || exact_staleness)
1488
+ staleness: (staleness || exact_staleness),
1489
+ call_options: call_options
1149
1490
  Thread.current[:transaction_id] = snp_grpc.id
1150
1491
  snp = Snapshot.from_grpc snp_grpc, session
1151
1492
  yield snp if block_given?
@@ -1336,8 +1677,8 @@ module Google
1336
1677
  def create_new_session
1337
1678
  ensure_service!
1338
1679
  grpc = @project.service.create_session \
1339
- Admin::Database::V1::DatabaseAdminClient.database_path(
1340
- project_id, instance_id, database_id
1680
+ Admin::Database::V1::DatabaseAdmin::Paths.database_path(
1681
+ project: project_id, instance: instance_id, database: database_id
1341
1682
  ),
1342
1683
  labels: @session_labels
1343
1684
  Session.from_grpc grpc, @project.service, query_options: @query_options
@@ -1364,8 +1705,8 @@ module Google
1364
1705
  def batch_create_sessions session_count
1365
1706
  ensure_service!
1366
1707
  resp = @project.service.batch_create_sessions \
1367
- Admin::Database::V1::DatabaseAdminClient.database_path(
1368
- project_id, instance_id, database_id
1708
+ Admin::Database::V1::DatabaseAdmin::Paths.database_path(
1709
+ project: project_id, instance: instance_id, database: database_id
1369
1710
  ),
1370
1711
  session_count,
1371
1712
  labels: @session_labels
@@ -1421,9 +1762,9 @@ module Google
1421
1762
  bounded_staleness = Convert.number_to_duration \
1422
1763
  opts[:bounded_staleness] || opts[:max_staleness]
1423
1764
 
1424
- Google::Spanner::V1::TransactionSelector.new(single_use:
1425
- Google::Spanner::V1::TransactionOptions.new(read_only:
1426
- Google::Spanner::V1::TransactionOptions::ReadOnly.new({
1765
+ V1::TransactionSelector.new(single_use:
1766
+ V1::TransactionOptions.new(read_only:
1767
+ V1::TransactionOptions::ReadOnly.new({
1427
1768
  strong: opts[:strong],
1428
1769
  read_timestamp: exact_timestamp,
1429
1770
  exact_staleness: exact_staleness,
@@ -1435,7 +1776,7 @@ module Google
1435
1776
 
1436
1777
  def pdml_transaction session
1437
1778
  pdml_tx_grpc = @project.service.create_pdml session.path
1438
- Google::Spanner::V1::TransactionSelector.new id: pdml_tx_grpc.id
1779
+ V1::TransactionSelector.new id: pdml_tx_grpc.id
1439
1780
  end
1440
1781
 
1441
1782
  ##