struct pg_conn; // libpq-fe.h
struct pg_result; // libpq-fe.h

#ifdef WIN32
#ifdef _DEBUG
#ifndef _LTMDB
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
#define new DEBUG_CLIENTBLOCK
#define _LTMDB
#endif
#endif
#else
#define __declspec( x )
#define __int64       long long
#endif

namespace Framework
{
	class Text; // Text.h
}

namespace sql
{
	struct Result; // aus dieser Datei
	class Datenbank; // aus dieser Datei

	struct Result
	{
		int feldAnzahl;
		Framework::Text *felder;
		int zeilenAnzahl;
		Framework::Text *values;
		__declspec( dllexport ) void destroy();
	};

	class Datenbank
	{
	private:
		pg_conn *conn;
		pg_result *res;
		int ref;

	public:
		// Konstruktor 
		__declspec( dllexport ) Datenbank( const char *user, const char *passwort, const char *dbname, const char *ip, unsigned short port );
		// Destruktor 
		__declspec( dllexport ) ~Datenbank();
		// nicht constant 
		__declspec( dllexport ) bool befehl( const char *txt ); // führt einen Befehl aus
		// constant
		__declspec( dllexport ) int getZeilenAnzahl() const; // Anzahl der betroffenen zeilen
		__declspec( dllexport ) Result getResult() const; // gibt den rückgabewert des letzten Befehls zurück
		__declspec( dllexport ) Framework::Text *getLetzterFehler() const; // gibt den letzten Fehler zurück
		__declspec( dllexport ) bool istOk() const; // prüft, ob die Verbindung zur Datenbank besteht
		// Reference Counting 
		__declspec( dllexport ) Datenbank *getThis();
		__declspec( dllexport ) Datenbank *release();
	};
}