12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 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_DIRECTORY_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_SYNCABLE_DIRECTORY_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <deque> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/basictypes.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/values.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "sync/api/attachments/attachment_id.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/base/sync_export.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/report_unrecoverable_error_function.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/weak_handle.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/dir_open_result.h" 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/syncable/entry.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/entry_kernel.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/metahandle_set.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "sync/syncable/parent_child_index.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/syncable/syncable_delete_journal.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Cryptographer; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestUserShare; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UnrecoverableErrorHandler; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncable { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BaseTransaction; 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class BaseWriteTransaction; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DirectoryChangeDelegate; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DirectoryBackingStore; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NigoriHandler; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedKernelLock; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransactionObserver; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WriteTransaction; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum InvariantCheckLevel { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OFF = 0, // No checking. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VERIFY_CHANGES = 1, // Checks only mutated entries. Does not check hierarchy. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FULL_DB_VERIFICATION = 2 // Check every entry. This can be expensive. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Directory stores and manages EntryKernels. 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// This class is tightly coupled to several other classes (see friends). 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SYNC_EXPORT Directory { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class BaseTransaction; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Entry; 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) friend class ModelNeutralMutableEntry; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class MutableEntry; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ReadTransaction; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ScopedKernelLock; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class WriteTransaction; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class SyncableDirectoryTest; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class syncer::TestUserShare; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SyncableDirectoryTest, ManageDeleteJournals); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SyncableDirectoryTest, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TakeSnapshotGetsAllDirtyHandlesTest); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SyncableDirectoryTest, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TakeSnapshotGetsOnlyDirtyHandlesTest); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SyncableDirectoryTest, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TakeSnapshotGetsMetahandlesToPurge); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) typedef std::vector<int64> Metahandles; 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Be careful when using these hash_map containers. According to the spec, 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // inserting into them may invalidate all iterators. 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // It gets worse, though. The Anroid STL library has a bug that means it may 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // invalidate all iterators when you erase from the map, too. That means that 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // you can't iterate while erasing. STLDeleteElements(), std::remove_if(), 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // and other similar functions are off-limits too, until this bug is fixed. 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // See http://sourceforge.net/p/stlport/bugs/239/. 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) typedef base::hash_map<int64, EntryKernel*> MetahandlesMap; 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) typedef base::hash_map<std::string, EntryKernel*> IdsMap; 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) typedef base::hash_map<std::string, EntryKernel*> TagsMap; 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typedef std::string AttachmentIdUniqueId; 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typedef base::hash_map<AttachmentIdUniqueId, MetahandleSet> 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IndexByAttachmentId; 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const base::FilePath::CharType kSyncDatabaseFilename[]; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The dirty/clean state of kernel fields backed by the share_info table. 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This is public so it can be used in SaveChangesSnapshot for persistence. 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) enum KernelShareInfoStatus { 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) KERNEL_SHARE_INFO_INVALID, 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) KERNEL_SHARE_INFO_VALID, 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) KERNEL_SHARE_INFO_DIRTY 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) }; 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Various data that the Directory::Kernel we are backing (persisting data 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for) needs saved across runs of the application. 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct SYNC_EXPORT_PRIVATE PersistedKernelInfo { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PersistedKernelInfo(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PersistedKernelInfo(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the |download_progress| entry for the given model to a 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "first sync" start point. When such a value is sent to the server, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a full download of all objects of the model will be initiated. 111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void ResetDownloadProgress(ModelType model_type); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Whether a valid progress marker exists for |model_type|. 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool HasEmptyDownloadProgress(ModelType model_type); 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Last sync timestamp fetched from the server. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::DataTypeProgressMarker download_progress[MODEL_TYPE_COUNT]; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sync-side transaction version per data type. Monotonically incremented 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when updating native model. A copy is also saved in native model. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Later out-of-sync models can be detected and fixed by comparing 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // transaction versions of sync model and native model. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(hatiaol): implement detection and fixing of out-of-sync models. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bug 154858. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 transaction_version[MODEL_TYPE_COUNT]; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The store birthday we were given by the server. Contents are opaque to 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the client. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string store_birthday; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The next local ID that has not been used with this cache-GUID. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 next_id; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The serialized bag of chips we were given by the server. Contents are 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opaque to the client. This is the serialization of a message of type 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ChipBag defined in sync.proto. It can contains NULL characters. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string bag_of_chips; 134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The per-datatype context. 135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_pb::DataTypeContext datatype_context[MODEL_TYPE_COUNT]; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What the Directory needs on initialization to create itself and its Kernel. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filled by DirectoryBackingStore::Load. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct KernelLoadInfo { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PersistedKernelInfo kernel_info; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string cache_guid; // Created on first initialization, never changes. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 max_metahandle; // Computed (using sql MAX aggregate) on init. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KernelLoadInfo() : max_metahandle(0) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the Directory is told to SaveChanges, a SaveChangesSnapshot is 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constructed and forms a consistent snapshot of what needs to be sent to 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the backing store. 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct SYNC_EXPORT_PRIVATE SaveChangesSnapshot { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveChangesSnapshot(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~SaveChangesSnapshot(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KernelShareInfoStatus kernel_info_status; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PersistedKernelInfo kernel_info; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EntryKernelSet dirty_metas; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MetahandleSet metahandles_to_purge; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EntryKernelSet delete_journals; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MetahandleSet delete_journals_to_purge; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does not take ownership of |encryptor|. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |report_unrecoverable_error_function| may be NULL. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes ownership of |store|. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Directory( 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DirectoryBackingStore* store, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnrecoverableErrorHandler* unrecoverable_error_handler, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportUnrecoverableErrorFunction 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) report_unrecoverable_error_function, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NigoriHandler* nigori_handler, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cryptographer* cryptographer); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Directory(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does not take ownership of |delegate|, which must not be NULL. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts sending events to |delegate| if the returned result is 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OPENED. Note that events to |delegate| may be sent from *any* 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. |transaction_observer| must be initialized. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DirOpenResult Open(const std::string& name, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DirectoryChangeDelegate* delegate, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WeakHandle<TransactionObserver>& 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction_observer); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stops sending events to the delegate and the transaction 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observer. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Close(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 NextMetahandle(); 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns a negative integer unique to this client. 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) syncable::Id NextId(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool good() const { return NULL != kernel_; } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The download progress is an opaque token provided by the sync server 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to indicate the continuation state of the next GetUpdates operation. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetDownloadProgress( 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelType type, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::DataTypeProgressMarker* value_out) const; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetDownloadProgressAsString( 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelType type, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* value_out) const; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t GetEntriesCount() const; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetDownloadProgress( 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelType type, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::DataTypeProgressMarker& value); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets/Increments transaction version of a model type. Must be called when 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // holding kernel mutex. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 GetTransactionVersion(ModelType type) const; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncrementTransactionVersion(ModelType type); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Getter/setters for the per datatype context. 213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void GetDataTypeContext(BaseTransaction* trans, 214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ModelType type, 215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_pb::DataTypeContext* context) const; 216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void SetDataTypeContext(BaseWriteTransaction* trans, 217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ModelType type, 218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const sync_pb::DataTypeContext& context); 219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ModelTypeSet InitialSyncEndedTypes(); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool InitialSyncEndedForType(ModelType type); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool InitialSyncEndedForType(BaseTransaction* trans, ModelType type); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name() const { return kernel_->name; } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (Account) Store birthday is opaque to the client, so we keep it in the 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // format it is in the proto buffer in case we switch to a binary birthday 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string store_birthday() const; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_store_birthday(const std::string& store_birthday); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (Account) Bag of chip is an opaque state used by the server to track the 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // client. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string bag_of_chips() const; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_bag_of_chips(const std::string& bag_of_chips); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unique to each account / client pair. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string cache_guid() const; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer to our Nigori node handler. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NigoriHandler* GetNigoriHandler(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer to our cryptographer. Does not transfer ownership. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not thread safe, so should only be accessed while holding a transaction. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cryptographer* GetCryptographer(const BaseTransaction* trans); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the directory had encountered an unrecoverable error. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: Any function in |Directory| that can be called without holding a 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // transaction need to check if the Directory already has an unrecoverable 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error on it. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool unrecoverable_error_set(const BaseTransaction* trans) const; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to immediately report an unrecoverable error (but don't 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // propagate it up). 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportUnrecoverableError() { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (report_unrecoverable_error_function_) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) report_unrecoverable_error_function_(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to set the unrecoverable error on the directory and to propagate 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the error to upper layers. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnUnrecoverableError(const BaseTransaction* trans, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& location, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string & message); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DeleteJournal* delete_journal(); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the child meta handles (even those for deleted/unlinked 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nodes) for given parent id. Clears |result| if there are no 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // children. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetChildHandlesById(BaseTransaction*, const Id& parent_id, 273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Metahandles* result); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Counts all items under the given node, including the node itself. 276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int GetTotalNodeCount(BaseTransaction*, EntryKernel* kernel_) const; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Returns this item's position within its parent folder. 2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The left-most item is 0, second left-most is 1, etc. 2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int GetPositionIndex(BaseTransaction*, EntryKernel* kernel_) const; 2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true iff |id| has children. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasChildren(BaseTransaction* trans, const Id& id); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the first child in the positional ordering under a parent, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and fill in |*first_child_id| with its id. Fills in a root Id if 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // parent has no children. Returns true if the first child was 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // successfully found, or false if an error was encountered. 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Id GetFirstChildId(BaseTransaction* trans, const EntryKernel* parent); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // These functions allow one to fetch the next or previous item under 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the same folder. Returns the "root" ID if there is no predecessor 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // or successor. 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(rlarocque): These functions are used mainly for tree traversal. We 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // should replace these with an iterator API. See crbug.com/178275. 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) syncable::Id GetPredecessorId(EntryKernel*); 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) syncable::Id GetSuccessorId(EntryKernel*); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Places |e| as a successor to |predecessor|. If |predecessor| is NULL, 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |e| will be placed as the left-most item in its folder. 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Both |e| and |predecessor| must be valid entries under the same parent. 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(rlarocque): This function includes limited support for placing items 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with valid positions (ie. Bookmarks) as siblings of items that have no set 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ordering (ie. Autofill items). This support is required only for tests, 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and should be removed. See crbug.com/178282. 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void PutPredecessor(EntryKernel* e, EntryKernel* predecessor); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SaveChanges works by taking a consistent snapshot of the current Directory 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state and indices (by deep copy) under a ReadTransaction, passing this 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // snapshot to the backing store under no transaction, and finally cleaning 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // up by either purging entries no longer needed (this part done under a 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WriteTransaction) or rolling back the dirty bits. It also uses 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // internal locking to enforce SaveChanges operations are mutually exclusive. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WARNING: THIS METHOD PERFORMS SYNCHRONOUS I/O VIA SQLITE. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool SaveChanges(); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the number of entities with the unsynced bit set. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 unsynced_entity_count() const; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get GetUnsyncedMetaHandles should only be called after SaveChanges and 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before any new entries have been created. The intention is that the 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // syncer should call it from its PerformSyncQueries member. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetUnsyncedMetaHandles(BaseTransaction* trans, 328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Metahandles* result); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns whether or not this |type| has unapplied updates. 331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool TypeHasUnappliedUpdates(ModelType type); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get all the metahandles for unapplied updates for a given set of 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // server types. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetUnappliedUpdateMetaHandles(BaseTransaction* trans, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FullModelTypeSet server_types, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int64>* result); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Get all the metahandles of entries of |type|. 340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void GetMetaHandlesOfType(BaseTransaction* trans, 341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModelType type, 342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Metahandles* result); 343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get metahandle counts for various criteria to show on the 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // about:sync page. The information is computed on the fly 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // each time. If this results in a significant performance hit, 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // additional data structures can be added to cache results. 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CollectMetaHandleCounts(std::vector<int>* num_entries_by_type, 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<int>* num_to_delete_entries_by_type); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Returns a ListValue serialization of all nodes for the given type. 352c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<base::ListValue> GetNodeDetailsForType( 353c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch BaseTransaction* trans, 354c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ModelType type); 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the level of invariant checking performed after transactions. 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetInvariantCheckLevel(InvariantCheckLevel check_level); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks tree metadata consistency following a transaction. It is intended 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to provide a reasonable tradeoff between performance and comprehensiveness 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and may be used in release code. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CheckInvariantsOnTransactionClose( 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::BaseTransaction* trans, 3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const MetahandleSet& modified_handles); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Forces a full check of the directory. This operation may be slow and 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should not be invoked outside of tests. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool FullyCheckTreeInvariants(BaseTransaction *trans); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Purges data associated with any entries whose ModelType or ServerModelType 371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // is found in |disabled_types|, from sync directory _both_ in memory and on 372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // disk. Only valid, "real" model types are allowed in |disabled_types| (see 373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // model_type.h for definitions). 374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 1. Data associated with |types_to_journal| is saved in the delete journal 375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // to help prevent back-from-dead problem due to offline delete in the next 376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // sync session. |types_to_journal| must be a subset of |disabled_types|. 377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 2. Data associated with |types_to_unapply| is reset to an "unapplied" 378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // state, wherein all local data is deleted and IS_UNAPPLIED is set to true. 379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This is useful when there's no benefit in discarding the currently 380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // downloaded state, such as when there are cryptographer errors. 381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // |types_to_unapply| must be a subset of |disabled_types|. 382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 3. All other data is purged entirely. 383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Note: "Purge" is just meant to distinguish from "deleting" entries, which 384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // means something different in the syncable namespace. 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WARNING! This can be real slow, as it iterates over all entries. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WARNING! Performs synchronous I/O. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns: true on success, false if an error was encountered. 388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual bool PurgeEntriesWithTypeIn(ModelTypeSet disabled_types, 389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ModelTypeSet types_to_journal, 390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ModelTypeSet types_to_unapply); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Resets the base_versions and server_versions of all synced entities 393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // associated with |type| to 1. 394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // WARNING! This can be slow, as it iterates over all entries for a type. 395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool ResetVersionsForType(BaseWriteTransaction* trans, ModelType type); 396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Returns true iff the attachment identified by |attachment_id_proto| is 398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // linked to an entry. 399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // 400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // An attachment linked to a deleted entry is still considered linked if the 401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // entry hasn't yet been purged. 402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool IsAttachmentLinked( 403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const sync_pb::AttachmentIdProto& attachment_id_proto) const; 404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Given attachment id return metahandles to all entries that reference this 406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // attachment. 407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void GetMetahandlesByAttachmentId( 408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BaseTransaction* trans, 409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const sync_pb::AttachmentIdProto& attachment_id_proto, 410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Metahandles* result); 411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Change entry to not dirty. Used in special case when we don't want to 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // persist modified entry on disk. e.g. SyncBackupManager uses this to 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // preserve sync preferences in DB on disk. 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void UnmarkDirtyEntry(WriteTransaction* trans, Entry* entry); 416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Clears |id_set| and fills it with the ids of attachments that need to be 4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // uploaded to the sync server. 4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void GetAttachmentIdsToUpload(BaseTransaction* trans, 4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ModelType type, 4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AttachmentIdSet* id_set); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Kernel { 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |delegate| must not be NULL. |transaction_observer| must be 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initialized. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Kernel(const std::string& name, const KernelLoadInfo& info, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DirectoryChangeDelegate* delegate, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WeakHandle<TransactionObserver>& transaction_observer); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Kernel(); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Implements ReadTransaction / WriteTransaction using a simple lock. 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock transaction_mutex; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Protected by transaction_mutex. Used by WriteTransactions. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 next_write_transaction_id; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The name of this directory. 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string const name; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Protects all members below. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The mutex effectively protects all the indices, but not the 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entries themselves. So once a pointer to an entry is pulled 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the index, the mutex can be unlocked and entry read or written. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Never hold the mutex and do anything with the database or any 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // other buffered IO. Violating this rule will result in deadlock. 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock mutex; 450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Entries indexed by metahandle. This container is considered to be the 452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // owner of all EntryKernels, which may be referened by the other 453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // containers. If you remove an EntryKernel from this map, you probably 454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // want to remove it from all other containers and delete it, too. 455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MetahandlesMap metahandles_map; 456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Entries indexed by id 458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IdsMap ids_map; 459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Entries indexed by server tag. 461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This map does not include any entries with non-existent server tags. 462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TagsMap server_tags_map; 463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Entries indexed by client tag. 465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This map does not include any entries with non-existent client tags. 466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // IS_DEL items are included. 467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TagsMap client_tags_map; 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Contains non-deleted items, indexed according to parent and position 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // within parent. Protected by the ScopedKernelLock. 471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ParentChildIndex parent_child_index; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // This index keeps track of which metahandles refer to a given attachment. 474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Think of it as the inverse of EntryKernel's AttachmentMetadata Records. 475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // 476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Because entries can be undeleted (e.g. PutIsDel(false)), entries should 477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // not removed from the index until they are actually deleted from memory. 478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // 479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // All access should go through IsAttachmentLinked, 480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // RemoveFromAttachmentIndex, AddToAttachmentIndex, and 481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // UpdateAttachmentIndex methods to avoid iterator invalidation errors. 482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IndexByAttachmentId index_by_attachment_id; 483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3 in-memory indices on bits used extremely frequently by the syncer. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |unapplied_update_metahandles| is keyed by the server model type. 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MetahandleSet unapplied_update_metahandles[MODEL_TYPE_COUNT]; 487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MetahandleSet unsynced_metahandles; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Contains metahandles that are most likely dirty (though not 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // necessarily). Dirtyness is confirmed in TakeSnapshotForSaveChanges(). 490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MetahandleSet dirty_metahandles; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a purge takes place, we remove items from all our indices and stash 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // them in here so that SaveChanges can persist their permanent deletion. 494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MetahandleSet metahandles_to_purge; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KernelShareInfoStatus info_status; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These 3 members are backed in the share_info table, and 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // their state is marked by the flag above. 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A structure containing the Directory state that is written back into the 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // database on SaveChanges. 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PersistedKernelInfo persisted_info; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A unique identifier for this account's cache db, used to generate 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unique server IDs. No need to lock, only written at init time. 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string cache_guid; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It doesn't make sense for two threads to run SaveChanges at the same 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time; this mutex protects that activity. 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock save_changes_mutex; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The next metahandle is protected by kernel mutex. 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 next_metahandle; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The delegate for directory change events. Must not be NULL. 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DirectoryChangeDelegate* const delegate; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The transaction observer. 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WeakHandle<TransactionObserver> transaction_observer; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // You'll notice that some of these methods have two forms. One that takes a 5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ScopedKernelLock and one that doesn't. The general pattern is that those 5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // without a ScopedKernelLock parameter construct one internally before 5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // calling the form that takes one. 5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual EntryKernel* GetEntryByHandle(int64 handle); 5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual EntryKernel* GetEntryByHandle(const ScopedKernelLock& lock, 5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 metahandle); 5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual EntryKernel* GetEntryById(const Id& id); 5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual EntryKernel* GetEntryById(const ScopedKernelLock& lock, const Id& id); 5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EntryKernel* GetEntryByServerTag(const std::string& tag); 5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual EntryKernel* GetEntryByClientTag(const std::string& tag); 5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // For new entry creation only 5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool InsertEntry(BaseWriteTransaction* trans, EntryKernel* entry); 5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool InsertEntry(const ScopedKernelLock& lock, 5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BaseWriteTransaction* trans, 5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EntryKernel* entry); 5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool ReindexId(BaseWriteTransaction* trans, EntryKernel* const entry, 5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Id& new_id); 5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool ReindexParentId(BaseWriteTransaction* trans, EntryKernel* const entry, 5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Id& new_parent_id); 5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Update the attachment index for |metahandle| removing it from the index 5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // under |old_metadata| entries and add it under |new_metadata| entries. 5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void UpdateAttachmentIndex(const int64 metahandle, 5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const sync_pb::AttachmentMetadata& old_metadata, 5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const sync_pb::AttachmentMetadata& new_metadata); 5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Remove each of |metahandle|'s attachment ids from index_by_attachment_id. 5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RemoveFromAttachmentIndex( 5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ScopedKernelLock& lock, 5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int64 metahandle, 5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const sync_pb::AttachmentMetadata& attachment_metadata); 5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Add each of |metahandle|'s attachment ids to the index_by_attachment_id. 5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void AddToAttachmentIndex( 5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ScopedKernelLock& lock, 5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int64 metahandle, 5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const sync_pb::AttachmentMetadata& attachment_metadata); 5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ClearDirtyMetahandles(const ScopedKernelLock& lock); 5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DirOpenResult OpenImpl( 5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& name, 5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DirectoryChangeDelegate* delegate, 5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const WeakHandle<TransactionObserver>& transaction_observer); 574868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // A helper that implements the logic of checking tree invariants. 576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool CheckTreeInvariants(syncable::BaseTransaction* trans, 577868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const MetahandleSet& handles); 578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 579868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Helper to prime metahandles_map, ids_map, parent_child_index, 580868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // unsynced_metahandles, unapplied_update_metahandles, server_tags_map and 581868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // client_tags_map from metahandles_index. The input |handles_map| will be 582868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // cleared during the initialization process. 583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void InitializeIndices(MetahandlesMap* handles_map); 584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Constructs a consistent snapshot of the current Directory state and 586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // indices (by deep copy) under a ReadTransaction for use in |snapshot|. 587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // See SaveChanges() for more information. 588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void TakeSnapshotForSaveChanges(SaveChangesSnapshot* snapshot); 589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Purges from memory any unused, safe to remove entries that were 591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // successfully deleted on disk as a result of the SaveChanges that processed 592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // |snapshot|. See SaveChanges() for more information. 593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool VacuumAfterSaveChanges(const SaveChangesSnapshot& snapshot); 594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Rolls back dirty bits in the event that the SaveChanges that 596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // processed |snapshot| failed, for example, due to no disk space. 597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void HandleSaveChangesFailure(const SaveChangesSnapshot& snapshot); 598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Used by CheckTreeInvariants 600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void GetAllMetaHandles(BaseTransaction* trans, MetahandleSet* result); 601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool SafeToPurgeFromMemory(WriteTransaction* trans, 602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const EntryKernel* const entry) const; 603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // A helper used by GetTotalNodeCount. 605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void GetChildSetForKernel( 606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BaseTransaction*, 607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EntryKernel* kernel_, 608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::deque<const OrderedChildSet*>* child_sets) const; 609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Append the handles of the children of |parent_id| to |result|. 6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void AppendChildHandles(const ScopedKernelLock& lock, 6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Id& parent_id, 6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Directory::Metahandles* result); 614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Helper methods used by PurgeDisabledTypes. 616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void UnapplyEntry(EntryKernel* entry); 6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DeleteEntry(const ScopedKernelLock& lock, 6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool save_to_journal, 619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EntryKernel* entry, 6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EntryKernelSet* entries_to_journal); 621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A private version of the public GetMetaHandlesOfType for when you already 6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // have a ScopedKernelLock. 6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void GetMetaHandlesOfType(const ScopedKernelLock& lock, 6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BaseTransaction* trans, 6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ModelType type, 6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<int64>* result); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Kernel* kernel_; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DirectoryBackingStore> store_; 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnrecoverableErrorHandler* const unrecoverable_error_handler_; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ReportUnrecoverableErrorFunction report_unrecoverable_error_function_; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool unrecoverable_error_set_; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not owned. 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NigoriHandler* const nigori_handler_; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cryptographer* const cryptographer_; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvariantCheckLevel invariant_check_level_; 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Maintain deleted entries not in |kernel_| until it's verified that they 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // are deleted in native models as well. 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DeleteJournal> delete_journal_; 646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Directory); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncable 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // SYNC_SYNCABLE_DIRECTORY_H_ 654