#include <security_cdsa_client/mdsclient.h>
namespace Security {
namespace CssmClient {
DLAccess::~DLAccess()
{ }
Record::Record(const char * const * names)
: CssmAutoData(Allocator::standard(Allocator::sensitive))
{
addAttributes(names);
}
void Record::addAttributes(const char * const * name)
{
if (name)
while (*name)
mAttributes.add(CssmDbAttributeInfo(*name++));
}
Record::~Record()
{ }
TableBase::TableBase(DLAccess &source, CSSM_DB_RECORDTYPE type, bool getData )
: database(source), mRecordType(type), mGetData(getData)
{
}
TableBase::Handle::~Handle()
{
if (query)
mAccess->dlAbortQuery(query);
}
TableBase::Uid::~Uid()
{
if (uid)
mAccess->dlFreeUniqueId(uid);
}
TableBase::Iterator::Iterator(DLAccess *ac, CSSM_HANDLE query,
CSSM_DB_UNIQUE_RECORD *id, Record *record, bool getData)
: mAccess(ac), mQuery(new Handle(ac, query)),
mUid(new Uid(ac, id)), mRecord(record), mGetData(getData)
{ }
void TableBase::Iterator::advance(Record *fill)
{
RefPointer<Record> newRecord = fill; CSSM_DB_UNIQUE_RECORD *id;
CssmAutoData data(mAccess->allocator());
if (mAccess->dlGetNext(mQuery->query, newRecord->attributes(),
mGetData ? &data.get() : NULL, id)) {
if (mGetData)
newRecord->recordData() = data;
mUid = new Uid(mAccess, id);
mRecord = newRecord;
} else {
mQuery->query = CSSM_INVALID_HANDLE; mQuery = NULL;
mUid = NULL;
mRecord = NULL;
}
}
uint32 TableBase::erase(const CSSM_QUERY &query)
{
CSSM_DB_UNIQUE_RECORD *id;
CssmDbRecordAttributeData noAttributes;
CSSM_HANDLE handle = database.dlGetFirst(query, noAttributes, NULL, id);
if (handle == CSSM_INVALID_HANDLE)
return 0; uint32 count = 0;
do {
database.dlDeleteRecord(id);
count++;
database.dlFreeUniqueId(id);
} while (database.dlGetNext(handle, noAttributes, NULL, id));
return count;
}
uint32 TableBase::erase(const Query &query)
{
return erase(query.cssmQuery());
}
} }