diff -r aa5a574040a4 -r a3cc46f37772 metadataengine/server/src/mdssqldbmaintenance.cpp --- a/metadataengine/server/src/mdssqldbmaintenance.cpp Tue Jul 06 14:44:37 2010 +0300 +++ b/metadataengine/server/src/mdssqldbmaintenance.cpp Fri Sep 17 16:54:49 2010 +0300 @@ -50,15 +50,152 @@ TBool CMdSSqlDbMaintenance::ValidateL( ) { + //validate content of critical tables _LIT( KValidateTableExistence, "SELECT COUNT(*) FROM MdE_Preferences;" ); + _LIT( KValidateObjectDef, "SELECT COUNT(*) FROM ObjectDef;" ); + _LIT( KValidatePropertyDef, "SELECT COUNT(*) FROM PropertyDef;" ); + _LIT( KValidateRelationDef, "SELECT COUNT(*) FROM RelationDef;" ); + _LIT( KValidateCol2Prop, "SELECT COUNT(*) FROM Col2Prop;" ); + TInt test(KErrNone); + TUint32 count(0); + + RRowData emptyRowData; + CleanupClosePushL( emptyRowData ); + RMdsStatement validationQuery; CleanupClosePushL( validationQuery ); - RRowData emptyRowData; - CleanupClosePushL( emptyRowData ); + CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL(); - TRAPD( test, connection.ExecuteQueryL( KValidateTableExistence, validationQuery, emptyRowData ) ); - CleanupStack::PopAndDestroy( 2, &validationQuery ); + + TRAP( test, connection.ExecuteQueryL( KValidateTableExistence, validationQuery, emptyRowData ) ); + if(test == KErrNone) + { + emptyRowData.AppendL( TColumn( count ) ); + TRAP( test, connection.NextRowL(validationQuery, emptyRowData)); + if(test == KErrNone) + { + emptyRowData.Column(0).Get( count ); + + if(count <= 0) + { + test = KErrCorrupt; + } + } + } + + CleanupStack::PopAndDestroy( &validationQuery ); + emptyRowData.Reset(); + + RMdsStatement objectDefQuery; + CleanupClosePushL( objectDefQuery ); + + if( test == KErrNone ) + { + TRAP( test, connection.ExecuteQueryL( KValidateObjectDef, objectDefQuery, emptyRowData ) ); + + if(test == KErrNone) + { + emptyRowData.AppendL( TColumn( count ) ); + TRAP( test, connection.NextRowL(objectDefQuery, emptyRowData)); + if(test == KErrNone) + { + emptyRowData.Column(0).Get( count ); + + if(count <= 0) + { + test = KErrCorrupt; + } + } + } + } + + CleanupStack::PopAndDestroy( &objectDefQuery ); + emptyRowData.Reset(); + + RMdsStatement propertyDefQuery; + CleanupClosePushL( propertyDefQuery ); + + if( test == KErrNone ) + { + TRAP( test, connection.ExecuteQueryL( KValidatePropertyDef, propertyDefQuery, emptyRowData ) ); + if(test == KErrNone) + { + emptyRowData.AppendL( TColumn( count ) ); + TRAP( test, connection.NextRowL(propertyDefQuery, emptyRowData)); + if(test == KErrNone) + { + emptyRowData.Column(0).Get( count ); + + if(count <= 0) + { + test = KErrCorrupt; + } + } + } + } + + CleanupStack::PopAndDestroy( &propertyDefQuery ); + emptyRowData.Reset(); + + RMdsStatement relationDefQuery; + CleanupClosePushL( relationDefQuery ); + + if( test == KErrNone ) + { + TRAP( test, connection.ExecuteQueryL( KValidateRelationDef, relationDefQuery, emptyRowData ) ); + if(test == KErrNone) + { + emptyRowData.AppendL( TColumn( count ) ); + TRAP( test, connection.NextRowL(relationDefQuery, emptyRowData)); + + if(test == KErrNone) + { + emptyRowData.Column(0).Get( count ); + + if(count <= 0) + { + test = KErrCorrupt; + } + } + } + } + + CleanupStack::PopAndDestroy( &relationDefQuery ); + emptyRowData.Reset(); + + RMdsStatement col2propQuery; + CleanupClosePushL( col2propQuery ); + + if( test == KErrNone ) + { + TRAP( test, connection.ExecuteQueryL( KValidateCol2Prop, col2propQuery, emptyRowData ) ); + if(test == KErrNone) + { + emptyRowData.AppendL( TColumn( count ) ); + TRAP( test, connection.NextRowL(col2propQuery, emptyRowData)); + + if(test == KErrNone) + { + emptyRowData.Column(0).Get( count ); + + if(count <= 0) + + { + test = KErrCorrupt; + } + } + } + } + CleanupStack::PopAndDestroy( &col2propQuery ); + + CleanupStack::PopAndDestroy( &emptyRowData ); + + if(test == KErrCorrupt ) + { + User::Leave( test ); + } + return ( test == KErrNone ); } @@ -89,3 +226,49 @@ CleanupStack::PopAndDestroy( &emptyRowData ); } +TBool CMdSSqlDbMaintenance::CheckForCorruptionL() + { + // Check the MDS default namespace main table for validity + // This table should always contain at least 1 default system folder object + _LIT( KValidateData, "SELECT COUNT(*) FROM Object%u;" ); + + RBuf commonClauseOne; + User::LeaveIfError( commonClauseOne.Create( KValidateData.iTypeLength + KMaxUintValueLength ) ); + CleanupClosePushL( commonClauseOne ); + commonClauseOne.Format( KValidateData, KDefaultNamespaceDefId ); + + RRowData emptyRowData; + CleanupClosePushL( emptyRowData ); + + RMdsStatement validationQuery; + CleanupClosePushL( validationQuery ); + + CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL(); + + TInt test( KErrNone ); + TUint32 count( 0 ); + TRAP( test, connection.ExecuteQueryL( commonClauseOne, validationQuery, emptyRowData ) ); + if( test == KErrNone ) + { + emptyRowData.AppendL( TColumn( count ) ); + TRAP( test, connection.NextRowL(validationQuery, emptyRowData)); + if(test == KErrNone) + { + emptyRowData.Column(0).Get( count ); + + if(count <= 0) + { + test = KErrCorrupt; + } + } + } + + CleanupStack::PopAndDestroy( &validationQuery ); + + CleanupStack::PopAndDestroy( &emptyRowData ); + + CleanupStack::PopAndDestroy( &commonClauseOne ); + + return ( test == KErrNone ); + } +