summaryrefslogtreecommitdiffstats
path: root/sync
diff options
context:
space:
mode:
authorhaitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-14 22:41:55 +0000
committerhaitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-14 22:41:55 +0000
commit09301f4955d25207a842f905ef2942842f6e0dff (patch)
tree06b9ee6559ee40e25d16021b9bacd30c31cd511c /sync
parent99132862d26d3eeff3c875337ee704549c3fa37d (diff)
downloadchromium_src-09301f4955d25207a842f905ef2942842f6e0dff.zip
chromium_src-09301f4955d25207a842f905ef2942842f6e0dff.tar.gz
chromium_src-09301f4955d25207a842f905ef2942842f6e0dff.tar.bz2
[sync] Add backup time in synced device info so that server knows which device can be rolled back to when.
Backup DB is checked and backup time in device info is updated periodically to keep server informed about backup state. BUG=362679 TBR=gbillock@chromium.org Review URL: https://codereview.chromium.org/332923002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@283060 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sync')
-rw-r--r--sync/internal_api/DEPS1
-rw-r--r--sync/internal_api/public/util/sync_db_util.h30
-rw-r--r--sync/internal_api/sync_db_util.cc38
-rw-r--r--sync/protocol/DEPS1
-rw-r--r--sync/protocol/device_info_specifics.proto4
-rw-r--r--sync/protocol/proto_value_conversions.cc10
-rw-r--r--sync/sync_internal_api.gypi2
7 files changed, 86 insertions, 0 deletions
diff --git a/sync/internal_api/DEPS b/sync/internal_api/DEPS
index 13e6b8a..42ab18e 100644
--- a/sync/internal_api/DEPS
+++ b/sync/internal_api/DEPS
@@ -4,6 +4,7 @@ include_rules = [
"+net/http",
"+net/test",
"+net/url_request",
+ "+sql",
"+sync/base",
"+sync/engine",
"+sync/js",
diff --git a/sync/internal_api/public/util/sync_db_util.h b/sync/internal_api/public/util/sync_db_util.h
new file mode 100644
index 0000000..3784a10
--- /dev/null
+++ b/sync/internal_api/public/util/sync_db_util.h
@@ -0,0 +1,30 @@
+// Copyright 2014 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.
+
+#ifndef SYNC_INTERNAL_API_PUBLIC_UTIL_SYNC_DB_UTIL_H_
+#define SYNC_INTERNAL_API_PUBLIC_UTIL_SYNC_DB_UTIL_H_
+
+#include "base/callback.h"
+#include "base/memory/ref_counted.h"
+#include "base/time/time.h"
+#include "sync/base/sync_export.h"
+
+namespace base {
+class FilePath;
+class SingleThreadTaskRunner;
+} // namespace base
+
+namespace syncer {
+
+// Check integrity of sync DB under |sync_dir|. Invoke |callback| with last
+// modified time if integrity check passes, with NULL time otherwise. This
+// is called on either sync thread or IO thread.
+SYNC_EXPORT void CheckSyncDbLastModifiedTime(
+ const base::FilePath& sync_dir,
+ scoped_refptr<base::SingleThreadTaskRunner> callback_runner,
+ base::Callback<void(base::Time)> callback);
+
+} // namesapce syncer
+
+#endif // SYNC_INTERNAL_API_PUBLIC_UTIL_SYNC_DB_UTIL_H_
diff --git a/sync/internal_api/sync_db_util.cc b/sync/internal_api/sync_db_util.cc
new file mode 100644
index 0000000..c12889d
--- /dev/null
+++ b/sync/internal_api/sync_db_util.cc
@@ -0,0 +1,38 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "sync/internal_api/public/util/sync_db_util.h"
+
+#include "base/files/file_path.h"
+#include "base/single_thread_task_runner.h"
+#include "sql/connection.h"
+#include "sync/syncable/directory.h"
+
+namespace syncer {
+
+void CheckSyncDbLastModifiedTime(
+ const base::FilePath& sync_dir,
+ scoped_refptr<base::SingleThreadTaskRunner> callback_runner,
+ base::Callback<void(base::Time)> callback) {
+ const base::FilePath sync_db =
+ sync_dir.Append(syncable::Directory::kSyncDatabaseFilename);
+
+ base::File f(sync_db, base::File::FLAG_OPEN | base::File::FLAG_READ);
+ base::File::Info info;
+ if (!f.IsValid() || !f.GetInfo(&info)) {
+ callback_runner->PostTask(FROM_HERE, base::Bind(callback, base::Time()));
+ return;
+ }
+ f.Close();
+
+ sql::Connection db;
+ if (!db.Open(sync_db) || !db.QuickIntegrityCheck()) {
+ callback_runner->PostTask(FROM_HERE, base::Bind(callback, base::Time()));
+ } else {
+ callback_runner->PostTask(FROM_HERE,
+ base::Bind(callback, info.last_modified));
+ }
+}
+
+} // namespace syncer
diff --git a/sync/protocol/DEPS b/sync/protocol/DEPS
index f8f9de5..d623db8 100644
--- a/sync/protocol/DEPS
+++ b/sync/protocol/DEPS
@@ -1,4 +1,5 @@
include_rules = [
"+sync/base",
"+sync/internal_api/public/base",
+ "+sync/util",
]
diff --git a/sync/protocol/device_info_specifics.proto b/sync/protocol/device_info_specifics.proto
index 67eb469..f87b361 100644
--- a/sync/protocol/device_info_specifics.proto
+++ b/sync/protocol/device_info_specifics.proto
@@ -34,4 +34,8 @@ message DeviceInfoSpecifics {
// The Chrome instance's version. Updated (if necessary) on every startup.
optional string chrome_version = 5;
+
+ // Last time when pre-sync data on the device was saved. The device can be
+ // restored to state back to this time. In millisecond since UNIX epoch.
+ optional int64 backup_timestamp = 6;
}
diff --git a/sync/protocol/proto_value_conversions.cc b/sync/protocol/proto_value_conversions.cc
index 8e58af4..2716210 100644
--- a/sync/protocol/proto_value_conversions.cc
+++ b/sync/protocol/proto_value_conversions.cc
@@ -10,8 +10,10 @@
#include "base/base64.h"
#include "base/basictypes.h"
+#include "base/i18n/time_formatting.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
+#include "base/time/time.h"
#include "base/values.h"
#include "sync/internal_api/public/base/unique_position.h"
#include "sync/protocol/app_list_specifics.pb.h"
@@ -41,6 +43,7 @@
#include "sync/protocol/theme_specifics.pb.h"
#include "sync/protocol/typed_url_specifics.pb.h"
#include "sync/protocol/unique_position.pb.h"
+#include "sync/util/time.h"
namespace syncer {
@@ -82,6 +85,11 @@ base::ListValue* MakeRepeatedValue(const F& fields, V* (*converter_fn)(T)) {
return list;
}
+base::StringValue* MakeTimestampValue(int64 tm) {
+ return new base::StringValue(
+ base::TimeFormatShortDateAndTime(syncer::ProtoTimeToTime(tm)));
+}
+
} // namespace
// Helper macros to reduce the amount of boilerplate.
@@ -102,6 +110,7 @@ base::ListValue* MakeRepeatedValue(const F& fields, V* (*converter_fn)(T)) {
#define SET_INT64(field) SET(field, MakeInt64Value)
#define SET_INT64_REP(field) SET_REP(field, MakeInt64Value)
#define SET_STR(field) SET(field, new base::StringValue)
+#define SET_TIME_STR(field) SET(field, MakeTimestampValue)
#define SET_STR_REP(field) \
value->Set(#field, \
MakeRepeatedValue<const std::string&, \
@@ -489,6 +498,7 @@ base::DictionaryValue* DeviceInfoSpecificsToValue(
SET_ENUM(device_type, GetDeviceTypeString);
SET_STR(sync_user_agent);
SET_STR(chrome_version);
+ SET_TIME_STR(backup_timestamp);
return value;
}
diff --git a/sync/sync_internal_api.gypi b/sync/sync_internal_api.gypi
index 1ff913f..7d92f68 100644
--- a/sync/sync_internal_api.gypi
+++ b/sync/sync_internal_api.gypi
@@ -135,6 +135,7 @@
'internal_api/public/util/report_unrecoverable_error_function.h',
'internal_api/public/util/sync_string_conversions.cc',
'internal_api/public/util/sync_string_conversions.h',
+ 'internal_api/public/util/sync_db_util.h',
'internal_api/public/util/syncer_error.cc',
'internal_api/public/util/syncer_error.h',
'internal_api/public/util/unrecoverable_error_handler.h',
@@ -152,6 +153,7 @@
'internal_api/sync_context_proxy.cc',
'internal_api/sync_context_proxy_impl.cc',
'internal_api/sync_context_proxy_impl.h',
+ 'internal_api/sync_db_util.cc',
'internal_api/sync_encryption_handler_impl.cc',
'internal_api/sync_encryption_handler_impl.h',
'internal_api/sync_manager_factory.cc',