diff -r cad71a31b7fc -r e36f3802f733 srsf/nssvasapi/nssvasdb/src/nssvastvasdbcreator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srsf/nssvasapi/nssvasdb/src/nssvastvasdbcreator.cpp Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,382 @@ +/* +* Copyright (c) 2002 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: TNssVasDbCreator is responsible for creating VasDatabase.db. +* +*/ + + +#include "nssvastvasdbcreator.h" +#include +#include +#include +#include "nssvascoreconstant.h" + +// in bytes +const TInt KClientDataColSize = 100; + +// ============================ Methods =============================== + + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::TNssVasDbCreator +// ----------------------------------------------------------------------------- +// +TNssVasDbCreator::TNssVasDbCreator() + { + } + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::CreateVasDatabaseL +// ----------------------------------------------------------------------------- +// +void TNssVasDbCreator::CreateVasDatabaseL( RDbs& iDbSession ) + { + RDbNamedDatabase database; + TInt error = database.Create( iDbSession, KVasDatabaseName, KVasDatabaseFormatString ); + CleanupClosePushL( database ); + if ( error == KErrAlreadyExists ) + { + // Ignore KErrAlreadyExists, we will use the existing one if it is there + error = KErrNone; + } + else if ( error == KErrNone ) + { + // Create tables + CreateTablesAndIndiciesL( database ); + } + + CleanupStack::PopAndDestroy( &database ); // Close database + + User::LeaveIfError( error ); + } + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::CreateTablesAndIndiciesL +// ----------------------------------------------------------------------------- +// +void TNssVasDbCreator::CreateTablesAndIndiciesL( RDbNamedDatabase& aDatabase ) + { + CreateContextTableL( aDatabase ); + CreateContextIndexL( aDatabase ); + CreateTagTableL( aDatabase ); + CreateTagIndexL( aDatabase ); + CreateRRDTableL( aDatabase ); + CreateRRDIndexL( aDatabase ); + CreateWriteLockTableL( aDatabase ); + } + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::CreateContextTableL +// ----------------------------------------------------------------------------- +// +/* Context Table +* +* Was up to 2.0: +* +* name|global|contextid|lexiconid|grammarid|modelbankid +* ------------------------------------------------------ +* | | | | | +* +* In 2.8: +* +* |name|global|contextid|lexiconid|grammarid|modelbankid|clientdata| +* |----------------------------------------------------------------| +* | | | | | | | | +*/ +void TNssVasDbCreator::CreateContextTableL( RDbNamedDatabase& aDatabase ) + { + _LIT(KContextTable, "contexttable"); + _LIT(KCol1, "name"); + _LIT(KCol2, "global"); + _LIT(KCol3, "contextid"); + _LIT(KCol4, "lexiconid"); + _LIT(KCol5, "grammarid"); + _LIT(KCol6, "modelbankid"); + _LIT(KCol8, "clientdata"); // NSS Extension(tm) + + // Create the context table definition (columnset). + CDbColSet* columns = CDbColSet::NewLC(); + + // add column definitions + + // The name column first. + TDbCol dbCol1(KCol1, EDbColText,KNssVasDbContextName); + dbCol1.iAttributes = TDbCol::ENotNull; + columns->AddL(dbCol1); + + // The global flag column + TDbCol dbCol2(KCol2, EDbColUint32); + dbCol2.iAttributes = TDbCol::ENotNull; + columns->AddL(dbCol2); + + // The context id flag CDbKey* key = CDbKey::NewLC(); + TDbCol dbCol3(KCol3, EDbColUint32); + dbCol3.iAttributes = TDbCol::EAutoIncrement|TDbCol::ENotNull; + columns->AddL(dbCol3); + + // The lexicon id + TDbCol dbCol4(KCol4, EDbColUint32); + dbCol4.iAttributes = TDbCol::ENotNull; + columns->AddL(dbCol4); + + // The grammar id + TDbCol dbCol5( KCol5, EDbColUint32 ); + dbCol5.iAttributes = TDbCol::ENotNull; + columns->AddL( dbCol5 ); + + // The modelbank id + TDbCol dbCol6( KCol6, EDbColUint32 ); + dbCol6.iAttributes = TDbCol::ENotNull; + columns->AddL( dbCol6 ); + + // 100 bytes of client data. New in 2.8. + TDbCol dbCol8( KCol8, EDbColBinary, KClientDataColSize ); + // Can be null + columns->AddL( dbCol8 ); + + // Now actually create the table. + User::LeaveIfError( aDatabase.CreateTable( KContextTable, *columns ) ); + + // Cleanup columns + CleanupStack::PopAndDestroy( columns ); + } + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::CreateContextIndexL +// ----------------------------------------------------------------------------- +// +void TNssVasDbCreator::CreateContextIndexL( RDbNamedDatabase& aDatabase ) + { + _LIT( KTable, "contexttable" ); + // Same as table name is a bit weird, but we leave it unchanged to avoid + // potential incompatibility with some other code, that might access + // index by name + _LIT( KIndexName, "contexttable"); + //_LIT( KCol3, "contextid" ); + CreateSingleColumnIndexL( aDatabase, KIndexName, KContextIdCol, ETrue, KTable); + + } + + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::CreateTagTableL +// ----------------------------------------------------------------------------- +// +/* +* Tag Table +* +* tagid|contextid|name|ruleid| +* ----------------------------- +* | | | | +* +*/ +void TNssVasDbCreator::CreateTagTableL( RDbNamedDatabase& aDatabase ) + { + _LIT(KTagTable,"tagtable"); + _LIT(KCol1, "tagid"); + _LIT(KCol2, "contextid"); + _LIT(KCol3, "name"); + _LIT(KCol5, "ruleid"); + + + // Create the tag table definition (columnset). + CDbColSet* columns = CDbColSet::NewLC(); + + // The tag id + TDbCol dbCol1(KCol1, EDbColUint32); + dbCol1.iAttributes = TDbCol::EAutoIncrement|TDbCol::ENotNull; + columns->AddL(dbCol1); + + // The context id + TDbCol dbCol2(KCol2, EDbColUint32); + dbCol2.iAttributes = TDbCol::ENotNull; + columns->AddL(dbCol2); + + // The speechitem/tag name column. + TDbCol dbCol3(KCol3, EDbColText,KNssVasDbSpeechItemName); + dbCol3.iAttributes = TDbCol::ENotNull; + columns->AddL(dbCol3); + + // The rule id + TDbCol dbCol5(KCol5, EDbColUint32); + dbCol5.iAttributes = TDbCol::ENotNull; + columns->AddL(dbCol5); + + // Now actually create the table. + User::LeaveIfError ( aDatabase.CreateTable(KTagTable, *columns)); + + // Cleanup columns + CleanupStack::PopAndDestroy( columns ); + } + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::CreateTagIndexL +// ----------------------------------------------------------------------------- +// +void TNssVasDbCreator::CreateTagIndexL( RDbNamedDatabase& aDatabase ) + { + _LIT( KTable, "tagtable" ); + CreateSingleColumnIndexL(aDatabase, KTable, KTagIdCol, ETrue, KTable); + _LIT( KContextIndexName, "tagtable_contextid_idx" ); + CreateSingleColumnIndexL(aDatabase, KContextIndexName, KContextIdCol, EFalse, KTable); + _LIT( KRuleIndexName, "tagtable_ruleid_idx" ); + CreateSingleColumnIndexL(aDatabase, KRuleIndexName, KRuleIdCol, EFalse, KTable); + _LIT( KIndexName, "tagtable_contextid_ruleid_idx" ); + CreateTwoColumnIndexL( KIndexName, KContextIdCol, KRuleIdCol, ETrue, KTable); + } + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::CreateRRDTableL +// ----------------------------------------------------------------------------- +// +/* RRD Text Table RRD Int Table +* +* tagid|text|pos tagid|int|pos +* -------------- ------------- +* | | | | +*/ +void TNssVasDbCreator::CreateRRDTableL( RDbNamedDatabase& aDatabase ) + { + _LIT( KRRDTextTable, "rrdtexttable" ); + _LIT( KRRDIntTable, "rrdinttable" ); + + _LIT( KCol1, "tagid" ); + _LIT( KTextCol2,"rrdtext" ); + _LIT( KIdCol2, "rrdint" ); + _LIT( KCol3, "rrdposition" ); + + // Create the rrd tables definition (columnset). + CDbColSet* textcolumns = CDbColSet::NewLC(); + CDbColSet* intcolumns = CDbColSet::NewLC(); + + // The tag id + TDbCol dbCol1( KCol1, EDbColUint32 ); + //dbCol1.iAttributes = TDbCol::ENotNull; + textcolumns->AddL( dbCol1 ); + intcolumns->AddL( dbCol1 ); + + // The rrd text + TDbCol dbCol2( KTextCol2, EDbColText, KNssVasDbRRDText ); + //dbCol2.iAttributes = TDbCol::ENotNull; + textcolumns->AddL( dbCol2 ); + + //The rrd int + TDbCol iddbCol2( KIdCol2, EDbColUint32 ); + //iddbCol2.iAttributes = TDbCol::ENotNull; + intcolumns->AddL( iddbCol2 ); + + // The position + TDbCol dbCol3( KCol3, EDbColUint32 ); + //dbCol3.iAttributes = TDbCol::ENotNull; + textcolumns->AddL( dbCol3 ); + intcolumns->AddL( dbCol3 ); + + User::LeaveIfError( aDatabase.CreateTable( KRRDTextTable, *textcolumns ) ); + User::LeaveIfError( aDatabase.CreateTable( KRRDIntTable, *intcolumns ) ); + + // Cleanup textcolumns & idcolumns + CleanupStack::PopAndDestroy( intcolumns ); + CleanupStack::PopAndDestroy( textcolumns ); + } + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::CreateRRDIndexL +// ----------------------------------------------------------------------------- +// +void TNssVasDbCreator::CreateRRDIndexL( RDbNamedDatabase& aDatabase ) + { + _LIT( KRRDTextTable, "rrdtexttable" ); + _LIT( KRRDIntTable, "rrdinttable" ); + _LIT( KRRDTextTagIndex, "rrdtexttable_tagid_idx"); + _LIT( KRRDIntTagIndex, "rrdinttable_tagid_idx" ); + _LIT( KRRDTextTagPosIndex, "rrdtexttable_tagid_pos_idx"); + _LIT( KRRDIntTagPosIndex, "rrdinttable_tagid__pos_idx" ); + // constraints + CreateTwoColumnIndexL(KRRDTextTagPosIndex, KTagIdCol, KRRDPositionCol, ETrue, KRRDTextTable); + CreateTwoColumnIndexL(KRRDIntTagPosIndex, KTagIdCol, KRRDPositionCol, ETrue, KRRDIntTable); + // and for actual searches + CreateSingleColumnIndexL(aDatabase, KRRDTextTagIndex, KTagIdCol, EFalse, KRRDTextTable); + CreateSingleColumnIndexL(aDatabase, KRRDIntTagIndex, KTagIdCol, EFalse, KRRDIntTable); + } + + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::CreateWriteLockTableL +// ----------------------------------------------------------------------------- +// +/* Write lock table +* +* temporary +* |---------| +* | | +*/ +void TNssVasDbCreator::CreateWriteLockTableL( RDbNamedDatabase& aDatabase ) + { + _LIT( KWriteLockTable, "writelocktable" ); + + _LIT( KCol1, "temporary" ); + + // Create the rrd tables definition (columnset). + CDbColSet* columns = CDbColSet::NewLC(); + + // The tag id + TDbCol dbCol1( KCol1, EDbColUint32 ); + columns->AddL( dbCol1 ); + + User::LeaveIfError( aDatabase.CreateTable( KWriteLockTable, *columns ) ); + + // Cleanup columns + CleanupStack::PopAndDestroy( columns ); + } + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::CreateSingleColumnIndexL +// ----------------------------------------------------------------------------- +// +void TNssVasDbCreator::CreateSingleColumnIndexL( RDbNamedDatabase& aDatabase, + const TDesC& aIndexName, + const TDesC& aColumnName, + const TBool aUnique, + const TDesC& aTableName) + { + // Create the index key... + CDbKey* key = CDbKey::NewLC(); + + // and add the key columns. + TDbKeyCol keyCol( aColumnName ); + key->AddL( keyCol ); + if( aUnique ) + { + key->MakeUnique(); + } + + // Create the index + User::LeaveIfError( aDatabase.CreateIndex( aIndexName, aTableName, *key ) ); + + // Cleanup key + CleanupStack::PopAndDestroy(key); + } + +// ----------------------------------------------------------------------------- +// TNssVasDbCreator::CreateTwoColumnIndexL +// ----------------------------------------------------------------------------- +// +void TNssVasDbCreator::CreateTwoColumnIndexL( const TDesC& /*anIndexName*/, + const TDesC& /*aFirstColumnName*/, + const TDesC& /*aSecondColumnName*/, + const TBool /*aUnique*/, + const TDesC& /*aTableName*/) + { + } +