| Index: google_apis/gcm/engine/gcm_store_impl.cc
|
| diff --git a/google_apis/gcm/engine/gcm_store_impl.cc b/google_apis/gcm/engine/gcm_store_impl.cc
|
| index b90630a0594a85ee85b54fae61ef238fbe5a2a7c..fe9a075bea59eba92fe63b92f10dd2a95b5c09b4 100644
|
| --- a/google_apis/gcm/engine/gcm_store_impl.cc
|
| +++ b/google_apis/gcm/engine/gcm_store_impl.cc
|
| @@ -50,6 +50,7 @@ enum LoadStatus {
|
| LOADING_LAST_TOKEN_TIME_FAILED,
|
| LOADING_HEARTBEAT_INTERVALS_FAILED,
|
| LOADING_INSTANCE_ID_DATA_FAILED,
|
| + STORE_DOES_NOT_EXIST,
|
|
|
| // NOTE: always keep this entry at the end. Add new status types only
|
| // immediately above this line. Make sure to update the corresponding
|
| @@ -185,7 +186,7 @@ class GCMStoreImpl::Backend
|
| scoped_ptr<Encryptor> encryptor);
|
|
|
| // Blocking implementations of GCMStoreImpl methods.
|
| - void Load(const LoadCallback& callback);
|
| + void Load(StoreOpenMode open_mode, const LoadCallback& callback);
|
| void Close();
|
| void Destroy(const UpdateCallback& callback);
|
| void SetDeviceCredentials(uint64 device_android_id,
|
| @@ -243,7 +244,7 @@ class GCMStoreImpl::Backend
|
| friend class base::RefCountedThreadSafe<Backend>;
|
| ~Backend();
|
|
|
| - LoadStatus OpenStoreAndLoadData(LoadResult* result);
|
| + LoadStatus OpenStoreAndLoadData(StoreOpenMode open_mode, LoadResult* result);
|
| bool LoadDeviceCredentials(uint64* android_id, uint64* security_token);
|
| bool LoadRegistrations(std::map<std::string, std::string>* registrations);
|
| bool LoadIncomingMessages(std::vector<std::string>* incoming_messages);
|
| @@ -275,15 +276,23 @@ GCMStoreImpl::Backend::Backend(
|
|
|
| GCMStoreImpl::Backend::~Backend() {}
|
|
|
| -LoadStatus GCMStoreImpl::Backend::OpenStoreAndLoadData(LoadResult* result) {
|
| +LoadStatus GCMStoreImpl::Backend::OpenStoreAndLoadData(StoreOpenMode open_mode,
|
| + LoadResult* result) {
|
| LoadStatus load_status;
|
| if (db_.get()) {
|
| LOG(ERROR) << "Attempting to reload open database.";
|
| return RELOADING_OPEN_STORE;
|
| }
|
|
|
| + // Checks if the store exists or not. Calling DB::Open with create_if_missing
|
| + // not set will still create a new directory if the store does not exist.
|
| + if (open_mode == DO_NOT_CREATE && !base::DirectoryExists(path_)) {
|
| + DVLOG(2) << "Database " << path_.value() << " does not exist";
|
| + return STORE_DOES_NOT_EXIST;
|
| + }
|
| +
|
| leveldb::Options options;
|
| - options.create_if_missing = true;
|
| + options.create_if_missing = open_mode == CREATE_IF_MISSING;
|
| options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
|
| leveldb::DB* db;
|
| leveldb::Status status =
|
| @@ -325,12 +334,14 @@ LoadStatus GCMStoreImpl::Backend::OpenStoreAndLoadData(LoadResult* result) {
|
| return LOADING_SUCCEEDED;
|
| }
|
|
|
| -void GCMStoreImpl::Backend::Load(const LoadCallback& callback) {
|
| +void GCMStoreImpl::Backend::Load(StoreOpenMode open_mode,
|
| + const LoadCallback& callback) {
|
| scoped_ptr<LoadResult> result(new LoadResult());
|
| - LoadStatus load_status = OpenStoreAndLoadData(result.get());
|
| + LoadStatus load_status = OpenStoreAndLoadData(open_mode, result.get());
|
| UMA_HISTOGRAM_ENUMERATION("GCM.LoadStatus", load_status, LOAD_STATUS_COUNT);
|
| if (load_status != LOADING_SUCCEEDED) {
|
| result->Reset();
|
| + result->store_does_not_exist = (load_status == STORE_DOES_NOT_EXIST);
|
| foreground_task_runner_->PostTask(FROM_HERE,
|
| base::Bind(callback,
|
| base::Passed(&result)));
|
| @@ -1156,11 +1167,12 @@ GCMStoreImpl::GCMStoreImpl(
|
|
|
| GCMStoreImpl::~GCMStoreImpl() {}
|
|
|
| -void GCMStoreImpl::Load(const LoadCallback& callback) {
|
| +void GCMStoreImpl::Load(StoreOpenMode open_mode, const LoadCallback& callback) {
|
| blocking_task_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&GCMStoreImpl::Backend::Load,
|
| backend_,
|
| + open_mode,
|
| base::Bind(&GCMStoreImpl::LoadContinuation,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| callback)));
|
|
|