Files

148 lines
5.0 KiB
Objective-C
Raw Permalink Normal View History

2017-05-15 12:27:07 -07:00
/*
* Copyright 2017 Google
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
2020-06-22 07:58:52 -07:00
#import "FirebaseDatabase/Sources/Core/FRepoManager.h"
#import "FirebaseCore/Extension/FirebaseCoreInternal.h"
2020-06-22 07:58:52 -07:00
#import "FirebaseDatabase/Sources/Api/Private/FIRDatabaseQuery_Private.h"
#import "FirebaseDatabase/Sources/Api/Private/FIRDatabase_Private.h"
#import "FirebaseDatabase/Sources/Core/FRepo.h"
#import "FirebaseDatabase/Sources/FIRDatabaseConfig_Private.h"
#import "FirebaseDatabase/Sources/Utilities/FAtomicNumber.h"
2017-05-15 12:27:07 -07:00
@implementation FRepoManager
typedef NSMutableDictionary<NSString *,
NSMutableDictionary<FRepoInfo *, FRepo *> *>
FRepoDictionary;
+ (FRepoDictionary *)configs {
2017-05-15 12:27:07 -07:00
static dispatch_once_t pred = 0;
static FRepoDictionary *configs;
2017-05-15 12:27:07 -07:00
dispatch_once(&pred, ^{
2019-08-05 13:27:47 -07:00
configs = [NSMutableDictionary dictionary];
2017-05-15 12:27:07 -07:00
});
return configs;
}
/**
2019-08-05 13:27:47 -07:00
* Used for legacy unit tests. The public API should go through
* FirebaseDatabase which calls createRepo.
2017-05-15 12:27:07 -07:00
*/
2019-08-05 13:27:47 -07:00
+ (FRepo *)getRepo:(FRepoInfo *)repoInfo config:(FIRDatabaseConfig *)config {
2017-05-15 12:27:07 -07:00
[config freeze];
FRepoDictionary *configs = [FRepoManager configs];
2017-05-15 12:27:07 -07:00
@synchronized(configs) {
2019-08-05 13:27:47 -07:00
NSMutableDictionary<FRepoInfo *, FRepo *> *repos =
configs[config.sessionIdentifier];
if (!repos || repos[repoInfo] == nil) {
2017-05-15 12:27:07 -07:00
// Calling this should create the repo.
[FIRDatabase createDatabaseForTests:repoInfo config:config];
}
return configs[config.sessionIdentifier][repoInfo];
2017-05-15 12:27:07 -07:00
}
}
2019-08-05 13:27:47 -07:00
+ (FRepo *)createRepo:(FRepoInfo *)repoInfo
config:(FIRDatabaseConfig *)config
database:(FIRDatabase *)database {
2017-05-15 12:27:07 -07:00
[config freeze];
FRepoDictionary *configs = [FRepoManager configs];
2017-05-15 12:27:07 -07:00
@synchronized(configs) {
NSMutableDictionary<FRepoInfo *, FRepo *> *repos =
configs[config.sessionIdentifier];
2017-05-15 12:27:07 -07:00
if (!repos) {
repos = [NSMutableDictionary dictionary];
configs[config.sessionIdentifier] = repos;
}
FRepo *repo = repos[repoInfo];
2017-05-15 12:27:07 -07:00
if (repo == nil) {
2019-08-05 13:27:47 -07:00
repo = [[FRepo alloc] initWithRepoInfo:repoInfo
config:config
database:database];
repos[repoInfo] = repo;
2017-05-15 12:27:07 -07:00
return repo;
} else {
2019-08-05 13:27:47 -07:00
[NSException
raise:@"RepoExists"
format:@"createRepo called for Repo that already exists."];
2017-05-15 12:27:07 -07:00
return nil;
}
}
}
2019-08-05 13:27:47 -07:00
+ (void)interrupt:(FIRDatabaseConfig *)config {
2017-05-15 12:27:07 -07:00
dispatch_async([FIRDatabaseQuery sharedQueue], ^{
2019-08-05 13:27:47 -07:00
FRepoDictionary *configs = [FRepoManager configs];
NSMutableDictionary<FRepoInfo *, FRepo *> *repos =
configs[config.sessionIdentifier];
for (FRepo *repo in [repos allValues]) {
[repo interrupt];
}
2017-05-15 12:27:07 -07:00
});
}
2019-08-05 13:27:47 -07:00
+ (void)interruptAll {
2017-05-15 12:27:07 -07:00
dispatch_async([FIRDatabaseQuery sharedQueue], ^{
2019-08-05 13:27:47 -07:00
FRepoDictionary *configs = [FRepoManager configs];
for (NSMutableDictionary<FRepoInfo *, FRepo *> *repos in
[configs allValues]) {
for (FRepo *repo in [repos allValues]) {
[repo interrupt];
}
}
2017-05-15 12:27:07 -07:00
});
}
2019-08-05 13:27:47 -07:00
+ (void)resume:(FIRDatabaseConfig *)config {
2017-05-15 12:27:07 -07:00
dispatch_async([FIRDatabaseQuery sharedQueue], ^{
2019-08-05 13:27:47 -07:00
FRepoDictionary *configs = [FRepoManager configs];
NSMutableDictionary<FRepoInfo *, FRepo *> *repos =
configs[config.sessionIdentifier];
for (FRepo *repo in [repos allValues]) {
[repo resume];
}
2017-05-15 12:27:07 -07:00
});
}
2019-08-05 13:27:47 -07:00
+ (void)resumeAll {
2017-05-15 12:27:07 -07:00
dispatch_async([FIRDatabaseQuery sharedQueue], ^{
2019-08-05 13:27:47 -07:00
FRepoDictionary *configs = [FRepoManager configs];
for (NSMutableDictionary<FRepoInfo *, FRepo *> *repos in
[configs allValues]) {
for (FRepo *repo in [repos allValues]) {
[repo resume];
}
}
2017-05-15 12:27:07 -07:00
});
}
+ (void)disposeRepos:(FIRDatabaseConfig *)config {
2019-08-05 13:27:47 -07:00
// Do this synchronously to make sure we release our references to LevelDB
// before returning, allowing LevelDB to close and release its exclusive
// locks.
2017-05-15 12:27:07 -07:00
dispatch_sync([FIRDatabaseQuery sharedQueue], ^{
2019-08-05 13:27:47 -07:00
FFLog(@"I-RDB040001", @"Disposing all repos for Config with name %@",
config.sessionIdentifier);
NSMutableDictionary *configs = [FRepoManager configs];
for (FRepo *repo in [configs[config.sessionIdentifier] allValues]) {
[repo dispose];
}
[configs removeObjectForKey:config.sessionIdentifier];
2017-05-15 12:27:07 -07:00
});
}
@end