diff -r 000000000000 -r dd21522fd290 browserutilities/favouritesengine/ClientServer/srvsrc/FavouritesSrvTable.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/favouritesengine/ClientServer/srvsrc/FavouritesSrvTable.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,887 @@ +/* +* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* Implementation of class RFavouritesSrvTable +* +* +*/ + + +// INCLUDE FILES + +#include +#include "FavouritesSrvTable.h" +#include "FavouritesPanic.h" +#include "FavouritesItemData.h" +#include "FavouritesFilter.h" + +// CONSTANTS + +/// Buffer size for formatting SQL query in SetFiltersL(). +const TInt KFavouritesMaxSql = 255; + +// Database table names. + +/// Favourites table name. +_LIT( KFavouritesTableName, "Favourites" ); + +// Database column names. // First in: + +/// "Uid" column name. +_LIT( KFavouritesDbUidColName, "Uid" ); // 6.6 +/// "Parent folder" column name. +_LIT( KFavouritesDbParentColName, "Parent" ); // 6.6 +/// "Type" column name. +_LIT( KFavouritesDbTypeColName, "Type" ); // 6.6 +/// "Name" column name. +_LIT( KFavouritesDbNameColName, "Name" ); // 6.6 +/// "URL" column name. +_LIT( KFavouritesDbUrlColName, "Url" ); // 6.6 +/// "WAP AP ApId" column name. +_LIT( KFavouritesDbApIdColName, "WapApId" ); // 6.6 +/// "WAP AP Value Kind" column name. +_LIT( KFavouritesDbApValueKindColName, "WapApValueKind" ); // 6.6 +/// "Username" column name. +_LIT( KFavouritesDbUserNameColName, "Username" ); // 6.6 +/// "Password" column name. +_LIT( KFavouritesDbPasswordColName, "Password" ); // 6.6 +/// "Derived classes' extra data" column name. +_LIT( KFavouritesDbExtraDataColName, "ExtraData" ); // 6.6 +/// "Factory item" column name. +_LIT( KFavouritesDbFactoryItemColName, "FactoryItem" ); // 6.6 +/// "Read-only" column name. +_LIT( KFavouritesDbReadOnlyColName, "ReadOnly" ); // 7.0 +/// "ContextId" column name. +_LIT( KFavouritesDbContextIdColName, "ContextId" ); // 7.0 +/// "Modified" column name. +_LIT( KFavouritesDbModifiedColName, "Modified" ); // 8.0 +/// "Preferred Uid" column name. +_LIT( KFavouritesDbPrefUidColName, "PrefUid" ); // 9.0 +/// "Derived classes' extra data" column name. +_LIT( KFavouritesDbBrowserDataColName, "BrowserData" ); // 10.0 + +_LIT( KFavouritesDbHiddenColName, "Hidden" ); // 11.0 +// Index column names. + +/// "Index by Uid" column name. +_LIT( KFavouritesDbUidIdxName, "UidIdx" ); + +// ================= LOCAL FUNCTIONS ======================= + +/** +* Append escaped aLiteral to the end of aBuffer. This means appenging aLiteral, +* with all '-s changed to ''-s. +* @param aBuffer Buffer to append to. +* @param aLiteral Literal to append escaped. +*/ +LOCAL_C void AppendEscaped( TDes& aBuffer, const TDesC& aLiteral ) + { + TInt i; + TUint quote('\''); // TChar gives warnings in THUMB & ARMI + for ( i = 0; i < aLiteral.Length(); i++ ) + { + aBuffer.Append( aLiteral[i] ); + if ( aLiteral[i] == quote ) + { + // Duplicate quote. + aBuffer.Append( quote ); + } + } + } + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// RFavouritesSrvTable::OpenL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::OpenL + ( + RDbNamedDatabase& aDb, + RDbRowSet::TAccess aAccess /*=RDbRowSet::EUpdatable*/ + ) + { + iFiltering = EFalse; + User::LeaveIfError( RDbTable::Open( aDb, KFavouritesTableName, aAccess ) ); + CleanupClosePushL( *this ); + GetColumnNumbersL(); + CleanupStack::Pop(); // closing this + SetIndex( KFavouritesDbUidIdxName ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::Close +// --------------------------------------------------------- +// +void RFavouritesSrvTable::Close() + { + ClearFilters(); + RDbTable::Close(); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::InsertLC +// --------------------------------------------------------- +// +void RFavouritesSrvTable::InsertLC() + { + RDbTable::InsertL(); + CleanupStack::PushL( TCleanupItem( StaticCancel, this ) ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::UpdateLC +// --------------------------------------------------------- +// +void RFavouritesSrvTable::UpdateLC() + { + RDbTable::UpdateL(); + CleanupStack::PushL( TCleanupItem( StaticCancel, this ) ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::PutL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::PutL( TBool aTouch /*=ETrue*/ ) + { + if ( aTouch ) + { + TTime now; + now.UniversalTime(); + SetModifiedL( now ); + } + RDbTable::PutL(); + CleanupStack::Pop(); // StaticCancel, pushed by InsertLC or UpdateLC. + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::Cancel +// --------------------------------------------------------- +// +void RFavouritesSrvTable::Cancel() + { + // Any updates in this method must also be applied StaticCancel! + RDbTable::Cancel(); + CleanupStack::Pop(); // StaticCancel, pushed by InsertLC or UpdateLC. + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetFiltersL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetFiltersL( const TFavouritesFilter& aFilter ) + { + HBufC* buf = HBufC::NewLC( KFavouritesMaxSql ); + TPtr sql = buf->Des(); + HBufC* tmpBuf = HBufC::NewLC( KFavouritesMaxSql ); + TPtr tmpPtr = tmpBuf->Des(); + _LIT( KNone, "" ); + _LIT( KAnd, "and" ); + TPtrC sConn; + + sConn.Set( KNone ); + + if ( aFilter.iName ) + { + // "name like 'foo*'" + _LIT( KFormat1, "%S like '" ); + sql.Format( KFormat1, &KFavouritesDbNameColName ); + AppendEscaped( sql, *aFilter.iName ); + sql.Append( TChar('\'') ); + sConn.Set( KAnd ); + } + + if ( aFilter.iType != CFavouritesItem::ENone ) + { + // "and type = 0" + _LIT( KFormat2, " %S %S = %d" ); + tmpPtr.Format + ( KFormat2, &sConn, &KFavouritesDbTypeColName, aFilter.iType ); + sConn.Set( KAnd ); + sql.Append( tmpPtr ); + } + + if ( aFilter.iParentFolder != KFavouritesNullUid ) + { + // "and parent = 7" + _LIT( KFormat3, " %S %S = %d" ); + tmpPtr.Format( KFormat3, + &sConn, &KFavouritesDbParentColName, aFilter.iParentFolder ); + sConn.Set( KAnd ); + sql.Append( tmpPtr ); + } + + if ( aFilter.iContextId != KFavouritesNullContextId ) + { + // "and contextid = 7" + _LIT( KFormat3, " %S %S = %d" ); + tmpPtr.Format( KFormat3, + &sConn, &KFavouritesDbContextIdColName, aFilter.iContextId ); + sConn.Set( KAnd ); + sql.Append( tmpPtr ); + } + + // Clear old one, if any. + ClearFilters(); + + if ( sql.Length() > 0 ) + { + // Make new constraint, if there is any filter set. + // Otherwise there will be no constraint. + User::LeaveIfError + ( iFilter.Open( *this, TDbQuery( sql, EDbCompareFolded ) ) ); + iFiltering = ETrue; + } + + CleanupStack::PopAndDestroy( 2 ); // tmpBuf, buf + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::ClearFilters +// --------------------------------------------------------- +// +void RFavouritesSrvTable::ClearFilters() + { + if ( iFiltering ) + { + iFilter.Close(); + iFiltering = EFalse; + } + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::NextL +// --------------------------------------------------------- +// +TBool RFavouritesSrvTable::NextL() + { + while ( RDbTable::NextL() ) + { + // Use the filters, if any. + if ( !iFiltering || MatchL( iFilter ) ) + { + // We have a matching row. + return ETrue; + } + } + // No matching rows were found. + return EFalse; + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SeekToUidL +// --------------------------------------------------------- +// +TBool RFavouritesSrvTable::SeekToUidL( TInt aUid ) + { + return SeekL( TDbSeekKey( aUid ) ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::GotoToUidL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::GotoToUidL( TInt aUid ) + { + if ( !SeekToUidL( aUid ) ) + { + User::Leave( KErrNotFound ); + } + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::ReadItemDataL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::ReadItemDataL( CFavouritesItemImpl& aItem ) const + { + // Fill standard attributes. + aItem.SetUid( Uid() ); + // No bookmark can exist with the Null Uid. + __ASSERT_DEBUG( aItem.Uid() != KFavouritesNullUid, + FavouritesPanic( EFavouritesNullUidInDatabase ) ); + aItem.SetParentFolder( ParentFolder() ); + aItem.SetType( Type() ); + aItem.SetNameL( Name() ); + HBufC* url = UrlLC(); + aItem.SetUrlL( *url ); + CleanupStack::PopAndDestroy(); // url + aItem.SetUserNameL( Username() ); + aItem.SetPasswordL( Password() ); + aItem.SetWapAp( WapAp() ); + aItem.SetFactoryItem( FactoryItem() ); + aItem.SetReadOnly( ReadOnly() ); + aItem.SetContextId( ContextId() ); + aItem.SetModified( Modified() ); + aItem.SetHidden( Hidden() ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::Uid +// --------------------------------------------------------- +// +TInt RFavouritesSrvTable::Uid() const + { + return ColInt( iColNoUid ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::ParentFolder +// --------------------------------------------------------- +// +TInt RFavouritesSrvTable::ParentFolder() const + { + return ColInt( iColNoParentFolder ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::Type +// --------------------------------------------------------- +// +CFavouritesItem::TType RFavouritesSrvTable::Type() const + { + return STATIC_CAST( CFavouritesItem::TType, ColInt32( iColNoType ) ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::Name +// --------------------------------------------------------- +// +TPtrC RFavouritesSrvTable::Name() const + { + return ColDes( iColNoName ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::UrlLC +// --------------------------------------------------------- +// +HBufC* RFavouritesSrvTable::UrlLC() const + { + // URL is long column. + RDbColReadStream stream; + TInt len = ColLength( iColNoUrl ); + HBufC* buf = HBufC::NewLC( len ); + if ( len ) + { + stream.OpenLC( *this, iColNoUrl ); + TPtr ptr = buf->Des(); + stream.ReadL( ptr, len ); + CleanupStack::PopAndDestroy(); // Close stream + } + return buf; + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::WapAp +// --------------------------------------------------------- +// +TFavouritesWapAp RFavouritesSrvTable::WapAp() const + { + TFavouritesWapAp wapAp; + wapAp.iApId = ColUint32 ( iColNoWapApId ); + wapAp.iValueKind = STATIC_CAST + ( TFavouritesWapAp::TValueKind, ColInt ( iColNoWapApValueKind ) ); + return wapAp; + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::Username +// --------------------------------------------------------- +// +TPtrC RFavouritesSrvTable::Username() const + { + return ColDes( iColNoUserName ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::Password +// --------------------------------------------------------- +// +TPtrC RFavouritesSrvTable::Password() const + { + return ColDes( iColNoPassword ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::GetExtraDataL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::GetExtraDataL( MStreamBuf& aSink ) + { + RDbColReadStream rs; + rs.OpenLC( *this, iColNoExtraData ); + RWriteStream ws( &aSink ); + rs.ReadL( ws ); + CleanupStack::PopAndDestroy(); // Close rs + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::GetBrowserDataL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::GetBrowserDataL( MStreamBuf& aSink ) + { + if ( iColNoBrowserData != KDbNullColNo ) + { + RDbColReadStream rs; + rs.OpenLC( *this, iColNoBrowserData ); + RWriteStream ws( &aSink ); + rs.ReadL( ws ); + CleanupStack::PopAndDestroy(); // Close rs + } + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::FactoryItem +// --------------------------------------------------------- +// +TBool RFavouritesSrvTable::FactoryItem() const + { + return ColInt( iColNoFactoryItem ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::ReadOnly +// --------------------------------------------------------- +// +TBool RFavouritesSrvTable::ReadOnly() const + { + return ColInt( iColNoReadOnly ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::ContextId +// --------------------------------------------------------- +// +TInt32 RFavouritesSrvTable::ContextId() const + { + return ColInt32( iColNoContextId ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::Modified +// --------------------------------------------------------- +// +TTime RFavouritesSrvTable::Modified() const + { + TTime modified( 0 ); + if ( iColNoModified != KDbNullColNo ) + { + modified = ColTime( iColNoModified ); + } + return modified; + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::PreferredUid +// --------------------------------------------------------- +// +TInt RFavouritesSrvTable::PreferredUid() const + { + TInt preferredUid( KFavouritesNullUid ); + if ( iColNoPreferredUid != KDbNullColNo ) + { + preferredUid = ColInt( iColNoPreferredUid ); + } + return preferredUid; + } + + +// --------------------------------------------------------- +// RFavouritesSrvTable::Hidden +// --------------------------------------------------------- +// +TBool RFavouritesSrvTable::Hidden() const + { + return ColInt( iColNoHidden ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::WriteItemDataL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::WriteItemDataL( const CFavouritesItemImpl& aItem ) + { + // Fill standard attributes. + __ASSERT_DEBUG( !ReadOnly(), FavouritesPanic( EFavouritesInternal ) ); + // Uid is *NOT* set. We update the current row. + SetParentFolderL( aItem.ParentFolder() ); + SetTypeL( aItem.Type() ); + SetNameL( aItem.Name() ); + SetUrlL( aItem.Url() ); + SetUsernameL( aItem.UserName() ); + SetPasswordL( aItem.Password() ); + SetWapApL( aItem.WapAp() ); + // Note: read-only flag is *NOT* set. Setting that is accessible via + // SetReadOnlyL. + // Note: factory item flag is *NOT* set. Setting that is accessible via + // SetFactoryItemL. + SetContextIdL( aItem.ContextId() ); + // Note: last modification time is *NOT* set; PutL will do it. + // Manual setting (override) is accessible via SetModifiedL. + SetHiddenL( aItem.IsHidden() ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetUidL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetUidL( TInt aUid ) + { + SetColL( iColNoUid, aUid ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetParentFolderL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetParentFolderL( TInt aUid ) + { + SetColL( iColNoParentFolder, aUid ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetTypeL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetTypeL( CFavouritesItem::TType aType ) + { + SetColL( iColNoType, STATIC_CAST( TInt, aType ) ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetNameL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetNameL( const TDesC& aName ) + { + SetColL( iColNoName, aName ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetUrlL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetUrlL( const TDesC& aUrl ) + { + RDbColWriteStream stream; + stream.OpenLC( *this, iColNoUrl ); + stream.WriteL( aUrl, aUrl.Length() ); + stream.CommitL(); + CleanupStack::PopAndDestroy(); // stream; + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetWapApL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetWapApL( const TFavouritesWapAp& aWapAp ) + { + SetColL( iColNoWapApId, aWapAp.iApId ); + SetColL( iColNoWapApValueKind, + STATIC_CAST( TInt, aWapAp.iValueKind ) ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetUsernameL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetUsernameL( const TDesC& aUsername ) + { + SetColL( iColNoUserName, aUsername ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetPasswordL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetPasswordL( const TDesC& aPassword ) + { + SetColL( iColNoPassword, aPassword ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetExtraDataL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetExtraDataL( MStreamBuf& aSource ) + { + RDbColWriteStream ws; + ws.OpenLC( *this, iColNoExtraData ); + RReadStream rs( &aSource ); + ws.WriteL( rs ); + ws.CommitL(); + CleanupStack::PopAndDestroy(); // Close ws + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetBrowserDataL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetBrowserDataL( MStreamBuf& aSource ) + { + if ( iColNoBrowserData != KDbNullColNo ) + { + RDbColWriteStream ws; + ws.OpenLC( *this, iColNoBrowserData ); + RReadStream rs( &aSource ); + ws.WriteL( rs ); + ws.CommitL(); + CleanupStack::PopAndDestroy(); // Close ws + } + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetFactoryItemL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetFactoryItemL( TBool aFactoryItem ) + { + SetColL( iColNoFactoryItem, aFactoryItem ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetReadOnlyL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetReadOnlyL( TBool aReadOnly ) + { + SetColL( iColNoReadOnly, aReadOnly ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetContextIdL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetContextIdL( TInt32 aContextId ) + { + SetColL( iColNoContextId, aContextId ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetModifiedL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetModifiedL( TTime aModified ) + { + if ( iColNoModified != KDbNullColNo ) + { + SetColL( iColNoModified, aModified ); + } + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetPreferredUidL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetPreferredUidL( TInt aUid ) + { + if ( iColNoPreferredUid != KDbNullColNo ) + { + SetColL( iColNoPreferredUid, aUid ); + } + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::SetHiddenL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::SetHiddenL( TBool aHidden ) + { + SetColL( iColNoHidden, aHidden ); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::PutWriteLockL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::PutWriteLockL() + { + // Insert will get write-lock if possible, or leave if not. + InsertLC(); + Cancel(); + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::CreateStructureL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::CreateStructureL( RDbNamedDatabase& aDb ) + { + // Create columns. + CDbColSet* colset = CDbColSet::NewLC(); + + TDbCol col( KFavouritesDbUidColName, EDbColInt32 ); + col.iAttributes = TDbCol::EAutoIncrement; + colset->AddL( col ); + colset->AddL( TDbCol( KFavouritesDbParentColName, EDbColInt32 ) ); + colset->AddL( TDbCol( KFavouritesDbTypeColName, EDbColInt32 ) ); + colset->AddL( TDbCol + ( KFavouritesDbNameColName, EDbColText, KFavouritesMaxName ) ); + colset->AddL( TDbCol + ( KFavouritesDbUrlColName, EDbColLongText, KFavouritesMaxUrl ) ); + colset->AddL( TDbCol( KFavouritesDbApIdColName, EDbColUint32 ) ); + colset->AddL( TDbCol( KFavouritesDbApValueKindColName, EDbColInt32 ) ); + colset->AddL( TDbCol + ( KFavouritesDbUserNameColName, EDbColText, KFavouritesMaxUserName ) ); + colset->AddL( TDbCol + ( KFavouritesDbPasswordColName, EDbColText, KFavouritesMaxPassword ) ); + colset->AddL( TDbCol( KFavouritesDbExtraDataColName, EDbColLongBinary ) ); + colset->AddL( TDbCol( KFavouritesDbFactoryItemColName, EDbColBit ) ); + colset->AddL( TDbCol( KFavouritesDbReadOnlyColName, EDbColBit ) ); + colset->AddL( TDbCol( KFavouritesDbContextIdColName, EDbColInt32 ) ); + colset->AddL( TDbCol( KFavouritesDbModifiedColName, EDbColDateTime ) ); + colset->AddL( TDbCol( KFavouritesDbPrefUidColName, EDbColInt32 ) ); + colset->AddL + ( TDbCol( KFavouritesDbBrowserDataColName, EDbColLongBinary ) ); + colset->AddL( TDbCol( KFavouritesDbHiddenColName, EDbColBit ) ); + User::LeaveIfError + ( aDb.CreateTable( KFavouritesTableName, *colset ) ); + CleanupStack::PopAndDestroy(); // colset + + // Create index by uid. + CDbKey* key = CDbKey::NewLC(); + // Create key on Uid column, ascending order. + key->AddL( TDbKeyCol ( KFavouritesDbUidColName ) ); + User::LeaveIfError( aDb.CreateIndex + ( KFavouritesDbUidIdxName, KFavouritesTableName, *key ) ); + CleanupStack::PopAndDestroy(); // key + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::VerifyStructureL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::VerifyStructureL +( RDbNamedDatabase& aDb, TBool aUpgrade ) + { + CDbColSet* colset = aDb.ColSetL( KFavouritesTableName ); + CleanupStack::PushL( colset ); + + if ( + colset->ColNo( KFavouritesDbUidColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbParentColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbTypeColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbNameColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbUrlColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbUserNameColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbPasswordColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbApIdColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbApValueKindColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbExtraDataColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbFactoryItemColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbReadOnlyColName ) == KDbNullColNo || + colset->ColNo( KFavouritesDbContextIdColName ) == KDbNullColNo + ) + { + // Mandatory column is missing, this database is corrupt. + User::Leave( KErrCorrupt ); + } + + if ( aUpgrade ) + { + // Check optional columns, upgrade if necessary. + // If upgrade is not possible, we don't even check those; as the + // database is still functional without them. + + TInt missingCols( EFalse ); + + if ( colset->ColNo( KFavouritesDbModifiedColName ) == KDbNullColNo ) + { + // Last modification column is missing. + colset->AddL( TDbCol + ( KFavouritesDbModifiedColName, EDbColDateTime ) ); + missingCols = ETrue; + } + + if ( colset->ColNo( KFavouritesDbPrefUidColName ) == KDbNullColNo ) + { + // Preferred uid column is missing. + colset->AddL( TDbCol( KFavouritesDbPrefUidColName, EDbColInt32 ) ); + missingCols = ETrue; + } + + if ( colset->ColNo( KFavouritesDbBrowserDataColName ) == KDbNullColNo ) + { + // Preferred uid column is missing. + colset->AddL + ( TDbCol( KFavouritesDbBrowserDataColName, EDbColLongBinary ) ); + missingCols = ETrue; + } + if( colset->ColNo( KFavouritesDbHiddenColName) == KDbNullColNo ) + { + // Preferred uid column is missing. + colset->AddL + ( TDbCol( KFavouritesDbHiddenColName, EDbColBit ) ); + missingCols = ETrue; + } + + if ( missingCols ) + { + // Some columns are missing, try to add them now. + // Upgrade error is ignored, database is still functional (except + // of course the missing columns). + (void)aDb.AlterTable( KFavouritesTableName, *colset ); + } + } + + CleanupStack::PopAndDestroy(); // colset + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::GetColumnNumbersL +// --------------------------------------------------------- +// +void RFavouritesSrvTable::GetColumnNumbersL() + { + CDbColSet* colset = ColSetL(); + CleanupStack::PushL( colset ); + + iColNoUid = colset->ColNo( KFavouritesDbUidColName ); + iColNoParentFolder = colset->ColNo( KFavouritesDbParentColName ); + iColNoType = colset->ColNo( KFavouritesDbTypeColName ); + iColNoName = colset->ColNo( KFavouritesDbNameColName ); + iColNoUrl = colset->ColNo( KFavouritesDbUrlColName ); + iColNoUserName = colset->ColNo( KFavouritesDbUserNameColName ); + iColNoPassword = colset->ColNo( KFavouritesDbPasswordColName ); + iColNoWapApId = colset->ColNo( KFavouritesDbApIdColName ); + iColNoWapApValueKind = colset->ColNo( KFavouritesDbApValueKindColName ); + iColNoExtraData = colset->ColNo( KFavouritesDbExtraDataColName ); + iColNoFactoryItem = colset->ColNo( KFavouritesDbFactoryItemColName ); + iColNoReadOnly = colset->ColNo( KFavouritesDbReadOnlyColName ); + iColNoContextId = colset->ColNo( KFavouritesDbContextIdColName ); + iColNoModified = colset->ColNo( KFavouritesDbModifiedColName ); + iColNoPreferredUid = colset->ColNo( KFavouritesDbPrefUidColName ); + iColNoBrowserData = colset->ColNo( KFavouritesDbBrowserDataColName ); + iColNoHidden = colset->ColNo( KFavouritesDbHiddenColName ); + + CleanupStack::PopAndDestroy(); // colset + } + +// --------------------------------------------------------- +// RFavouritesSrvTable::StaticCancel +// --------------------------------------------------------- +// +void RFavouritesSrvTable::StaticCancel( TAny* aTable ) + { + // Same as Cancel; except it does not pop the cleanup item; because + // it is called as part of leave processing. + // Any updates in this method must also be applied Cancel! + RFavouritesSrvTable* table = STATIC_CAST( RFavouritesSrvTable*, aTable ); + table->RDbTable::Cancel(); + } + +// End of File