8000 Merge pull request #904 from tseaver/903-pass_xact_id_during_commit · googleapis/google-cloud-python@9491053 · GitHub < 8000 /head>
[go: up one dir, main page]

Skip to content

Commit 9491053

Browse files
committed
Merge pull request #904 from tseaver/903-pass_xact_id_during_commit
#903: Ensure transaction ID is passed through to connection during commit.
2 parents c28fce8 + 164e1d8 commit 9491053

File tree

6 files changed

+37
-24
lines changed

6 files changed

+37
-24
lines changed

gcloud/datastore/batch.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class Batch(object):
6262
... do_some_work(batch)
6363
... raise Exception() # rolls back
6464
"""
65+
_id = None # "protected" attribute, always None for non-transactions
6566

6667
def __init__(self, dataset_id=None, connection=None):
6768
"""Construct a batch.
@@ -211,7 +212,8 @@ def commit(self):
211212
however it can be called explicitly if you don't want to use a
212213
context manager.
213214
"""
214-
response = self.connection.commit(self._dataset_id, self.mutation)
215+
response = self.connection.commit(
216+
self._dataset_id, self.mutation, self._id)
215217
# If the back-end returns without error, we are guaranteed that
216218
# the response's 'insert_auto_id_key' will match (length and order)
217219
# the request's 'insert_auto_id` entities, which are derived from

gcloud/datastore/connection.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ def begin_transaction(self, dataset_id, serializable=False):
297297

298298
return response.transaction
299299

300-
def commit(self, dataset_id, mutation_pb, transaction_id=None):
300+
def commit(self, dataset_id, mutation_pb, transaction_id):
301301
"""Commit dataset mutations in context of current transation (if any).
302302
303303
Maps the ``DatastoreService.Commit`` protobuf RPC.
@@ -308,10 +308,10 @@ def commit(self, dataset_id, mutation_pb, transaction_id=None):
308308
:type mutation_pb: :class:`datastore_pb.Mutation`.
309309
:param mutation_pb: The protobuf for the mutations being saved.
310310
311-
:type transaction_id: string
311+
:type transaction_id: string or None
312312
:param transaction_id: The transaction ID returned from
313-
:meth:`begin_transaction`. If not passed, the
314-
commit will be non-transactional.
313+
:meth:`begin_transaction`. Non-transactional
314+
batches must pass ``None``.
315315
316316
:rtype: :class:`gcloud.datastore._datastore_v1_pb2.MutationResult`.
317317
:returns': the result protobuf for the mutation.

gcloud/datastore/test_api.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -663,14 +663,15 @@ def test_no_dataset_id(self):
663663

664664
self.assertEqual(result, None)
665665
self.assertEqual(len(connection._committed), 1)
666-
dataset_id, mutation = connection._committed[0]
666+
dataset_id, mutation, transaction_id = connection._committed[0]
667667
self.assertEqual(dataset_id, _DATASET)
668668
upserts = list(mutation.upsert)
669669
self.assertEqual(len(upserts), 1)
670670
self.assertEqual(upserts[0].key, entity.key.to_protobuf())
671671
properties = list(upserts[0].property)
672672
self.assertEqual(properties[0].name, 'foo')
673673
self.assertEqual(properties[0].value.string_value, u'bar')
674+
self.assertTrue(transaction_id is None)
674675

675676
def test_no_entities(self):
676677
from gcloud.datastore import _implicit_environ
@@ -700,14 +701,15 @@ def test_no_batch_w_partial_key(self):
700701
dataset_id=_DATASET)
701702
self.assertEqual(result, None)
702703
self.assertEqual(len(connection._committed), 1)
703-
dataset_id, mutation = connection._committed[0]
704+
dataset_id, mutation, transaction_id = connection._committed[0]
704705
self.assertEqual(dataset_id, _DATASET)
705706
inserts = list(mutation.insert_auto_id)
706707
self.assertEqual(len(inserts), 1)
707708
self.assertEqual(inserts[0].key, key.to_protobuf())
708709
properties = list(inserts[0].property)
709710
self.assertEqual(properties[0].name, 'foo')
710711
self.assertEqual(properties[0].value.string_value, u'bar')
712+
self.assertTrue(transaction_id is None)
711713

