Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Unified Diff: sync/engine/build_commit_command.cc

Issue 25638003: sync: Implement per-type commit interface (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Attempt to fix win compile Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sync/engine/build_commit_command.h ('k') | sync/engine/commit.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sync/engine/build_commit_command.cc
diff --git a/sync/engine/build_commit_command.cc b/sync/engine/build_commit_command.cc
deleted file mode 100644
index 65f1cdfb9cf7616692547406ae3f13a5a07579a6..0000000000000000000000000000000000000000
--- a/sync/engine/build_commit_command.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright 2012 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 "sync/engine/build_commit_command.h"
-
-#include <limits>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "base/strings/string_util.h"
-#include "sync/engine/syncer_proto_util.h"
-#include "sync/internal_api/public/base/unique_position.h"
-#include "sync/protocol/bookmark_specifics.pb.h"
-#include "sync/protocol/sync.pb.h"
-#include "sync/sessions/ordered_commit_set.h"
-#include "sync/sessions/sync_session.h"
-#include "sync/syncable/directory.h"
-#include "sync/syncable/entry.h"
-#include "sync/syncable/syncable_base_transaction.h"
-#include "sync/syncable/syncable_changes_version.h"
-#include "sync/syncable/syncable_proto_util.h"
-#include "sync/util/time.h"
-
-using std::set;
-using std::string;
-using std::vector;
-
-namespace syncer {
-
-using sessions::SyncSession;
-using syncable::Entry;
-using syncable::IS_DEL;
-using syncable::IS_UNAPPLIED_UPDATE;
-using syncable::IS_UNSYNCED;
-using syncable::Id;
-using syncable::SPECIFICS;
-using syncable::UNIQUE_POSITION;
-
-BuildCommitCommand::BuildCommitCommand(
- syncable::BaseTransaction* trans,
- const sessions::OrderedCommitSet& batch_commit_set,
- sync_pb::ClientToServerMessage* commit_message,
- ExtensionsActivity::Records* extensions_activity_buffer)
- : trans_(trans),
- batch_commit_set_(batch_commit_set),
- commit_message_(commit_message),
- extensions_activity_buffer_(extensions_activity_buffer) {
-}
-
-BuildCommitCommand::~BuildCommitCommand() {}
-
-void BuildCommitCommand::AddExtensionsActivityToMessage(
- SyncSession* session, sync_pb::CommitMessage* message) {
- // We only send ExtensionsActivity to the server if bookmarks are being
- // committed.
- ExtensionsActivity* activity = session->context()->extensions_activity();
- if (batch_commit_set_.HasBookmarkCommitId()) {
- // This isn't perfect, since the set of extensions activity may not
- // correlate exactly with the items being committed. That's OK as
- // long as we're looking for a rough estimate of extensions activity,
- // not an precise mapping of which commits were triggered by which
- // extension.
- //
- // We will push this list of extensions activity back into the
- // ExtensionsActivityMonitor if this commit fails. That's why we must keep
- // a copy of these records in the session.
- activity->GetAndClearRecords(extensions_activity_buffer_);
-
- const ExtensionsActivity::Records& records =
- *extensions_activity_buffer_;
- for (ExtensionsActivity::Records::const_iterator it =
- records.begin();
- it != records.end(); ++it) {
- sync_pb::ChromiumExtensionsActivity* activity_message =
- message->add_extensions_activity();
- activity_message->set_extension_id(it->second.extension_id);
- activity_message->set_bookmark_writes_since_last_commit(
- it->second.bookmark_write_count);
- }
- }
-}
-
-void BuildCommitCommand::AddClientConfigParamsToMessage(
- SyncSession* session, sync_pb::CommitMessage* message) {
- const ModelSafeRoutingInfo& routing_info = session->context()->routing_info();
- sync_pb::ClientConfigParams* config_params = message->mutable_config_params();
- for (std::map<ModelType, ModelSafeGroup>::const_iterator iter =
- routing_info.begin(); iter != routing_info.end(); ++iter) {
- if (ProxyTypes().Has(iter->first))
- continue;
- int field_number = GetSpecificsFieldNumberFromModelType(iter->first);
- config_params->mutable_enabled_type_ids()->Add(field_number);
- }
- config_params->set_tabs_datatype_enabled(
- routing_info.count(syncer::PROXY_TABS) > 0);
-}
-
-namespace {
-void SetEntrySpecifics(const Entry& meta_entry,
- sync_pb::SyncEntity* sync_entry) {
- // Add the new style extension and the folder bit.
- sync_entry->mutable_specifics()->CopyFrom(meta_entry.GetSpecifics());
- sync_entry->set_folder(meta_entry.GetIsDir());
-
- CHECK(!sync_entry->specifics().password().has_client_only_encrypted_data());
- DCHECK_EQ(meta_entry.GetModelType(), GetModelType(*sync_entry));
-}
-} // namespace
-
-SyncerError BuildCommitCommand::ExecuteImpl(SyncSession* session) {
- commit_message_->set_share(session->context()->account_name());
- commit_message_->set_message_contents(sync_pb::ClientToServerMessage::COMMIT);
-
- sync_pb::CommitMessage* commit_message = commit_message_->mutable_commit();
- commit_message->set_cache_guid(trans_->directory()->cache_guid());
- AddExtensionsActivityToMessage(session, commit_message);
- AddClientConfigParamsToMessage(session, commit_message);
-
- for (size_t i = 0; i < batch_commit_set_.Size(); i++) {
- int64 handle = batch_commit_set_.GetCommitHandleAt(i);
- sync_pb::SyncEntity* sync_entry = commit_message->add_entries();
-
- Entry meta_entry(trans_, syncable::GET_BY_HANDLE, handle);
- CHECK(meta_entry.good());
-
- DCHECK_NE(0UL,
- session->context()->routing_info().count(
- meta_entry.GetModelType()))
- << "Committing change to datatype that's not actively enabled.";
-
- BuildCommitItem(meta_entry, sync_entry);
- }
-
-
- return SYNCER_OK;
-}
-
-// static.
-void BuildCommitCommand::BuildCommitItem(
- const syncable::Entry& meta_entry,
- sync_pb::SyncEntity* sync_entry) {
- syncable::Id id = meta_entry.GetId();
- sync_entry->set_id_string(SyncableIdToProto(id));
-
- string name = meta_entry.GetNonUniqueName();
- CHECK(!name.empty()); // Make sure this isn't an update.
- // Note: Truncation is also performed in WriteNode::SetTitle(..). But this
- // call is still necessary to handle any title changes that might originate
- // elsewhere, or already be persisted in the directory.
- TruncateUTF8ToByteSize(name, 255, &name);
- sync_entry->set_name(name);
-
- // Set the non_unique_name. If we do, the server ignores
- // the |name| value (using |non_unique_name| instead), and will return
- // in the CommitResponse a unique name if one is generated.
- // We send both because it may aid in logging.
- sync_entry->set_non_unique_name(name);
-
- if (!meta_entry.GetUniqueClientTag().empty()) {
- sync_entry->set_client_defined_unique_tag(
- meta_entry.GetUniqueClientTag());
- }
-
- // Deleted items with server-unknown parent ids can be a problem so we set
- // the parent to 0. (TODO(sync): Still true in protocol?).
- Id new_parent_id;
- if (meta_entry.GetIsDel() &&
- !meta_entry.GetParentId().ServerKnows()) {
- new_parent_id = syncable::BaseTransaction::root_id();
- } else {
- new_parent_id = meta_entry.GetParentId();
- }
- sync_entry->set_parent_id_string(SyncableIdToProto(new_parent_id));
-
- // If our parent has changed, send up the old one so the server
- // can correctly deal with multiple parents.
- // TODO(nick): With the server keeping track of the primary sync parent,
- // it should not be necessary to provide the old_parent_id: the version
- // number should suffice.
- if (new_parent_id != meta_entry.GetServerParentId() &&
- 0 != meta_entry.GetBaseVersion() &&
- syncable::CHANGES_VERSION != meta_entry.GetBaseVersion()) {
- sync_entry->set_old_parent_id(
- SyncableIdToProto(meta_entry.GetServerParentId()));
- }
-
- int64 version = meta_entry.GetBaseVersion();
- if (syncable::CHANGES_VERSION == version || 0 == version) {
- // Undeletions are only supported for items that have a client tag.
- DCHECK(!id.ServerKnows() ||
- !meta_entry.GetUniqueClientTag().empty())
- << meta_entry;
-
- // Version 0 means to create or undelete an object.
- sync_entry->set_version(0);
- } else {
- DCHECK(id.ServerKnows()) << meta_entry;
- sync_entry->set_version(meta_entry.GetBaseVersion());
- }
- sync_entry->set_ctime(TimeToProtoTime(meta_entry.GetCtime()));
- sync_entry->set_mtime(TimeToProtoTime(meta_entry.GetMtime()));
-
- // Deletion is final on the server, let's move things and then delete them.
- if (meta_entry.GetIsDel()) {
- sync_entry->set_deleted(true);
- } else {
- if (meta_entry.GetSpecifics().has_bookmark()) {
- // Both insert_after_item_id and position_in_parent fields are set only
- // for legacy reasons. See comments in sync.proto for more information.
- const Id& prev_id = meta_entry.GetPredecessorId();
- string prev_id_string =
- prev_id.IsRoot() ? string() : prev_id.GetServerId();
- sync_entry->set_insert_after_item_id(prev_id_string);
- sync_entry->set_position_in_parent(
- meta_entry.GetUniquePosition().ToInt64());
- meta_entry.GetUniquePosition().ToProto(
- sync_entry->mutable_unique_position());
- }
- SetEntrySpecifics(meta_entry, sync_entry);
- }
-}
-
-} // namespace syncer
« no previous file with comments | « sync/engine/build_commit_command.h ('k') | sync/engine/commit.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698