/*
* Copyright (c) 2010 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:
*
*/
import java.io.PrintStream;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;

public class Storage
{
    private static final String STORAGE_NAME = "rmsbenchmark";
    private static final int REPEAT = 100;
    private int LENGTH;

    private RecordStore recordStore;
    private String[] STORE_NAMES;


    public Storage(int aLength)
    {
        LENGTH = aLength;
        try
        {
            recordStore = RecordStore.openRecordStore(STORAGE_NAME, true);
            createMultiStores();
        }
        catch (RecordStoreException _ex)
        {
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        Utils.initRandom();
    }

    private void createMultiStores() throws RecordStoreException
    {
        STORE_NAMES = new String[REPEAT];
        // create stores
        for(int i = 0; i < STORE_NAMES.length; i++)
        {
            STORE_NAMES[i] = "multistore" + i;
            RecordStore r = RecordStore.openRecordStore(STORE_NAMES[i], true);
            r.closeRecordStore();
        }
    }

    private void deleteMultiStores() throws RecordStoreException
    {
        for(int i = 0; i < STORE_NAMES.length; i++)
        {
            RecordStore.deleteRecordStore(STORE_NAMES[i]);
        }
    }

    public void clean()
    {
        try
        {
            recordStore.closeRecordStore();
            RecordStore.deleteRecordStore(STORAGE_NAME);
            deleteMultiStores();
        }
        catch (RecordStoreException _ex)
        {
            System.out.println("RecordStoreException: " + _ex.toString());
        }
    }

    public String createRecord()
    {
        String score = "";
        try
        {
            recordStore.getSize(); // commits any pending transactions
            byte data[] = new byte[LENGTH];
            for (int i = 0; i < LENGTH; i++)
            {
                data[i] = (byte) Utils.random(0, 127);
            }
            Utils.startTiming();
            for (int i = 0; i < REPEAT; i++)
            {
                recordStore.addRecord(data, 0, data.length);
            }
            Utils.stopTiming();
            score = Utils.getTime();
        }
        catch (RecordStoreException _ex)
        {
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        return score;
    }

    public String deleteRecord()
    {
        String score = "";
        try
        {
            recordStore.getSize(); // commits any pending transactions
            int recordCount = recordStore.getNumRecords();
            int recordID[] = new int[recordCount];
            RecordEnumeration recordEnum = recordStore.enumerateRecords(null, null, false);
            for (int i = 0; i < recordCount; i++)
            {
                recordID[i] = recordEnum.nextRecordId();
            }
            int j = recordCount - 1;
            int random[] = new int[REPEAT];
            for (int i = 0; i < REPEAT; i++)
            {
                int recordChosen = recordID[Utils.random(0, recordID.length - 1)];
                random[i] = recordChosen;
                int tempRecordID[] = new int[j--];
                int l = 0;
                for (int k = 0; k < recordID.length; k++)
                {
                    if (recordID[k] != recordChosen)
                    {
                        tempRecordID[l++] = recordID[k];
                    }
                }
                recordID = tempRecordID;
            }
            Utils.startTiming();
            for (int i = 0; i < REPEAT; i++)
            {
                recordStore.deleteRecord(random[i]);
            }
            Utils.stopTiming();
            score = Utils.getTime();
        }
        catch (RecordStoreException _ex)
        {
            Utils.stopTiming();
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        return score;
    }

    public String readEnumRecord()
    {
        String score = "";
        try
        {
            RecordEnumeration recordEnum = recordStore.enumerateRecords(null, null, false);
            Utils.startTiming();
            for (int i = 0; i < REPEAT; i++)
            {
                byte data[] = recordEnum.nextRecord();
            }
            Utils.stopTiming();
            score = Utils.getTime();
        }
        catch (RecordStoreException _ex)
        {
            Utils.stopTiming();
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        return score;
    }

    public String readRandomRecord()
    {
        String score = "";
        try
        {
            int recordCount = recordStore.getNumRecords();
            if (recordCount == 0)
            {
                Utils.startTiming();
                throw new RecordStoreException();
            }
            int recordID[] = new int[recordCount];
            RecordEnumeration recordEnum = recordStore.enumerateRecords(null, null, false);
            for (int i = 0; i < recordCount; i++)
            {
                recordID[i] = recordEnum.nextRecordId();
            }
            int random[] = new int[REPEAT];
            for (int i = 0; i < REPEAT; i++)
            {
                random[i] = recordID[Utils.random(0, recordCount - 1)];
            }
            Utils.startTiming();
            for (int i = 0; i < REPEAT; i++)
            {
                recordStore.getRecord(random[i]);
            }
            Utils.stopTiming();
            score = Utils.getTime();
        }
        catch (RecordStoreException _ex)
        {
            Utils.stopTiming();
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        return score;
    }

    public String createEnum()
    {
        String score = "";
        try
        {
            RecordEnumeration recordEnums[] = new RecordEnumeration[REPEAT];
            Utils.startTiming();
            for (int i = 0; i < REPEAT; i++)
            {
                recordEnums[i] = recordStore.enumerateRecords(null, null, false);
            }
            Utils.stopTiming();
            score = Utils.getTime();
            for (int i = 0; i < REPEAT; i++)
            {
                recordEnums[i].destroy();
            }
        }
        catch (RecordStoreException _ex)
        {
            Utils.stopTiming();
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        return score;
    }

    public String setRecord()
    {
        String score = "";
        try
        {
            recordStore.getSize(); // commits any pending transactions
            int recordCount = recordStore.getNumRecords();
            int recordID[] = new int[recordCount];
            RecordEnumeration recordEnum = recordStore.enumerateRecords(null, null, false);
            for (int i = 0; i < recordCount; i++)
            {
                recordID[i] = recordEnum.nextRecordId();
            }
            int j = recordCount - 1;
            int random[] = new int[REPEAT];
            for (int i = 0; i < REPEAT; i++)
            {
                int recordChosen = recordID[Utils.random(0, recordID.length - 1)];
                random[i] = recordChosen;
                int tempRecordID[] = new int[j--];
                int l = 0;
                for (int k = 0; k < recordID.length; k++)
                {
                    if (recordID[k] != recordChosen)
                    {
                        tempRecordID[l++] = recordID[k];
                    }
                }
                recordID = tempRecordID;
            }

            byte data[] = new byte[LENGTH];
            for (int i = 0; i < LENGTH; i++)
            {
                data[i] = (byte) Utils.random(0, 127);
            }

            Utils.startTiming();
            for (int i = 0; i < REPEAT; i++)
            {
                recordStore.setRecord(random[i], data, 0, data.length);
            }
            Utils.stopTiming();
            score = Utils.getTime();
        }
        catch (RecordStoreException _ex)
        {
            Utils.stopTiming();
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        return score;
    }

    public String openStore()
    {
        String score = "";
        try
        {
            recordStore.closeRecordStore();
            try
            {
                long openTotalTime = 0;
                for (int i = 0; i < REPEAT; i++)
                {
                    Utils.startTiming();
                    recordStore = RecordStore.openRecordStore(STORAGE_NAME, true);
                    Utils.stopTiming();
                    openTotalTime += Utils.getDiff();

                    recordStore.closeRecordStore();
                }
                score = Utils.getTime(openTotalTime);
            }
            catch (RecordStoreException _ex)
            {
                System.out.println("RecordStoreException: " + _ex.toString());
            }
            recordStore = RecordStore.openRecordStore(STORAGE_NAME, true);
        }
        catch (RecordStoreException _ex)
        {
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        return score;
    }

    public String closeStore()
    {
        String score = "";
        try
        {
            recordStore.closeRecordStore();
            try
            {
                long closeTotalTime = 0;
                for (int i = 0; i < REPEAT; i++)
                {
                    recordStore = RecordStore.openRecordStore(STORAGE_NAME, true);

                    Utils.startTiming();
                    recordStore.closeRecordStore();
                    Utils.stopTiming();
                    closeTotalTime += Utils.getDiff();
                }
                score = Utils.getTime(closeTotalTime);
            }
            catch (RecordStoreException _ex)
            {
                System.out.println("RecordStoreException: " + _ex.toString());
            }
            recordStore = RecordStore.openRecordStore(STORAGE_NAME, true);
        }
        catch (RecordStoreException _ex)
        {
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        return score;
    }

    public String openMultipleStores()
    {
        String score = "";
        try
        {
            RecordStore[] stores = new RecordStore[STORE_NAMES.length];
            // open stores
            Utils.startTiming();
            for (int i = 0; i < STORE_NAMES.length; i++)
            {
                stores[i] = RecordStore.openRecordStore(STORE_NAMES[i], false);
            }
            Utils.stopTiming();
            score = Utils.getTime(Utils.getDiff());

            // close stores
            for (int i = 0; i < STORE_NAMES.length; i++)
            {
                stores[i].closeRecordStore();
            }

        }
        catch (RecordStoreException _ex)
        {
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        return score;
    }

    public String closeMultipleStores()
    {
        String score = "";
        try
        {
            RecordStore[] stores = new RecordStore[STORE_NAMES.length];
            // open stores
            for (int i = 0; i < STORE_NAMES.length; i++)
            {
                stores[i] = RecordStore.openRecordStore(STORE_NAMES[i], false);
            }

            // close stores
            Utils.startTiming();
            for (int i = 0; i < STORE_NAMES.length; i++)
            {
                stores[i].closeRecordStore();
            }
            Utils.stopTiming();
            score = Utils.getTime(Utils.getDiff());

        }
        catch (RecordStoreException _ex)
        {
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        return score;
    }

    public String openCloseMultipleStores()
    {
        String score = "";
        try
        {
            // open /close one store at a time
            Utils.startTiming();
            for (int i = 0; i < STORE_NAMES.length; i++)
            {
                RecordStore r = RecordStore.openRecordStore(STORE_NAMES[i], false);
                r.closeRecordStore();
            }
            Utils.stopTiming();
            score = Utils.getTime(Utils.getDiff());

        }
        catch (RecordStoreException _ex)
        {
            System.out.println("RecordStoreException: " + _ex.toString());
        }
        return score;
    }

}
