--- 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 );
+ }
+