2  * Copyright (c) 2017 Apple Inc. All Rights Reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   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 
  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. 
  21  * @APPLE_LICENSE_HEADER_END@ 
  24 // Header exposed for unit testing only 
  26 #ifndef SECURITY_SFSQL_H 
  27 #define SECURITY_SFSQL_H 1 
  31 #import <Foundation/Foundation.h> 
  34 @
class SFSQLiteStatement
; 
  36 typedef SInt64 SFSQLiteRowID
; 
  39 NSArray 
*SFSQLiteJournalSuffixes(void); 
  41 typedef NS_ENUM(NSInteger
, SFSQLiteSynchronousMode
) { 
  42     SFSQLiteSynchronousModeOff 
= 0, 
  43     SFSQLiteSynchronousModeNormal 
= 1, // default 
  44     SFSQLiteSynchronousModeFull 
= 2 
  47 @protocol SFSQLiteDelegate 
<NSObject
> 
  48 @
property (nonatomic
, readonly
) SInt32 userVersion
; 
  50 - (BOOL
)migrateDatabase
:(SFSQLite 
*)db fromVersion
:(SInt32
)version
; 
  53 // Wrapper around the SQLite API. Typically subclassed to add table accessor methods. 
  54 @interface SFSQLite 
: NSObject 
{ 
  56     id
<SFSQLiteDelegate
> _delegate
; 
  59     NSString
* _schemaVersion
; 
  60     NSMutableDictionary
* _statementsBySQL
; 
  61     NSString
* _objectClassPrefix
; 
  62     SFSQLiteSynchronousMode _synchronousMode
; 
  65     NSUInteger _openCount
; 
  66     NSDateFormatter
* _dateFormatter
; 
  68     NSMutableDictionary
* _unitTestOverrides
; 
  75 - (instancetype
)initWithPath
:(NSString 
*)path schema
:(NSString 
*)schema
; 
  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
; 
  87 @
property (nonatomic
, strong
) id
<SFSQLiteDelegate
> delegate
; 
  90 @
property (nonatomic
, strong
) NSDictionary
* unitTestOverrides
; 
  93 // Open/close the underlying database file read/write. Initially, the database is closed. 
  95 - (BOOL
)openWithError
:(NSError 
**)error
; 
  98 // Remove the database file. 
 101 // Database exclusive transaction operations. 
 106 // Database maintenance. 
 110 // The rowID assigned to the last record inserted into the database. 
 111 - (SFSQLiteRowID
)lastInsertRowID
; 
 113 // returns the number of rows modified, inserted or deleted by the most recently completed INSERT, UPDATE or DELETE statement on the database connection 
 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); 
 120 // Prepared statement pool accessors. Statements must be reset after they're used. 
 121 - (SFSQLiteStatement 
*)statementForSQL
:(NSString 
*)SQL
; 
 122 - (void)removeAllStatements
; 
 124 // Accessors for all the tables created in the database. 
 125 - (NSArray 
*)allTableNames
; 
 126 - (void)dropAllTables
; 
 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
; 
 135 // Date the cache was created. 
 136 - (NSDate 
*)creationDate
; 
 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
; 
 151 - (SInt32
)dbUserVersion
; 
 155 #endif /* __OBJC2__ */ 
 156 #endif /* SECURITY_SFSQL_H */