blob: fb2ccd84251aa6289d9777220e1f18c95edf6655 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
//
// 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