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