| Index: chrome/browser/sync/engine/update_applicator.cc
|
| ===================================================================
|
| --- chrome/browser/sync/engine/update_applicator.cc (revision 0)
|
| +++ chrome/browser/sync/engine/update_applicator.cc (revision 0)
|
| @@ -0,0 +1,98 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/sync/engine/update_applicator.h"
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/logging.h"
|
| +#include "chrome/browser/sync/engine/syncer_util.h"
|
| +#include "chrome/browser/sync/syncable/syncable.h"
|
| +#include "chrome/browser/sync/syncable/syncable_id.h"
|
| +
|
| +using std::vector;
|
| +
|
| +namespace browser_sync {
|
| +
|
| +UpdateApplicator::UpdateApplicator(SyncerSession* session,
|
| + const vi64iter& begin,
|
| + const vi64iter& end)
|
| + : session_(session), begin_(begin), end_(end), pointer_(begin),
|
| + progress_(false) {
|
| + size_t item_count = end - begin;
|
| + LOG(INFO) << "UpdateApplicator created for " << item_count << " items.";
|
| + successful_ids_.reserve(item_count);
|
| + }
|
| +
|
| +// returns true if there's more to do.
|
| +bool UpdateApplicator::AttemptOneApplication(
|
| + syncable::WriteTransaction* trans) {
|
| + // If there are no updates left to consider, we're done.
|
| + if (end_ == begin_)
|
| + return false;
|
| + if (pointer_ == end_) {
|
| + if (!progress_)
|
| + return false;
|
| +
|
| + LOG(INFO) << "UpdateApplicator doing additional pass.";
|
| + pointer_ = begin_;
|
| + progress_ = false;
|
| +
|
| + // Clear the tracked failures to avoid double-counting.
|
| + conflicting_ids_.clear();
|
| + blocked_ids_.clear();
|
| + }
|
| + syncable::MutableEntry entry(trans, syncable::GET_BY_HANDLE, *pointer_);
|
| + UpdateAttemptResponse updateResponse =
|
| + SyncerUtil::AttemptToUpdateEntry(trans, &entry, session_);
|
| + switch (updateResponse) {
|
| + case SUCCESS:
|
| + --end_;
|
| + *pointer_ = *end_;
|
| + progress_ = true;
|
| + successful_ids_.push_back(entry.Get(syncable::ID));
|
| + break;
|
| + case CONFLICT:
|
| + pointer_++;
|
| + conflicting_ids_.push_back(entry.Get(syncable::ID));
|
| + break;
|
| + case BLOCKED:
|
| + pointer_++;
|
| + blocked_ids_.push_back(entry.Get(syncable::ID));
|
| + break;
|
| + }
|
| + LOG(INFO) << "Apply Status for " << entry.Get(syncable::META_HANDLE)
|
| + << " is " << updateResponse;
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool UpdateApplicator::AllUpdatesApplied() const {
|
| + return conflicting_ids_.empty() && blocked_ids_.empty() &&
|
| + begin_ == end_;
|
| +}
|
| +
|
| +void UpdateApplicator::SaveProgressIntoSessionState() {
|
| + DCHECK(begin_ == end_ || ((pointer_ == end_) && !progress_))
|
| + << "SaveProgress called before updates exhausted.";
|
| +
|
| + vector<syncable::Id>::const_iterator i;
|
| + for (i = conflicting_ids_.begin(); i != conflicting_ids_.end(); ++i) {
|
| + session_->EraseBlockedItem(*i);
|
| + session_->AddCommitConflict(*i);
|
| + session_->AddAppliedUpdate(CONFLICT, *i);
|
| + }
|
| + for (i = blocked_ids_.begin(); i != blocked_ids_.end(); ++i) {
|
| + session_->AddBlockedItem(*i);
|
| + session_->EraseCommitConflict(*i);
|
| + session_->AddAppliedUpdate(BLOCKED, *i);
|
| + }
|
| + for (i = successful_ids_.begin(); i != successful_ids_.end(); ++i) {
|
| + session_->EraseCommitConflict(*i);
|
| + session_->EraseBlockedItem(*i);
|
| + session_->AddAppliedUpdate(SUCCESS, *i);
|
| + }
|
| +}
|
| +
|
| +} // namespace browser_sync
|
|
|
| Property changes on: chrome\browser\sync\engine\update_applicator.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|