summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-22 00:57:51 +0000
committerakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-22 00:57:51 +0000
commit2fc32da1d5ce09de63658853a0972a32cca5e46c (patch)
treea769e0a3fb81a928439798609071f249ea213726 /chrome
parente62a23a8d9f3ace39422d38c4dd821b05a53c6e4 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/sync/engine/build_commit_command.cc8
-rw-r--r--chrome/browser/sync/engine/process_commit_response_command.cc5
-rw-r--r--chrome/browser/sync/engine/syncer.cc6
-rw-r--r--chrome/browser/sync/engine/syncer_proto_util.cc19
-rw-r--r--chrome/browser/sync/engine/syncer_unittest.cc16
-rw-r--r--chrome/browser/sync/engine/syncer_util.cc17
-rw-r--r--chrome/browser/sync/engine/syncer_util.h38
-rw-r--r--chrome/browser/sync/glue/session_change_processor.cc2
-rw-r--r--chrome/browser/sync/glue/session_model_associator.cc16
-rw-r--r--chrome/browser/sync/glue/session_model_associator.h7
-rw-r--r--chrome/browser/sync/glue/session_model_associator_unittest.cc5
-rw-r--r--chrome/browser/sync/internal_api/base_node.cc9
-rw-r--r--chrome/browser/sync/internal_api/base_node.h4
-rw-r--r--chrome/browser/sync/internal_api/syncapi_unittest.cc10
-rw-r--r--chrome/browser/sync/profile_sync_service_session_unittest.cc5
-rw-r--r--chrome/browser/sync/sessions/sync_session_unittest.cc1
-rw-r--r--chrome/browser/sync/syncable/directory_backing_store.cc66
-rw-r--r--chrome/browser/sync/syncable/directory_backing_store.h2
-rw-r--r--chrome/browser/sync/syncable/directory_backing_store_unittest.cc889
-rw-r--r--chrome/browser/sync/syncable/syncable.cc84
-rw-r--r--chrome/browser/sync/syncable/syncable.h54
-rw-r--r--chrome/browser/sync/syncable/syncable_columns.h12
-rw-r--r--chrome/browser/sync/syncable/syncable_enum_conversions.cc16
-rw-r--r--chrome/browser/sync/syncable/syncable_enum_conversions.h2
-rw-r--r--chrome/browser/sync/syncable/syncable_enum_conversions_unittest.cc5
-rw-r--r--chrome/browser/sync/syncable/syncable_unittest.cc8
-rw-r--r--chrome/browser/sync/util/sqlite_utils.cc1
-rw-r--r--chrome/browser/sync/util/time.cc24
-rw-r--r--chrome/browser/sync/util/time.h29
-rw-r--r--chrome/chrome.gyp2
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',