--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sql/SRC/Server/SqlSrvDriveSpace.h Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,107 @@
+// Copyright (c) 2004-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:
+// Reserving/Accessing/Releasing drive space - CSqlDriveSpace and RSqlDriveSpaceCol classes declarations
+//
+//
+
+#ifndef __SQLSRVDRIVESPACE_H__
+#define __SQLSRVDRIVESPACE_H__
+
+#include <f32file.h>
+
+//Forward declarations
+class RSqlDriveSpaceCol;
+class CSqlServer;
+
+#ifdef _DEBUG
+#define SQLDRIVESPACE_INVARIANT() Invariant()
+#define SQLDRIVESPACECOL_INVARIANT() Invariant()
+#else
+#define SQLDRIVESPACE_INVARIANT() void(0)
+#define SQLDRIVESPACECOL_INVARIANT() void(0)
+#endif
+
+/**
+This class describes an object, which is responsible for handling
+"reserve/get access/release" requests for a particular drive.
+
+Since the drive may be shared between more than one server side session and there is only one RFs instance,
+the current solution is that CSqlDriveSpace objects reserve some predefined amount of disk space
+at the time of their creation and then the access to the reserved disk space is reference counted.
+ There is one obvious disadvantage of this solution: if a bad application "forgets" to release
+the access to the reserved disk space, then the reserved (but not released) disk space may be used by the server.
+At the moment, when some client will really need the reserved disk space to complete its "delete" transaction,
+it may happen that there is no reserved disk space at all.
+
+@see RSqlDriveSpaceCol
+@internalComponent
+*/
+NONSHARABLE_CLASS(CSqlDriveSpace) : public CBase
+ {
+public:
+ static CSqlDriveSpace* NewLC(RFs& aFs, TDriveNumber aDrive);
+ virtual ~CSqlDriveSpace();
+ inline TDriveNumber Drive() const;
+ void GetAccessL();
+ void ReleaseAccess();
+ void Invariant() const;
+
+private:
+ CSqlDriveSpace(RFs& aFs, TDriveNumber aDrive);
+ void ConstructL();
+
+private:
+ RFs& iFs; //File session reference
+ TDriveNumber iDrive; //Drive number
+ TInt iGetAccessRefCnt; //"Get access" requests count
+
+ };
+
+/**
+@return The drive number, where the CSqlDriveSpace object handles the reservation requests
+*/
+inline TDriveNumber CSqlDriveSpace::Drive() const
+ {
+ return iDrive;
+ }
+
+/**
+This class describes a collection of CSqlDriveSpace objects. Each CSqlDriveSpace object in the
+collection is responsible for handling "reserve/get access/release" requests for a particular
+drive.
+
+Only one RSqlDriveSpaceCol instance should be created (resp. destroyed) by the CSqlServer object.
+
+@see CSqlServer
+@see CSqlDriveSpace
+
+@internalComponent
+*/
+NONSHARABLE_CLASS(RSqlDriveSpaceCol)
+ {
+public:
+ RSqlDriveSpaceCol();
+ void Create(RFs& aFs);
+ void ResetAndDestroy();
+ CSqlDriveSpace* Find(TDriveNumber aDrive);
+ CSqlDriveSpace* AddL(TDriveNumber aDrive);
+ void Invariant() const;
+
+private:
+ RFs* iFs; //File session reference
+ RPointerArray<CSqlDriveSpace> iDriveSpaceCol; //Collection of CSqlDriveSpace objects: one per drive
+
+ };
+
+#endif//__SQLSRVDRIVESPACE_H__