12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SYNC_SYNCABLE_ENTRY_KERNEL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_SYNCABLE_ENTRY_KERNEL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/base/sync_export.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "sync/internal_api/public/base/unique_position.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/immutable.h" 16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "sync/protocol/attachments.pb.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/metahandle_set.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/syncable_id.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/util/time.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Cryptographer; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncable { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Things you need to update if you change any of the fields below: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - EntryKernel struct in this file 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - syncable_columns.h 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - syncable_enum_conversions{.h,.cc,_unittest.cc} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - EntryKernel::EntryKernel(), EntryKernel::ToValue() in entry_kernel.cc 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - operator<< in Entry.cc 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - BindFields() and UnpackEntry() in directory_backing_store.cc 35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// - kCurrentDBVersion, DirectoryBackingStore::InitializeTables in 36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// directory_backing_store.cc 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - TestSimpleFieldsPreservedDuringSaveChanges in syncable_unittest.cc 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int64 kInvalidMetaHandle = 0; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BEGIN_FIELDS = 0, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INT64_FIELDS_BEGIN = BEGIN_FIELDS 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum MetahandleField { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Primary key into the table. Keep this as a handle to the meta entry 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // across transactions. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) META_HANDLE = INT64_FIELDS_BEGIN 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum BaseVersion { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After initial upload, the version is controlled by the server, and is 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // increased whenever the data or metadata changes on the server. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BASE_VERSION = META_HANDLE + 1, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Int64Field { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SERVER_VERSION = BASE_VERSION + 1, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOCAL_EXTERNAL_ID, // ID of an item in the external local storage that this 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry is associated with. (such as bookmarks.js) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRANSACTION_VERSION, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INT64_FIELDS_END 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INT64_FIELDS_COUNT = INT64_FIELDS_END - INT64_FIELDS_BEGIN, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TIME_FIELDS_BEGIN = INT64_FIELDS_END, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum TimeField { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MTIME = TIME_FIELDS_BEGIN, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SERVER_MTIME, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CTIME, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SERVER_CTIME, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TIME_FIELDS_END, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TIME_FIELDS_COUNT = TIME_FIELDS_END - TIME_FIELDS_BEGIN, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID_FIELDS_BEGIN = TIME_FIELDS_END, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum IdField { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Code in InitializeTables relies on ID being the first IdField value. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID = ID_FIELDS_BEGIN, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PARENT_ID, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SERVER_PARENT_ID, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID_FIELDS_END 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID_FIELDS_COUNT = ID_FIELDS_END - ID_FIELDS_BEGIN, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BIT_FIELDS_BEGIN = ID_FIELDS_END 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum IndexedBitField { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IS_UNSYNCED = BIT_FIELDS_BEGIN, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IS_UNAPPLIED_UPDATE, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INDEXED_BIT_FIELDS_END, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum IsDelField { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IS_DEL = INDEXED_BIT_FIELDS_END, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum BitField { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IS_DIR = IS_DEL + 1, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SERVER_IS_DIR, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SERVER_IS_DEL, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BIT_FIELDS_END 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BIT_FIELDS_COUNT = BIT_FIELDS_END - BIT_FIELDS_BEGIN, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STRING_FIELDS_BEGIN = BIT_FIELDS_END 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum StringField { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Name, will be truncated by server. Can be duplicated in a folder. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NON_UNIQUE_NAME = STRING_FIELDS_BEGIN, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The server version of |NON_UNIQUE_NAME|. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SERVER_NON_UNIQUE_NAME, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A tag string which identifies this node as a particular top-level 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permanent object. The tag can be thought of as a unique key that 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // identifies a singleton instance. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNIQUE_SERVER_TAG, // Tagged by the server 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNIQUE_CLIENT_TAG, // Tagged by the client 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UNIQUE_BOOKMARK_TAG, // Client tags for bookmark items 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STRING_FIELDS_END, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STRING_FIELDS_COUNT = STRING_FIELDS_END - STRING_FIELDS_BEGIN, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROTO_FIELDS_BEGIN = STRING_FIELDS_END 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From looking at the sqlite3 docs, it's not directly stated, but it 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// seems the overhead for storing a NULL blob is very small. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ProtoField { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SPECIFICS = PROTO_FIELDS_BEGIN, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SERVER_SPECIFICS, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BASE_SERVER_SPECIFICS, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROTO_FIELDS_END, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROTO_FIELDS_COUNT = PROTO_FIELDS_END - PROTO_FIELDS_BEGIN, 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UNIQUE_POSITION_FIELDS_BEGIN = PROTO_FIELDS_END 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum UniquePositionField { 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SERVER_UNIQUE_POSITION = UNIQUE_POSITION_FIELDS_BEGIN, 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UNIQUE_POSITION, 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UNIQUE_POSITION_FIELDS_END 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UNIQUE_POSITION_FIELDS_COUNT = 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UNIQUE_POSITION_FIELDS_END - UNIQUE_POSITION_FIELDS_BEGIN, 162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ATTACHMENT_METADATA_FIELDS_BEGIN = UNIQUE_POSITION_FIELDS_END 163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}; 164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochenum AttachmentMetadataField { 166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ATTACHMENT_METADATA = ATTACHMENT_METADATA_FIELDS_BEGIN, 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SERVER_ATTACHMENT_METADATA, 168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ATTACHMENT_METADATA_FIELDS_END 169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}; 170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 171e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochenum { 172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ATTACHMENT_METADATA_FIELDS_COUNT = 173e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ATTACHMENT_METADATA_FIELDS_END - ATTACHMENT_METADATA_FIELDS_BEGIN, 174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FIELD_COUNT = ATTACHMENT_METADATA_FIELDS_END - BEGIN_FIELDS, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Past this point we have temporaries, stored in memory only. 176e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch BEGIN_TEMPS = ATTACHMENT_METADATA_FIELDS_END, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BIT_TEMPS_BEGIN = BEGIN_TEMPS, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum BitTemp { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not to be confused with IS_UNSYNCED, this bit is used to detect local 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changes to items that happen during the server Commit operation. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SYNCING = BIT_TEMPS_BEGIN, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BIT_TEMPS_END, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BIT_TEMPS_COUNT = BIT_TEMPS_END - BIT_TEMPS_BEGIN 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct SYNC_EXPORT_PRIVATE EntryKernel { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string string_fields[STRING_FIELDS_COUNT]; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics specifics_fields[PROTO_FIELDS_COUNT]; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 int64_fields[INT64_FIELDS_COUNT]; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time_fields[TIME_FIELDS_COUNT]; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Id id_fields[ID_FIELDS_COUNT]; 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UniquePosition unique_position_fields[UNIQUE_POSITION_FIELDS_COUNT]; 201e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch sync_pb::AttachmentMetadata 202e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attachment_metadata_fields[ATTACHMENT_METADATA_FIELDS_COUNT]; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::bitset<BIT_FIELDS_COUNT> bit_fields; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::bitset<BIT_TEMPS_COUNT> bit_temps; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EntryKernel(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~EntryKernel(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the dirty bit, and optionally add this entry's metahandle to 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a provided index on dirty bits in |dirty_index|. Parameter may be null, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and will result only in setting the dirty bit of this entry. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void mark_dirty(syncable::MetahandleSet* dirty_index) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dirty_ && dirty_index) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(0, ref(META_HANDLE)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dirty_index->insert(ref(META_HANDLE)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dirty_ = true; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the dirty bit, and optionally remove this entry's metahandle from 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a provided index on dirty bits in |dirty_index|. Parameter may be null, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and will result only in clearing dirty bit of this entry. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void clear_dirty(syncable::MetahandleSet* dirty_index) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dirty_ && dirty_index) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(0, ref(META_HANDLE)); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dirty_index->erase(ref(META_HANDLE)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dirty_ = false; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline bool is_dirty() const { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dirty_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setters. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void put(MetahandleField field, int64 value) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_fields[field - INT64_FIELDS_BEGIN] = value; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void put(Int64Field field, int64 value) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_fields[field - INT64_FIELDS_BEGIN] = value; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void put(TimeField field, const base::Time& value) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Round-trip to proto time format and back so that we have 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // consistent time resolutions (ms). 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_fields[field - TIME_FIELDS_BEGIN] = 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtoTimeToTime(TimeToProtoTime(value)); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void put(IdField field, const Id& value) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_fields[field - ID_FIELDS_BEGIN] = value; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void put(BaseVersion field, int64 value) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_fields[field - INT64_FIELDS_BEGIN] = value; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void put(IndexedBitField field, bool value) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bit_fields[field - BIT_FIELDS_BEGIN] = value; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void put(IsDelField field, bool value) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bit_fields[field - BIT_FIELDS_BEGIN] = value; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void put(BitField field, bool value) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bit_fields[field - BIT_FIELDS_BEGIN] = value; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void put(StringField field, const std::string& value) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_fields[field - STRING_FIELDS_BEGIN] = value; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void put(ProtoField field, const sync_pb::EntitySpecifics& value) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) specifics_fields[field - PROTO_FIELDS_BEGIN].CopyFrom(value); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) inline void put(UniquePositionField field, const UniquePosition& value) { 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unique_position_fields[field - UNIQUE_POSITION_FIELDS_BEGIN] = value; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 273e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch inline void put(AttachmentMetadataField field, 274e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const sync_pb::AttachmentMetadata& value) { 275e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attachment_metadata_fields[field - ATTACHMENT_METADATA_FIELDS_BEGIN] = 276e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch value; 277e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void put(BitTemp field, bool value) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bit_temps[field - BIT_TEMPS_BEGIN] = value; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Const ref getters. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline int64 ref(MetahandleField field) const { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return int64_fields[field - INT64_FIELDS_BEGIN]; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline int64 ref(Int64Field field) const { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return int64_fields[field - INT64_FIELDS_BEGIN]; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline const base::Time& ref(TimeField field) const { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return time_fields[field - TIME_FIELDS_BEGIN]; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline const Id& ref(IdField field) const { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return id_fields[field - ID_FIELDS_BEGIN]; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline int64 ref(BaseVersion field) const { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return int64_fields[field - INT64_FIELDS_BEGIN]; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline bool ref(IndexedBitField field) const { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bit_fields[field - BIT_FIELDS_BEGIN]; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline bool ref(IsDelField field) const { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bit_fields[field - BIT_FIELDS_BEGIN]; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline bool ref(BitField field) const { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bit_fields[field - BIT_FIELDS_BEGIN]; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline const std::string& ref(StringField field) const { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return string_fields[field - STRING_FIELDS_BEGIN]; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline const sync_pb::EntitySpecifics& ref(ProtoField field) const { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return specifics_fields[field - PROTO_FIELDS_BEGIN]; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) inline const UniquePosition& ref(UniquePositionField field) const { 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return unique_position_fields[field - UNIQUE_POSITION_FIELDS_BEGIN]; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 316e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch inline const sync_pb::AttachmentMetadata& ref( 317e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch AttachmentMetadataField field) const { 318e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return attachment_metadata_fields[field - ATTACHMENT_METADATA_FIELDS_BEGIN]; 319e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline bool ref(BitTemp field) const { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bit_temps[field - BIT_TEMPS_BEGIN]; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-const, mutable ref getters for object types only. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline std::string& mutable_ref(StringField field) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return string_fields[field - STRING_FIELDS_BEGIN]; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline sync_pb::EntitySpecifics& mutable_ref(ProtoField field) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return specifics_fields[field - PROTO_FIELDS_BEGIN]; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline Id& mutable_ref(IdField field) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return id_fields[field - ID_FIELDS_BEGIN]; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) inline UniquePosition& mutable_ref(UniquePositionField field) { 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return unique_position_fields[field - UNIQUE_POSITION_FIELDS_BEGIN]; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) inline sync_pb::AttachmentMetadata& mutable_ref( 338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AttachmentMetadataField field) { 339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return attachment_metadata_fields[field - ATTACHMENT_METADATA_FIELDS_BEGIN]; 340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ModelType GetModelType() const; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelType GetServerModelType() const; 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool ShouldMaintainPosition() const; 345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool ShouldMaintainHierarchy() const; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dumps all kernel info into a DictionaryValue and returns it. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transfers ownership of the DictionaryValue to the caller. 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note: |cryptographer| is an optional parameter for use in decrypting 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // encrypted specifics. If it is NULL or the specifics are not decryptsble, 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // they will be serialized as empty proto's. 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* ToValue(Cryptographer* cryptographer) const; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tracks whether this entry needs to be saved to the database. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool dirty_; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class EntryKernelLessByMetaHandle { 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inline bool operator()(const EntryKernel* a, 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const EntryKernel* b) const { 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return a->ref(META_HANDLE) < b->ref(META_HANDLE); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::set<const EntryKernel*, EntryKernelLessByMetaHandle> 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EntryKernelSet; 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct EntryKernelMutation { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EntryKernel original, mutated; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<int64, EntryKernelMutation> EntryKernelMutationMap; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef Immutable<EntryKernelMutationMap> ImmutableEntryKernelMutationMap; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Caller owns the return value. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::DictionaryValue* EntryKernelMutationToValue( 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EntryKernelMutation& mutation); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Caller owns the return value. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::ListValue* EntryKernelMutationMapToValue( 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EntryKernelMutationMap& mutations); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncable 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // SYNC_SYNCABLE_ENTRY_KERNEL_H_ 390