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