/ Analytics / SQLite / SFSQLite.h
SFSQLite.h
  1  /*
  2   * Copyright (c) 2017 Apple Inc. All Rights Reserved.
  3   *
  4   * @APPLE_LICENSE_HEADER_START@
  5   *
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   *
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   *
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  // Header exposed for unit testing only
 25  
 26  #ifndef SECURITY_SFSQL_H
 27  #define SECURITY_SFSQL_H 1
 28  
 29  #if __OBJC2__
 30  
 31  #import <Foundation/Foundation.h>
 32  #import <sqlite3.h>
 33  
 34  @class SFSQLiteStatement;
 35  
 36  typedef SInt64 SFSQLiteRowID;
 37  @class SFSQLite;
 38  
 39  NSArray *SFSQLiteJournalSuffixes(void);
 40  
 41  typedef NS_ENUM(NSInteger, SFSQLiteSynchronousMode) {
 42      SFSQLiteSynchronousModeOff = 0,
 43      SFSQLiteSynchronousModeNormal = 1, // default
 44      SFSQLiteSynchronousModeFull = 2
 45  };
 46  
 47  @protocol SFSQLiteDelegate <NSObject>
 48  @property (nonatomic, readonly) SInt32 userVersion;
 49  
 50  - (BOOL)migrateDatabase:(SFSQLite *)db fromVersion:(SInt32)version;
 51  @end
 52  
 53  // Wrapper around the SQLite API. Typically subclassed to add table accessor methods.
 54  @interface SFSQLite : NSObject {
 55  @private
 56      id<SFSQLiteDelegate> _delegate;
 57      NSString* _path;
 58      NSString* _schema;
 59      NSString* _schemaVersion;
 60      NSMutableDictionary* _statementsBySQL;
 61      NSString* _objectClassPrefix;
 62      SFSQLiteSynchronousMode _synchronousMode;
 63      SInt32 _userVersion;
 64      sqlite3* _db;
 65      NSUInteger _openCount;
 66      NSDateFormatter* _dateFormatter;
 67  #if DEBUG
 68      NSMutableDictionary* _unitTestOverrides;
 69  #endif
 70      BOOL _hasMigrated;
 71      BOOL _corrupt;
 72      BOOL _traced;
 73  }
 74  
 75  - (instancetype)initWithPath:(NSString *)path schema:(NSString *)schema;
 76      
 77  @property (nonatomic, readonly, strong) NSString   *path;
 78  @property (nonatomic, readonly, strong) NSString   *schema;
 79  @property (nonatomic, readonly, strong) NSString   *schemaVersion;
 80  @property (nonatomic, strong)           NSString   *objectClassPrefix;
 81  @property (nonatomic, assign)           SInt32     userVersion;
 82  @property (nonatomic, assign)           SFSQLiteSynchronousMode synchronousMode;
 83  @property (nonatomic, readonly)         BOOL       isOpen;
 84  @property (nonatomic, readonly)         BOOL       hasMigrated;
 85  @property (nonatomic, assign)           BOOL       traced;
 86  
 87  @property (nonatomic, strong) id<SFSQLiteDelegate> delegate;
 88  
 89  #if DEBUG
 90  @property (nonatomic, strong) NSDictionary* unitTestOverrides;
 91  #endif
 92  
 93  // Open/close the underlying database file read/write. Initially, the database is closed.
 94  - (void)open;
 95  - (BOOL)openWithError:(NSError **)error;
 96  - (void)close;
 97  
 98  // Remove the database file.
 99  - (void)remove;
100  
101  // Database exclusive transaction operations.
102  - (void)begin;
103  - (void)end;
104  - (void)rollback;
105  
106  // Database maintenance.
107  - (void)analyze;
108  - (void)vacuum;
109  
110  // The rowID assigned to the last record inserted into the database.
111  - (SFSQLiteRowID)lastInsertRowID;
112  
113  // returns the number of rows modified, inserted or deleted by the most recently completed INSERT, UPDATE or DELETE statement on the database connection
114  - (int)changes;
115  
116  // Execute one-or-more queries. Use prepared statements for anything performance critical.
117  - (BOOL)executeSQL:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2);
118  - (BOOL)executeSQL:(NSString *)format arguments:(va_list)args NS_FORMAT_FUNCTION(1, 0);
119  
120  // Prepared statement pool accessors. Statements must be reset after they're used.
121  - (SFSQLiteStatement *)statementForSQL:(NSString *)SQL;
122  - (void)removeAllStatements;
123  
124  // Accessors for all the tables created in the database.
125  - (NSArray *)allTableNames;
126  - (void)dropAllTables;
127  
128  // Generic key/value properties set in the database.
129  - (NSString *)propertyForKey:(NSString *)key;
130  - (void)setProperty:(NSString *)value forKey:(NSString *)key;
131  - (NSDate *)datePropertyForKey:(NSString *)key;
132  - (void)setDateProperty:(NSDate *)value forKey:(NSString *)key;
133  - (void)removePropertyForKey:(NSString *)key;
134  
135  // Date the cache was created.
136  - (NSDate *)creationDate;
137  
138  // Convience calls that generate and execute statements.
139  - (NSArray *)selectAllFrom:(NSString *)tableName where:(NSString *)whereSQL bindings:(NSArray *)bindings;
140  - (NSArray *)select:(NSArray *)columns from:(NSString *)tableName;
141  - (NSArray *)select:(NSArray *)columns from:(NSString *)tableName where:(NSString *)whereSQL bindings:(NSArray *)bindings;
142  - (void)select:(NSArray *)columns from:(NSString *)tableName where:(NSString *)whereSQL bindings:(NSArray *)bindings orderBy:(NSArray *)orderBy limit:(NSNumber *)limit block:(void (^)(NSDictionary *resultDictionary, BOOL *stop))block;
143  - (void)selectFrom:(NSString *)tableName where:(NSString *)whereSQL bindings:(NSArray *)bindings orderBy:(NSArray *)orderBy limit:(NSNumber *)limit block:(void (^)(NSDictionary *resultDictionary, BOOL *stop))block;
144  - (NSUInteger)selectCountFrom:(NSString *)tableName  where:(NSString *)whereSQL bindings:(NSArray *)bindings;
145  - (SFSQLiteRowID)insertOrReplaceInto:(NSString *)tableName values:(NSDictionary *)valuesByColumnName;
146  - (void)deleteFrom:(NSString *)tableName where:(NSString *)whereSQL bindings:(NSArray *)bindings;
147  - (void)update:(NSString *)tableName set:(NSString *)setSQL where:(NSString *)whereSQL bindings:(NSArray *)whereBindings limit:(NSNumber *)limit;
148  - (void)deleteFrom:(NSString *)tableName matchingValues:(NSDictionary *)valuesByColumnName;
149  - (NSSet<NSString*> *)columnNamesForTable:(NSString*)tableName;
150  
151  - (SInt32)dbUserVersion;
152  
153  @end
154  
155  #endif /* __OBJC2__ */
156  #endif /* SECURITY_SFSQL_H */