google-cloud-datastore 2.4.0 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c5cb153ea77e6581236392f42ec5755cde46733fc2331d6c6b7f204e171c4006
4
- data.tar.gz: 57e1bde4b98c1f21b7d65d56255d66b79ab19c7d0a62d03d67fdbc90027fe1ca
3
+ metadata.gz: 1471082bad6f76859fd0172a40bac47c81c31d3bc7f42e0f5135547f280307a6
4
+ data.tar.gz: a182edc1deadbfe697c45fad2bcde90379c58d07985833fd3f4bca64584bfaf2
5
5
  SHA512:
6
- metadata.gz: 950fa042833ec644777f8b2e89ed0078f4c4629f4f32d6833b6de20d7f4f09a4563c96fbb9515a0eb6e3d76ace6d610e63178033a6d6318a0b2b897b91ccfb4e
7
- data.tar.gz: 4c6757326810a722fc9c2543bcbb0135b15ad698cd5b9b5bfdfe33ae4f84bf8e9df437d8838784f0a71c3debf7c51d8a6be70ed671efc9382cefddd10ec2c672
6
+ metadata.gz: 41ae448187ef6bbd842bcafcb2c6cbd107b81e4dfb55b72bbfb62857af387a82b4361cc3b86cdf00ab2657a5b98bcf6f51c1caf2090b2c922f8f3db03016e19a
7
+ data.tar.gz: 25725fc96567a06df8c6b75c4b29f9ff8077e77b59a7bb1c31d0c384a9a0d880d9e0d807653f75986c56d428dbcf7aaf09fa4074f7335eef76dcc520e21c9304
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Release History
2
2
 
