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 */