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