]> git.saurik.com Git - apple/security.git/blob - OSX/include/security_cdsa_client/dlquery.cpp
Security-57336.1.9.tar.gz
[apple/security.git] / OSX / include / security_cdsa_client / dlquery.cpp
1 /*
2 * Copyright (c) 2000-2004,2011-2012,2014 Apple Inc. All Rights Reserved.
3 *
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
8 * using this file.
9 *
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
16 */
17
18
19 //
20 // dlquery - search query sublanguage for DL and MDS queries
21 //
22 #include <security_cdsa_client/dlquery.h>
23
24
25 namespace Security {
26 namespace CssmClient {
27
28
29 //
30 // Constructing Relations
31 //
32 Comparison::Comparison(const Comparison &r)
33 : mName(r.mName), mOperator(r.mOperator), mFormat(r.mFormat),
34 mValue(Allocator::standard())
35 {
36 mValue.copy(r.mValue);
37 }
38
39 Comparison &Comparison::operator = (const Comparison &r)
40 {
41 mName = r.mName;
42 mOperator = r.mOperator;
43 mFormat = r.mFormat;
44 mValue.copy(r.mValue);
45 return *this;
46 }
47
48
49 Comparison::Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, const char *s)
50 : mName(attr.name()), mOperator(op), mFormat(CSSM_DB_ATTRIBUTE_FORMAT_STRING),
51 mValue(Allocator::standard(), StringData(s))
52 { }
53
54 Comparison::Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, const std::string &s)
55 : mName(attr.name()), mOperator(op), mFormat(CSSM_DB_ATTRIBUTE_FORMAT_STRING),
56 mValue(Allocator::standard(), StringData(s))
57 { }
58
59 Comparison::Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, uint32 value)
60 : mName(attr.name()), mOperator(op), mFormat(CSSM_DB_ATTRIBUTE_FORMAT_UINT32),
61 mValue(Allocator::standard(), CssmData::wrap(value))
62 { }
63
64 Comparison::Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, bool value)
65 : mName(attr.name()), mOperator(op), mFormat(CSSM_DB_ATTRIBUTE_FORMAT_UINT32),
66 mValue(Allocator::standard(), CssmData::wrap(uint32(value ? 1 : 0)))
67 { }
68
69 Comparison::Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, const CssmData &data)
70 : mName(attr.name()), mOperator(op), mFormat(CSSM_DB_ATTRIBUTE_FORMAT_BLOB),
71 mValue(Allocator::standard(), data)
72 { }
73
74 Comparison::Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, const CSSM_GUID &guid)
75 : mName(attr.name()), mOperator(op), mFormat(CSSM_DB_ATTRIBUTE_FORMAT_STRING),
76 mValue(Allocator::standard(), StringData(Guid::overlay(guid).toString()))
77 {
78 }
79
80
81 Comparison::Comparison(const Attribute &attr)
82 : mName(attr.name()), mOperator(CSSM_DB_NOT_EQUAL), mFormat(CSSM_DB_ATTRIBUTE_FORMAT_UINT32),
83 mValue(Allocator::standard(), CssmData::wrap(uint32(CSSM_FALSE)))
84 {
85 }
86
87 Comparison operator ! (const Attribute &attr)
88 {
89 return Comparison(attr, CSSM_DB_EQUAL, uint32(CSSM_FALSE));
90 }
91
92
93 //
94 // Query methods
95 //
96 Query &Query::operator = (const Query &q)
97 {
98 mRelations = q.mRelations;
99 mQueryValid = false;
100 return *this;
101 }
102
103
104 //
105 // Form the CssmQuery from a Query object.
106 // We cache this in mQuery, which we have made sure isn't copied along.
107 //
108 const CssmQuery &Query::cssmQuery() const
109 {
110 if (!mQueryValid) {
111 // record type remains at ANY
112 mQuery.conjunctive(CSSM_DB_AND);
113 for (vector<Comparison>::const_iterator it = mRelations.begin(); it != mRelations.end(); it++) {
114 CssmSelectionPredicate pred;
115 pred.dbOperator(it->mOperator);
116 pred.attribute().info() = CssmDbAttributeInfo(it->mName.c_str(), it->mFormat);
117 pred.attribute().set(it->mValue.get());
118 mPredicates.push_back(pred);
119 }
120 mQuery.set((uint32)mPredicates.size(), &mPredicates[0]);
121 mQueryValid = true;
122 }
123 return mQuery;
124 }
125
126
127 } // end namespace CssmClient
128 } // end namespace Security