// Created by Frederic Jacobs on 16/11/14. // Copyright (c) 2014 Open Whisper Systems. All rights reserved. #import "TSYapDatabaseObject.h" #import "TSStorageManager.h" #import @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