/ OSX / libsecurity_cdsa_client / lib / dlquery.cpp
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