#ifndef __RELATION__
#define __RELATION__
#include <Security/Security.h>
#include <string>
#include <sys/time.h>
#include <map>
#include "AttachedInstance.h"
class Value
{
protected:
CSSM_DB_ATTRIBUTE_FORMAT mBaseFormat;
public:
Value (CSSM_DB_ATTRIBUTE_FORMAT format);
virtual ~Value ();
virtual CSSM_DB_ATTRIBUTE_FORMAT GetValueType () {return mBaseFormat;} virtual bool Compare (Value *v, CSSM_DB_OPERATOR op) = 0; virtual uint8* CloneContents (AttachedInstance *ai, uint32 &numberOfItems, uint32 &size) = 0; static Value* MakeValueFromAttributeData (const CSSM_DB_ATTRIBUTE_DATA& info); };
class StringValue : public Value
{
protected:
std::string mValue;
public:
StringValue (const char* value); StringValue (const char* value, uint32 length); const char* GetRawValue () {return mValue.c_str ();} std::string& GetRawValueAsStdString () {return mValue;} uint8* CloneContents (AttachedInstance *ai, uint32 &numberOfItems, uint32 &size);
virtual bool Compare (Value *v, CSSM_DB_OPERATOR op);
};
class SInt32Value : public Value
{
protected:
sint32 mValue;
public:
SInt32Value (const sint32 value);
const sint32 GetRawValue () {return mValue;}
uint8* CloneContents (AttachedInstance* ai, uint32 &numberOfItems, uint32 &size);
virtual bool Compare (Value *v, CSSM_DB_OPERATOR op);
};
class UInt32Value : public Value
{
protected:
uint32 mValue;
public:
UInt32Value (const uint32 value);
const uint32 GetRawValue () {return mValue;}
uint8* CloneContents (AttachedInstance *ai, uint32 &numberOfItems, uint32 &size);
virtual bool Compare (Value *v, CSSM_DB_OPERATOR op);
};
class BigNumValue : public Value
{
protected:
uint8* mValue;
size_t mSize;
int mLengthCache;
bool GetSignBit ();
int GetAdjustedLength ();
int GetByte (int which);
bool CompareSignBits (BigNumValue* compare, int &result);
bool CompareLengths (BigNumValue* compare, int &result);
bool CompareValues (BigNumValue* compare, int &result);
public:
BigNumValue (const uint8* value, size_t size);
~BigNumValue ();
const uint8* GetRawValue (size_t &size) {size = mSize; return mValue;}
uint8* CloneContents (AttachedInstance *ai, uint32 &numberOfItems, uint32 &size);
virtual bool Compare (Value *v, CSSM_DB_OPERATOR op);
};
class RealValue : public Value
{
protected:
double mValue;
public:
RealValue (double value);
const double GetRawValue () {return mValue;}
uint8* CloneContents (AttachedInstance *ai, uint32 &numberOfItems, uint32 &size);
virtual bool Compare (Value *v, CSSM_DB_OPERATOR op);
};
class TimeDateValue : public Value
{
protected:
time_t mValue;
public:
TimeDateValue (time_t tv);
TimeDateValue (const char* td);
time_t GetRawValue () {return mValue;}
const char* GetValueAsTimeDate (size_t &size);
virtual bool Compare (Value *v, CSSM_DB_OPERATOR op);
uint8* CloneContents (AttachedInstance *ai, uint32 &numberOfItems, uint32 &size);
};
class BlobValue : public Value
{
protected:
uint8* mValue;
size_t mSize;
public:
BlobValue (const uint8* value, size_t size);
BlobValue (CSSM_DATA data);
BlobValue (CFDataRef data);
BlobValue (CFStringRef data);
const uint8* GetRawValue (size_t &size) {size = mSize; return mValue;}
virtual ~BlobValue ();
uint8* CloneContents (AttachedInstance *ai, uint32 &numberOfItems, uint32 &size);
virtual bool Compare (Value *v, CSSM_DB_OPERATOR op);
};
class Tuple
{
public:
Tuple ();
virtual ~Tuple ();
virtual int GetNumberOfValues () = 0;
virtual Value* GetValue (int which) = 0;
virtual void GetData (CSSM_DATA& data) = 0;
};
class UniqueIdentifier
{
protected:
CSSM_DB_RECORDTYPE mRecordType;
public:
UniqueIdentifier (CSSM_DB_RECORDTYPE recordType);
virtual ~UniqueIdentifier ();
virtual void Export (CSSM_DB_UNIQUE_RECORD &record) = 0;
CSSM_DB_RECORDTYPE GetRecordType () {return mRecordType;}
};
class CssmSelectionPredicate : public CSSM_SELECTION_PREDICATE
{
protected:
void CloneCssmSelectionPredicate (CssmSelectionPredicate &a, const CssmSelectionPredicate &b);
public:
CssmSelectionPredicate () {}
CssmSelectionPredicate (const CssmSelectionPredicate& pred);
~CssmSelectionPredicate ();
void operator= (const CssmSelectionPredicate& pred);
CSSM_DB_ATTRIBUTE_NAME_FORMAT GetAttributeNameFormat () {return Attribute.Info.AttributeNameFormat;}
uint32 GetAttributeID () {return Attribute.Info.Label.AttributeID;}
char* GetAttributeName () {return Attribute.Info.Label.AttributeName;}
uint32 GetNumAttributes () {return Attribute.NumberOfValues;}
CSSM_DATA& GetValue (int i) {return Attribute.Value[i];}
CSSM_DB_OPERATOR GetOperator () {return DbOperator;}
};
class Relation;
class Query
{
protected:
uint32 mNumSelectionPredicates; CssmSelectionPredicate *mSelectionPredicates; CSSM_DB_CONJUNCTIVE mConjunction; Value** mValues; int *mColumnIDs; Relation* mRelation;
bool EvaluateTuple (Tuple *t);
public:
Query (Relation* relation, const CSSM_QUERY *queryBase);
virtual ~Query ();
Relation* GetRelation () {return mRelation;}
virtual Tuple* GetNextTuple (UniqueIdentifier *&id) = 0; };
class Relation
{
protected:
CSSM_DB_RECORDTYPE mRecordType;
public:
Relation (CSSM_DB_RECORDTYPE recordType);
virtual ~Relation ();
CSSM_DB_RECORDTYPE GetRecordType () {return mRecordType;}
virtual uint32 GetColumnIDs (int i) = 0;
virtual int GetNumberOfColumns () = 0;
virtual int GetColumnNumber (const char* columnName) = 0;
virtual int GetColumnNumber (uint32 columnID) = 0;
virtual Query* MakeQuery (const CSSM_QUERY* query) = 0;
virtual Tuple* GetTupleFromUniqueIdentifier (UniqueIdentifier* uniqueID) = 0;
virtual UniqueIdentifier* ImportUniqueIdentifier (CSSM_DB_UNIQUE_RECORD *uniqueRecord) = 0;
};
typedef std::map<CSSM_DB_RECORDTYPE, Relation*> RelationMap;
#endif