metadataengine/server/src/mdslogger.cpp
changeset 0 c53acadfccc6
child 1 acef663c1218
equal deleted inserted replaced
-1:000000000000 0:c53acadfccc6
       
     1 /*
       
     2 * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Metadata server logger class*
       
    15 */
       
    16 
       
    17 #include "mdslogger.h"
       
    18 #include "mdsclausebuffer.h"
       
    19 #include "mdssqliteconnection.h"
       
    20 
       
    21 
       
    22 #ifdef LOG_MASTER_FLAG
       
    23 
       
    24 // ========================= MEMBER FUNCTIONS ==================================
       
    25 
       
    26 // ------------------------------------------------
       
    27 // NewInstanceL
       
    28 // ------------------------------------------------
       
    29 //
       
    30 CMdSLogger* CMdSLogger::NewInstanceL()
       
    31     {
       
    32     static CMdSLogger* singleton;
       
    33     if ( singleton == NULL )
       
    34         {
       
    35         singleton = new (ELeave) CMdSLogger();      
       
    36         CleanupStack::PushL(singleton);
       
    37         singleton->ConstructL();
       
    38         CleanupStack::Pop(singleton);
       
    39         }
       
    40     return singleton;
       
    41     }
       
    42 
       
    43 // ------------------------------------------------
       
    44 // Default constructor
       
    45 // ------------------------------------------------
       
    46 //
       
    47 CMdSLogger::CMdSLogger()
       
    48 	: iAltFileFlag(EFalse), iValid(EFalse)
       
    49     {
       
    50     }
       
    51 
       
    52 // ------------------------------------------------
       
    53 // Destructor
       
    54 // ------------------------------------------------
       
    55 //
       
    56 CMdSLogger::~CMdSLogger()
       
    57     {
       
    58     iLog.CloseLog(); 
       
    59     iLog.Close();
       
    60     }
       
    61 
       
    62 // ------------------------------------------------
       
    63 // ConstructL
       
    64 // ------------------------------------------------
       
    65 //
       
    66 void CMdSLogger::ConstructL()
       
    67     {
       
    68     User::LeaveIfError( iLog.Connect() );
       
    69     iLog.CreateLog(KDirectory, KFilename, EFileLoggingModeOverwrite);
       
    70     iLog.SetDateAndTime(EFalse, ETrue);
       
    71     
       
    72     iValid = iLog.LogValid();
       
    73 
       
    74     // set up logging categories
       
    75     Activate( ELogAlways );
       
    76 #ifdef LOG_QUERY
       
    77     Activate( ELogQuery );
       
    78 #endif
       
    79 #ifdef LOG_DB
       
    80     Activate( ELogDb );
       
    81 #endif
       
    82 #ifdef LOG_MUTEX
       
    83     Activate( ELogMutex );
       
    84 #endif
       
    85 #ifdef LOG_SERVER
       
    86     Activate( ELogServer );
       
    87 #endif
       
    88     }
       
    89 
       
    90 // ------------------------------------------------
       
    91 // LogLit
       
    92 // ------------------------------------------------
       
    93 //
       
    94 void CMdSLogger::LogLit( const TDesC8& aText )
       
    95     {
       
    96     if (!iValid)
       
    97     	{
       
    98     	return;
       
    99     	}
       
   100 
       
   101     TInt offset = 0;
       
   102     TInt linecount = 0;
       
   103     TInt length = aText.Length();
       
   104     while( offset < length )
       
   105         {
       
   106         TInt partLength = Min( length-offset, KLineLength );
       
   107 #ifdef MDE_FILE_LOGGING
       
   108         iLog.Write( aText.Mid( offset, partLength ) );
       
   109 #else
       
   110         TBuf<KLineLength> buffer;
       
   111         buffer.Copy( aText.Mid( offset, partLength ) );
       
   112         RDebug::Print( buffer );
       
   113 #endif
       
   114         ++linecount;
       
   115         offset += partLength;
       
   116         }
       
   117     CheckSize( linecount );
       
   118     }
       
   119 
       
   120 // ------------------------------------------------
       
   121 // LogLit
       
   122 // ------------------------------------------------
       
   123 //
       
   124 void CMdSLogger::LogLit( const TDesC16& aText )
       
   125     {
       
   126     if (!iValid)
       
   127     	{
       
   128     	return;
       
   129     	}
       
   130 
       
   131     TInt offset = 0;
       
   132     TInt linecount = 0;
       
   133     TInt length = aText.Length();
       
   134     while( offset < length )
       
   135         {
       
   136         TInt partLength = Min( length-offset, KLineLength );
       
   137 #ifdef MDE_FILE_LOGGING
       
   138         iLog.Write( aText.Mid( offset, partLength ) );
       
   139 #else
       
   140         RDebug::Print( aText.Mid( offset, partLength ) );
       
   141 #endif
       
   142         ++linecount;
       
   143         offset += partLength;
       
   144         }
       
   145     CheckSize( linecount );
       
   146     }
       
   147 
       
   148 // ------------------------------------------------
       
   149 // CheckSize
       
   150 // ------------------------------------------------
       
   151 //
       
   152 void CMdSLogger::CheckSize( TInt aLines )
       
   153     {
       
   154 #ifdef MDE_FILE_LOGGING
       
   155     iLineCounter += aLines;
       
   156     if ( iLineCounter < KLogfileMaxLength ) return; // no worries
       
   157 
       
   158     iLineCounter = 0;
       
   159 
       
   160     iLog.CloseLog();
       
   161     
       
   162     if ( !iAltFileFlag )
       
   163         {
       
   164         iLog.CreateLog(KDirectory, KAltFilename, EFileLoggingModeOverwrite);
       
   165         iAltFileFlag = ETrue;       
       
   166         }
       
   167     else
       
   168         {
       
   169         iLog.CreateLog(KDirectory, KFilename, EFileLoggingModeOverwrite);
       
   170         iAltFileFlag = EFalse;        
       
   171         }    
       
   172     iLog.SetDateAndTime(EFalse, ETrue);
       
   173 #else
       
   174     aLines = 0;
       
   175 #endif
       
   176     }
       
   177 
       
   178 // ---------------------------------------------------------------------------
       
   179 // DescribeL                Returns sql clause with variables
       
   180 // ---------------------------------------------------------------------------
       
   181 //
       
   182 CMdsClauseBuffer* CMdSLogger::DescribeL( const CMdsClauseBuffer& aBuffer, const RRowData& aRowData )
       
   183     {
       
   184     if (!iValid)
       
   185     	{
       
   186     	return NULL;
       
   187     	}
       
   188 
       
   189     CMdsClauseBuffer* buf = CMdsClauseBuffer::NewLC( aBuffer.ConstBufferL().Length() + 1024 );
       
   190     buf->BufferL().Copy( aBuffer.ConstBufferL() );
       
   191     buf->AppendL( _L(" variables=") );
       
   192     for( TInt i=0; i<aRowData.Size(); ++i )
       
   193         {
       
   194         if ( i>0 ) buf->AppendL( _L(", ") );
       
   195         LogVariableL( *buf, aRowData.Column(i) );
       
   196         }
       
   197     CleanupStack::Pop( buf );
       
   198     return buf;
       
   199     }
       
   200 
       
   201 // ---------------------------------------------------------------------------
       
   202 // DescribeL                Returns sql clause with variables
       
   203 // ---------------------------------------------------------------------------
       
   204 //
       
   205 CMdsClauseBuffer* CMdSLogger::DescribeFullL( const TDesC& aBuffer, const RRowData& aRowData )
       
   206     {
       
   207     if (!iValid)
       
   208     	{
       
   209     	return NULL;
       
   210     	}
       
   211 
       
   212     const TChar KQuestionMark = '?';
       
   213     TPtrC buffer( aBuffer );
       
   214     const TInt aBufferLength = aBuffer.Length();
       
   215     CMdsClauseBuffer* buf = CMdsClauseBuffer::NewLC( aBufferLength *2 );
       
   216     TInt columnNumber = 0;
       
   217     TInt qpos = buffer.Locate( KQuestionMark );
       
   218     while( qpos >= 0 )
       
   219     	{
       
   220 		buf->ReserveSpaceL( buf->ConstBufferL().Length() + qpos );
       
   221 		buf->BufferL().Append( buffer.Left( qpos ) );
       
   222 		LogVariableL( *buf, aRowData.Column(columnNumber++) );
       
   223     	buffer.Set( buffer.Mid( qpos + 1 ) );
       
   224     	qpos = buffer.Locate( KQuestionMark );
       
   225     	}
       
   226 	buf->ReserveSpaceL( buf->ConstBufferL().Length() + buffer.Length() );
       
   227 	buf->BufferL().Append( buffer );
       
   228 
       
   229 	CleanupStack::Pop( buf );
       
   230     return buf;
       
   231     }
       
   232 
       
   233 // ---------------------------------------------------------------------------
       
   234 // LogVariableL         Logging method for query variables
       
   235 // ---------------------------------------------------------------------------
       
   236 //
       
   237 void CMdSLogger::LogVariableL( CMdsClauseBuffer& aBuf, const TColumn& aColumn )
       
   238     {
       
   239     _LIT( KApostrophe, "\'" );
       
   240     switch( aColumn.Type() )
       
   241         {
       
   242         case EColumnNotUsed:
       
   243             {
       
   244             aBuf.ReserveSpaceL( aBuf.ConstBufferL().Length() + 8 );
       
   245             _LIT( KMessageUnused, "<unused>" );
       
   246             aBuf.BufferL().Append( KMessageUnused );
       
   247             break;
       
   248             }
       
   249         case EColumnBool:
       
   250             {
       
   251             TBool val=0;
       
   252             aColumn.Get( val );
       
   253             aBuf.ReserveSpaceL( aBuf.ConstBufferL().Length() + 4 );
       
   254             aBuf.BufferL().AppendNum( val );
       
   255             }
       
   256             break;
       
   257         case EColumnInt32:
       
   258             {
       
   259             TInt32 val=0;
       
   260             aColumn.Get( val );
       
   261             aBuf.ReserveSpaceL( aBuf.ConstBufferL().Length() + 16 );
       
   262             aBuf.BufferL().AppendNum( static_cast<TInt>(val) );
       
   263             }
       
   264             break;
       
   265         case EColumnUint32:
       
   266             {
       
   267             TUint32 val=0;
       
   268             aColumn.Get( val );
       
   269             aBuf.ReserveSpaceL( aBuf.ConstBufferL().Length() + 16 );
       
   270             aBuf.BufferL().AppendNum( val, EDecimal );
       
   271             }
       
   272             break;
       
   273         case EColumnTime:
       
   274             {
       
   275             TTime val(0);
       
   276             TBuf<128> tmp;
       
   277             aColumn.Get( val );
       
   278             _LIT(KTimeFormat, "%D%1.%M%2.%Y%3 %H:%T:%S");
       
   279             val.FormatL(tmp, KTimeFormat);
       
   280             aBuf.ReserveSpaceL( aBuf.ConstBufferL().Length() + 20 );
       
   281             aBuf.BufferL().Append( tmp );
       
   282             }
       
   283             break;
       
   284         case EColumnInt64:
       
   285             {
       
   286             TInt64 val=0;
       
   287             aColumn.Get( val );
       
   288             aBuf.ReserveSpaceL( aBuf.ConstBufferL().Length() + 32 );
       
   289             aBuf.BufferL().AppendNum( val );
       
   290             }
       
   291             break;
       
   292         case EColumnReal32:
       
   293             {
       
   294             TReal32 val=0;
       
   295             aColumn.Get( val );
       
   296             aBuf.ReserveSpaceL( aBuf.ConstBufferL().Length() + 32 );
       
   297             aBuf.BufferL().AppendNum( val, TRealFormat() );
       
   298             }
       
   299             break;
       
   300         case EColumnReal64:
       
   301             {
       
   302             TReal64 val=0;
       
   303             aColumn.Get( val );
       
   304             aBuf.ReserveSpaceL( aBuf.ConstBufferL().Length() + 32 );
       
   305             aBuf.BufferL().AppendNum( val, TRealFormat() );
       
   306             }
       
   307             break;
       
   308         case EColumnDes16:
       
   309             {
       
   310             TPtrC16 val= TPtr16((TUint16*)0, 0); //KNullPtr16;
       
   311             aColumn.Get( val );
       
   312             if( val.Ptr() )
       
   313             	{
       
   314             	aBuf.ReserveSpaceL( aBuf.ConstBufferL().Length() + 
       
   315             			val.Length() + 2 * KApostrophe().Length() ); // for ''
       
   316             	aBuf.BufferL().Append( KApostrophe );
       
   317             	aBuf.BufferL().Append( val );
       
   318             	aBuf.BufferL().Append( KApostrophe );
       
   319             	}
       
   320             else
       
   321             	{
       
   322             	_LIT( KNull, "NULL" );
       
   323             	aBuf.ReserveSpaceL( aBuf.ConstBufferL().Length() + 
       
   324             			KNull().Length() );
       
   325             	aBuf.BufferL().Append( KNull );
       
   326             	}
       
   327             }
       
   328             break;
       
   329         default:
       
   330             User::Leave( KErrCorrupt );
       
   331         }
       
   332     }
       
   333 
       
   334 #endif // LOG_MASTER_FLAG