712714
def test_existing_batch_w_completed_key(self):
713715
from gcloud.datastore.test_batch import _Connection
@@ -848,9 +850,10 @@ def test_no_dataset_id(self):
848850

849851
self.assertEqual(result, None)
850852
self.assertEqual(len(connection._committed), 1)
851-
dataset_id, mutation = connection._committed[0]
853+
dataset_id, mutation, transaction_id = connection._committed[0]
852854
self.assertEqual(dataset_id, _DATASET)
853855
self.assertEqual(list(mutation.delete), [key.to_protobuf()])
856+
self.assertTrue(transaction_id is None)
854857

855858
def test_no_keys(self):
856859
from gcloud.datastore import _implicit_environ
@@ -872,9 +875,10 @@ def test_no_batch(self):
872875
dataset_id=_DATASET)
873876
self.assertEqual(result, None)
874877
self.assertEqual(len(connection._committed), 1)
875-
dataset_id, mutation = connection._committed[0]
878+
dataset_id, mutation, transaction_id = connection._committed[0]
876879
self.assertEqual(dataset_id, _DATASET)
877880
self.assertEqual(list(mutation.delete), [key.to_protobuf()])
881+
self.assertTrue(transaction_id is None)
878882

879883
def test_wo_batch_w_key_different_than_default_dataset_id(self):
880884
from gcloud.datastore._testing import _monkey_defaults
@@ -892,9 +896,10 @@ def test_wo_batch_w_key_different_than_default_dataset_id(self):
892896
result = self._callFUT([key])
893897
self.assertEqual(result, None)
894898
self.assertEqual(len(connection._committed), 1)
895-
dataset_id, mutation = connection._committed[0]
899+
dataset_id, mutation, transaction_id = connection._committed[0]
896900
self.assertEqual(dataset_id, _DATASET)
897901
self.assertEqual(list(mutation.delete), [key.to_protobuf()])
902+
self.assertTrue(transaction_id is None)
898903

899904
def test_w_existing_batch(self):
900905
from gcloud.datastore.test_batch import _Connection
@@ -989,9 +994,10 @@ def test_no_batch(self):
989994
dataset_id=_DATASET)
990995
self.assertEqual(result, None)
991996
self.assertEqual(len(connection._committed), 1)
992-
dataset_id, mutation = connection._committed[0]
997+
dataset_id, mutation, transaction_id = connection._committed[0]
993998
self.assertEqual(dataset_id, _DATASET)
994999
self.assertEqual(list(mutation.delete), [key.to_protobuf()])
1000+
self.assertTrue(transaction_id is None)
9951001

9961002

9971003
class Test_allocate_ids_function(unittest2.TestCase):

gcloud/datastore/test_batch.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def test_ctor_explicit(self):
4242

4343
self.assertEqual(batch.dataset_id, _DATASET)
4444
self.assertEqual(batch.connection, connection)
45+
self.assertTrue(batch._id is None)
4546
self.assertTrue(isinstance(batch.mutation, Mutation))
4647
self.assertEqual(batch._auto_id_entities, [])
4748

@@ -56,6 +57,7 @@ def test_ctor_implicit(self):
5657

5758
self.assertEqual(batch.dataset_id, _DATASET)
5859
self.assertEqual(batch.connection, CONNECTION)
60+
self.assertTrue(batch._id is None)
5961
self.assertTrue(isinstance(batch.mutation, Mutation))
6062
self.assertEqual(batch._auto_id_entities, [])
6163

@@ -260,7 +262,8 @@ def test_commit(self):
260262

261263
batch.commit()
262264

263-
self.assertEqual(connection._committed, [(_DATASET, batch.mutation)])
265+
self.assertEqual(connection._committed,
266+
[(_DATASET, batch.mutation, None)])
264267

265268
def test_commit_w_auto_id_entities(self):
266269
_DATASET = 'DATASET'
@@ -274,7 +277,8 @@ def test_commit_w_auto_id_entities(self):
274277

275278
batch.commit()
276279

