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