#ifndef _TOKEND_SCHEMA_H_
#define _TOKEND_SCHEMA_H_
#include <security_cdsa_utilities/cssmdata.h>
#include <security_cdsa_utilities/cssmdb.h>
#include <map>
#include "MetaRecord.h"
#include "Relation.h"
#include "AttributeCoder.h"
namespace Tokend
{
class Relation;
class Schema
{
NOCOPY(Schema)
public:
typedef std::map<RelationId, Relation *> RelationMap;
typedef RelationMap::const_iterator ConstRelationMapIterator;
Schema();
virtual ~Schema();
virtual void create();
const Relation &findRelation(RelationId inRelationId) const;
Relation &findRelation(RelationId inRelationId);
MetaRecord &findMetaRecord(RelationId inRelationId);
ConstRelationMapIterator begin() const { return mRelationMap.begin(); }
ConstRelationMapIterator end() const { return mRelationMap.end(); }
const LinkedRecordAttributeCoder &publicKeyHashCoder() const
{ return mPublicKeyHashCoder; }
protected:
Relation *createRelation(const std::string &relationName,
RelationId relationId);
Relation *createStandardRelation(RelationId relationId);
MetaAttribute &createAttribute(Relation &relation,
const std::string *name, uint32 attributeId,
CSSM_DB_ATTRIBUTE_FORMAT attributeFormat, bool isIndex);
private:
Relation *createRelation(MetaRecord *inMetaRecord);
void registerRelation(const std::string &relationName,
RelationId relationId);
void registerAttribute(RelationId relationId, const std::string *name,
uint32 attributeId, CSSM_DB_ATTRIBUTE_FORMAT attributeFormat,
bool isIndex);
private:
Relation *mInfo, *mAttributes, *mIndices;
RelationMap mRelationMap;
uint32 io_rid;
uint32 io_rn;
uint32 as_rid;
uint32 as_aid;
uint32 as_anf;
uint32 as_an;
uint32 as_anid;
uint32 as_af;
uint32 ix_rid;
uint32 ix_iid;
uint32 ix_aid;
uint32 ix_it;
uint32 ix_idl;
protected:
ConstAttributeCoder mTrueCoder;
ConstAttributeCoder mFalseCoder;
ConstAttributeCoder mCertEncodingBERCoder;
GuidAttributeCoder mSdCSPDLGuidCoder;
CertificateAttributeCoder mCertificateCoder;
ZeroAttributeCoder mZeroCoder;
ConstAttributeCoder mPublicKeyClassCoder;
ConstAttributeCoder mPrivateKeyClassCoder;
ConstAttributeCoder mSessionKeyClassCoder;
KeyDataAttributeCoder mKeyDataCoder;
LinkedRecordAttributeCoder mPublicKeyHashCoder;
DataAttributeCoder mDataAttributeCoder;
DescriptionAttributeCoder mDescriptionCoder;
};
}
#endif