3
+ ### 2.6.0 (2023-02-13)
4
+
5
+ #### Features
6
+
7
+ * Added support for snapshot read ([#19422](https://github.com/googleapis/google-cloud-ruby/issues/19422))
8
+
9
+ ### 2.5.0 (2023-02-09)
10
+
11
+ #### Features
12
+
13
+ * Added support for multiple database ([#20038](https://github.com/googleapis/google-cloud-ruby/issues/20038))
14
+
3
15
  ### 2.4.0 (2023-02-02)
4
16
 
5
17
  #### Features
@@ -53,6 +53,15 @@ module Google
53
53
  # descriptions.missing #=> raise NoMethodError
54
54
  #
55
55
  class LookupResults < DelegateClass(::Array)
56
+ ##
57
+ # The time at which these entities were read or found missing.
58
+ attr_reader :response_read_time
59
+
60
+ ##
61
+ # Time at which the entities are being read. This would not be
62
+ # older than 270 seconds.
63
+ attr_reader :read_time
64
+
56
65
  ##
57
66
  # Keys that were not looked up due to resource constraints.
58
67
  attr_accessor :deferred
@@ -110,9 +119,9 @@ module Google
110
119
  ensure_service!
111
120
  lookup_res = @service.lookup(
112
121
  *Array(@deferred).flatten.map(&:to_grpc),
113
- consistency: @consistency, transaction: @transaction
122
+ consistency: @consistency, transaction: @transaction, read_time: @read_time
114
123
  )
115
- self.class.from_grpc lookup_res, @service, @consistency
124
+ self.class.from_grpc lookup_res, @service, @consistency, nil, @read_time
116
125
  end
117
126
 
118
127
  ##
@@ -187,7 +196,7 @@ module Google
187
196
  ##
188
197
  # @private New Dataset::LookupResults from a
189
198
  # Google::Dataset::V1::LookupResponse object.
190
- def self.from_grpc lookup_res, service, consistency = nil, transaction = nil
199
+ def self.from_grpc lookup_res, service, consistency = nil, transaction = nil, read_time = nil
191
200
  entities = to_gcloud_entities lookup_res.found
192
201
  deferred = to_gcloud_keys lookup_res.deferred
193
202
  missing = to_gcloud_entities lookup_res.missing
@@ -195,6 +204,8 @@ module Google
195
204
  lr.instance_variable_set :@service, service
196
205
  lr.instance_variable_set :@consistency, consistency
197
206
  lr.instance_variable_set :@transaction, transaction
207
+ lr.instance_variable_set :@read_time, read_time
208
+ lr.instance_variable_set :@response_read_time, lookup_res.read_time
198
209
  lr.instance_variable_set :@deferred, deferred
199
210
  lr.instance_variable_set :@missing, missing
200
211
  end
@@ -72,6 +72,24 @@ module Google
72
72
  # * `:NO_MORE_RESULTS`
73
73
  attr_reader :more_results
74
74
 
75
+ ##
76
+ # Read timestamp this batch was returned from.
77
+ # This applies to the range of results from the query's `start_cursor` (or
78
+ # the beginning of the query if no cursor was given) to this batch's
79
+ # `end_cursor` (not the query's `end_cursor`).
80
+ #
81
+ # In a single transaction, subsequent query result batches for the same query
82
+ # can have a greater timestamp. Each batch's read timestamp
83
+ # is valid for all preceding batches.
84
+ # This value will not be set for eventually consistent queries in Cloud
85
+ # Datastore.
86
+ attr_reader :batch_read_time
87
+
88
+ ##
89
+ # Time at which the entities are being read. This would not be
90
+ # older than 270 seconds.
91
+ attr_reader :read_time
92
+
75
93
  ##
76
94
  # @private
77
95
  attr_accessor :service, :namespace, :cursors, :query
@@ -162,8 +180,8 @@ module Google
162
180
  # Reduce the limit by the number of entities returned in the current batch
163
181
  query.limit.value -= count
164
182
  end
165
- query_res = service.run_query query, namespace
166
- self.class.from_grpc query_res, service, namespace, query
183
+ query_res = service.run_query query, namespace, read_time: read_time
184
+ self.class.from_grpc query_res, service, namespace, query, read_time
167
185
  end
168
186
 
169
187
  ##
@@ -360,7 +378,7 @@ module Google
360
378
  ##
361
379
  # @private New Dataset::QueryResults from a
362
380
  # Google::Dataset::V1::RunQueryResponse object.
363
- def self.from_grpc query_res, service, namespace, query
381
+ def self.from_grpc query_res, service, namespace, query, read_time = nil
364
382
  r, c = Array(query_res.batch.entity_results).map do |result|
365
383
  [Entity.from_grpc(result.entity), Cursor.from_grpc(result.cursor)]
366
384
  end.transpose
@@ -373,6 +391,8 @@ module Google
373
391
  qr.service = service
374
392
  qr.namespace = namespace
375
393
  qr.query = query_res.query || query
394
+ qr.instance_variable_set :@read_time, read_time
395
+ qr.instance_variable_set :@batch_read_time, query_res.batch.read_time
376
396
  end
377
397
  end
378
398
 
@@ -84,6 +84,26 @@ module Google
84
84
  end
85
85
  alias project project_id
86
86
 
87
+ ##
88
+ # The Datastore database connected to.
89
+ #
90
+ # @return [String] ID of the database
91
+ #
92
+ # @example
93
+ # require "google/cloud/datastore"
94
+ #
95
+ # datastore = Google::Cloud::Datastore.new(
96
+ # project_id: "my-todo-project",
97
+ # credentials: "/path/to/keyfile.json",
98
+ # database_id: "my-database"
99
+ # )
100
+ #
101
+ # datastore.database_id #=> "my-database"
102
+ #
103
+ def database_id
104
+ service.database
105
+ end
106
+
87
107
  ##
88
108
  # Generate IDs for a Key before creating an entity.
89
109
  #
@@ -317,6 +337,8 @@ module Google
317
337
  # [Eventual Consistency in Google Cloud
318
338
  # Datastore](https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.tf76fya5nqk8)
319
339
  # for more information.
340
+ # @param [Time] read_time Reads entities as they were at the given time.
341
+ # This may not be older than 270 seconds. Optional
320
342
  #
321
343
  # @return [Google::Cloud::Datastore::Entity, nil]
322
344
  #
@@ -335,12 +357,12 @@ module Google
335
357
  #
336
358
  # task = datastore.find "Task", "sampleTask"
337
359
  #
338
- def find key_or_kind, id_or_name = nil, consistency: nil
360
+ def find key_or_kind, id_or_name = nil, consistency: nil, read_time: nil
339
361
  key = key_or_kind
340
362
  unless key.is_a? Google::Cloud::Datastore::Key
341
363
  key = Key.new key_or_kind, id_or_name
342
364
  end
343
- find_all(key, consistency: consistency).first
365
+ find_all(key, consistency: consistency, read_time: read_time).first
344
366
  end
345
367
  alias get find
346
368
 
@@ -357,6 +379,8 @@ module Google
357
379
  # [Eventual Consistency in Google Cloud
358
380
  # Datastore](https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.tf76fya5nqk8)
359
381
  # for more information.
382
+ # @param [Time] read_time Reads entities as they were at the given time.
383
+ # This may not be older than 270 seconds. Optional
360
384
  #
361
385
  # @return [Google::Cloud::Datastore::Dataset::LookupResults]
362
386
  #
@@ -369,12 +393,12 @@ module Google
369
393
  # task_key2 = datastore.key "Task", "sampleTask2"
370
394
  # tasks = datastore.find_all task_key1, task_key2
371
395
  #
372
- def find_all *keys, consistency: nil
396
+ def find_all *keys, consistency: nil, read_time: nil
373
397
  ensure_service!
374
398
  check_consistency! consistency
375
399
  lookup_res = service.lookup(*Array(keys).flatten.map(&:to_grpc),
376
- consistency: consistency)
377
- LookupResults.from_grpc lookup_res, service, consistency
400
+ consistency: consistency, read_time: read_time)
401
+ LookupResults.from_grpc lookup_res, service, consistency, nil, read_time
378
402
  end
379
403
  alias lookup find_all
380
404
 
@@ -391,6 +415,8 @@ module Google
391
415
  # [Eventual Consistency in Google Cloud
392
416
  # Datastore](https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.tf76fya5nqk8)
393
417
  # for more information.
418
+ # @param [Time] read_time Reads entities as they were at the given time.
419
+ # This may not be older than 270 seconds. Optional
394
420
  #
395
421
  # @return [Google::Cloud::Datastore::Dataset::QueryResults]
396
422
  #
@@ -441,16 +467,16 @@ module Google
441
467
  # done: false
442
468
  # tasks = datastore.run gql_query, namespace: "example-ns"
443
469
  #
444
- def run query, namespace: nil, consistency: nil
470
+ def run query, namespace: nil, consistency: nil, read_time: nil
445
471
  ensure_service!
446
472
  unless query.is_a?(Query) || query.is_a?(GqlQuery)
447
473
  raise ArgumentError, "Cannot run a #{query.class} object."
448
474
  end
449
475
  check_consistency! consistency
450
476
  query_res = service.run_query query.to_grpc, namespace,
451
- consistency: consistency
477
+ consistency: consistency, read_time: read_time
452
478
  QueryResults.from_grpc query_res, service, namespace,
453
- query.to_grpc.dup
479
+ query.to_grpc.dup, read_time
454
480
  end
455
481
  alias run_query run
456
482
 
@@ -462,6 +488,8 @@ module Google
462
488
  # @param [Symbol] consistency The non-transactional read consistency to
463
489
  # use. Cannot be set to `:strong` for global queries. Accepted values
464
490
  # are `:eventual` and `:strong`.
491
+ # @param [Time] read_time Reads entities as they were at the given time.
492
+ # This may not be older than 270 seconds. Optional
465
493
  #
466
494
  # The default consistency depends on the type of query used. See
467
495
  # [Eventual Consistency in Google Cloud
@@ -525,14 +553,14 @@ module Google
525
553
  # done: false
526
554
  # res = datastore.run_aggregation gql_query, namespace: "example-ns"
527
555
  #
528
- def run_aggregation aggregate_query, namespace: nil, consistency: nil
556
+ def run_aggregation aggregate_query, namespace: nil, consistency: nil, read_time: nil
529
557
  ensure_service!
530
558
  unless aggregate_query.is_a?(AggregateQuery) || aggregate_query.is_a?(GqlQuery)
531
559
  raise ArgumentError, "Cannot run a #{aggregate_query.class} object."
532
560
  end
533
561
  check_consistency! consistency
534
562
  aggregate_query_res = service.run_aggregation_query aggregate_query.to_grpc, namespace,
535
- consistency: consistency
563
+ consistency: consistency, read_time: read_time
536
564
  AggregateQueryResults.from_grpc aggregate_query_res
537
565
  end
538
566
 
@@ -657,6 +685,9 @@ module Google
657
685
  # @see https://cloud.google.com/datastore/docs/concepts/transactions
658
686
  # Transactions
659
687
  #
688
+ # @param [Time] read_time Reads entities at the given time.
689
+ # This may not be older than 60 seconds. Optional
690
+ #
660
691
  # @yield [tx] a block yielding a new transaction
661
692
  # @yieldparam [ReadOnlyTransaction] tx the transaction object
662
693
  #
@@ -678,8 +709,8 @@ module Google
678
709
  # end
679
710
  # end
680
711
  #
681
- def read_only_transaction
682
- tx = ReadOnlyTransaction.new service
712
+ def read_only_transaction read_time: nil
713
+ tx = ReadOnlyTransaction.new service, read_time: read_time
683
714
  return tx unless block_given?
684
715
 
685
716
  begin
@@ -69,6 +69,27 @@ module Google
69
69
  alias dataset_id project
70
70
  alias dataset_id= project=
71
71
 
72
+ ##
73
+ # The database of the Key.
74
+ #
75
+ # @return [String]
76
+ #
77
+ # @example
78
+ # require "google/cloud/datastore"
79
+ #
80
+ # datastore = Google::Cloud::Datastore.new(
81
+ # project: "my-todo-project",
82
+ # database: "my-todo-database",
83
+ # keyfile: "/path/to/keyfile.json"
84
+ # )
85
+ #
86
+ # task = datastore.find "Task", "sampleTask"
87
+ # task.key.database #=> "my-todo-database"
88
+ #
89
+ attr_accessor :database
90
+ alias database_id database
91
+ alias database_id= database=
92
+
72
93
  ##
73
94
  # The namespace of the Key.
74
95
  #
@@ -281,9 +302,9 @@ module Google
281
302
  Google::Cloud::Datastore::V1::Key::PathElement.new path_args
282
303
  end
283
304
  grpc = Google::Cloud::Datastore::V1::Key.new path: grpc_path
284
- if project || namespace
305
+ if project || database || namespace
285
306
  grpc.partition_id = Google::Cloud::Datastore::V1::PartitionId.new(
286
- project_id: project.to_s, namespace_id: namespace.to_s
307
+ project_id: project.to_s, database_id: database.to_s, namespace_id: namespace.to_s
287
308
  )
288
309
  end
289
310
  grpc
@@ -304,6 +325,7 @@ module Google
304
325
  end
305
326
  if key_grpc.partition_id
306
327
  key.project = key_grpc.partition_id.project_id
328
+ key.database = key_grpc.partition_id.database_id
307
329
  key.namespace = key_grpc.partition_id.namespace_id
308
330
  end
309
331
  key.parent = Key.from_grpc key_grpc if key_grpc.path.count.positive?
@@ -59,13 +59,22 @@ module Google
59
59
  # @private The Service object.
60
60
  attr_accessor :service
61
61
 
62
+ ##
63
+ # Reads entities at the given time.
64
+ # This may not be older than 60 seconds.
65
+ attr_reader :read_time
66
+
62
67
  ##
63
68
  # @private Creates a new ReadOnlyTransaction instance.
64
69
  # Takes a Service instead of project and Credentials.
65
70
  #
66
- def initialize service
71
+ # @param [Time] read_time Reads documents as they were at the given time.
72
+ # This may not be older than 270 seconds. Optional
73
+ #
74
+ def initialize service, read_time: nil
67
75
  @service = service
68
76
  reset!
77
+ @read_time = read_time
69
78
  start
70
79
  end
71
80
 
@@ -194,9 +203,8 @@ module Google
194
203
  #
195
204
  def start
196
205
  raise TransactionError, "Transaction already opened." unless @id.nil?
197
-
198
206
  ensure_service!
199
- tx_res = service.begin_transaction read_only: true
207
+ tx_res = service.begin_transaction read_only: true, read_time: @read_time
200
208
  @id = tx_res.transaction
201
209
  end
202
210
  alias begin_transaction start
@@ -29,14 +29,16 @@ module Google
29
29
  attr_accessor :credentials
30
30
  attr_accessor :host
31
31
  attr_accessor :timeout
32
+ attr_accessor :database
32
33
 
33
34
  ##
34
35
  # Creates a new Service instance.
35
- def initialize project, credentials, host: nil, timeout: nil
36
+ def initialize project, credentials, database, host: nil, timeout: nil
36
37
  @project = project
37
38
  @credentials = credentials
38
39
  @host = host
39
40
  @timeout = timeout
41
+ @database = database
40
42
  end
41
43
 
42
44
  def service
@@ -47,34 +49,34 @@ module Google
47
49
  config.endpoint = host if host
48
50
  config.lib_name = "gccl"
49
51
  config.lib_version = Google::Cloud::Datastore::VERSION
50
- config.metadata = { "google-cloud-resource-prefix": "projects/#{@project}" }
52
+ config.metadata = { "google-cloud-resource-prefix": "projects/#{@project}/databases/#{database}" }
51
53
  end
52
54
  end
55
+
53
56
  attr_accessor :mocked_service
54
57
 
55
58
  ##
56
59
  # Allocate IDs for incomplete keys.
57
60
  # (This is useful for referencing an entity before it is inserted.)
58
61
  def allocate_ids *incomplete_keys
59
- service.allocate_ids project_id: project, keys: incomplete_keys
62
+ service.allocate_ids project_id: project, database_id: database, keys: incomplete_keys
60
63
  end
61
64
 
62
65
  ##
63
66
  # Look up entities by keys.
64
- def lookup *keys, consistency: nil, transaction: nil
65
- read_options = generate_read_options consistency, transaction
66
-
67
- service.lookup project_id: project, keys: keys, read_options: read_options
67
+ def lookup *keys, consistency: nil, transaction: nil, read_time: nil
68
+ read_options = generate_read_options consistency, transaction, read_time
69
+ service.lookup project_id: project, database_id: database, keys: keys, read_options: read_options
68
70
  end
69
71
 
70
72
  # Query for entities.
71
- def run_query query, namespace = nil, consistency: nil, transaction: nil
73
+ def run_query query, namespace = nil, consistency: nil, transaction: nil, read_time: nil
72
74
  gql_query = nil
73
75
  if query.is_a? Google::Cloud::Datastore::V1::GqlQuery
74
76
  gql_query = query
75
77
  query = nil
76
78
  end
77
- read_options = generate_read_options consistency, transaction
79
+ read_options = generate_read_options consistency, transaction, read_time
78
80
  if namespace
79
81
  partition_id = Google::Cloud::Datastore::V1::PartitionId.new(
80
82
  namespace_id: namespace
@@ -82,6 +84,7 @@ module Google
82
84
  end
83
85
 
84
86
  service.run_query project_id: project,
87
+ database_id: database,
85
88
  partition_id: partition_id,
86
89
  read_options: read_options,
87
90
  query: query,
@@ -89,13 +92,13 @@ module Google
89
92
  end
90
93
 
91
94
  ## Query for aggregates
92
- def run_aggregation_query query, namespace = nil, consistency: nil, transaction: nil
95
+ def run_aggregation_query query, namespace = nil, consistency: nil, transaction: nil, read_time: nil
93
96
  gql_query = nil
94
97
  if query.is_a? Google::Cloud::Datastore::V1::GqlQuery
95
98
  gql_query = query
96
99
  query = nil
97
100
  end
98
- read_options = generate_read_options consistency, transaction
101
+ read_options = generate_read_options consistency, transaction, read_time
99
102
  if namespace
100
103
  partition_id = Google::Cloud::Datastore::V1::PartitionId.new(
101
104
  namespace_id: namespace
@@ -111,11 +114,13 @@ module Google
111
114
 
112
115
  ##
113
116
  # Begin a new transaction.
114
- def begin_transaction read_only: nil, previous_transaction: nil
117
+ def begin_transaction read_only: nil, previous_transaction: nil, read_time: nil
115
118
  if read_only
116
119
  transaction_options = Google::Cloud::Datastore::V1::TransactionOptions.new
117
120
  transaction_options.read_only = \
118
- Google::Cloud::Datastore::V1::TransactionOptions::ReadOnly.new
121
+ Google::Cloud::Datastore::V1::TransactionOptions::ReadOnly.new \
122
+ read_time: read_time_to_timestamp(read_time)
123
+
119
124
  end
120
125
  if previous_transaction
121
126
  transaction_options ||= \
@@ -125,7 +130,7 @@ module Google
125
130
  )
126
131
  transaction_options.read_write = rw
127
132
  end
128
- service.begin_transaction project_id: project, transaction_options: transaction_options
133
+ service.begin_transaction project_id: project, database_id: database, transaction_options: transaction_options
129
134
  end
130
135
 
131
136
  ##
@@ -133,22 +138,23 @@ module Google
133
138
  # some entities.
134
139
  def commit mutations, transaction: nil
135
140
  mode = transaction.nil? ? :NON_TRANSACTIONAL : :TRANSACTIONAL
136
- service.commit project_id: project, mode: mode, mutations: mutations, transaction: transaction
141
+ service.commit project_id: project, database_id: database, mode: mode,
142
+ mutations: mutations, transaction: transaction
137
143
  end
138
144
 
139
145
  ##
140
146
  # Roll back a transaction.
141
147
  def rollback transaction
142
- service.rollback project_id: project, transaction: transaction
148
+ service.rollback project_id: project, database_id: database, transaction: transaction
143
149
  end
144
150
 
145
151
  def inspect
146
- "#{self.class}(#{@project})"
152
+ "#{self.class}(#{@project})(#{database})"
147
153
  end
148
154
 
149
155
  protected
150
156
 
151
- def generate_read_options consistency, transaction
157
+ def generate_read_options consistency, transaction, read_time
152
158
  if consistency == :eventual
153
159
  return Google::Cloud::Datastore::V1::ReadOptions.new(
154
160
  read_consistency: :EVENTUAL
@@ -161,9 +167,25 @@ module Google
161
167
  return Google::Cloud::Datastore::V1::ReadOptions.new(
162
168
  transaction: transaction
163
169
  )
170
+ elsif read_time
171
+ return Google::Cloud::Datastore::V1::ReadOptions.new(
172
+ read_time: read_time_to_timestamp(read_time)
173
+ )
164
174
  end
165
175
  nil
166
176
  end
177
+
178
+ def read_time_to_timestamp time
179
+ return nil if time.nil?
180
+
181
+ # Force the object to be a Time object.
182
+ time = time.to_time.utc
183
+
184
+ Google::Protobuf::Timestamp.new(
185
+ seconds: time.to_i,
186
+ nanos: time.usec * 1000
187
+ )
188
+ end
167
189
  end
168
190
  end
169
191
  end
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Datastore
19
- VERSION = "2.4.0".freeze
19
+ VERSION = "2.6.0".freeze
20
20
  end
21
21
  end
22
22
  end
@@ -74,6 +74,8 @@ module Google
74
74
  # If the param is nil, uses the default endpoint.
75
75
  # @param [String] emulator_host Datastore emulator host. Optional.
76
76
  # If the param is nil, uses the value of the `emulator_host` config.
77
+ # @param [String] database_id Identifier for a Datastore database in the project. If not
78
+ # present, the default database of the project will be used.
77
79
  # @param [String] project Alias for the `project_id` argument. Deprecated.
78
80
  # @param [String] keyfile Alias for the `credentials` argument.
79
81
  # Deprecated.
@@ -103,13 +105,15 @@ module Google
103
105
  timeout: nil,
104
106
  endpoint: nil,
105
107
  emulator_host: nil,
108
+ database_id: nil,
106
109
  project: nil,
107
110
  keyfile: nil
108
- project_id ||= (project || default_project_id)
109
- scope ||= configure.scope
110
- timeout ||= configure.timeout
111
- endpoint ||= configure.endpoint
111
+ project_id = get_project_id project_id, project
112
+ scope ||= configure.scope
113
+ timeout ||= configure.timeout
114
+ endpoint ||= configure.endpoint
112
115
  emulator_host ||= configure.emulator_host
116
+ database_id ||= configure.database_id
113
117
 
114
118
  if emulator_host
115
119
  project_id = project_id.to_s # Always cast to a string
@@ -117,7 +121,7 @@ module Google
117
121
 
118
122
  return Datastore::Dataset.new(
119
123
  Datastore::Service.new(
120
- project_id, :this_channel_is_insecure,
124
+ project_id, :this_channel_is_insecure, database_id,
121
125
  host: emulator_host, timeout: timeout
122
126
  )
123
127
  )
@@ -136,7 +140,7 @@ module Google
136
140
 
137
141
  Datastore::Dataset.new(
138
142
  Datastore::Service.new(
139
- project_id, credentials,
143
+ project_id, credentials, database_id,
140
144
  host: endpoint, timeout: timeout
141
145
  )
142
146
  )
@@ -175,6 +179,14 @@ module Google
175
179
  Google::Cloud.configure.datastore
176
180
  end
177
181
 
182
+ ##
183
+ # @private Default project.
184
+ def self.get_project_id project_id, project
185
+ project_id || project || Google::Cloud.configure.datastore.project_id ||
186
+ Google::Cloud.configure.project_id ||
187
+ Google::Cloud.env.project_id
188
+ end
189
+
178
190
  ##
179
191
  # @private Default project.
180
192
  def self.default_project_id
@@ -67,9 +67,10 @@ module Google
67
67
  # platform_scope = "https://www.googleapis.com/auth/cloud-platform"
68
68
  # datastore = gcloud.datastore scope: platform_scope
69
69
  #
70
- def datastore scope: nil, timeout: nil
70
+ def datastore scope: nil, timeout: nil, database_id: nil
71
71
  Google::Cloud.datastore @project, @keyfile,
72
- scope: scope, timeout: (timeout || @timeout)
72
+ scope: scope, timeout: (timeout || @timeout),
73
+ database_id: database_id
73
74
  end
74
75
 
75
76
  ##
@@ -112,11 +113,12 @@ module Google
112
113
  # datastore.save task
113
114
  #
114
115
  def self.datastore project_id = nil, credentials = nil, scope: nil,
115
- timeout: nil
116
+ timeout: nil, database_id: nil
116
117
  require "google/cloud/datastore"
117
118
  Google::Cloud::Datastore.new project_id: project_id,
118
119
  credentials: credentials,
119
- scope: scope, timeout: timeout
120
+ scope: scope, timeout: timeout,
121
+ database_id: database_id
120
122
  end
121
123
  end
122
124
  end
@@ -136,8 +138,7 @@ Google::Cloud.configure.add_config! :datastore do |config|
136
138
  ENV["DATASTORE_EMULATOR_HOST"]
137
139
  end
138
140
  default_scopes = [
139
- "https://www.googleapis.com/auth/cloud-platform",
140
- "https://www.googleapis.com/auth/datastore"
141
+ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/datastore"
141
142
  ]
142
143
 
143
144
  config.add_field! :project_id, default_project, match: String, allow_nil: true
@@ -149,4 +150,5 @@ Google::Cloud.configure.add_config! :datastore do |config|
149
150
  config.add_field! :timeout, nil, match: Integer
150
151
  config.add_field! :emulator_host, default_emulator, match: String, allow_nil: true
151
152
  config.add_field! :endpoint, "datastore.googleapis.com", match: String
153
+ config.add_field! :database_id, "", match: String
152
154
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-cloud-datastore
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Moore
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-02-03 00:00:00.000000000 Z
12
+ date: 2023-02-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: google-cloud-core