Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/metadata_database.cc

Issue 349543003: [SyncFS] Use pointers to MetadataDatabaseIndexInterface (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/browser/sync_file_system/drive_backend/metadata_database.h" 5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <stack> 8 #include <stack>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/file_util.h" 12 #include "base/file_util.h"
13 #include "base/files/file_path.h" 13 #include "base/files/file_path.h"
14 #include "base/location.h" 14 #include "base/location.h"
15 #include "base/memory/scoped_vector.h" 15 #include "base/memory/scoped_vector.h"
16 #include "base/message_loop/message_loop_proxy.h" 16 #include "base/message_loop/message_loop_proxy.h"
17 #include "base/sequenced_task_runner.h" 17 #include "base/sequenced_task_runner.h"
18 #include "base/stl_util.h" 18 #include "base/stl_util.h"
19 #include "base/strings/string_number_conversions.h" 19 #include "base/strings/string_number_conversions.h"
20 #include "base/strings/string_util.h" 20 #include "base/strings/string_util.h"
21 #include "base/strings/stringprintf.h" 21 #include "base/strings/stringprintf.h"
22 #include "base/task_runner_util.h" 22 #include "base/task_runner_util.h"
23 #include "base/threading/thread_restrictions.h" 23 #include "base/threading/thread_restrictions.h"
24 #include "chrome/browser/drive/drive_api_util.h" 24 #include "chrome/browser/drive/drive_api_util.h"
25 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants. h" 25 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants. h"
26 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" 26 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h"
27 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h" 27 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
28 #include "chrome/browser/sync_file_system/drive_backend/metadata_database_index. h" 28 #include "chrome/browser/sync_file_system/drive_backend/metadata_database_index. h"
29 #include "chrome/browser/sync_file_system/drive_backend/metadata_database_index_ interface.h"
29 #include "chrome/browser/sync_file_system/drive_backend/metadata_db_migration_ut il.h" 30 #include "chrome/browser/sync_file_system/drive_backend/metadata_db_migration_ut il.h"
30 #include "chrome/browser/sync_file_system/logger.h" 31 #include "chrome/browser/sync_file_system/logger.h"
31 #include "chrome/browser/sync_file_system/syncable_file_system_util.h" 32 #include "chrome/browser/sync_file_system/syncable_file_system_util.h"
32 #include "google_apis/drive/drive_api_parser.h" 33 #include "google_apis/drive/drive_api_parser.h"
33 #include "google_apis/drive/drive_entry_kinds.h" 34 #include "google_apis/drive/drive_entry_kinds.h"
34 #include "third_party/leveldatabase/src/include/leveldb/db.h" 35 #include "third_party/leveldatabase/src/include/leveldb/db.h"
35 #include "third_party/leveldatabase/src/include/leveldb/env.h" 36 #include "third_party/leveldatabase/src/include/leveldb/env.h"
36 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" 37 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
37 #include "webkit/common/fileapi/file_system_util.h" 38 #include "webkit/common/fileapi/file_system_util.h"
38 39
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 return SYNC_STATUS_OK; 363 return SYNC_STATUS_OK;
363 } 364 }
364 365
365 bool HasInvalidTitle(const std::string& title) { 366 bool HasInvalidTitle(const std::string& title) {
366 return title.empty() || 367 return title.empty() ||
367 title.find('/') != std::string::npos || 368 title.find('/') != std::string::npos ||
368 title.find('\\') != std::string::npos; 369 title.find('\\') != std::string::npos;
369 } 370 }
370 371
371 void MarkTrackerSetDirty(const TrackerIDSet& trackers, 372 void MarkTrackerSetDirty(const TrackerIDSet& trackers,
372 MetadataDatabaseIndex* index, 373 MetadataDatabaseIndexInterface* index,
373 leveldb::WriteBatch* batch) { 374 leveldb::WriteBatch* batch) {
374 for (TrackerIDSet::const_iterator itr = trackers.begin(); 375 for (TrackerIDSet::const_iterator itr = trackers.begin();
375 itr != trackers.end(); ++itr) { 376 itr != trackers.end(); ++itr) {
376 scoped_ptr<FileTracker> tracker = 377 scoped_ptr<FileTracker> tracker =
377 CloneFileTracker(index->GetFileTracker(*itr)); 378 CloneFileTracker(index->GetFileTracker(*itr));
378 if (tracker->dirty()) 379 if (tracker->dirty())
379 continue; 380 continue;
380 tracker->set_dirty(true); 381 tracker->set_dirty(true);
381 PutFileTrackerToBatch(*tracker, batch); 382 PutFileTrackerToBatch(*tracker, batch);
382 index->StoreFileTracker(tracker.Pass()); 383 index->StoreFileTracker(tracker.Pass());
383 } 384 }
384 } 385 }
385 386
386 void MarkTrackersDirtyByPath(int64 parent_tracker_id, 387 void MarkTrackersDirtyByPath(int64 parent_tracker_id,
387 const std::string& title, 388 const std::string& title,
388 MetadataDatabaseIndex* index, 389 MetadataDatabaseIndexInterface* index,
389 leveldb::WriteBatch* batch) { 390 leveldb::WriteBatch* batch) {
390 if (parent_tracker_id == kInvalidTrackerID || title.empty()) 391 if (parent_tracker_id == kInvalidTrackerID || title.empty())
391 return; 392 return;
392 MarkTrackerSetDirty( 393 MarkTrackerSetDirty(
393 index->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title), 394 index->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title),
394 index, batch); 395 index, batch);
395 } 396 }
396 397
397 void MarkTrackersDirtyByFileID(const std::string& file_id, 398 void MarkTrackersDirtyByFileID(const std::string& file_id,
398 MetadataDatabaseIndex* index, 399 MetadataDatabaseIndexInterface* index,
399 leveldb::WriteBatch* batch) { 400 leveldb::WriteBatch* batch) {
400 MarkTrackerSetDirty(index->GetFileTrackerIDsByFileID(file_id), 401 MarkTrackerSetDirty(index->GetFileTrackerIDsByFileID(file_id),
401 index, batch); 402 index, batch);
402 } 403 }
403 404
404 void MarkTrackersDirtyRecursively(int64 root_tracker_id, 405 void MarkTrackersDirtyRecursively(int64 root_tracker_id,
405 MetadataDatabaseIndex* index, 406 MetadataDatabaseIndexInterface* index,
406 leveldb::WriteBatch* batch) { 407 leveldb::WriteBatch* batch) {
407 std::vector<int64> stack; 408 std::vector<int64> stack;
408 stack.push_back(root_tracker_id); 409 stack.push_back(root_tracker_id);
409 while (!stack.empty()) { 410 while (!stack.empty()) {
410 int64 tracker_id = stack.back(); 411 int64 tracker_id = stack.back();
411 stack.pop_back(); 412 stack.pop_back();
412 AppendContents(index->GetFileTrackerIDsByParent(tracker_id), &stack); 413 AppendContents(index->GetFileTrackerIDsByParent(tracker_id), &stack);
413 414
414 scoped_ptr<FileTracker> tracker = 415 scoped_ptr<FileTracker> tracker =
415 CloneFileTracker(index->GetFileTracker(tracker_id)); 416 CloneFileTracker(index->GetFileTracker(tracker_id));
416 tracker->set_dirty(true); 417 tracker->set_dirty(true);
417 418
418 PutFileTrackerToBatch(*tracker, batch); 419 PutFileTrackerToBatch(*tracker, batch);
419 index->StoreFileTracker(tracker.Pass()); 420 index->StoreFileTracker(tracker.Pass());
420 } 421 }
421 } 422 }
422 423
423 void RemoveAllDescendantTrackers(int64 root_tracker_id, 424 void RemoveAllDescendantTrackers(int64 root_tracker_id,
424 MetadataDatabaseIndex* index, 425 MetadataDatabaseIndexInterface* index,
425 leveldb::WriteBatch* batch) { 426 leveldb::WriteBatch* batch) {
426 std::vector<int64> pending_trackers; 427 std::vector<int64> pending_trackers;
427 AppendContents(index->GetFileTrackerIDsByParent(root_tracker_id), 428 AppendContents(index->GetFileTrackerIDsByParent(root_tracker_id),
428 &pending_trackers); 429 &pending_trackers);
429 430
430 std::vector<int64> to_be_removed; 431 std::vector<int64> to_be_removed;
431 432
432 // List trackers to remove. 433 // List trackers to remove.
433 while (!pending_trackers.empty()) { 434 while (!pending_trackers.empty()) {
434 int64 tracker_id = pending_trackers.back(); 435 int64 tracker_id = pending_trackers.back();
(...skipping 20 matching lines...) Expand all
455 // Remove metadata that no longer has any tracker. 456 // Remove metadata that no longer has any tracker.
456 PutFileMetadataDeletionToBatch(*itr, batch); 457 PutFileMetadataDeletionToBatch(*itr, batch);
457 index->RemoveFileMetadata(*itr); 458 index->RemoveFileMetadata(*itr);
458 } else { 459 } else {
459 MarkTrackerSetDirty(trackers, index, batch); 460 MarkTrackerSetDirty(trackers, index, batch);
460 } 461 }
461 } 462 }
462 } 463 }
463 464
464 const FileTracker* FilterFileTrackersByParent( 465 const FileTracker* FilterFileTrackersByParent(
465 const MetadataDatabaseIndex& index, 466 const MetadataDatabaseIndexInterface* index,
466 const TrackerIDSet& trackers, 467 const TrackerIDSet& trackers,
467 int64 parent_tracker_id) { 468 int64 parent_tracker_id) {
468 for (TrackerIDSet::const_iterator itr = trackers.begin(); 469 for (TrackerIDSet::const_iterator itr = trackers.begin();
469 itr != trackers.end(); ++itr) { 470 itr != trackers.end(); ++itr) {
470 const FileTracker* tracker = index.GetFileTracker(*itr); 471 const FileTracker* tracker = index->GetFileTracker(*itr);
471 if (!tracker) { 472 if (!tracker) {
472 NOTREACHED(); 473 NOTREACHED();
473 continue; 474 continue;
474 } 475 }
475 476
476 if (tracker->parent_tracker_id() == parent_tracker_id) 477 if (tracker->parent_tracker_id() == parent_tracker_id)
477 return tracker; 478 return tracker;
478 } 479 }
479 return NULL; 480 return NULL;
480 } 481 }
481 482
482 const FileTracker* FilterFileTrackersByParentAndTitle( 483 const FileTracker* FilterFileTrackersByParentAndTitle(
483 const MetadataDatabaseIndex& index, 484 const MetadataDatabaseIndexInterface* index,
484 const TrackerIDSet& trackers, 485 const TrackerIDSet& trackers,
485 int64 parent_tracker_id, 486 int64 parent_tracker_id,
486 const std::string& title) { 487 const std::string& title) {
487 const FileTracker* result = NULL; 488 const FileTracker* result = NULL;
488 489
489 for (TrackerIDSet::const_iterator itr = trackers.begin(); 490 for (TrackerIDSet::const_iterator itr = trackers.begin();
490 itr != trackers.end(); ++itr) { 491 itr != trackers.end(); ++itr) {
491 const FileTracker* tracker = index.GetFileTracker(*itr); 492 const FileTracker* tracker = index->GetFileTracker(*itr);
492 if (!tracker) { 493 if (!tracker) {
493 NOTREACHED(); 494 NOTREACHED();
494 continue; 495 continue;
495 } 496 }
496 497
497 if (tracker->parent_tracker_id() != parent_tracker_id) 498 if (tracker->parent_tracker_id() != parent_tracker_id)
498 continue; 499 continue;
499 500
500 if (tracker->has_synced_details() && 501 if (tracker->has_synced_details() &&
501 tracker->synced_details().title() != title) 502 tracker->synced_details().title() != title)
502 continue; 503 continue;
503 504
504 // Prioritize trackers that has |synced_details|. 505 // Prioritize trackers that has |synced_details|.
505 if (!result || !tracker->has_synced_details()) 506 if (!result || !tracker->has_synced_details())
506 result = tracker; 507 result = tracker;
507 } 508 }
508 509
509 return result; 510 return result;
510 } 511 }
511 512
512 const FileTracker* FilterFileTrackersByFileID( 513 const FileTracker* FilterFileTrackersByFileID(
513 const MetadataDatabaseIndex& index, 514 const MetadataDatabaseIndexInterface* index,
514 const TrackerIDSet& trackers, 515 const TrackerIDSet& trackers,
515 const std::string& file_id) { 516 const std::string& file_id) {
516 for (TrackerIDSet::const_iterator itr = trackers.begin(); 517 for (TrackerIDSet::const_iterator itr = trackers.begin();
517 itr != trackers.end(); ++itr) { 518 itr != trackers.end(); ++itr) {
518 const FileTracker* tracker = index.GetFileTracker(*itr); 519 const FileTracker* tracker = index->GetFileTracker(*itr);
519 if (!tracker) { 520 if (!tracker) {
520 NOTREACHED(); 521 NOTREACHED();
521 continue; 522 continue;
522 } 523 }
523 524
524 if (tracker->file_id() == file_id) 525 if (tracker->file_id() == file_id)
525 return tracker; 526 return tracker;
526 } 527 }
527 528
528 return NULL; 529 return NULL;
529 } 530 }
530 531
531 enum DirtyingOption { 532 enum DirtyingOption {
532 MARK_NOTHING_DIRTY = 0, 533 MARK_NOTHING_DIRTY = 0,
533 MARK_ITSELF_DIRTY = 1 << 0, 534 MARK_ITSELF_DIRTY = 1 << 0,
534 MARK_SAME_FILE_ID_TRACKERS_DIRTY = 1 << 1, 535 MARK_SAME_FILE_ID_TRACKERS_DIRTY = 1 << 1,
535 MARK_SAME_PATH_TRACKERS_DIRTY = 1 << 2, 536 MARK_SAME_PATH_TRACKERS_DIRTY = 1 << 2,
536 }; 537 };
537 538
538 void ActivateFileTracker(int64 tracker_id, 539 void ActivateFileTracker(int64 tracker_id,
539 int dirtying_options, 540 int dirtying_options,
540 MetadataDatabaseIndex* index, 541 MetadataDatabaseIndexInterface* index,
541 leveldb::WriteBatch* batch) { 542 leveldb::WriteBatch* batch) {
542 DCHECK(dirtying_options == MARK_NOTHING_DIRTY || 543 DCHECK(dirtying_options == MARK_NOTHING_DIRTY ||
543 dirtying_options == MARK_ITSELF_DIRTY); 544 dirtying_options == MARK_ITSELF_DIRTY);
544 545
545 scoped_ptr<FileTracker> tracker = 546 scoped_ptr<FileTracker> tracker =
546 CloneFileTracker(index->GetFileTracker(tracker_id)); 547 CloneFileTracker(index->GetFileTracker(tracker_id));
547 tracker->set_active(true); 548 tracker->set_active(true);
548 if (dirtying_options & MARK_ITSELF_DIRTY) { 549 if (dirtying_options & MARK_ITSELF_DIRTY) {
549 tracker->set_dirty(true); 550 tracker->set_dirty(true);
550 tracker->set_needs_folder_listing( 551 tracker->set_needs_folder_listing(
551 tracker->has_synced_details() && 552 tracker->has_synced_details() &&
552 tracker->synced_details().file_kind() == FILE_KIND_FOLDER); 553 tracker->synced_details().file_kind() == FILE_KIND_FOLDER);
553 } else { 554 } else {
554 tracker->set_dirty(false); 555 tracker->set_dirty(false);
555 tracker->set_needs_folder_listing(false); 556 tracker->set_needs_folder_listing(false);
556 } 557 }
557 558
558 PutFileTrackerToBatch(*tracker, batch); 559 PutFileTrackerToBatch(*tracker, batch);
559 index->StoreFileTracker(tracker.Pass()); 560 index->StoreFileTracker(tracker.Pass());
560 } 561 }
561 562
562 void DeactivateFileTracker(int64 tracker_id, 563 void DeactivateFileTracker(int64 tracker_id,
563 int dirtying_options, 564 int dirtying_options,
564 MetadataDatabaseIndex* index, 565 MetadataDatabaseIndexInterface* index,
565 leveldb::WriteBatch* batch) { 566 leveldb::WriteBatch* batch) {
566 RemoveAllDescendantTrackers(tracker_id, index, batch); 567 RemoveAllDescendantTrackers(tracker_id, index, batch);
567 568
568 scoped_ptr<FileTracker> tracker = 569 scoped_ptr<FileTracker> tracker =
569 CloneFileTracker(index->GetFileTracker(tracker_id)); 570 CloneFileTracker(index->GetFileTracker(tracker_id));
570 571
571 if (dirtying_options & MARK_SAME_FILE_ID_TRACKERS_DIRTY) 572 if (dirtying_options & MARK_SAME_FILE_ID_TRACKERS_DIRTY)
572 MarkTrackersDirtyByFileID(tracker->file_id(), index, batch); 573 MarkTrackersDirtyByFileID(tracker->file_id(), index, batch);
573 if (dirtying_options & MARK_SAME_PATH_TRACKERS_DIRTY) { 574 if (dirtying_options & MARK_SAME_PATH_TRACKERS_DIRTY) {
574 MarkTrackersDirtyByPath(tracker->parent_tracker_id(), 575 MarkTrackersDirtyByPath(tracker->parent_tracker_id(),
575 GetTrackerTitle(*tracker), 576 GetTrackerTitle(*tracker),
576 index, batch); 577 index, batch);
577 } 578 }
578 579
579 tracker->set_dirty(dirtying_options & MARK_ITSELF_DIRTY); 580 tracker->set_dirty(dirtying_options & MARK_ITSELF_DIRTY);
580 tracker->set_active(false); 581 tracker->set_active(false);
581 PutFileTrackerToBatch(*tracker, batch); 582 PutFileTrackerToBatch(*tracker, batch);
582 index->StoreFileTracker(tracker.Pass()); 583 index->StoreFileTracker(tracker.Pass());
583 } 584 }
584 585
585 void RemoveFileTracker(int64 tracker_id, 586 void RemoveFileTracker(int64 tracker_id,
586 int dirtying_options, 587 int dirtying_options,
587 MetadataDatabaseIndex* index, 588 MetadataDatabaseIndexInterface* index,
588 leveldb::WriteBatch* batch) { 589 leveldb::WriteBatch* batch) {
589 DCHECK(!(dirtying_options & MARK_ITSELF_DIRTY)); 590 DCHECK(!(dirtying_options & MARK_ITSELF_DIRTY));
590 591
591 const FileTracker* tracker = index->GetFileTracker(tracker_id); 592 const FileTracker* tracker = index->GetFileTracker(tracker_id);
592 if (!tracker) 593 if (!tracker)
593 return; 594 return;
594 595
595 std::string file_id = tracker->file_id(); 596 std::string file_id = tracker->file_id();
596 int64 parent_tracker_id = tracker->parent_tracker_id(); 597 int64 parent_tracker_id = tracker->parent_tracker_id();
597 std::string title = GetTrackerTitle(*tracker); 598 std::string title = GetTrackerTitle(*tracker);
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 if (!sync_root_tracker_id) { 778 if (!sync_root_tracker_id) {
778 util::Log(logging::LOG_WARNING, FROM_HERE, 779 util::Log(logging::LOG_WARNING, FROM_HERE,
779 "Sync-root needs to be set up before registering app-root"); 780 "Sync-root needs to be set up before registering app-root");
780 worker_task_runner_->PostTask( 781 worker_task_runner_->PostTask(
781 FROM_HERE, 782 FROM_HERE,
782 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND)); 783 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND));
783 return; 784 return;
784 } 785 }
785 786
786 scoped_ptr<FileTracker> tracker = 787 scoped_ptr<FileTracker> tracker =
787 CloneFileTracker(FilterFileTrackersByParent(*index_, trackers, 788 CloneFileTracker(FilterFileTrackersByParent(index_.get(), trackers,
788 sync_root_tracker_id)); 789 sync_root_tracker_id));
789 if (!tracker) { 790 if (!tracker) {
790 worker_task_runner_->PostTask( 791 worker_task_runner_->PostTask(
791 FROM_HERE, 792 FROM_HERE,
792 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND)); 793 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND));
793 return; 794 return;
794 } 795 }
795 796
796 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); 797 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch);
797 tracker->set_app_id(app_id); 798 tracker->set_app_id(app_id);
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
1162 UPDATE_TRACKER_FOR_SYNCED_FILE, 1163 UPDATE_TRACKER_FOR_SYNCED_FILE,
1163 batch.get()); 1164 batch.get());
1164 1165
1165 DCHECK(index_->GetFileMetadata(resource.file_id())); 1166 DCHECK(index_->GetFileMetadata(resource.file_id()));
1166 DCHECK(!index_->GetFileTrackerIDsByFileID(resource.file_id()).has_active()); 1167 DCHECK(!index_->GetFileTrackerIDsByFileID(resource.file_id()).has_active());
1167 1168
1168 TrackerIDSet same_path_trackers = 1169 TrackerIDSet same_path_trackers =
1169 index_->GetFileTrackerIDsByParentAndTitle( 1170 index_->GetFileTrackerIDsByParentAndTitle(
1170 parent_tracker_id, resource.title()); 1171 parent_tracker_id, resource.title());
1171 const FileTracker* to_be_activated = 1172 const FileTracker* to_be_activated =
1172 FilterFileTrackersByFileID(*index_, same_path_trackers, 1173 FilterFileTrackersByFileID(index_.get(), same_path_trackers,
1173 resource.file_id()); 1174 resource.file_id());
1174 if (!to_be_activated) { 1175 if (!to_be_activated) {
1175 NOTREACHED(); 1176 NOTREACHED();
1176 worker_task_runner_->PostTask( 1177 worker_task_runner_->PostTask(
1177 FROM_HERE, 1178 FROM_HERE,
1178 base::Bind(callback, SYNC_STATUS_FAILED)); 1179 base::Bind(callback, SYNC_STATUS_FAILED));
1179 return; 1180 return;
1180 } 1181 }
1181 1182
1182 int64 tracker_id = to_be_activated->tracker_id(); 1183 int64 tracker_id = to_be_activated->tracker_id();
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1306 MARK_SAME_FILE_ID_TRACKERS_DIRTY, 1307 MARK_SAME_FILE_ID_TRACKERS_DIRTY,
1307 index_.get(), batch.get()); 1308 index_.get(), batch.get());
1308 WriteToDatabase(batch.Pass(), callback); 1309 WriteToDatabase(batch.Pass(), callback);
1309 return; 1310 return;
1310 } 1311 }
1311 } else { 1312 } else {
1312 // Check if any other tracker exists has the same parent, title and 1313 // Check if any other tracker exists has the same parent, title and
1313 // file_id to the updated tracker. If it exists, delete the tracker being 1314 // file_id to the updated tracker. If it exists, delete the tracker being
1314 // updated. 1315 // updated.
1315 if (FilterFileTrackersByFileID( 1316 if (FilterFileTrackersByFileID(
1316 *index_, 1317 index_.get(),
1317 index_->GetFileTrackerIDsByParentAndTitle( 1318 index_->GetFileTrackerIDsByParentAndTitle(
1318 parent_tracker->tracker_id(), 1319 parent_tracker->tracker_id(),
1319 updated_details.title()), 1320 updated_details.title()),
1320 tracker->file_id())) { 1321 tracker->file_id())) {
1321 RemoveFileTracker(tracker->tracker_id(), 1322 RemoveFileTracker(tracker->tracker_id(),
1322 MARK_NOTHING_DIRTY, 1323 MARK_NOTHING_DIRTY,
1323 index_.get(), batch.get()); 1324 index_.get(), batch.get());
1324 WriteToDatabase(batch.Pass(), callback); 1325 WriteToDatabase(batch.Pass(), callback);
1325 return; 1326 return;
1326 } 1327 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 base::Bind(callback, SYNC_STATUS_FAILED)); 1363 base::Bind(callback, SYNC_STATUS_FAILED));
1363 return ACTIVATION_PENDING; 1364 return ACTIVATION_PENDING;
1364 } 1365 }
1365 std::string title = metadata->details().title(); 1366 std::string title = metadata->details().title();
1366 DCHECK(!HasInvalidTitle(title)); 1367 DCHECK(!HasInvalidTitle(title));
1367 1368
1368 TrackerIDSet same_file_id_trackers = 1369 TrackerIDSet same_file_id_trackers =
1369 index_->GetFileTrackerIDsByFileID(file_id); 1370 index_->GetFileTrackerIDsByFileID(file_id);
1370 scoped_ptr<FileTracker> tracker_to_be_activated = 1371 scoped_ptr<FileTracker> tracker_to_be_activated =
1371 CloneFileTracker(FilterFileTrackersByParentAndTitle( 1372 CloneFileTracker(FilterFileTrackersByParentAndTitle(
1372 *index_, same_file_id_trackers, 1373 index_.get(), same_file_id_trackers,
1373 parent_tracker_id, title)); 1374 parent_tracker_id, title));
1374 DCHECK(tracker_to_be_activated); 1375 DCHECK(tracker_to_be_activated);
1375 1376
1376 // Check if there is another active tracker that tracks |file_id|. 1377 // Check if there is another active tracker that tracks |file_id|.
1377 // This can happen when the tracked file has multiple parents. 1378 // This can happen when the tracked file has multiple parents.
1378 // In this case, report the failure to the caller. 1379 // In this case, report the failure to the caller.
1379 if (!tracker_to_be_activated->active() && same_file_id_trackers.has_active()) 1380 if (!tracker_to_be_activated->active() && same_file_id_trackers.has_active())
1380 return ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER; 1381 return ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER;
1381 1382
1382 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); 1383 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch);
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after
2103 index_->StoreFileMetadata(app_root_metadata.Pass()); 2104 index_->StoreFileMetadata(app_root_metadata.Pass());
2104 index_->StoreFileTracker(app_root_tracker.Pass()); 2105 index_->StoreFileTracker(app_root_tracker.Pass());
2105 } 2106 }
2106 2107
2107 void MetadataDatabase::DetachFromSequence() { 2108 void MetadataDatabase::DetachFromSequence() {
2108 worker_sequence_checker_.DetachFromSequence(); 2109 worker_sequence_checker_.DetachFromSequence();
2109 } 2110 }
2110 2111
2111 } // namespace drive_backend 2112 } // namespace drive_backend
2112 } // namespace sync_file_system 2113 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698