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/directory.h" | 5 #include "sync/syncable/directory.h" |
6 | 6 |
7 #include "base/base64.h" | 7 #include "base/base64.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
314 | 314 |
315 ScopedKernelLock lock(this); | 315 ScopedKernelLock lock(this); |
316 EntryKernel* kernel = GetEntryByHandle(handle, &lock); | 316 EntryKernel* kernel = GetEntryByHandle(handle, &lock); |
317 if (!kernel) | 317 if (!kernel) |
318 return true; | 318 return true; |
319 | 319 |
320 AppendChildHandles(lock, kernel->ref(ID), result); | 320 AppendChildHandles(lock, kernel->ref(ID), result); |
321 return true; | 321 return true; |
322 } | 322 } |
323 | 323 |
324 int Directory::GetTotalNodeCount( | |
Nicolas Zea
2013/05/28 22:12:39
this seems complex enough to warrant a unit test,
rlarocque
2013/05/29 19:01:13
There are some existing tests. See SyncApiTest.Ge
| |
325 BaseTransaction* trans, | |
326 EntryKernel* kernel) const { | |
327 if (!SyncAssert(this == trans->directory(), FROM_HERE, | |
328 "Directories don't match", trans)) | |
329 return false; | |
330 | |
331 int count = 1; | |
332 std::deque<const OrderedChildSet*> child_sets; | |
333 | |
334 GetTotalNodeCountImpl(trans, kernel, &child_sets); | |
335 while (!child_sets.empty()) { | |
336 const OrderedChildSet* set = child_sets.front(); | |
337 child_sets.pop_front(); | |
338 for (OrderedChildSet::const_iterator it = set->begin(); | |
339 it != set->end(); ++it) { | |
340 count++; | |
341 GetTotalNodeCountImpl(trans, *it, &child_sets); | |
342 } | |
343 } | |
344 | |
345 return count; | |
346 } | |
347 | |
348 void Directory::GetTotalNodeCountImpl( | |
rlarocque
2013/05/21 00:09:07
This is the main reason I wanted to use recursion.
Nicolas Zea
2013/05/28 22:12:39
Seems like it's just a child grabber right? Maybe
rlarocque
2013/05/29 19:01:13
I like that general idea. I decided to go with Ge
| |
349 BaseTransaction* trans, | |
350 EntryKernel* kernel, | |
351 std::deque<const OrderedChildSet*>* child_sets) const { | |
352 if (!kernel->ref(IS_DIR)) | |
353 return; // Not a directory => no children. | |
354 | |
355 const OrderedChildSet* descendants = | |
356 kernel_->parent_child_index->GetChildren(kernel->ref(ID)); | |
357 if (!descendants) | |
358 return; // This directory has no children. | |
359 | |
360 // Add our children to the list of items to be traversed. | |
361 child_sets->push_back(descendants); | |
362 } | |
363 | |
324 EntryKernel* Directory::GetRootEntry() { | 364 EntryKernel* Directory::GetRootEntry() { |
325 return GetEntryById(Id()); | 365 return GetEntryById(Id()); |
326 } | 366 } |
327 | 367 |
328 bool Directory::InsertEntry(WriteTransaction* trans, EntryKernel* entry) { | 368 bool Directory::InsertEntry(WriteTransaction* trans, EntryKernel* entry) { |
329 ScopedKernelLock lock(this); | 369 ScopedKernelLock lock(this); |
330 return InsertEntry(trans, entry, &lock); | 370 return InsertEntry(trans, entry, &lock); |
331 } | 371 } |
332 | 372 |
333 bool Directory::InsertEntry(WriteTransaction* trans, | 373 bool Directory::InsertEntry(WriteTransaction* trans, |
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1172 result->push_back((*i)->ref(META_HANDLE)); | 1212 result->push_back((*i)->ref(META_HANDLE)); |
1173 } | 1213 } |
1174 } | 1214 } |
1175 | 1215 |
1176 ScopedKernelLock::ScopedKernelLock(const Directory* dir) | 1216 ScopedKernelLock::ScopedKernelLock(const Directory* dir) |
1177 : scoped_lock_(dir->kernel_->mutex), dir_(const_cast<Directory*>(dir)) { | 1217 : scoped_lock_(dir->kernel_->mutex), dir_(const_cast<Directory*>(dir)) { |
1178 } | 1218 } |
1179 | 1219 |
1180 } // namespace syncable | 1220 } // namespace syncable |
1181 } // namespace syncer | 1221 } // namespace syncer |
OLD | NEW |