277-
self.assertEqual(connection._committed, [(_DATASET, batch.mutation)])
280+
self.assertEqual(connection._committed,
281+
[(_DATASET, batch.mutation, None)])
278282
self.assertFalse(key.is_partial)
279283
self.assertEqual(key._id, _NEW_ID)
280284

@@ -302,7 +306,8 @@ def test_as_context_mgr_wo_error(self):
302306
self.assertEqual(upserts[0].key, key._key)
303307
deletes = list(batch.mutation.delete)
304308
self.assertEqual(len(deletes), 0)
305-
self.assertEqual(connection._committed, [(_DATASET, batch.mutation)])
309+
self.assertEqual(connection._committed,
310+
[(_DATASET, batch.mutation, None)])
306311

307312
def test_as_context_mgr_nested(self):
308313
from gcloud.datastore.batch import _BATCHES
@@ -346,8 +351,8 @@ def test_as_context_mgr_nested(self):
346351
self.assertEqual(len(deletes), 0)
347352

348353
self.assertEqual(connection._committed,
349-
[(_DATASET, batch2.mutation),
350-
(_DATASET, batch1.mutation)])
354+
[(_DATASET, batch2.mutation, None),
355+
(_DATASET, batch1.mutation, None)])
351356

352357
def test_as_context_mgr_w_error(self):
353358
from gcloud.datastore.batch import _BATCHES
@@ -406,8 +411,8 @@ def __init__(self, *new_keys):
406411
self._commit_result = _CommitResult(*new_keys)
407412
self._committed = []
408413

409-
def commit(self, dataset_id, mutation):
410-
self._committed.append((dataset_id, mutation))
414+
def commit(self, dataset_id, mutation, transaction_id):
415+
self._committed.append((dataset_id, mutation, transaction_id))
411416
return self._commit_result
412417

413418

gcloud/datastore/test_connection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,7 @@ def test_commit_wo_transaction(self):
707707
'commit',
708708
])
709709
http = conn._http = Http({'status': '200'}, rsp_pb.SerializeToString())
710-
result = conn.commit(DATASET_ID, mutation)
710+
result = conn.commit(DATASET_ID, mutation, None)
711711
self.assertEqual(result.index_updates, 0)
712712
self.assertEqual(list(result.insert_auto_id_key), [])
713713
cw = http._called_with

gcloud/datastore/test_transaction.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def test_commit_no_auto_ids(self):
134134
xact._mutation = mutation = object()
135135
xact.begin()
136136
xact.commit()
137-
self.assertEqual(connection._committed, (_DATASET, mutation))
137+
self.assertEqual(connection._committed, (_DATASET, mutation, 234))
138138
self.assertEqual(xact.id, None)
139139

140140
def test_commit_w_auto_ids(self):
@@ -150,7 +150,7 @@ def test_commit_w_auto_ids(self):
150150
xact._mutation = mutation = object()
151151
xact.begin()
152152
xact.commit()
153-
self.assertEqual(connection._committed, (_DATASET, mutation))
153+
self.assertEqual(connection._committed, (_DATASET, mutation, 234))
154154
self.assertEqual(xact.id, None)
155155
self.assertEqual(entity.key.path, [{'kind': _KIND, 'id': _ID}])
156156

@@ -162,7 +162,7 @@ def test_context_manager_no_raise(self):
162162
with xact:
163163
self.assertEqual(xact.id, 234)
164164
self.assertEqual(connection._begun, _DATASET)
165-
self.assertEqual(connection._committed, (_DATASET, mutation))
165+
self.assertEqual(connection._committed, (_DATASET, mutation, 234))
166166
self.assertEqual(xact.id, None)
167167

168168
def test_context_manager_w_raise(self):
@@ -210,8 +210,8 @@ def begin_transaction(self, dataset_id):
210210
def rollback(self, dataset_id, transaction_id):
211211
self._rolled_back = dataset_id, transaction_id
212212

213-
def commit(self, dataset_id, mutation):
214-
self._committed = (dataset_id, mutation)
213+
def commit(self, dataset_id, mutation, transaction_id):
214+
self._committed = (dataset_id, mutation, transaction_id)
215215
return self._commit_result
216216

217217

0 commit comments

Comments
 (0)
0