Index: chrome/browser/sync/syncable/syncable.cc |
diff --git a/chrome/browser/sync/syncable/syncable.cc b/chrome/browser/sync/syncable/syncable.cc |
index aa6183e4af8792fd267bd4edf071e3ce29757967..dbece44e4e03e5d4fb52c88b26cff4a8543500fa 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)) << ", "; |