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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 |
OLD | NEW |