google-cloud-spanner 0.21.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 (68) hide show
  1. checksums.yaml +7 -0
  2. data/lib/google-cloud-spanner.rb +106 -0
  3. data/lib/google/cloud/spanner.rb +382 -0
  4. data/lib/google/cloud/spanner/admin/database/v1.rb +17 -0
  5. data/lib/google/cloud/spanner/admin/database/v1/database_admin_client.rb +703 -0
  6. data/lib/google/cloud/spanner/admin/database/v1/database_admin_client_config.json +73 -0
  7. data/lib/google/cloud/spanner/admin/database/v1/doc/google/iam/v1/policy.rb +139 -0
  8. data/lib/google/cloud/spanner/admin/database/v1/doc/google/protobuf/any.rb +114 -0
  9. data/lib/google/cloud/spanner/admin/database/v1/doc/google/rpc/status.rb +83 -0
  10. data/lib/google/cloud/spanner/admin/database/v1/doc/google/spanner/admin/database/v1/spanner_database_admin.rb +188 -0
  11. data/lib/google/cloud/spanner/admin/instance/v1.rb +17 -0
  12. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/iam/v1/policy.rb +139 -0
  13. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/protobuf/any.rb +114 -0
  14. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/protobuf/field_mask.rb +223 -0
  15. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/rpc/status.rb +83 -0
  16. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/spanner/admin/instance/v1/spanner_instance_admin.rb +268 -0
  17. data/lib/google/cloud/spanner/admin/instance/v1/instance_admin_client.rb +868 -0
  18. data/lib/google/cloud/spanner/admin/instance/v1/instance_admin_client_config.json +78 -0
  19. data/lib/google/cloud/spanner/client.rb +1034 -0
  20. data/lib/google/cloud/spanner/commit.rb +351 -0
  21. data/lib/google/cloud/spanner/convert.rb +311 -0
  22. data/lib/google/cloud/spanner/credentials.rb +32 -0
  23. data/lib/google/cloud/spanner/data.rb +199 -0
  24. data/lib/google/cloud/spanner/database.rb +377 -0
  25. data/lib/google/cloud/spanner/database/job.rb +179 -0
  26. data/lib/google/cloud/spanner/database/list.rb +171 -0
  27. data/lib/google/cloud/spanner/errors.rb +73 -0
  28. data/lib/google/cloud/spanner/fields.rb +252 -0
  29. data/lib/google/cloud/spanner/instance.rb +472 -0
  30. data/lib/google/cloud/spanner/instance/config.rb +99 -0
  31. data/lib/google/cloud/spanner/instance/config/list.rb +171 -0
  32. data/lib/google/cloud/spanner/instance/job.rb +197 -0
  33. data/lib/google/cloud/spanner/instance/list.rb +167 -0
  34. data/lib/google/cloud/spanner/policy.rb +201 -0
  35. data/lib/google/cloud/spanner/pool.rb +279 -0
  36. data/lib/google/cloud/spanner/project.rb +480 -0
  37. data/lib/google/cloud/spanner/range.rb +99 -0
  38. data/lib/google/cloud/spanner/results.rb +280 -0
  39. data/lib/google/cloud/spanner/service.rb +458 -0
  40. data/lib/google/cloud/spanner/session.rb +565 -0
  41. data/lib/google/cloud/spanner/snapshot.rb +260 -0
  42. data/lib/google/cloud/spanner/transaction.rb +533 -0
  43. data/lib/google/cloud/spanner/v1.rb +17 -0
  44. data/lib/google/cloud/spanner/v1/doc/google/protobuf/duration.rb +77 -0
  45. data/lib/google/cloud/spanner/v1/doc/google/protobuf/struct.rb +73 -0
  46. data/lib/google/cloud/spanner/v1/doc/google/protobuf/timestamp.rb +81 -0
  47. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/keys.rb +148 -0
  48. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/mutation.rb +80 -0
  49. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/query_plan.rb +120 -0
  50. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/result_set.rb +175 -0
  51. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/spanner.rb +206 -0
  52. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/transaction.rb +351 -0
  53. data/lib/google/cloud/spanner/v1/spanner_client.rb +850 -0
  54. data/lib/google/cloud/spanner/v1/spanner_client_config.json +78 -0
  55. data/lib/google/cloud/spanner/version.rb +22 -0
  56. data/lib/google/spanner/admin/database/v1/spanner_database_admin_pb.rb +85 -0
  57. data/lib/google/spanner/admin/database/v1/spanner_database_admin_services_pb.rb +95 -0
  58. data/lib/google/spanner/admin/instance/v1/spanner_instance_admin_pb.rb +106 -0
  59. data/lib/google/spanner/admin/instance/v1/spanner_instance_admin_services_pb.rb +180 -0
  60. data/lib/google/spanner/v1/keys_pb.rb +33 -0
  61. data/lib/google/spanner/v1/mutation_pb.rb +38 -0
  62. data/lib/google/spanner/v1/query_plan_pb.rb +47 -0
  63. data/lib/google/spanner/v1/result_set_pb.rb +43 -0
  64. data/lib/google/spanner/v1/spanner_pb.rb +90 -0
  65. data/lib/google/spanner/v1/spanner_services_pb.rb +131 -0
  66. data/lib/google/spanner/v1/transaction_pb.rb +51 -0
  67. data/lib/google/spanner/v1/type_pb.rb +43 -0
  68. metadata +309 -0
