#ifndef DATABASE_H
#define DATABASE_H
#include <QSqlDatabase>
#include <QList>
#include <QMap>
#include <QHash>
#include <QString>
#include <QUrl>
#include <QSqlError>

#include "table.h"
class QSqlDatabase;
class BaseAdaptor;
class Set;
class Query;
class Field;
class Database
{
public:
    Database( const QUrl &uri );
    ~Database();
    bool open();
    void close();

    Table defineTable( const QString &tableName,
                       const QList<Field> &fields,
                       const QMap<QString,QVariant> &properties = QMap<QString,QVariant>() );
    static QStringList drivers();
    BaseAdaptor *db() const;
    QStringList tables() const;
    Table table( const QString &name ) const;

    void begin();
    void commit();
    void rollback();
    bool isValid() const;
    QSqlError lastError() const;

    Set select( const QList<Field> &fields, const Query &query ) const;
    Set operator() ( const Query &query ) const;
    Table operator[] ( const QString &table ) const;

    typedef BaseAdaptor *(*FactoryMethod)(const QSqlDatabase &db);
    static void registerDriver( const QString &key, FactoryMethod );

private:
    QSqlDatabase m_connection;
    BaseAdaptor *m_db;
    QHash <QString,Table> m_tables;
    static QHash <QString,FactoryMethod> m_drivers;
    bool m_isValid;
};

#endif // DATABASE_H

