Signal-iOS/src/Storage/TSYapDatabaseObject.m
2016-11-09 12:57:54 -05:00

154 lines
4.1 KiB
Objective-C

// Created by Frederic Jacobs on 16/11/14.
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
#import "TSYapDatabaseObject.h"
#import "TSStorageManager.h"
#import <YapDatabase/YapDatabaseTransaction.h>
@implementation TSYapDatabaseObject
- (instancetype)init
{
return [self initWithUniqueId:[[NSUUID UUID] UUIDString]];
}
- (instancetype)initWithUniqueId:(NSString *)aUniqueId
{
self = [super init];
if (!self) {
return self;
}
_uniqueId = aUniqueId;
return self;
}
- (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{
[transaction setObject:self forKey:self.uniqueId inCollection:[[self class] collection]];
}
- (void)save
{
[[self dbConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[self saveWithTransaction:transaction];
}];
}
- (void)touchWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{
[transaction touchObjectForKey:self.uniqueId inCollection:[self.class collection]];
}
- (void)touch
{
[[self dbConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[self touchWithTransaction:transaction];
}];
}
- (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{
[transaction removeObjectForKey:self.uniqueId inCollection:[[self class] collection]];
}
- (void)remove
{
[[self dbConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[self removeWithTransaction:transaction];
}];
}
- (YapDatabaseConnection *)dbConnection
{
return [[self class] dbConnection];
}
- (TSStorageManager *)storageManager
{
return [[self class] storageManager];
}
#pragma mark Class Methods
+ (YapDatabaseConnection *)dbConnection
{
return [self storageManager].dbConnection;
}
+ (TSStorageManager *)storageManager
{
return [TSStorageManager sharedManager];
}
+ (NSString *)collection
{
return NSStringFromClass([self class]);
}
+ (NSUInteger)numberOfKeysInCollection
{
__block NSUInteger count;
[[self dbConnection] readWithBlock:^(YapDatabaseReadTransaction *transaction) {
count = [self numberOfKeysInCollectionWithTransaction:transaction];
}];
return count;
}
+ (NSUInteger)numberOfKeysInCollectionWithTransaction:(YapDatabaseReadTransaction *)transaction
{
return [transaction numberOfKeysInCollection:[self collection]];
}
+ (NSArray *)allObjectsInCollection
{
__block NSMutableArray *all = [[NSMutableArray alloc] initWithCapacity:[self numberOfKeysInCollection]];
[self enumerateCollectionObjectsUsingBlock:^(id object, BOOL *stop) {
[all addObject:object];
}];
return [all copy];
}
+ (void)enumerateCollectionObjectsUsingBlock:(void (^)(id object, BOOL *stop))block
{
[[self dbConnection] readWithBlock:^(YapDatabaseReadTransaction *transaction) {
[self enumerateCollectionObjectsWithTransaction:transaction usingBlock:block];
}];
}
+ (void)enumerateCollectionObjectsWithTransaction:(YapDatabaseReadTransaction *)transaction
usingBlock:(void (^)(id object, BOOL *stop))block
{
// Ignoring most of the YapDB parameters, and just passing through the ones we usually use.
void (^yapBlock)(NSString *key, id object, id metadata, BOOL *stop)
= ^void(NSString *key, id object, id metadata, BOOL *stop) {
block(object, stop);
};
[transaction enumerateRowsInCollection:[self collection] usingBlock:yapBlock];
}
+ (void)removeAllObjectsInCollection
{
[[self dbConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[transaction removeAllObjectsInCollection:[self collection]];
}];
}
+ (instancetype)fetchObjectWithUniqueID:(NSString *)uniqueID transaction:(YapDatabaseReadTransaction *)transaction
{
return [transaction objectForKey:uniqueID inCollection:[self collection]];
}
+ (instancetype)fetchObjectWithUniqueID:(NSString *)uniqueID
{
__block id object;
[[self dbConnection] readWithBlock:^(YapDatabaseReadTransaction *transaction) {
object = [transaction objectForKey:uniqueID inCollection:[self collection]];
}];
return object;
}
@end