google-cloud-datastore 1.2.1 → 1.3.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.
- checksums.yaml +4 -4
- data/LICENSE +2 -2
- data/lib/google-cloud-datastore.rb +2 -2
- data/lib/google/cloud/datastore.rb +26 -6
- data/lib/google/cloud/datastore/commit.rb +2 -2
- data/lib/google/cloud/datastore/convert.rb +2 -2
- data/lib/google/cloud/datastore/credentials.rb +2 -2
- data/lib/google/cloud/datastore/cursor.rb +2 -2
- data/lib/google/cloud/datastore/dataset.rb +109 -4
- data/lib/google/cloud/datastore/dataset/lookup_results.rb +2 -2
- data/lib/google/cloud/datastore/dataset/query_results.rb +2 -2
- data/lib/google/cloud/datastore/entity.rb +2 -2
- data/lib/google/cloud/datastore/errors.rb +2 -2
- data/lib/google/cloud/datastore/gql_query.rb +2 -2
- data/lib/google/cloud/datastore/key.rb +2 -2
- data/lib/google/cloud/datastore/properties.rb +2 -2
- data/lib/google/cloud/datastore/query.rb +2 -2
- data/lib/google/cloud/datastore/read_only_transaction.rb +249 -0
- data/lib/google/cloud/datastore/service.rb +20 -4
- data/lib/google/cloud/datastore/transaction.rb +9 -18
- data/lib/google/cloud/datastore/v1.rb +2 -2
- data/lib/google/cloud/datastore/v1/datastore_client.rb +2 -2
- data/lib/google/cloud/datastore/v1/doc/google/datastore/v1/datastore.rb +2 -2
- data/lib/google/cloud/datastore/v1/doc/google/datastore/v1/entity.rb +2 -2
- data/lib/google/cloud/datastore/v1/doc/google/datastore/v1/query.rb +2 -2
- data/lib/google/cloud/datastore/v1/doc/google/protobuf/wrappers.rb +2 -2
- data/lib/google/cloud/datastore/v1/doc/overview.rb +2 -2
- data/lib/google/cloud/datastore/version.rb +3 -3
- data/lib/google/datastore/v1/datastore_services_pb.rb +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee669c1788eabbeab4c54a4e3c70ef523eaf29ea39d67fff4b8907c128c06a86
|
4
|
+
data.tar.gz: e3ed585c57076f65a53901f1a02027ddeda91e54ec7a0526e85c1e74f15c63aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cb9965dda5f5255a7cafa68516a3a9dbbdd03c0ea00ce2a64d22acfcbfd2bca476adf03871c56508ace442d7fb0c58013ad35b2f3d02895f071cdc5fe9be030
|
7
|
+
data.tar.gz: ce4faf4d6a03e3cd9f952689a78b7a440076ec82fdbb1d1cb09278f8c2039fb5b56bbf92e9785e08599abaf1790c994700d52555808a9579c44447bd797c7276
|
data/LICENSE
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Apache License
|
2
2
|
Version 2.0, January 2004
|
3
|
-
|
3
|
+
https://www.apache.org/licenses/
|
4
4
|
|
5
5
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
6
6
|
|
@@ -192,7 +192,7 @@
|
|
192
192
|
you may not use this file except in compliance with the License.
|
193
193
|
You may obtain a copy of the License at
|
194
194
|
|
195
|
-
|
195
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
196
196
|
|
197
197
|
Unless required by applicable law or agreed to in writing, software
|
198
198
|
distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2016 Google
|
1
|
+
# Copyright 2016 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2014 Google
|
1
|
+
# Copyright 2014 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -369,6 +369,30 @@ module Google
|
|
369
369
|
# end
|
370
370
|
# ```
|
371
371
|
#
|
372
|
+
# A read-only transaction cannot modify entities; in return they do not
|
373
|
+
# contend with other read-write or read-only transactions. Using a read-only
|
374
|
+
# transaction for transactions that only read data will potentially improve
|
375
|
+
# throughput.
|
376
|
+
#
|
377
|
+
# ```ruby
|
378
|
+
# require "google/cloud/datastore"
|
379
|
+
#
|
380
|
+
# datastore = Google::Cloud::Datastore.new
|
381
|
+
#
|
382
|
+
# task_list_key = datastore.key "TaskList", "default"
|
383
|
+
# query = datastore.query("Task").
|
384
|
+
# ancestor(task_list_key)
|
385
|
+
#
|
386
|
+
# tasks = nil
|
387
|
+
#
|
388
|
+
# datastore.transaction read_only: true do |tx|
|
389
|
+
# task_list = tx.find task_list_key
|
390
|
+
# if task_list
|
391
|
+
# tasks = tx.run query
|
392
|
+
# end
|
393
|
+
# end
|
394
|
+
# ```
|
395
|
+
#
|
372
396
|
# See {Google::Cloud::Datastore::Transaction} and
|
373
397
|
# {Google::Cloud::Datastore::Dataset#transaction}
|
374
398
|
#
|
@@ -537,8 +561,6 @@ module Google
|
|
537
561
|
# ```
|
538
562
|
#
|
539
563
|
module Datastore
|
540
|
-
# rubocop:disable MethodLength
|
541
|
-
|
542
564
|
##
|
543
565
|
# Creates a new object for connecting to the Datastore service.
|
544
566
|
# Each call creates a new connection.
|
@@ -614,8 +636,6 @@ module Google
|
|
614
636
|
project_id, credentials,
|
615
637
|
timeout: timeout, client_config: client_config))
|
616
638
|
end
|
617
|
-
|
618
|
-
# rubocop:enable MethodLength
|
619
639
|
end
|
620
640
|
end
|
621
641
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2016 Google
|
1
|
+
# Copyright 2016 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2017 Google
|
1
|
+
# Copyright 2017 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2014 Google
|
1
|
+
# Copyright 2014 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2016 Google
|
1
|
+
# Copyright 2016 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2014 Google
|
1
|
+
# Copyright 2014 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -25,6 +25,8 @@ require "google/cloud/datastore/gql_query"
|
|
25
25
|
require "google/cloud/datastore/cursor"
|
26
26
|
require "google/cloud/datastore/dataset/lookup_results"
|
27
27
|
require "google/cloud/datastore/dataset/query_results"
|
28
|
+
require "google/cloud/datastore/transaction"
|
29
|
+
require "google/cloud/datastore/read_only_transaction"
|
28
30
|
|
29
31
|
module Google
|
30
32
|
module Cloud
|
@@ -466,6 +468,30 @@ module Google
|
|
466
468
|
##
|
467
469
|
# Creates a Datastore Transaction.
|
468
470
|
#
|
471
|
+
# Transactions using the block syntax are committed upon block
|
472
|
+
# completion and are automatically retried when known errors are raised
|
473
|
+
# during commit. All other errors will be passed on.
|
474
|
+
#
|
475
|
+
# All changes are accumulated in memory until the block completes.
|
476
|
+
# Transactions will be automatically retried when possible, until
|
477
|
+
# `deadline` is reached. This operation makes separate API requests to
|
478
|
+
# begin and commit the transaction.
|
479
|
+
#
|
480
|
+
# @see https://cloud.google.com/datastore/docs/concepts/transactions
|
481
|
+
# Transactions
|
482
|
+
#
|
483
|
+
# @param [Numeric] deadline The total amount of time in seconds the
|
484
|
+
# transaction has to succeed. The default is `60`.
|
485
|
+
# @param [String] previous_transaction The transaction identifier of a
|
486
|
+
# transaction that is being retried. Read-write transactions may fail
|
487
|
+
# due to contention. A read-write transaction can be retried by
|
488
|
+
# specifying `previous_transaction` when creating the new transaction.
|
489
|
+
#
|
490
|
+
# Specifying `previous_transaction` provides information that can be
|
491
|
+
# used to improve throughput. In particular, if transactional
|
492
|
+
# operations A and B conflict, specifying the `previous_transaction`
|
493
|
+
# can help to prevent livelock. (See {Transaction#id})
|
494
|
+
#
|
469
495
|
# @yield [tx] a block yielding a new transaction
|
470
496
|
# @yieldparam [Transaction] tx the transaction object
|
471
497
|
#
|
@@ -509,8 +535,80 @@ module Google
|
|
509
535
|
# tx.rollback
|
510
536
|
# end
|
511
537
|
#
|
512
|
-
def transaction
|
513
|
-
|
538
|
+
def transaction deadline: nil, previous_transaction: nil
|
539
|
+
deadline = validate_deadline deadline
|
540
|
+
backoff = 1.0
|
541
|
+
start_time = Time.now
|
542
|
+
|
543
|
+
tx = Transaction.new \
|
544
|
+
service, previous_transaction: previous_transaction
|
545
|
+
return tx unless block_given?
|
546
|
+
|
547
|
+
begin
|
548
|
+
yield tx
|
549
|
+
tx.commit
|
550
|
+
rescue Google::Cloud::UnavailableError => err
|
551
|
+
# Re-raise if deadline has passed
|
552
|
+
raise err if Time.now - start_time > deadline
|
553
|
+
|
554
|
+
# Sleep with incremental backoff
|
555
|
+
sleep(backoff *= 1.3)
|
556
|
+
|
557
|
+
# Create new transaction and retry the block
|
558
|
+
tx = Transaction.new service, previous_transaction: tx.id
|
559
|
+
retry
|
560
|
+
rescue
|
561
|
+
begin
|
562
|
+
tx.rollback
|
563
|
+
rescue
|
564
|
+
raise TransactionError,
|
565
|
+
"Transaction failed to commit and rollback."
|
566
|
+
end
|
567
|
+
raise TransactionError, "Transaction failed to commit."
|
568
|
+
end
|
569
|
+
end
|
570
|
+
|
571
|
+
##
|
572
|
+
# Creates a read-only transaction that provides a consistent snapshot of
|
573
|
+
# Cloud Datastore. This can be useful when multiple reads are needed to
|
574
|
+
# render a page or export data that must be consistent.
|
575
|
+
#
|
576
|
+
# A read-only transaction cannot modify entities; in return they do not
|
577
|
+
# contend with other read-write or read-only transactions. Using a
|
578
|
+
# read-only transaction for transactions that only read data will
|
579
|
+
# potentially improve throughput.
|
580
|
+
#
|
581
|
+
# Read-only single-group transactions never fail due to concurrent
|
582
|
+
# modifications, so you don't have to implement retries upon failure.
|
583
|
+
# However, multi-entity-group transactions can fail due to concurrent
|
584
|
+
# modifications, so these should have retries.
|
585
|
+
#
|
586
|
+
# @see https://cloud.google.com/datastore/docs/concepts/transactions
|
587
|
+
# Transactions
|
588
|
+
#
|
589
|
+
# @yield [tx] a block yielding a new transaction
|
590
|
+
# @yieldparam [ReadOnlyTransaction] tx the transaction object
|
591
|
+
#
|
592
|
+
# @example
|
593
|
+
# require "google/cloud/datastore"
|
594
|
+
#
|
595
|
+
# datastore = Google::Cloud::Datastore.new
|
596
|
+
#
|
597
|
+
# task_list_key = datastore.key "TaskList", "default"
|
598
|
+
# query = datastore.query("Task").
|
599
|
+
# ancestor(task_list_key)
|
600
|
+
#
|
601
|
+
# tasks = nil
|
602
|
+
#
|
603
|
+
# datastore.read_only_transaction do |tx|
|
604
|
+
# task_list = tx.find task_list_key
|
605
|
+
# if task_list
|
606
|
+
# tasks = tx.run query
|
607
|
+
# end
|
608
|
+
# end
|
609
|
+
#
|
610
|
+
def read_only_transaction
|
611
|
+
tx = ReadOnlyTransaction.new service
|
514
612
|
return tx unless block_given?
|
515
613
|
|
516
614
|
begin
|
@@ -526,6 +624,7 @@ module Google
|
|
526
624
|
raise TransactionError, "Transaction failed to commit."
|
527
625
|
end
|
528
626
|
end
|
627
|
+
alias_method :snapshot, :read_only_transaction
|
529
628
|
|
530
629
|
##
|
531
630
|
# Create a new Query instance. This is a convenience method to make the
|
@@ -789,6 +888,12 @@ module Google
|
|
789
888
|
fail "Must have active connection to service" unless service
|
790
889
|
end
|
791
890
|
|
891
|
+
def validate_deadline deadline
|
892
|
+
return 60 unless deadline.is_a? Numeric
|
893
|
+
return 60 if deadline < 0
|
894
|
+
deadline
|
895
|
+
end
|
896
|
+
|
792
897
|
def check_consistency! consistency
|
793
898
|
fail(ArgumentError,
|
794
899
|
format("Consistency must be :eventual or :strong, not %s.",
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2014 Google
|
1
|
+
# Copyright 2014 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2014 Google
|
1
|
+
# Copyright 2014 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2014 Google
|
1
|
+
# Copyright 2014 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2014 Google
|
1
|
+
# Copyright 2014 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2016 Google
|
1
|
+
# Copyright 2016 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2014 Google
|
1
|
+
# Copyright 2014 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2015 Google
|
1
|
+
# Copyright 2015 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2014 Google
|
1
|
+
# Copyright 2014 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -0,0 +1,249 @@
|
|
1
|
+
# Copyright 2014 Google LLC
|
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
|
+
# https://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
|
+
|
16
|
+
require "google/cloud/datastore/dataset/lookup_results"
|
17
|
+
require "google/cloud/datastore/dataset/query_results"
|
18
|
+
|
19
|
+
module Google
|
20
|
+
module Cloud
|
21
|
+
module Datastore
|
22
|
+
##
|
23
|
+
# # ReadOnlyTransaction
|
24
|
+
#
|
25
|
+
# Represents a read-only Datastore transaction that only allows reads.
|
26
|
+
#
|
27
|
+
# A read-only transaction cannot modify entities; in return they do not
|
28
|
+
# contend with other read-write or read-only transactions. Using a
|
29
|
+
# read-only transaction for transactions that only read data will
|
30
|
+
# potentially improve throughput.
|
31
|
+
#
|
32
|
+
# See {Google::Cloud::Datastore::Dataset#transaction}
|
33
|
+
#
|
34
|
+
# @see https://cloud.google.com/datastore/docs/concepts/transactions
|
35
|
+
# Transactions
|
36
|
+
#
|
37
|
+
# @example
|
38
|
+
# require "google/cloud/datastore"
|
39
|
+
#
|
40
|
+
# datastore = Google::Cloud::Datastore.new
|
41
|
+
#
|
42
|
+
# task_list_key = datastore.key "TaskList", "default"
|
43
|
+
# query = datastore.query("Task").
|
44
|
+
# ancestor(task_list_key)
|
45
|
+
#
|
46
|
+
# tasks = nil
|
47
|
+
#
|
48
|
+
# datastore.read_only_transaction do |tx|
|
49
|
+
# task_list = tx.find task_list_key
|
50
|
+
# if task_list
|
51
|
+
# tasks = tx.run query
|
52
|
+
# end
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
class ReadOnlyTransaction
|
56
|
+
attr_reader :id
|
57
|
+
|
58
|
+
##
|
59
|
+
# @private The Service object.
|
60
|
+
attr_accessor :service
|
61
|
+
|
62
|
+
##
|
63
|
+
# @private Creates a new ReadOnlyTransaction instance.
|
64
|
+
# Takes a Service instead of project and Credentials.
|
65
|
+
#
|
66
|
+
def initialize service
|
67
|
+
@service = service
|
68
|
+
reset!
|
69
|
+
start
|
70
|
+
end
|
71
|
+
|
72
|
+
##
|
73
|
+
# Retrieve an entity by providing key information. The lookup is run
|
74
|
+
# within the transaction.
|
75
|
+
#
|
76
|
+
# @param [Key, String] key_or_kind A Key object or `kind` string value.
|
77
|
+
#
|
78
|
+
# @return [Google::Cloud::Datastore::Entity, nil]
|
79
|
+
#
|
80
|
+
# @example
|
81
|
+
# require "google/cloud/datastore"
|
82
|
+
#
|
83
|
+
# datastore = Google::Cloud::Datastore.new
|
84
|
+
#
|
85
|
+
# task_list_key = datastore.key "TaskList", "default"
|
86
|
+
#
|
87
|
+
# datastore.read_only_transaction do |tx|
|
88
|
+
# task_list = tx.find task_list_key
|
89
|
+
# end
|
90
|
+
#
|
91
|
+
def find key_or_kind, id_or_name = nil
|
92
|
+
key = key_or_kind
|
93
|
+
unless key.is_a? Google::Cloud::Datastore::Key
|
94
|
+
key = Key.new key_or_kind, id_or_name
|
95
|
+
end
|
96
|
+
find_all(key).first
|
97
|
+
end
|
98
|
+
alias_method :get, :find
|
99
|
+
|
100
|
+
##
|
101
|
+
# Retrieve the entities for the provided keys. The lookup is run within
|
102
|
+
# the transaction.
|
103
|
+
#
|
104
|
+
# @param [Key] keys One or more Key objects to find records for.
|
105
|
+
#
|
106
|
+
# @return [Google::Cloud::Datastore::Dataset::LookupResults]
|
107
|
+
#
|
108
|
+
# @example
|
109
|
+
# require "google/cloud/datastore"
|
110
|
+
#
|
111
|
+
# datastore = Google::Cloud::Datastore.new
|
112
|
+
#
|
113
|
+
# task_key1 = datastore.key "Task", 123456
|
114
|
+
# task_key2 = datastore.key "Task", 987654
|
115
|
+
#
|
116
|
+
# datastore.read_only_transaction do |tx|
|
117
|
+
# tasks = tx.find_all task_key1, task_key2
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
def find_all *keys
|
121
|
+
ensure_service!
|
122
|
+
lookup_res = service.lookup(*Array(keys).flatten.map(&:to_grpc),
|
123
|
+
transaction: @id)
|
124
|
+
Dataset::LookupResults.from_grpc lookup_res, service, nil, @id
|
125
|
+
end
|
126
|
+
alias_method :lookup, :find_all
|
127
|
+
|
128
|
+
##
|
129
|
+
# Retrieve entities specified by a Query. The query is run within the
|
130
|
+
# transaction.
|
131
|
+
#
|
132
|
+
# @param [Query] query The Query object with the search criteria.
|
133
|
+
# @param [String] namespace The namespace the query is to run within.
|
134
|
+
#
|
135
|
+
# @return [Google::Cloud::Datastore::Dataset::QueryResults]
|
136
|
+
#
|
137
|
+
# @example
|
138
|
+
# require "google/cloud/datastore"
|
139
|
+
#
|
140
|
+
# datastore = Google::Cloud::Datastore.new
|
141
|
+
#
|
142
|
+
# query = datastore.query("Task").
|
143
|
+
# where("done", "=", false)
|
144
|
+
# datastore.read_only_transaction do |tx|
|
145
|
+
# tasks = tx.run query
|
146
|
+
# end
|
147
|
+
#
|
148
|
+
def run query, namespace: nil
|
149
|
+
ensure_service!
|
150
|
+
unless query.is_a?(Query) || query.is_a?(GqlQuery)
|
151
|
+
fail ArgumentError, "Cannot run a #{query.class} object."
|
152
|
+
end
|
153
|
+
query_res = service.run_query query.to_grpc, namespace,
|
154
|
+
transaction: @id
|
155
|
+
Dataset::QueryResults.from_grpc query_res, service, namespace,
|
156
|
+
query.to_grpc.dup
|
157
|
+
end
|
158
|
+
alias_method :run_query, :run
|
159
|
+
|
160
|
+
##
|
161
|
+
# Begins a transaction.
|
162
|
+
# This method is run when a new ReadOnlyTransaction is created.
|
163
|
+
#
|
164
|
+
def start
|
165
|
+
fail TransactionError, "Transaction already opened." unless @id.nil?
|
166
|
+
|
167
|
+
ensure_service!
|
168
|
+
tx_res = service.begin_transaction read_only: true
|
169
|
+
@id = tx_res.transaction
|
170
|
+
end
|
171
|
+
alias_method :begin_transaction, :start
|
172
|
+
|
173
|
+
##
|
174
|
+
# Commits the transaction.
|
175
|
+
#
|
176
|
+
# @example
|
177
|
+
# require "google/cloud/datastore"
|
178
|
+
#
|
179
|
+
# datastore = Google::Cloud::Datastore.new
|
180
|
+
#
|
181
|
+
# task_list_key = datastore.key "TaskList", "default"
|
182
|
+
# query = datastore.query("Task").
|
183
|
+
# ancestor(task_list_key)
|
184
|
+
#
|
185
|
+
# tx = datastore.transaction
|
186
|
+
# task_list = tx.find task_list_key
|
187
|
+
# if task_list
|
188
|
+
# tasks = tx.run query
|
189
|
+
# end
|
190
|
+
# tx.commit
|
191
|
+
#
|
192
|
+
def commit
|
193
|
+
fail TransactionError,
|
194
|
+
"Cannot commit when not in a transaction." if @id.nil?
|
195
|
+
|
196
|
+
ensure_service!
|
197
|
+
|
198
|
+
service.commit [], transaction: @id
|
199
|
+
true
|
200
|
+
end
|
201
|
+
|
202
|
+
##
|
203
|
+
# Rolls back the transaction.
|
204
|
+
#
|
205
|
+
# @example
|
206
|
+
# require "google/cloud/datastore"
|
207
|
+
#
|
208
|
+
# datastore = Google::Cloud::Datastore.new
|
209
|
+
#
|
210
|
+
# task_list_key = datastore.key "TaskList", "default"
|
211
|
+
# query = datastore.query("Task").
|
212
|
+
# ancestor(task_list_key)
|
213
|
+
#
|
214
|
+
# tx = datastore.transaction
|
215
|
+
# task_list = tx.find task_list_key
|
216
|
+
# if task_list
|
217
|
+
# tasks = tx.run query
|
218
|
+
# end
|
219
|
+
# tx.rollback
|
220
|
+
#
|
221
|
+
def rollback
|
222
|
+
if @id.nil?
|
223
|
+
fail TransactionError, "Cannot rollback when not in a transaction."
|
224
|
+
end
|
225
|
+
|
226
|
+
ensure_service!
|
227
|
+
service.rollback @id
|
228
|
+
true
|
229
|
+
end
|
230
|
+
|
231
|
+
##
|
232
|
+
# Reset the transaction.
|
233
|
+
# {ReadOnlyTransaction#start} must be called afterwards.
|
234
|
+
def reset!
|
235
|
+
@id = nil
|
236
|
+
end
|
237
|
+
|
238
|
+
protected
|
239
|
+
|
240
|
+
##
|
241
|
+
# @private Raise an error unless an active connection to the service is
|
242
|
+
# available.
|
243
|
+
def ensure_service!
|
244
|
+
fail "Must have active connection to service" unless service
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2016 Google
|
1
|
+
# Copyright 2016 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -110,8 +110,24 @@ module Google
|
|
110
110
|
|
111
111
|
##
|
112
112
|
# Begin a new transaction.
|
113
|
-
def begin_transaction
|
114
|
-
|
113
|
+
def begin_transaction read_only: nil, previous_transaction: nil
|
114
|
+
if read_only
|
115
|
+
transaction_options = Google::Datastore::V1::TransactionOptions.new
|
116
|
+
transaction_options.read_only = \
|
117
|
+
Google::Datastore::V1::TransactionOptions::ReadOnly.new
|
118
|
+
end
|
119
|
+
if previous_transaction
|
120
|
+
transaction_options ||= \
|
121
|
+
Google::Datastore::V1::TransactionOptions.new
|
122
|
+
rw = Google::Datastore::V1::TransactionOptions::ReadWrite.new(
|
123
|
+
previous_transaction: previous_transaction.encode("ASCII-8BIT")
|
124
|
+
)
|
125
|
+
transaction_options.read_write = rw
|
126
|
+
end
|
127
|
+
execute do
|
128
|
+
service.begin_transaction project,
|
129
|
+
transaction_options: transaction_options
|
130
|
+
end
|
115
131
|
end
|
116
132
|
|
117
133
|
##
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2014 Google
|
1
|
+
# Copyright 2014 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -26,6 +26,8 @@ module Google
|
|
26
26
|
# @see https://cloud.google.com/datastore/docs/concepts/transactions
|
27
27
|
# Transactions
|
28
28
|
#
|
29
|
+
# @attr_reader [String] id The identifier of the transaction.
|
30
|
+
#
|
29
31
|
# @example Transactional update:
|
30
32
|
# require "google/cloud/datastore"
|
31
33
|
#
|
@@ -41,26 +43,15 @@ module Google
|
|
41
43
|
# end
|
42
44
|
# end
|
43
45
|
#
|
44
|
-
# @example Transactional read:
|
45
|
-
# require "google/cloud/datastore"
|
46
|
-
#
|
47
|
-
# datastore = Google::Cloud::Datastore.new
|
48
|
-
#
|
49
|
-
# task_list_key = datastore.key "TaskList", "default"
|
50
|
-
# datastore.transaction do |tx|
|
51
|
-
# task_list = tx.find task_list_key
|
52
|
-
# query = tx.query("Task").ancestor(task_list)
|
53
|
-
# tasks_in_list = tx.run query
|
54
|
-
# end
|
55
|
-
#
|
56
46
|
class Transaction < Dataset
|
57
47
|
attr_reader :id
|
58
48
|
|
59
49
|
##
|
60
50
|
# @private Creates a new Transaction instance.
|
61
51
|
# Takes a Service instead of project and Credentials.
|
62
|
-
def initialize service
|
52
|
+
def initialize service, previous_transaction: nil
|
63
53
|
@service = service
|
54
|
+
@previous_transaction = previous_transaction
|
64
55
|
reset!
|
65
56
|
start
|
66
57
|
end
|
@@ -244,9 +235,8 @@ module Google
|
|
244
235
|
#
|
245
236
|
# datastore = Google::Cloud::Datastore.new
|
246
237
|
#
|
247
|
-
# query = datastore.query("Task").
|
248
|
-
# where("done", "=", false)
|
249
238
|
# datastore.transaction do |tx|
|
239
|
+
# query = datastore.query("Task")
|
250
240
|
# tasks = tx.run query
|
251
241
|
# end
|
252
242
|
#
|
@@ -280,7 +270,8 @@ module Google
|
|
280
270
|
fail TransactionError, "Transaction already opened." unless @id.nil?
|
281
271
|
|
282
272
|
ensure_service!
|
283
|
-
tx_res = service.begin_transaction
|
273
|
+
tx_res = service.begin_transaction \
|
274
|
+
previous_transaction: @previous_transaction
|
284
275
|
@id = tx_res.transaction
|
285
276
|
end
|
286
277
|
alias_method :begin_transaction, :start
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2016 Google
|
1
|
+
# Copyright 2016 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2017
|
1
|
+
# Copyright 2017 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2017
|
1
|
+
# Copyright 2017 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2017
|
1
|
+
# Copyright 2017 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2017
|
1
|
+
# Copyright 2017 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2017
|
1
|
+
# Copyright 2017 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2017
|
1
|
+
# Copyright 2017 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2016 Google
|
1
|
+
# Copyright 2016 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -16,7 +16,7 @@
|
|
16
16
|
module Google
|
17
17
|
module Cloud
|
18
18
|
module Datastore
|
19
|
-
VERSION = "1.
|
19
|
+
VERSION = "1.3.0"
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -7,7 +7,7 @@
|
|
7
7
|
# you may not use this file except in compliance with the License.
|
8
8
|
# You may obtain a copy of the License at
|
9
9
|
#
|
10
|
-
#
|
10
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
11
11
|
#
|
12
12
|
# Unless required by applicable law or agreed to in writing, software
|
13
13
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
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: 1.
|
4
|
+
version: 1.3.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: 2017-
|
12
|
+
date: 2017-12-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: google-cloud-core
|
@@ -31,14 +31,14 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 0
|
34
|
+
version: '1.0'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: 0
|
41
|
+
version: '1.0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: google-protobuf
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -205,6 +205,7 @@ files:
|
|
205
205
|
- lib/google/cloud/datastore/key.rb
|
206
206
|
- lib/google/cloud/datastore/properties.rb
|
207
207
|
- lib/google/cloud/datastore/query.rb
|
208
|
+
- lib/google/cloud/datastore/read_only_transaction.rb
|
208
209
|
- lib/google/cloud/datastore/service.rb
|
209
210
|
- lib/google/cloud/datastore/transaction.rb
|
210
211
|
- lib/google/cloud/datastore/v1.rb
|
@@ -240,7 +241,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
240
241
|
version: '0'
|
241
242
|
requirements: []
|
242
243
|
rubyforge_project:
|
243
|
-
rubygems_version: 2.7.
|
244
|
+
rubygems_version: 2.7.3
|
244
245
|
signing_key:
|
245
246
|
specification_version: 4
|
246
247
|
summary: API Client library for Google Cloud Datastore
|