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 |