diff options
author | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-22 00:57:51 +0000 |
---|---|---|
committer | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-22 00:57:51 +0000 |
commit | 2fc32da1d5ce09de63658853a0972a32cca5e46c (patch) | |
tree | a769e0a3fb81a928439798609071f249ea213726 /chrome | |
parent | e62a23a8d9f3ace39422d38c4dd821b05a53c6e4 (diff) | |
download | chromium_src-2fc32da1d5ce09de63658853a0972a32cca5e46c.zip chromium_src-2fc32da1d5ce09de63658853a0972a32cca5e46c.tar.gz chromium_src-2fc32da1d5ce09de63658853a0972a32cca5e46c.tar.bz2 |
[Sync] use base::Time in sync
Make EntryKernel/Entry/BaseNode use base::Time instead of int64s.
Add sync/util/time.h, with utility functions to manage the sync proto
time format.
Store times on disk in proto format instead of the local system.
This requires a database version bump (to 77).
Update SessionChangeProcessor/SessionModelAssociator
to use base::Time, too.
Remove hackish Now() function.
Remove ZeroFields() function, and instead zero-initialize in EntryKernel::EntryKernel() directly.
BUG=
TEST=
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=102184
Review URL: http://codereview.chromium.org/7981006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@102218 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
30 files changed, 940 insertions, 422 deletions
diff --git a/chrome/browser/sync/engine/build_commit_command.cc b/chrome/browser/sync/engine/build_commit_command.cc index 98d0095..6b0e02f 100644 --- a/chrome/browser/sync/engine/build_commit_command.cc +++ b/chrome/browser/sync/engine/build_commit_command.cc @@ -11,11 +11,11 @@ #include "base/string_util.h" #include "chrome/browser/sync/engine/syncer_proto_util.h" -#include "chrome/browser/sync/engine/syncer_util.h" #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" #include "chrome/browser/sync/sessions/sync_session.h" #include "chrome/browser/sync/syncable/syncable.h" #include "chrome/browser/sync/syncable/syncable_changes_version.h" +#include "chrome/browser/sync/util/time.h" using std::set; using std::string; @@ -172,10 +172,8 @@ void BuildCommitCommand::ExecuteImpl(SyncSession* session) { DCHECK(id.ServerKnows()) << meta_entry; sync_entry->set_version(meta_entry.Get(syncable::BASE_VERSION)); } - sync_entry->set_ctime(ClientTimeToServerTime( - meta_entry.Get(syncable::CTIME))); - sync_entry->set_mtime(ClientTimeToServerTime( - meta_entry.Get(syncable::MTIME))); + sync_entry->set_ctime(TimeToProtoTime(meta_entry.Get(syncable::CTIME))); + sync_entry->set_mtime(TimeToProtoTime(meta_entry.Get(syncable::MTIME))); // Deletion is final on the server, let's move things and then delete them. if (meta_entry.Get(IS_DEL)) { diff --git a/chrome/browser/sync/engine/process_commit_response_command.cc b/chrome/browser/sync/engine/process_commit_response_command.cc index 49f1fbf..3dfe591 100644 --- a/chrome/browser/sync/engine/process_commit_response_command.cc +++ b/chrome/browser/sync/engine/process_commit_response_command.cc @@ -16,6 +16,7 @@ #include "chrome/browser/sync/sessions/sync_session.h" #include "chrome/browser/sync/syncable/directory_manager.h" #include "chrome/browser/sync/syncable/syncable.h" +#include "chrome/browser/sync/util/time.h" using syncable::ScopedDirLookup; using syncable::WriteTransaction; @@ -380,9 +381,9 @@ void ProcessCommitResponseCommand::UpdateServerFieldsAfterCommit( local_entry->Put(syncable::SERVER_SPECIFICS, committed_entry.specifics()); local_entry->Put(syncable::SERVER_MTIME, - committed_entry.mtime()); + ProtoTimeToTime(committed_entry.mtime())); local_entry->Put(syncable::SERVER_CTIME, - committed_entry.ctime()); + ProtoTimeToTime(committed_entry.ctime())); local_entry->Put(syncable::SERVER_POSITION_IN_PARENT, entry_response.position_in_parent()); // TODO(nick): The server doesn't set entry_response.server_parent_id in diff --git a/chrome/browser/sync/engine/syncer.cc b/chrome/browser/sync/engine/syncer.cc index cf7cd97..bffcee6 100644 --- a/chrome/browser/sync/engine/syncer.cc +++ b/chrome/browser/sync/engine/syncer.cc @@ -23,13 +23,13 @@ #include "chrome/browser/sync/engine/store_timestamps_command.h" #include "chrome/browser/sync/engine/syncer_end_command.h" #include "chrome/browser/sync/engine/syncer_types.h" -#include "chrome/browser/sync/engine/syncer_util.h" #include "chrome/browser/sync/engine/syncproto.h" #include "chrome/browser/sync/engine/verify_updates_command.h" #include "chrome/browser/sync/syncable/directory_manager.h" #include "chrome/browser/sync/syncable/syncable-inl.h" #include "chrome/browser/sync/syncable/syncable.h" +using base::Time; using base::TimeDelta; using sync_pb::ClientCommand; using syncable::Blob; @@ -344,8 +344,8 @@ void CopyServerFields(syncable::Entry* src, syncable::MutableEntry* dest) { void ClearServerData(syncable::MutableEntry* entry) { entry->Put(SERVER_NON_UNIQUE_NAME, ""); entry->Put(SERVER_PARENT_ID, syncable::GetNullId()); - entry->Put(SERVER_MTIME, 0); - entry->Put(SERVER_CTIME, 0); + entry->Put(SERVER_MTIME, Time()); + entry->Put(SERVER_CTIME, Time()); entry->Put(SERVER_VERSION, 0); entry->Put(SERVER_IS_DIR, false); entry->Put(SERVER_IS_DEL, false); diff --git a/chrome/browser/sync/engine/syncer_proto_util.cc b/chrome/browser/sync/engine/syncer_proto_util.cc index f382793..26eed05 100644 --- a/chrome/browser/sync/engine/syncer_proto_util.cc +++ b/chrome/browser/sync/engine/syncer_proto_util.cc @@ -9,7 +9,6 @@ #include "chrome/browser/sync/engine/net/server_connection_manager.h" #include "chrome/browser/sync/engine/syncer.h" #include "chrome/browser/sync/engine/syncer_types.h" -#include "chrome/browser/sync/engine/syncer_util.h" #include "chrome/browser/sync/protocol/service_constants.h" #include "chrome/browser/sync/protocol/sync.pb.h" #include "chrome/browser/sync/protocol/sync_protocol_error.h" @@ -18,6 +17,7 @@ #include "chrome/browser/sync/syncable/model_type.h" #include "chrome/browser/sync/syncable/syncable-inl.h" #include "chrome/browser/sync/syncable/syncable.h" +#include "chrome/browser/sync/util/time.h" using browser_sync::SyncProtocolErrorType; using std::string; @@ -364,7 +364,7 @@ bool SyncerProtoUtil::Compare(const syncable::Entry& local_entry, if (local_entry.Get(IS_DEL) && server_entry.deleted()) return true; - if (!ClientAndServerTimeMatch(local_entry.Get(CTIME), server_entry.ctime())) { + if (local_entry.Get(CTIME) != ProtoTimeToTime(server_entry.ctime())) { LOG(WARNING) << "ctime mismatch"; return false; } @@ -389,8 +389,7 @@ bool SyncerProtoUtil::Compare(const syncable::Entry& local_entry, return false; } if (!local_entry.Get(IS_DIR) && - !ClientAndServerTimeMatch(local_entry.Get(MTIME), - server_entry.mtime())) { + (local_entry.Get(MTIME) != ProtoTimeToTime(server_entry.mtime()))) { LOG(WARNING) << "mtime mismatch"; return false; } @@ -438,18 +437,22 @@ const std::string& SyncerProtoUtil::NameFromCommitEntryResponse( std::string SyncerProtoUtil::SyncEntityDebugString( const sync_pb::SyncEntity& entry) { + const std::string& mtime_str = + GetTimeDebugString(ProtoTimeToTime(entry.mtime())); + const std::string& ctime_str = + GetTimeDebugString(ProtoTimeToTime(entry.ctime())); return base::StringPrintf( "id: %s, parent_id: %s, " "version: %"PRId64"d, " - "mtime: %" PRId64"d (client: %" PRId64"d), " - "ctime: %" PRId64"d (client: %" PRId64"d), " + "mtime: %" PRId64"d (%s), " + "ctime: %" PRId64"d (%s), " "name: %s, sync_timestamp: %" PRId64"d, " "%s ", entry.id_string().c_str(), entry.parent_id_string().c_str(), entry.version(), - entry.mtime(), ServerTimeToClientTime(entry.mtime()), - entry.ctime(), ServerTimeToClientTime(entry.ctime()), + entry.mtime(), mtime_str.c_str(), + entry.ctime(), ctime_str.c_str(), entry.name().c_str(), entry.sync_timestamp(), entry.deleted() ? "deleted, ":""); } diff --git a/chrome/browser/sync/engine/syncer_unittest.cc b/chrome/browser/sync/engine/syncer_unittest.cc index 1fd48e4..2310b36 100644 --- a/chrome/browser/sync/engine/syncer_unittest.cc +++ b/chrome/browser/sync/engine/syncer_unittest.cc @@ -18,6 +18,7 @@ #include "base/memory/scoped_ptr.h" #include "base/string_number_conversions.h" #include "base/stringprintf.h" +#include "base/time.h" #include "build/build_config.h" #include "chrome/browser/sync/engine/conflict_resolver.h" #include "chrome/browser/sync/engine/get_commit_ids_command.h" @@ -39,6 +40,7 @@ #include "chrome/browser/sync/test/engine/test_directory_setter_upper.h" #include "chrome/browser/sync/test/engine/test_id_factory.h" #include "chrome/browser/sync/test/engine/test_syncable_utils.h" +#include "chrome/browser/sync/util/time.h" #include "testing/gtest/include/gtest/gtest.h" using base::TimeDelta; @@ -314,9 +316,10 @@ class SyncerTest : public testing::Test, entry.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); // Set the time to 30 seconds in the future to reduce the chance of // flaky tests. - int64 now_server_time = ClientTimeToServerTime(syncable::Now()); - int64 now_plus_30s = ServerTimeToClientTime(now_server_time + 30000); - int64 now_minus_2h = ServerTimeToClientTime(now_server_time - 7200000); + const base::Time& now_plus_30s = + base::Time::Now() + base::TimeDelta::FromSeconds(30); + const base::Time& now_minus_2h = + base::Time::Now() - base::TimeDelta::FromHours(2); entry.Put(syncable::MTIME, now_plus_30s); for (size_t i = 0 ; i < arraysize(test->features) ; ++i) { switch (test->features[i]) { @@ -894,9 +897,8 @@ TEST_F(SyncerTest, TestCommitListOrderingDeleteMovedItems) { TEST_F(SyncerTest, TestCommitListOrderingWithNesting) { ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); ASSERT_TRUE(dir.good()); - int64 now_server_time = ClientTimeToServerTime(syncable::Now()); - int64 now_minus_2h = ServerTimeToClientTime(now_server_time - 7200000); - + const base::Time& now_minus_2h = + base::Time::Now() - base::TimeDelta::FromHours(2); { WriteTransaction wtrans(FROM_HERE, UNITTEST, dir); { @@ -1970,7 +1972,7 @@ TEST_F(SyncerTest, DoublyChangedWithResolver) { TEST_F(SyncerTest, CommitsUpdateDoesntAlterEntry) { ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); CHECK(dir.good()); - int64 test_time = 123456; + const base::Time& test_time = ProtoTimeToTime(123456); int64 entry_metahandle; { WriteTransaction wtrans(FROM_HERE, UNITTEST, dir); diff --git a/chrome/browser/sync/engine/syncer_util.cc b/chrome/browser/sync/engine/syncer_util.cc index ba21c3a..8b8e5ef 100644 --- a/chrome/browser/sync/engine/syncer_util.cc +++ b/chrome/browser/sync/engine/syncer_util.cc @@ -23,6 +23,7 @@ #include "chrome/browser/sync/syncable/model_type.h" #include "chrome/browser/sync/syncable/syncable.h" #include "chrome/browser/sync/syncable/syncable_changes_version.h" +#include "chrome/browser/sync/util/time.h" using syncable::BASE_VERSION; using syncable::Blob; @@ -425,10 +426,8 @@ void SyncerUtil::UpdateServerFieldsFromUpdate( target->Put(SERVER_PARENT_ID, update.parent_id()); target->Put(SERVER_NON_UNIQUE_NAME, name); target->Put(SERVER_VERSION, update.version()); - target->Put(SERVER_CTIME, - ServerTimeToClientTime(update.ctime())); - target->Put(SERVER_MTIME, - ServerTimeToClientTime(update.mtime())); + target->Put(SERVER_CTIME, ProtoTimeToTime(update.ctime())); + target->Put(SERVER_MTIME, ProtoTimeToTime(update.mtime())); target->Put(SERVER_IS_DIR, update.IsFolder()); if (update.has_server_defined_unique_tag()) { const std::string& tag = update.server_defined_unique_tag(); @@ -495,8 +494,7 @@ bool SyncerUtil::ServerAndLocalOrdersMatch(syncable::Entry* entry) { // static bool SyncerUtil::ServerAndLocalEntriesMatch(syncable::Entry* entry) { - if (!ClientAndServerTimeMatch( - entry->Get(CTIME), ClientTimeToServerTime(entry->Get(SERVER_CTIME)))) { + if (entry->Get(CTIME) != entry->Get(SERVER_CTIME)) { LOG(WARNING) << "Client and server time mismatch"; return false; } @@ -530,12 +528,11 @@ bool SyncerUtil::ServerAndLocalEntriesMatch(syncable::Entry* entry) { return true; // For historical reasons, a folder's MTIME changes when its contents change. // TODO(ncarter): Remove the special casing of MTIME. - bool time_match = ClientAndServerTimeMatch(entry->Get(MTIME), - ClientTimeToServerTime(entry->Get(SERVER_MTIME))); - if (!time_match) { + if (entry->Get(MTIME) != entry->Get(SERVER_MTIME)) { LOG(WARNING) << "Time mismatch"; + return false; } - return time_match; + return true; } // static diff --git a/chrome/browser/sync/engine/syncer_util.h b/chrome/browser/sync/engine/syncer_util.h index 90de980..e500e6c 100644 --- a/chrome/browser/sync/engine/syncer_util.h +++ b/chrome/browser/sync/engine/syncer_util.h @@ -13,7 +13,6 @@ #include <string> #include <vector> -#include "build/build_config.h" #include "chrome/browser/sync/engine/syncer.h" #include "chrome/browser/sync/engine/syncer_types.h" #include "chrome/browser/sync/syncable/syncable.h" @@ -140,43 +139,6 @@ class SyncerUtil { DISALLOW_IMPLICIT_CONSTRUCTORS(SyncerUtil); }; -#ifndef OS_WIN - -// time.h on Linux and Mac both return seconds since the epoch, this should -// be converted to milliseconds. -inline int64 ServerTimeToClientTime(int64 server_time) { - return server_time / GG_LONGLONG(1000); -} - -inline int64 ClientTimeToServerTime(int64 client_time) { - return client_time * GG_LONGLONG(1000); -} - -// As we truncate server times on the client for posix and on the server for -// windows we need two ClientAndServerTimeMatch fucntions. -inline bool ClientAndServerTimeMatch(int64 client_time, int64 server_time) { - // Compare at the coarser timescale (client) - return client_time == ServerTimeToClientTime(server_time); -} -#else -// The sync server uses Java Times (ms since 1970) -// and the client uses FILETIMEs (ns since 1601) so we need to convert -// between the timescales. -// TODO(sync): Fix this. No need to use two timescales. -inline int64 ServerTimeToClientTime(int64 server_time) { - return server_time * GG_LONGLONG(10000) + GG_LONGLONG(116444736000000000); -} - -inline int64 ClientTimeToServerTime(int64 client_time) { - return (client_time - GG_LONGLONG(116444736000000000)) / GG_LONGLONG(10000); -} - -inline bool ClientAndServerTimeMatch(int64 client_time, int64 server_time) { - // Compare at the coarser timescale (server) - return ClientTimeToServerTime(client_time) == server_time; -} -#endif - } // namespace browser_sync #endif // CHROME_BROWSER_SYNC_ENGINE_SYNCER_UTIL_H_ diff --git a/chrome/browser/sync/glue/session_change_processor.cc b/chrome/browser/sync/glue/session_change_processor.cc index 0344f34..cd6bbe9 100644 --- a/chrome/browser/sync/glue/session_change_processor.cc +++ b/chrome/browser/sync/glue/session_change_processor.cc @@ -244,7 +244,7 @@ void SessionChangeProcessor::ApplyChangesFromSyncModel( StartObserving(); return; } - const int64 mtime = sync_node.GetModificationTime(); + const base::Time& mtime = sync_node.GetModificationTime(); // Model associator handles foreign session update and add the same. session_model_associator_->AssociateForeignSpecifics(specifics, mtime); } diff --git a/chrome/browser/sync/glue/session_model_associator.cc b/chrome/browser/sync/glue/session_model_associator.cc index d9becf5..6b2ca7d 100644 --- a/chrome/browser/sync/glue/session_model_associator.cc +++ b/chrome/browser/sync/glue/session_model_associator.cc @@ -198,7 +198,7 @@ void SessionModelAssociator::ReassociateWindows(bool reload_tabs) { PopulateSessionWindowFromSpecifics( local_tag, window_s, - base::Time::Now().ToInternalValue(), + base::Time::Now(), current_session->windows[window_num++], &synced_session_tracker_); } @@ -338,7 +338,7 @@ bool SessionModelAssociator::WriteTabContentsToSyncModel( tab_s->tab_id(), false); PopulateSessionTabFromSpecifics(*tab_s, - base::Time::Now().ToInternalValue(), + base::Time::Now(), session_tab); return true; } @@ -581,7 +581,7 @@ bool SessionModelAssociator::UpdateAssociationsFromSyncModel( const sync_pb::SessionSpecifics& specifics = sync_node.GetSessionSpecifics(); - const int64 modification_time = sync_node.GetModificationTime(); + const base::Time& modification_time = sync_node.GetModificationTime(); if (specifics.session_tag() != GetCurrentMachineTag()) { if (!AssociateForeignSpecifics(specifics, modification_time)) { return false; @@ -620,7 +620,7 @@ bool SessionModelAssociator::UpdateAssociationsFromSyncModel( bool SessionModelAssociator::AssociateForeignSpecifics( const sync_pb::SessionSpecifics& specifics, - const int64 modification_time) { + const base::Time& modification_time) { DCHECK(CalledOnValidThread()); std::string foreign_session_tag = specifics.session_tag(); if (foreign_session_tag == GetCurrentMachineTag() && !setup_for_test_) @@ -714,7 +714,7 @@ void SessionModelAssociator::PopulateSessionHeaderFromSpecifics( void SessionModelAssociator::PopulateSessionWindowFromSpecifics( const std::string& session_tag, const sync_pb::SessionWindow& specifics, - int64 mtime, + const base::Time& mtime, SessionWindow* session_window, SyncedSessionTracker* tracker) { if (specifics.has_window_id()) @@ -729,7 +729,7 @@ void SessionModelAssociator::PopulateSessionWindowFromSpecifics( session_window->type = 2; } } - session_window->timestamp = base::Time::FromInternalValue(mtime); + session_window->timestamp = mtime; session_window->tabs.resize(specifics.tab_size()); for (int i = 0; i < specifics.tab_size(); i++) { SessionID::id_type tab_id = specifics.tab(i); @@ -741,7 +741,7 @@ void SessionModelAssociator::PopulateSessionWindowFromSpecifics( // Static void SessionModelAssociator::PopulateSessionTabFromSpecifics( const sync_pb::SessionTab& specifics, - const int64 mtime, + const base::Time& mtime, SessionTab* tab) { if (specifics.has_tab_id()) tab->tab_id.set_id(specifics.tab_id()); @@ -755,7 +755,7 @@ void SessionModelAssociator::PopulateSessionTabFromSpecifics( tab->pinned = specifics.pinned(); if (specifics.has_extension_app_id()) tab->extension_app_id = specifics.extension_app_id(); - tab->timestamp = base::Time::FromInternalValue(mtime); + tab->timestamp = mtime; tab->navigations.clear(); // In case we are reusing a previous SessionTab. for (int i = 0; i < specifics.navigation_size(); i++) { AppendSessionTabNavigation(specifics.navigation(i), &tab->navigations); diff --git a/chrome/browser/sync/glue/session_model_associator.h b/chrome/browser/sync/glue/session_model_associator.h index 61e7360..de178dd 100644 --- a/chrome/browser/sync/glue/session_model_associator.h +++ b/chrome/browser/sync/glue/session_model_associator.h @@ -18,6 +18,7 @@ #include "base/observer_list.h" #include "base/stringprintf.h" #include "base/threading/non_thread_safe.h" +#include "base/time.h" #include "base/utf_string_conversions.h" #include "chrome/browser/sessions/session_id.h" #include "chrome/browser/sessions/session_service.h" @@ -140,7 +141,7 @@ class SessionModelAssociator // Load and associate window and tab data for a foreign session bool AssociateForeignSpecifics(const sync_pb::SessionSpecifics& specifics, - int64 modification_time); + const base::Time& modification_time); // Removes a foreign session from our internal bookkeeping. void DisassociateForeignSession(const std::string& foreign_session_tag); @@ -375,13 +376,13 @@ class SessionModelAssociator static void PopulateSessionWindowFromSpecifics( const std::string& foreign_session_tag, const sync_pb::SessionWindow& window, - const int64 mtime, + const base::Time& mtime, SessionWindow* session_window, SyncedSessionTracker* tracker); // Used to populate a session tab from the session specifics tab provided. static void PopulateSessionTabFromSpecifics(const sync_pb::SessionTab& tab, - const int64 mtime, + const base::Time& mtime, SessionTab* session_tab); // Used to populate a session tab from the session specifics tab provided. diff --git a/chrome/browser/sync/glue/session_model_associator_unittest.cc b/chrome/browser/sync/glue/session_model_associator_unittest.cc index 365b652..8aa3419 100644 --- a/chrome/browser/sync/glue/session_model_associator_unittest.cc +++ b/chrome/browser/sync/glue/session_model_associator_unittest.cc @@ -89,7 +89,7 @@ TEST_F(SessionModelAssociatorTest, PopulateSessionWindow) { SessionWindow* win = new SessionWindow(); session->windows.push_back(win); SessionModelAssociator::PopulateSessionWindowFromSpecifics( - tag, window_s, 0, win, &tracker); + tag, window_s, base::Time(), win, &tracker); ASSERT_EQ(1U, win->tabs.size()); ASSERT_EQ(1, win->selected_tab_index); ASSERT_EQ(1, win->type); @@ -118,7 +118,8 @@ TEST_F(SessionModelAssociatorTest, PopulateSessionTab) { navigation->set_page_transition(sync_pb::TabNavigation_PageTransition_TYPED); SessionTab tab; - SessionModelAssociator::PopulateSessionTabFromSpecifics(tab_s, 0, &tab); + SessionModelAssociator::PopulateSessionTabFromSpecifics( + tab_s, base::Time(), &tab); ASSERT_EQ(13, tab.tab_visual_index); ASSERT_EQ(3, tab.current_navigation_index); ASSERT_TRUE(tab.pinned); diff --git a/chrome/browser/sync/internal_api/base_node.cc b/chrome/browser/sync/internal_api/base_node.cc index 849fc9b..c409b8a 100644 --- a/chrome/browser/sync/internal_api/base_node.cc +++ b/chrome/browser/sync/internal_api/base_node.cc @@ -23,6 +23,7 @@ #include "chrome/browser/sync/syncable/directory_manager.h" #include "chrome/browser/sync/syncable/syncable.h" #include "chrome/browser/sync/syncable/syncable_id.h" +#include "chrome/browser/sync/util/time.h" using syncable::SPECIFICS; using sync_pb::AutofillProfileSpecifics; @@ -174,7 +175,7 @@ int64 BaseNode::GetId() const { return GetEntry()->Get(syncable::META_HANDLE); } -int64 BaseNode::GetModificationTime() const { +const base::Time& BaseNode::GetModificationTime() const { return GetEntry()->Get(syncable::MTIME); } @@ -235,9 +236,9 @@ DictionaryValue* BaseNode::GetSummaryAsValue() const { DictionaryValue* BaseNode::GetDetailsAsValue() const { DictionaryValue* node_info = GetSummaryAsValue(); - // TODO(akalin): Return time in a better format. - node_info->SetString("modificationTime", - base::Int64ToString(GetModificationTime())); + node_info->SetString( + "modificationTime", + browser_sync::GetTimeDebugString(GetModificationTime())); node_info->SetString("parentId", base::Int64ToString(GetParentId())); // Specifics are already in the Entry value, so no need to duplicate // it here. diff --git a/chrome/browser/sync/internal_api/base_node.h b/chrome/browser/sync/internal_api/base_node.h index 8759966..a2286c3 100644 --- a/chrome/browser/sync/internal_api/base_node.h +++ b/chrome/browser/sync/internal_api/base_node.h @@ -73,8 +73,8 @@ class BaseNode { // different ID value. virtual int64 GetId() const; - // Returns the modification time of the object (in TimeTicks internal format). - int64 GetModificationTime() const; + // Returns the modification time of the object. + const base::Time& GetModificationTime() const; // Nodes are hierarchically arranged into a single-rooted tree. // InitByRootLookup on ReadNode allows access to the root. GetParentId is diff --git a/chrome/browser/sync/internal_api/syncapi_unittest.cc b/chrome/browser/sync/internal_api/syncapi_unittest.cc index 9f48680..7d1da461 100644 --- a/chrome/browser/sync/internal_api/syncapi_unittest.cc +++ b/chrome/browser/sync/internal_api/syncapi_unittest.cc @@ -50,6 +50,7 @@ #include "chrome/browser/sync/syncable/syncable_id.h" #include "chrome/browser/sync/test/engine/test_user_share.h" #include "chrome/browser/sync/util/cryptographer.h" +#include "chrome/browser/sync/util/time.h" #include "chrome/test/base/values_test_util.h" #include "content/browser/browser_thread.h" #include "testing/gmock/include/gmock/gmock.h" @@ -96,6 +97,13 @@ void ExpectInt64Value(int64 expected_value, EXPECT_EQ(expected_value, val); } +void ExpectTimeValue(const base::Time& expected_value, + const DictionaryValue& value, const std::string& key) { + std::string time_str; + EXPECT_TRUE(value.GetString(key, &time_str)); + EXPECT_EQ(browser_sync::GetTimeDebugString(expected_value), time_str); +} + // Makes a non-folder child of the root node. Returns the id of the // newly-created node. int64 MakeNode(UserShare* share, @@ -513,7 +521,7 @@ void CheckNodeValue(const BaseNode& node, const DictionaryValue& value, } if (is_detailed) { ExpectInt64Value(node.GetParentId(), value, "parentId"); - ExpectInt64Value(node.GetModificationTime(), value, "modificationTime"); + ExpectTimeValue(node.GetModificationTime(), value, "modificationTime"); ExpectInt64Value(node.GetExternalId(), value, "externalId"); ExpectInt64Value(node.GetPredecessorId(), value, "predecessorId"); ExpectInt64Value(node.GetSuccessorId(), value, "successorId"); diff --git a/chrome/browser/sync/profile_sync_service_session_unittest.cc b/chrome/browser/sync/profile_sync_service_session_unittest.cc index 6200948..ca8b54e 100644 --- a/chrome/browser/sync/profile_sync_service_session_unittest.cc +++ b/chrome/browser/sync/profile_sync_service_session_unittest.cc @@ -11,6 +11,7 @@ #include "base/scoped_temp_dir.h" #include "base/stl_util.h" #include "base/task.h" +#include "base/time.h" #include "chrome/browser/sessions/session_service_factory.h" #include "chrome/browser/sessions/session_service.h" #include "chrome/browser/sessions/session_service_test_helper.h" @@ -315,8 +316,8 @@ TEST_F(ProfileSyncServiceSessionTest, WriteForeignSessionToNode) { // Update the server with the session specifics. { - model_associator_->AssociateForeignSpecifics(meta_specifics, 0); - model_associator_->AssociateForeignSpecifics(tab_specifics, 0); + model_associator_->AssociateForeignSpecifics(meta_specifics, base::Time()); + model_associator_->AssociateForeignSpecifics(tab_specifics, base::Time()); } // Check that the foreign session was associated and retrieve the data. diff --git a/chrome/browser/sync/sessions/sync_session_unittest.cc b/chrome/browser/sync/sessions/sync_session_unittest.cc index e80fb21..7d7a715 100644 --- a/chrome/browser/sync/sessions/sync_session_unittest.cc +++ b/chrome/browser/sync/sessions/sync_session_unittest.cc @@ -10,7 +10,6 @@ #include "chrome/browser/sync/engine/conflict_resolver.h" #include "chrome/browser/sync/engine/mock_model_safe_workers.h" #include "chrome/browser/sync/engine/syncer_types.h" -#include "chrome/browser/sync/engine/syncer_util.h" #include "chrome/browser/sync/syncable/directory_manager.h" #include "chrome/browser/sync/syncable/model_type.h" #include "chrome/browser/sync/syncable/syncable.h" diff --git a/chrome/browser/sync/syncable/directory_backing_store.cc b/chrome/browser/sync/syncable/directory_backing_store.cc index be57915..6a2c546 100644 --- a/chrome/browser/sync/syncable/directory_backing_store.cc +++ b/chrome/browser/sync/syncable/directory_backing_store.cc @@ -6,10 +6,6 @@ #include "build/build_config.h" -#if defined(OS_MACOSX) -#include <CoreFoundation/CoreFoundation.h> -#endif - #include <limits> #include "base/file_util.h" @@ -19,12 +15,14 @@ #include "base/stl_util.h" #include "base/string_number_conversions.h" #include "base/stringprintf.h" +#include "base/time.h" #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" #include "chrome/browser/sync/protocol/service_constants.h" #include "chrome/browser/sync/protocol/sync.pb.h" #include "chrome/browser/sync/syncable/syncable-inl.h" #include "chrome/browser/sync/syncable/syncable_columns.h" #include "chrome/browser/sync/util/sqlite_utils.h" +#include "chrome/browser/sync/util/time.h" #include "chrome/common/random.h" #include "third_party/sqlite/sqlite3.h" @@ -44,7 +42,7 @@ static const string::size_type kUpdateStatementBufferSize = 2048; // Increment this version whenever updating DB tables. extern const int32 kCurrentDBVersion; // Global visibility for our unittest. -const int32 kCurrentDBVersion = 76; +const int32 kCurrentDBVersion = 77; namespace { @@ -76,6 +74,11 @@ int BindFields(const EntryKernel& entry, for (i = BEGIN_FIELDS; i < INT64_FIELDS_END; ++i) { statement->bind_int64(index++, entry.ref(static_cast<Int64Field>(i))); } + for ( ; i < TIME_FIELDS_END; ++i) { + statement->bind_int64(index++, + browser_sync::TimeToProtoTime( + entry.ref(static_cast<TimeField>(i)))); + } for ( ; i < ID_FIELDS_END; ++i) { statement->bind_string(index++, entry.ref(static_cast<IdField>(i)).s_); } @@ -97,14 +100,18 @@ int BindFields(const EntryKernel& entry, int UnpackEntry(sqlite_utils::SQLStatement* statement, EntryKernel** kernel) { *kernel = NULL; int query_result = statement->step(); - if (SQLITE_ROW == query_result) { - *kernel = new EntryKernel; - (*kernel)->clear_dirty(NULL); - DCHECK(statement->column_count() == static_cast<int>(FIELD_COUNT)); + if (query_result == SQLITE_ROW) { + *kernel = new EntryKernel(); + DCHECK_EQ(statement->column_count(), static_cast<int>(FIELD_COUNT)); int i = 0; for (i = BEGIN_FIELDS; i < INT64_FIELDS_END; ++i) { (*kernel)->put(static_cast<Int64Field>(i), statement->column_int64(i)); } + for ( ; i < TIME_FIELDS_END; ++i) { + (*kernel)->put(static_cast<TimeField>(i), + browser_sync::ProtoTimeToTime( + statement->column_int64(i))); + } for ( ; i < ID_FIELDS_END; ++i) { (*kernel)->mutable_ref(static_cast<IdField>(i)).s_ = statement->column_string(i); @@ -120,9 +127,8 @@ int UnpackEntry(sqlite_utils::SQLStatement* statement, EntryKernel** kernel) { (*kernel)->mutable_ref(static_cast<ProtoField>(i)).ParseFromArray( statement->column_blob(i), statement->column_bytes(i)); } - ZeroFields((*kernel), i); } else { - DCHECK(SQLITE_DONE == query_result); + DCHECK_EQ(query_result, SQLITE_DONE); (*kernel) = NULL; } return query_result; @@ -478,6 +484,13 @@ DirOpenResult DirectoryBackingStore::InitializeTables() { version_on_disk = 76; } + // Version 77 standardized all time fields to ms since the Unix + // epoch. + if (version_on_disk == 76) { + if (MigrateVersion76To77()) + version_on_disk = 77; + } + // If one of the migrations requested it, drop columns that aren't current. // It's only safe to do this after migrating all the way to the current // version. @@ -1089,6 +1102,35 @@ bool DirectoryBackingStore::MigrateVersion75To76() { return true; } +bool DirectoryBackingStore::MigrateVersion76To77() { + sqlite_utils::SQLStatement update_timestamps; + // This change changes the format of stored timestamps to ms since + // the Unix epoch. +#if defined(OS_WIN) +// On Windows, we used to store timestamps in FILETIME format (100s of +// ns since Jan 1, 1601). Magic numbers taken from +// http://stackoverflow.com/questions/5398557/java-library-for-dealing-with-win32-filetime +// . +#define TO_UNIX_TIME_MS(x) #x " = " #x " / 10000 - 11644473600000" +#else +// On other platforms, we used to store timestamps in time_t format (s +// since the Unix epoch). +#define TO_UNIX_TIME_MS(x) #x " = " #x " * 1000" +#endif + update_timestamps.prepare( + load_dbhandle_, + "UPDATE metas SET " + TO_UNIX_TIME_MS(mtime) ", " + TO_UNIX_TIME_MS(server_mtime) ", " + TO_UNIX_TIME_MS(ctime) ", " + TO_UNIX_TIME_MS(server_ctime)); +#undef TO_UNIX_TIME_MS + if (update_timestamps.step() != SQLITE_DONE) + return false; + SetVersion(77); + return true; +} + int DirectoryBackingStore::CreateTables() { VLOG(1) << "First run, creating tables"; // Create two little tables share_version and share_info @@ -1143,7 +1185,7 @@ int DirectoryBackingStore::CreateTables() { return result; { // Insert the entry for the root into the metas table. - const int64 now = Now(); + const int64 now = browser_sync::TimeToProtoTime(base::Time::Now()); sqlite_utils::SQLStatement statement; statement.prepare(load_dbhandle_, "INSERT INTO metas " diff --git a/chrome/browser/sync/syncable/directory_backing_store.h b/chrome/browser/sync/syncable/directory_backing_store.h index 259c4c4..460da33 100644 --- a/chrome/browser/sync/syncable/directory_backing_store.h +++ b/chrome/browser/sync/syncable/directory_backing_store.h @@ -84,6 +84,7 @@ class DirectoryBackingStore { FRIEND_TEST_ALL_PREFIXES(DirectoryBackingStoreTest, MigrateVersion73To74); FRIEND_TEST_ALL_PREFIXES(DirectoryBackingStoreTest, MigrateVersion74To75); FRIEND_TEST_ALL_PREFIXES(DirectoryBackingStoreTest, MigrateVersion75To76); + FRIEND_TEST_ALL_PREFIXES(DirectoryBackingStoreTest, MigrateVersion76To77); FRIEND_TEST_ALL_PREFIXES(DirectoryBackingStoreTest, ModelTypeIds); FRIEND_TEST_ALL_PREFIXES(DirectoryBackingStoreTest, Corruption); FRIEND_TEST_ALL_PREFIXES(DirectoryBackingStoreTest, DeleteEntries); @@ -181,6 +182,7 @@ class DirectoryBackingStore { bool MigrateVersion73To74(); bool MigrateVersion74To75(); bool MigrateVersion75To76(); + bool MigrateVersion76To77(); // The handle to our sqlite on-disk store for initialization and loading, and // for saving changes periodically via SaveChanges, respectively. diff --git a/chrome/browser/sync/syncable/directory_backing_store_unittest.cc b/chrome/browser/sync/syncable/directory_backing_store_unittest.cc index dae6f85..88536cf 100644 --- a/chrome/browser/sync/syncable/directory_backing_store_unittest.cc +++ b/chrome/browser/sync/syncable/directory_backing_store_unittest.cc @@ -18,6 +18,8 @@ #include "chrome/browser/sync/syncable/directory_manager.h" #include "chrome/browser/sync/syncable/syncable-inl.h" #include "chrome/browser/sync/syncable/syncable.h" +#include "chrome/browser/sync/util/sqlite_utils.h" +#include "chrome/browser/sync/util/time.h" #include "sql/connection.h" #include "sql/statement.h" #include "testing/gtest/include/gtest/gtest-param-test.h" @@ -50,6 +52,7 @@ class MigrationTest : public testing::TestWithParam<int> { void SetUpVersion73Database(); void SetUpVersion74Database(); void SetUpVersion75Database(); + void SetUpVersion76Database(); void SetUpCurrentDatabaseAndCheckVersion() { SetUpVersion70Database(); // Prepopulates data. @@ -69,6 +72,282 @@ class MigrationTest : public testing::TestWithParam<int> { class DirectoryBackingStoreTest : public MigrationTest {}; +#if defined(OS_WIN) + +// On Windows, we used to store timestamps in FILETIME format. +#define LEGACY_META_PROTO_TIMES_1 129079956640320000LL +#define LEGACY_META_PROTO_TIMES_2 128976886618480000LL +#define LEGACY_META_PROTO_TIMES_4 129002163642690000LL +#define LEGACY_META_PROTO_TIMES_5 129001555500000000LL +#define LEGACY_META_PROTO_TIMES_6 129053976170000000LL +#define LEGACY_META_PROTO_TIMES_7 128976864758480000LL +#define LEGACY_META_PROTO_TIMES_8 128976864758480000LL +#define LEGACY_META_PROTO_TIMES_9 128976864758480000LL +#define LEGACY_META_PROTO_TIMES_10 128976864758480000LL +#define LEGACY_META_PROTO_TIMES_11 129079956948440000LL +#define LEGACY_META_PROTO_TIMES_12 129079957513650000LL +#define LEGACY_META_PROTO_TIMES_13 129079957985300000LL +#define LEGACY_META_PROTO_TIMES_14 129079958383000000LL + +#define LEGACY_META_PROTO_TIMES_STR_1 "129079956640320000" +#define LEGACY_META_PROTO_TIMES_STR_2 "128976886618480000" +#define LEGACY_META_PROTO_TIMES_STR_4 "129002163642690000" +#define LEGACY_META_PROTO_TIMES_STR_5 "129001555500000000" +#define LEGACY_META_PROTO_TIMES_STR_6 "129053976170000000" +#define LEGACY_META_PROTO_TIMES_STR_7 "128976864758480000" +#define LEGACY_META_PROTO_TIMES_STR_8 "128976864758480000" +#define LEGACY_META_PROTO_TIMES_STR_9 "128976864758480000" +#define LEGACY_META_PROTO_TIMES_STR_10 "128976864758480000" +#define LEGACY_META_PROTO_TIMES_STR_11 "129079956948440000" +#define LEGACY_META_PROTO_TIMES_STR_12 "129079957513650000" +#define LEGACY_META_PROTO_TIMES_STR_13 "129079957985300000" +#define LEGACY_META_PROTO_TIMES_STR_14 "129079958383000000" + +// Generated via: +// +// ruby -ane '$F[1].sub!("LEGACY_", ""); $F[2] = Integer($F[2].sub!("LL", "")) / 10000 - 11644473600000; print "#{$F[0]} #{$F[1]} #{$F[2]}LL\n"' +// +// Magic numbers taken from +// http://stackoverflow.com/questions/5398557/java-library-for-dealing-with-win32-filetime . + +// Now we store them in Java format (ms since the Unix epoch). +#define META_PROTO_TIMES_1 1263522064032LL +#define META_PROTO_TIMES_2 1253215061848LL +#define META_PROTO_TIMES_4 1255742764269LL +#define META_PROTO_TIMES_5 1255681950000LL +#define META_PROTO_TIMES_6 1260924017000LL +#define META_PROTO_TIMES_7 1253212875848LL +#define META_PROTO_TIMES_8 1253212875848LL +#define META_PROTO_TIMES_9 1253212875848LL +#define META_PROTO_TIMES_10 1253212875848LL +#define META_PROTO_TIMES_11 1263522094844LL +#define META_PROTO_TIMES_12 1263522151365LL +#define META_PROTO_TIMES_13 1263522198530LL +#define META_PROTO_TIMES_14 1263522238300LL + +#define META_PROTO_TIMES_STR_1 "1263522064032" +#define META_PROTO_TIMES_STR_2 "1253215061848" +#define META_PROTO_TIMES_STR_4 "1255742764269" +#define META_PROTO_TIMES_STR_5 "1255681950000" +#define META_PROTO_TIMES_STR_6 "1260924017000" +#define META_PROTO_TIMES_STR_7 "1253212875848" +#define META_PROTO_TIMES_STR_8 "1253212875848" +#define META_PROTO_TIMES_STR_9 "1253212875848" +#define META_PROTO_TIMES_STR_10 "1253212875848" +#define META_PROTO_TIMES_STR_11 "1263522094844" +#define META_PROTO_TIMES_STR_12 "1263522151365" +#define META_PROTO_TIMES_STR_13 "1263522198530" +#define META_PROTO_TIMES_STR_14 "1263522238300" + +#else + +// On other platforms, we used to store timestamps in time_t format (s +// since the Unix epoch). +#define LEGACY_META_PROTO_TIMES_1 1263522064LL +#define LEGACY_META_PROTO_TIMES_2 1253215061LL +#define LEGACY_META_PROTO_TIMES_4 1255742764LL +#define LEGACY_META_PROTO_TIMES_5 1255681950LL +#define LEGACY_META_PROTO_TIMES_6 1260924017LL +#define LEGACY_META_PROTO_TIMES_7 1253212875LL +#define LEGACY_META_PROTO_TIMES_8 1253212875LL +#define LEGACY_META_PROTO_TIMES_9 1253212875LL +#define LEGACY_META_PROTO_TIMES_10 1253212875LL +#define LEGACY_META_PROTO_TIMES_11 1263522094LL +#define LEGACY_META_PROTO_TIMES_12 1263522151LL +#define LEGACY_META_PROTO_TIMES_13 1263522198LL +#define LEGACY_META_PROTO_TIMES_14 1263522238LL + +#define LEGACY_META_PROTO_TIMES_STR_1 "1263522064" +#define LEGACY_META_PROTO_TIMES_STR_2 "1253215061" +#define LEGACY_META_PROTO_TIMES_STR_4 "1255742764" +#define LEGACY_META_PROTO_TIMES_STR_5 "1255681950" +#define LEGACY_META_PROTO_TIMES_STR_6 "1260924017" +#define LEGACY_META_PROTO_TIMES_STR_7 "1253212875" +#define LEGACY_META_PROTO_TIMES_STR_8 "1253212875" +#define LEGACY_META_PROTO_TIMES_STR_9 "1253212875" +#define LEGACY_META_PROTO_TIMES_STR_10 "1253212875" +#define LEGACY_META_PROTO_TIMES_STR_11 "1263522094" +#define LEGACY_META_PROTO_TIMES_STR_12 "1263522151" +#define LEGACY_META_PROTO_TIMES_STR_13 "1263522198" +#define LEGACY_META_PROTO_TIMES_STR_14 "1263522238" + +// Now we store them in Java format (ms since the Unix epoch). +#define META_PROTO_TIMES_1 1263522064000LL +#define META_PROTO_TIMES_2 1253215061000LL +#define META_PROTO_TIMES_4 1255742764000LL +#define META_PROTO_TIMES_5 1255681950000LL +#define META_PROTO_TIMES_6 1260924017000LL +#define META_PROTO_TIMES_7 1253212875000LL +#define META_PROTO_TIMES_8 1253212875000LL +#define META_PROTO_TIMES_9 1253212875000LL +#define META_PROTO_TIMES_10 1253212875000LL +#define META_PROTO_TIMES_11 1263522094000LL +#define META_PROTO_TIMES_12 1263522151000LL +#define META_PROTO_TIMES_13 1263522198000LL +#define META_PROTO_TIMES_14 1263522238000LL + +#define META_PROTO_TIMES_STR_1 "1263522064000" +#define META_PROTO_TIMES_STR_2 "1253215061000" +#define META_PROTO_TIMES_STR_4 "1255742764000" +#define META_PROTO_TIMES_STR_5 "1255681950000" +#define META_PROTO_TIMES_STR_6 "1260924017000" +#define META_PROTO_TIMES_STR_7 "1253212875000" +#define META_PROTO_TIMES_STR_8 "1253212875000" +#define META_PROTO_TIMES_STR_9 "1253212875000" +#define META_PROTO_TIMES_STR_10 "1253212875000" +#define META_PROTO_TIMES_STR_11 "1263522094000" +#define META_PROTO_TIMES_STR_12 "1263522151000" +#define META_PROTO_TIMES_STR_13 "1263522198000" +#define META_PROTO_TIMES_STR_14 "1263522238000" + +#endif + +// Helper macros for the database dumps in the SetUpVersion*Database +// functions. +#define LEGACY_META_PROTO_TIMES(x) LEGACY_META_PROTO_TIMES_##x +#define LEGACY_META_PROTO_TIMES_STR(x) LEGACY_META_PROTO_TIMES_STR_##x +#define META_PROTO_TIMES(x) META_PROTO_TIMES_##x +#define LEGACY_PROTO_TIME_VALS(x) \ + LEGACY_META_PROTO_TIMES_STR(x) "," \ + LEGACY_META_PROTO_TIMES_STR(x) "," \ + LEGACY_META_PROTO_TIMES_STR(x) "," \ + LEGACY_META_PROTO_TIMES_STR(x) + +namespace { + +// Helper functions for testing. + +// Returns a map from metahandle -> expected legacy time (in proto +// format). +std::map<int64, int64> GetExpectedLegacyMetaProtoTimes() { + std::map<int64, int64> expected_legacy_meta_proto_times; + expected_legacy_meta_proto_times[1] = LEGACY_META_PROTO_TIMES(1); + expected_legacy_meta_proto_times[2] = LEGACY_META_PROTO_TIMES(2); + expected_legacy_meta_proto_times[4] = LEGACY_META_PROTO_TIMES(4); + expected_legacy_meta_proto_times[5] = LEGACY_META_PROTO_TIMES(5); + expected_legacy_meta_proto_times[6] = LEGACY_META_PROTO_TIMES(6); + expected_legacy_meta_proto_times[7] = LEGACY_META_PROTO_TIMES(7); + expected_legacy_meta_proto_times[8] = LEGACY_META_PROTO_TIMES(8); + expected_legacy_meta_proto_times[9] = LEGACY_META_PROTO_TIMES(9); + expected_legacy_meta_proto_times[10] = LEGACY_META_PROTO_TIMES(10); + expected_legacy_meta_proto_times[11] = LEGACY_META_PROTO_TIMES(11); + expected_legacy_meta_proto_times[12] = LEGACY_META_PROTO_TIMES(12); + expected_legacy_meta_proto_times[13] = LEGACY_META_PROTO_TIMES(13); + expected_legacy_meta_proto_times[14] = LEGACY_META_PROTO_TIMES(14); + return expected_legacy_meta_proto_times; +} + +// Returns a map from metahandle -> expected time (in proto format). +std::map<int64, int64> GetExpectedMetaProtoTimes() { + std::map<int64, int64> expected_meta_proto_times; + expected_meta_proto_times[1] = META_PROTO_TIMES(1); + expected_meta_proto_times[2] = META_PROTO_TIMES(2); + expected_meta_proto_times[4] = META_PROTO_TIMES(4); + expected_meta_proto_times[5] = META_PROTO_TIMES(5); + expected_meta_proto_times[6] = META_PROTO_TIMES(6); + expected_meta_proto_times[7] = META_PROTO_TIMES(7); + expected_meta_proto_times[8] = META_PROTO_TIMES(8); + expected_meta_proto_times[9] = META_PROTO_TIMES(9); + expected_meta_proto_times[10] = META_PROTO_TIMES(10); + expected_meta_proto_times[11] = META_PROTO_TIMES(11); + expected_meta_proto_times[12] = META_PROTO_TIMES(12); + expected_meta_proto_times[13] = META_PROTO_TIMES(13); + expected_meta_proto_times[14] = META_PROTO_TIMES(14); + return expected_meta_proto_times; +} + +// Returns a map from metahandle -> expected time (as a Time object). +std::map<int64, base::Time> GetExpectedMetaTimes() { + std::map<int64, base::Time> expected_meta_times; + const std::map<int64, int64>& expected_meta_proto_times = + GetExpectedMetaProtoTimes(); + for (std::map<int64, int64>::const_iterator it = + expected_meta_proto_times.begin(); + it != expected_meta_proto_times.end(); ++it) { + expected_meta_times[it->first] = + browser_sync::ProtoTimeToTime(it->second); + } + return expected_meta_times; +} + +// Extracts a map from metahandle -> time (in proto format) from the +// given database. +std::map<int64, int64> GetMetaProtoTimes(sqlite3* db_handle) { + sqlite_utils::SQLStatement statement; + statement.prepare( + db_handle, + "SELECT metahandle, mtime, server_mtime, ctime, server_ctime FROM metas"); + EXPECT_EQ(5, statement.column_count()); + std::map<int64, int64> meta_times; + while (true) { + int query_result = statement.step(); + if (query_result != SQLITE_ROW) { + EXPECT_EQ(SQLITE_DONE, query_result); + break; + } + int64 metahandle = statement.column_int64(0); + int64 mtime = statement.column_int64(1); + int64 server_mtime = statement.column_int64(2); + int64 ctime = statement.column_int64(3); + int64 server_ctime = statement.column_int64(4); + EXPECT_EQ(mtime, server_mtime); + EXPECT_EQ(mtime, ctime); + EXPECT_EQ(mtime, server_ctime); + meta_times[metahandle] = mtime; + } + return meta_times; +} + +::testing::AssertionResult AssertTimesMatch(const char* t1_expr, + const char* t2_expr, + const base::Time& t1, + const base::Time& t2) { + if (t1 == t2) + return ::testing::AssertionSuccess(); + + return ::testing::AssertionFailure() + << t1_expr << " and " << t2_expr + << " (internal values: " << t1.ToInternalValue() + << " and " << t2.ToInternalValue() + << ") (proto time: " << browser_sync::TimeToProtoTime(t1) + << " and " << browser_sync::TimeToProtoTime(t2) + << ") do not match"; +} + +// Expect that all time fields of the given entry kernel will be the +// given time. +void ExpectTime(const EntryKernel& entry_kernel, + const base::Time& expected_time) { + EXPECT_PRED_FORMAT2(AssertTimesMatch, + expected_time, entry_kernel.ref(CTIME)); + EXPECT_PRED_FORMAT2(AssertTimesMatch, + expected_time, entry_kernel.ref(SERVER_CTIME)); + EXPECT_PRED_FORMAT2(AssertTimesMatch, + expected_time, entry_kernel.ref(MTIME)); + EXPECT_PRED_FORMAT2(AssertTimesMatch, + expected_time, entry_kernel.ref(SERVER_MTIME)); +} + +// Expect that all the entries in |index| have times matching those in +// the given map (from metahandle to expect time). +void ExpectTimes(const MetahandlesIndex& index, + const std::map<int64, base::Time>& expected_times) { + for (MetahandlesIndex::const_iterator it = index.begin(); + it != index.end(); ++it) { + int64 meta_handle = (*it)->ref(META_HANDLE); + SCOPED_TRACE(meta_handle); + std::map<int64, base::Time>::const_iterator it2 = + expected_times.find(meta_handle); + if (it2 == expected_times.end()) { + ADD_FAILURE() << "Could not find expected time for " << meta_handle; + continue; + } + ExpectTime(**it, it2->second); + } +} + +} // namespace + void MigrationTest::SetUpVersion67Database() { // This is a version 67 database dump whose contents were backformed from // the contents of the version 68 database dump (the v68 migration was @@ -100,68 +379,68 @@ void MigrationTest::SetUpVersion67Database() { "bookmark_url varchar,server_bookmark_url varchar," "singleton_tag varchar,bookmark_favicon blob," "server_bookmark_favicon blob);" - "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0," - "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL," + "INSERT INTO metas VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) + ",0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL," "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);" - "INSERT INTO metas VALUES(2,669,669,128976886618480000," - "128976886618480000,128976886618480000,128976886618480000,-2097152," + "INSERT INTO metas VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) + ",-2097152," "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1," "'Deleted Item',NULL,'Deleted Item','Deleted Item','Deleted Item'," "'http://www.google.com/','http://www.google.com/2',NULL,'AASGASGA'," "'ASADGADGADG');" - "INSERT INTO metas VALUES(4,681,681,129002163642690000," - "129002163642690000,129002163642690000,129002163642690000,-3145728," + "INSERT INTO metas VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) + ",-3145728," "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1," "'Welcome to Chromium',NULL,'Welcome to Chromium'," "'Welcome to Chromium','Welcome to Chromium'," "'http://www.google.com/chrome/intl/en/welcome.html'," "'http://www.google.com/chrome/intl/en/welcome.html',NULL,NULL," "NULL);" - "INSERT INTO metas VALUES(5,677,677,129001555500000000," - "129001555500000000,129001555500000000,129001555500000000,1048576," + "INSERT INTO metas VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) + ",1048576," "7,'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1," "'Google',NULL,'Google','Google','Google','http://www.google.com/'," "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG');" - "INSERT INTO metas VALUES(6,694,694,129053976170000000," - "129053976170000000,129053976170000000,129053976170000000,-4194304," + "INSERT INTO metas VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) + ",-4194304," "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1," "'The Internet',NULL,'The Internet','The Internet'," "'The Internet',NULL,NULL,NULL,NULL,NULL);" - "INSERT INTO metas VALUES(7,663,663,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000," + "INSERT INTO metas VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) + "," "1048576,0,'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1," "'Google Chrome',NULL,'Google Chrome','Google Chrome'," "'Google Chrome',NULL,NULL,'google_chrome',NULL,NULL);" - "INSERT INTO metas VALUES(8,664,664,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576," + "INSERT INTO metas VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) + ",1048576," "0,'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks'," "NULL,'Bookmarks','Bookmarks','Bookmarks',NULL,NULL," "'google_chrome_bookmarks',NULL,NULL);" - "INSERT INTO metas VALUES(9,665,665,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000," + "INSERT INTO metas VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) + "," "1048576,1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0," "1,'Bookmark Bar',NULL,'Bookmark Bar','Bookmark Bar','Bookmark Bar'," "NULL,NULL,'bookmark_bar',NULL,NULL);" - "INSERT INTO metas VALUES(10,666,666,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,2097152," + "INSERT INTO metas VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) + ",2097152," "2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1," "'Other Bookmarks',NULL,'Other Bookmarks','Other Bookmarks'," "'Other Bookmarks',NULL,NULL,'other_bookmarks'," "NULL,NULL);" - "INSERT INTO metas VALUES(11,683,683,129079956948440000," - "129079956948440000,129079956948440000,129079956948440000,-1048576," + "INSERT INTO metas VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) + ",-1048576," "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1," "'Home (The Chromium Projects)',NULL,'Home (The Chromium Projects)'," "'Home (The Chromium Projects)','Home (The Chromium Projects)'," "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL," "'AGATWA','AFAGVASF');" - "INSERT INTO metas VALUES(12,685,685,129079957513650000," - "129079957513650000,129079957513650000,129079957513650000,0,9," + "INSERT INTO metas VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) + ",0,9," "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1," "'Extra Bookmarks',NULL,'Extra Bookmarks','Extra Bookmarks'," "'Extra Bookmarks',NULL,NULL,NULL,NULL,NULL);" - "INSERT INTO metas VALUES(13,687,687,129079957985300000," - "129079957985300000,129079957985300000,129079957985300000,-917504," + "INSERT INTO metas VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) + ",-917504," "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0," "1,'ICANN | Internet Corporation for Assigned Names and Numbers'," "'ICANN Internet Corporation for Assigned Names and Numbers'," @@ -170,8 +449,8 @@ void MigrationTest::SetUpVersion67Database() { "'ICANN | Internet Corporation for Assigned Names and Numbers'," "'http://www.icann.com/','http://www.icann.com/',NULL," "'PNGAXF0AAFF','DAAFASF');" - "INSERT INTO metas VALUES(14,692,692,129079958383000000," - "129079958383000000,129079958383000000,129079958383000000,1048576," + "INSERT INTO metas VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) + ",1048576," "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1," "'The WebKit Open Source Project',NULL," "'The WebKit Open Source Project','The WebKit Open Source Project'," @@ -222,68 +501,68 @@ void MigrationTest::SetUpVersion68Database() { "bookmark_url varchar,server_bookmark_url varchar," "singleton_tag varchar,bookmark_favicon blob," "server_bookmark_favicon blob);" - "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0," - "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL," + "INSERT INTO metas VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) + ",0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL," "NULL,NULL,NULL,NULL,NULL,NULL);" - "INSERT INTO metas VALUES(2,669,669,128976886618480000," - "128976886618480000,128976886618480000,128976886618480000,-2097152," + "INSERT INTO metas VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) + ",-2097152," "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1," "'Deleted Item','Deleted Item','http://www.google.com/'," "'http://www.google.com/2',NULL,'AASGASGA','ASADGADGADG');" - "INSERT INTO metas VALUES(4,681,681,129002163642690000," - "129002163642690000,129002163642690000,129002163642690000,-3145728," + "INSERT INTO metas VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) + ",-3145728," "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1," "'Welcome to Chromium','Welcome to Chromium'," "'http://www.google.com/chrome/intl/en/welcome.html'," "'http://www.google.com/chrome/intl/en/welcome.html',NULL,NULL," "NULL);" - "INSERT INTO metas VALUES(5,677,677,129001555500000000," - "129001555500000000,129001555500000000,129001555500000000,1048576," + "INSERT INTO metas VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) + ",1048576," "7,'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1," "'Google','Google','http://www.google.com/'," "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG');" - "INSERT INTO metas VALUES(6,694,694,129053976170000000," - "129053976170000000,129053976170000000,129053976170000000,-4194304," + "INSERT INTO metas VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) + ",-4194304," "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1," "'The Internet','The Internet',NULL,NULL,NULL,NULL,NULL);" - "INSERT INTO metas VALUES(7,663,663,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000," + "INSERT INTO metas VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) + "," "1048576,0,'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1," "'Google Chrome','Google Chrome',NULL,NULL,'google_chrome',NULL," "NULL);" - "INSERT INTO metas VALUES(8,664,664,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576," + "INSERT INTO metas VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) + ",1048576," "0,'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks'," "'Bookmarks',NULL,NULL,'google_chrome_bookmarks',NULL,NULL);" - "INSERT INTO metas VALUES(9,665,665,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000," + "INSERT INTO metas VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) + "," "1048576,1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0," "1,'Bookmark Bar','Bookmark Bar',NULL,NULL,'bookmark_bar',NULL," "NULL);" - "INSERT INTO metas VALUES(10,666,666,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,2097152," + "INSERT INTO metas VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) + ",2097152," "2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1," "'Other Bookmarks','Other Bookmarks',NULL,NULL,'other_bookmarks'," "NULL,NULL);" - "INSERT INTO metas VALUES(11,683,683,129079956948440000," - "129079956948440000,129079956948440000,129079956948440000,-1048576," + "INSERT INTO metas VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) + ",-1048576," "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1," "'Home (The Chromium Projects)','Home (The Chromium Projects)'," "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL," "'AGATWA','AFAGVASF');" - "INSERT INTO metas VALUES(12,685,685,129079957513650000," - "129079957513650000,129079957513650000,129079957513650000,0,9," + "INSERT INTO metas VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) + ",0,9," "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1," "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,NULL,NULL,NULL);" - "INSERT INTO metas VALUES(13,687,687,129079957985300000," - "129079957985300000,129079957985300000,129079957985300000,-917504," + "INSERT INTO metas VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) + ",-917504," "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0," "1,'ICANN | Internet Corporation for Assigned Names and Numbers'," "'ICANN | Internet Corporation for Assigned Names and Numbers'," "'http://www.icann.com/','http://www.icann.com/',NULL," "'PNGAXF0AAFF','DAAFASF');" - "INSERT INTO metas VALUES(14,692,692,129079958383000000," - "129079958383000000,129079958383000000,129079958383000000,1048576," + "INSERT INTO metas VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) + ",1048576," "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1," "'The WebKit Open Source Project','The WebKit Open Source Project'," "'http://webkit.org/','http://webkit.org/x',NULL,'PNGX','PNG2Y');" @@ -327,19 +606,19 @@ void MigrationTest::SetUpVersion69Database() { "singleton_tag varchar,bookmark_favicon blob," "server_bookmark_favicon blob, specifics blob, " "server_specifics blob);" - "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0,129079956640320000," - "0,0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL,NULL,NULL,NULL,NULL," + "INSERT INTO metas VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) + ",0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL,NULL,NULL,NULL,NULL," "NULL,NULL,X'',X'');" - "INSERT INTO metas VALUES(2,669,669,128976886618480000," - "128976886618480000,128976886618480000,128976886618480000,-2097152," + "INSERT INTO metas VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) + ",-2097152," "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1," "'Deleted Item','Deleted Item','http://www.google.com/'," "'http://www.google.com/2',NULL,'AASGASGA','ASADGADGADG'," "X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F120841415" "34741534741',X'C28810260A17687474703A2F2F7777772E676F6F676C652E636F" "6D2F32120B4153414447414447414447');" - "INSERT INTO metas VALUES(4,681,681,129002163642690000," - "129002163642690000,129002163642690000,129002163642690000,-3145728," + "INSERT INTO metas VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) + ",-3145728," "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1," "'Welcome to Chromium','Welcome to Chromium'," "'http://www.google.com/chrome/intl/en/welcome.html'," @@ -348,52 +627,52 @@ void MigrationTest::SetUpVersion69Database() { "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A3168" "7474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F6" "56E2F77656C636F6D652E68746D6C1200');" - "INSERT INTO metas VALUES(5,677,677,129001555500000000," - "129001555500000000,129001555500000000,129001555500000000,1048576,7," + "INSERT INTO metas VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) + ",1048576,7," "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1," "'Google','Google','http://www.google.com/'," "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG',X'C28810220A166" "87474703A2F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'" "C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464" "447415347');" - "INSERT INTO metas VALUES(6,694,694,129053976170000000," - "129053976170000000,129053976170000000,129053976170000000,-4194304,6" + "INSERT INTO metas VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) + ",-4194304,6" ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1,'The Internet'," "'The Internet',NULL,NULL,NULL,NULL,NULL,X'C2881000',X'C2881000');" - "INSERT INTO metas VALUES(7,663,663,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,0," + "INSERT INTO metas VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) + ",1048576,0," "'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1,'Google Chrome'," "'Google Chrome',NULL,NULL,'google_chrome',NULL,NULL,NULL,NULL);" - "INSERT INTO metas VALUES(8,664,664,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,0," + "INSERT INTO metas VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) + ",1048576,0," "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks'," "'Bookmarks',NULL,NULL,'google_chrome_bookmarks',NULL,NULL," "X'C2881000',X'C2881000');" - "INSERT INTO metas VALUES(9,665,665,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,1," + "INSERT INTO metas VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) + ",1048576,1," "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0,1," "'Bookmark Bar','Bookmark Bar',NULL,NULL,'bookmark_bar',NULL,NULL," "X'C2881000',X'C2881000');" - "INSERT INTO metas VALUES(10,666,666,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,2097152,2," + "INSERT INTO metas VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) + ",2097152,2," "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1," "'Other Bookmarks','Other Bookmarks',NULL,NULL,'other_bookmarks'," "NULL,NULL,X'C2881000',X'C2881000');" - "INSERT INTO metas VALUES(11,683,683,129079956948440000," - "129079956948440000,129079956948440000,129079956948440000,-1048576," + "INSERT INTO metas VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) + ",-1048576," "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1," "'Home (The Chromium Projects)','Home (The Chromium Projects)'," "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL," "'AGATWA','AFAGVASF',X'C28810220A18687474703A2F2F6465762E6368726F6D6" "9756D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F646576" "2E6368726F6D69756D2E6F72672F6F7468657212084146414756415346');" - "INSERT INTO metas VALUES(12,685,685,129079957513650000," - "129079957513650000,129079957513650000,129079957513650000,0,9," + "INSERT INTO metas VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) + ",0,9," "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1," "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,NULL,NULL,NULL," "X'C2881000',X'C2881000');" - "INSERT INTO metas VALUES(13,687,687,129079957985300000," - "129079957985300000,129079957985300000,129079957985300000,-917504," + "INSERT INTO metas VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) + ",-917504," "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0," "1,'ICANN | Internet Corporation for Assigned Names and Numbers'," "'ICANN | Internet Corporation for Assigned Names and Numbers'," @@ -401,8 +680,8 @@ void MigrationTest::SetUpVersion69Database() { "'DAAFASF',X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F1" "20B504E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963" "616E6E2E636F6D2F120744414146415346');" - "INSERT INTO metas VALUES(14,692,692,129079958383000000," - "129079958383000000,129079958383000000,129079958383000000,1048576,11," + "INSERT INTO metas VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) + ",1048576,11," "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1," "'The WebKit Open Source Project','The WebKit Open Source Project'," "'http://webkit.org/','http://webkit.org/x',NULL,'PNGX','PNG2Y'," @@ -456,74 +735,73 @@ void MigrationTest::SetUpVersion70Database() { "non_unique_name varchar,server_non_unique_name varchar(255)," "unique_server_tag varchar,unique_client_tag varchar," "specifics blob,server_specifics blob);" - "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0,129079956640320000," - "0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'');" - "INSERT INTO metas VALUES(2,669,669,128976886618480000," - "128976886618480000,128976886618480000,128976886618480000," + "INSERT INTO metas VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) + ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'');" + "INSERT INTO metas VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) "," "-2097152,4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0," "1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A" "2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X'C2881026" "0A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B415341444741" "4447414447');" - "INSERT INTO metas VALUES(4,681,681,129002163642690000," - "129002163642690000,129002163642690000,129002163642690000,-3145728," + "INSERT INTO metas VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) + ",-3145728," "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A" "31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E74" "6C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F" "2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F7765" "6C636F6D652E68746D6C1200');" - "INSERT INTO metas VALUES(5,677,677,129001555500000000," - "129001555500000000,129001555500000000,129001555500000000,1048576,7," + "INSERT INTO metas VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) + ",1048576,7," "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C6" "52E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F77777" "72E676F6F676C652E636F6D2F12084147464447415347');" - "INSERT INTO metas VALUES(6,694,694,129053976170000000," - "129053976170000000,129053976170000000,129053976170000000,-4194304," + "INSERT INTO metas VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) + ",-4194304," "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" - "INSERT INTO metas VALUES(7,663,663,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,0," + "INSERT INTO metas VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) + ",1048576,0," "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome'," "'Google Chrome','google_chrome',NULL,NULL,NULL);" - "INSERT INTO metas VALUES(8,664,664,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,0," + "INSERT INTO metas VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) + ",1048576,0," "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000'," "X'C2881000');" - "INSERT INTO metas VALUES(9,665,665,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576," + "INSERT INTO metas VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) + ",1048576," "1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0," "'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881000'," "X'C2881000');" - "INSERT INTO metas VALUES(10,666,666,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000," + "INSERT INTO metas VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) + "," "2097152,2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," "X'C2881000',X'C2881000');" - "INSERT INTO metas VALUES(11,683,683,129079956948440000," - "129079956948440000,129079956948440000,129079956948440000,-1048576," + "INSERT INTO metas VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) + ",-1048576," "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," "'Home (The Chromium Projects)','Home (The Chromium Projects)'," "NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F" "72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636872" "6F6D69756D2E6F72672F6F7468657212084146414756415346');" - "INSERT INTO metas VALUES(12,685,685,129079957513650000," - "129079957513650000,129079957513650000,129079957513650000,0,9," + "INSERT INTO metas VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) + ",0,9," "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," "X'C2881000');" - "INSERT INTO metas VALUES(13,687,687,129079957985300000," - "129079957985300000,129079957985300000,129079957985300000,-917504," + "INSERT INTO metas VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) + ",-917504," "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," "'ICANN | Internet Corporation for Assigned Names and Numbers'," "'ICANN | Internet Corporation for Assigned Names and Numbers'," "NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F" "120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772E69" "63616E6E2E636F6D2F120744414146415346');" - "INSERT INTO metas VALUES(14,692,692,129079958383000000," - "129079958383000000,129079958383000000,129079958383000000,1048576," + "INSERT INTO metas VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) + ",1048576," "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," "'The WebKit Open Source Project','The WebKit Open Source Project'," "NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" @@ -555,73 +833,73 @@ void MigrationTest::SetUpVersion71Database() { "non_unique_name varchar,server_non_unique_name varchar(255)," "unique_server_tag varchar,unique_client_tag varchar,specifics blob," "server_specifics blob);" - "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0," - "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," + "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) + ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," "NULL,NULL,X'',X'');" - "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000," - "128976886618480000,128976886618480000,128976886618480000,-2097152,4," + "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) + ",-2097152,4," "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1," "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F" "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768" "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144" "47');" - "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000," - "129002163642690000,129002163642690000,129002163642690000,-3145728,3," + "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) + ",-3145728,3," "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31" "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F" "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777" "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D" "652E68746D6C1200');" - "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000," - "129001555500000000,129001555500000000,129001555500000000,1048576,7," + "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) + ",1048576,7," "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652" "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6" "76F6F676C652E636F6D2F12084147464447415347');" - "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000," - "129053976170000000,129053976170000000,129053976170000000,-4194304,6," + "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) + ",-4194304,6," "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,0," + "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) + ",1048576,0," "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'" ",'google_chrome',NULL,NULL,NULL);" - "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,0," + "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) + ",1048576,0," "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,1," + "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) + ",1048576,1," "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar'," "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,2097152,2," + "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) + ",2097152,2," "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," "X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000," - "129079956948440000,129079956948440000,129079956948440000,-1048576,8," + "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) + ",-1048576,8," "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL," "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1" "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756" "D2E6F72672F6F7468657212084146414756415346');" - "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000," - "129079957513650000,129079957513650000,129079957513650000,0,9," + "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) + ",0,9," "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," "X'C2881000');" - "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000," - "129079957985300000,129079957985300000,129079957985300000,-917504,10," + "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) + ",-917504,10," "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," "'ICANN | Internet Corporation for Assigned Names and Numbers'," "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL," "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504" "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2" "E636F6D2F120744414146415346');" - "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000," - "129079958383000000,129079958383000000,129079958383000000,1048576,11," + "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) + ",1048576,11," "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," "'The WebKit Open Source Project','The WebKit Open Source Project'," "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" @@ -659,73 +937,73 @@ void MigrationTest::SetUpVersion72Database() { "non_unique_name varchar,server_non_unique_name varchar(255)," "unique_server_tag varchar,unique_client_tag varchar,specifics blob," "server_specifics blob);" - "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0," - "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," + "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) + ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," "NULL,NULL,X'',X'');" - "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000," - "128976886618480000,128976886618480000,128976886618480000,-2097152,4," + "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) + ",-2097152,4," "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1," "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F" "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768" "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144" "47');" - "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000," - "129002163642690000,129002163642690000,129002163642690000,-3145728,3," + "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) + ",-3145728,3," "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31" "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F" "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777" "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D" "652E68746D6C1200');" - "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000," - "129001555500000000,129001555500000000,129001555500000000,1048576,7," + "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) + ",1048576,7," "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652" "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6" "76F6F676C652E636F6D2F12084147464447415347');" - "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000," - "129053976170000000,129053976170000000,129053976170000000,-4194304,6," + "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) + ",-4194304,6," "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,0," + "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) + ",1048576,0," "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'" ",'google_chrome',NULL,NULL,NULL);" - "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,0," + "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) + ",1048576,0," "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,1," + "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) + ",1048576,1," "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar'," "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,2097152,2," + "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) + ",2097152,2," "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," "X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000," - "129079956948440000,129079956948440000,129079956948440000,-1048576,8," + "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) + ",-1048576,8," "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL," "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1" "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756" "D2E6F72672F6F7468657212084146414756415346');" - "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000," - "129079957513650000,129079957513650000,129079957513650000,0,9," + "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) + ",0,9," "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," "X'C2881000');" - "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000," - "129079957985300000,129079957985300000,129079957985300000,-917504,10," + "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) + ",-917504,10," "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," "'ICANN | Internet Corporation for Assigned Names and Numbers'," "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL," "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504" "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2" "E636F6D2F120744414146415346');" - "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000," - "129079958383000000,129079958383000000,129079958383000000,1048576,11," + "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) + ",1048576,11," "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," "'The WebKit Open Source Project','The WebKit Open Source Project'," "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" @@ -763,73 +1041,73 @@ void MigrationTest::SetUpVersion73Database() { "non_unique_name varchar,server_non_unique_name varchar(255)," "unique_server_tag varchar,unique_client_tag varchar,specifics blob," "server_specifics blob);" - "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0," - "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," + "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) + ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," "NULL,NULL,X'',X'');" - "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000," - "128976886618480000,128976886618480000,128976886618480000,-2097152,4," + "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) + ",-2097152,4," "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1," "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F" "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768" "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144" "47');" - "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000," - "129002163642690000,129002163642690000,129002163642690000,-3145728,3," + "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) + ",-3145728,3," "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31" "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F" "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777" "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D" "652E68746D6C1200');" - "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000," - "129001555500000000,129001555500000000,129001555500000000,1048576,7," + "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) + ",1048576,7," "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652" "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6" "76F6F676C652E636F6D2F12084147464447415347');" - "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000," - "129053976170000000,129053976170000000,129053976170000000,-4194304,6," + "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) + ",-4194304,6," "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,0," + "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) + ",1048576,0," "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'" ",'google_chrome',NULL,NULL,NULL);" - "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,0," + "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) + ",1048576,0," "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,1048576,1," + "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) + ",1048576,1," "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar'," "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000," - "128976864758480000,128976864758480000,128976864758480000,2097152,2," + "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) + ",2097152,2," "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," "X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000," - "129079956948440000,129079956948440000,129079956948440000,-1048576,8," + "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) + ",-1048576,8," "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL," "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1" "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756" "D2E6F72672F6F7468657212084146414756415346');" - "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000," - "129079957513650000,129079957513650000,129079957513650000,0,9," + "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) + ",0,9," "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," "X'C2881000');" - "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000," - "129079957985300000,129079957985300000,129079957985300000,-917504,10," + "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) + ",-917504,10," "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," "'ICANN | Internet Corporation for Assigned Names and Numbers'," "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL," "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504" "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2" "E636F6D2F120744414146415346');" - "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000," - "129079958383000000,129079958383000000,129079958383000000,1048576,11," + "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) + ",1048576,11," "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," "'The WebKit Open Source Project','The WebKit Open Source Project'," "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" @@ -880,69 +1158,69 @@ void MigrationTest::SetUpVersion74Database() { "efault 0,server_is_del bit default 0,non_unique_name varchar,server" "_non_unique_name varchar(255),unique_server_tag varchar,unique_clie" "nt_tag varchar,specifics blob,server_specifics blob);" - "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0,1290799566403200" - "00,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'" + "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) + ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'" "');" - "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000,128976886618480" - "000,128976886618480000,128976886618480000,-2097152,4,'s_ID_2','s_ID" + "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) + ",-2097152,4,'s_ID_2','s_ID" "_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,'Deleted Item','Deleted " "Item',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652E6" "36F6D2F12084141534741534741',X'C28810260A17687474703A2F2F7777772E67" "6F6F676C652E636F6D2F32120B4153414447414447414447');" - "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000,129002163642690" - "000,129002163642690000,129002163642690000,-3145728,3,'s_ID_4','s_ID" + "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) + ",-3145728,3,'s_ID_4','s_ID" "_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,'Welcome to Chromium','W" "elcome to Chromium',NULL,NULL,X'C28810350A31687474703A2F2F7777772E6" "76F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D652E" "68746D6C1200',X'C28810350A31687474703A2F2F7777772E676F6F676C652E636" "F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D652E68746D6C1200');" - "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000,129001555500000" - "000,129001555500000000,129001555500000000,1048576,7,'s_ID_5','s_ID_" + "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) + ",1048576,7,'s_ID_5','s_ID_" "9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google','Google',NULL,NU" "LL,X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F120841" "47415347415347',X'C28810220A16687474703A2F2F7777772E676F6F676C652E6" "36F6D2F12084147464447415347');" - "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000,129053976170000" - "000,129053976170000000,129053976170000000,-4194304,6,'s_ID_6','s_ID" + "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) + ",-4194304,6,'s_ID_6','s_ID" "_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet','The Internet',NULL" ",NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000,128976864758480" - "000,128976864758480000,128976864758480000,1048576,0,'s_ID_7','r','r" + "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) + ",1048576,0,'s_ID_7','r','r" "','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome','google_chrom" "e',NULL,NULL,NULL);" - "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000,128976864758480" - "000,128976864758480000,128976864758480000,1048576,0,'s_ID_8','s_ID_" + "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) + ",1048576,0,'s_ID_8','s_ID_" "7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks','Bookmarks','google_chr" "ome_bookmarks',NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000,128976864758480" - "000,128976864758480000,128976864758480000,1048576,1,'s_ID_9','s_ID_" + "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) + ",1048576,1,'s_ID_9','s_ID_" "8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar','Bookmark Bar'" ",'bookmark_bar',NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000,12897686475848" - "0000,128976864758480000,128976864758480000,2097152,2,'s_ID_10','s_I" + "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) + ",2097152,2,'s_ID_10','s_I" "D_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,'Other Bookmarks','Other Boo" "kmarks','other_bookmarks',NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000,12907995694844" - "0000,129079956948440000,129079956948440000,-1048576,8,'s_ID_11','s_" + "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) + ",-1048576,8,'s_ID_11','s_" "ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,'Home (The Chromium Projec" "ts)','Home (The Chromium Projects)',NULL,NULL,X'C28810220A186874747" "03A2F2F6465762E6368726F6D69756D2E6F72672F1206414741545741',X'C28810" "290A1D687474703A2F2F6465762E6368726F6D69756D2E6F72672F6F74686572120" "84146414756415346');" - "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000,12907995751365" - "0000,129079957513650000,129079957513650000,0,9,'s_ID_12','s_ID_6','" + "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) + ",0,9,'s_ID_12','s_ID_6','" "s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bo" "okmarks',NULL,NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000,12907995798530" - "0000,129079957985300000,129079957985300000,-917504,10,'s_ID_13','s_" + "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) + ",-917504,10,'s_ID_13','s_" "ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,'ICANN | Internet Co" "rporation for Assigned Names and Numbers','ICANN | Internet Corpora" "tion for Assigned Names and Numbers',NULL,NULL,X'C28810240A15687474" "703A2F2F7777772E6963616E6E2E636F6D2F120B504E474158463041414646',X'C" "28810200A15687474703A2F2F7777772E6963616E6E2E636F6D2F12074441414641" "5346');" - "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000,12907995838300" - "0000,129079958383000000,129079958383000000,1048576,11,'s_ID_14','s_" + "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) + ",1048576,11,'s_ID_14','s_" "ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,'The WebKit Open Source Pr" "oject','The WebKit Open Source Project',NULL,NULL,X'C288101A0A12687" "474703A2F2F7765626B69742E6F72672F1204504E4758',X'C288101C0A13687474" @@ -983,72 +1261,72 @@ void MigrationTest::SetUpVersion75Database() { "dir bit default 0,server_is_del bit default 0,non_unique_name varc" "har,server_non_unique_name varchar(255),unique_server_tag varchar," "unique_client_tag varchar,specifics blob,server_specifics blob);" - "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0,129079956640" - "320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NUL" + "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) + ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NUL" "L,X'',X'');" - "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000,12897688661" - "8480000,128976886618480000,128976886618480000,-2097152,4,'s_ID_" + "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) + ",-2097152,4,'s_ID_" "2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,'Deleted Ite" "m','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F7777772" "E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A176874" "74703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474" "14447');" - "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000,12900216364" - "2690000,129002163642690000,129002163642690000,-3145728,3,'s_ID_" + "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) + ",-3145728,3,'s_ID_" "4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,'Welcome to " "Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A316874747" "03A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F65" "6E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7" "777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F7765" "6C636F6D652E68746D6C1200');" - "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000,12900155550" - "0000000,129001555500000000,129001555500000000,1048576,7,'s_ID_5" + "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) + ",1048576,7,'s_ID_5" "','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google','Goo" "gle',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C65" "2E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F777" "7772E676F6F676C652E636F6D2F12084147464447415347');" - "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000,12905397617" - "0000000,129053976170000000,129053976170000000,-4194304,6,'s_ID_" + "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) + ",-4194304,6,'s_ID_" "6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet','The In" "ternet',NULL,NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000,12897686475" - "8480000,128976864758480000,128976864758480000,1048576,0,'s_ID_7" + "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) + ",1048576,0,'s_ID_7" "','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome','" "google_chrome',NULL,NULL,NULL);" - "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000,12897686475" - "8480000,128976864758480000,128976864758480000,1048576,0,'s_ID_8" + "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) + ",1048576,0,'s_ID_8" "','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks','Bookmarks'" ",'google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000,12897686475" - "8480000,128976864758480000,128976864758480000,1048576,1,'s_ID_9" + "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) + ",1048576,1,'s_ID_9" "','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar','B" "ookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000,1289768647" - "58480000,128976864758480000,128976864758480000,2097152,2,'s_ID_" + "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) + ",2097152,2,'s_ID_" "10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,'Other Bookmarks" "','Other Bookmarks','other_bookmarks',NULL,X'C2881000',X'C28810" "00');" - "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000,1290799569" - "48440000,129079956948440000,129079956948440000,-1048576,8,'s_ID" + "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) + ",-1048576,8,'s_ID" "_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,'Home (The Chr" "omium Projects)','Home (The Chromium Projects)',NULL,NULL,X'C28" "810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F120641" "4741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756" "D2E6F72672F6F7468657212084146414756415346');" - "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000,1290799575" - "13650000,129079957513650000,129079957513650000,0,9,'s_ID_12','s" + "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) + ",0,9,'s_ID_12','s" "_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,'Extra Bookmark" "s','Extra Bookmarks',NULL,NULL,X'C2881000',X'C2881000');" - "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000,1290799579" - "85300000,129079957985300000,129079957985300000,-917504,10,'s_ID" + "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) + ",-917504,10,'s_ID" "_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,'ICANN |" " Internet Corporation for Assigned Names and Numbers','ICANN | " "Internet Corporation for Assigned Names and Numbers',NULL,NULL," "X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504" "E474158463041414646',X'C28810200A15687474703A2F2F7777772E696361" "6E6E2E636F6D2F120744414146415346');" - "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000,1290799583" - "83000000,129079958383000000,129079958383000000,1048576,11,'s_ID" + "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) + ",1048576,11,'s_ID" "_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,'The WebKit Op" "en Source Project','The WebKit Open Source Project',NULL,NULL,X" "'C288101A0A12687474703A2F2F7765626B69742E6F72672F1204504E4758'," @@ -1058,6 +1336,104 @@ void MigrationTest::SetUpVersion75Database() { ASSERT_TRUE(connection.CommitTransaction()); } +void MigrationTest::SetUpVersion76Database() { + sql::Connection connection; + ASSERT_TRUE(connection.Open(GetDatabasePath())); + ASSERT_TRUE(connection.BeginTransaction()); + ASSERT_TRUE(connection.Execute( + "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" + "INSERT INTO 'share_version' VALUES('nick@chromium.org',76);" + "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, in" + "itial_sync_ended BOOLEAN default 0);" + "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1);" + "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" + "_version bigint default -1,server_version bigint default 0,mtime big" + "int default 0,server_mtime bigint default 0,ctime bigint default 0,s" + "erver_ctime bigint default 0,server_position_in_parent bigint defaul" + "t 0,local_external_id bigint default 0,id varchar(255) default 'r',p" + "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" + "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" + "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" + "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," + "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" + "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" + "har,specifics blob,server_specifics blob);" + "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) + ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'')" + ";" + "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) + ",-2097152,4,'s_ID_2','s_ID_9" + "','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,'Deleted Item','Deleted Ite" + "m',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6" + "D2F12084141534741534741',X'C28810260A17687474703A2F2F7777772E676F6F6" + "76C652E636F6D2F32120B4153414447414447414447');" + "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) + ",-3145728,3,'s_ID_4','s_ID_9" + "','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,'Welcome to Chromium','Welc" + "ome to Chromium',NULL,NULL,X'C28810350A31687474703A2F2F7777772E676F6" + "F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D652E68746" + "D6C1200',X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6" + "368726F6D652F696E746C2F656E2F77656C636F6D652E68746D6C1200');" + "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) + ",1048576,7,'s_ID_5','s_ID_9'" + ",'s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google','Google',NULL,NULL," + "X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F1208414741" + "5347415347',X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D" + "2F12084147464447415347');" + "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) + ",-4194304,6,'s_ID_6','s_ID_9" + "','s_ID_9','r','r',0,0,0,1,1,0,'The Internet','The Internet',NULL,NU" + "LL,X'C2881000',X'C2881000');" + "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) + ",1048576,0,'s_ID_7','r','r'," + "'r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome','google_chrome'," + "NULL,NULL,NULL);" + "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) + ",1048576,0,'s_ID_8','s_ID_7'" + ",'s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks','Bookmarks','google_chrome" + "_bookmarks',NULL,X'C2881000',X'C2881000');" + "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) + ",1048576,1,'s_ID_9','s_ID_8'" + ",'s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar','Bookmark Bar','b" + "ookmark_bar',NULL,X'C2881000',X'C2881000');" + "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) + ",2097152,2,'s_ID_10','s_ID_" + "8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,'Other Bookmarks','Other Bookma" + "rks','other_bookmarks',NULL,X'C2881000',X'C2881000');" + "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) + ",-1048576,8,'s_ID_11','s_ID" + "_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,'Home (The Chromium Projects)" + "','Home (The Chromium Projects)',NULL,NULL,X'C28810220A18687474703A2" + "F2F6465762E6368726F6D69756D2E6F72672F1206414741545741',X'C28810290A1" + "D687474703A2F2F6465762E6368726F6D69756D2E6F72672F6F74686572120841464" + "14756415346');" + "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) + ",0,9,'s_ID_12','s_ID_6','s_" + "ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bookm" + "arks',NULL,NULL,X'C2881000',X'C2881000');" + "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) + ",-917504,10,'s_ID_13','s_ID" + "_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,'ICANN | Internet Corpo" + "ration for Assigned Names and Numbers','ICANN | Internet Corporation" + " for Assigned Names and Numbers',NULL,NULL,X'C28810240A15687474703A2" + "F2F7777772E6963616E6E2E636F6D2F120B504E474158463041414646',X'C288102" + "00A15687474703A2F2F7777772E6963616E6E2E636F6D2F120744414146415346');" + "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) + ",1048576,11,'s_ID_14','s_ID" + "_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,'The WebKit Open Source Proje" + "ct','The WebKit Open Source Project',NULL,NULL,X'C288101A0A126874747" + "03A2F2F7765626B69742E6F72672F1204504E4758',X'C288101C0A13687474703A2" + "F2F7765626B69742E6F72672F781205504E473259');" + "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" + "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defa" + "ult -2, cache_guid TEXT , notification_state BLOB);" + "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," + "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542,'" + "9010788312004066376x-6609234393368420856x',NULL);" + )); + ASSERT_TRUE(connection.CommitTransaction()); +} + TEST_F(DirectoryBackingStoreTest, MigrateVersion67To68) { SetUpVersion67Database(); @@ -1377,6 +1753,37 @@ TEST_F(DirectoryBackingStoreTest, MigrateVersion75To76) { "autofill_profiles_added_during_migration")); } +TEST_F(DirectoryBackingStoreTest, MigrateVersion76To77) { + SetUpVersion76Database(); + + scoped_ptr<DirectoryBackingStore> dbs( + new DirectoryBackingStore(GetUsername(), GetDatabasePath())); + dbs->BeginLoad(); + ASSERT_FALSE(dbs->needs_column_refresh_); + + EXPECT_EQ(GetExpectedLegacyMetaProtoTimes(), + GetMetaProtoTimes(dbs->load_dbhandle_)); + // Since we the proto times are expected to be in a legacy format, + // they may not be compatible with ProtoTimeToTime, so we don't call + // ExpectTimes(). + + ASSERT_TRUE(dbs->MigrateVersion76To77()); + ASSERT_EQ(77, dbs->GetVersion()); + + EXPECT_EQ(GetExpectedMetaProtoTimes(), + GetMetaProtoTimes(dbs->load_dbhandle_)); + + { + MetahandlesIndex index; + STLElementDeleter<MetahandlesIndex> index_deleter(&index); + dbs->LoadEntries(&index); + ExpectTimes(index, GetExpectedMetaTimes()); + } + + dbs->EndLoad(); + ASSERT_FALSE(dbs->needs_column_refresh_); +} + TEST_P(MigrationTest, ToCurrentVersion) { switch (GetParam()) { case 67: @@ -1406,6 +1813,9 @@ TEST_P(MigrationTest, ToCurrentVersion) { case 75: SetUpVersion75Database(); break; + case 76: + SetUpVersion76Database(); + break; default: // If you see this error, it may mean that you've increased the // database version number but you haven't finished adding unit tests @@ -1416,11 +1826,13 @@ TEST_P(MigrationTest, ToCurrentVersion) { // 2. Set a breakpoint in this function and run the unit test. // 3. Allow this test to run to completion (step out of the call), // without allowing ~MigrationTest to execute. - // 4. Examine this->scoped_dir_ to determine the location of the + // 4. Examine this->temp_dir_ to determine the location of the // test database (it is currently of the version you need). - // 5. Dump this using the sqlite command line tool: + // 5. Dump this using the sqlite3 command line tool: // > .output foo_dump.sql // > .dump + // 6. Replace the timestamp columns with META_PROTO_TIMES(x) (or + // LEGACY_META_PROTO_TIMES(x) if before Version 77). FAIL() << "Need to supply database dump for version " << GetParam(); } @@ -1513,6 +1925,11 @@ TEST_P(MigrationTest, ToCurrentVersion) { MetahandlesIndex index; STLElementDeleter<MetahandlesIndex> index_deleter(&index); dbs->LoadEntries(&index); + + EXPECT_EQ(GetExpectedMetaProtoTimes(), + GetMetaProtoTimes(dbs->load_dbhandle_)); + ExpectTimes(index, GetExpectedMetaTimes()); + dbs->EndLoad(); MetahandlesIndex::iterator it = index.begin(); diff --git a/chrome/browser/sync/syncable/syncable.cc b/chrome/browser/sync/syncable/syncable.cc index aa6183e..dbece44 100644 --- a/chrome/browser/sync/syncable/syncable.cc +++ b/chrome/browser/sync/syncable/syncable.cc @@ -4,20 +4,6 @@ #include "chrome/browser/sync/syncable/syncable.h" -#include "build/build_config.h" - -#include <sys/stat.h> -#if defined(OS_POSIX) -#include <sys/time.h> -#endif -#include <sys/types.h> -#include <time.h> -#if defined(OS_MACOSX) -#include <CoreFoundation/CoreFoundation.h> -#elif defined(OS_WIN) -#include <shlwapi.h> // for PathMatchSpec -#endif - #include <algorithm> #include <cstring> #include <functional> @@ -142,25 +128,6 @@ ListValue* EntryKernelMutationMapToValue( return list; } -int64 Now() { -#if defined(OS_WIN) - FILETIME filetime; - SYSTEMTIME systime; - GetSystemTime(&systime); - SystemTimeToFileTime(&systime, &filetime); - // MSDN recommends converting via memcpy like this. - LARGE_INTEGER n; - memcpy(&n, &filetime, sizeof(filetime)); - return n.QuadPart; -#elif defined(OS_POSIX) - struct timeval tv; - gettimeofday(&tv, NULL); - return static_cast<int64>(tv.tv_sec); -#else -#error NEED OS SPECIFIC Now() implementation -#endif -} - namespace { // A ScopedIndexUpdater temporarily removes an entry from an index, @@ -245,7 +212,10 @@ bool ParentIdAndHandleIndexer::ShouldInclude(const EntryKernel* a) { // EntryKernel EntryKernel::EntryKernel() : dirty_(false) { - memset(int64_fields, 0, sizeof(int64_fields)); + // Everything else should already be default-initialized. + for (int i = INT64_FIELDS_BEGIN; i < INT64_FIELDS_END; ++i) { + int64_fields[i] = 0; + } } EntryKernel::~EntryKernel() {} @@ -307,6 +277,10 @@ StringValue* Int64ToValue(int64 i) { return Value::CreateStringValue(base::Int64ToString(i)); } +StringValue* TimeToValue(const base::Time& t) { + return Value::CreateStringValue(browser_sync::GetTimeDebugString(t)); +} + StringValue* IdToValue(const Id& id) { return id.ToValue(); } @@ -328,6 +302,11 @@ DictionaryValue* EntryKernel::ToValue() const { &GetInt64FieldString, &Int64ToValue, BASE_VERSION + 1, INT64_FIELDS_END - 1); + // Time fields. + SetFieldValues(*this, kernel_info, + &GetTimeFieldString, &TimeToValue, + TIME_FIELDS_BEGIN, TIME_FIELDS_END - 1); + // ID fields. SetFieldValues(*this, kernel_info, &GetIdFieldString, &IdToValue, @@ -610,21 +589,6 @@ EntryKernel* Directory::GetRootEntry() { return GetEntryById(Id()); } -void ZeroFields(EntryKernel* entry, int first_field) { - int i = first_field; - // Note that bitset<> constructor sets all bits to zero, and strings - // initialize to empty. - for ( ; i < INT64_FIELDS_END; ++i) - entry->put(static_cast<Int64Field>(i), 0); - for ( ; i < ID_FIELDS_END; ++i) - entry->mutable_ref(static_cast<IdField>(i)).Clear(); - for ( ; i < BIT_FIELDS_END; ++i) - entry->put(static_cast<BitField>(i), false); - if (i < PROTO_FIELDS_END) - i = PROTO_FIELDS_END; - entry->clear_dirty(NULL); -} - void Directory::InsertEntry(EntryKernel* entry) { ScopedKernelLock lock(this); InsertEntry(entry, &lock); @@ -1439,14 +1403,13 @@ MutableEntry::MutableEntry(WriteTransaction* trans, Create, void MutableEntry::Init(WriteTransaction* trans, const Id& parent_id, const string& name) { - kernel_ = new EntryKernel; - ZeroFields(kernel_, BEGIN_FIELDS); + kernel_ = new EntryKernel(); kernel_->put(ID, trans->directory_->NextId()); kernel_->put(META_HANDLE, trans->directory_->NextMetahandle()); kernel_->mark_dirty(trans->directory_->kernel_->dirty_metahandles); kernel_->put(PARENT_ID, parent_id); kernel_->put(NON_UNIQUE_NAME, name); - const int64 now = Now(); + const base::Time& now = base::Time::Now(); kernel_->put(CTIME, now); kernel_->put(MTIME, now); // We match the database defaults here @@ -1466,8 +1429,7 @@ MutableEntry::MutableEntry(WriteTransaction* trans, CreateNewUpdateItem, kernel_ = NULL; // already have an item with this ID. return; } - kernel_ = new EntryKernel; - ZeroFields(kernel_, BEGIN_FIELDS); + kernel_ = new EntryKernel(); kernel_->put(ID, id); kernel_->put(META_HANDLE, trans->directory_->NextMetahandle()); kernel_->mark_dirty(trans->directory_->kernel_->dirty_metahandles); @@ -1542,6 +1504,15 @@ bool MutableEntry::Put(Int64Field field, const int64& value) { return true; } +bool MutableEntry::Put(TimeField field, const base::Time& value) { + DCHECK(kernel_); + if (kernel_->ref(field) != value) { + kernel_->put(field, value); + kernel_->mark_dirty(dir()->kernel_->dirty_metahandles); + } + return true; +} + bool MutableEntry::Put(IdField field, const Id& value) { DCHECK(kernel_); if (kernel_->ref(field) != value) { @@ -1914,6 +1885,11 @@ std::ostream& operator<<(std::ostream& os, const Entry& entry) { os << g_metas_columns[i].name << ": " << kernel->ref(static_cast<Int64Field>(i)) << ", "; } + for ( ; i < TIME_FIELDS_END; ++i) { + os << g_metas_columns[i].name << ": " + << browser_sync::GetTimeDebugString( + kernel->ref(static_cast<TimeField>(i))) << ", "; + } for ( ; i < ID_FIELDS_END; ++i) { os << g_metas_columns[i].name << ": " << kernel->ref(static_cast<IdField>(i)) << ", "; diff --git a/chrome/browser/sync/syncable/syncable.h b/chrome/browser/sync/syncable/syncable.h index 535ab8e..a3b3bcd 100644 --- a/chrome/browser/sync/syncable/syncable.h +++ b/chrome/browser/sync/syncable/syncable.h @@ -34,6 +34,7 @@ #include "chrome/browser/sync/syncable/model_type.h" #include "chrome/browser/sync/util/dbgq.h" #include "chrome/browser/sync/util/immutable.h" +#include "chrome/browser/sync/util/time.h" struct PurgeInfo; @@ -59,8 +60,14 @@ class DirectoryBackingStore; static const int64 kInvalidMetaHandle = 0; -// Update syncable_enum_conversions{.h,.cc,_unittest.cc} if you change -// any fields in this file. +// Things you need to update if you change any of the fields below: +// - EntryKernel struct in syncable.h (this file) +// - syncable_columns.h +// - syncable_enum_conversions{.h,.cc,_unittest.cc} +// - EntryKernel::EntryKernel(), EntryKernel::ToValue(), operator<< +// for Entry in syncable.cc +// - BindFields() and UnpackEntry() in directory_backing_store.cc +// - TestSimpleFieldsPreservedDuringSaveChanges in syncable_unittest.cc enum { BEGIN_FIELDS = 0, @@ -81,10 +88,6 @@ enum BaseVersion { enum Int64Field { SERVER_VERSION = BASE_VERSION + 1, - MTIME, - SERVER_MTIME, - CTIME, - SERVER_CTIME, // A numeric position value that indicates the relative ordering of // this object among its siblings. @@ -97,8 +100,21 @@ enum Int64Field { }; enum { - INT64_FIELDS_COUNT = INT64_FIELDS_END, - ID_FIELDS_BEGIN = INT64_FIELDS_END, + INT64_FIELDS_COUNT = INT64_FIELDS_END - INT64_FIELDS_BEGIN, + TIME_FIELDS_BEGIN = INT64_FIELDS_END, +}; + +enum TimeField { + MTIME = TIME_FIELDS_BEGIN, + SERVER_MTIME, + CTIME, + SERVER_CTIME, + TIME_FIELDS_END, +}; + +enum { + TIME_FIELDS_COUNT = TIME_FIELDS_END - TIME_FIELDS_BEGIN, + ID_FIELDS_BEGIN = TIME_FIELDS_END, }; enum IdField { @@ -237,6 +253,7 @@ struct EntryKernel { std::string string_fields[STRING_FIELDS_COUNT]; sync_pb::EntitySpecifics specifics_fields[PROTO_FIELDS_COUNT]; int64 int64_fields[INT64_FIELDS_COUNT]; + base::Time time_fields[TIME_FIELDS_COUNT]; Id id_fields[ID_FIELDS_COUNT]; std::bitset<BIT_FIELDS_COUNT> bit_fields; std::bitset<BIT_TEMPS_COUNT> bit_temps; @@ -278,6 +295,13 @@ struct EntryKernel { inline void put(Int64Field field, int64 value) { int64_fields[field - INT64_FIELDS_BEGIN] = value; } + inline void put(TimeField field, const base::Time& value) { + // Round-trip to proto time format and back so that we have + // consistent time resolutions (ms). + time_fields[field - TIME_FIELDS_BEGIN] = + browser_sync::ProtoTimeToTime( + browser_sync::TimeToProtoTime(value)); + } inline void put(IdField field, const Id& value) { id_fields[field - ID_FIELDS_BEGIN] = value; } @@ -310,6 +334,9 @@ struct EntryKernel { inline int64 ref(Int64Field field) const { return int64_fields[field - INT64_FIELDS_BEGIN]; } + inline const base::Time& ref(TimeField field) const { + return time_fields[field - TIME_FIELDS_BEGIN]; + } inline const Id& ref(IdField field) const { return id_fields[field - ID_FIELDS_BEGIN]; } @@ -389,6 +416,10 @@ class Entry { DCHECK(kernel_); return kernel_->ref(field); } + inline const base::Time& Get(TimeField field) const { + DCHECK(kernel_); + return kernel_->ref(field); + } inline int64 Get(BaseVersion field) const { DCHECK(kernel_); return kernel_->ref(field); @@ -490,6 +521,7 @@ class MutableEntry : public Entry { // that putting the value would have caused a duplicate in the index. // TODO(chron): Remove some of these unecessary return values. bool Put(Int64Field field, const int64& value); + bool Put(TimeField field, const base::Time& value); bool Put(IdField field, const Id& value); // Do a simple property-only update if the PARENT_ID field. Use with caution. @@ -1213,15 +1245,9 @@ class WriteTransaction : public BaseTransaction { bool IsLegalNewParent(BaseTransaction* trans, const Id& id, const Id& parentid); -int64 Now(); - // This function sets only the flags needed to get this entry to sync. void MarkForSyncing(syncable::MutableEntry* e); -// This is not a reset. It just sets the numeric fields which are not -// initialized by the constructor to zero. -void ZeroFields(EntryKernel* entry, int first_field); - } // namespace syncable std::ostream& operator <<(std::ostream&, const syncable::Blob&); diff --git a/chrome/browser/sync/syncable/syncable_columns.h b/chrome/browser/sync/syncable/syncable_columns.h index 94bd0ac..ca9c094 100644 --- a/chrome/browser/sync/syncable/syncable_columns.h +++ b/chrome/browser/sync/syncable/syncable_columns.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 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. @@ -23,15 +23,15 @@ static const ColumnSpec g_metas_columns[] = { {"metahandle", "bigint primary key ON CONFLICT FAIL"}, {"base_version", "bigint default " CHANGES_VERSION_STRING}, {"server_version", "bigint default 0"}, - // These timestamps are kept in native file timestamp format. It is - // up to the syncer to translate to Java time when syncing. + {"server_position_in_parent", "bigint default 0"}, + // This is the item ID that we store for the embedding application. + {"local_external_id", "bigint default 0"}, + // These timestamps are kept in the same format as that of the + // protocol (ms since Unix epoch). {"mtime", "bigint default 0"}, {"server_mtime", "bigint default 0"}, {"ctime", "bigint default 0"}, {"server_ctime", "bigint default 0"}, - {"server_position_in_parent", "bigint default 0"}, - // This is the item ID that we store for the embedding application. - {"local_external_id", "bigint default 0"}, ////////////////////////////////////// // Ids {"id", "varchar(255) default \"r\""}, diff --git a/chrome/browser/sync/syncable/syncable_enum_conversions.cc b/chrome/browser/sync/syncable/syncable_enum_conversions.cc index 95afe49..0a371d9 100644 --- a/chrome/browser/sync/syncable/syncable_enum_conversions.cc +++ b/chrome/browser/sync/syncable/syncable_enum_conversions.cc @@ -48,13 +48,23 @@ const char* GetInt64FieldString(Int64Field int64_field) { BASE_VERSION + 1, INT64_FIELDS_END - 1); switch (int64_field) { ENUM_CASE(SERVER_VERSION); + ENUM_CASE(SERVER_POSITION_IN_PARENT); + ENUM_CASE(LOCAL_EXTERNAL_ID); + case INT64_FIELDS_END: break; + } + NOTREACHED(); + return ""; +} + +const char* GetTimeFieldString(TimeField time_field) { + ASSERT_ENUM_BOUNDS(SERVER_VERSION, LOCAL_EXTERNAL_ID, + BASE_VERSION + 1, INT64_FIELDS_END - 1); + switch (time_field) { ENUM_CASE(MTIME); ENUM_CASE(SERVER_MTIME); ENUM_CASE(CTIME); ENUM_CASE(SERVER_CTIME); - ENUM_CASE(SERVER_POSITION_IN_PARENT); - ENUM_CASE(LOCAL_EXTERNAL_ID); - case INT64_FIELDS_END: break; + case TIME_FIELDS_END: break; } NOTREACHED(); return ""; diff --git a/chrome/browser/sync/syncable/syncable_enum_conversions.h b/chrome/browser/sync/syncable/syncable_enum_conversions.h index eede89e..b48cc28 100644 --- a/chrome/browser/sync/syncable/syncable_enum_conversions.h +++ b/chrome/browser/sync/syncable/syncable_enum_conversions.h @@ -24,6 +24,8 @@ const char* GetBaseVersionString(BaseVersion base_version); const char* GetInt64FieldString(Int64Field int64_field); +const char* GetTimeFieldString(TimeField time_field); + const char* GetIdFieldString(IdField id_field); const char* GetIndexedBitFieldString(IndexedBitField indexed_bit_field); diff --git a/chrome/browser/sync/syncable/syncable_enum_conversions_unittest.cc b/chrome/browser/sync/syncable/syncable_enum_conversions_unittest.cc index 3661765..4d55634 100644 --- a/chrome/browser/sync/syncable/syncable_enum_conversions_unittest.cc +++ b/chrome/browser/sync/syncable/syncable_enum_conversions_unittest.cc @@ -41,6 +41,11 @@ TEST_F(SyncableEnumConversionsTest, GetInt64FieldString) { GetInt64FieldString, BASE_VERSION + 1, INT64_FIELDS_END - 1); } +TEST_F(SyncableEnumConversionsTest, GetTimeFieldString) { + TestEnumStringFunction( + GetTimeFieldString, TIME_FIELDS_BEGIN, TIME_FIELDS_END - 1); +} + TEST_F(SyncableEnumConversionsTest, GetIdFieldString) { TestEnumStringFunction( GetIdFieldString, ID_FIELDS_BEGIN, ID_FIELDS_END - 1); diff --git a/chrome/browser/sync/syncable/syncable_unittest.cc b/chrome/browser/sync/syncable/syncable_unittest.cc index c79442c..c0ce9bd 100644 --- a/chrome/browser/sync/syncable/syncable_unittest.cc +++ b/chrome/browser/sync/syncable/syncable_unittest.cc @@ -1150,6 +1150,14 @@ TEST_F(SyncableDirectoryTest, TestSimpleFieldsPreservedDuringSaveChanges) { update_post_save.ref((Int64Field)i)) << "int64 field #" << i << " changed during save/load"; } + for ( ; i < TIME_FIELDS_END ; ++i) { + EXPECT_EQ(create_pre_save.ref((TimeField)i), + create_post_save.ref((TimeField)i)) + << "time field #" << i << " changed during save/load"; + EXPECT_EQ(update_pre_save.ref((TimeField)i), + update_post_save.ref((TimeField)i)) + << "time field #" << i << " changed during save/load"; + } for ( ; i < ID_FIELDS_END ; ++i) { EXPECT_EQ(create_pre_save.ref((IdField)i), create_post_save.ref((IdField)i)) diff --git a/chrome/browser/sync/util/sqlite_utils.cc b/chrome/browser/sync/util/sqlite_utils.cc index 20e9896..725fd8d 100644 --- a/chrome/browser/sync/util/sqlite_utils.cc +++ b/chrome/browser/sync/util/sqlite_utils.cc @@ -34,6 +34,7 @@ class DebugSQLErrorHandler: public VanillaSQLErrorHandler { virtual int HandleError(int error, sqlite3* db) { error_ = error; NOTREACHED() << "sqlite error " << error + << " " << sqlite3_errmsg(db) << " db " << static_cast<void*>(db); return error; } diff --git a/chrome/browser/sync/util/time.cc b/chrome/browser/sync/util/time.cc new file mode 100644 index 0000000..ad309d0 --- /dev/null +++ b/chrome/browser/sync/util/time.cc @@ -0,0 +1,24 @@ +// Copyright (c) 2011 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/util/time.h" + +#include "base/i18n/time_formatting.h" +#include "base/utf_string_conversions.h" + +namespace browser_sync { + +int64 TimeToProtoTime(const base::Time& t) { + return (t - base::Time::UnixEpoch()).InMilliseconds(); +} + +base::Time ProtoTimeToTime(int64 proto_t) { + return base::Time::UnixEpoch() + base::TimeDelta::FromMilliseconds(proto_t); +} + +std::string GetTimeDebugString(const base::Time& t) { + return UTF16ToUTF8(base::TimeFormatFriendlyDateAndTime(t)); +} + +} // namespace browser_sync diff --git a/chrome/browser/sync/util/time.h b/chrome/browser/sync/util/time.h new file mode 100644 index 0000000..473f7e2 --- /dev/null +++ b/chrome/browser/sync/util/time.h @@ -0,0 +1,29 @@ +// Copyright (c) 2011 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. +// +// Time-related sync functions. + +#ifndef CHROME_BROWSER_SYNC_UTIL_TIME_H_ +#define CHROME_BROWSER_SYNC_UTIL_TIME_H_ +#pragma once + +#include <string> + +#include "base/basictypes.h" +#include "base/time.h" + +namespace browser_sync { + +// Converts a time object to the format used in sync protobufs (ms +// since the Unix epoch). +int64 TimeToProtoTime(const base::Time& t); + +// Converts a time field from sync protobufs to a time object. +base::Time ProtoTimeToTime(int64 proto_t); + +std::string GetTimeDebugString(const base::Time& t); + +} // namespace browser_sync + +#endif // CHROME_BROWSER_SYNC_UTIL_TIME_H_ diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index 226ed0e..d293039 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -701,6 +701,8 @@ 'browser/sync/util/oauth.h', 'browser/sync/util/sqlite_utils.cc', 'browser/sync/util/sqlite_utils.h', + 'browser/sync/util/time.cc', + 'browser/sync/util/time.h', 'browser/sync/util/user_settings.cc', 'browser/sync/util/user_settings.h', 'browser/sync/util/user_settings_posix.cc', |