///////////////////////////////////////////////////////////////////////////////
//
//  The contents of this file are subject to the Mozilla Public License
//  Version 1.1 (the "License"); you may not use this file except in
//  compliance with the License. You may obtain a copy of the License at
//  http://www.mozilla.org/MPL/
//
//  Software distributed under the License is distributed on an "AS IS"
//  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
//  License for the specific language governing rights and limitations
//  under the License.
//
//  The Original Code is MP4v2.
//
//  The Initial Developer of the Original Code is Kona Blend.
//  Portions created by Kona Blend are Copyright (C) 2008.
//  All Rights Reserved.
//
//  Contributors:
//      Kona Blend, kona8lend@@gmail.com
//
///////////////////////////////////////////////////////////////////////////////

#ifndef MP4V2_UTIL_DATABASE_H
#define MP4V2_UTIL_DATABASE_H

namespace mp4v2 { namespace util {

///////////////////////////////////////////////////////////////////////////////
///
/// Database class is the base implementation for persistent databases.
///
/// All databases use an ASCII file format:
///     @li leading/trailing spaces on any line are trimmed.
///     @li lines beginning with '#' are considered comments.
///     @li lines of { <NAME><DELIMITER><VALUE><EOL> } form NAME/VALUEs pairs.
///     @li <NAME> cannot contain any <DELIMITER> characters.
///     @li <DELIMITER> is any combination of { ' ', '=', '\t' }.
///     @li <VALUE> continues until <EOL>.
///     @li <EOL> is optional for last line.
///     @li <NAME> of value this._key marks the beginning of a new record.
///     @li <NAME> is case-insensitive.
///     @li subsequent lines of NAME/VALUE pairs are part of the same record.
///
///////////////////////////////////////////////////////////////////////////////
class Database {
public:
    virtual ~Database();

protected:
    /// Constructor.
    ///
    /// @param file specifies filename for IO operations.
    /// @param key specifies the name of primary key.
    ///
    Database( const string& file, const string& key );

    /// Close database file.
    void close();

    /// Open database file.
    ///
    /// @param write <b>true</b> to open file for writing, <b>false</b> for reading.
    /// @param fname filename to open.
    ///     On Windows, this should be a UTF-8 encoded string.
    ///     On other platforms, it should be an 8-bit encoding that is
    ///     appropriate for the platform, locale, file system, etc.
    ///     (prefer to use UTF-8 when possible).
    ///
    /// @return <b>true</b> on error.
    ///
    bool open( bool write, string& fname );

    /// Parse a record-data from open intput stream.
    ///
    /// @param data is populated with NAME/VALUE pairs if any.
    ///
    void parseData( std::map<string,string>& data );

    ///////////////////////////////////////////////////////////////////////////

    const string  _filename; // filename (basename only) used for database
    const string  _key;      // name of key for record boundries
    fstream       _stream;   // // IO object

private:
    /// parse a name/value pair from open input stream.
    ///
    /// @param name stores the parsed name.
    /// @param value stores the parsed value.
    ///
    /// @return <b>true</b> on error (no name/value pair was parised).
    ///
    bool parsePair( string& name, string& value );

    /*************************************************************************/

    string _currentKeyValue;
};

///////////////////////////////////////////////////////////////////////////////

}} // namespace mp4v2::util

#endif // MP4V2_UTIL_DATABASE_H
