| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/model_neutral_mutable_entry.h" | 5 #include "sync/syncable/model_neutral_mutable_entry.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "sync/internal_api/public/base/unique_position.h" | 9 #include "sync/internal_api/public/base/unique_position.h" |
| 10 #include "sync/syncable/directory.h" | 10 #include "sync/syncable/directory.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 : Entry(trans), base_write_transaction_(trans) { | 25 : Entry(trans), base_write_transaction_(trans) { |
| 26 Entry same_id(trans, GET_BY_ID, id); | 26 Entry same_id(trans, GET_BY_ID, id); |
| 27 kernel_ = NULL; | 27 kernel_ = NULL; |
| 28 if (same_id.good()) { | 28 if (same_id.good()) { |
| 29 return; // already have an item with this ID. | 29 return; // already have an item with this ID. |
| 30 } | 30 } |
| 31 scoped_ptr<EntryKernel> kernel(new EntryKernel()); | 31 scoped_ptr<EntryKernel> kernel(new EntryKernel()); |
| 32 | 32 |
| 33 kernel->put(ID, id); | 33 kernel->put(ID, id); |
| 34 kernel->put(META_HANDLE, trans->directory()->NextMetahandle()); | 34 kernel->put(META_HANDLE, trans->directory()->NextMetahandle()); |
| 35 kernel->mark_dirty(&trans->directory()->kernel_->dirty_metahandles); | 35 kernel->mark_dirty(&trans->directory()->kernel()->dirty_metahandles); |
| 36 kernel->put(IS_DEL, true); | 36 kernel->put(IS_DEL, true); |
| 37 // We match the database defaults here | 37 // We match the database defaults here |
| 38 kernel->put(BASE_VERSION, CHANGES_VERSION); | 38 kernel->put(BASE_VERSION, CHANGES_VERSION); |
| 39 if (!trans->directory()->InsertEntry(trans, kernel.get())) { | 39 if (!trans->directory()->InsertEntry(trans, kernel.get())) { |
| 40 return; // Failed inserting. | 40 return; // Failed inserting. |
| 41 } | 41 } |
| 42 trans->TrackChangesTo(kernel.get()); | 42 trans->TrackChangesTo(kernel.get()); |
| 43 | 43 |
| 44 kernel_ = kernel.release(); | 44 kernel_ = kernel.release(); |
| 45 } | 45 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 62 kernel->put(SPECIFICS, specifics); | 62 kernel->put(SPECIFICS, specifics); |
| 63 | 63 |
| 64 kernel->put(ID, | 64 kernel->put(ID, |
| 65 syncable::Id::CreateFromClientString(ModelTypeToString(type))); | 65 syncable::Id::CreateFromClientString(ModelTypeToString(type))); |
| 66 kernel->put(META_HANDLE, trans->directory()->NextMetahandle()); | 66 kernel->put(META_HANDLE, trans->directory()->NextMetahandle()); |
| 67 kernel->put(PARENT_ID, syncable::Id::GetRoot()); | 67 kernel->put(PARENT_ID, syncable::Id::GetRoot()); |
| 68 kernel->put(BASE_VERSION, CHANGES_VERSION); | 68 kernel->put(BASE_VERSION, CHANGES_VERSION); |
| 69 kernel->put(NON_UNIQUE_NAME, ModelTypeToString(type)); | 69 kernel->put(NON_UNIQUE_NAME, ModelTypeToString(type)); |
| 70 kernel->put(IS_DIR, true); | 70 kernel->put(IS_DIR, true); |
| 71 | 71 |
| 72 kernel->mark_dirty(&trans->directory()->kernel_->dirty_metahandles); | 72 kernel->mark_dirty(&trans->directory()->kernel()->dirty_metahandles); |
| 73 | 73 |
| 74 if (!trans->directory()->InsertEntry(trans, kernel.get())) { | 74 if (!trans->directory()->InsertEntry(trans, kernel.get())) { |
| 75 return; // Failed inserting. | 75 return; // Failed inserting. |
| 76 } | 76 } |
| 77 | 77 |
| 78 trans->TrackChangesTo(kernel.get()); | 78 trans->TrackChangesTo(kernel.get()); |
| 79 | 79 |
| 80 kernel_ = kernel.release(); | 80 kernel_ = kernel.release(); |
| 81 } | 81 } |
| 82 | 82 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 98 ModelNeutralMutableEntry::ModelNeutralMutableEntry( | 98 ModelNeutralMutableEntry::ModelNeutralMutableEntry( |
| 99 BaseWriteTransaction* trans, GetTypeRoot, ModelType type) | 99 BaseWriteTransaction* trans, GetTypeRoot, ModelType type) |
| 100 : Entry(trans, GET_TYPE_ROOT, type), base_write_transaction_(trans) { | 100 : Entry(trans, GET_TYPE_ROOT, type), base_write_transaction_(trans) { |
| 101 } | 101 } |
| 102 | 102 |
| 103 void ModelNeutralMutableEntry::PutBaseVersion(int64 value) { | 103 void ModelNeutralMutableEntry::PutBaseVersion(int64 value) { |
| 104 DCHECK(kernel_); | 104 DCHECK(kernel_); |
| 105 base_write_transaction_->TrackChangesTo(kernel_); | 105 base_write_transaction_->TrackChangesTo(kernel_); |
| 106 if (kernel_->ref(BASE_VERSION) != value) { | 106 if (kernel_->ref(BASE_VERSION) != value) { |
| 107 kernel_->put(BASE_VERSION, value); | 107 kernel_->put(BASE_VERSION, value); |
| 108 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 108 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 109 } | 109 } |
| 110 } | 110 } |
| 111 | 111 |
| 112 void ModelNeutralMutableEntry::PutServerVersion(int64 value) { | 112 void ModelNeutralMutableEntry::PutServerVersion(int64 value) { |
| 113 DCHECK(kernel_); | 113 DCHECK(kernel_); |
| 114 base_write_transaction_->TrackChangesTo(kernel_); | 114 base_write_transaction_->TrackChangesTo(kernel_); |
| 115 if (kernel_->ref(SERVER_VERSION) != value) { | 115 if (kernel_->ref(SERVER_VERSION) != value) { |
| 116 ScopedKernelLock lock(dir()); | 116 ScopedKernelLock lock(dir()); |
| 117 kernel_->put(SERVER_VERSION, value); | 117 kernel_->put(SERVER_VERSION, value); |
| 118 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 118 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 119 } | 119 } |
| 120 } | 120 } |
| 121 | 121 |
| 122 void ModelNeutralMutableEntry::PutServerMtime(base::Time value) { | 122 void ModelNeutralMutableEntry::PutServerMtime(base::Time value) { |
| 123 DCHECK(kernel_); | 123 DCHECK(kernel_); |
| 124 base_write_transaction_->TrackChangesTo(kernel_); | 124 base_write_transaction_->TrackChangesTo(kernel_); |
| 125 if (kernel_->ref(SERVER_MTIME) != value) { | 125 if (kernel_->ref(SERVER_MTIME) != value) { |
| 126 kernel_->put(SERVER_MTIME, value); | 126 kernel_->put(SERVER_MTIME, value); |
| 127 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 127 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 128 } | 128 } |
| 129 } | 129 } |
| 130 | 130 |
| 131 void ModelNeutralMutableEntry::PutServerCtime(base::Time value) { | 131 void ModelNeutralMutableEntry::PutServerCtime(base::Time value) { |
| 132 DCHECK(kernel_); | 132 DCHECK(kernel_); |
| 133 base_write_transaction_->TrackChangesTo(kernel_); | 133 base_write_transaction_->TrackChangesTo(kernel_); |
| 134 if (kernel_->ref(SERVER_CTIME) != value) { | 134 if (kernel_->ref(SERVER_CTIME) != value) { |
| 135 kernel_->put(SERVER_CTIME, value); | 135 kernel_->put(SERVER_CTIME, value); |
| 136 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 136 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 137 } | 137 } |
| 138 } | 138 } |
| 139 | 139 |
| 140 bool ModelNeutralMutableEntry::PutId(const Id& value) { | 140 bool ModelNeutralMutableEntry::PutId(const Id& value) { |
| 141 DCHECK(kernel_); | 141 DCHECK(kernel_); |
| 142 base_write_transaction_->TrackChangesTo(kernel_); | 142 base_write_transaction_->TrackChangesTo(kernel_); |
| 143 if (kernel_->ref(ID) != value) { | 143 if (kernel_->ref(ID) != value) { |
| 144 if (!dir()->ReindexId(base_write_transaction(), kernel_, value)) | 144 if (!dir()->ReindexId(base_write_transaction(), kernel_, value)) |
| 145 return false; | 145 return false; |
| 146 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 146 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 147 } | 147 } |
| 148 return true; | 148 return true; |
| 149 } | 149 } |
| 150 | 150 |
| 151 void ModelNeutralMutableEntry::PutServerParentId(const Id& value) { | 151 void ModelNeutralMutableEntry::PutServerParentId(const Id& value) { |
| 152 DCHECK(kernel_); | 152 DCHECK(kernel_); |
| 153 base_write_transaction_->TrackChangesTo(kernel_); | 153 base_write_transaction_->TrackChangesTo(kernel_); |
| 154 | 154 |
| 155 if (kernel_->ref(SERVER_PARENT_ID) != value) { | 155 if (kernel_->ref(SERVER_PARENT_ID) != value) { |
| 156 kernel_->put(SERVER_PARENT_ID, value); | 156 kernel_->put(SERVER_PARENT_ID, value); |
| 157 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 157 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 158 } | 158 } |
| 159 } | 159 } |
| 160 | 160 |
| 161 bool ModelNeutralMutableEntry::PutIsUnsynced(bool value) { | 161 bool ModelNeutralMutableEntry::PutIsUnsynced(bool value) { |
| 162 DCHECK(kernel_); | 162 DCHECK(kernel_); |
| 163 base_write_transaction_->TrackChangesTo(kernel_); | 163 base_write_transaction_->TrackChangesTo(kernel_); |
| 164 if (kernel_->ref(IS_UNSYNCED) != value) { | 164 if (kernel_->ref(IS_UNSYNCED) != value) { |
| 165 MetahandleSet* index = &dir()->kernel_->unsynced_metahandles; | 165 MetahandleSet* index = &dir()->kernel()->unsynced_metahandles; |
| 166 | 166 |
| 167 ScopedKernelLock lock(dir()); | 167 ScopedKernelLock lock(dir()); |
| 168 if (value) { | 168 if (value) { |
| 169 if (!SyncAssert(index->insert(kernel_->ref(META_HANDLE)).second, | 169 if (!SyncAssert(index->insert(kernel_->ref(META_HANDLE)).second, |
| 170 FROM_HERE, | 170 FROM_HERE, |
| 171 "Could not insert", | 171 "Could not insert", |
| 172 base_write_transaction())) { | 172 base_write_transaction())) { |
| 173 return false; | 173 return false; |
| 174 } | 174 } |
| 175 } else { | 175 } else { |
| 176 if (!SyncAssert(1U == index->erase(kernel_->ref(META_HANDLE)), | 176 if (!SyncAssert(1U == index->erase(kernel_->ref(META_HANDLE)), |
| 177 FROM_HERE, | 177 FROM_HERE, |
| 178 "Entry Not succesfully erased", | 178 "Entry Not succesfully erased", |
| 179 base_write_transaction())) { | 179 base_write_transaction())) { |
| 180 return false; | 180 return false; |
| 181 } | 181 } |
| 182 } | 182 } |
| 183 kernel_->put(IS_UNSYNCED, value); | 183 kernel_->put(IS_UNSYNCED, value); |
| 184 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 184 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 185 } | 185 } |
| 186 return true; | 186 return true; |
| 187 } | 187 } |
| 188 | 188 |
| 189 bool ModelNeutralMutableEntry::PutIsUnappliedUpdate(bool value) { | 189 bool ModelNeutralMutableEntry::PutIsUnappliedUpdate(bool value) { |
| 190 DCHECK(kernel_); | 190 DCHECK(kernel_); |
| 191 base_write_transaction_->TrackChangesTo(kernel_); | 191 base_write_transaction_->TrackChangesTo(kernel_); |
| 192 if (kernel_->ref(IS_UNAPPLIED_UPDATE) != value) { | 192 if (kernel_->ref(IS_UNAPPLIED_UPDATE) != value) { |
| 193 // Use kernel_->GetServerModelType() instead of | 193 // Use kernel_->GetServerModelType() instead of |
| 194 // GetServerModelType() as we may trigger some DCHECKs in the | 194 // GetServerModelType() as we may trigger some DCHECKs in the |
| 195 // latter. | 195 // latter. |
| 196 MetahandleSet* index = &dir()->kernel_->unapplied_update_metahandles[ | 196 MetahandleSet* index = &dir()->kernel()->unapplied_update_metahandles[ |
| 197 kernel_->GetServerModelType()]; | 197 kernel_->GetServerModelType()]; |
| 198 | 198 |
| 199 ScopedKernelLock lock(dir()); | 199 ScopedKernelLock lock(dir()); |
| 200 if (value) { | 200 if (value) { |
| 201 if (!SyncAssert(index->insert(kernel_->ref(META_HANDLE)).second, | 201 if (!SyncAssert(index->insert(kernel_->ref(META_HANDLE)).second, |
| 202 FROM_HERE, | 202 FROM_HERE, |
| 203 "Could not insert", | 203 "Could not insert", |
| 204 base_write_transaction())) { | 204 base_write_transaction())) { |
| 205 return false; | 205 return false; |
| 206 } | 206 } |
| 207 } else { | 207 } else { |
| 208 if (!SyncAssert(1U == index->erase(kernel_->ref(META_HANDLE)), | 208 if (!SyncAssert(1U == index->erase(kernel_->ref(META_HANDLE)), |
| 209 FROM_HERE, | 209 FROM_HERE, |
| 210 "Entry Not succesfully erased", | 210 "Entry Not succesfully erased", |
| 211 base_write_transaction())) { | 211 base_write_transaction())) { |
| 212 return false; | 212 return false; |
| 213 } | 213 } |
| 214 } | 214 } |
| 215 kernel_->put(IS_UNAPPLIED_UPDATE, value); | 215 kernel_->put(IS_UNAPPLIED_UPDATE, value); |
| 216 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 216 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 217 } | 217 } |
| 218 return true; | 218 return true; |
| 219 } | 219 } |
| 220 | 220 |
| 221 void ModelNeutralMutableEntry::PutServerIsDir(bool value) { | 221 void ModelNeutralMutableEntry::PutServerIsDir(bool value) { |
| 222 DCHECK(kernel_); | 222 DCHECK(kernel_); |
| 223 base_write_transaction_->TrackChangesTo(kernel_); | 223 base_write_transaction_->TrackChangesTo(kernel_); |
| 224 bool old_value = kernel_->ref(SERVER_IS_DIR); | 224 bool old_value = kernel_->ref(SERVER_IS_DIR); |
| 225 if (old_value != value) { | 225 if (old_value != value) { |
| 226 kernel_->put(SERVER_IS_DIR, value); | 226 kernel_->put(SERVER_IS_DIR, value); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 246 base_write_transaction(), old_value, *kernel_); | 246 base_write_transaction(), old_value, *kernel_); |
| 247 } | 247 } |
| 248 | 248 |
| 249 void ModelNeutralMutableEntry::PutServerNonUniqueName( | 249 void ModelNeutralMutableEntry::PutServerNonUniqueName( |
| 250 const std::string& value) { | 250 const std::string& value) { |
| 251 DCHECK(kernel_); | 251 DCHECK(kernel_); |
| 252 base_write_transaction_->TrackChangesTo(kernel_); | 252 base_write_transaction_->TrackChangesTo(kernel_); |
| 253 | 253 |
| 254 if (kernel_->ref(SERVER_NON_UNIQUE_NAME) != value) { | 254 if (kernel_->ref(SERVER_NON_UNIQUE_NAME) != value) { |
| 255 kernel_->put(SERVER_NON_UNIQUE_NAME, value); | 255 kernel_->put(SERVER_NON_UNIQUE_NAME, value); |
| 256 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 256 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 257 } | 257 } |
| 258 } | 258 } |
| 259 | 259 |
| 260 bool ModelNeutralMutableEntry::PutUniqueServerTag(const string& new_tag) { | 260 bool ModelNeutralMutableEntry::PutUniqueServerTag(const string& new_tag) { |
| 261 if (new_tag == kernel_->ref(UNIQUE_SERVER_TAG)) { | 261 if (new_tag == kernel_->ref(UNIQUE_SERVER_TAG)) { |
| 262 return true; | 262 return true; |
| 263 } | 263 } |
| 264 | 264 |
| 265 base_write_transaction_->TrackChangesTo(kernel_); | 265 base_write_transaction_->TrackChangesTo(kernel_); |
| 266 ScopedKernelLock lock(dir()); | 266 ScopedKernelLock lock(dir()); |
| 267 // Make sure your new value is not in there already. | 267 // Make sure your new value is not in there already. |
| 268 if (dir()->kernel_->server_tags_map.find(new_tag) != | 268 if (dir()->kernel()->server_tags_map.find(new_tag) != |
| 269 dir()->kernel_->server_tags_map.end()) { | 269 dir()->kernel()->server_tags_map.end()) { |
| 270 DVLOG(1) << "Detected duplicate server tag"; | 270 DVLOG(1) << "Detected duplicate server tag"; |
| 271 return false; | 271 return false; |
| 272 } | 272 } |
| 273 dir()->kernel_->server_tags_map.erase( | 273 dir()->kernel()->server_tags_map.erase( |
| 274 kernel_->ref(UNIQUE_SERVER_TAG)); | 274 kernel_->ref(UNIQUE_SERVER_TAG)); |
| 275 kernel_->put(UNIQUE_SERVER_TAG, new_tag); | 275 kernel_->put(UNIQUE_SERVER_TAG, new_tag); |
| 276 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 276 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 277 if (!new_tag.empty()) { | 277 if (!new_tag.empty()) { |
| 278 dir()->kernel_->server_tags_map[new_tag] = kernel_; | 278 dir()->kernel()->server_tags_map[new_tag] = kernel_; |
| 279 } | 279 } |
| 280 | 280 |
| 281 return true; | 281 return true; |
| 282 } | 282 } |
| 283 | 283 |
| 284 bool ModelNeutralMutableEntry::PutUniqueClientTag(const string& new_tag) { | 284 bool ModelNeutralMutableEntry::PutUniqueClientTag(const string& new_tag) { |
| 285 if (new_tag == kernel_->ref(UNIQUE_CLIENT_TAG)) { | 285 if (new_tag == kernel_->ref(UNIQUE_CLIENT_TAG)) { |
| 286 return true; | 286 return true; |
| 287 } | 287 } |
| 288 | 288 |
| 289 base_write_transaction_->TrackChangesTo(kernel_); | 289 base_write_transaction_->TrackChangesTo(kernel_); |
| 290 ScopedKernelLock lock(dir()); | 290 ScopedKernelLock lock(dir()); |
| 291 // Make sure your new value is not in there already. | 291 // Make sure your new value is not in there already. |
| 292 if (dir()->kernel_->client_tags_map.find(new_tag) != | 292 if (dir()->kernel()->client_tags_map.find(new_tag) != |
| 293 dir()->kernel_->client_tags_map.end()) { | 293 dir()->kernel()->client_tags_map.end()) { |
| 294 DVLOG(1) << "Detected duplicate client tag"; | 294 DVLOG(1) << "Detected duplicate client tag"; |
| 295 return false; | 295 return false; |
| 296 } | 296 } |
| 297 dir()->kernel_->client_tags_map.erase( | 297 dir()->kernel()->client_tags_map.erase( |
| 298 kernel_->ref(UNIQUE_CLIENT_TAG)); | 298 kernel_->ref(UNIQUE_CLIENT_TAG)); |
| 299 kernel_->put(UNIQUE_CLIENT_TAG, new_tag); | 299 kernel_->put(UNIQUE_CLIENT_TAG, new_tag); |
| 300 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 300 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 301 if (!new_tag.empty()) { | 301 if (!new_tag.empty()) { |
| 302 dir()->kernel_->client_tags_map[new_tag] = kernel_; | 302 dir()->kernel()->client_tags_map[new_tag] = kernel_; |
| 303 } | 303 } |
| 304 | 304 |
| 305 return true; | 305 return true; |
| 306 } | 306 } |
| 307 | 307 |
| 308 void ModelNeutralMutableEntry::PutUniqueBookmarkTag(const std::string& tag) { | 308 void ModelNeutralMutableEntry::PutUniqueBookmarkTag(const std::string& tag) { |
| 309 // This unique tag will eventually be used as the unique suffix when adjusting | 309 // This unique tag will eventually be used as the unique suffix when adjusting |
| 310 // this bookmark's position. Let's make sure it's a valid suffix. | 310 // this bookmark's position. Let's make sure it's a valid suffix. |
| 311 if (!UniquePosition::IsValidSuffix(tag)) { | 311 if (!UniquePosition::IsValidSuffix(tag)) { |
| 312 NOTREACHED(); | 312 NOTREACHED(); |
| 313 return; | 313 return; |
| 314 } | 314 } |
| 315 | 315 |
| 316 if (!kernel_->ref(UNIQUE_BOOKMARK_TAG).empty() && | 316 if (!kernel_->ref(UNIQUE_BOOKMARK_TAG).empty() && |
| 317 tag != kernel_->ref(UNIQUE_BOOKMARK_TAG)) { | 317 tag != kernel_->ref(UNIQUE_BOOKMARK_TAG)) { |
| 318 // There is only one scenario where our tag is expected to change. That | 318 // There is only one scenario where our tag is expected to change. That |
| 319 // scenario occurs when our current tag is a non-correct tag assigned during | 319 // scenario occurs when our current tag is a non-correct tag assigned during |
| 320 // the UniquePosition migration. | 320 // the UniquePosition migration. |
| 321 std::string migration_generated_tag = | 321 std::string migration_generated_tag = |
| 322 GenerateSyncableBookmarkHash(std::string(), | 322 GenerateSyncableBookmarkHash(std::string(), |
| 323 kernel_->ref(ID).GetServerId()); | 323 kernel_->ref(ID).GetServerId()); |
| 324 DCHECK_EQ(migration_generated_tag, kernel_->ref(UNIQUE_BOOKMARK_TAG)); | 324 DCHECK_EQ(migration_generated_tag, kernel_->ref(UNIQUE_BOOKMARK_TAG)); |
| 325 } | 325 } |
| 326 | 326 |
| 327 kernel_->put(UNIQUE_BOOKMARK_TAG, tag); | 327 kernel_->put(UNIQUE_BOOKMARK_TAG, tag); |
| 328 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 328 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 329 } | 329 } |
| 330 | 330 |
| 331 void ModelNeutralMutableEntry::PutServerSpecifics( | 331 void ModelNeutralMutableEntry::PutServerSpecifics( |
| 332 const sync_pb::EntitySpecifics& value) { | 332 const sync_pb::EntitySpecifics& value) { |
| 333 DCHECK(kernel_); | 333 DCHECK(kernel_); |
| 334 CHECK(!value.password().has_client_only_encrypted_data()); | 334 CHECK(!value.password().has_client_only_encrypted_data()); |
| 335 base_write_transaction_->TrackChangesTo(kernel_); | 335 base_write_transaction_->TrackChangesTo(kernel_); |
| 336 // TODO(ncarter): This is unfortunately heavyweight. Can we do | 336 // TODO(ncarter): This is unfortunately heavyweight. Can we do |
| 337 // better? | 337 // better? |
| 338 if (kernel_->ref(SERVER_SPECIFICS).SerializeAsString() != | 338 if (kernel_->ref(SERVER_SPECIFICS).SerializeAsString() != |
| 339 value.SerializeAsString()) { | 339 value.SerializeAsString()) { |
| 340 if (kernel_->ref(IS_UNAPPLIED_UPDATE)) { | 340 if (kernel_->ref(IS_UNAPPLIED_UPDATE)) { |
| 341 // Remove ourselves from unapplied_update_metahandles with our | 341 // Remove ourselves from unapplied_update_metahandles with our |
| 342 // old server type. | 342 // old server type. |
| 343 const ModelType old_server_type = kernel_->GetServerModelType(); | 343 const ModelType old_server_type = kernel_->GetServerModelType(); |
| 344 const int64 metahandle = kernel_->ref(META_HANDLE); | 344 const int64 metahandle = kernel_->ref(META_HANDLE); |
| 345 size_t erase_count = | 345 size_t erase_count = |
| 346 dir()->kernel_->unapplied_update_metahandles[old_server_type] | 346 dir()->kernel()->unapplied_update_metahandles[old_server_type] |
| 347 .erase(metahandle); | 347 .erase(metahandle); |
| 348 DCHECK_EQ(erase_count, 1u); | 348 DCHECK_EQ(erase_count, 1u); |
| 349 } | 349 } |
| 350 | 350 |
| 351 kernel_->put(SERVER_SPECIFICS, value); | 351 kernel_->put(SERVER_SPECIFICS, value); |
| 352 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 352 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 353 | 353 |
| 354 if (kernel_->ref(IS_UNAPPLIED_UPDATE)) { | 354 if (kernel_->ref(IS_UNAPPLIED_UPDATE)) { |
| 355 // Add ourselves back into unapplied_update_metahandles with our | 355 // Add ourselves back into unapplied_update_metahandles with our |
| 356 // new server type. | 356 // new server type. |
| 357 const ModelType new_server_type = kernel_->GetServerModelType(); | 357 const ModelType new_server_type = kernel_->GetServerModelType(); |
| 358 const int64 metahandle = kernel_->ref(META_HANDLE); | 358 const int64 metahandle = kernel_->ref(META_HANDLE); |
| 359 dir()->kernel_->unapplied_update_metahandles[new_server_type] | 359 dir()->kernel()->unapplied_update_metahandles[new_server_type] |
| 360 .insert(metahandle); | 360 .insert(metahandle); |
| 361 } | 361 } |
| 362 } | 362 } |
| 363 } | 363 } |
| 364 | 364 |
| 365 void ModelNeutralMutableEntry::PutBaseServerSpecifics( | 365 void ModelNeutralMutableEntry::PutBaseServerSpecifics( |
| 366 const sync_pb::EntitySpecifics& value) { | 366 const sync_pb::EntitySpecifics& value) { |
| 367 DCHECK(kernel_); | 367 DCHECK(kernel_); |
| 368 CHECK(!value.password().has_client_only_encrypted_data()); | 368 CHECK(!value.password().has_client_only_encrypted_data()); |
| 369 base_write_transaction_->TrackChangesTo(kernel_); | 369 base_write_transaction_->TrackChangesTo(kernel_); |
| 370 // TODO(ncarter): This is unfortunately heavyweight. Can we do | 370 // TODO(ncarter): This is unfortunately heavyweight. Can we do |
| 371 // better? | 371 // better? |
| 372 if (kernel_->ref(BASE_SERVER_SPECIFICS).SerializeAsString() | 372 if (kernel_->ref(BASE_SERVER_SPECIFICS).SerializeAsString() |
| 373 != value.SerializeAsString()) { | 373 != value.SerializeAsString()) { |
| 374 kernel_->put(BASE_SERVER_SPECIFICS, value); | 374 kernel_->put(BASE_SERVER_SPECIFICS, value); |
| 375 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 375 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 376 } | 376 } |
| 377 } | 377 } |
| 378 | 378 |
| 379 void ModelNeutralMutableEntry::PutServerUniquePosition( | 379 void ModelNeutralMutableEntry::PutServerUniquePosition( |
| 380 const UniquePosition& value) { | 380 const UniquePosition& value) { |
| 381 DCHECK(kernel_); | 381 DCHECK(kernel_); |
| 382 base_write_transaction_->TrackChangesTo(kernel_); | 382 base_write_transaction_->TrackChangesTo(kernel_); |
| 383 if(!kernel_->ref(SERVER_UNIQUE_POSITION).Equals(value)) { | 383 if(!kernel_->ref(SERVER_UNIQUE_POSITION).Equals(value)) { |
| 384 // We should never overwrite a valid position with an invalid one. | 384 // We should never overwrite a valid position with an invalid one. |
| 385 DCHECK(value.IsValid()); | 385 DCHECK(value.IsValid()); |
| 386 ScopedKernelLock lock(dir()); | 386 ScopedKernelLock lock(dir()); |
| 387 kernel_->put(SERVER_UNIQUE_POSITION, value); | 387 kernel_->put(SERVER_UNIQUE_POSITION, value); |
| 388 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 388 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 389 } | 389 } |
| 390 } | 390 } |
| 391 | 391 |
| 392 void ModelNeutralMutableEntry::PutServerAttachmentMetadata( | 392 void ModelNeutralMutableEntry::PutServerAttachmentMetadata( |
| 393 const sync_pb::AttachmentMetadata& value) { | 393 const sync_pb::AttachmentMetadata& value) { |
| 394 DCHECK(kernel_); | 394 DCHECK(kernel_); |
| 395 base_write_transaction_->TrackChangesTo(kernel_); | 395 base_write_transaction_->TrackChangesTo(kernel_); |
| 396 | 396 |
| 397 if (kernel_->ref(SERVER_ATTACHMENT_METADATA).SerializeAsString() != | 397 if (kernel_->ref(SERVER_ATTACHMENT_METADATA).SerializeAsString() != |
| 398 value.SerializeAsString()) { | 398 value.SerializeAsString()) { |
| 399 kernel_->put(SERVER_ATTACHMENT_METADATA, value); | 399 kernel_->put(SERVER_ATTACHMENT_METADATA, value); |
| 400 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 400 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 401 } | 401 } |
| 402 } | 402 } |
| 403 | 403 |
| 404 void ModelNeutralMutableEntry::PutSyncing(bool value) { | 404 void ModelNeutralMutableEntry::PutSyncing(bool value) { |
| 405 kernel_->put(SYNCING, value); | 405 kernel_->put(SYNCING, value); |
| 406 } | 406 } |
| 407 | 407 |
| 408 void ModelNeutralMutableEntry::PutDirtySync(bool value) { | 408 void ModelNeutralMutableEntry::PutDirtySync(bool value) { |
| 409 DCHECK(!value || GetSyncing()); | 409 DCHECK(!value || GetSyncing()); |
| 410 kernel_->put(DIRTY_SYNC, value); | 410 kernel_->put(DIRTY_SYNC, value); |
| 411 } | 411 } |
| 412 | 412 |
| 413 void ModelNeutralMutableEntry::PutParentIdPropertyOnly(const Id& parent_id) { | 413 void ModelNeutralMutableEntry::PutParentIdPropertyOnly(const Id& parent_id) { |
| 414 base_write_transaction_->TrackChangesTo(kernel_); | 414 base_write_transaction_->TrackChangesTo(kernel_); |
| 415 dir()->ReindexParentId(base_write_transaction(), kernel_, parent_id); | 415 dir()->ReindexParentId(base_write_transaction(), kernel_, parent_id); |
| 416 kernel_->mark_dirty(&dir()->kernel_->dirty_metahandles); | 416 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); |
| 417 } | 417 } |
| 418 | 418 |
| 419 void ModelNeutralMutableEntry::UpdateTransactionVersion(int64 value) { | 419 void ModelNeutralMutableEntry::UpdateTransactionVersion(int64 value) { |
| 420 ScopedKernelLock lock(dir()); | 420 ScopedKernelLock lock(dir()); |
| 421 kernel_->put(TRANSACTION_VERSION, value); | 421 kernel_->put(TRANSACTION_VERSION, value); |
| 422 kernel_->mark_dirty(&(dir()->kernel_->dirty_metahandles)); | 422 kernel_->mark_dirty(&(dir()->kernel()->dirty_metahandles)); |
| 423 } | 423 } |
| 424 | 424 |
| 425 ModelNeutralMutableEntry::ModelNeutralMutableEntry(BaseWriteTransaction* trans) | 425 ModelNeutralMutableEntry::ModelNeutralMutableEntry(BaseWriteTransaction* trans) |
| 426 : Entry(trans), base_write_transaction_(trans) {} | 426 : Entry(trans), base_write_transaction_(trans) {} |
| 427 | 427 |
| 428 MetahandleSet* ModelNeutralMutableEntry::GetDirtyIndexHelper() { | 428 MetahandleSet* ModelNeutralMutableEntry::GetDirtyIndexHelper() { |
| 429 return &dir()->kernel_->dirty_metahandles; | 429 return &dir()->kernel()->dirty_metahandles; |
| 430 } | 430 } |
| 431 | 431 |
| 432 } // namespace syncable | 432 } // namespace syncable |
| 433 | 433 |
| 434 } // namespace syncer | 434 } // namespace syncer |
| OLD | NEW |