Index: sync/syncable/write_transaction.cc |
diff --git a/sync/syncable/write_transaction.cc b/sync/syncable/write_transaction.cc |
index 09759b6194eccb7b47debe2ebe491aaecc21a78a..bbd9dc410e65d83aeece581a68a252642276dcdc 100644 |
--- a/sync/syncable/write_transaction.cc |
+++ b/sync/syncable/write_transaction.cc |
@@ -6,16 +6,30 @@ |
#include "sync/syncable/directory.h" |
#include "sync/syncable/directory_change_delegate.h" |
+#include "sync/syncable/mutable_entry.h" |
#include "sync/syncable/transaction_observer.h" |
#include "sync/syncable/write_transaction_info.h" |
namespace syncer { |
namespace syncable { |
+const int64 kInvalidTransactionVersion = -1; |
+ |
WriteTransaction::WriteTransaction(const tracked_objects::Location& location, |
WriterTag writer, Directory* directory) |
- : BaseTransaction(location, "WriteTransaction", writer, directory) { |
+ : BaseTransaction(location, "WriteTransaction", writer, directory), |
+ transaction_version_(NULL) { |
+ Lock(); |
+} |
+ |
+WriteTransaction::WriteTransaction(const tracked_objects::Location& location, |
+ Directory* directory, |
+ int64* transaction_version) |
+ : BaseTransaction(location, "WriteTransaction", SYNCAPI, directory), |
+ transaction_version_(transaction_version) { |
Lock(); |
+ if (transaction_version_) |
+ *transaction_version_ = kInvalidTransactionVersion; |
} |
void WriteTransaction::SaveOriginal(const EntryKernel* entry) { |
@@ -82,13 +96,15 @@ ModelTypeSet WriteTransaction::NotifyTransactionChangingAndEnding( |
ImmutableWriteTransactionInfo immutable_write_transaction_info( |
&write_transaction_info); |
DirectoryChangeDelegate* const delegate = directory_->kernel_->delegate; |
+ std::vector<int64> entry_changed; |
if (writer_ == syncable::SYNCAPI) { |
delegate->HandleCalculateChangesChangeEventFromSyncApi( |
- immutable_write_transaction_info, this); |
+ immutable_write_transaction_info, this, &entry_changed); |
} else { |
delegate->HandleCalculateChangesChangeEventFromSyncer( |
- immutable_write_transaction_info, this); |
+ immutable_write_transaction_info, this, &entry_changed); |
} |
+ UpdateTransactionVersion(entry_changed); |
ModelTypeSet models_with_changes = |
delegate->HandleTransactionEndingChangeEvent( |
@@ -107,6 +123,30 @@ void WriteTransaction::NotifyTransactionComplete( |
models_with_changes); |
} |
+void WriteTransaction::UpdateTransactionVersion( |
+ const std::vector<int64>& entry_changed) { |
+ syncer::ModelTypeSet type_seen; |
+ for (uint32 i = 0; i < entry_changed.size(); ++i) { |
+ MutableEntry entry(this, GET_BY_HANDLE, entry_changed[i]); |
+ if (entry.good()) { |
+ ModelType type = GetModelTypeFromSpecifics(entry.Get(SPECIFICS)); |
+ if (type < FIRST_REAL_MODEL_TYPE) |
+ continue; |
+ if (!type_seen.Has(type)) { |
+ directory_->IncrementTransactionVersion(type); |
+ type_seen.Put(type); |
+ } |
+ entry.Put(TRANSACTION_VERSION, directory_->GetTransactionVersion(type)); |
+ } |
+ } |
+ |
+ if (!type_seen.Empty() && transaction_version_) { |
+ DCHECK_EQ(1u, type_seen.Size()); |
+ *transaction_version_ = directory_->GetTransactionVersion( |
+ type_seen.First().Get()); |
+ } |
+} |
+ |
WriteTransaction::~WriteTransaction() { |
const ImmutableEntryKernelMutationMap& mutations = RecordMutations(); |
directory()->CheckInvariantsOnTransactionClose(this, mutations.Get()); |