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

Side by Side Diff: chrome/browser/sync/syncable/syncable.h

Issue 2830027: Remove extended attributes. The lame broken codepath in the DBS was causing (Closed)
Patch Set: Synced with TOT, resolved conflicts. Created 10 years, 5 months 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ 5 #ifndef CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_
6 #define CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ 6 #define CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_
7 7
8 #include <algorithm> 8 #include <algorithm>
9 #include <bitset> 9 #include <bitset>
10 #include <iosfwd> 10 #include <iosfwd>
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 175
176 enum { 176 enum {
177 BIT_TEMPS_COUNT = BIT_TEMPS_END - BIT_TEMPS_BEGIN 177 BIT_TEMPS_COUNT = BIT_TEMPS_END - BIT_TEMPS_BEGIN
178 }; 178 };
179 179
180 class BaseTransaction; 180 class BaseTransaction;
181 class WriteTransaction; 181 class WriteTransaction;
182 class ReadTransaction; 182 class ReadTransaction;
183 class Directory; 183 class Directory;
184 class ScopedDirLookup; 184 class ScopedDirLookup;
185 class ExtendedAttribute;
186 185
187 // Instead of: 186 // Instead of:
188 // Entry e = transaction.GetById(id); 187 // Entry e = transaction.GetById(id);
189 // use: 188 // use:
190 // Entry e(transaction, GET_BY_ID, id); 189 // Entry e(transaction, GET_BY_ID, id);
191 // 190 //
192 // Why? The former would require a copy constructor, and it would be difficult 191 // Why? The former would require a copy constructor, and it would be difficult
193 // to enforce that an entry never outlived its transaction if there were a copy 192 // to enforce that an entry never outlived its transaction if there were a copy
194 // constructor. 193 // constructor.
195 enum GetById { 194 enum GetById {
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 inline bool ExistsOnClientBecauseNameIsNonEmpty() const { 409 inline bool ExistsOnClientBecauseNameIsNonEmpty() const {
411 DCHECK(kernel_); 410 DCHECK(kernel_);
412 return !kernel_->ref(NON_UNIQUE_NAME).empty(); 411 return !kernel_->ref(NON_UNIQUE_NAME).empty();
413 } 412 }
414 413
415 inline bool IsRoot() const { 414 inline bool IsRoot() const {
416 DCHECK(kernel_); 415 DCHECK(kernel_);
417 return kernel_->ref(ID).IsRoot(); 416 return kernel_->ref(ID).IsRoot();
418 } 417 }
419 418
420 void GetAllExtendedAttributes(BaseTransaction* trans,
421 std::set<ExtendedAttribute>* result);
422 void GetExtendedAttributesList(BaseTransaction* trans,
423 AttributeKeySet* result);
424 // Flags all extended attributes for deletion on the next SaveChanges.
425 void DeleteAllExtendedAttributes(WriteTransaction *trans);
426
427 Directory* dir() const; 419 Directory* dir() const;
428 420
429 const EntryKernel GetKernelCopy() const { 421 const EntryKernel GetKernelCopy() const {
430 return *kernel_; 422 return *kernel_;
431 } 423 }
432 424
433 425
434 protected: // Don't allow creation on heap, except by sync API wrappers. 426 protected: // Don't allow creation on heap, except by sync API wrappers.
435 friend class sync_api::ReadNode; 427 friend class sync_api::ReadNode;
436 void* operator new(size_t size) { return (::operator new)(size); } 428 void* operator new(size_t size) { return (::operator new)(size); }
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 // These members are only valid for CALCULATE_CHANGES. 591 // These members are only valid for CALCULATE_CHANGES.
600 const OriginalEntries* originals; 592 const OriginalEntries* originals;
601 BaseTransaction* trans; 593 BaseTransaction* trans;
602 WriterTag writer; 594 WriterTag writer;
603 typedef DirectoryChangeEvent EventType; 595 typedef DirectoryChangeEvent EventType;
604 static inline bool IsChannelShutdownEvent(const EventType& e) { 596 static inline bool IsChannelShutdownEvent(const EventType& e) {
605 return SHUTDOWN == e.todo; 597 return SHUTDOWN == e.todo;
606 } 598 }
607 }; 599 };
608 600
609 struct ExtendedAttributeKey {
610 int64 metahandle;
611 std::string key;
612 inline bool operator < (const ExtendedAttributeKey& x) const {
613 if (metahandle != x.metahandle)
614 return metahandle < x.metahandle;
615 return key.compare(x.key) < 0;
616 }
617 ExtendedAttributeKey(int64 metahandle, const std::string& key)
618 : metahandle(metahandle), key(key) { }
619 };
620
621 struct ExtendedAttributeValue {
622 Blob value;
623 bool is_deleted;
624 bool dirty;
625 };
626
627 typedef std::map<ExtendedAttributeKey, ExtendedAttributeValue>
628 ExtendedAttributes;
629
630 // A list of metahandles whose metadata should not be purged. 601 // A list of metahandles whose metadata should not be purged.
631 typedef std::multiset<int64> Pegs; 602 typedef std::multiset<int64> Pegs;
632 603
633 // The name Directory in this case means the entire directory 604 // The name Directory in this case means the entire directory
634 // structure within a single user account. 605 // structure within a single user account.
635 // 606 //
636 // Sqlite is a little goofy, in that each thread must access a database 607 // Sqlite is a little goofy, in that each thread must access a database
637 // via its own handle. So, a Directory object should only be accessed 608 // via its own handle. So, a Directory object should only be accessed
638 // from a single thread. Use DirectoryManager's Open() method to 609 // from a single thread. Use DirectoryManager's Open() method to
639 // always get a directory that has been properly initialized on the 610 // always get a directory that has been properly initialized on the
(...skipping 14 matching lines...) Expand all
654 // To prevent deadlock, the reader writer transaction lock must always 625 // To prevent deadlock, the reader writer transaction lock must always
655 // be held before acquiring the kernel lock. 626 // be held before acquiring the kernel lock.
656 class ScopedKernelLock; 627 class ScopedKernelLock;
657 class IdFilter; 628 class IdFilter;
658 class DirectoryManager; 629 class DirectoryManager;
659 struct PathMatcher; 630 struct PathMatcher;
660 631
661 class Directory { 632 class Directory {
662 friend class BaseTransaction; 633 friend class BaseTransaction;
663 friend class Entry; 634 friend class Entry;
664 friend class ExtendedAttribute;
665 friend class MutableEntry; 635 friend class MutableEntry;
666 friend class MutableExtendedAttribute;
667 friend class ReadTransaction; 636 friend class ReadTransaction;
668 friend class ReadTransactionWithoutDB; 637 friend class ReadTransactionWithoutDB;
669 friend class ScopedKernelLock; 638 friend class ScopedKernelLock;
670 friend class ScopedKernelUnlock; 639 friend class ScopedKernelUnlock;
671 friend class WriteTransaction; 640 friend class WriteTransaction;
672 friend class SyncableDirectoryTest; 641 friend class SyncableDirectoryTest;
673 FRIEND_TEST_ALL_PREFIXES(SyncableDirectoryTest, 642 FRIEND_TEST_ALL_PREFIXES(SyncableDirectoryTest,
674 TakeSnapshotGetsAllDirtyHandlesTest); 643 TakeSnapshotGetsAllDirtyHandlesTest);
675 FRIEND_TEST_ALL_PREFIXES(SyncableDirectoryTest, 644 FRIEND_TEST_ALL_PREFIXES(SyncableDirectoryTest,
676 TakeSnapshotGetsOnlyDirtyHandlesTest); 645 TakeSnapshotGetsOnlyDirtyHandlesTest);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 KERNEL_SHARE_INFO_DIRTY 685 KERNEL_SHARE_INFO_DIRTY
717 }; 686 };
718 687
719 // When the Directory is told to SaveChanges, a SaveChangesSnapshot is 688 // When the Directory is told to SaveChanges, a SaveChangesSnapshot is
720 // constructed and forms a consistent snapshot of what needs to be sent to 689 // constructed and forms a consistent snapshot of what needs to be sent to
721 // the backing store. 690 // the backing store.
722 struct SaveChangesSnapshot { 691 struct SaveChangesSnapshot {
723 KernelShareInfoStatus kernel_info_status; 692 KernelShareInfoStatus kernel_info_status;
724 PersistedKernelInfo kernel_info; 693 PersistedKernelInfo kernel_info;
725 OriginalEntries dirty_metas; 694 OriginalEntries dirty_metas;
726 ExtendedAttributes dirty_xattrs;
727 SaveChangesSnapshot() : kernel_info_status(KERNEL_SHARE_INFO_INVALID) { 695 SaveChangesSnapshot() : kernel_info_status(KERNEL_SHARE_INFO_INVALID) {
728 } 696 }
729 }; 697 };
730 698
731 Directory(); 699 Directory();
732 virtual ~Directory(); 700 virtual ~Directory();
733 701
734 DirOpenResult Open(const FilePath& file_path, const std::string& name); 702 DirOpenResult Open(const FilePath& file_path, const std::string& name);
735 703
736 void Close(); 704 void Close();
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 // syncer should call it from its PerformSyncQueries member. 827 // syncer should call it from its PerformSyncQueries member.
860 typedef std::vector<int64> UnsyncedMetaHandles; 828 typedef std::vector<int64> UnsyncedMetaHandles;
861 void GetUnsyncedMetaHandles(BaseTransaction* trans, 829 void GetUnsyncedMetaHandles(BaseTransaction* trans,
862 UnsyncedMetaHandles* result); 830 UnsyncedMetaHandles* result);
863 831
864 // Get all the metahandles for unapplied updates 832 // Get all the metahandles for unapplied updates
865 typedef std::vector<int64> UnappliedUpdateMetaHandles; 833 typedef std::vector<int64> UnappliedUpdateMetaHandles;
866 void GetUnappliedUpdateMetaHandles(BaseTransaction* trans, 834 void GetUnappliedUpdateMetaHandles(BaseTransaction* trans,
867 UnappliedUpdateMetaHandles* result); 835 UnappliedUpdateMetaHandles* result);
868 836
869 void GetAllExtendedAttributes(BaseTransaction* trans, int64 metahandle,
870 std::set<ExtendedAttribute>* result);
871 // Get all extended attribute keys associated with a metahandle
872 void GetExtendedAttributesList(BaseTransaction* trans, int64 metahandle,
873 AttributeKeySet* result);
874 // Flags all extended attributes for deletion on the next SaveChanges.
875 void DeleteAllExtendedAttributes(WriteTransaction* trans, int64 metahandle);
876
877 // Get the channel for post save notification, used by the syncer. 837 // Get the channel for post save notification, used by the syncer.
878 inline Channel* channel() const { 838 inline Channel* channel() const {
879 return kernel_->channel; 839 return kernel_->channel;
880 } 840 }
881 841
882 // Checks tree metadata consistency. 842 // Checks tree metadata consistency.
883 // If full_scan is false, the function will avoid pulling any entries from the 843 // If full_scan is false, the function will avoid pulling any entries from the
884 // db and scan entries currently in ram. 844 // db and scan entries currently in ram.
885 // If full_scan is true, all entries will be pulled from the database. 845 // If full_scan is true, all entries will be pulled from the database.
886 // No return value, CHECKs will be triggered if we're given bad 846 // No return value, CHECKs will be triggered if we're given bad
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
995 // Never hold the mutex and do anything with the database or any 955 // Never hold the mutex and do anything with the database or any
996 // other buffered IO. Violating this rule will result in deadlock. 956 // other buffered IO. Violating this rule will result in deadlock.
997 Lock mutex; 957 Lock mutex;
998 MetahandlesIndex* metahandles_index; // Entries indexed by metahandle 958 MetahandlesIndex* metahandles_index; // Entries indexed by metahandle
999 IdsIndex* ids_index; // Entries indexed by id 959 IdsIndex* ids_index; // Entries indexed by id
1000 ParentIdChildIndex* parent_id_child_index; 960 ParentIdChildIndex* parent_id_child_index;
1001 ClientTagIndex* client_tag_index; 961 ClientTagIndex* client_tag_index;
1002 // So we don't have to create an EntryKernel every time we want to 962 // So we don't have to create an EntryKernel every time we want to
1003 // look something up in an index. Needle in haystack metaphor. 963 // look something up in an index. Needle in haystack metaphor.
1004 EntryKernel needle; 964 EntryKernel needle;
1005 ExtendedAttributes* const extended_attributes;
1006 965
1007 // 3 in-memory indices on bits used extremely frequently by the syncer. 966 // 3 in-memory indices on bits used extremely frequently by the syncer.
1008 MetahandleSet* const unapplied_update_metahandles; 967 MetahandleSet* const unapplied_update_metahandles;
1009 MetahandleSet* const unsynced_metahandles; 968 MetahandleSet* const unsynced_metahandles;
1010 // Contains metahandles that are most likely dirty (though not 969 // Contains metahandles that are most likely dirty (though not
1011 // necessarily). Dirtyness is confirmed in TakeSnapshotForSaveChanges(). 970 // necessarily). Dirtyness is confirmed in TakeSnapshotForSaveChanges().
1012 MetahandleSet* const dirty_metahandles; 971 MetahandleSet* const dirty_metahandles;
1013 972
1014 // TODO(ncarter): Figure out what the hell this is, and comment it. 973 // TODO(ncarter): Figure out what the hell this is, and comment it.
1015 Channel* const channel; 974 Channel* const channel;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 1087
1129 bool IsLegalNewParent(BaseTransaction* trans, const Id& id, const Id& parentid); 1088 bool IsLegalNewParent(BaseTransaction* trans, const Id& id, const Id& parentid);
1130 int ComparePathNames(const std::string& a, const std::string& b); 1089 int ComparePathNames(const std::string& a, const std::string& b);
1131 1090
1132 // Exposed in header as this is used as a sqlite3 callback. 1091 // Exposed in header as this is used as a sqlite3 callback.
1133 int ComparePathNames16(void*, int a_bytes, const void* a, int b_bytes, 1092 int ComparePathNames16(void*, int a_bytes, const void* a, int b_bytes,
1134 const void* b); 1093 const void* b);
1135 1094
1136 int64 Now(); 1095 int64 Now();
1137 1096
1138 class ExtendedAttribute {
1139 public:
1140 ExtendedAttribute(BaseTransaction* trans, GetByHandle,
1141 const ExtendedAttributeKey& key);
1142 int64 metahandle() const { return i_->first.metahandle; }
1143 const std::string& key() const { return i_->first.key; }
1144 const Blob& value() const { return i_->second.value; }
1145 bool is_deleted() const { return i_->second.is_deleted; }
1146 bool good() const { return good_; }
1147 bool operator < (const ExtendedAttribute& x) const {
1148 return i_->first < x.i_->first;
1149 }
1150 protected:
1151 bool Init(BaseTransaction* trans,
1152 Directory::Kernel* const kernel,
1153 ScopedKernelLock* lock,
1154 const ExtendedAttributeKey& key);
1155 ExtendedAttribute() { }
1156 ExtendedAttributes::iterator i_;
1157 bool good_;
1158 };
1159
1160 class MutableExtendedAttribute : public ExtendedAttribute {
1161 public:
1162 MutableExtendedAttribute(WriteTransaction* trans, GetByHandle,
1163 const ExtendedAttributeKey& key);
1164 MutableExtendedAttribute(WriteTransaction* trans, Create,
1165 const ExtendedAttributeKey& key);
1166
1167 Blob* mutable_value() {
1168 i_->second.dirty = true;
1169 i_->second.is_deleted = false;
1170 return &(i_->second.value);
1171 }
1172
1173 void delete_attribute() {
1174 i_->second.dirty = true;
1175 i_->second.is_deleted = true;
1176 }
1177 };
1178
1179 // Get an extended attribute from an Entry by name. Returns a pointer
1180 // to a const Blob containing the attribute data, or NULL if there is
1181 // no attribute with the given name. The pointer is valid for the
1182 // duration of the Entry's transaction.
1183 const Blob* GetExtendedAttributeValue(const Entry& e,
1184 const std::string& attribute_name);
1185
1186 // This function sets only the flags needed to get this entry to sync. 1097 // This function sets only the flags needed to get this entry to sync.
1187 void MarkForSyncing(syncable::MutableEntry* e); 1098 void MarkForSyncing(syncable::MutableEntry* e);
1188 1099
1189 // This is not a reset. It just sets the numeric fields which are not 1100 // This is not a reset. It just sets the numeric fields which are not
1190 // initialized by the constructor to zero. 1101 // initialized by the constructor to zero.
1191 void ZeroFields(EntryKernel* entry, int first_field); 1102 void ZeroFields(EntryKernel* entry, int first_field);
1192 1103
1193 } // namespace syncable 1104 } // namespace syncable
1194 1105
1195 std::ostream& operator <<(std::ostream&, const syncable::Blob&); 1106 std::ostream& operator <<(std::ostream&, const syncable::Blob&);
1196 1107
1197 browser_sync::FastDump& operator << 1108 browser_sync::FastDump& operator <<
1198 (browser_sync::FastDump&, const syncable::Blob&); 1109 (browser_sync::FastDump&, const syncable::Blob&);
1199 1110
1200 #endif // CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ 1111 #endif // CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_
OLDNEW
« no previous file with comments | « chrome/browser/sync/syncable/directory_backing_store_unittest.cc ('k') | chrome/browser/sync/syncable/syncable.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698