12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/write_transaction.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "sync/syncable/directory.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "sync/syncable/mutable_entry.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/syncable/syncable_write_transaction.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////// 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WriteTransaction member definitions 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WriteTransaction::WriteTransaction(const tracked_objects::Location& from_here, 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserShare* share) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : BaseTransaction(share), 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction_(NULL) { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction_ = new syncable::WriteTransaction(from_here, syncable::SYNCAPI, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) share->directory.get()); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WriteTransaction::WriteTransaction(const tracked_objects::Location& from_here, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserShare* share, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64* new_model_version) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : BaseTransaction(share), 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction_(NULL) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction_ = new syncable::WriteTransaction(from_here, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) share->directory.get(), 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_model_version); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WriteTransaction::~WriteTransaction() { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete transaction_; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncable::BaseTransaction* WriteTransaction::GetWrappedTrans() const { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return transaction_; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WriteTransaction::SetDataTypeContext( 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ModelType type, 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::SyncChangeProcessor::ContextRefreshStatus refresh_status, 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& context) { 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(ProtocolTypes().Has(type)); 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int field_number = GetSpecificsFieldNumberFromModelType(type); 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_pb::DataTypeContext local_context; 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetDirectory()->GetDataTypeContext(transaction_, 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch type, 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &local_context); 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (local_context.context() == context) 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!local_context.has_data_type_id()) 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch local_context.set_data_type_id(field_number); 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK_EQ(field_number, local_context.data_type_id()); 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK_GE(local_context.version(), 0); 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch local_context.set_version(local_context.version() + 1); 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch local_context.set_context(context); 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetDirectory()->SetDataTypeContext(transaction_, 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch type, 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch local_context); 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (refresh_status == syncer::SyncChangeProcessor::REFRESH_NEEDED) { 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DVLOG(1) << "Forcing refresh of type " << ModelTypeToString(type); 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Clear the progress token from the progress markers. Preserve all other 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // state, in case a GC directive was present. 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_pb::DataTypeProgressMarker progress_marker; 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetDirectory()->GetDownloadProgress(type, &progress_marker); 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch progress_marker.clear_token(); 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetDirectory()->SetDownloadProgress(type, progress_marker); 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Go through and reset the versions for all the synced entities of this 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // data type. 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetDirectory()->ResetVersionsForType(transaction_, type); 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Note that it's possible for a GetUpdatesResponse that arrives immediately 79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // after the context update to override the cleared progress markers. 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(zea): add a flag in the directory to prevent this from happening. 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // See crbug.com/360280 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WriteTransaction::UpdateEntriesMarkAttachmentAsOnServer( 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const AttachmentId& attachment_id) { 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) syncable::Directory::Metahandles handles; 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetDirectory()->GetMetahandlesByAttachmentId( 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transaction_, attachment_id.GetProto(), &handles); 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (syncable::Directory::Metahandles::iterator iter = handles.begin(); 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter != handles.end(); 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++iter) { 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) syncable::MutableEntry entry(transaction_, syncable::GET_BY_HANDLE, *iter); 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch entry.MarkAttachmentAsOnServer(attachment_id.GetProto()); 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 98