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

Side by Side Diff: chrome/browser/sync/syncable/syncable.h

Issue 7981006: [Sync] use base::Time in sync (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix win compile error Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ 5 #ifndef CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_
6 #define CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ 6 #define CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_
7 #pragma once 7 #pragma once
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <bitset> 10 #include <bitset>
(...skipping 15 matching lines...) Expand all
26 #include "base/time.h" 26 #include "base/time.h"
27 #include "base/tracked.h" 27 #include "base/tracked.h"
28 #include "chrome/browser/sync/protocol/sync.pb.h" 28 #include "chrome/browser/sync/protocol/sync.pb.h"
29 #include "chrome/browser/sync/syncable/blob.h" 29 #include "chrome/browser/sync/syncable/blob.h"
30 #include "chrome/browser/sync/syncable/dir_open_result.h" 30 #include "chrome/browser/sync/syncable/dir_open_result.h"
31 #include "chrome/browser/sync/syncable/directory_event.h" 31 #include "chrome/browser/sync/syncable/directory_event.h"
32 #include "chrome/browser/sync/syncable/syncable_id.h" 32 #include "chrome/browser/sync/syncable/syncable_id.h"
33 #include "chrome/browser/sync/syncable/model_type.h" 33 #include "chrome/browser/sync/syncable/model_type.h"
34 #include "chrome/browser/sync/util/dbgq.h" 34 #include "chrome/browser/sync/util/dbgq.h"
35 #include "chrome/browser/sync/util/immutable.h" 35 #include "chrome/browser/sync/util/immutable.h"
36 #include "chrome/browser/sync/util/time.h"
36 37
37 struct PurgeInfo; 38 struct PurgeInfo;
38 39
39 namespace base { 40 namespace base {
40 class DictionaryValue; 41 class DictionaryValue;
41 class ListValue; 42 class ListValue;
42 } 43 }
43 44
44 namespace sync_api { 45 namespace sync_api {
45 class ReadTransaction; 46 class ReadTransaction;
46 class WriteNode; 47 class WriteNode;
47 class ReadNode; 48 class ReadNode;
48 } // sync_api 49 } // sync_api
49 50
50 namespace syncable { 51 namespace syncable {
51 class DirectoryChangeDelegate; 52 class DirectoryChangeDelegate;
52 class TransactionObserver; 53 class TransactionObserver;
53 class Entry; 54 class Entry;
54 55
55 std::ostream& operator<<(std::ostream& s, const Entry& e); 56 std::ostream& operator<<(std::ostream& s, const Entry& e);
56 57
57 class DirectoryBackingStore; 58 class DirectoryBackingStore;
58 59
59 static const int64 kInvalidMetaHandle = 0; 60 static const int64 kInvalidMetaHandle = 0;
60 61
61 // Update syncable_enum_conversions{.h,.cc,_unittest.cc} if you change 62 // Things you need to update if you change any of the fields below:
62 // any fields in this file. 63 // - EntryKernel struct in syncable.h (this file)
64 // - syncable_columns.h
65 // - syncable_enum_conversions{.h,.cc,_unittest.cc}
66 // - ZeroFields(), EntryKernel::ToValue(), operator<< for Entry in
67 // syncable.cc
68 // - BindFields() and UnpackEntry() in directory_backing_store.cc
69 // - TestSimpleFieldsPreservedDuringSaveChanges in syncable_unittest.cc
Nicolas Zea 2011/09/21 18:09:12 ouch.
akalin 2011/09/21 19:37:35 No kidding.
63 70
64 enum { 71 enum {
65 BEGIN_FIELDS = 0, 72 BEGIN_FIELDS = 0,
66 INT64_FIELDS_BEGIN = BEGIN_FIELDS 73 INT64_FIELDS_BEGIN = BEGIN_FIELDS
67 }; 74 };
68 75
69 enum MetahandleField { 76 enum MetahandleField {
70 // Primary key into the table. Keep this as a handle to the meta entry 77 // Primary key into the table. Keep this as a handle to the meta entry
71 // across transactions. 78 // across transactions.
72 META_HANDLE = INT64_FIELDS_BEGIN 79 META_HANDLE = INT64_FIELDS_BEGIN
73 }; 80 };
74 81
75 enum BaseVersion { 82 enum BaseVersion {
76 // After initial upload, the version is controlled by the server, and is 83 // After initial upload, the version is controlled by the server, and is
77 // increased whenever the data or metadata changes on the server. 84 // increased whenever the data or metadata changes on the server.
78 BASE_VERSION = META_HANDLE + 1, 85 BASE_VERSION = META_HANDLE + 1,
79 }; 86 };
80 87
81 enum Int64Field { 88 enum Int64Field {
82 SERVER_VERSION = BASE_VERSION + 1, 89 SERVER_VERSION = BASE_VERSION + 1,
83 MTIME,
84 SERVER_MTIME,
85 CTIME,
86 SERVER_CTIME,
87 90
88 // A numeric position value that indicates the relative ordering of 91 // A numeric position value that indicates the relative ordering of
89 // this object among its siblings. 92 // this object among its siblings.
90 SERVER_POSITION_IN_PARENT, 93 SERVER_POSITION_IN_PARENT,
91 94
92 LOCAL_EXTERNAL_ID, // ID of an item in the external local storage that this 95 LOCAL_EXTERNAL_ID, // ID of an item in the external local storage that this
93 // entry is associated with. (such as bookmarks.js) 96 // entry is associated with. (such as bookmarks.js)
94 97
95 INT64_FIELDS_END 98 INT64_FIELDS_END
96 }; 99 };
97 100
98 enum { 101 enum {
99 INT64_FIELDS_COUNT = INT64_FIELDS_END, 102 INT64_FIELDS_COUNT = INT64_FIELDS_END - INT64_FIELDS_BEGIN,
100 ID_FIELDS_BEGIN = INT64_FIELDS_END, 103 TIME_FIELDS_BEGIN = INT64_FIELDS_END,
104 };
105
106 enum TimeField {
107 MTIME = TIME_FIELDS_BEGIN,
108 SERVER_MTIME,
109 CTIME,
110 SERVER_CTIME,
111 TIME_FIELDS_END,
112 };
113
114 enum {
115 TIME_FIELDS_COUNT = TIME_FIELDS_END - TIME_FIELDS_BEGIN,
116 ID_FIELDS_BEGIN = TIME_FIELDS_END,
101 }; 117 };
102 118
103 enum IdField { 119 enum IdField {
104 // Code in InitializeTables relies on ID being the first IdField value. 120 // Code in InitializeTables relies on ID being the first IdField value.
105 ID = ID_FIELDS_BEGIN, 121 ID = ID_FIELDS_BEGIN,
106 PARENT_ID, 122 PARENT_ID,
107 SERVER_PARENT_ID, 123 SERVER_PARENT_ID,
108 124
109 PREV_ID, 125 PREV_ID,
110 NEXT_ID, 126 NEXT_ID,
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 245
230 // Why the singular enums? So the code compile-time dispatches instead of 246 // Why the singular enums? So the code compile-time dispatches instead of
231 // runtime dispatches as it would with a single enum and an if() statement. 247 // runtime dispatches as it would with a single enum and an if() statement.
232 248
233 // The EntryKernel class contains the actual data for an entry. 249 // The EntryKernel class contains the actual data for an entry.
234 struct EntryKernel { 250 struct EntryKernel {
235 private: 251 private:
236 std::string string_fields[STRING_FIELDS_COUNT]; 252 std::string string_fields[STRING_FIELDS_COUNT];
237 sync_pb::EntitySpecifics specifics_fields[PROTO_FIELDS_COUNT]; 253 sync_pb::EntitySpecifics specifics_fields[PROTO_FIELDS_COUNT];
238 int64 int64_fields[INT64_FIELDS_COUNT]; 254 int64 int64_fields[INT64_FIELDS_COUNT];
255 base::Time time_fields[TIME_FIELDS_COUNT];
239 Id id_fields[ID_FIELDS_COUNT]; 256 Id id_fields[ID_FIELDS_COUNT];
240 std::bitset<BIT_FIELDS_COUNT> bit_fields; 257 std::bitset<BIT_FIELDS_COUNT> bit_fields;
241 std::bitset<BIT_TEMPS_COUNT> bit_temps; 258 std::bitset<BIT_TEMPS_COUNT> bit_temps;
242 259
243 public: 260 public:
244 EntryKernel(); 261 EntryKernel();
245 ~EntryKernel(); 262 ~EntryKernel();
246 263
247 // Set the dirty bit, and optionally add this entry's metahandle to 264 // Set the dirty bit, and optionally add this entry's metahandle to
248 // a provided index on dirty bits in |dirty_index|. Parameter may be null, 265 // a provided index on dirty bits in |dirty_index|. Parameter may be null,
(...skipping 21 matching lines...) Expand all
270 return dirty_; 287 return dirty_;
271 } 288 }
272 289
273 // Setters. 290 // Setters.
274 inline void put(MetahandleField field, int64 value) { 291 inline void put(MetahandleField field, int64 value) {
275 int64_fields[field - INT64_FIELDS_BEGIN] = value; 292 int64_fields[field - INT64_FIELDS_BEGIN] = value;
276 } 293 }
277 inline void put(Int64Field field, int64 value) { 294 inline void put(Int64Field field, int64 value) {
278 int64_fields[field - INT64_FIELDS_BEGIN] = value; 295 int64_fields[field - INT64_FIELDS_BEGIN] = value;
279 } 296 }
297 inline void put(TimeField field, const base::Time& value) {
298 // Round-trip to proto time format and back so that we have
299 // consistent time resolutions.
Nicolas Zea 2011/09/21 18:09:12 consistent time resolutions (in milliseconds)
akalin 2011/09/21 19:37:35 Done.
300 time_fields[field - TIME_FIELDS_BEGIN] =
301 browser_sync::ProtoTimeToTime(
302 browser_sync::TimeToProtoTime(value));
303 }
280 inline void put(IdField field, const Id& value) { 304 inline void put(IdField field, const Id& value) {
281 id_fields[field - ID_FIELDS_BEGIN] = value; 305 id_fields[field - ID_FIELDS_BEGIN] = value;
282 } 306 }
283 inline void put(BaseVersion field, int64 value) { 307 inline void put(BaseVersion field, int64 value) {
284 int64_fields[field - INT64_FIELDS_BEGIN] = value; 308 int64_fields[field - INT64_FIELDS_BEGIN] = value;
285 } 309 }
286 inline void put(IndexedBitField field, bool value) { 310 inline void put(IndexedBitField field, bool value) {
287 bit_fields[field - BIT_FIELDS_BEGIN] = value; 311 bit_fields[field - BIT_FIELDS_BEGIN] = value;
288 } 312 }
289 inline void put(IsDelField field, bool value) { 313 inline void put(IsDelField field, bool value) {
(...skipping 12 matching lines...) Expand all
302 bit_temps[field - BIT_TEMPS_BEGIN] = value; 326 bit_temps[field - BIT_TEMPS_BEGIN] = value;
303 } 327 }
304 328
305 // Const ref getters. 329 // Const ref getters.
306 inline int64 ref(MetahandleField field) const { 330 inline int64 ref(MetahandleField field) const {
307 return int64_fields[field - INT64_FIELDS_BEGIN]; 331 return int64_fields[field - INT64_FIELDS_BEGIN];
308 } 332 }
309 inline int64 ref(Int64Field field) const { 333 inline int64 ref(Int64Field field) const {
310 return int64_fields[field - INT64_FIELDS_BEGIN]; 334 return int64_fields[field - INT64_FIELDS_BEGIN];
311 } 335 }
336 inline const base::Time& ref(TimeField field) const {
337 return time_fields[field - TIME_FIELDS_BEGIN];
338 }
312 inline const Id& ref(IdField field) const { 339 inline const Id& ref(IdField field) const {
313 return id_fields[field - ID_FIELDS_BEGIN]; 340 return id_fields[field - ID_FIELDS_BEGIN];
314 } 341 }
315 inline int64 ref(BaseVersion field) const { 342 inline int64 ref(BaseVersion field) const {
316 return int64_fields[field - INT64_FIELDS_BEGIN]; 343 return int64_fields[field - INT64_FIELDS_BEGIN];
317 } 344 }
318 inline bool ref(IndexedBitField field) const { 345 inline bool ref(IndexedBitField field) const {
319 return bit_fields[field - BIT_FIELDS_BEGIN]; 346 return bit_fields[field - BIT_FIELDS_BEGIN];
320 } 347 }
321 inline bool ref(IsDelField field) const { 348 inline bool ref(IsDelField field) const {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 return kernel_->ref(field); 408 return kernel_->ref(field);
382 } 409 }
383 inline Id Get(IdField field) const { 410 inline Id Get(IdField field) const {
384 DCHECK(kernel_); 411 DCHECK(kernel_);
385 return kernel_->ref(field); 412 return kernel_->ref(field);
386 } 413 }
387 inline int64 Get(Int64Field field) const { 414 inline int64 Get(Int64Field field) const {
388 DCHECK(kernel_); 415 DCHECK(kernel_);
389 return kernel_->ref(field); 416 return kernel_->ref(field);
390 } 417 }
418 inline const base::Time& Get(TimeField field) const {
419 DCHECK(kernel_);
420 return kernel_->ref(field);
421 }
391 inline int64 Get(BaseVersion field) const { 422 inline int64 Get(BaseVersion field) const {
392 DCHECK(kernel_); 423 DCHECK(kernel_);
393 return kernel_->ref(field); 424 return kernel_->ref(field);
394 } 425 }
395 inline bool Get(IndexedBitField field) const { 426 inline bool Get(IndexedBitField field) const {
396 DCHECK(kernel_); 427 DCHECK(kernel_);
397 return kernel_->ref(field); 428 return kernel_->ref(field);
398 } 429 }
399 inline bool Get(IsDelField field) const { 430 inline bool Get(IsDelField field) const {
400 DCHECK(kernel_); 431 DCHECK(kernel_);
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 513
483 inline WriteTransaction* write_transaction() const { 514 inline WriteTransaction* write_transaction() const {
484 return write_transaction_; 515 return write_transaction_;
485 } 516 }
486 517
487 // Field Accessors. Some of them trigger the re-indexing of the entry. 518 // Field Accessors. Some of them trigger the re-indexing of the entry.
488 // Return true on success, return false on failure, which means 519 // Return true on success, return false on failure, which means
489 // that putting the value would have caused a duplicate in the index. 520 // that putting the value would have caused a duplicate in the index.
490 // TODO(chron): Remove some of these unecessary return values. 521 // TODO(chron): Remove some of these unecessary return values.
491 bool Put(Int64Field field, const int64& value); 522 bool Put(Int64Field field, const int64& value);
523 bool Put(TimeField field, const base::Time& value);
492 bool Put(IdField field, const Id& value); 524 bool Put(IdField field, const Id& value);
493 525
494 // Do a simple property-only update if the PARENT_ID field. Use with caution. 526 // Do a simple property-only update if the PARENT_ID field. Use with caution.
495 // 527 //
496 // The normal Put(IS_PARENT) call will move the item to the front of the 528 // The normal Put(IS_PARENT) call will move the item to the front of the
497 // sibling order to maintain the linked list invariants when the parent 529 // sibling order to maintain the linked list invariants when the parent
498 // changes. That's usually what you want to do, but it's inappropriate 530 // changes. That's usually what you want to do, but it's inappropriate
499 // when the caller is trying to change the parent ID of a the whole set 531 // when the caller is trying to change the parent ID of a the whole set
500 // of children (e.g. because the ID changed during a commit). For those 532 // of children (e.g. because the ID changed during a commit). For those
501 // cases, there's this function. It will corrupt the sibling ordering 533 // cases, there's this function. It will corrupt the sibling ordering
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after
1176 1208
1177 // Only the original fields are filled in until |RecordMutations()|. 1209 // Only the original fields are filled in until |RecordMutations()|.
1178 // We use a mutation map instead of a kernel set to avoid copying. 1210 // We use a mutation map instead of a kernel set to avoid copying.
1179 EntryKernelMutationMap mutations_; 1211 EntryKernelMutationMap mutations_;
1180 1212
1181 DISALLOW_COPY_AND_ASSIGN(WriteTransaction); 1213 DISALLOW_COPY_AND_ASSIGN(WriteTransaction);
1182 }; 1214 };
1183 1215
1184 bool IsLegalNewParent(BaseTransaction* trans, const Id& id, const Id& parentid); 1216 bool IsLegalNewParent(BaseTransaction* trans, const Id& id, const Id& parentid);
1185 1217
1186 int64 Now();
1187
1188 // This function sets only the flags needed to get this entry to sync. 1218 // This function sets only the flags needed to get this entry to sync.
1189 void MarkForSyncing(syncable::MutableEntry* e); 1219 void MarkForSyncing(syncable::MutableEntry* e);
1190 1220
1191 // This is not a reset. It just sets the numeric fields which are not 1221 // This is not a reset. It just sets the numeric fields which are not
1192 // initialized by the constructor to zero. 1222 // initialized by the constructor to zero.
1193 void ZeroFields(EntryKernel* entry, int first_field); 1223 void ZeroFields(EntryKernel* entry, int first_field);
1194 1224
1195 } // namespace syncable 1225 } // namespace syncable
1196 1226
1197 std::ostream& operator <<(std::ostream&, const syncable::Blob&); 1227 std::ostream& operator <<(std::ostream&, const syncable::Blob&);
1198 1228
1199 #endif // CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ 1229 #endif // CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698