| 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 |