#ifndef _SECURITYD_SECDBQUERY_H_
#define _SECURITYD_SECDBQUERY_H_
#include "keychain/securityd/SecKeybagSupport.h"
#include "keychain/securityd/SecDbItem.h"
__BEGIN_DECLS
typedef struct Pair *SecDbPairRef;
typedef struct Query *SecDbQueryRef;
typedef uint32_t ReturnTypeMask;
enum
{
kSecReturnDataMask = 1 << 0,
kSecReturnAttributesMask = 1 << 1,
kSecReturnRefMask = 1 << 2,
kSecReturnPersistentRefMask = 1 << 3,
};
enum
{
kSecMatchUnlimited = kCFNotFound
};
typedef struct Pair
{
const void *key;
const void *value;
} Pair;
typedef struct Query
{
const SecDbClass *q_class;
CFMutableDictionaryRef q_item;
CFIndex q_match_begin;
CFIndex q_match_end;
CFIndex q_attr_end;
CFErrorRef q_error;
ReturnTypeMask q_return_type;
CFDataRef q_data;
CFTypeRef q_ref;
sqlite_int64 q_row_id;
CFArrayRef q_use_item_list;
CFBooleanRef q_use_tomb;
CFIndex q_limit;
bool q_sync;
bool q_changed;
bool q_sync_changed;
keybag_handle_t q_keybag;
CFDataRef q_musrView;
SecAccessControlRef q_access_control;
CFDataRef q_use_cred_handle;
bool q_skip_acl_items;
bool q_uuid_from_primary_key;
__unsafe_unretained SecBoolCFErrorCallback q_add_sync_callback;
CFDataRef q_primary_key_digest;
CFArrayRef q_match_issuer;
CFArrayRef q_caller_access_groups;
bool q_system_keychain;
int32_t q_sync_bubble;
bool q_spindump_on_failure;
SecPolicyRef q_match_policy;
CFDateRef q_match_valid_on_date;
CFBooleanRef q_match_trusted_only;
CFDataRef q_token_object_id;
CFIndex q_pairs_count;
Pair q_pairs[];
} Query;
Query *query_create(const SecDbClass *qclass, CFDataRef musr, CFDictionaryRef query, CFErrorRef *error);
bool query_destroy(Query *q, CFErrorRef *error);
bool query_error(Query *q, CFErrorRef *error);
Query *query_create_with_limit(CFDictionaryRef query, CFDataRef musr, CFIndex limit, CFErrorRef *error);
void query_add_attribute(const void *key, const void *value, Query *q);
void query_add_or_attribute(const void *key, const void *value, Query *q);
void query_add_not_attribute(const void *key, const void *value, Query *q);
void query_add_attribute_with_desc(const SecDbAttr *desc, const void *value, Query *q);
void query_ensure_access_control(Query *q, CFStringRef agrp);
void query_pre_add(Query *q, bool force_date);
bool query_notify_and_destroy(Query *q, bool ok, CFErrorRef *error);
CFIndex query_match_count(const Query *q);
CFIndex query_attr_count(const Query *q);
Pair query_attr_at(const Query *q, CFIndex ix);
bool query_update_parse(Query *q, CFDictionaryRef update, CFErrorRef *error);
const SecDbClass *kc_class_with_name(CFStringRef name);
void query_set_caller_access_groups(Query *q, CFArrayRef caller_access_groups);
void query_set_policy(Query *q, SecPolicyRef policy);
void query_set_valid_on_date(Query *q, CFDateRef policy);
void query_set_trusted_only(Query *q, CFBooleanRef trusted_only);
CFDataRef
SecMUSRCopySystemKeychainUUID(void);
CFDataRef
SecMUSRGetSystemKeychainUUID(void);
CFDataRef
SecMUSRGetSingleUserKeychainUUID(void);
bool
SecMUSRIsSingleUserView(CFDataRef uuid);
CFDataRef
SecMUSRGetAllViews(void);
bool
SecMUSRIsViewAllViews(CFDataRef musr);
#if TARGET_OS_IPHONE
CFDataRef
SecMUSRCreateActiveUserUUID(uid_t uid);
CFDataRef
SecMUSRCreateSyncBubbleUserUUID(uid_t uid);
CFDataRef
SecMUSRCreateBothUserAndSystemUUID(uid_t uid);
bool
SecMUSRGetBothUserAndSystemUUID(CFDataRef musr, uid_t *uid);
#endif
__END_DECLS
#endif