Revision 1 (by moose, 2006/03/06 10:00:33) Initial Import
#ifndef __MADDB_H__
#define __MADDB_H__

#include <MadException.h>

/*
class MadDBException : public MadException {
	class InvalidHandle : public MadDBException { };
	class Busy : public MadDBException { };
};
*/

enum {
	MadDB_ERROR = -1,
	MadDB_OK = 1,
	MadDB_ROW,
	MadDB_DONE,
	MadDB_BUSY,

	MadDB_INTEGER = 100,
	MadDB_FLOAT,
	MadDB_TEXT,
	MadDB_BLOB,
	MadDB_NULL,
};

class MadDBResult {
	
	public:
		MadDBResult() { }
		virtual ~MadDBResult() { }

		virtual int reset() = 0;
		virtual int step() = 0;

		virtual const void *columnBlob(int) = 0;
		virtual int columnBytes(int) = 0;
		virtual double columnDouble(int) = 0;
		virtual int columnInt(int) = 0;
		virtual const char *columnText(int) = 0;
		virtual int columnType(int) = 0;

		virtual int bindBlob(int, const void*, int n) = 0;
		virtual int bindDouble(int, double) = 0;
		virtual int bindInt(int, int) = 0;
		virtual int bindNull(int) = 0;
		virtual int bindText(int, const char*) = 0;
		
	private:
		friend class MadDBConnection;
};

class MadDBConnection {
	public:
		MadDBConnection() { }
		virtual ~MadDBConnection() { }

		// const char *getDatabase();
		// void setDatabase(const char *);
		// " username
		// " password
		// " host
		// " port
		// not sure I want to do get* and set* like this, seems ugly... try and find something more elegant.

		virtual bool connect() = 0;
		
		virtual bool connect(const char *db)
		{
			return database(db) && connect();
		}
		
		virtual bool connect(const char *db, const char *serv)
		{
			return database(db) && server(serv) && connect();
		}
		
		virtual bool connect(const char *db, const char *serv, const char *u)
		{
			return database(db) && server(serv) && user(u) && connect();
		}
		
		virtual bool connect(const char *db, const char *serv, const char *u, const char *pw)
		{
			return database(db) && server(serv) && user(u) && password(pw) && connect();
		}
		
		virtual bool server(const char *s) = 0;
		virtual const char *server() = 0;
		
		virtual bool user(const char *u) = 0;
		virtual const char *user() = 0;
		
		virtual bool password(const char *pw) = 0;
		virtual const char *password() = 0;
		
		virtual bool database(const char *db) = 0;
		virtual const char *database() = 0;
		
		virtual bool disconnect() = 0;

		// transactions
		virtual bool begin() = 0;
		virtual bool commit() = 0;
		virtual bool rollback() = 0;

		virtual MadDBResult *prepare(const char *) = 0;
		virtual MadDBResult *preparef(const char *, ...) = 0;
		virtual bool query(const char *) = 0;
		virtual bool queryf(const char *, ...) = 0;

		int last_insert_id();
		
		virtual const char *error_message() = 0;

	private:
		friend class MadDBResult;

};

class MadDBHandler {
	public:
		virtual MadDBConnection *getDB() = 0;
};

#endif /* __MADDB_H__ */