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

Unified Diff: sync/syncable/directory.h

Issue 11636006: WIP: The Bookmark Position Megapatch (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Various updates, including switch suffix to unique_client_tag style Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sync/sync.gyp ('k') | sync/syncable/directory.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sync/syncable/directory.h
diff --git a/sync/syncable/directory.h b/sync/syncable/directory.h
index 0eb0ae792c38c3599ba51c6b6652d6b90e5ab58a..f946d11815cb74fb89c418409f68e7c05565221f 100644
--- a/sync/syncable/directory.h
+++ b/sync/syncable/directory.h
@@ -17,8 +17,11 @@
#include "sync/syncable/dir_open_result.h"
#include "sync/syncable/entry_kernel.h"
#include "sync/syncable/metahandle_set.h"
+#include "sync/syncable/parent_child_index.h"
#include "sync/syncable/scoped_kernel_lock.h"
+// TODO: Check this file for useless members.
+
namespace syncer {
class Cryptographer;
@@ -84,21 +87,6 @@ struct ClientTagIndexer {
static bool ShouldInclude(const EntryKernel* a);
};
-// This index contains EntryKernels ordered by parent ID and metahandle.
-// It allows efficient lookup of the children of a given parent.
-struct ParentIdAndHandleIndexer {
- // This index is of the parent ID and metahandle. We use a custom
- // comparator.
- class Comparator {
- public:
- bool operator() (const syncable::EntryKernel* a,
- const syncable::EntryKernel* b) const;
- };
-
- // This index does not include deleted items.
- static bool ShouldInclude(const EntryKernel* a);
-};
-
// Given an Indexer providing the semantics of an index, defines the
// set type used to actually contain the index.
template <typename Indexer>
@@ -106,6 +94,8 @@ struct Index {
typedef std::set<EntryKernel*, typename Indexer::Comparator> Set;
};
+
+
// Reason for unlinking.
enum UnlinkReason {
NODE_MANIPULATION, // To be used by any operation manipulating the linked
@@ -239,9 +229,8 @@ class SYNC_EXPORT Directory {
void Close();
int64 NextMetahandle();
- // Always returns a negative id. Positive client ids are generated
- // by the server only.
- Id NextId();
+ // Returns a negative integer unique to this client.
+ syncable::Id NextId();
bool good() const { return NULL != kernel_; }
@@ -327,13 +316,6 @@ class SYNC_EXPORT Directory {
const Id& new_parent_id);
void ClearDirtyMetahandles();
- // These don't do semantic checking.
- // The semantic checking is implemented higher up.
- bool UnlinkEntryFromOrder(EntryKernel* entry,
- WriteTransaction* trans,
- ScopedKernelLock* lock,
- UnlinkReason unlink_reason);
-
DirOpenResult OpenImpl(
const std::string& name,
DirectoryChangeDelegate* delegate,
@@ -368,23 +350,27 @@ class SYNC_EXPORT Directory {
// and fill in |*first_child_id| with its id. Fills in a root Id if
// parent has no children. Returns true if the first child was
// successfully found, or false if an error was encountered.
- bool GetFirstChildId(BaseTransaction* trans, const Id& parent_id,
- Id* first_child_id) WARN_UNUSED_RESULT;
+ Id GetFirstChildId(BaseTransaction* trans, const EntryKernel* parent);
- // Find the last child in the positional ordering under a parent,
- // and fill in |*first_child_id| with its id. Fills in a root Id if
- // parent has no children. Returns true if the first child was
- // successfully found, or false if an error was encountered.
- bool GetLastChildIdForTest(BaseTransaction* trans, const Id& parent_id,
- Id* last_child_id) WARN_UNUSED_RESULT;
+ // These functions allow one to fetch the next or previous item under
+ // the same folder. Returns the "root" ID if there is no predecessor
+ // or successor.
+ //
+ // TODO(rlarocque): These functions are used mainly for tree traversal. We
+ // should replace these with an iterator API.
+ syncable::Id GetPredecessorId(EntryKernel*);
+ syncable::Id GetSuccessorId(EntryKernel*);
- // Compute a local predecessor position for |update_item|. The position
- // is determined by the SERVER_POSITION_IN_PARENT value of |update_item|,
- // as well as the SERVER_POSITION_IN_PARENT values of any up-to-date
- // children of |parent_id|.
- Id ComputePrevIdFromServerPosition(
- const EntryKernel* update_item,
- const syncable::Id& parent_id);
+ // Places |e| as a successor to |predecessor|. If |predecessor| is NULL,
+ // |e| will be placed as the left-most item in its folder.
+ //
+ // Both |e| and |predecessor| must be valid entries under the same parent.
+ //
+ // TODO(rlarocque): This function includes limited support for placing items
+ // with valid positions (ie. Bookmarks) as siblings of items that have no set
+ // ordering (ie. Autofill items). This support is required only for tests,
+ // and should be removed.
+ void PutPredecessor(EntryKernel* e, EntryKernel* predecessor);
// SaveChanges works by taking a consistent snapshot of the current Directory
// state and indices (by deep copy) under a ReadTransaction, passing this
@@ -494,12 +480,9 @@ class SYNC_EXPORT Directory {
Directory& operator = (const Directory&);
public:
+ // These contain all items, including IS_DEL items.
typedef Index<MetahandleIndexer>::Set MetahandlesIndex;
typedef Index<IdIndexer>::Set IdsIndex;
- // All entries in memory must be in both the MetahandlesIndex and
- // the IdsIndex, but only non-deleted entries will be the
- // ParentIdChildIndex.
- typedef Index<ParentIdAndHandleIndexer>::Set ParentIdChildIndex;
// Contains both deleted and existing entries with tags.
// We can't store only existing tags because the client would create
@@ -546,7 +529,11 @@ class SYNC_EXPORT Directory {
MetahandlesIndex* metahandles_index;
// Entries indexed by id
IdsIndex* ids_index;
- ParentIdChildIndex* parent_id_child_index;
+
+ // Contains non-deleted items, indexed according to parent and position
+ // within parent. Protected by the ScopedKernelLock.
+ ParentChildIndex* parent_child_index;
+
ClientTagIndex* client_tag_index;
// So we don't have to create an EntryKernel every time we want to
// look something up in an index. Needle in haystack metaphor.
@@ -591,36 +578,11 @@ class SYNC_EXPORT Directory {
const WeakHandle<TransactionObserver> transaction_observer;
};
- // Helper method used to do searches on |parent_id_child_index|.
- ParentIdChildIndex::iterator LocateInParentChildIndex(
- const ScopedKernelLock& lock,
- const Id& parent_id,
- int64 position_in_parent,
- const Id& item_id_for_tiebreaking);
-
- // Return an iterator to the beginning of the range of the children of
- // |parent_id| in the kernel's parent_id_child_index.
- ParentIdChildIndex::iterator GetParentChildIndexLowerBound(
- const ScopedKernelLock& lock,
- const Id& parent_id);
-
- // Return an iterator to just past the end of the range of the
- // children of |parent_id| in the kernel's parent_id_child_index.
- ParentIdChildIndex::iterator GetParentChildIndexUpperBound(
- const ScopedKernelLock& lock,
- const Id& parent_id);
-
// Append the handles of the children of |parent_id| to |result|.
void AppendChildHandles(
const ScopedKernelLock& lock,
const Id& parent_id, Directory::ChildHandles* result);
- // Return a pointer to what is probably (but not certainly) the
- // first child of |parent_id|, or NULL if |parent_id| definitely has
- // no children.
- EntryKernel* GetPossibleFirstChild(
- const ScopedKernelLock& lock, const Id& parent_id);
-
Kernel* kernel_;
scoped_ptr<DirectoryBackingStore> store_;
« no previous file with comments | « sync/sync.gyp ('k') | sync/syncable/directory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698