diff -r 000000000000 -r c53acadfccc6 metadataengine/server/inc/mdssqlobjectmanipulate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/metadataengine/server/inc/mdssqlobjectmanipulate.h Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,574 @@ +/* +* Copyright (c) 2002-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: Add, update and remove items in DB.* +*/ + +#ifndef __MDSSQLOBJECTMANIPULATE_H__ +#define __MDSSQLOBJECTMANIPULATE_H__ + +// INCLUDE FILES +#include +#include + +#include "mdscommoninternal.h" + +#include "mdsclausebuffer.h" + +// FORWARD DECLARATION +class CMdSSqLiteConnection; +class CMdsSchema; +class CMdCFolder; +class RMdsStatement; +class CMdsNamespaceDef; +class CMdsObjectDef; +class CMdsPropertyDef; +class CMdCSerializationBuffer; +class CMdsClauseBuffer; +class RRowData; +class TColumn; +class CMdSObjectLockList; +class CMdSServerSession; +class RMdsStatement; + +// CLASS DECLARATION +/** + * + */ +class CMdSIdentifierGenerator: public CBase + { + public: // Constructors and destructor + /** + * Two-phased constructor. + * @param aPool, reference to pool for reserve database connection. + * @return Pointer to CMdSIdentifierGenerator object. + */ + static CMdSIdentifierGenerator* NewL(); + + /** + * Two-phased constructor. + * @param aPool, reference to pool for reserve database connection. + * @return Pointer to CMdSIdentifierGenerator object. + */ + static CMdSIdentifierGenerator* NewLC(); + + /** + * Destructor. + */ + virtual ~CMdSIdentifierGenerator(); + + /** + * Set guid to generated ones if both are 0 + */ + void GenerateGuid( TInt64& aGuidHigh, TInt64& aGuidLow ); + + /** + * Return unique uri + * method require unique guid's + */ + HBufC* GenerateUriL( const CMdsObjectDef& aObjectDef, + const TInt64& aGuidHigh, const TInt64& aGuidLow ) const; + + private: // Private constructors + /** + * CMdSIdentifierGenerator. + * C++ default constructor. + */ + CMdSIdentifierGenerator( ) + { + iDigest = NULL; + } + + /** + * ConstructL. + * 2nd phase constructor. + */ + void ConstructL( ); + + private: //Internal variables + TInt64 iImei; + TInt64 iLastTime; + + CMessageDigest* iDigest; + }; + + +/** + * CMdSSqlObjectManipulate converts object handling + * instructions to an SQL clause. + */ +class CMdSSqlObjectManipulate: public CBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aPool, reference to pool for reserve database connection. + * @return Pointer to CMdSSqlObjectManipulate object. + */ + static CMdSSqlObjectManipulate* NewL( const CMdsSchema& aSchema, + CMdSObjectLockList& aLockList ); + + /** + * Two-phased constructor. + * @param aPool, reference to pool for reserve database connection. + * @return Pointer to CMdSSqlObjectManipulate object. + */ + static CMdSSqlObjectManipulate* NewLC( const CMdsSchema& aSchema, + CMdSObjectLockList& aLockList ); + + /** + * Destructor. + */ + virtual ~CMdSSqlObjectManipulate(); + + + private: // Private constructors + + /** + * CSqlObjectManipulate. + * C++ default constructor. + */ + CMdSSqlObjectManipulate( const CMdsSchema& aSchema, + CMdSObjectLockList& aLockList ); + + /** + * ConstructL. + * 2nd phase constructor. + */ + void ConstructL( ); + + + public: // Public functions + + /** + * Add new object to DB (not using any transaction system) + * + * @param aBuffer serialized object with properties and freeText + * @return new added object id + */ + TItemId AddObjectL( CMdSSqLiteConnection& aConnection, + CMdCSerializationBuffer& aBuffer, + RMdsStatement& aMdsBaseObjStatement, RMdsStatement& aMdsObjStatement, + const CMdSServerSession* aServerSession = NULL ); + + /** + * Really add freetext to DB + * + * @param aWord word to add + * @param aObjectId owner of freetext object id + * @param aPosition position + * @param aSearch search for existing freetext in DB + */ + TUint32 AddFreeTextToDBL( TPtrC16& aWord, TItemId aObjectId, + TInt32 aPosition, TBool aSearch = ETrue ); + + /** + * Add new freeText to DB (not using any transaction system) + * (check if FreeText is in DB and in this case don't add it) + * + * @param aBuffer serialized object with FreeText + * @param aFreeTextCount freetext count + * @param aObjectId freetext owner object ID + * @return how many freeText was added to DB + */ + TInt AddFreeTextL( CMdCSerializationBuffer& aBuffer, TInt aFreeTextCount, TItemId aObjectId ); + + /** + * remove object by URI - just for internal use! + */ + void RemoveObjectForceL( const TDesC16& aUri, TItemId aObjectId ); + + /** + * USE RemoveObjectForceL WITH CAUTION !!! + * THIS FUNCTION REMOVES OBJECT WITHOUT ANY CHECKING + * ONLY FOR INTERNAL USE !!! + */ + void RemoveObjectForceL( TItemId aObjectId ); + + CMdCSerializationBuffer* CheckObjectL( TInt aResultBufferSize, + const TDesC& aUri, TDefId aNamespaceDefId ); + + CMdCSerializationBuffer* CheckObjectL( TInt aResultBufferSize, + TItemId aId, TDefId aNamespaceDefId ); + + CMdCSerializationBuffer* CheckObjectL( TInt aResultBufferSize, + CMdCSerializationBuffer& aIds, TDefId aNamespaceDefId ); + + void CollectRemovedItemsL( RArray& aRemoveIds, + RArray& aObjectIds, RArray& aRelationIds, + RArray& aEventIds ); + + /** + * Remove object using it's id + * + * @param aBuffer id's to remove + * @param aCount id's count + * @param aIdArray result id's + * @param aUserLevel not used - delete + * @param aLockList list of locked objects + */ + void RemoveObjectsByIdL( CMdCSerializationBuffer& aBuffer, TInt aCount, + RArray& aIdArray, RArray& aRelationIds, + RArray& aEventIds ); + + /** + * Remove object using it's URI's + * + * @param aBuffer URI's to remove + * @param aCount URI's count + * @param aIdArray result id's + * @param aUserLevel not used - delete + * @param aLockList list of locked objects + */ + void RemoveObjectsByUriL( CMdCSerializationBuffer& aBuffer, TInt aCount, + RArray& aIdArray, RArray& aRelationIds, + RArray& aEventIds ); + + /** + * search for object uri + * + * @param aUri object uri to search for + * @param aFlags return found object flags + * @return object id + */ + TItemId SearchObjectByUriL( const TDesC16& aUri, TUint32& aFlags ); + + /** + * update freetext (add and remove) + */ + void UpdateFreeTextL( CMdCSerializationBuffer& aBuffer, TInt aCount, + TItemId aObjectId ); + + /** + * Update object + * + * @param aBuffer objects to update + * @param aLockList list of locked objects + */ + TItemId UpdateObjectL( CMdSSqLiteConnection& aConnection, + CMdCSerializationBuffer& aBuffer ); + + /** + * Runs garbage collection to database + * @param aDb The database connection + * @return next garbage collection start is needed? + */ + TBool GarbageCollectionL(); + + /** + * Set namespace for processing functions + */ + void SetNamespace( const CMdsNamespaceDef* aNamespaceDef ); + + TItemId AddEventL( CMdSSqLiteConnection& aConnection, + CMdCSerializationBuffer& aBuffer ); + + TItemId AddRelationL( CMdSSqLiteConnection& aConnection, + CMdCSerializationBuffer& aBuffer ); + + void RemoveEventsL( CMdCSerializationBuffer& aBuffer, TInt aCount, + RArray& aIdArray ); + + void RemoveRelationsL( CMdCSerializationBuffer& aBuffer, TInt aCount, + RArray& aIdArray ); + + TItemId UpdateRelationsL( CMdSSqLiteConnection& aConnection, + CMdCSerializationBuffer& aBuffer ); + + /** + * Add memory card media ID + * @param aDb The database connection + * @param aMediaId Memory card's media ID + */ + void AddMemoryCardL(TUint32 aMediaId); + + /** + * Get the latest memory card's media ID + * @param aDb The database connection + * @param aMediaId Returns the latest memory card's media ID + * @leave KErrNotFound Not memory cards exist at all + */ + void GetMemoryCardL(TUint32& aMediaId); + + /** + * Checks if memory card's with given media ID exists + * @param aMediaId memory card's media ID + * @return memory card exists or not + */ + TBool CheckMemoryCardL(TUint32 aMediaId); + + /** + * Set media's media ID, drive and present state to DB. + * + * @param aMediaId media ID + * @param aMediaId drive + * @param aMediaId present state + */ + void SetMediaL(TUint32 aMediaId, TChar aDrive, TBool aPresentState); + + /** + * Check if the media's with given media ID exist in DB and return + * drive and present state. + * + * @param aMediaId given media ID + * @param aMediaId drive + * @param aMediaId present state + * + * @return does media exist + */ + TBool GetMediaL(TUint32 aMediaId, TChar& aDrive, TBool& aPresentState); + + /** + * Get present medias' media IDs and drives. + * + * @param aMediaInfoBuffer buffer where media infos are written + * + * @return present media count + */ + TInt32 GetPresentMediasL(TDes8& aMediaInfoBuffer); + + /** + * Search file object which is in not present state. + * + * @param aDb The database connection + * @param aMediaId Memory card's media ID + * @param aUri File's URI + * @param aFileInfo File information + * + * @leave KErrNotFound If not present state file object doesn't exist + * with given URI and media ID + */ + TItemId SearchNotPresentFileL(TUint32 aMediaId, TDesC16& aUri, + TMdSFileInfo& aFileInfo, + TFilePresentStates& aPlaceHolder, TBool& aNotPresentState); + + /** from MMdSObjectManipulate */ + void SetFilesToPresentL(const RArray& aObjectIds); + + /** + * Sets object's relation to present state. + * @param aObjectId object ID + * @param aIdArray marked relations ID's + */ + void SetRelationsToPresentL(TItemId aObjectId, + RArray& aIdArray); + + /** + * Sets all file objects from last memory card to not present state. + * @param aMediaId Memory card's media ID + * @param aObjectIds Object IDs of those object which are set to not + * present state + */ + void SetFilesToNotPresentL(TUint32 aMediaId, TBool aStartUp, RArray& aObjectIds); + + /** + * Sets file objects relations from last memory card to not present + * state. + * + * @param aMediaId Memory card's media ID + * @param aRelationIds changed relation id's + */ + void SetRelationsToNotPresentL(TUint32 aMediaId, + RArray& aRelationIds); + + /** + * Removes all file objects which has given media ID and are in not + * present. + * + * @param aMediaId Memory card's media ID + */ + void RemoveFilesNotPresentL(TUint32 aMediaId, RArray* aObjectIds); + + /** + * Get schema version from DB + * @param aConnection The database connection + * @param aMajorVersion schema major version + * @param aMinorVersion schema minor version + */ + void GetSchemaVersionL(TInt& aMajorVersion, TInt& aMinorVersion); + + /** + * Set object to "present" state bu GUID + * + * @leave KErrNotFound MdE can't find object in "not present" state + * with matching GUID + */ + void SetObjectToPresentByGuidL( + const TInt64& aGuidHigh, const TInt64& aGuidLow ); + + /** + * Change path of objects, which match to the old path, to the new + * path. + * + * @param aOldPath the old path + * @param aNewPath the new path + * @param aObjectIds IDs of the change objects + */ + void ChangePathL(const TDesC& aOldPath, const TDesC& aNewPath, + RArray& aObjectIds); + + /** + * Change C-drive media id and update it to all objects that have the old id. + */ + void ChangeMediaIdL(); + + /** + * Get removed relation items + * + * @param aBuffer buffer to fill with returned items + * @param aRemovedRelations removed relations + * @param aAdditionalRemovedRelations possible additional removed relations + */ + void GetRemovedRelationItemsL( CMdCSerializationBuffer& aBuffer, + const RArray& aRemovedRelations, + const RArray& aAdditionalRemovedRelations ); + + /** + * Set/reset "binary composing to file" pending flag to objects + * + * @param aObjectIds object IDs + * @param aReset when EFalse flags are setted and when ETrue flags are + * resetted + */ + void SetPendingL(const RArray& aObjectIds, TBool aReset); + + /** + * Get count of objects with "binary composing to file" pending flag + * + * @param aObjectDefId object def ID + * + * @return if >= 0, object count is returned, otherwise error code is + * returned + */ + TInt GetPendingCountL(TDefId aObjectDefId); + + /** + * Get objects with "binary composing to file" pending flag + * + * @param aObjectDefId object def ID + * @param aBufferSize maximum ID count of buffer + * @param aObjectIds returned object IDs + * + * @return if > 0, there was not enough space in buffer, otherwise + * error code is returned + */ + TInt GetPendingL(TDefId aObjectDefId, TInt aBufferSize, + RArray& aObjectIds); + + protected: // personal methods + + /** + * Add single property from aBuffer and adds it to proper clause and + * row data. + * + * @param aBuffer serialized property + * @param aObjectDef definition of current object + * @param aBaseObjectClause clause describing base object + * @param aObjectClause clause describing current object + * @param aBaseObjectDataRow data row contains base object values + * @param aObjectDataRow data row contains current object values + * @return new property definition + */ + const CMdsPropertyDef& ReadPropertyL( + CMdCSerializationBuffer& aBuffer, + const CMdsObjectDef& aObjectDef, + CMdsClauseBuffer& aBaseObjectClause, + CMdsClauseBuffer& aObjectClause, + RRowData& aBaseObjectDataRow, RRowData& aObjectDataRow, + TUint8& aFlags ); + + /** + * Search in DB for freeText + * + * @param aFreeText freetext to search for + * @return if find ETrue, else EFalse + */ + TItemId FindFreeTextInDbL( TPtrC16 aFreeText ); + + /** + * Deletes BaseObject. + */ + TBool DoGarbageCollectionL(); + + private: // Member data + struct TLockBuffer + { + CMdsClauseBuffer* iBuffer; + TBool iLock; + }; + + TRequestStatus iTextSearcherDeleteFreeTextStatus; + + TItemId iTextSearcherDeleteFreeTextObjectId; + + TRequestStatus iTextSearcherAddFreeTextStatus; + + TItemId iTextSearcherAddFreeTextObjectId; + + TItemId iCreationEventId; + + TItemId iDeletionEventId; + + /** + * pointer to actual processing namespace + */ + const CMdsNamespaceDef* iNamespaceDef; + + /** + * common usage buffers (initial size = 1024) + * NOT THREAD SAFE! + */ + RArray iBuffers; + + /** + * BaseObject definition, used in addobject and addproperty + */ + const CMdsObjectDef* iBaseObjectDef; + + /** + * Store every namespace read from schema file. + */ + const CMdsSchema& iSchema; + + /** + * guid generator + */ + CMdSIdentifierGenerator* iGenerator; + + CMdSObjectLockList& iLockList; + + TBuf<256> iLastAddedObjName; + + private: + class RClauseBuffer + // NOT THREAD SAFE !!!!! + { + public: + RClauseBuffer(CMdSSqlObjectManipulate& aSOM, TInt aSize = 1024); + + CMdsClauseBuffer& BufferL(); + + void Close(); + + private: + RArray& iBuffers; + CMdsClauseBuffer* iBuffer; + TInt iNr; + const TInt iSize; + }; + }; + +#include "mdssqlobjectmanipulate.inl" + +#endif // __MDSSQLOBJECTMANIPULATE_H__