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

Side by Side Diff: sync/syncable/mutable_entry.cc

Issue 10989063: Changed DB to store node positions as Ordinals. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Ordinal default ctor now creates invalid Ordinals Created 8 years, 2 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "sync/syncable/mutable_entry.h" 5 #include "sync/syncable/mutable_entry.h"
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "sync/internal_api/public/base/node_ordinal.h"
8 #include "sync/syncable/directory.h" 9 #include "sync/syncable/directory.h"
9 #include "sync/syncable/scoped_index_updater.h" 10 #include "sync/syncable/scoped_index_updater.h"
10 #include "sync/syncable/scoped_kernel_lock.h" 11 #include "sync/syncable/scoped_kernel_lock.h"
11 #include "sync/syncable/syncable-inl.h" 12 #include "sync/syncable/syncable-inl.h"
12 #include "sync/syncable/syncable_changes_version.h" 13 #include "sync/syncable/syncable_changes_version.h"
13 #include "sync/syncable/syncable_util.h" 14 #include "sync/syncable/syncable_util.h"
14 #include "sync/syncable/write_transaction.h" 15 #include "sync/syncable/write_transaction.h"
15 16
16 using std::string; 17 using std::string;
17 18
(...skipping 16 matching lines...) Expand all
34 kernel->put(ID, trans->directory_->NextId()); 35 kernel->put(ID, trans->directory_->NextId());
35 kernel->put(META_HANDLE, trans->directory_->NextMetahandle()); 36 kernel->put(META_HANDLE, trans->directory_->NextMetahandle());
36 kernel->mark_dirty(trans->directory_->kernel_->dirty_metahandles); 37 kernel->mark_dirty(trans->directory_->kernel_->dirty_metahandles);
37 kernel->put(PARENT_ID, parent_id); 38 kernel->put(PARENT_ID, parent_id);
38 kernel->put(NON_UNIQUE_NAME, name); 39 kernel->put(NON_UNIQUE_NAME, name);
39 const base::Time& now = base::Time::Now(); 40 const base::Time& now = base::Time::Now();
40 kernel->put(CTIME, now); 41 kernel->put(CTIME, now);
41 kernel->put(MTIME, now); 42 kernel->put(MTIME, now);
42 // We match the database defaults here 43 // We match the database defaults here
43 kernel->put(BASE_VERSION, CHANGES_VERSION); 44 kernel->put(BASE_VERSION, CHANGES_VERSION);
45 kernel->put(SERVER_ORDINAL_IN_PARENT, NodeOrdinal::CreateInitialOrdinal());
44 if (!trans->directory()->InsertEntry(trans, kernel.get())) { 46 if (!trans->directory()->InsertEntry(trans, kernel.get())) {
45 return; // We failed inserting, nothing more to do. 47 return; // We failed inserting, nothing more to do.
46 } 48 }
47 // Because this entry is new, it was originally deleted. 49 // Because this entry is new, it was originally deleted.
48 kernel->put(IS_DEL, true); 50 kernel->put(IS_DEL, true);
49 trans->SaveOriginal(kernel.get()); 51 trans->SaveOriginal(kernel.get());
50 kernel->put(IS_DEL, false); 52 kernel->put(IS_DEL, false);
51 53
52 // Now swap the pointers. 54 // Now swap the pointers.
53 kernel_ = kernel.release(); 55 kernel_ = kernel.release();
54 } 56 }
55 57
56 MutableEntry::MutableEntry(WriteTransaction* trans, CreateNewUpdateItem, 58 MutableEntry::MutableEntry(WriteTransaction* trans, CreateNewUpdateItem,
57 const Id& id) 59 const Id& id)
58 : Entry(trans), write_transaction_(trans) { 60 : Entry(trans), write_transaction_(trans) {
59 Entry same_id(trans, GET_BY_ID, id); 61 Entry same_id(trans, GET_BY_ID, id);
60 kernel_ = NULL; 62 kernel_ = NULL;
61 if (same_id.good()) { 63 if (same_id.good()) {
62 return; // already have an item with this ID. 64 return; // already have an item with this ID.
63 } 65 }
64 scoped_ptr<EntryKernel> kernel(new EntryKernel()); 66 scoped_ptr<EntryKernel> kernel(new EntryKernel());
65 67
66 kernel->put(ID, id); 68 kernel->put(ID, id);
67 kernel->put(META_HANDLE, trans->directory_->NextMetahandle()); 69 kernel->put(META_HANDLE, trans->directory_->NextMetahandle());
68 kernel->mark_dirty(trans->directory_->kernel_->dirty_metahandles); 70 kernel->mark_dirty(trans->directory_->kernel_->dirty_metahandles);
71 kernel->put(SERVER_ORDINAL_IN_PARENT, NodeOrdinal::CreateInitialOrdinal());
69 kernel->put(IS_DEL, true); 72 kernel->put(IS_DEL, true);
70 // We match the database defaults here 73 // We match the database defaults here
71 kernel->put(BASE_VERSION, CHANGES_VERSION); 74 kernel->put(BASE_VERSION, CHANGES_VERSION);
72 if (!trans->directory()->InsertEntry(trans, kernel.get())) { 75 if (!trans->directory()->InsertEntry(trans, kernel.get())) {
73 return; // Failed inserting. 76 return; // Failed inserting.
74 } 77 }
75 trans->SaveOriginal(kernel.get()); 78 trans->SaveOriginal(kernel.get());
76 79
77 kernel_ = kernel.release(); 80 kernel_ = kernel.release();
78 } 81 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 if (!is_del) 137 if (!is_del)
135 // Restores position to the 0th index. 138 // Restores position to the 0th index.
136 if (!PutPredecessor(Id())) { 139 if (!PutPredecessor(Id())) {
137 // TODO(lipalani) : Propagate the error to caller. crbug.com/100444. 140 // TODO(lipalani) : Propagate the error to caller. crbug.com/100444.
138 NOTREACHED(); 141 NOTREACHED();
139 } 142 }
140 143
141 return true; 144 return true;
142 } 145 }
143 146
144 bool MutableEntry::Put(Int64Field field, const int64& value) { 147 bool MutableEntry::Put(OrdinalField field, const NodeOrdinal& value) {
145 DCHECK(kernel_); 148 DCHECK(kernel_);
akalin 2012/10/05 22:40:27 DCHECK here that |value| is a valid ordinal
vishwath 2012/10/08 20:17:49 Done.
146 write_transaction_->SaveOriginal(kernel_); 149 write_transaction_->SaveOriginal(kernel_);
147 if (kernel_->ref(field) != value) { 150 if(!kernel_->ref(field).Equals(value)) {
148 ScopedKernelLock lock(dir()); 151 ScopedKernelLock lock(dir());
149 if (SERVER_POSITION_IN_PARENT == field) { 152 if (SERVER_ORDINAL_IN_PARENT == field) {
150 ScopedIndexUpdater<ParentIdAndHandleIndexer> updater(lock, kernel_, 153 ScopedIndexUpdater<ParentIdAndHandleIndexer> updater(
151 dir()->kernel_->parent_id_child_index); 154 lock, kernel_, dir()->kernel_->parent_id_child_index);
152 kernel_->put(field, value); 155 kernel_->put(field, value);
153 } else { 156 } else {
154 kernel_->put(field, value); 157 kernel_->put(field, value);
155 } 158 }
156 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles); 159 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles);
157 } 160 }
158 return true; 161 return true;
159 } 162 }
160 163
164 bool MutableEntry::Put(Int64Field field, const int64& value) {
165 DCHECK(kernel_);
166 write_transaction_->SaveOriginal(kernel_);
167 if (kernel_->ref(field) != value) {
168 ScopedKernelLock lock(dir());
169 kernel_->put(field, value);
170 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles);
171 }
172 return true;
173 }
174
161 bool MutableEntry::Put(TimeField field, const base::Time& value) { 175 bool MutableEntry::Put(TimeField field, const base::Time& value) {
162 DCHECK(kernel_); 176 DCHECK(kernel_);
163 write_transaction_->SaveOriginal(kernel_); 177 write_transaction_->SaveOriginal(kernel_);
164 if (kernel_->ref(field) != value) { 178 if (kernel_->ref(field) != value) {
165 kernel_->put(field, value); 179 kernel_->put(field, value);
166 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles); 180 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles);
167 } 181 }
168 return true; 182 return true;
169 } 183 }
170 184
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 DCHECK_NE(static_cast<MutableEntry*>(NULL), e); 425 DCHECK_NE(static_cast<MutableEntry*>(NULL), e);
412 DCHECK(!e->IsRoot()) << "We shouldn't mark a permanent object for syncing."; 426 DCHECK(!e->IsRoot()) << "We shouldn't mark a permanent object for syncing.";
413 if (!(e->Put(IS_UNSYNCED, true))) 427 if (!(e->Put(IS_UNSYNCED, true)))
414 return false; 428 return false;
415 e->Put(SYNCING, false); 429 e->Put(SYNCING, false);
416 return true; 430 return true;
417 } 431 }
418 432
419 } // namespace syncable 433 } // namespace syncable
420 } // namespace syncer 434 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698