dlquery.h
  1  /*
  2   * Copyright (c) 2004,2011,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  
 23  #ifndef _H_CDSA_CLIENT_DLQUERY
 24  #define _H_CDSA_CLIENT_DLQUERY
 25  
 26  #include <security_cdsa_utilities/cssmdb.h>
 27  #include <string>
 28  #include <vector>
 29  
 30  
 31  namespace Security {
 32  namespace CssmClient {
 33  
 34  
 35  //
 36  // A DL record attribute
 37  //
 38  class Attribute {
 39  public:
 40  	Attribute(const std::string &name) : mName(name) { }
 41  	Attribute(const char *name) : mName(name) { }
 42  	
 43  	const std::string &name() const { return mName; }
 44  
 45  private:
 46  	std::string mName;
 47  };
 48  
 49  
 50  //
 51  // A comparison (attribute ~rel~ constant-value)
 52  //
 53  class Comparison {
 54  	friend class Query;
 55  public:
 56  	Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, const char *s);
 57  	Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, const std::string &s);
 58  	Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, uint32 v);
 59  	Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, bool v);
 60  	Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, const CSSM_GUID &guid);
 61  	Comparison(const Attribute &attr, CSSM_DB_OPERATOR op, const CssmData &data);
 62  	
 63  	Comparison(const Attribute &attr);
 64  	friend Comparison operator ! (const Attribute &attr);
 65  	
 66  	Comparison(const Comparison &r);
 67  	Comparison &operator = (const Comparison &r);
 68  	
 69  private:
 70  	std::string mName;
 71  	CSSM_DB_OPERATOR mOperator;
 72  	CSSM_DB_ATTRIBUTE_FORMAT mFormat;
 73  	CssmAutoData mValue;
 74  };
 75  
 76  template <class Value>
 77  Comparison operator == (const Attribute &attr, const Value &value)
 78  { return Comparison(attr, CSSM_DB_EQUAL, value); }
 79  
 80  template <class Value>
 81  Comparison operator != (const Attribute &attr, const Value &value)
 82  { return Comparison(attr, CSSM_DB_NOT_EQUAL, value); }
 83  
 84  template <class Value>
 85  Comparison operator < (const Attribute &attr, const Value &value)
 86  { return Comparison(attr, CSSM_DB_LESS_THAN, value); }
 87  
 88  template <class Value>
 89  Comparison operator > (const Attribute &attr, const Value &value)
 90  { return Comparison(attr, CSSM_DB_GREATER_THAN, value); }
 91  
 92  template <class Value>
 93  Comparison operator % (const Attribute &attr, const Value &value)
 94  { return Comparison(attr, CSSM_DB_CONTAINS, value); }
 95  
 96  
 97  //
 98  // A Query
 99  //
100  class Query {
101  public:
102  	Query() : mQueryValid(false) { }
103  	Query(const Comparison r) : mQueryValid(false) { mRelations.push_back(r); }
104  	Query(const Attribute &attr) : mQueryValid(false) { mRelations.push_back(attr); }
105  	
106  	Query(const Query &q) : mRelations(q.mRelations), mQueryValid(false) { }
107  	
108  	Query &operator = (const Query &q);
109  	
110  	Query &add(const Comparison &r)
111  	{ mRelations.push_back(r); return *this; }
112  	
113  	const CssmQuery &cssmQuery() const;
114  
115  private:
116  	std::vector<Comparison> mRelations;
117  	
118  	// cached CssmQuery equivalent of this object
119  	mutable bool mQueryValid;   // mQuery has been constructed
120  	mutable vector<CssmSelectionPredicate> mPredicates; // holds lifetimes for mQuery
121  	mutable CssmQuery mQuery;
122  };
123  
124  inline Query operator && (Query c, const Comparison &r)
125  { return c.add(r); }
126  
127  
128  } // end namespace CssmClient
129  } // end namespace Security
130  
131  #endif // _H_CDSA_CLIENT_DLQUERY