OLD | NEW |
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 Loading... |
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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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(Int64Field field, const int64& value) { |
145 DCHECK(kernel_); | 148 DCHECK(kernel_); |
146 write_transaction_->SaveOriginal(kernel_); | 149 write_transaction_->SaveOriginal(kernel_); |
147 if (kernel_->ref(field) != value) { | 150 if (kernel_->ref(field) != value) { |
148 ScopedKernelLock lock(dir()); | 151 ScopedKernelLock lock(dir()); |
149 if (SERVER_POSITION_IN_PARENT == field) { | 152 kernel_->put(field, value); |
150 ScopedIndexUpdater<ParentIdAndHandleIndexer> updater(lock, kernel_, | |
151 dir()->kernel_->parent_id_child_index); | |
152 kernel_->put(field, value); | |
153 } else { | |
154 kernel_->put(field, value); | |
155 } | |
156 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles); | 153 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles); |
157 } | 154 } |
158 return true; | 155 return true; |
159 } | 156 } |
160 | 157 |
161 bool MutableEntry::Put(TimeField field, const base::Time& value) { | 158 bool MutableEntry::Put(TimeField field, const base::Time& value) { |
162 DCHECK(kernel_); | 159 DCHECK(kernel_); |
163 write_transaction_->SaveOriginal(kernel_); | 160 write_transaction_->SaveOriginal(kernel_); |
164 if (kernel_->ref(field) != value) { | 161 if (kernel_->ref(field) != value) { |
165 kernel_->put(field, value); | 162 kernel_->put(field, value); |
(...skipping 17 matching lines...) Expand all Loading... |
183 NOTREACHED(); | 180 NOTREACHED(); |
184 } | 181 } |
185 } else { | 182 } else { |
186 kernel_->put(field, value); | 183 kernel_->put(field, value); |
187 } | 184 } |
188 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles); | 185 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles); |
189 } | 186 } |
190 return true; | 187 return true; |
191 } | 188 } |
192 | 189 |
| 190 bool MutableEntry::Put(OrdinalField field, const NodeOrdinal& value) { |
| 191 DCHECK(kernel_); |
| 192 DCHECK(value.IsValid()); |
| 193 write_transaction_->SaveOriginal(kernel_); |
| 194 if(!kernel_->ref(field).Equals(value)) { |
| 195 ScopedKernelLock lock(dir()); |
| 196 if (SERVER_ORDINAL_IN_PARENT == field) { |
| 197 ScopedIndexUpdater<ParentIdAndHandleIndexer> updater( |
| 198 lock, kernel_, dir()->kernel_->parent_id_child_index); |
| 199 kernel_->put(field, value); |
| 200 } else { |
| 201 kernel_->put(field, value); |
| 202 } |
| 203 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles); |
| 204 } |
| 205 return true; |
| 206 } |
| 207 |
193 void MutableEntry::PutParentIdPropertyOnly(const Id& parent_id) { | 208 void MutableEntry::PutParentIdPropertyOnly(const Id& parent_id) { |
194 write_transaction_->SaveOriginal(kernel_); | 209 write_transaction_->SaveOriginal(kernel_); |
195 dir()->ReindexParentId(write_transaction(), kernel_, parent_id); | 210 dir()->ReindexParentId(write_transaction(), kernel_, parent_id); |
196 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles); | 211 kernel_->mark_dirty(dir()->kernel_->dirty_metahandles); |
197 } | 212 } |
198 | 213 |
199 bool MutableEntry::Put(BaseVersion field, int64 value) { | 214 bool MutableEntry::Put(BaseVersion field, int64 value) { |
200 DCHECK(kernel_); | 215 DCHECK(kernel_); |
201 write_transaction_->SaveOriginal(kernel_); | 216 write_transaction_->SaveOriginal(kernel_); |
202 if (kernel_->ref(field) != value) { | 217 if (kernel_->ref(field) != value) { |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 DCHECK_NE(static_cast<MutableEntry*>(NULL), e); | 426 DCHECK_NE(static_cast<MutableEntry*>(NULL), e); |
412 DCHECK(!e->IsRoot()) << "We shouldn't mark a permanent object for syncing."; | 427 DCHECK(!e->IsRoot()) << "We shouldn't mark a permanent object for syncing."; |
413 if (!(e->Put(IS_UNSYNCED, true))) | 428 if (!(e->Put(IS_UNSYNCED, true))) |
414 return false; | 429 return false; |
415 e->Put(SYNCING, false); | 430 e->Put(SYNCING, false); |
416 return true; | 431 return true; |
417 } | 432 } |
418 | 433 |
419 } // namespace syncable | 434 } // namespace syncable |
420 } // namespace syncer | 435 } // namespace syncer |
OLD | NEW |