#ifndef _TOKEND_DBVALUE_H_
#define _TOKEND_DBVALUE_H_
#include <security_cdsa_utilities/cssmdata.h>
#include <security_cdsa_utilities/cssmdb.h>
#include <Security/cssmerr.h>
#include <map>
#include <vector>
namespace Tokend
{
class DbValue
{
NOCOPY(DbValue)
public:
DbValue();
virtual ~DbValue() = 0;
};
template <class T>
class BasicValue : public DbValue
{
NOCOPY(BasicValue)
public:
BasicValue() {}
BasicValue(T value) : mValue(value) {}
bool evaluate(const BasicValue<T> &other, CSSM_DB_OPERATOR op) const
{
switch (op)
{
case CSSM_DB_EQUAL: return mValue == other.mValue;
case CSSM_DB_NOT_EQUAL: return mValue != other.mValue;
case CSSM_DB_LESS_THAN: return mValue < other.mValue;
case CSSM_DB_GREATER_THAN: return mValue > other.mValue;
default: CssmError::throwMe(CSSMERR_DL_UNSUPPORTED_QUERY);
}
}
size_t size() const { return sizeof(T); }
const uint8 *bytes() const
{ return reinterpret_cast<const uint8 *>(&mValue); }
protected:
T mValue;
};
class UInt32Value : public BasicValue<uint32>
{
NOCOPY(UInt32Value)
public:
UInt32Value(const CSSM_DATA &data);
virtual ~UInt32Value();
};
class SInt32Value : public BasicValue<sint32>
{
NOCOPY(SInt32Value)
public:
SInt32Value(const CSSM_DATA &data);
virtual ~SInt32Value();
};
class DoubleValue : public BasicValue<double>
{
NOCOPY(DoubleValue)
public:
DoubleValue(const CSSM_DATA &data);
virtual ~DoubleValue();
};
class BlobValue : public DbValue, public CssmData
{
NOCOPY(BlobValue)
public:
BlobValue() {}
BlobValue(const CSSM_DATA &data);
virtual ~BlobValue();
bool evaluate(const BlobValue &other, CSSM_DB_OPERATOR op) const;
size_t size() const { return Length; }
const uint8 *bytes() const { return Data; }
protected:
class Comparator {
public:
virtual ~Comparator();
virtual int operator ()(const uint8 *ptr1, const uint8 *ptr2,
uint32 length);
};
static bool evaluate(const CssmData &data1, const CssmData &data2,
CSSM_DB_OPERATOR op, Comparator compare);
};
class TimeDateValue : public BlobValue
{
NOCOPY(TimeDateValue)
public:
enum { kTimeDateSize = 16 };
TimeDateValue(const CSSM_DATA &data);
virtual ~TimeDateValue();
bool isValidDate() const;
private:
uint32 rangeValue(uint32 start, uint32 length) const;
};
class StringValue : public BlobValue
{
NOCOPY(StringValue)
public:
StringValue(const CSSM_DATA &data);
virtual ~StringValue();
bool evaluate(const StringValue &other, CSSM_DB_OPERATOR op) const;
private:
class Comparator : public BlobValue::Comparator {
public:
virtual int operator ()(const uint8 *ptr1, const uint8 *ptr2,
uint32 length);
};
};
class BigNumValue : public BlobValue
{
NOCOPY(BigNumValue)
public:
static const uint8 kSignBit = 0x80;
BigNumValue(const CSSM_DATA &data);
virtual ~BigNumValue();
bool evaluate(const BigNumValue &other, CSSM_DB_OPERATOR op) const;
private:
static int compare(const uint8 *a, const uint8 *b, int length);
};
class MultiUInt32Value : public DbValue
{
NOCOPY(MultiUInt32Value)
public:
MultiUInt32Value(const CSSM_DATA &data);
virtual ~MultiUInt32Value();
bool evaluate(const MultiUInt32Value &other, CSSM_DB_OPERATOR op) const;
size_t size() const { return mNumValues * sizeof(uint32); }
const uint8 *bytes() const { return reinterpret_cast<uint8 *>(mValues); }
private:
uint32 mNumValues;
uint32 *mValues;
bool mOwnsValues;
};
}
#endif