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

Unified Diff: chrome/browser/sync/syncable/syncable.h

Issue 371029: Remove unique naming. (Closed)
Patch Set: Ready and about to go in! Created 11 years, 1 month 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 | « chrome/browser/sync/syncable/directory_backing_store.cc ('k') | chrome/browser/sync/syncable/syncable.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/sync/syncable/syncable.h
diff --git a/chrome/browser/sync/syncable/syncable.h b/chrome/browser/sync/syncable/syncable.h
old mode 100644
new mode 100755
index c92ea7ba7e4fe6e4206a3901f63b03c382130d50..1b541edd8bbf7cde9daa03c944ec939cf7bc8ae4
--- a/chrome/browser/sync/syncable/syncable.h
+++ b/chrome/browser/sync/syncable/syncable.h
@@ -131,20 +131,9 @@ enum {
};
enum StringField {
- // The name, transformed so as to be suitable for use as a path-element. It
- // is unique, and legal for this client.
- NAME = STRING_FIELDS_BEGIN,
- // The local name, pre-sanitization. It is not necessarily unique. If this
- // is empty, it means |NAME| did not require sanitization.
- UNSANITIZED_NAME,
- // If NAME/UNSANITIZED_NAME are "Foo (2)", then NON_UNIQUE_NAME may be "Foo".
- NON_UNIQUE_NAME,
- // The server version of |NAME|. It is uniquified, but not necessarily
- // OS-legal.
- SERVER_NAME,
- // The server version of |NON_UNIQUE_NAME|. Again, if SERVER_NAME is
- // like "Foo (2)" due to a commit-time name aside, SERVER_NON_UNIQUE_NAME
- // may hold the value "Foo".
+ // Name, will be truncated by server. Can be duplicated in a folder.
+ NON_UNIQUE_NAME = STRING_FIELDS_BEGIN,
+ // The server version of |NON_UNIQUE_NAME|.
SERVER_NON_UNIQUE_NAME,
// For bookmark entries, the URL of the bookmark.
BOOKMARK_URL,
@@ -186,9 +175,6 @@ enum {
enum BitTemp {
SYNCING = BIT_TEMPS_BEGIN,
IS_NEW, // Means use INSERT instead of UPDATE to save to db.
- DEPRECATED_DELETE_ON_CLOSE, // Set by redirector, IS_OPEN must also be set.
- DEPRECATED_CHANGED_SINCE_LAST_OPEN, // Have we been written to since we've
- // been opened.
BIT_TEMPS_END,
};
@@ -223,19 +209,6 @@ enum GetByHandle {
GET_BY_HANDLE
};
-enum GetByPath {
- GET_BY_PATH
-};
-
-enum GetByParentIdAndName {
- GET_BY_PARENTID_AND_NAME
-};
-
-// DBName is the name stored in the database.
-enum GetByParentIdAndDBName {
- GET_BY_PARENTID_AND_DBNAME
-};
-
enum Create {
CREATE
};
@@ -246,182 +219,6 @@ enum CreateNewUpdateItem {
typedef std::set<PathString> AttributeKeySet;
-// DBName is a PathString with additional transformation methods that are
-// useful when trying to derive a unique and legal database name from an
-// unsanitized sync name.
-class DBName : public PathString {
- public:
- explicit DBName(const PathString& database_name)
- : PathString(database_name) { }
-
- // TODO(ncarter): Remove these codepaths to maintain alternate titles which
- // are OS legal filenames, Chrome doesn't depend on this like some other
- // browsers do.
- void MakeOSLegal() {
- PathString new_value = MakePathComponentOSLegal(*this);
- if (!new_value.empty())
- swap(new_value);
- }
-
- // Modify the value of this DBName so that it is not in use by any entry
- // inside |parent_id|, except maybe |e|. |e| may be NULL if you are trying
- // to compute a name for an entry which has yet to be created.
- void MakeNoncollidingForEntry(BaseTransaction* trans,
- const Id& parent_id,
- Entry* e);
-};
-
-// SyncName encapsulates a canonical server name. In general, when we need to
-// muck around with a name that the server sends us (e.g. to make it OS legal),
-// we try to preserve the original value in a SyncName,
-// and distill the new local value into a DBName.
-// At other times, we need to apply transforms in the
-// other direction -- that is, to create a server-appropriate SyncName from a
-// user-updated DBName (which is an OS legal name, but not necessarily in the
-// format that the server wants it to be). For that sort of thing, you should
-// initialize a SyncName from the DB name value, and use the methods of
-// SyncName to canonicalize it. At other times, you have a pair of canonical
-// server values -- one (the "value") which is unique in the parent, and another
-// (the "non unique value") which is not unique in the parent -- and you
-// simply want to create a SyncName to hold them as a pair.
-class SyncName {
- public:
- // Create a SyncName with the initially specified value.
- explicit SyncName(const PathString& sync_name)
- : value_(sync_name), non_unique_value_(sync_name) { }
-
- // Create a SyncName by specifying a value and a non-unique value. If
- // you use this constructor, the values you provide should already be
- // acceptable server names. Don't use the mutation/sanitization methods
- // on the resulting instance -- mutation won't work if you have distinct
- // values for the unique and non-unique fields.
- SyncName(const PathString& unique_sync_name,
- const PathString& non_unique_sync_name)
- : value_(unique_sync_name), non_unique_value_(non_unique_sync_name) { }
-
- // Transform |value_| so that it's a legal server name.
- void MakeServerLegal() {
- DCHECK_EQ(value_, non_unique_value_)
- << "Deriving value_ will overwrite non_unique_value_.";
- // Append a trailing space if the value is one of the server's three
- // forbidden special cases.
- if (value_.empty() ||
- value_ == PSTR(".") ||
- value_ == PSTR("..")) {
- value_.append(PSTR(" "));
- non_unique_value_ = value_;
- }
- // TODO(ncarter): Handle server's other requirement: truncation to 256
- // bytes in Unicode NFC.
- }
-
- const PathString& value() const { return value_; }
- PathString& value() { return value_; }
- const PathString& non_unique_value() const { return non_unique_value_; }
- PathString& non_unique_value() { return non_unique_value_; }
- void set_non_unique_value(const PathString& value) {
- non_unique_value_ = value;
- }
-
- inline bool operator==(const SyncName& right_hand_side) const {
- return value_ == right_hand_side.value_ &&
- non_unique_value_ == right_hand_side.non_unique_value_;
- }
- inline bool operator!=(const SyncName& right_hand_side) const {
- return !(*this == right_hand_side);
- }
- private:
- PathString value_;
- PathString non_unique_value_;
-};
-
-// Name is a SyncName which has an additional DBName that provides a way to
-// interpolate the "unsanitized name" according to the syncable convention.
-//
-// A method might accept a Name as an parameter when the sync and database
-// names need to be set simultaneously:
-//
-// void PutName(const Name& new_name) {
-// Put(NAME, new_name.db_value());
-// Put(UNSANITIZED_NAME, new_name.GetUnsanitizedName());
-// }
-//
-// A code point that is trying to convert between local database names and
-// server sync names can use Name to help with the conversion:
-//
-// SyncName server_name = entry->GetServerName();
-// Name name = Name::FromSyncName(server_name); // Initially, name.value()
-// // and name.db_value() are
-// // equal to
-// // server_name.value().
-// name.db_value().MakeOSLegal(); // Updates name.db_value in-place,
-// // leaving name.value() unchanged.
-// foo->PutName(name);
-//
-class Name : public SyncName {
- public:
- // Create a Name with an initially specified db_value and value.
- Name(const PathString& db_name, const PathString& sync_name)
- : SyncName(sync_name), db_value_(db_name) { }
-
- // Create a Name by specifying the db name, sync name, and non-unique
- // sync name values.
- Name(const PathString& db_name, const PathString& sync_name,
- const PathString& non_unique_sync_name)
- : SyncName(sync_name, non_unique_sync_name), db_value_(db_name) { }
-
- // Create a Name with all name values initially equal to the the single
- // specified argument.
- explicit Name(const PathString& sync_and_db_name)
- : SyncName(sync_and_db_name), db_value_(sync_and_db_name) { }
-
- // Create a Name using the local (non-SERVER) fields of an EntryKernel.
- static Name FromEntryKernel(struct EntryKernel*);
-
- // Create a Name from a SyncName. db_value is initially sync_name.value().
- // non_unique_value() and value() are copied from |sync_name|.
- static Name FromSyncName(const SyncName& sync_name) {
- return Name(sync_name.value(), sync_name.value(),
- sync_name.non_unique_value());
- }
-
- static Name FromDBNameAndSyncName(const PathString& db_name,
- const SyncName& sync_name) {
- return Name(db_name, sync_name.value(), sync_name.non_unique_value());
- }
-
- // Get the database name. The non-const version is useful for in-place
- // mutation.
- const DBName& db_value() const { return db_value_; }
- DBName& db_value() { return db_value_; }
-
- // Do the sync names and database names differ? This indicates that
- // the sync name has been sanitized, and that GetUnsanitizedName() will
- // be non-empty.
- bool HasBeenSanitized() const { return db_value_ != value(); }
-
- // Compute the value of the unsanitized name from the current sync and db
- // name values. The unsanitized name is the sync name value, unless the sync
- // name is the same as the db name value, in which case the unsanitized name
- // is empty.
- PathString GetUnsanitizedName() const {
- return HasBeenSanitized() ? value() : PathString();
- }
-
- inline bool operator==(const Name& right_hand_side) const {
- return this->SyncName::operator==(right_hand_side) &&
- db_value_ == right_hand_side.db_value_;
- }
- inline bool operator!=(const Name& right_hand_side) const {
- return !(*this == right_hand_side);
- }
-
- private:
- // The database name, which is maintained to be a legal and unique-in-parent
- // name.
- DBName db_value_;
-};
-
// Why the singular enums? So the code compile-time dispatches instead of
// runtime dispatches as it would with a single enum and an if() statement.
@@ -515,11 +312,6 @@ class Entry {
Entry(BaseTransaction* trans, GetByHandle, int64 handle);
Entry(BaseTransaction* trans, GetById, const Id& id);
Entry(BaseTransaction* trans, GetByTag, const PathString& tag);
- Entry(BaseTransaction* trans, GetByPath, const PathString& path);
- Entry(BaseTransaction* trans, GetByParentIdAndName, const Id& id,
- const PathString& name);
- Entry(BaseTransaction* trans, GetByParentIdAndDBName, const Id& id,
- const PathString& name);
bool good() const { return 0 != kernel_; }
@@ -563,31 +355,12 @@ class Entry {
DCHECK(kernel_);
return kernel_->ref(field);
}
- inline Name GetName() const {
- DCHECK(kernel_);
- return Name::FromEntryKernel(kernel_);
- }
- inline SyncName GetServerName() const {
- DCHECK(kernel_);
- return SyncName(kernel_->ref(SERVER_NAME),
- kernel_->ref(SERVER_NON_UNIQUE_NAME));
- }
- inline bool SyncNameMatchesServerName() const {
- DCHECK(kernel_);
- SyncName sync_name(GetName());
- return sync_name == GetServerName();
- }
- inline PathString GetSyncNameValue() const {
- DCHECK(kernel_);
- // This should always be equal to GetName().sync_name().value(), but may be
- // faster.
- return kernel_->ref(UNSANITIZED_NAME).empty() ? kernel_->ref(NAME) :
- kernel_->ref(UNSANITIZED_NAME);
- }
- inline bool ExistsOnClientBecauseDatabaseNameIsNonEmpty() const {
+
+ inline bool ExistsOnClientBecauseNameIsNonEmpty() const {
DCHECK(kernel_);
- return !kernel_->ref(NAME).empty();
+ return !kernel_->ref(NON_UNIQUE_NAME).empty();
}
+
inline bool IsRoot() const {
DCHECK(kernel_);
return kernel_->ref(ID).IsRoot();
@@ -635,11 +408,6 @@ class MutableEntry : public Entry {
MutableEntry(WriteTransaction* trans, CreateNewUpdateItem, const Id& id);
MutableEntry(WriteTransaction* trans, GetByHandle, int64);
MutableEntry(WriteTransaction* trans, GetById, const Id&);
- MutableEntry(WriteTransaction* trans, GetByPath, const PathString& path);
- MutableEntry(WriteTransaction* trans, GetByParentIdAndName, const Id&,
- const PathString& name);
- MutableEntry(WriteTransaction* trans, GetByParentIdAndDBName,
- const Id& parentid, const PathString& name);
inline WriteTransaction* write_transaction() const {
return write_transaction_;
@@ -648,19 +416,12 @@ class MutableEntry : public Entry {
// Field Accessors. Some of them trigger the re-indexing of the entry.
// Return true on success, return false on failure, which means
// that putting the value would have caused a duplicate in the index.
+ // TODO(chron): Remove some of these unecessary return values.
bool Put(Int64Field field, const int64& value);
bool Put(IdField field, const Id& value);
bool Put(StringField field, const PathString& value);
bool Put(BaseVersion field, int64 value);
- inline bool PutName(const Name& name) {
- return (Put(NAME, name.db_value()) &&
- Put(UNSANITIZED_NAME, name.GetUnsanitizedName()) &&
- Put(NON_UNIQUE_NAME, name.non_unique_value()));
- }
- inline bool PutServerName(const SyncName& server_name) {
- return (Put(SERVER_NAME, server_name.value()) &&
- Put(SERVER_NON_UNIQUE_NAME, server_name.non_unique_value()));
- }
+
inline bool Put(BlobField field, const Blob& value) {
return PutField(field, value);
}
@@ -672,10 +433,6 @@ class MutableEntry : public Entry {
}
bool Put(IndexedBitField field, bool value);
- // Avoids temporary collision in index when renaming a bookmark into another
- // folder.
- bool PutParentIdAndName(const Id& parent_id, const Name& name);
-
// Sets the position of this item, and updates the entry kernels of the
// adjacent siblings so that list invariants are maintained. Returns false
// and fails if |predecessor_id| does not identify a sibling. Pass the root
@@ -732,7 +489,7 @@ template <Int64Field field_index>
class SameField;
template <Int64Field field_index>
class HashField;
-class LessParentIdAndNames;
+class LessParentIdAndHandle;
class LessMultiIncusionTargetAndMetahandle;
template <typename FieldType, FieldType field_index>
class LessField;
@@ -922,21 +679,18 @@ class Directory {
std::string cache_guid() const;
protected: // for friends, mainly used by Entry constructors
- EntryKernel* GetChildWithName(const Id& parent_id, const PathString& name);
- EntryKernel* GetChildWithDBName(const Id& parent_id, const PathString& name);
EntryKernel* GetEntryByHandle(const int64 handle);
EntryKernel* GetEntryByHandle(const int64 metahandle, ScopedKernelLock* lock);
EntryKernel* GetEntryById(const Id& id);
EntryKernel* GetEntryByTag(const PathString& tag);
EntryKernel* GetRootEntry();
- EntryKernel* GetEntryByPath(const PathString& path);
bool ReindexId(EntryKernel* const entry, const Id& new_id);
- bool ReindexParentIdAndName(EntryKernel* const entry, const Id& new_parent_id,
- const PathString& new_name);
- // These don't do the semantic checking that the redirector needs.
+ void ReindexParentId(EntryKernel* const entry, const Id& new_parent_id);
+
+ // These don't do semantic checking.
// The semantic checking is implemented higher up.
- bool Undelete(EntryKernel* const entry);
- bool Delete(EntryKernel* const entry);
+ void Undelete(EntryKernel* const entry);
+ void Delete(EntryKernel* const entry);
// Overridden by tests.
virtual DirectoryBackingStore* CreateBackingStore(
@@ -947,12 +701,6 @@ class Directory {
// These private versions expect the kernel lock to already be held
// before calling.
EntryKernel* GetEntryById(const Id& id, ScopedKernelLock* const lock);
- EntryKernel* GetChildWithName(const Id& parent_id,
- const PathString& name,
- ScopedKernelLock* const lock);
- EntryKernel* GetChildWithNameImpl(const Id& parent_id,
- const PathString& name,
- ScopedKernelLock* const lock);
DirOpenResult OpenImpl(const FilePath& file_path, const PathString& name);
@@ -1081,9 +829,10 @@ class Directory {
typedef std::set<EntryKernel*, LessField<IdField, ID> > IdsIndex;
// All entries in memory must be in both the MetahandlesIndex and
// the IdsIndex, but only non-deleted entries will be the
- // ParentIdAndNamesIndex, because there can be multiple deleted
- // entries with the same parent id and name.
- typedef std::set<EntryKernel*, LessParentIdAndNames> ParentIdAndNamesIndex;
+ // ParentIdChildIndex.
+ // This index contains EntryKernels ordered by parent ID and metahandle.
+ // It allows efficient lookup of the children of a given parent.
+ typedef std::set<EntryKernel*, LessParentIdAndHandle> ParentIdChildIndex;
typedef std::vector<int64> MetahandlesToPurge;
private:
@@ -1116,7 +865,7 @@ class Directory {
Lock mutex;
MetahandlesIndex* metahandles_index; // Entries indexed by metahandle
IdsIndex* ids_index; // Entries indexed by id
- ParentIdAndNamesIndex* parent_id_and_names_index;
+ ParentIdChildIndex* parent_id_child_index;
// So we don't have to create an EntryKernel every time we want to
// look something up in an index. Needle in haystack metaphore.
EntryKernel needle;
@@ -1179,7 +928,7 @@ class ScopedKernelLock {
DISALLOW_COPY_AND_ASSIGN(ScopedKernelLock);
};
-// Transactions are now processed FIFO (+overlapping reads).
+// Transactions are now processed FIFO with a straight lock
class BaseTransaction {
friend class Entry;
public:
@@ -1254,9 +1003,6 @@ int ComparePathNames16(void*, int a_bytes, const void* a, int b_bytes,
int64 Now();
-// Does wildcard processing.
-BOOL PathNameMatch(const PathString& pathname, const PathString& pathspec);
-
class ExtendedAttribute {
public:
ExtendedAttribute(BaseTransaction* trans, GetByHandle,
« no previous file with comments | « chrome/browser/sync/syncable/directory_backing_store.cc ('k') | chrome/browser/sync/syncable/syncable.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698