| Index: sync/internal_api/model_type_store_impl.cc | 
| diff --git a/sync/internal_api/model_type_store_impl.cc b/sync/internal_api/model_type_store_impl.cc | 
| deleted file mode 100644 | 
| index e018f37759f95662de4fc4cf9c1eae8012260e02..0000000000000000000000000000000000000000 | 
| --- a/sync/internal_api/model_type_store_impl.cc | 
| +++ /dev/null | 
| @@ -1,344 +0,0 @@ | 
| -// Copyright 2015 The Chromium Authors. All rights reserved. | 
| -// Use of this source code is governed by a BSD-style license that can be | 
| -// found in the LICENSE file. | 
| - | 
| -#include "sync/internal_api/public/model_type_store_impl.h" | 
| - | 
| -#include <utility> | 
| - | 
| -#include "base/bind.h" | 
| -#include "base/location.h" | 
| -#include "base/logging.h" | 
| -#include "base/memory/ptr_util.h" | 
| -#include "base/sequenced_task_runner.h" | 
| -#include "base/task_runner_util.h" | 
| -#include "base/threading/thread_task_runner_handle.h" | 
| -#include "sync/internal_api/public/model_type_store_backend.h" | 
| -#include "third_party/leveldatabase/src/include/leveldb/env.h" | 
| -#include "third_party/leveldatabase/src/include/leveldb/write_batch.h" | 
| - | 
| -namespace syncer_v2 { | 
| - | 
| -namespace { | 
| - | 
| -// Key prefix for data/metadata records. | 
| -const char kDataPrefix[] = "-dt-"; | 
| -const char kMetadataPrefix[] = "-md-"; | 
| - | 
| -// Key for global metadata record. | 
| -const char kGlobalMetadataKey[] = "GlobalMetadata"; | 
| - | 
| -void NoOpForBackendDtor(scoped_refptr<ModelTypeStoreBackend> backend) { | 
| -  // This function was intentionally left blank. | 
| -} | 
| - | 
| -}  // namespace | 
| - | 
| -// static | 
| -std::string ModelTypeStoreImpl::FormatDataPrefix(const syncer::ModelType type) { | 
| -  return std::string(syncer::GetModelTypeRootTag(type)) + kDataPrefix; | 
| -} | 
| - | 
| -// static | 
| -std::string ModelTypeStoreImpl::FormatMetaPrefix(const syncer::ModelType type) { | 
| -  return std::string(syncer::GetModelTypeRootTag(type)) + kMetadataPrefix; | 
| -} | 
| - | 
| -// static | 
| -leveldb::WriteBatch* ModelTypeStoreImpl::GetLeveldbWriteBatch( | 
| -    WriteBatch* write_batch) { | 
| -  return static_cast<WriteBatchImpl*>(write_batch)->leveldb_write_batch_.get(); | 
| -} | 
| - | 
| -std::string ModelTypeStoreImpl::FormatDataKey(const std::string& id) { | 
| -  return data_prefix_ + id; | 
| -} | 
| - | 
| -std::string ModelTypeStoreImpl::FormatMetadataKey(const std::string& id) { | 
| -  return metadata_prefix_ + id; | 
| -} | 
| - | 
| -ModelTypeStoreImpl::ModelTypeStoreImpl( | 
| -    const syncer::ModelType type, | 
| -    scoped_refptr<ModelTypeStoreBackend> backend, | 
| -    scoped_refptr<base::SequencedTaskRunner> backend_task_runner) | 
| -    : backend_(backend), | 
| -      backend_task_runner_(backend_task_runner), | 
| -      data_prefix_(FormatDataPrefix(type)), | 
| -      metadata_prefix_(FormatMetaPrefix(type)), | 
| -      weak_ptr_factory_(this) { | 
| -  DCHECK(backend_); | 
| -  DCHECK(backend_task_runner_); | 
| -} | 
| - | 
| -ModelTypeStoreImpl::~ModelTypeStoreImpl() { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  backend_task_runner_->PostTask( | 
| -      FROM_HERE, base::Bind(&NoOpForBackendDtor, base::Passed(&backend_))); | 
| -} | 
| - | 
| -// static | 
| -void ModelTypeStoreImpl::CreateStore( | 
| -    const syncer::ModelType type, | 
| -    const std::string& path, | 
| -    scoped_refptr<base::SequencedTaskRunner> blocking_task_runner, | 
| -    const InitCallback& callback) { | 
| -  DCHECK(!callback.is_null()); | 
| -  std::unique_ptr<leveldb::Env> env; | 
| -  std::unique_ptr<Result> result(new Result()); | 
| -  auto task = base::Bind(&ModelTypeStoreBackend::GetOrCreateBackend, path, | 
| -                         base::Passed(&env), result.get()); | 
| -  auto reply = | 
| -      base::Bind(&ModelTypeStoreImpl::BackendInitDone, type, | 
| -                 base::Passed(&result), blocking_task_runner, callback); | 
| - | 
| -  base::PostTaskAndReplyWithResult(blocking_task_runner.get(), FROM_HERE, task, | 
| -                                   reply); | 
| -} | 
| - | 
| -// static | 
| -void ModelTypeStoreImpl::CreateInMemoryStoreForTest( | 
| -    const InitCallback& callback) { | 
| -  DCHECK(!callback.is_null()); | 
| - | 
| -  std::unique_ptr<leveldb::Env> env = | 
| -      ModelTypeStoreBackend::CreateInMemoryEnv(); | 
| - | 
| -  std::string path; | 
| -  env->GetTestDirectory(&path); | 
| -  path += "/in-memory"; | 
| - | 
| -  // In-memory store backend works on the same thread as test. | 
| -  scoped_refptr<base::SequencedTaskRunner> task_runner = | 
| -      base::ThreadTaskRunnerHandle::Get(); | 
| - | 
| -  std::unique_ptr<Result> result(new Result()); | 
| - | 
| -  auto task = base::Bind(&ModelTypeStoreBackend::GetOrCreateBackend, path, | 
| -                         base::Passed(&env), result.get()); | 
| -  auto reply = | 
| -      base::Bind(&ModelTypeStoreImpl::BackendInitDone, syncer::UNSPECIFIED, | 
| -                 base::Passed(&result), task_runner, callback); | 
| - | 
| -  base::PostTaskAndReplyWithResult(task_runner.get(), FROM_HERE, task, reply); | 
| -} | 
| - | 
| -// static | 
| -void ModelTypeStoreImpl::BackendInitDone( | 
| -    const syncer::ModelType type, | 
| -    std::unique_ptr<Result> result, | 
| -    scoped_refptr<base::SequencedTaskRunner> blocking_task_runner, | 
| -    const InitCallback& callback, | 
| -    scoped_refptr<ModelTypeStoreBackend> backend) { | 
| -  std::unique_ptr<ModelTypeStoreImpl> store; | 
| -  if (*result == Result::SUCCESS) { | 
| -    store.reset(new ModelTypeStoreImpl(type, backend, blocking_task_runner)); | 
| -  } | 
| - | 
| -  callback.Run(*result, std::move(store)); | 
| -} | 
| - | 
| -// Note on pattern for communicating with backend: | 
| -//  - API function (e.g. ReadData) allocates lists for output. | 
| -//  - API function prepares two callbacks: task that will be posted on backend | 
| -//    thread and reply which will be posted on model type thread once task | 
| -//    finishes. | 
| -//  - Task for backend thread takes raw pointers to output lists while reply | 
| -//    takes ownership of those lists. This allows backend interface to be simple | 
| -//    while ensuring proper objects' lifetime. | 
| -//  - Function bound by reply calls consumer's callback and passes ownership of | 
| -//    output lists to it. | 
| - | 
| -void ModelTypeStoreImpl::ReadData(const IdList& id_list, | 
| -                                  const ReadDataCallback& callback) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  DCHECK(!callback.is_null()); | 
| -  std::unique_ptr<RecordList> record_list(new RecordList()); | 
| -  std::unique_ptr<IdList> missing_id_list(new IdList()); | 
| - | 
| -  auto task = base::Bind(&ModelTypeStoreBackend::ReadRecordsWithPrefix, | 
| -                         base::Unretained(backend_.get()), data_prefix_, | 
| -                         id_list, base::Unretained(record_list.get()), | 
| -                         base::Unretained(missing_id_list.get())); | 
| -  auto reply = base::Bind( | 
| -      &ModelTypeStoreImpl::ReadDataDone, weak_ptr_factory_.GetWeakPtr(), | 
| -      callback, base::Passed(&record_list), base::Passed(&missing_id_list)); | 
| -  base::PostTaskAndReplyWithResult(backend_task_runner_.get(), FROM_HERE, task, | 
| -                                   reply); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::ReadDataDone(const ReadDataCallback& callback, | 
| -                                      std::unique_ptr<RecordList> record_list, | 
| -                                      std::unique_ptr<IdList> missing_id_list, | 
| -                                      Result result) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  callback.Run(result, std::move(record_list), std::move(missing_id_list)); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::ReadAllData(const ReadAllDataCallback& callback) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  DCHECK(!callback.is_null()); | 
| -  std::unique_ptr<RecordList> record_list(new RecordList()); | 
| -  auto task = base::Bind(&ModelTypeStoreBackend::ReadAllRecordsWithPrefix, | 
| -                         base::Unretained(backend_.get()), data_prefix_, | 
| -                         base::Unretained(record_list.get())); | 
| -  auto reply = base::Bind(&ModelTypeStoreImpl::ReadAllDataDone, | 
| -                          weak_ptr_factory_.GetWeakPtr(), callback, | 
| -                          base::Passed(&record_list)); | 
| -  base::PostTaskAndReplyWithResult(backend_task_runner_.get(), FROM_HERE, task, | 
| -                                   reply); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::ReadAllDataDone( | 
| -    const ReadAllDataCallback& callback, | 
| -    std::unique_ptr<RecordList> record_list, | 
| -    Result result) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  callback.Run(result, std::move(record_list)); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::ReadAllMetadata(const ReadMetadataCallback& callback) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  DCHECK(!callback.is_null()); | 
| - | 
| -  // ReadAllMetadata performs two steps sequentially: read all metadata records | 
| -  // and then read global metadata record. Start reading metadata records here. | 
| -  // When this read operation is done ReadMetadataRecordsDone callback will | 
| -  // issue read operation for global metadata record. | 
| -  std::unique_ptr<RecordList> metadata_records(new RecordList()); | 
| -  auto task = base::Bind(&ModelTypeStoreBackend::ReadAllRecordsWithPrefix, | 
| -                         base::Unretained(backend_.get()), metadata_prefix_, | 
| -                         base::Unretained(metadata_records.get())); | 
| -  auto reply = base::Bind(&ModelTypeStoreImpl::ReadMetadataRecordsDone, | 
| -                          weak_ptr_factory_.GetWeakPtr(), callback, | 
| -                          base::Passed(&metadata_records)); | 
| -  base::PostTaskAndReplyWithResult(backend_task_runner_.get(), FROM_HERE, task, | 
| -                                   reply); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::ReadMetadataRecordsDone( | 
| -    const ReadMetadataCallback& callback, | 
| -    std::unique_ptr<RecordList> metadata_records, | 
| -    Result result) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  if (result != Result::SUCCESS) { | 
| -    callback.Run(result, std::move(metadata_records), std::string()); | 
| -    return; | 
| -  } | 
| - | 
| -  IdList global_metadata_id; | 
| -  global_metadata_id.push_back(kGlobalMetadataKey); | 
| -  std::unique_ptr<RecordList> global_metadata_records(new RecordList()); | 
| -  std::unique_ptr<IdList> missing_id_list(new IdList()); | 
| -  auto task = base::Bind(&ModelTypeStoreBackend::ReadRecordsWithPrefix, | 
| -                         base::Unretained(backend_.get()), std::string(), | 
| -                         global_metadata_id, | 
| -                         base::Unretained(global_metadata_records.get()), | 
| -                         base::Unretained(missing_id_list.get())); | 
| -  auto reply = base::Bind( | 
| -      &ModelTypeStoreImpl::ReadAllMetadataDone, weak_ptr_factory_.GetWeakPtr(), | 
| -      callback, base::Passed(&metadata_records), | 
| -      base::Passed(&global_metadata_records), base::Passed(&missing_id_list)); | 
| -  base::PostTaskAndReplyWithResult(backend_task_runner_.get(), FROM_HERE, task, | 
| -                                   reply); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::ReadAllMetadataDone( | 
| -    const ReadMetadataCallback& callback, | 
| -    std::unique_ptr<RecordList> metadata_records, | 
| -    std::unique_ptr<RecordList> global_metadata_records, | 
| -    std::unique_ptr<IdList> missing_id_list, | 
| -    Result result) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  if (result != Result::SUCCESS) { | 
| -    callback.Run(result, std::move(metadata_records), std::string()); | 
| -    return; | 
| -  } | 
| - | 
| -  if (!missing_id_list->empty()) { | 
| -    // Missing global metadata record is not an error. We shouild return empty | 
| -    // string in this case. | 
| -    DCHECK((*missing_id_list)[0] == kGlobalMetadataKey); | 
| -    DCHECK(global_metadata_records->empty()); | 
| -    callback.Run(Result::SUCCESS, std::move(metadata_records), std::string()); | 
| -    return; | 
| -  } | 
| -  DCHECK(!global_metadata_records->empty()); | 
| -  DCHECK((*global_metadata_records)[0].id == kGlobalMetadataKey); | 
| -  callback.Run(Result::SUCCESS, std::move(metadata_records), | 
| -               (*global_metadata_records)[0].value); | 
| -} | 
| - | 
| -std::unique_ptr<ModelTypeStore::WriteBatch> | 
| -ModelTypeStoreImpl::CreateWriteBatch() { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  return base::WrapUnique(new WriteBatchImpl()); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::CommitWriteBatch( | 
| -    std::unique_ptr<WriteBatch> write_batch, | 
| -    const CallbackWithResult& callback) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  DCHECK(!callback.is_null()); | 
| -  WriteBatchImpl* write_batch_impl = | 
| -      static_cast<WriteBatchImpl*>(write_batch.get()); | 
| -  auto task = base::Bind(&ModelTypeStoreBackend::WriteModifications, | 
| -                         base::Unretained(backend_.get()), | 
| -                         base::Passed(&write_batch_impl->leveldb_write_batch_)); | 
| -  auto reply = base::Bind(&ModelTypeStoreImpl::WriteModificationsDone, | 
| -                          weak_ptr_factory_.GetWeakPtr(), callback); | 
| -  base::PostTaskAndReplyWithResult(backend_task_runner_.get(), FROM_HERE, task, | 
| -                                   reply); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::WriteModificationsDone( | 
| -    const CallbackWithResult& callback, | 
| -    Result result) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  callback.Run(result); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::WriteData(WriteBatch* write_batch, | 
| -                                   const std::string& id, | 
| -                                   const std::string& value) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  GetLeveldbWriteBatch(write_batch)->Put(FormatDataKey(id), value); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::WriteMetadata(WriteBatch* write_batch, | 
| -                                       const std::string& id, | 
| -                                       const std::string& value) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  GetLeveldbWriteBatch(write_batch)->Put(FormatMetadataKey(id), value); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::WriteGlobalMetadata(WriteBatch* write_batch, | 
| -                                             const std::string& value) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  GetLeveldbWriteBatch(write_batch)->Put(kGlobalMetadataKey, value); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::DeleteData(WriteBatch* write_batch, | 
| -                                    const std::string& id) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  GetLeveldbWriteBatch(write_batch)->Delete(FormatDataKey(id)); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::DeleteMetadata(WriteBatch* write_batch, | 
| -                                        const std::string& id) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  GetLeveldbWriteBatch(write_batch)->Delete(FormatMetadataKey(id)); | 
| -} | 
| - | 
| -void ModelTypeStoreImpl::DeleteGlobalMetadata(WriteBatch* write_batch) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  GetLeveldbWriteBatch(write_batch)->Delete(kGlobalMetadataKey); | 
| -} | 
| - | 
| -ModelTypeStoreImpl::WriteBatchImpl::WriteBatchImpl() { | 
| -  leveldb_write_batch_.reset(new leveldb::WriteBatch()); | 
| -} | 
| - | 
| -ModelTypeStoreImpl::WriteBatchImpl::~WriteBatchImpl() {} | 
| - | 
| -}  // namespace syncer_v2 | 
|  |