@@ -0,0 +1,351 @@
1
+ # Copyright 2017, Google Inc. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Google
16
+ module Spanner
17
+ module V1
18
+ # = Transactions
19
+ #
20
+ # Each session can have at most one active transaction at a time. After the
21
+ # active transaction is completed, the session can immediately be
22
+ # re-used for the next transaction. It is not necessary to create a
23
+ # new session for each transaction.
24
+ #
25
+ # = Transaction Modes
26
+ #
27
+ # Cloud Spanner supports two transaction modes:
28
+ #
29
+ # 1. Locking read-write. This type of transaction is the only way
30
+ # to write data into Cloud Spanner. These transactions rely on
31
+ # pessimistic locking and, if necessary, two-phase commit.
32
+ # Locking read-write transactions may abort, requiring the
33
+ # application to retry.
34
+ #
35
+ # 2. Snapshot read-only. This transaction type provides guaranteed
36
+ # consistency across several reads, but does not allow
37
+ # writes. Snapshot read-only transactions can be configured to
38
+ # read at timestamps in the past. Snapshot read-only
39
+ # transactions do not need to be committed.
40
+ #
41
+ # For transactions that only read, snapshot read-only transactions
42
+ # provide simpler semantics and are almost always faster. In
43
+ # particular, read-only transactions do not take locks, so they do
44
+ # not conflict with read-write transactions. As a consequence of not
45
+ # taking locks, they also do not abort, so retry loops are not needed.
46
+ #
47
+ # Transactions may only read/write data in a single database. They
48
+ # may, however, read/write data in different tables within that
49
+ # database.
50
+ #
51
+ # == Locking Read-Write Transactions
52
+ #
53
+ # Locking transactions may be used to atomically read-modify-write
54
+ # data anywhere in a database. This type of transaction is externally
55
+ # consistent.
56
+ #
57
+ # Clients should attempt to minimize the amount of time a transaction
58
+ # is active. Faster transactions commit with higher probability
59
+ # and cause less contention. Cloud Spanner attempts to keep read locks
60
+ # active as long as the transaction continues to do reads, and the
61
+ # transaction has not been terminated by
62
+ # Commit or
63
+ # Rollback. Long periods of
64
+ # inactivity at the client may cause Cloud Spanner to release a
65
+ # transaction's locks and abort it.
66
+ #
67
+ # Reads performed within a transaction acquire locks on the data
68
+ # being read. Writes can only be done at commit time, after all reads
69
+ # have been completed.
70
+ # Conceptually, a read-write transaction consists of zero or more
71
+ # reads or SQL queries followed by
72
+ # Commit. At any time before
73
+ # Commit, the client can send a
74
+ # Rollback request to abort the
75
+ # transaction.
76
+ #
77
+ # === Semantics
78
+ #
79
+ # Cloud Spanner can commit the transaction if all read locks it acquired
80
+ # are still valid at commit time, and it is able to acquire write
81
+ # locks for all writes. Cloud Spanner can abort the transaction for any
82
+ # reason. If a commit attempt returns +ABORTED+, Cloud Spanner guarantees
83
+ # that the transaction has not modified any user data in Cloud Spanner.
84
+ #
85
+ # Unless the transaction commits, Cloud Spanner makes no guarantees about
86
+ # how long the transaction's locks were held for. It is an error to
87
+ # use Cloud Spanner locks for any sort of mutual exclusion other than
88
+ # between Cloud Spanner transactions themselves.
89
+ #
90
+ # === Retrying Aborted Transactions
91
+ #
92
+ # When a transaction aborts, the application can choose to retry the
93
+ # whole transaction again. To maximize the chances of successfully
94
+ # committing the retry, the client should execute the retry in the
95
+ # same session as the original attempt. The original session's lock
96
+ # priority increases with each consecutive abort, meaning that each
97
+ # attempt has a slightly better chance of success than the previous.
98
+ #
99
+ # Under some circumstances (e.g., many transactions attempting to
100
+ # modify the same row(s)), a transaction can abort many times in a
101
+ # short period before successfully committing. Thus, it is not a good
102
+ # idea to cap the number of retries a transaction can attempt;
103
+ # instead, it is better to limit the total amount of wall time spent
104
+ # retrying.
105
+ #
106
+ # === Idle Transactions
107
+ #
108
+ # A transaction is considered idle if it has no outstanding reads or
109
+ # SQL queries and has not started a read or SQL query within the last 10
110
+ # seconds. Idle transactions can be aborted by Cloud Spanner so that they
111
+ # don't hold on to locks indefinitely. In that case, the commit will
112
+ # fail with error +ABORTED+.
113
+ #
114
+ # If this behavior is undesirable, periodically executing a simple
115
+ # SQL query in the transaction (e.g., +SELECT 1+) prevents the
116
+ # transaction from becoming idle.
117
+ #
118
+ # == Snapshot Read-Only Transactions
119
+ #
120
+ # Snapshot read-only transactions provides a simpler method than
121
+ # locking read-write transactions for doing several consistent
122
+ # reads. However, this type of transaction does not support writes.
123
+ #
124
+ # Snapshot transactions do not take locks. Instead, they work by
125
+ # choosing a Cloud Spanner timestamp, then executing all reads at that
126
+ # timestamp. Since they do not acquire locks, they do not block
127
+ # concurrent read-write transactions.
128
+ #
129
+ # Unlike locking read-write transactions, snapshot read-only
130
+ # transactions never abort. They can fail if the chosen read
131
+ # timestamp is garbage collected; however, the default garbage
132
+ # collection policy is generous enough that most applications do not
133
+ # need to worry about this in practice.
134
+ #
135
+ # Snapshot read-only transactions do not need to call
136
+ # Commit or
137
+ # Rollback (and in fact are not
138
+ # permitted to do so).
139
+ #
140
+ # To execute a snapshot transaction, the client specifies a timestamp
141
+ # bound, which tells Cloud Spanner how to choose a read timestamp.
142
+ #
143
+ # The types of timestamp bound are:
144
+ #
145
+ # - Strong (the default).
146
+ # - Bounded staleness.
147
+ # - Exact staleness.
148
+ #
149
+ # If the Cloud Spanner database to be read is geographically distributed,
150
+ # stale read-only transactions can execute more quickly than strong
151
+ # or read-write transaction, because they are able to execute far
152
+ # from the leader replica.
153
+ #
154
+ # Each type of timestamp bound is discussed in detail below.
155
+ #
156
+ # === Strong
157
+ #
158
+ # Strong reads are guaranteed to see the effects of all transactions
159
+ # that have committed before the start of the read. Furthermore, all
160
+ # rows yielded by a single read are consistent with each other -- if
161
+ # any part of the read observes a transaction, all parts of the read
162
+ # see the transaction.
163
+ #
164
+ # Strong reads are not repeatable: two consecutive strong read-only
165
+ # transactions might return inconsistent results if there are
166
+ # concurrent writes. If consistency across reads is required, the
167
+ # reads should be executed within a transaction or at an exact read
168
+ # timestamp.
169
+ #
170
+ # See TransactionOptions::ReadOnly#strong.
171
+ #
172
+ # === Exact Staleness
173
+ #
174
+ # These timestamp bounds execute reads at a user-specified
175
+ # timestamp. Reads at a timestamp are guaranteed to see a consistent
176
+ # prefix of the global transaction history: they observe
177
+ # modifications done by all transactions with a commit timestamp <=
178
+ # the read timestamp, and observe none of the modifications done by
179
+ # transactions with a larger commit timestamp. They will block until
180
+ # all conflicting transactions that may be assigned commit timestamps
181
+ # <= the read timestamp have finished.
182
+ #
183
+ # The timestamp can either be expressed as an absolute Cloud Spanner commit
184
+ # timestamp or a staleness relative to the current time.
185
+ #
186
+ # These modes do not require a "negotiation phase" to pick a
187
+ # timestamp. As a result, they execute slightly faster than the
188
+ # equivalent boundedly stale concurrency modes. On the other hand,
189
+ # boundedly stale reads usually return fresher results.
190
+ #
191
+ # See TransactionOptions::ReadOnly#read_timestamp and
192
+ # TransactionOptions::ReadOnly#exact_staleness.
193
+ #
194
+ # === Bounded Staleness
195
+ #
196
+ # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
197
+ # subject to a user-provided staleness bound. Cloud Spanner chooses the
198
+ # newest timestamp within the staleness bound that allows execution
199
+ # of the reads at the closest available replica without blocking.
200
+ #
201
+ # All rows yielded are consistent with each other -- if any part of
202
+ # the read observes a transaction, all parts of the read see the
203
+ # transaction. Boundedly stale reads are not repeatable: two stale
204
+ # reads, even if they use the same staleness bound, can execute at
205
+ # different timestamps and thus return inconsistent results.
206
+ #
207
+ # Boundedly stale reads execute in two phases: the first phase
208
+ # negotiates a timestamp among all replicas needed to serve the
209
+ # read. In the second phase, reads are executed at the negotiated
210
+ # timestamp.
211
+ #
212
+ # As a result of the two phase execution, bounded staleness reads are
213
+ # usually a little slower than comparable exact staleness
214
+ # reads. However, they are typically able to return fresher
215
+ # results, and are more likely to execute at the closest replica.
216
+ #
217
+ # Because the timestamp negotiation requires up-front knowledge of
218
+ # which rows will be read, it can only be used with single-use
219
+ # read-only transactions.
220
+ #
221
+ # See TransactionOptions::ReadOnly#max_staleness and
222
+ # TransactionOptions::ReadOnly#min_read_timestamp.
223
+ #
224
+ # === Old Read Timestamps and Garbage Collection
225
+ #
226
+ # Cloud Spanner continuously garbage collects deleted and overwritten data
227
+ # in the background to reclaim storage space. This process is known
228
+ # as "version GC". By default, version GC reclaims versions after they
229
+ # are one hour old. Because of this, Cloud Spanner cannot perform reads
230
+ # at read timestamps more than one hour in the past. This
231
+ # restriction also applies to in-progress reads and/or SQL queries whose
232
+ # timestamp become too old while executing. Reads and SQL queries with
233
+ # too-old read timestamps fail with the error +FAILED_PRECONDITION+.
234
+ # @!attribute [rw] read_write
235
+ # @return [Google::Spanner::V1::TransactionOptions::ReadWrite]
236
+ # Transaction may write.
237
+ #
238
+ # Authorization to begin a read-write transaction requires
239
+ # +spanner.databases.beginOrRollbackReadWriteTransaction+ permission
240
+ # on the +session+ resource.
241
+ # @!attribute [rw] read_only
242
+ # @return [Google::Spanner::V1::TransactionOptions::ReadOnly]
243
+ # Transaction will not write.
244
+ #
245
+ # Authorization to begin a read-only transaction requires
246
+ # +spanner.databases.beginReadOnlyTransaction+ permission
247
+ # on the +session+ resource.
248
+ class TransactionOptions
249
+ # Options for read-write transactions.
250
+ class ReadWrite; end
251
+
252
+ # Options for read-only transactions.
253
+ # @!attribute [rw] strong
254
+ # @return [true, false]
255
+ # Read at a timestamp where all previously committed transactions
256
+ # are visible.
257
+ # @!attribute [rw] min_read_timestamp
258
+ # @return [Google::Protobuf::Timestamp]
259
+ # Executes all reads at a timestamp >= +min_read_timestamp+.
260
+ #
261
+ # This is useful for requesting fresher data than some previous
262
+ # read, or data that is fresh enough to observe the effects of some
263
+ # previously committed transaction whose timestamp is known.
264
+ #
265
+ # Note that this option can only be used in single-use transactions.
266
+ # @!attribute [rw] max_staleness
267
+ # @return [Google::Protobuf::Duration]
268
+ # Read data at a timestamp >= +NOW - max_staleness+
269
+ # seconds. Guarantees that all writes that have committed more
270
+ # than the specified number of seconds ago are visible. Because
271
+ # Cloud Spanner chooses the exact timestamp, this mode works even if
272
+ # the client's local clock is substantially skewed from Cloud Spanner
273
+ # commit timestamps.
274
+ #
275
+ # Useful for reading the freshest data available at a nearby
276
+ # replica, while bounding the possible staleness if the local
277
+ # replica has fallen behind.
278
+ #
279
+ # Note that this option can only be used in single-use
280
+ # transactions.
281
+ # @!attribute [rw] read_timestamp
282
+ # @return [Google::Protobuf::Timestamp]
283
+ # Executes all reads at the given timestamp. Unlike other modes,
284
+ # reads at a specific timestamp are repeatable; the same read at
285
+ # the same timestamp always returns the same data. If the
286
+ # timestamp is in the future, the read will block until the
287
+ # specified timestamp, modulo the read's deadline.
288
+ #
289
+ # Useful for large scale consistent reads such as mapreduces, or
290
+ # for coordinating many reads against a consistent snapshot of the
291
+ # data.
292
+ # @!attribute [rw] exact_staleness
293
+ # @return [Google::Protobuf::Duration]
294
+ # Executes all reads at a timestamp that is +exact_staleness+
295
+ # old. The timestamp is chosen soon after the read is started.
296
+ #
297
+ # Guarantees that all writes that have committed more than the
298
+ # specified number of seconds ago are visible. Because Cloud Spanner
299
+ # chooses the exact timestamp, this mode works even if the client's
300
+ # local clock is substantially skewed from Cloud Spanner commit
301
+ # timestamps.
302
+ #
303
+ # Useful for reading at nearby replicas without the distributed
304
+ # timestamp negotiation overhead of +max_staleness+.
305
+ # @!attribute [rw] return_read_timestamp
306
+ # @return [true, false]
307
+ # If true, the Cloud Spanner-selected read timestamp is included in
308
+ # the Transaction message that describes the transaction.
309
+ class ReadOnly; end
310
+ end
311
+
312
+ # A transaction.
313
+ # @!attribute [rw] id
314
+ # @return [String]
315
+ # +id+ may be used to identify the transaction in subsequent
316
+ # Read,
317
+ # ExecuteSql,
318
+ # Commit, or
319
+ # Rollback calls.
320
+ #
321
+ # Single-use read-only transactions do not have IDs, because
322
+ # single-use transactions do not support multiple requests.
323
+ # @!attribute [rw] read_timestamp
324
+ # @return [Google::Protobuf::Timestamp]
325
+ # For snapshot read-only transactions, the read timestamp chosen
326
+ # for the transaction. Not returned by default: see
327
+ # TransactionOptions::ReadOnly#return_read_timestamp.
328
+ class Transaction; end
329
+
330
+ # This message is used to select the transaction in which a
331
+ # Read or
332
+ # ExecuteSql call runs.
333
+ #
334
+ # See TransactionOptions for more information about transactions.
335
+ # @!attribute [rw] single_use
336
+ # @return [Google::Spanner::V1::TransactionOptions]
337
+ # Execute the read or SQL query in a temporary transaction.
338
+ # This is the most efficient way to execute a transaction that
339
+ # consists of a single SQL query.
340
+ # @!attribute [rw] id
341
+ # @return [String]
342
+ # Execute the read or SQL query in a previously-started transaction.
343
+ # @!attribute [rw] begin
344
+ # @return [Google::Spanner::V1::TransactionOptions]
345
+ # Begin a new transaction and execute this read or SQL query in
346
+ # it. The transaction ID of the new transaction is returned in
347
+ # ResultSetMetadata#transaction, which is a Transaction.
348
+ class TransactionSelector; end
349
+ end
350
+ end
351
+ end
@@ -0,0 +1,850 @@
1
+ # Copyright 2017, Google Inc. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+ # EDITING INSTRUCTIONS
16
+ # This file was generated from the file
17
+ # https://github.com/googleapis/googleapis/blob/master/google/spanner/v1/spanner.proto,
18
+ # and updates to that file get reflected here through a refresh process.
19
+ # For the short term, the refresh process will only be runnable by Google
20
+ # engineers.
21
+ #
22
+ # The only allowed edits are to method and file documentation. A 3-way
23
+ # merge preserves those additions if the generated source changes.
24
+
25
+ require "json"
26
+ require "pathname"
27
+
28
+ require "google/gax"
29
+
30
+ require "google/spanner/v1/spanner_pb"
31
+
32
+ module Google
33
+ module Cloud
34
+ module Spanner
35
+ module V1
36
+ # Cloud Spanner API
37
+ #
38
+ # The Cloud Spanner API can be used to manage sessions and execute
39
+ # transactions on data stored in Cloud Spanner databases.
40
+ #
41
+ # @!attribute [r] spanner_stub
42
+ # @return [Google::Spanner::V1::Spanner::Stub]
43
+ class SpannerClient
44
+ attr_reader :spanner_stub
45
+
46
+ # The default address of the service.
47
+ SERVICE_ADDRESS = "spanner.googleapis.com".freeze
48
+
49
+ # The default port of the service.
50
+ DEFAULT_SERVICE_PORT = 443
51
+
52
+ DEFAULT_TIMEOUT = 30
53
+
54
+ # The scopes needed to make gRPC calls to all of the methods defined in
55
+ # this service.
56
+ ALL_SCOPES = [
57
+ "https://www.googleapis.com/auth/cloud-platform",
58
+ "https://www.googleapis.com/auth/spanner.data"
59
+ ].freeze
60
+
61
+ DATABASE_PATH_TEMPLATE = Google::Gax::PathTemplate.new(
62
+ "projects/{project}/instances/{instance}/databases/{database}"
63
+ )
64
+
65
+ private_constant :DATABASE_PATH_TEMPLATE
66
+
67
+ SESSION_PATH_TEMPLATE = Google::Gax::PathTemplate.new(
68
+ "projects/{project}/instances/{instance}/databases/{database}/sessions/{session}"
69
+ )
70
+
71
+ private_constant :SESSION_PATH_TEMPLATE
72
+
73
+ # Returns a fully-qualified database resource name string.
74
+ # @param project [String]
75
+ # @param instance [String]
76
+ # @param database [String]
77
+ # @return [String]
78
+ def self.database_path project, instance, database
79
+ DATABASE_PATH_TEMPLATE.render(
80
+ :"project" => project,
81
+ :"instance" => instance,
82
+ :"database" => database
83
+ )
84
+ end
85
+
86
+ # Returns a fully-qualified session resource name string.
87
+ # @param project [String]
88
+ # @param instance [String]
89
+ # @param database [String]
90
+ # @param session [String]
91
+ # @return [String]
92
+ def self.session_path project, instance, database, session
93
+ SESSION_PATH_TEMPLATE.render(
94
+ :"project" => project,
95
+ :"instance" => instance,
96
+ :"database" => database,
97
+ :"session" => session
98
+ )
99
+ end
100
+
101
+ # Parses the project from a database resource.
102
+ # @param database_name [String]
103
+ # @return [String]
104
+ def self.match_project_from_database_name database_name
105
+ DATABASE_PATH_TEMPLATE.match(database_name)["project"]
106
+ end
107
+
108
+ # Parses the instance from a database resource.
109
+ # @param database_name [String]
110
+ # @return [String]
111
+ def self.match_instance_from_database_name database_name
112
+ DATABASE_PATH_TEMPLATE.match(database_name)["instance"]
113
+ end
114
+
115
+ # Parses the database from a database resource.
116
+ # @param database_name [String]
117
+ # @return [String]
118
+ def self.match_database_from_database_name database_name
119
+ DATABASE_PATH_TEMPLATE.match(database_name)["database"]
120
+ end
121
+
122
+ # Parses the project from a session resource.
123
+ # @param session_name [String]
124
+ # @return [String]
125
+ def self.match_project_from_session_name session_name
126
+ SESSION_PATH_TEMPLATE.match(session_name)["project"]
127
+ end
128
+
129
+ # Parses the instance from a session resource.
130
+ # @param session_name [String]
131
+ # @return [String]
132
+ def self.match_instance_from_session_name session_name
133
+ SESSION_PATH_TEMPLATE.match(session_name)["instance"]
134
+ end
135
+
136
+ # Parses the database from a session resource.
137
+ # @param session_name [String]
138
+ # @return [String]
139
+ def self.match_database_from_session_name session_name
140
+ SESSION_PATH_TEMPLATE.match(session_name)["database"]
141
+ end
142
+
143
+ # Parses the session from a session resource.
144
+ # @param session_name [String]
145
+ # @return [String]
146
+ def self.match_session_from_session_name session_name
147
+ SESSION_PATH_TEMPLATE.match(session_name)["session"]
148
+ end
149
+
150
+ # @param service_path [String]
151
+ # The domain name of the API remote host.
152
+ # @param port [Integer]
153
+ # The port on which to connect to the remote host.
154
+ # @param channel [Channel]
155
+ # A Channel object through which to make calls.
156
+ # @param chan_creds [Grpc::ChannelCredentials]
157
+ # A ChannelCredentials for the setting up the RPC client.
158
+ # @param client_config[Hash]
159
+ # A Hash for call options for each method. See
160
+ # Google::Gax#construct_settings for the structure of
161
+ # this data. Falls back to the default config if not specified
162
+ # or the specified config is missing data points.
163
+ # @param timeout [Numeric]
164
+ # The default timeout, in seconds, for calls made through this client.
165
+ def initialize \
166
+ service_path: SERVICE_ADDRESS,
167
+ port: DEFAULT_SERVICE_PORT,
168
+ channel: nil,
169
+ chan_creds: nil,
170
+ scopes: ALL_SCOPES,
171
+ client_config: {},
172
+ timeout: DEFAULT_TIMEOUT,
173
+ app_name: nil,
174
+ app_version: nil,
175
+ lib_name: nil,
176
+ lib_version: ""
177
+ # These require statements are intentionally placed here to initialize
178
+ # the gRPC module only when it's required.
179
+ # See https://github.com/googleapis/toolkit/issues/446
180
+ require "google/gax/grpc"
181
+ require "google/spanner/v1/spanner_services_pb"
182
+
183
+
184
+ if app_name || app_version
185
+ warn "`app_name` and `app_version` are no longer being used in the request headers."
186
+ end
187
+
188
+ google_api_client = "gl-ruby/#{RUBY_VERSION}"
189
+ google_api_client << " #{lib_name}/#{lib_version}" if lib_name
190
+ google_api_client << " gapic/0.6.8 gax/#{Google::Gax::VERSION}"
191
+ google_api_client << " grpc/#{GRPC::VERSION}"
192
+ google_api_client.freeze
193
+
194
+ headers = { :"x-goog-api-client" => google_api_client }
195
+ client_config_file = Pathname.new(__dir__).join(
196
+ "spanner_client_config.json"
197
+ )
198
+ defaults = client_config_file.open do |f|
199
+ Google::Gax.construct_settings(
200
+ "google.spanner.v1.Spanner",
201
+ JSON.parse(f.read),
202
+ client_config,
203
+ Google::Gax::Grpc::STATUS_CODE_NAMES,
204
+ timeout,
205
+ errors: Google::Gax::Grpc::API_ERRORS,
206
+ kwargs: headers
207
+ )
208
+ end
209
+ @spanner_stub = Google::Gax::Grpc.create_stub(
210
+ service_path,
211
+ port,
212
+ chan_creds: chan_creds,
213
+ channel: channel,
214
+ scopes: scopes,
215
+ &Google::Spanner::V1::Spanner::Stub.method(:new)
216
+ )
217
+
218
+ @create_session = Google::Gax.create_api_call(
219
+ @spanner_stub.method(:create_session),
220
+ defaults["create_session"]
221
+ )
222
+ @get_session = Google::Gax.create_api_call(
223
+ @spanner_stub.method(:get_session),
224
+ defaults["get_session"]
225
+ )
226
+ @delete_session = Google::Gax.create_api_call(
227
+ @spanner_stub.method(:delete_session),
228
+ defaults["delete_session"]
229
+ )
230
+ @execute_sql = Google::Gax.create_api_call(
231
+ @spanner_stub.method(:execute_sql),
232
+ defaults["execute_sql"]
233
+ )
234
+ @execute_streaming_sql = Google::Gax.create_api_call(
235
+ @spanner_stub.method(:execute_streaming_sql),
236
+ defaults["execute_streaming_sql"]
237
+ )
238
+ @read = Google::Gax.create_api_call(
239
+ @spanner_stub.method(:read),
240
+ defaults["read"]
241
+ )
242
+ @streaming_read = Google::Gax.create_api_call(
243
+ @spanner_stub.method(:streaming_read),
244
+ defaults["streaming_read"]
245
+ )
246
+ @begin_transaction = Google::Gax.create_api_call(
247
+ @spanner_stub.method(:begin_transaction),
248
+ defaults["begin_transaction"]
249
+ )
250
+ @commit = Google::Gax.create_api_call(
251
+ @spanner_stub.method(:commit),
252
+ defaults["commit"]
253
+ )
254
+ @rollback = Google::Gax.create_api_call(
255
+ @spanner_stub.method(:rollback),
256
+ defaults["rollback"]
257
+ )
258
+ end
259
+
260
+ # Service calls
261
+
262
+ # Creates a new session. A session can be used to perform
263
+ # transactions that read and/or modify data in a Cloud Spanner database.
264
+ # Sessions are meant to be reused for many consecutive
265
+ # transactions.
266
+ #
267
+ # Sessions can only execute one transaction at a time. To execute
268
+ # multiple concurrent read-write/write-only transactions, create
269
+ # multiple sessions. Note that standalone reads and queries use a
270
+ # transaction internally, and count toward the one transaction
271
+ # limit.
272
+ #
273
+ # Cloud Spanner limits the number of sessions that can exist at any given
274
+ # time; thus, it is a good idea to delete idle and/or unneeded sessions.
275
+ # Aside from explicit deletes, Cloud Spanner can delete sessions for which no
276
+ # operations are sent for more than an hour. If a session is deleted,
277
+ # requests to it return +NOT_FOUND+.
278
+ #
279
+ # Idle sessions can be kept alive by sending a trivial SQL query
280
+ # periodically, e.g., +"SELECT 1"+.
281
+ #
282
+ # @param database [String]
283
+ # Required. The database in which the new session is created.
284
+ # @param options [Google::Gax::CallOptions]
285
+ # Overrides the default settings for this call, e.g, timeout,
286
+ # retries, etc.
287
+ # @return [Google::Spanner::V1::Session]
288
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
289
+ # @example
290
+ # require "google/cloud/spanner/v1/spanner_client"
291
+ #
292
+ # SpannerClient = Google::Cloud::Spanner::V1::SpannerClient
293
+ #
294
+ # spanner_client = SpannerClient.new
295
+ # formatted_database = SpannerClient.database_path("[PROJECT]", "[INSTANCE]", "[DATABASE]")
296
+ # response = spanner_client.create_session(formatted_database)
297
+
298
+ def create_session \
299
+ database,
300
+ options: nil
301
+ req = Google::Spanner::V1::CreateSessionRequest.new({
302
+ database: database
303
+ }.delete_if { |_, v| v.nil? })
304
+ @create_session.call(req, options)
305
+ end
306
+
307
+ # Gets a session. Returns +NOT_FOUND+ if the session does not exist.
308
+ # This is mainly useful for determining whether a session is still
309
+ # alive.
310
+ #
311
+ # @param name [String]
312
+ # Required. The name of the session to retrieve.
313
+ # @param options [Google::Gax::CallOptions]
314
+ # Overrides the default settings for this call, e.g, timeout,
315
+ # retries, etc.
316
+ # @return [Google::Spanner::V1::Session]
317
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
318
+ # @example
319
+ # require "google/cloud/spanner/v1/spanner_client"
320
+ #
321
+ # SpannerClient = Google::Cloud::Spanner::V1::SpannerClient
322
+ #
323
+ # spanner_client = SpannerClient.new
324
+ # formatted_name = SpannerClient.session_path("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]")
325
+ # response = spanner_client.get_session(formatted_name)
326
+
327
+ def get_session \
328
+ name,
329
+ options: nil
330
+ req = Google::Spanner::V1::GetSessionRequest.new({
331
+ name: name
332
+ }.delete_if { |_, v| v.nil? })
333
+ @get_session.call(req, options)
334
+ end
335
+
336
+ # Ends a session, releasing server resources associated with it.
337
+ #
338
+ # @param name [String]
339
+ # Required. The name of the session to delete.
340
+ # @param options [Google::Gax::CallOptions]
341
+ # Overrides the default settings for this call, e.g, timeout,
342
+ # retries, etc.
343
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
344
+ # @example
345
+ # require "google/cloud/spanner/v1/spanner_client"
346
+ #
347
+ # SpannerClient = Google::Cloud::Spanner::V1::SpannerClient
348
+ #
349
+ # spanner_client = SpannerClient.new
350
+ # formatted_name = SpannerClient.session_path("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]")
351
+ # spanner_client.delete_session(formatted_name)
352
+
353
+ def delete_session \
354
+ name,
355
+ options: nil
356
+ req = Google::Spanner::V1::DeleteSessionRequest.new({
357
+ name: name
358
+ }.delete_if { |_, v| v.nil? })
359
+ @delete_session.call(req, options)
360
+ nil
361
+ end
362
+
363
+ # Executes an SQL query, returning all rows in a single reply. This
364
+ # method cannot be used to return a result set larger than 10 MiB;
365
+ # if the query yields more data than that, the query fails with
366
+ # a +FAILED_PRECONDITION+ error.
367
+ #
368
+ # Queries inside read-write transactions might return +ABORTED+. If
369
+ # this occurs, the application should restart the transaction from
370
+ # the beginning. See Transaction for more details.
371
+ #
372
+ # Larger result sets can be fetched in streaming fashion by calling
373
+ # ExecuteStreamingSql instead.
374
+ #
375
+ # @param session [String]
376
+ # Required. The session in which the SQL query should be performed.
377
+ # @param sql [String]
378
+ # Required. The SQL query string.
379
+ # @param transaction [Google::Spanner::V1::TransactionSelector]
380
+ # The transaction to use. If none is provided, the default is a
381
+ # temporary read-only transaction with strong concurrency.
382
+ # @param params [Google::Protobuf::Struct]
383
+ # The SQL query string can contain parameter placeholders. A parameter
384
+ # placeholder consists of +'@'+ followed by the parameter
385
+ # name. Parameter names consist of any combination of letters,
386
+ # numbers, and underscores.
387
+ #
388
+ # Parameters can appear anywhere that a literal value is expected. The same
389
+ # parameter name can be used more than once, for example:
390
+ # +"WHERE id > @msg_id AND id < @msg_id + 100"+
391
+ #
392
+ # It is an error to execute an SQL query with unbound parameters.
393
+ #
394
+ # Parameter values are specified using +params+, which is a JSON
395
+ # object whose keys are parameter names, and whose values are the
396
+ # corresponding parameter values.
397
+ # @param param_types [Hash{String => Google::Spanner::V1::Type}]
398
+ # It is not always possible for Cloud Spanner to infer the right SQL type
399
+ # from a JSON value. For example, values of type +BYTES+ and values
400
+ # of type +STRING+ both appear in Params as JSON strings.
401
+ #
402
+ # In these cases, +param_types+ can be used to specify the exact
403
+ # SQL type for some or all of the SQL query parameters. See the
404
+ # definition of Type for more information
405
+ # about SQL types.
406
+ # @param resume_token [String]
407
+ # If this request is resuming a previously interrupted SQL query
408
+ # execution, +resume_token+ should be copied from the last
409
+ # PartialResultSet yielded before the interruption. Doing this
410
+ # enables the new SQL query execution to resume where the last one left
411
+ # off. The rest of the request parameters must exactly match the
412
+ # request that yielded this token.
413
+ # @param query_mode [Google::Spanner::V1::ExecuteSqlRequest::QueryMode]
414
+ # Used to control the amount of debugging information returned in
415
+ # ResultSetStats.
416
+ # @param options [Google::Gax::CallOptions]
417
+ # Overrides the default settings for this call, e.g, timeout,
418
+ # retries, etc.
419
+ # @return [Google::Spanner::V1::ResultSet]
420
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
421
+ # @example
422
+ # require "google/cloud/spanner/v1/spanner_client"
423
+ #
424
+ # SpannerClient = Google::Cloud::Spanner::V1::SpannerClient
425
+ #
426
+ # spanner_client = SpannerClient.new
427
+ # formatted_session = SpannerClient.session_path("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]")
428
+ # sql = ''
429
+ # response = spanner_client.execute_sql(formatted_session, sql)
430
+
431
+ def execute_sql \
432
+ session,
433
+ sql,
434
+ transaction: nil,
435
+ params: nil,
436
+ param_types: nil,
437
+ resume_token: nil,
438
+ query_mode: nil,
439
+ options: nil
440
+ req = Google::Spanner::V1::ExecuteSqlRequest.new({
441
+ session: session,
442
+ sql: sql,
443
+ transaction: transaction,
444
+ params: params,
445
+ param_types: param_types,
446
+ resume_token: resume_token,
447
+ query_mode: query_mode
448
+ }.delete_if { |_, v| v.nil? })
449
+ @execute_sql.call(req, options)
450
+ end
451
+
452
+ # Like ExecuteSql, except returns the result
453
+ # set as a stream. Unlike ExecuteSql, there
454
+ # is no limit on the size of the returned result set. However, no
455
+ # individual row in the result set can exceed 100 MiB, and no
456
+ # column value can exceed 10 MiB.
457
+ #
458
+ # @param session [String]
459
+ # Required. The session in which the SQL query should be performed.
460
+ # @param sql [String]
461
+ # Required. The SQL query string.
462
+ # @param transaction [Google::Spanner::V1::TransactionSelector]
463
+ # The transaction to use. If none is provided, the default is a
464
+ # temporary read-only transaction with strong concurrency.
465
+ # @param params [Google::Protobuf::Struct]
466
+ # The SQL query string can contain parameter placeholders. A parameter
467
+ # placeholder consists of +'@'+ followed by the parameter
468
+ # name. Parameter names consist of any combination of letters,
469
+ # numbers, and underscores.
470
+ #
471
+ # Parameters can appear anywhere that a literal value is expected. The same
472
+ # parameter name can be used more than once, for example:
473
+ # +"WHERE id > @msg_id AND id < @msg_id + 100"+
474
+ #
475
+ # It is an error to execute an SQL query with unbound parameters.
476
+ #
477
+ # Parameter values are specified using +params+, which is a JSON
478
+ # object whose keys are parameter names, and whose values are the
479
+ # corresponding parameter values.
480
+ # @param param_types [Hash{String => Google::Spanner::V1::Type}]
481
+ # It is not always possible for Cloud Spanner to infer the right SQL type
482
+ # from a JSON value. For example, values of type +BYTES+ and values
483
+ # of type +STRING+ both appear in Params as JSON strings.
484
+ #
485
+ # In these cases, +param_types+ can be used to specify the exact
486
+ # SQL type for some or all of the SQL query parameters. See the
487
+ # definition of Type for more information
488
+ # about SQL types.
489
+ # @param resume_token [String]
490
+ # If this request is resuming a previously interrupted SQL query
491
+ # execution, +resume_token+ should be copied from the last
492
+ # PartialResultSet yielded before the interruption. Doing this
493
+ # enables the new SQL query execution to resume where the last one left
494
+ # off. The rest of the request parameters must exactly match the
495
+ # request that yielded this token.
496
+ # @param query_mode [Google::Spanner::V1::ExecuteSqlRequest::QueryMode]
497
+ # Used to control the amount of debugging information returned in
498
+ # ResultSetStats.
499
+ # @param options [Google::Gax::CallOptions]
500
+ # Overrides the default settings for this call, e.g, timeout,
501
+ # retries, etc.
502
+ # @return [Enumerable<Google::Spanner::V1::PartialResultSet>]
503
+ # An enumerable of Google::Spanner::V1::PartialResultSet instances.
504
+ #
505
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
506
+ # @example
507
+ # require "google/cloud/spanner/v1/spanner_client"
508
+ #
509
+ # SpannerClient = Google::Cloud::Spanner::V1::SpannerClient
510
+ #
511
+ # spanner_client = SpannerClient.new
512
+ # formatted_session = SpannerClient.session_path("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]")
513
+ # sql = ''
514
+ # spanner_client.execute_streaming_sql(formatted_session, sql).each do |element|
515
+ # # Process element.
516
+ # end
517
+
518
+ def execute_streaming_sql \
519
+ session,
520
+ sql,
521
+ transaction: nil,
522
+ params: nil,
523
+ param_types: nil,
524
+ resume_token: nil,
525
+ query_mode: nil,
526
+ options: nil
527
+ req = Google::Spanner::V1::ExecuteSqlRequest.new({
528
+ session: session,
529
+ sql: sql,
530
+ transaction: transaction,
531
+ params: params,
532
+ param_types: param_types,
533
+ resume_token: resume_token,
534
+ query_mode: query_mode
535
+ }.delete_if { |_, v| v.nil? })
536
+ @execute_streaming_sql.call(req, options)
537
+ end
538
+
539
+ # Reads rows from the database using key lookups and scans, as a
540
+ # simple key/value style alternative to
541
+ # ExecuteSql. This method cannot be used to
542
+ # return a result set larger than 10 MiB; if the read matches more
543
+ # data than that, the read fails with a +FAILED_PRECONDITION+
544
+ # error.
545
+ #
546
+ # Reads inside read-write transactions might return +ABORTED+. If
547
+ # this occurs, the application should restart the transaction from
548
+ # the beginning. See Transaction for more details.
549
+ #
550
+ # Larger result sets can be yielded in streaming fashion by calling
551
+ # StreamingRead instead.
552
+ #
553
+ # @param session [String]
554
+ # Required. The session in which the read should be performed.
555
+ # @param table [String]
556
+ # Required. The name of the table in the database to be read.
557
+ # @param columns [Array<String>]
558
+ # The columns of Table to be returned for each row matching
559
+ # this request.
560
+ # @param key_set [Google::Spanner::V1::KeySet]
561
+ # Required. +key_set+ identifies the rows to be yielded. +key_set+ names the
562
+ # primary keys of the rows in Table to be yielded, unless Index
563
+ # is present. If Index is present, then Key_set instead names
564
+ # index keys in Index.
565
+ #
566
+ # Rows are yielded in table primary key order (if Index is empty)
567
+ # or index key order (if Index is non-empty).
568
+ #
569
+ # It is not an error for the +key_set+ to name rows that do not
570
+ # exist in the database. Read yields nothing for nonexistent rows.
571
+ # @param transaction [Google::Spanner::V1::TransactionSelector]
572
+ # The transaction to use. If none is provided, the default is a
573
+ # temporary read-only transaction with strong concurrency.
574
+ # @param index [String]
575
+ # If non-empty, the name of an index on Table. This index is
576
+ # used instead of the table primary key when interpreting Key_set
577
+ # and sorting result rows. See Key_set for further information.
578
+ # @param limit [Integer]
579
+ # If greater than zero, only the first +limit+ rows are yielded. If +limit+
580
+ # is zero, the default is no limit.
581
+ # @param resume_token [String]
582
+ # If this request is resuming a previously interrupted read,
583
+ # +resume_token+ should be copied from the last
584
+ # PartialResultSet yielded before the interruption. Doing this
585
+ # enables the new read to resume where the last read left off. The
586
+ # rest of the request parameters must exactly match the request
587
+ # that yielded this token.
588
+ # @param options [Google::Gax::CallOptions]
589
+ # Overrides the default settings for this call, e.g, timeout,
590
+ # retries, etc.
591
+ # @return [Google::Spanner::V1::ResultSet]
592
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
593
+ # @example
594
+ # require "google/cloud/spanner/v1/spanner_client"
595
+ #
596
+ # KeySet = Google::Spanner::V1::KeySet
597
+ # SpannerClient = Google::Cloud::Spanner::V1::SpannerClient
598
+ #
599
+ # spanner_client = SpannerClient.new
600
+ # formatted_session = SpannerClient.session_path("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]")
601
+ # table = ''
602
+ # columns = []
603
+ # key_set = KeySet.new
604
+ # response = spanner_client.read(formatted_session, table, columns, key_set)
605
+
606
+ def read \
607
+ session,
608
+ table,
609
+ columns,
610
+ key_set,
611
+ transaction: nil,
612
+ index: nil,
613
+ limit: nil,
614
+ resume_token: nil,
615
+ options: nil
616
+ req = Google::Spanner::V1::ReadRequest.new({
617
+ session: session,
618
+ table: table,
619
+ columns: columns,
620
+ key_set: key_set,
621
+ transaction: transaction,
622
+ index: index,
623
+ limit: limit,
624
+ resume_token: resume_token
625
+ }.delete_if { |_, v| v.nil? })
626
+ @read.call(req, options)
627
+ end
628
+
629
+ # Like Read, except returns the result set as a
630
+ # stream. Unlike Read, there is no limit on the
631
+ # size of the returned result set. However, no individual row in
632
+ # the result set can exceed 100 MiB, and no column value can exceed
633
+ # 10 MiB.
634
+ #
635
+ # @param session [String]
636
+ # Required. The session in which the read should be performed.
637
+ # @param table [String]
638
+ # Required. The name of the table in the database to be read.
639
+ # @param columns [Array<String>]
640
+ # The columns of Table to be returned for each row matching
641
+ # this request.
642
+ # @param key_set [Google::Spanner::V1::KeySet]
643
+ # Required. +key_set+ identifies the rows to be yielded. +key_set+ names the
644
+ # primary keys of the rows in Table to be yielded, unless Index
645
+ # is present. If Index is present, then Key_set instead names
646
+ # index keys in Index.
647
+ #
648
+ # Rows are yielded in table primary key order (if Index is empty)
649
+ # or index key order (if Index is non-empty).
650
+ #
651
+ # It is not an error for the +key_set+ to name rows that do not
652
+ # exist in the database. Read yields nothing for nonexistent rows.
653
+ # @param transaction [Google::Spanner::V1::TransactionSelector]
654
+ # The transaction to use. If none is provided, the default is a
655
+ # temporary read-only transaction with strong concurrency.
656
+ # @param index [String]
657
+ # If non-empty, the name of an index on Table. This index is
658
+ # used instead of the table primary key when interpreting Key_set
659
+ # and sorting result rows. See Key_set for further information.
660
+ # @param limit [Integer]
661
+ # If greater than zero, only the first +limit+ rows are yielded. If +limit+
662
+ # is zero, the default is no limit.
663
+ # @param resume_token [String]
664
+ # If this request is resuming a previously interrupted read,
665
+ # +resume_token+ should be copied from the last
666
+ # PartialResultSet yielded before the interruption. Doing this
667
+ # enables the new read to resume where the last read left off. The
668
+ # rest of the request parameters must exactly match the request
669
+ # that yielded this token.
670
+ # @param options [Google::Gax::CallOptions]
671
+ # Overrides the default settings for this call, e.g, timeout,
672
+ # retries, etc.
673
+ # @return [Enumerable<Google::Spanner::V1::PartialResultSet>]
674
+ # An enumerable of Google::Spanner::V1::PartialResultSet instances.
675
+ #
676
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
677
+ # @example
678
+ # require "google/cloud/spanner/v1/spanner_client"
679
+ #
680
+ # KeySet = Google::Spanner::V1::KeySet
681
+ # SpannerClient = Google::Cloud::Spanner::V1::SpannerClient
682
+ #
683
+ # spanner_client = SpannerClient.new
684
+ # formatted_session = SpannerClient.session_path("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]")
685
+ # table = ''
686
+ # columns = []
687
+ # key_set = KeySet.new
688
+ # spanner_client.streaming_read(formatted_session, table, columns, key_set).each do |element|
689
+ # # Process element.
690
+ # end
691
+
692
+ def streaming_read \
693
+ session,
694
+ table,
695
+ columns,
696
+ key_set,
697
+ transaction: nil,
698
+ index: nil,
699
+ limit: nil,
700
+ resume_token: nil,
701
+ options: nil
702
+ req = Google::Spanner::V1::ReadRequest.new({
703
+ session: session,
704
+ table: table,
705
+ columns: columns,
706
+ key_set: key_set,
707
+ transaction: transaction,
708
+ index: index,
709
+ limit: limit,
710
+ resume_token: resume_token
711
+ }.delete_if { |_, v| v.nil? })
712
+ @streaming_read.call(req, options)
713
+ end
714
+
715
+ # Begins a new transaction. This step can often be skipped:
716
+ # Read, ExecuteSql and
717
+ # Commit can begin a new transaction as a
718
+ # side-effect.
719
+ #
720
+ # @param session [String]
721
+ # Required. The session in which the transaction runs.
722
+ # @param options_ [Google::Spanner::V1::TransactionOptions]
723
+ # Required. Options for the new transaction.
724
+ # @param options [Google::Gax::CallOptions]
725
+ # Overrides the default settings for this call, e.g, timeout,
726
+ # retries, etc.
727
+ # @return [Google::Spanner::V1::Transaction]
728
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
729
+ # @example
730
+ # require "google/cloud/spanner/v1/spanner_client"
731
+ #
732
+ # SpannerClient = Google::Cloud::Spanner::V1::SpannerClient
733
+ # TransactionOptions = Google::Spanner::V1::TransactionOptions
734
+ #
735
+ # spanner_client = SpannerClient.new
736
+ # formatted_session = SpannerClient.session_path("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]")
737
+ # options_ = TransactionOptions.new
738
+ # response = spanner_client.begin_transaction(formatted_session, options_)
739
+
740
+ def begin_transaction \
741
+ session,
742
+ options_,
743
+ options: nil
744
+ req = Google::Spanner::V1::BeginTransactionRequest.new({
745
+ session: session,
746
+ options: options_
747
+ }.delete_if { |_, v| v.nil? })
748
+ @begin_transaction.call(req, options)
749
+ end
750
+
751
+ # Commits a transaction. The request includes the mutations to be
752
+ # applied to rows in the database.
753
+ #
754
+ # +Commit+ might return an +ABORTED+ error. This can occur at any time;
755
+ # commonly, the cause is conflicts with concurrent
756
+ # transactions. However, it can also happen for a variety of other
757
+ # reasons. If +Commit+ returns +ABORTED+, the caller should re-attempt
758
+ # the transaction from the beginning, re-using the same session.
759
+ #
760
+ # @param session [String]
761
+ # Required. The session in which the transaction to be committed is running.
762
+ # @param mutations [Array<Google::Spanner::V1::Mutation>]
763
+ # The mutations to be executed when this transaction commits. All
764
+ # mutations are applied atomically, in the order they appear in
765
+ # this list.
766
+ # @param transaction_id [String]
767
+ # Commit a previously-started transaction.
768
+ # @param single_use_transaction [Google::Spanner::V1::TransactionOptions]
769
+ # Execute mutations in a temporary transaction. Note that unlike
770
+ # commit of a previously-started transaction, commit with a
771
+ # temporary transaction is non-idempotent. That is, if the
772
+ # +CommitRequest+ is sent to Cloud Spanner more than once (for
773
+ # instance, due to retries in the application, or in the
774
+ # transport library), it is possible that the mutations are
775
+ # executed more than once. If this is undesirable, use
776
+ # BeginTransaction and
777
+ # Commit instead.
778
+ # @param options [Google::Gax::CallOptions]
779
+ # Overrides the default settings for this call, e.g, timeout,
780
+ # retries, etc.
781
+ # @return [Google::Spanner::V1::CommitResponse]
782
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
783
+ # @example
784
+ # require "google/cloud/spanner/v1/spanner_client"
785
+ #
786
+ # SpannerClient = Google::Cloud::Spanner::V1::SpannerClient
787
+ #
788
+ # spanner_client = SpannerClient.new
789
+ # formatted_session = SpannerClient.session_path("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]")
790
+ # mutations = []
791
+ # response = spanner_client.commit(formatted_session, mutations)
792
+
793
+ def commit \
794
+ session,
795
+ mutations,
796
+ transaction_id: nil,
797
+ single_use_transaction: nil,
798
+ options: nil
799
+ req = Google::Spanner::V1::CommitRequest.new({
800
+ session: session,
801
+ mutations: mutations,
802
+ transaction_id: transaction_id,
803
+ single_use_transaction: single_use_transaction
804
+ }.delete_if { |_, v| v.nil? })
805
+ @commit.call(req, options)
806
+ end
807
+
808
+ # Rolls back a transaction, releasing any locks it holds. It is a good
809
+ # idea to call this for any transaction that includes one or more
810
+ # Read or ExecuteSql requests and
811
+ # ultimately decides not to commit.
812
+ #
813
+ # +Rollback+ returns +OK+ if it successfully aborts the transaction, the
814
+ # transaction was already aborted, or the transaction is not
815
+ # found. +Rollback+ never returns +ABORTED+.
816
+ #
817
+ # @param session [String]
818
+ # Required. The session in which the transaction to roll back is running.
819
+ # @param transaction_id [String]
820
+ # Required. The transaction to roll back.
821
+ # @param options [Google::Gax::CallOptions]
822
+ # Overrides the default settings for this call, e.g, timeout,
823
+ # retries, etc.
824
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
825
+ # @example
826
+ # require "google/cloud/spanner/v1/spanner_client"
827
+ #
828
+ # SpannerClient = Google::Cloud::Spanner::V1::SpannerClient
829
+ #
830
+ # spanner_client = SpannerClient.new
831
+ # formatted_session = SpannerClient.session_path("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]")
832
+ # transaction_id = ''
833
+ # spanner_client.rollback(formatted_session, transaction_id)
834
+
835
+ def rollback \
836
+ session,
837
+ transaction_id,
838
+ options: nil
839
+ req = Google::Spanner::V1::RollbackRequest.new({
840
+ session: session,
841
+ transaction_id: transaction_id
842
+ }.delete_if { |_, v| v.nil? })
843
+ @rollback.call(req, options)
844
+ nil
845
+ end
846
+ end
847
+ end
848
+ end
849
+ end
850
+ end