#ifndef __BASE_DB_H__
#define __BASE_DB_H__

#include <string>
#include <vector>
#include <map>

class BASE_DB {
public:

    typedef std::map<std::string, std::string> TUPLE;
    typedef std::vector<TUPLE> TUPLES;
    typedef std::vector<std::string> COLUMNS;

    BASE_DB() {};
    BASE_DB(std::string & dbHost,
	    std::string & dbDatabase,
	    std::string & dbUser,
	    std::string & dbPassword)
	: host(dbHost),
	  database(dbDatabase),
	  user(dbUser),
	  password(dbPassword)
    {};
    virtual ~BASE_DB() {};

    void SetHost(const std::string & h) { host = h; };
    void SetDatabase(const std::string & db) { database = db; };
    void SetUser(const std::string & u) { user = u; };
    void SetPassword(const std::string & p) { password = p; };

    const std::string & GetHost() const { return host; };
    const std::string & GetDatabase() const { return database; };
    const std::string & GetUser() const { return user; };
    const std::string & GetPassword() const { return password; };

    const std::string & GetErrorMsg() const { return errorMsg; };

    virtual bool Connect() { return true; };
    virtual bool Disconnect() { return true; };
    virtual bool Query(const std::string & q) { return true; };
    virtual bool Start() { return true; };
    virtual bool Commit() { return true; };
    virtual bool Rollback() { return true; };

    int GetTuples() const { return tuples; };
    int GetColumns() const { return columns; };
    int GetAffectedRows() const { return affected; };

    virtual TUPLES GetResult() const { return TUPLES(); };
    virtual TUPLE GetTuple(int n = 0) const { return TUPLE(); };
    const COLUMNS & GetColumnsNames() const { return cols; };

protected:
    std::string host;
    std::string database;
    std::string user;
    std::string password;

    std::string errorMsg;

    COLUMNS cols;

    int columns;
    int tuples;
    int affected;
};

extern "C" BASE_DB * CreateDriver();
extern "C" void DestroyDriver(BASE_DB *);

typedef BASE_DB * (* CreateDriverFn)();
typedef void (* DestroyDriverFn)(BASE_DB *);

#endif