CKKSSQLDatabaseObject.h [plain text]
#include "keychain/securityd/SecDbItem.h"
#include <utilities/SecDb.h>
#define CKKSNilToNSNull(obj) \
({ \
id o = (obj); \
o ? o : [NSNull null]; \
})
#define CKKSIsNull(x) \
({ \
id y = (x); \
((y == nil) || ([y isEqual:[NSNull null]])); \
})
#define CKKSUnbase64NullableString(x) (!CKKSIsNull(x) ? [[NSData alloc] initWithBase64EncodedString:x options:0] : nil)
NS_ASSUME_NONNULL_BEGIN
@interface CKKSSQLResult : NSObject
- (instancetype)init:(NSString* _Nullable)value;
- (BOOL)asBOOL;
- (NSInteger)asNSInteger;
- (NSString* _Nullable)asString;
- (NSNumber* _Nullable)asNSNumberInteger;
- (NSDate* _Nullable)asISO8601Date;
- (NSData* _Nullable)asBase64DecodedData;
@end
extern __thread bool CKKSSQLInTransaction;
extern __thread bool CKKSSQLInWriteTransaction;
typedef NS_ENUM(uint8_t, CKKSDatabaseTransactionResult) {
CKKSDatabaseTransactionRollback = 0,
CKKSDatabaseTransactionCommit = 1,
};
@protocol CKKSDatabaseProviderProtocol
- (void)dispatchSyncWithSQLTransaction:(CKKSDatabaseTransactionResult (^)(void))block;
- (void)dispatchSyncWithReadOnlySQLTransaction:(void (^)(void))block;
- (BOOL)insideSQLTransaction;
@end
@interface CKKSSQLDatabaseObject : NSObject <NSCopying>
@property (copy) NSDictionary<NSString*, NSString*>* originalSelfWhereClause;
- (bool)saveToDatabase:(NSError* _Nullable __autoreleasing* _Nullable)error;
- (bool)saveToDatabaseWithConnection:(SecDbConnectionRef _Nullable)conn
error:(NSError* _Nullable __autoreleasing* _Nullable)error;
- (bool)deleteFromDatabase:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (bool)deleteAll:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (instancetype _Nullable)fromDatabaseWhere:(NSDictionary*)whereDict error:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (instancetype _Nullable)tryFromDatabaseWhere:(NSDictionary*)whereDict
error:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (NSArray*)all:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (NSArray*)allWhere:(NSDictionary* _Nullable)whereDict error:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (NSArray*)fetch:(size_t)count error:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (NSArray*)fetch:(size_t)count
where:(NSDictionary* _Nullable)whereDict
error:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (NSArray*)fetch:(size_t)count
where:(NSDictionary* _Nullable)whereDict
orderBy:(NSArray* _Nullable)orderColumns
error:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (bool)saveToDatabaseTable:(NSString*)table
row:(NSDictionary*)row
connection:(SecDbConnectionRef _Nullable)dbconn
error:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (bool)deleteFromTable:(NSString*)table
where:(NSDictionary* _Nullable)whereDict
connection:(SecDbConnectionRef _Nullable)dbconn
error:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (bool)queryDatabaseTable:(NSString*)table
where:(NSDictionary* _Nullable)whereDict
columns:(NSArray*)names
groupBy:(NSArray* _Nullable)groupColumns
orderBy:(NSArray* _Nullable)orderColumns
limit:(ssize_t)limit
processRow:(void (^)(NSDictionary<NSString*, CKKSSQLResult*>*))processRow
error:(NSError* _Nullable __autoreleasing* _Nullable)error;
+ (bool)queryMaxValueForField:(NSString*)maxField
inTable:(NSString*)table
where:(NSDictionary* _Nullable)whereDict
columns:(NSArray*)names
processRow:(void (^)(NSDictionary<NSString*, CKKSSQLResult*>*))processRow;
- (instancetype)memoizeOriginalSelfWhereClause;
+ (NSString *)quotedString:(NSString *)string;
+ (BOOL)performCKKSTransaction:(CKKSDatabaseTransactionResult (^)(void))block;
#pragma mark - Subclasses must implement the following:
+ (instancetype _Nullable)fromDatabaseRow:(NSDictionary<NSString *, CKKSSQLResult *>*)row;
+ (NSArray<NSString*>*)sqlColumns;
+ (NSString*)sqlTable;
- (NSDictionary<NSString*, NSString*>*)sqlValues;
- (NSDictionary<NSString*, NSString*>*)whereClauseToFindSelf;
@end
typedef NS_ENUM(uint64_t, CKKSSQLWhereComparator) {
CKKSSQLWhereComparatorEquals = 1,
CKKSSQLWhereComparatorNotEquals = 2,
CKKSSQLWhereComparatorGreaterThan = 3,
CKKSSQLWhereComparatorLessThan = 4,
};
NSString* CKKSSQLWhereComparatorAsString(CKKSSQLWhereComparator comparator);
typedef NS_ENUM(uint64_t, CKKSSQLWhereColumnName) {
CKKSSQLWhereColumnNameUUID = 1,
CKKSSQLWhereColumnNameParentKeyUUID = 2,
};
NSString* CKKSSQLWhereColumnNameAsString(CKKSSQLWhereColumnName columnName);
@interface CKKSSQLWhereColumn : NSObject
@property CKKSSQLWhereComparator sqlOp;
@property CKKSSQLWhereColumnName columnName;
- (instancetype)initWithOperation:(CKKSSQLWhereComparator)op columnName:(CKKSSQLWhereColumnName)column;
+ (instancetype)op:(CKKSSQLWhereComparator)op column:(CKKSSQLWhereColumnName)columnName;
@end
@interface CKKSSQLWhereValue : NSObject
@property CKKSSQLWhereComparator sqlOp;
@property NSString* value;
- (instancetype)initWithOperation:(CKKSSQLWhereComparator)op value:(NSString*)value;
+ (instancetype)op:(CKKSSQLWhereComparator)op value:(NSString*)value;
@end
@interface CKKSSQLWhereIn : NSObject
@property NSArray<NSString*>* values;
- (instancetype)initWithValues:(NSArray<NSString*>*)values;
@end
NS_ASSUME_NONNULL_END