2 * Copyright (c) 2013-2014 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@
25 @header SecItemDb.h - A Database full of SecDbItems.
28 #ifndef _SECURITYD_SECITEMDB_H_
29 #define _SECURITYD_SECITEMDB_H_
31 #include <securityd/SecDbQuery.h>
33 #define CURRENT_DB_VERSION 6
39 // MARK: SecItemDb (a SecDb of SecDbItems)
41 typedef struct SecItemDb
*SecItemDbRef
;
42 typedef struct SecItemDbConnection
*SecItemDbConnectionRef
;
47 CFDictionaryRef classes
; // className -> SecItemClass mapping
50 struct SecItemDbConnection
{
51 SecDbConnectionRef db
;
54 SecItemDbRef
SecItemDbCreate(SecDbRef db
);
55 SecItemDbRef
SecItemDbRegisterClass(SecItemDbRef db
, const SecDbClass
*class, void(^upgrade
)(SecDbItemRef item
, uint32_t current_version
));
57 SecItemDbConnectionRef
SecItemDbAquireConnection(SecItemDbRef db
);
58 void SecItemDbReleaseConnection(SecItemDbRef db
, SecItemDbConnectionRef dbconn
);
60 bool SecItemDbInsert(SecItemDbConnectionRef dbconn
, SecDbItemRef item
, CFErrorRef
*error
);
62 bool SecItemDbDelete(SecItemDbConnectionRef dbconn
, SecDbItemRef item
, CFErrorRef
*error
);
64 // Low level update, just do the update
65 bool SecItemDbDoUpdate(SecItemDbConnectionRef dbconn
, SecDbItemRef old_item
, SecDbItemRef new_item
, CFErrorRef
*error
,
66 bool (^use_attr_in_where
)(const SecDbAttr
*attr
));
68 // High level update, will replace tombstones and create them if needed.
69 bool SecItemDbUpdate(SecItemDbConnectionRef dbconn
, SecDbItemRef old_item
, SecDbItemRef new_item
, CFErrorRef
*error
);
71 bool SecItemDbSelect(SecItemDbConnectionRef dbconn
, SecDbQueryRef query
, CFErrorRef
*error
,
72 bool (^use_attr_in_where
)(const SecDbAttr
*attr
),
73 bool (^add_where_sql
)(CFMutableStringRef sql
, bool *needWhere
),
74 bool (^bind_added_where
)(sqlite3_stmt
*stmt
, int col
),
75 void (^handle_row
)(SecDbItemRef item
, bool *stop
));
78 CFTypeRef
SecDbItemCopyResult(SecDbItemRef item
, ReturnTypeMask return_type
, CFErrorRef
*error
);
80 bool SecDbItemSelect(SecDbQueryRef query
, SecDbConnectionRef dbconn
, CFErrorRef
*error
,
81 bool (^use_attr_in_where
)(const SecDbAttr
*attr
),
82 bool (^add_where_sql
)(CFMutableStringRef sql
, bool *needWhere
),
83 bool (^bind_added_where
)(sqlite3_stmt
*stmt
, int col
),
84 void (^handle_row
)(SecDbItemRef item
, bool *stop
));
86 CFStringRef
SecDbItemCopySelectSQL(SecDbQueryRef query
,
87 bool (^return_attr
)(const SecDbAttr
*attr
),
88 bool (^use_attr_in_where
)(const SecDbAttr
*attr
),
89 bool (^add_where_sql
)(CFMutableStringRef sql
, bool *needWhere
));
90 bool SecDbItemSelectBind(SecDbQueryRef query
, sqlite3_stmt
*stmt
, CFErrorRef
*error
,
91 bool (^use_attr_in_where
)(const SecDbAttr
*attr
),
92 bool (^bind_added_where
)(sqlite3_stmt
*stmt
, int col
));
94 bool SecDbItemQuery(SecDbQueryRef query
, CFArrayRef accessGroups
, SecDbConnectionRef dbconn
, CFErrorRef
*error
,
95 void (^handle_row
)(SecDbItemRef item
, bool *stop
));
99 // MARK: backup restore stuff
102 /* Forward declaration of import export SPIs. */
105 kSecSysBoundItemFilter
,
106 kSecBackupableItemFilter
,
109 CF_RETURNS_RETAINED CFDictionaryRef
SecServerExportKeychainPlist(SecDbConnectionRef dbt
,
110 keybag_handle_t src_keybag
, keybag_handle_t dest_keybag
,
111 enum SecItemFilter filter
, CFErrorRef
*error
);
112 bool SecServerImportKeychainInPlist(SecDbConnectionRef dbt
,
113 keybag_handle_t src_keybag
, keybag_handle_t dest_keybag
,
114 CFDictionaryRef keychain
, enum SecItemFilter filter
, CFErrorRef
*error
);
116 void SecDbAppendCreateTableWithClass(CFMutableStringRef sql
, const SecDbClass
*c
);
117 bool kc_transaction(SecDbConnectionRef dbt
, CFErrorRef
*error
, bool(^perform
)());
118 bool s3dl_copy_matching(SecDbConnectionRef dbt
, Query
*q
, CFTypeRef
*result
,
119 CFArrayRef accessGroups
, CFErrorRef
*error
);
120 bool s3dl_query_add(SecDbConnectionRef dbt
, Query
*q
, CFTypeRef
*result
, CFErrorRef
*error
);
121 bool s3dl_query_update(SecDbConnectionRef dbt
, Query
*q
,
122 CFDictionaryRef attributesToUpdate
, CFArrayRef accessGroups
, CFErrorRef
*error
);
123 bool s3dl_query_delete(SecDbConnectionRef dbt
, Query
*q
, CFArrayRef accessGroups
, CFErrorRef
*error
);
124 const SecDbAttr
*SecDbAttrWithKey(const SecDbClass
*c
, CFTypeRef key
, CFErrorRef
*error
);
126 bool s3dl_dbt_keys_current(SecDbConnectionRef dbt
, uint32_t current_generation
, CFErrorRef
*error
);
127 bool s3dl_dbt_update_keys(SecDbConnectionRef dbt
, CFErrorRef
*error
);
131 #endif /* _SECURITYD_SECITEMDB_H_ */