diff -r 000000000000 -r f979ecb2b13e notepad/notepad1/SyncMLAdapter/src/nsmlnotepadDatabase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notepad/notepad1/SyncMLAdapter/src/nsmlnotepadDatabase.cpp Tue Feb 02 10:12:19 2010 +0200 @@ -0,0 +1,710 @@ +/* +* Copyright (c) 2003 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: notepad database +* +*/ + + +#include + + +#include +#include "nsmlnotepadDatabase.h" +#include + +#include "nsmlnotepadlogging.h" + + +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::NewL +// ----------------------------------------------------------------------------- +// +CNSmlNotepadDatabase* CNSmlNotepadDatabase::NewL() + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::NewL(): begin"); + + CNSmlNotepadDatabase *instance = new(ELeave) CNSmlNotepadDatabase(); + CleanupStack::PushL(instance); + instance->ConstructL(); + CleanupStack::Pop(instance); + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::NewL(): end"); + return instance; + } +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::~CNSmlNotepadDatabase() +// ----------------------------------------------------------------------------- +// +CNSmlNotepadDatabase::~CNSmlNotepadDatabase() + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::~CNSmlNotepadDatabase(): begin"); + + if(iOpened) + { + iDatabase.Close(); + } + + if(iDataFile) + { + delete iDataFile; + iDataFile = NULL; + } + iTable.Close(); + iDbs.Close(); + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::~CNSmlNotepadDatabase(): end"); + } +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::CNSmlNotepadDatabase() +// ----------------------------------------------------------------------------- +// +CNSmlNotepadDatabase::CNSmlNotepadDatabase() + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::CNSmlNotepadDatabase(): begin"); + + iOpened = EFalse; + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::CNSmlNotepadDatabase(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::ConstructL +// ----------------------------------------------------------------------------- +// +void CNSmlNotepadDatabase::ConstructL() + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::ConstructL: begin"); + + User::LeaveIfError(iDbs.Connect()); + + iDataFile = HBufC::NewL(KMaxFileLength); + iDataFile->Des().Copy(KNpdDataFile); + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::ConstructL: end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::OpenL +// ----------------------------------------------------------------------------- +// +void CNSmlNotepadDatabase::OpenL() +{ + _NOTEPAD_DBG_FILE("CCNSmlNotepadDatabase::OpenL(): begin"); + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::OpenL(): end"); + OpenL(*iDataFile); +} +// ----------------------------------------------------------------------------- +// TInt CNSmlNotepadDatabase::OpenL(const TDesC& aStoreName) +// ----------------------------------------------------------------------------- +// +void CNSmlNotepadDatabase::OpenL(const TDesC& aStoreName) + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::OpenL(): begin"); + + TBuf<32> format; + format.Copy(KSecure); + format.Append(KSecureUid.Name()); + + TInt err(iDatabase.Open(iDbs,aStoreName,format)); + RFs fsession; + switch ( err ) + { + case KErrNone: // database open succeed + iOpened = ETrue; + break; + case KErrArgument: // when the datafile is empty + case KErrNotSupported: // UID mismatch, corrupted + case KErrEof: // read error, corrupted + case KErrCorrupt: + iDatabase.Close(); // indespensable for RFs::Delete() + User::LeaveIfError(fsession.Connect()); + fsession.Delete(*iDataFile); + fsession.Close(); + case KErrNotFound: + TRAP(err,CreateDBL()); + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::OpenL(): after createDBL and before database open"); + if( err == KErrNone) + { + iOpened = ETrue; + } + break; + default: + break; + } + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::OpenL(): end"); + User::Leave(err); + } + + + +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::AddNoteL +// ----------------------------------------------------------------------------- +// +void CNSmlNotepadDatabase::AddNoteL(CNpdItem& aNote, TInt &aKey) + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::AddNoteL(): begin"); + + if(!iOpened) + { + User::Leave(KErrNotReady); + } + + if(!aNote.Content()) + { + User::Leave(KErrArgument); + } + + TInt err(KErrNone); + RDbView dbView; + CleanupClosePushL(dbView); + + err = dbView.Prepare( + iDatabase, TDbQuery(KNpdSqlInsert) ); + + if(err == KErrNone) + { + TRAP(err, + dbView.InsertL(); + dbView.SetColL(ENotepadUpdateTime, aNote.LastModified()); + dbView.SetColL(ENotepadMemo, aNote.Content()->Des()); + dbView.PutL(); + ); + if (err == KErrNone) + { + aKey = dbView.ColInt32(ENotepadKey); + } + else + { + dbView.Close(); + Rollback(); + } + } + + CleanupStack::PopAndDestroy(); // dbView + iDatabase.Compact(); + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::AddNoteL(): end"); + User::Leave(err); + } + +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::DeleteNoteL +// ----------------------------------------------------------------------------- +// +void CNSmlNotepadDatabase::DeleteNoteL(const TInt aKey) + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::DeleteNoteL(): begin"); + + if(!iOpened) + { + User::Leave(KErrNotReady); + } + + TInt err(KErrNone); + TBuf sql; + sql.Append(KNpdSqlDeleteHead); + sql.AppendNum(aKey); + + TInt rowCount( iDatabase.Execute(sql) ); + + if(rowCount > 0) + { + err = KErrNone; + } + else + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::DeleteNoteL(): item not found"); + err = KErrNotFound; + } + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::DeleteNoteL(): end"); + User::Leave(err); + } + + +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::Close +// ----------------------------------------------------------------------------- +// +void CNSmlNotepadDatabase::Close() + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::Close(): begin"); + + if(iOpened) + { + iDatabase.Compact(); + iDatabase.Close(); + iOpened = EFalse; + } + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::Close(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::GetNoteL +// ----------------------------------------------------------------------------- +// +void CNSmlNotepadDatabase::GetNoteL(const TInt aKey, CNpdItem& aItem) + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::GetNoteL(): begin"); + + TInt err(KErrNone); + + if(!iOpened) + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::GetNoteL(): not opened"); + User::Leave(KErrNotReady); + } + + TBuf sql; + sql.Format(KNpdSqlFormatSeek, aKey); + + RDbView dbView; + CleanupClosePushL(dbView); + + User::LeaveIfError(dbView.Prepare( + iDatabase, TDbQuery(sql), RDbView::EReadOnly ) ); + + User::LeaveIfError(dbView.EvaluateAll()); + + TInt isAtRow(dbView.FirstL()); + if ( isAtRow ) + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::GetNoteL(): if entered"); + HBufC* content = NULL; + dbView.GetL(); + + TInt key = dbView.ColInt32(ENotepadKey); + TTime modified = dbView.ColTime(ENotepadUpdateTime); + + RDbColReadStream blob; + blob.OpenLC(dbView, ENotepadMemo); + TInt colLength( dbView.ColLength(ENotepadMemo) ); + content = HBufC::NewLC(colLength); + TPtr ptr = content->Des(); + + blob.ReadL(ptr, colLength); + + aItem.Set(key,modified, content); + CleanupStack::Pop(content); // content + CleanupStack::PopAndDestroy(); // blob + } + else + { + err = KErrNotFound; + } + + CleanupStack::PopAndDestroy(); // dbView/ + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::GetNoteL(): end"); + User::Leave(err); + } + +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::UpdateNoteL +// ----------------------------------------------------------------------------- +// +void CNSmlNotepadDatabase::UpdateNoteL(const TInt aKey, CNpdItem& aItem) + { + TInt err(KErrNone); + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::UpdateNoteL(): begin"); + + if(!iOpened) + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::UpdateNoteL(): not ready"); + User::Leave(KErrNotReady); + } + + TBuf sql; + sql.Format(KNpdSqlFormatSeek, aKey); + + RDbView dbView; + CleanupClosePushL(dbView); + + User::LeaveIfError(dbView.Prepare( + iDatabase, TDbQuery(sql), RDbView::EUpdatable ) ); + + User::LeaveIfError(dbView.EvaluateAll()); + + TInt isAtRow(dbView.FirstL()); + if ( isAtRow ) + { + + TRAP(err, + dbView.UpdateL(); + dbView.SetColL(ENotepadUpdateTime, aItem.LastModified()); + dbView.SetColL(ENotepadMemo, aItem.Content()->Des()); + dbView.PutL(); + ); + if (err != KErrNone) + { + dbView.Close(); + Rollback(); + } + } + else + { + err = KErrNotFound; + } + + CleanupStack::PopAndDestroy(); // dbView + iDatabase.Compact(); + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::UpdateNoteL(): end"); + User::Leave(err); + } +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::Reset +// ----------------------------------------------------------------------------- +// +TInt CNSmlNotepadDatabase::Reset() + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::Reset(): begin"); + + TInt err(KErrNone); + + if(!iOpened) + { + return KErrNotReady; + } + + TBuf sql; + sql.Append(KNpdSqlDeleteAll); + + TInt rowCount( iDatabase.Execute(sql) ); + + if(rowCount < 0) + { + err = rowCount; + } + + if (err == KErrNone && iDatabase.InTransaction()) + { + err = iDatabase.Commit(); + } + + if (err == KErrNone && rowCount > 0) + { + err = iDatabase.Compact(); + } + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::Reset(): begin"); + return err; + } +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::IsOpen +// ----------------------------------------------------------------------------- +// +TBool CNSmlNotepadDatabase::IsOpen() + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::IsOpen(): begin"); + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::IsOpen(): end"); + return iOpened; + } +// ----------------------------------------------------------------------------- +// void CNSmlNotepadDatabase::GetDefaultDatastoreName(TDes& aStoreName) +// ----------------------------------------------------------------------------- +// +void CNSmlNotepadDatabase::GetDefaultDatastoreName(TDes& aStoreName) +{ + _NOTEPAD_DBG_FILE("CCNSmlNotepadDatabase::GetDefaultDatastoreName(): begin"); + + aStoreName.Copy(*iDataFile); + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::GetDefaultDatastoreName(): end"); +} +// ----------------------------------------------------------------------------- +// CDesCArray* CNSmlNotepadDatabase::ListDatabasesL() +// ----------------------------------------------------------------------------- +// +CDesCArray* CNSmlNotepadDatabase::ListDatabasesL() +{ + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::ListDatabasesL(): begin"); + + CDesCArrayFlat *arr = new (ELeave)CDesCArrayFlat(1); + CleanupStack::PushL(arr); + arr->AppendL(*iDataFile); + CleanupStack::Pop(arr); + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::ListDatabasesL(): end"); + return arr; +} +// ----------------------------------------------------------------------------- +// TInt CNSmlNotepadDatabase::FirstL() +// ----------------------------------------------------------------------------- +// +TInt CNSmlNotepadDatabase::FirstL() +{ + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::FirstL(): begin"); + TInt ret = -1; + if(!iOpened) OpenL(); + iTable.Close(); + TInt err = iTable.Open(iDatabase,KNpdTableName,RDbRowSet::EReadOnly); + if(err == KErrNone) + { + iTable.BeginningL(); + if(iTable.FirstL()) + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::FirstL(): if firstL"); + iTable.GetL(); + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::FirstL(): after GetL"); + ret = iTable.ColInt(1); + } + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::FirstL(): end"); + } + return ret; +} +// ----------------------------------------------------------------------------- +// TInt CNSmlNotepadDatabase::NextL() +// ----------------------------------------------------------------------------- +// +TInt CNSmlNotepadDatabase::NextL() +{ + _NOTEPAD_DBG_FILE("NSmlNotepadDatabase::NextL(): begin"); + + TInt ret = -1; + if(iTable.AtRow()) + { + if(iTable.NextL()) + { + iTable.GetL(); + ret = iTable.ColInt(1); + } + } + + _NOTEPAD_DBG_FILE("NSmlNotepadDatabase::NextL(): end"); + return ret; +} +// ----------------------------------------------------------------------------- +// TInt CNSmlNotepadDatabase::LastL() +// ----------------------------------------------------------------------------- +// +TInt CNSmlNotepadDatabase::LastL() +{ + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::LastL(): begin"); + + TInt ret = -1; + if(iTable.LastL()) + { + iTable.GetL(); + ret = iTable.ColInt(1); + } + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::LastL(): end"); + return ret; +} + +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::CreateColSetLC +// ----------------------------------------------------------------------------- +// +CDbColSet* CNSmlNotepadDatabase::CreateColSetLC() + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::CreateColSetLC: begin"); + + CDbColSet* columns = CDbColSet::NewLC(); + TDbCol col(KNpdKey, EDbColInt32); + col.iAttributes = TDbCol::ENotNull | TDbCol::EAutoIncrement; + columns->AddL(col); + + col.iName = KNpdUpdateTime; + col.iType = EDbColDateTime; + col.iAttributes = TDbCol::ENotNull; + columns->AddL(col); + + col.iName = KNpdMemo; + col.iType = EDbColLongText; + col.iAttributes = TDbCol::ENotNull; + columns->AddL(col); + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::CreateColSetLC: end"); + return columns; // columns stays on CleanupStack + } + +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::CreateDBL +// ----------------------------------------------------------------------------- +// +void CNSmlNotepadDatabase::CreateDBL() + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::CreateDBL(): begin"); + + iDatabase.Close(); + TBuf<32> format; + format.Copy(KSecure); + format.Append(KSecureUid.Name()); + User::LeaveIfError(iDatabase.Create(iDbs, *iDataFile,format)); + CDbColSet* columns = CreateColSetLC(); + User::LeaveIfError(iDatabase.CreateTable(KNpdTableName, *columns)); + CleanupStack::PopAndDestroy(columns); // columns + User::Leave(KErrNone); + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::CreateDBL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlNotepadDatabase::Rollback +// ----------------------------------------------------------------------------- +// +void CNSmlNotepadDatabase::Rollback() + { + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::Rollback(): begin"); + + iDatabase.Rollback(); + if ( iDatabase.IsDamaged() ) + { + iDatabase.Recover(); + } + + _NOTEPAD_DBG_FILE("CNSmlNotepadDatabase::Rollback(): end"); + } + + + + + + +// ----------------------------------------------------------------------------- +// CNpdItem implementations +// ----------------------------------------------------------------------------- +// + +// ----------------------------------------------------------------------------- +// CNpdItem::~CNpdItem +// ----------------------------------------------------------------------------- +// +CNpdItem::~CNpdItem() + { + _NOTEPAD_DBG_FILE("CNpdItem::~CNpdItem: begin"); + delete iContent; + _NOTEPAD_DBG_FILE("CNpdItem::~CNpdItem: end"); + } +// ----------------------------------------------------------------------------- +// CNpdItem::NewL +// ----------------------------------------------------------------------------- +// +CNpdItem* CNpdItem::NewLC() + { + _NOTEPAD_DBG_FILE("CNpdItem::NewLC: begin"); + CNpdItem* tmp = new (ELeave) CNpdItem(); + CleanupStack::PushL(tmp); + //tmp->ConstructL(0, TTime(), NULL); + _NOTEPAD_DBG_FILE("CNpdItem::NewLC: end"); + return tmp; + } + +// ----------------------------------------------------------------------------- +// CNpdItem::NewL +// ----------------------------------------------------------------------------- +// +CNpdItem* CNpdItem::NewLC(TInt aKey, const TTime& aLastModified, HBufC *aContent) + { + _NOTEPAD_DBG_FILE("CNpdItem::NewLC(TInt aKey, const TTime& aLastModified, HBufC *aContent): begin"); + CNpdItem* tmp = new (ELeave) CNpdItem(aKey,aLastModified,aContent); + CleanupStack::PushL(tmp); + //tmp->ConstructL(aKey, aLastModified, aContent); + _NOTEPAD_DBG_FILE("CNpdItem::NewLC(TInt aKey, const TTime& aLastModified, HBufC *aContent): end"); + return tmp; + } + +// ----------------------------------------------------------------------------- +// CNpdItem::CNpdItem() +// ----------------------------------------------------------------------------- +// +CNpdItem::CNpdItem() : iKey(0), iLastModified(Time::MinTTime()), iContent(NULL) + { + _NOTEPAD_DBG_FILE("NpdItem::CNpdItem(): begin"); + _NOTEPAD_DBG_FILE("NpdItem::CNpdItem(): end"); + } + +// ----------------------------------------------------------------------------- +// CNpdItem::CNpdItem(TInt aKey,const TTime& aLastModified, HBufC *aContent) +// ----------------------------------------------------------------------------- +// +CNpdItem::CNpdItem(TInt aKey, + const TTime& aLastModified, + HBufC *aContent) : iKey(aKey), + iLastModified(aLastModified), + iContent(aContent) + { + _NOTEPAD_DBG_FILE("NpdItem::CNpdItem(): begin"); + _NOTEPAD_DBG_FILE("NpdItem::CNpdItem(): end"); + } + + +// ----------------------------------------------------------------------------- +// CNpdItem::Key +// ----------------------------------------------------------------------------- +// +TInt CNpdItem::Key() const + { + _NOTEPAD_DBG_FILE("CNpdItem::Key(): begin"); + _NOTEPAD_DBG_FILE("CNpdItem::Key(): end"); + return iKey; + } +// ----------------------------------------------------------------------------- +// CNpdItem::LastModified +// ----------------------------------------------------------------------------- +// +TTime CNpdItem::LastModified() const + { + _NOTEPAD_DBG_FILE("CNpdItem::LastModified(): begin"); + _NOTEPAD_DBG_FILE("CNpdItem::LastModified(): end"); + return iLastModified; + } +// ----------------------------------------------------------------------------- +// CNpdItem::Content +// ----------------------------------------------------------------------------- +// +HBufC* CNpdItem::Content() + { + _NOTEPAD_DBG_FILE("NpdItem::Content(): begin"); + _NOTEPAD_DBG_FILE("NpdItem::Content(): end"); + return iContent; + } +// ----------------------------------------------------------------------------- +// CNpdItem::Set +// ----------------------------------------------------------------------------- +// +void CNpdItem::Set(TInt aKey, const TTime& aLastModified, HBufC *aContent) + { + _NOTEPAD_DBG_FILE("CNpdItem::Set(): begin"); + iKey = aKey; + iLastModified = aLastModified; + SetContent(aContent); + _NOTEPAD_DBG_FILE("CNpdItem::Set(): end"); + } + +// ----------------------------------------------------------------------------- +// CNpdItem::SetContent +// ----------------------------------------------------------------------------- +// +void CNpdItem::SetContent(HBufC *aContent) + { + _NOTEPAD_DBG_FILE("CNpdItem::SetContent(): begin"); + iContent = aContent; + _NOTEPAD_DBG_FILE("CNpdItem::SetContent(): end"); + } + +// ----------------------------------------------------------------------------- +// CNpdItem::SetModified +// ----------------------------------------------------------------------------- +// +void CNpdItem::SetModified(const TTime& aLastModified) + { + _NOTEPAD_DBG_FILE("CNpdItem::SetModified(): begin"); + iLastModified = aLastModified; + _NOTEPAD_DBG_FILE("CNpdItem::SetModified(): end"); + } + +// End of File