metadataengine/server/inc/mdssqlfindoperation.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 18 Jan 2010 20:34:07 +0200
changeset 0 c53acadfccc6
child 60 79f826a55db2
permissions -rw-r--r--
Revision: 201001 Kit: 201003

/*
* Copyright (c) 2005-2009 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:  Manages object search from database using SQL,*
*/

#ifndef __MDSSQLFINDOPERATION_H__
#define __MDSSQLFINDOPERATION_H__

#include <e32base.h>

#include "mdccommon.h"
#include "mdssqliteconnection.h"

// FORWARD DECLARATIONS
class CMdSSqLiteConnection;
class CMdSFindSqlClause;
class CMdSFindSequence;
class CMdCSerializationBuffer;
class CDesC16Array;
class RRowData;


/**
* Find operation class represents a single synchronous
* or asynchronous find.
*/
class CMdSSqlFindOperation: public CBase
    {
    public:
	    /** state of operation */
	    enum TOperationState
	    	{
	        EStateIdle,     // not working
	        EStateRunning,  // active state
	        EStateStop,     // stop instructed
	        EStateDead,     // find stopped
	        };

        /**
        * constructs a find operation        
        * @param aFind the master class that runs this operation        
        * @param aSetSize maximum size of a single result set
        */
        static CMdSSqlFindOperation* NewL(            
            CMdSFindSequence& aFind,            
            TUint aSetSize
             );

        /**
        * constructs a find operation, leaves in cleanup stack.
        */
        static CMdSSqlFindOperation* NewLC(            
            CMdSFindSequence& aFind,            
            TUint aSetSize
             );

        virtual ~CMdSSqlFindOperation();

        /**
        * from MMdSFindOperation
        */
        TInt ExecuteL();

        /**
        * from MMdSFindOperation
        */
        TInt ContinueL();

        /**
        * from MMdSFindOperation
        */
        TInt State();

        /**
        * from MMdSFindOperation
        */
        void Cancel();

        /**
        * from MMdSFindOperation
        */
        CMdSFindSqlClause& FindCriteria();

        /**
        * Moves ownership of the result buffer to caller
        */
        CMdCSerializationBuffer* Results();

		void SetLimit(TUint32 aLimit);

		void SetOffset(TUint32 aOffset);

        /**
         * Returns query freetext array from CMdSFindSqlClause
         * @return freetext array
         */
        RPointerArray<HBufC>& QueryFreeText();

    private: // private construction for friends only

        /**
        * Construction
        */
        CMdSSqlFindOperation(            
            CMdSFindSequence& aFind,
            TUint aSetSize = KMaxTUint
             );

        /** 2nd phase constructor */
        void ConstructL();

    private: // Private functions

        /**
        * iterates results from database,
        * places them in results container
        * @return error code, KErrNone or KSetReady
        */
        TInt FetchResultsL();

		TInt EstimateBaseResultSize();

		TInt EstimateResultRowSizeL( RRowData& aRow );

        /**
        * Gets query results from the rowbuffer, creates
        * corresponding object structure and adds into the
        * results container.
        * @param aDb database connection
        * @param aRow database row to add into container
        * @return true, if data was added to container
        */
	    void AddToContainerL();

        /**
        * Special treatment for Object, which is complicated
        * because of heavy optimization
        * @param aRow database row to add into container
        * @param aFreespaceOffset offset to free space in buffer
        */
	    TMdCOffset AddObjectToContainerL( RRowData& aRow, TMdCOffset aFreespaceOffset );

        /**
        * Marks the current database rows consumed
        */
        void ConsumeRows();
        
        /**
        * Add data to container 
        * @param aRow database row to add into container
        * @param aFreespaceOffset offset to free space in buffer
        */
        TMdCOffset AddItemToContainerL( RRowData &aRow, TMdCOffset aFreespaceOffset );
    
        /**
        * Add data to container 
        * @param aId item ID to add into container
        */
        void AddIdToContainerL( TItemId aId );
    
        /**
        * Creates Item for serialization
        */
        void CreateItemL();
    
        /**
        * Creates count for serialization
        */
        void CreateCountL();
    
        /**
        * Creates Id for serialization
        */
        void CreateIdL();
                
        /**
        * Creates distinct properties for serialization
        */
        void CreateDistinctL();
    
    private: // Member data
    
        /** Find type */
        TQueryType iQueryType;

		/** Result mode */
		TQueryResultMode iResultMode;

        /**
        * Data row in find.
        * Note: RRowData constructor cannot leave, since it is initialized (aInStack==EFalse)
        */
		RRowData* iResultRow;

        /**
        * Fetched result rows. Used when result mode is items or distinct.
        * Note: RRowData constructor cannot leave, since it is initialized (aInStack==EFalse)
        */
        RPointerArray<RRowData> iResultRows;

        /**
        * Fetched result IDs. Used when result mode is IDs.
        */
        RArray<TItemId> iResultIds;

        /**
        * Fetched result count. Used when result mode is count.
        */
        TUint32 iResultCount;

        /** container for result objects */
        CMdCSerializationBuffer* iResults;

        /** the object find back reference */
        CMdSFindSequence& iFind;

        /** the find SQL clause */
        CMdSFindSqlClause* iFindClause;

        /** asynchronous run state */
        TOperationState iState;

        /** the query ID */
        RMdsStatement iQueryId;

        /** maximum size of a single set */
        const TUint32 iSetSize;

        /** counter for results in this set */
        TUint iSetCounter;

        /** maximum size of the whole search */
        TUint iLimit;

        /** maximum size of the whole search */
        TUint iLimitCounter;

        /** offset from beginning of the sequence */
        TUint iOffset;

        /** used memory from set buffer */
        TInt iMemoryLimit;
        
        /** harvesting prioritization URI count */
        TInt iHarvestingPrioritizationCount;
    };

#endif // __MDSSQLFINDOPERATION_H__