Drive: Add BatchableRequest subclass.
[chromium-blink-merge.git] / sync / internal_api / write_transaction.cc
blob5415564aca18700990111b0d41693d9ab5315bb8
1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "sync/internal_api/public/write_transaction.h"
7 #include "sync/syncable/directory.h"
8 #include "sync/syncable/mutable_entry.h"
9 #include "sync/syncable/syncable_write_transaction.h"
11 namespace syncer {
13 //////////////////////////////////////////////////////////////////////////
14 // WriteTransaction member definitions
15 WriteTransaction::WriteTransaction(const tracked_objects::Location& from_here,
16 UserShare* share)
17 : BaseTransaction(share),
18 transaction_(NULL) {
19 transaction_ = new syncable::WriteTransaction(from_here, syncable::SYNCAPI,
20 share->directory.get());
23 WriteTransaction::WriteTransaction(const tracked_objects::Location& from_here,
24 UserShare* share,
25 int64* new_model_version)
26 : BaseTransaction(share),
27 transaction_(NULL) {
28 transaction_ = new syncable::WriteTransaction(from_here,
29 share->directory.get(),
30 new_model_version);
33 WriteTransaction::~WriteTransaction() {
34 delete transaction_;
37 syncable::BaseTransaction* WriteTransaction::GetWrappedTrans() const {
38 return transaction_;
41 void WriteTransaction::SetDataTypeContext(
42 ModelType type,
43 syncer::SyncChangeProcessor::ContextRefreshStatus refresh_status,
44 const std::string& context) {
45 DCHECK(ProtocolTypes().Has(type));
46 int field_number = GetSpecificsFieldNumberFromModelType(type);
47 sync_pb::DataTypeContext local_context;
48 GetDirectory()->GetDataTypeContext(transaction_,
49 type,
50 &local_context);
51 if (local_context.context() == context)
52 return;
54 if (!local_context.has_data_type_id())
55 local_context.set_data_type_id(field_number);
57 DCHECK_EQ(field_number, local_context.data_type_id());
58 DCHECK_GE(local_context.version(), 0);
59 local_context.set_version(local_context.version() + 1);
60 local_context.set_context(context);
61 GetDirectory()->SetDataTypeContext(transaction_,
62 type,
63 local_context);
64 if (refresh_status == syncer::SyncChangeProcessor::REFRESH_NEEDED) {
65 DVLOG(1) << "Forcing refresh of type " << ModelTypeToString(type);
66 // Clear the progress token from the progress markers. Preserve all other
67 // state, in case a GC directive was present.
68 sync_pb::DataTypeProgressMarker progress_marker;
69 GetDirectory()->GetDownloadProgress(type, &progress_marker);
70 progress_marker.clear_token();
71 GetDirectory()->SetDownloadProgress(type, progress_marker);
73 // Go through and reset the versions for all the synced entities of this
74 // data type.
75 GetDirectory()->ResetVersionsForType(transaction_, type);
78 // Note that it's possible for a GetUpdatesResponse that arrives immediately
79 // after the context update to override the cleared progress markers.
80 // TODO(zea): add a flag in the directory to prevent this from happening.
81 // See crbug.com/360280
84 void WriteTransaction::UpdateEntriesMarkAttachmentAsOnServer(
85 const AttachmentId& attachment_id) {
86 syncable::Directory::Metahandles handles;
87 GetDirectory()->GetMetahandlesByAttachmentId(
88 transaction_, attachment_id.GetProto(), &handles);
89 for (syncable::Directory::Metahandles::iterator iter = handles.begin();
90 iter != handles.end();
91 ++iter) {
92 syncable::MutableEntry entry(transaction_, syncable::GET_BY_HANDLE, *iter);
93 entry.MarkAttachmentAsOnServer(attachment_id.GetProto());
97 } // namespace syncer