#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include "TableRelation.h"
#include "CommonCode.h"
struct TableRelationStruct
{
CSSM_DB_RECORDTYPE recordType;
};
void TableTuple::GetData (CSSM_DATA &data)
{
data.Data = NULL;
data.Length = 0;
}
void TableUniqueIdentifier::Export (CSSM_DB_UNIQUE_RECORD &record)
{
memset (&record, 0, sizeof (record));
}
TableUniqueIdentifier::TableUniqueIdentifier (CSSM_DB_RECORDTYPE recordType, int tupleNumber) : UniqueIdentifier (recordType), mTupleNumber (tupleNumber)
{
}
struct TableUniqueIdentifierStruct : public TableRelationStruct
{
int tupleNumber;
};
TableRelation::TableRelation (CSSM_DB_RECORDTYPE recordType, int numberOfColumns) : PartialRelation (recordType, numberOfColumns), mNumberOfTuples (0), mData (NULL)
{
}
TableRelation::~TableRelation ()
{
if (mData != NULL)
{
int arraySize = mNumberOfTuples * mNumberOfColumns;
int i;
for (i = 0; i < arraySize; ++i)
{
delete mData[i];
}
free (mData);
}
}
void TableRelation::AddTuple (Value* column0Value, ...)
{
int n = mNumberOfTuples++ * mNumberOfColumns;
int newArraySize = n + mNumberOfColumns;
mData = (Value**) realloc (mData, newArraySize * sizeof (Value*));
mData[n++] = column0Value;
va_list argList;
va_start (argList, column0Value);
int i;
for (i = 1; i < mNumberOfColumns; ++i)
{
Value* next = va_arg (argList, Value*);
mData[n++] = next;
}
va_end (argList);
}
Query* TableRelation::MakeQuery (const CSSM_QUERY* query)
{
return new TableQuery (this, query);
}
Tuple* TableRelation::GetTuple (int i)
{
Value** offset = mData + i * mNumberOfColumns;
TableTuple* tt = new TableTuple (offset, mNumberOfColumns);
return tt;
}
Tuple* TableRelation::GetTupleFromUniqueIdentifier (UniqueIdentifier* uniqueID)
{
TableUniqueIdentifier *id = (TableUniqueIdentifier*) uniqueID;
return GetTuple (id->GetTupleNumber ());
}
UniqueIdentifier* TableRelation::ImportUniqueIdentifier (CSSM_DB_UNIQUE_RECORD *uniqueRecord)
{
TableUniqueIdentifierStruct *is = (TableUniqueIdentifierStruct *) uniqueRecord->RecordIdentifier.Data;
TableUniqueIdentifier* it = new TableUniqueIdentifier (is->recordType, is->tupleNumber);
return it;
}
TableTuple::TableTuple (Value** offset, int numValues) : mValues (offset), mNumValues (numValues)
{
}
TableQuery::TableQuery (TableRelation* relation, const CSSM_QUERY *queryBase) : Query (relation, queryBase), mRelation (relation), mCurrentRecord (0)
{
}
TableQuery::~TableQuery ()
{
}
Tuple* TableQuery::GetNextTuple (UniqueIdentifier *& id)
{
while (mCurrentRecord < mRelation->GetNumberOfTuples ())
{
Tuple *t = mRelation->GetTuple (mCurrentRecord);
id = new TableUniqueIdentifier (mRelation->GetRecordType (), mCurrentRecord);
mCurrentRecord += 1;
if (EvaluateTuple (t))
{
return t;
}
delete t;
}
id = NULL;
return NULL;
}