notepad/notepad1/SyncMLAdapter/src/nsmlnotepadDatabase.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:19 +0200
changeset 0 f979ecb2b13e
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* 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 <sysutil.h>


#include <txtetext.h>
#include "nsmlnotepadDatabase.h"
#include <nsmlnotepaddatastoreformat.rsg>

#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<KNpdSqlDeleteHeadSize> 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<KNpdSqlStringMaxLength> 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<KNpdSqlStringMaxLength> 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<KNpdSqlDeleteHeadSize> 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