persistentstorage/dbms/utable/UT_SCHMA.CPP
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/dbms/utable/UT_SCHMA.CPP	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,318 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "UT_STD.H"
+
+// Class CDbTableIndexDef
+
+EXPORT_C CDbTableIndexDef::CDbTableIndexDef()
+	{}
+
+EXPORT_C CDbTableIndexDef::~CDbTableIndexDef()
+	{
+	delete iName;
+	}
+
+EXPORT_C void CDbTableIndexDef::ConstructL(const TDesC& aName)
+//
+// Construct with an empty key
+//
+	{
+	iName=aName.AllocL();
+	}
+
+// Class RDbIndexes
+
+void RDbIndexes::Close()
+	{
+	TSglQueIter<CDbTableIndexDef> iter(iRep);
+	for (CDbTableIndexDef* def;(def=iter++)!=0;)
+		delete def;
+	}
+
+CDbTableIndexDef* RDbIndexes::Find(const TDesC& aName) const
+//
+// Locate and index on the table by name
+//
+	{
+	TSglQueIter<CDbTableIndexDef> iter(CONST_CAST(TSglQue<CDbTableIndexDef>&,iRep));
+	for (CDbTableIndexDef* def;(def=iter++)!=0;)
+		if (aName.CompareF(def->Name())==0)
+			return def;
+	return 0;
+	}
+
+CDbTableIndexDef& RDbIndexes::FindL(const TDesC& aName) const
+//
+// Leave if not found
+//
+	{
+	CDbTableIndexDef* def=Find(aName);
+	if (def==NULL)
+		__LEAVE(KErrNotFound);
+	return *def;
+	}
+
+EXPORT_C TInt RDbIndexes::Count() const
+	{
+	TInt count = 0;
+	TSglQueIterC<CDbTableIndexDef> iter( iRep );
+	for ( ; iter++ != 0; )
+		++count;
+	return count;
+	}
+
+// Class TDbColumnDef
+
+EXPORT_C void TDbColumnDef::SetL(const TDbColumnDef& aCol)
+//
+// Replace assignment as this can leave
+//
+	{
+	iMaxLength=aCol.iMaxLength;
+	iType=aCol.iType;
+	iAttributes=aCol.iAttributes;
+	iFlags=aCol.iFlags;
+	iName=aCol.iName->AllocL();
+	}
+
+EXPORT_C void TDbColumnDef::SetL(const TDbCol& aCol)
+	{
+	iMaxLength=aCol.iMaxLength;
+	iType=TUint8(aCol.iType);
+	iAttributes=TUint8(aCol.iAttributes);
+	iName=aCol.iName.AllocL();
+	}
+
+void TDbColumnDef::AsTDbCol(TDbCol& aColumn) const
+	{
+	aColumn.iType=Type();
+	aColumn.iMaxLength=iMaxLength;
+	aColumn.iAttributes=iAttributes;
+	aColumn.iName=*iName;
+	}
+
+// Class HDbColumnSet
+
+HDbColumnSet* HDbColumnSet::NewL(TInt aCount)
+	{
+	return new(User::AllocL(_FOFF(HDbColumnSet,iColumns[aCount]))) HDbColumnSet(aCount);
+	}
+
+HDbColumnSet::HDbColumnSet(TInt aCount)
+	: iAttributes(0), iIndex(NULL), iEnd(&iColumns[aCount])
+	{
+	Mem::FillZ(&iColumns[0],aCount*sizeof(iColumns[0]));
+	}
+
+HDbColumnSet::~HDbColumnSet()
+	{
+	User::Free(iIndex);
+	const TIteratorC end=End();
+	for (TIteratorC iter=Begin();iter<end;++iter)
+		delete iter->iName;
+	}
+
+EXPORT_C TInt HDbColumnSet::Count() const
+	{
+	return End()-Begin();
+	}
+
+void HDbColumnSet::Complete()
+//
+// Called on completion of the column set
+//
+	{
+	TUint attrib=0;
+	const TIteratorC end=End();
+	for (TIteratorC iter=Begin();iter<end;++iter)
+		{
+		if (TDbCol::IsLong(iter->Type()))
+			attrib|=ELongColumns;
+		if (iter->iAttributes&TDbCol::EAutoIncrement)
+			attrib|=EAutoIncrement;
+		}
+	iAttributes=attrib;
+	}
+
+EXPORT_C HDbColumnSet::TIteratorC HDbColumnSet::ColumnL(const TDesC& aColumn) const
+//
+// Lookup name in the name index (binary search)
+//
+	{
+	const TIteratorC* index=IndexL();
+	TInt left=0;
+	TInt right=Count();
+	while (left<right)
+		{
+		TInt mid=(left+right)>>1;
+		TInt c=index[mid]->iName->CompareF(aColumn);
+		if (c<0)
+			left=mid+1;
+		else if (c>0)
+			right=mid;
+		else
+			return index[mid];		// matched entry
+		}
+	return 0;		// no match
+	}
+
+EXPORT_C TDbColNo HDbColumnSet::ColNoL(const TDesC& aColumn) const
+//
+// Return ordinal for given column name
+//
+	{
+	TIteratorC col=ColumnL(aColumn);
+	return col ? 1+(col-Begin()) : KDbNullColNo;
+	}
+
+const HDbColumnSet::TIteratorC* HDbColumnSet::IndexL() const
+//
+// Return the by-name lookup index, building it if required
+//
+	{
+	TIteratorC* index=iIndex;
+	if (!index)
+		{
+		CONST_CAST(TIteratorC*&,iIndex)=index=(TIteratorC*)User::AllocL(Count()*sizeof(TIteratorC));
+		TInt ii=0;
+		TIteratorC col=Begin();
+		TIteratorC end=End();
+		do
+			{
+			// binary search for insertion point
+			TInt left=0;
+			TInt right=ii;
+			while (left<right)
+				{
+				TInt mid=(left+right)>>1;
+				TInt c=index[mid]->iName->CompareF(*col->iName);
+				__ASSERT(c!=0);		// names are unique
+				if (c<0)
+					left=mid+1;
+				else
+					right=mid;
+				}
+			// insert the entry
+			Mem::Move(index+left+1,index+left,(ii-left)*sizeof(TIteratorC));
+			index[left]=col;
+			} while (++ii,++col<end);
+		}
+	return index;
+	}
+
+// Class CDbTableDef
+
+EXPORT_C CDbTableDef::CDbTableDef()
+	{}
+
+EXPORT_C CDbTableDef::~CDbTableDef()
+	{
+	delete iColumns;
+	delete iName;
+	iIndexes.Close();
+	}
+
+EXPORT_C void CDbTableDef::ConstructL(const TDesC& aName,TInt aColumnCount)
+	{
+	iName=aName.AllocL();
+	iColumns=HDbColumnSet::NewL(aColumnCount);
+	}
+
+void CDbTableDef::ExchangeColumnSet(HDbColumnSet* aSet)
+	{
+	delete iColumns;
+	iColumns=aSet;
+	Changed();
+	}
+
+EXPORT_C void CDbTableDef::Changed()
+//
+// evaluate cached info about the set
+//
+	{
+	iColumns->Complete();
+	}
+
+const CDbTableIndexDef* CDbTableDef::FindKey(const TDesC& aColumn,TBool aFirstColumn) const
+//
+// Find an index which keys on the given column
+//
+	{
+	TSglQueIterC<CDbTableIndexDef> indexes(Indexes().AsQue());
+	for (const CDbTableIndexDef* def;(def=indexes++)!=0;)
+		{
+		const CDbKey& key=def->Key();
+		TInt ii=0;
+		do
+			{
+			if (aColumn.CompareF(key[ii].iName)==0)
+				return def;
+			if (aFirstColumn)
+				break;
+			} while (++ii<key.Count());
+		}
+	return 0;
+	}
+
+// Class RDbTableSchema
+
+void RDbTableSchema::Discard()
+	{
+	TSglQueIter<CDbTableDef> iter(iRep);
+	for (CDbTableDef* def;(def=iter++)!=0;)
+		delete def;
+	iRep.Reset();
+	iLoaded=EFalse;
+	}
+
+CDbTableDef* RDbTableSchema::Find(const TDesC& aTable)
+	{
+	__ASSERT(IsLoaded());
+	TSglQueIter<CDbTableDef> iter(iRep);
+	for (CDbTableDef* def;(def=iter++)!=0;)
+		if (aTable.CompareF(def->Name())==0)
+			return def;
+	return 0;
+	}
+
+CDbTableDef& RDbTableSchema::FindL(const TDesC& aTable)
+//
+// Leave if not found
+//
+	{
+	CDbTableDef* def=Find(aTable);
+	if (def==NULL)
+		__LEAVE(KErrNotFound);
+	return *def;
+	}
+
+// Class RDbTables
+
+void RDbTables::Close()
+	{
+	TSglQueIter<CDbTable> iter(iRep);
+	for (CDbTable* table;(table=iter++)!=0;)
+		table->Discard();
+	}
+
+CDbTable* RDbTables::Find(const TDesC& aTable)
+	{
+	TSglQueIter<CDbTable> iter(iRep);
+	for (CDbTable* table;(table=iter++)!=0;)
+		if (aTable.CompareF(table->Def().Name())==0)
+			return table;
+	return 0;
+	}