#ifndef _TOKEND_CURSOR_H_
#define _TOKEND_CURSOR_H_
#include "Relation.h"
#include "Schema.h"
#include <security_cdsa_utilities/handleobject.h>
#include <vector>
namespace Tokend
{
class MetaRecord;
class RecordHandle;
class Relation;
class SelectionPredicate;
class Cursor : public HandleObject
{
NOCOPY(Cursor)
public:
Cursor();
virtual ~Cursor() = 0;
virtual RecordHandle *next(TokenContext *tokenContext) = 0;
};
class LinearCursor : public Cursor
{
NOCOPY(LinearCursor)
public:
LinearCursor(const CSSM_QUERY *inQuery, const Relation &inRelation);
virtual ~LinearCursor();
virtual RecordHandle *next(TokenContext *tokenContext);
private:
Relation::const_iterator mIterator;
Relation::const_iterator mEnd;
const MetaRecord &mMetaRecord;
CSSM_DB_CONJUNCTIVE mConjunctive;
CSSM_QUERY_FLAGS mQueryFlags;
typedef vector<SelectionPredicate *> PredicateVector;
PredicateVector mPredicates;
};
class MultiCursor : public Cursor
{
NOCOPY(MultiCursor)
public:
MultiCursor(const CSSM_QUERY *inQuery, const Schema &inSchema);
virtual ~MultiCursor();
virtual RecordHandle *next(TokenContext *tokenContext);
private:
Schema::ConstRelationMapIterator mRelationIterator;
Schema::ConstRelationMapIterator mRelationEnd;
auto_ptr<CssmAutoQuery> mQuery;
auto_ptr<Cursor> mCursor;
};
}
#endif