--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/dbms/ustor/US_FILE.CPP Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,178 @@
+// Copyright (c) 1998-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:
+// The file-store database which provides the default format
+//
+//
+
+#include "US_STD.H"
+#include <s32file.h>
+
+EXPORT_C CDbFileStoreDatabase::CDbFileStoreDatabase(RFs& aFs)
+ :iFs(aFs)
+ {}
+
+EXPORT_C CDbFileStoreDatabase::~CDbFileStoreDatabase()
+ {
+ if (iDelete)
+ {
+ delete iStore; // must be destroyed before the file is deleted
+ iStore=0;
+
+ // If a debug build - record error
+ TInt fileDeleteErr=iFs.Delete(*iName);
+ #ifdef _DEBUG
+ if (fileDeleteErr != KErrNone)
+ {
+ RDebug::Print(_L("CDbFileStoreDatabase::~CDbFileStoreDatabase - Failed to delete file. Error = %d"), fileDeleteErr);
+ }
+ #endif
+ }
+ delete iName;
+ }
+
+CDbFileStoreDatabase* CDbFileStoreDatabase::NewLC(RFs& aFs)
+ {
+ CDbFileStoreDatabase* self=new(ELeave) CDbFileStoreDatabase(aFs);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+//
+// over-ride the store database and just mark the file for deletion
+//
+EXPORT_C void CDbFileStoreDatabase::DestroyL()
+ {
+ iDelete=ETrue;
+ }
+
+//
+// Provide the "size" and "usage" properties
+//
+EXPORT_C TInt CDbFileStoreDatabase::Property(CDbDatabase::TProperty aProperty)
+ {
+ switch (aProperty)
+ {
+ case CDbDatabase::EUpdateStats:
+ return 1;
+ case CDbDatabase::ESize:
+ case CDbDatabase::EUsage:
+ {
+ TInt size;
+ TInt r=STATIC_CAST(CFileStore&,Store()).File().Size(size);
+ if (r<0)
+ return r;
+ if (aProperty==CDbDatabase::ESize)
+ return size;
+ r=iReclaim;
+ if (r<0)
+ return r;
+ return 100-(r*100)/size; // usage in %
+ }
+ default:
+ return CDbStoreDatabase::Property(aProperty);
+ }
+ }
+
+
+//SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version of the method.
+EXPORT_C void CDbFileStoreDatabase::CreateL(const TDesC& aName, TDbFormat::TCreate aMode,
+ const TUidType& aType)
+ {
+ __ASSERT(!iName); // check construction phase
+//
+ iName=aName.AllocL();
+ CFileStore* store;
+ switch (aMode)
+ {
+ default:
+ __LEAVE(KErrNotSupported);
+ case TDbFormat::ECreate:
+ store=CPermanentFileStore::CreateL(iFs,aName,EFileRead|EFileWrite);
+ break;
+ case TDbFormat::EReplace:
+ store=CPermanentFileStore::ReplaceL(iFs,aName,EFileRead|EFileWrite);
+ break;
+ };
+ iStore=store;
+ iDelete=ETrue; // cleanup fully in case of failure
+ store->SetTypeL(aType);
+ store->SetRootL(CreateRootL(CDbStoreDatabase::ConstructL()));
+ store->CommitL();
+ iDelete=EFalse; // file is now good
+ }
+
+// SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version of the method.
+// Create the standard file database. The database is the root stream
+//
+EXPORT_C CDbDatabase* CDbFileStoreDatabase::CreateL(RFs& aFs, const TDesC& aName,
+ TDbFormat::TCreate aMode, const TUidType& aType)
+ {
+ CDbFileStoreDatabase* self=NewLC(aFs);
+ self->CreateL(aName,aMode,aType);
+ CDbDatabase* db=self->InterfaceL();
+ CleanupStack::Pop(self);
+ return db;
+ }
+
+
+//
+// default implementation. Database _is_ the root
+//
+EXPORT_C TStreamId CDbFileStoreDatabase::CreateRootL(TStreamId aDatabaseId)
+ {
+ return aDatabaseId;
+ }
+
+//
+// Open, phase #1
+// open the file-store and return the root stream id
+//
+EXPORT_C void CDbFileStoreDatabase::OpenL(const TDesC& aName,TDbFormat::TOpen aMode)
+ {
+ __ASSERT(!iName); // check construction phase
+//
+ iName=aName.AllocL();
+ const TUint mode=aMode==TDbFormat::EReadOnly ? EFileShareReadersOnly : EFileWrite;
+ CFileStore* store=CPermanentFileStore::OpenL(iFs,*iName,mode);
+ iStore=store;
+ CDbStoreDatabase::RestoreL(DatabaseIdL(store->Root()));
+ }
+
+//
+// default implementation. Database _is_ the root
+//
+EXPORT_C TStreamId CDbFileStoreDatabase::DatabaseIdL(TStreamId aRootId)
+ {
+ return aRootId;
+ }
+
+//
+// Create the standard file database. The database is the root stream
+//
+EXPORT_C CDbSource* CDbFileStoreDatabase::OpenL(RFs& aFs,const TDesC& aName,TDbFormat::TOpen aMode)
+ {
+ CDbFileStoreDatabase* self=NewLC(aFs);
+ self->OpenL(aName,aMode);
+ CDbSource* src=self->SourceL();
+ CleanupStack::Pop(); // self
+ return src;
+ }
+
+const TDbFormat KBuiltinFormat=
+ {
+ _S("epoc"),&CDbFileStoreDatabase::CreateL,&CDbFileStoreDatabase::OpenL,
+ {KPermanentFileStoreLayoutUidValue,KDbmsFileDatabaseUidValue}
+ };
+
+GLDEF_D const TDbDriver KBuiltinDriver={1,&KBuiltinFormat};