landmarks/locationlandmarks/server/src/EPos_PosLmDatabaseManager.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 27 Apr 2010 17:05:00 +0300
branchRCL_3
changeset 10 d6e4203b7ebe
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201015 Kit: 201017

/*
* Copyright (c) 2002-2007 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: Provides static functions which handles database creation
*								and deletion.
*
*
*/


#include <d32dbms.h>
#include <EPos_Landmarks.h>
#include <epos_landmarkdatabasestructure.h>
#include <epos_poslmdatabaseutility.h>
#include "EPos_PosLmDatabaseManager.h"

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::DeleteDatabaseL(
    const TDesC& aUri)
    {
    RDbs dbSession;
    CleanupClosePushL(dbSession);
    User::LeaveIfError(dbSession.Connect());

    TPtrC dbPath(aUri);
    PosLmDatabaseUtility::RemoveProtocolFromUriL(dbPath);

    User::LeaveIfError(dbSession.DeleteDatabase(dbPath, KPosLmDbSecureUid));

    CleanupStack::PopAndDestroy(&dbSession);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CreateDatabaseL(
    const TDesC& aUri,
    TBool aDefaultDatabase,
    TBool aReplaceDatabase)
    {
    RDbs dbSession;
    CleanupClosePushL(dbSession);

    User::LeaveIfError(dbSession.Connect());

    TPtrC dbPath(aUri);
    PosLmDatabaseUtility::RemoveProtocolFromUriL(dbPath);

    RDbNamedDatabase db;
    CleanupClosePushL(db);

    if (aDefaultDatabase && aReplaceDatabase)
        {
        TInt delerr = dbSession.DeleteDatabase(dbPath, KPosLmDbSecureUid);
        if (delerr != KErrNone && delerr != KErrNotFound)
            {
            User::Leave(delerr);
            }
        }

    TInt createerr = db.Create(dbSession, dbPath, KPosLmDbSecureFormat);
    if (!aDefaultDatabase ||
        (aDefaultDatabase && createerr != KErrAlreadyExists))
        {
        User::LeaveIfError(createerr);
        }


    if (createerr == KErrNone)
        {
        CreateTablesL(db);
        CreateIndexesL(db);
        SetCounterToOneL(db, KPosLmLandmarkTable);
        SetCounterToOneL(db, KPosLmCategoryTable);

        // The settings table is created last so that a database can be
        // validated when opening it (there will be a check for language there
        // which is a part of the settings table).
        CreateSettingsTableL(db);
        }

    CleanupStack::PopAndDestroy(2, &dbSession); // &db
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CopyDatabaseL(
    const TDesC& aSourceUri,
    const TDesC& aTargetUri)
    {
    RDbs dbSession;
    CleanupClosePushL(dbSession);
    User::LeaveIfError(dbSession.Connect());

    TPtrC sourceDbPath(aSourceUri);
    TPtrC targetDbPath(aTargetUri);
    PosLmDatabaseUtility::RemoveProtocolFromUriL(sourceDbPath);
    PosLmDatabaseUtility::RemoveProtocolFromUriL(targetDbPath);

    User::LeaveIfError(dbSession.CopyDatabase(sourceDbPath,
                                              targetDbPath,
                                              KPosLmDbSecureUid));
    CleanupStack::PopAndDestroy(&dbSession);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CreateTablesL(
    RDbNamedDatabase& aDb)
    {
    CreateLandmarkTableL(aDb);
    CreateLandmarkFieldTableL(aDb);
    CreateCategoryTableL(aDb);
    CreateLmCategoryTableL(aDb);
    CreateIconTableL(aDb);

    // Do not create settings table here. This is created in the end so that the
    // database can be validated when opening it.
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CreateLandmarkTableL(
    RDbNamedDatabase& aDb)
    {
    CDbColSet* columns = CDbColSet::NewLC();

    TDbCol col(KPosLmLandmarkIdCol, EDbColUint32);
    col.iAttributes = col.EAutoIncrement;
    columns->AddL(col);

    columns->AddL(TDbCol(KPosLmLatitudeCol, EDbColReal64));
    columns->AddL(TDbCol(KPosLmLongitudeCol, EDbColReal64));
    columns->AddL(TDbCol(KPosLmAltitudeCol, EDbColReal32));
    columns->AddL(TDbCol(KPosLmHorizAccCol, EDbColReal32));
    columns->AddL(TDbCol(KPosLmVertAccCol, EDbColReal32));
    columns->AddL(TDbCol(KPosLmCoverageRadiusCol, EDbColReal32));
    columns->AddL(TDbCol(KPosLmIconIdCol, EDbColUint32));
    columns->AddL(TDbCol(KPosLmIconPicNrCol, EDbColInt32));
    columns->AddL(TDbCol(KPosLmMaskPicNrCol, EDbColInt32));
    columns->AddL(TDbCol(KPosLmNameCol, EDbColLongText,
        KPosLmMaxTextFieldLength));
    columns->AddL(TDbCol(KPosLmNDescCol, EDbColLongText,
        KPosLmMaxDescriptionLength));

    User::LeaveIfError(aDb.CreateTable(KPosLmLandmarkTable, *columns));
    CleanupStack::PopAndDestroy(columns);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CreateLandmarkFieldTableL(
    RDbNamedDatabase& aDb)
    {
    CDbColSet* columns = CDbColSet::NewLC();

    TDbCol col(KPosLmLandmarkIdCol, EDbColUint32);
    col.iAttributes = col.ENotNull;
    columns->AddL(TDbCol(col));

    TDbCol col2(KPosLmFieldTypeCol, EDbColUint16);
    col2.iAttributes = col2.ENotNull;
    columns->AddL(col2);

    columns->AddL(TDbCol(KPosLmFieldStringCol, EDbColLongText,
        KPosLmMaxTextFieldLength));

    User::LeaveIfError(aDb.CreateTable(KPosLmLandmarkFieldTable, *columns));
    CleanupStack::PopAndDestroy(columns);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CreateCategoryTableL(
    RDbNamedDatabase& aDb)
    {
    CDbColSet* columns = CDbColSet::NewLC();

    TDbCol col(KPosLmCategoryIdCol, EDbColUint32);
    col.iAttributes = col.EAutoIncrement;
    columns->AddL(col);

    columns->AddL(TDbCol(KPosLmGlobalCategoryIdCol, EDbColUint16));
    columns->AddL(TDbCol(KPosLmIconIdCol, EDbColUint32));
    columns->AddL(TDbCol(KPosLmIconPicNrCol, EDbColInt32));
    columns->AddL(TDbCol(KPosLmMaskPicNrCol, EDbColInt32));
    columns->AddL(TDbCol(KPosLmCategoryNameCol, EDbColText,
        KPosLmMaxCategoryNameLength));
    columns->AddL(TDbCol(KPosLmCategoryNameModifiedCol, EDbColBit));

    User::LeaveIfError(aDb.CreateTable(KPosLmCategoryTable, *columns));
    CleanupStack::PopAndDestroy(columns);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CreateLmCategoryTableL(
    RDbNamedDatabase& aDb)
    {
    CDbColSet* columns = CDbColSet::NewLC();

    TDbCol col(KPosLmLandmarkIdCol, EDbColUint32);
    col.iAttributes = col.ENotNull;
    columns->AddL(col);

    TDbCol col2(KPosLmCategoryIdCol, EDbColUint32);
    col2.iAttributes = col2.ENotNull;
    columns->AddL(col2);

    User::LeaveIfError(aDb.CreateTable(KPosLmLandmarkCategoryTable, *columns));
    CleanupStack::PopAndDestroy(columns);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CreateIconTableL(
    RDbNamedDatabase& aDb)
    {
    CDbColSet* columns = CDbColSet::NewLC();

    TDbCol col(KPosLmIconIdCol, EDbColUint32);
    col.iAttributes = col.EAutoIncrement;
    columns->AddL(col);

    columns->AddL(TDbCol(KPosLmIconPathCol, EDbColLongText, KMaxFileName));

    User::LeaveIfError(aDb.CreateTable(KPosLmIconTable, *columns));
    CleanupStack::PopAndDestroy(columns);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CreateSettingsTableL(
    RDbNamedDatabase& aDb)
    {
    CDbColSet* columns = CDbColSet::NewLC();

    columns->AddL(TDbCol(KPosLmLanguageCol, EDbColInt32));
    columns->AddL(TDbCol(KPosLmInitFlagCol, EDbColInt32));

    User::LeaveIfError(aDb.CreateTable(KPosLmSettingsTable, *columns));
    CleanupStack::PopAndDestroy(columns);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CreateIndexTableL( RDbNamedDatabase& aDb)
    {
    CDbColSet* columns = CDbColSet::NewLC();

    columns->AddL( TDbCol( KPosLmLanguageCol, EDbColInt32 ) );
    columns->AddL( TDbCol( KPosLmTimestampCol, EDbColDateTime ) );
    columns->AddL( TDbCol( KPosLmIndexDataCol, EDbColLongBinary ) );

    User::LeaveIfError( aDb.CreateTable( KPosLmIndexTable, *columns ) );
    CleanupStack::PopAndDestroy( columns );
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CreateIndexesL( RDbNamedDatabase& aDb )
    {
    CreateIndexL(aDb, KPosLmLandmarkIdIndex, KPosLmLandmarkTable,
        KPosLmLandmarkIdCol, ETrue);
    CreateIndexL(aDb, KPosLmCategoryIdIndex, KPosLmCategoryTable,
        KPosLmCategoryIdCol, ETrue);
    CreateIndexL(aDb, KPosLmGlobalCategoryIdIndex, KPosLmCategoryTable,
        KPosLmGlobalCategoryIdCol, EFalse);
    CreateIndexL(aDb, KPosLmCategoryNameIndex, KPosLmCategoryTable,
        KPosLmCategoryNameCol, ETrue);
    CreateIndexL(aDb, KPosLmIconIdIndex, KPosLmIconTable,
        KPosLmIconIdCol, ETrue);
    CreateIndexL(aDb, KPosLmFieldsLmIdIndex, KPosLmLandmarkFieldTable,
        KPosLmLandmarkIdCol, EFalse);
    CreateIndexL(aDb, KPosLmCategoryLmIdIndex, KPosLmLandmarkCategoryTable,
        KPosLmLandmarkIdCol, EFalse);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::CreateIndexL(
    RDbNamedDatabase& aDb,
    const TDesC& aIndex,
    const TDesC& aTable,
    const TDesC& aColumn,
    TBool aUnique)
    {
    CDbKey* keys = CDbKey::NewLC();
    keys->AddL(TDbKeyCol(aColumn));

    if (aUnique)
        {
        keys->MakeUnique();
        }

    User::LeaveIfError(aDb.CreateIndex(aIndex, aTable, *keys));
    CleanupStack::PopAndDestroy(keys);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void PosLmDatabaseManager::SetCounterToOneL(
    RDbNamedDatabase& aDb,
    const TDesC& aTable)
    {
    HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
    sql->Des().Format(KPosLmSqlSelect, &KPosLmSqlAll, &aTable);

    RDbView view;
    CleanupClosePushL(view);
    User::LeaveIfError(view.Prepare(aDb, TDbQuery(*sql),
        TDbWindow::EUnlimited));

    view.InsertL();
    view.PutL();

    if (!view.FirstL())
        {
        User::Leave(KErrGeneral);
        }

    view.DeleteL();

    CleanupStack::PopAndDestroy(2, sql); //&view
    }