#include <libpq-fe.h>

/* cursors */
typedef struct _cursor
{
    PGresult *res;
    int nrows;			/* number of rows in query result */
    int row;			/* current row */
    dbToken token;
    int type;			/* type of cursor: SELECT, UPDATE, INSERT */
    int *cols;			/* indexes of known (type) columns */
    int ncols;			/* number of known columns */
} cursor;

typedef struct
{
    char *host, *port, *options, *tty, *dbname, *user, *password, *schema;
} PGCONN;

/* PostgreSQL data types defined in GRASS
   (see also: /usr/include/pgsql/server/catalog/pg_type.h)
   PostGIS types are encoded as 17xxx.
   Types/OIDs are fetched in db.c from server.
 */
typedef enum
{				/* name in pg_type, aliases */
    PG_TYPE_UNKNOWN,		/* all types not supported by GRASS */

    PG_TYPE_BIT,		/* bit */
    PG_TYPE_INT2,		/* int2,   smallint */
    PG_TYPE_INT4,		/* int4,   integer, int */
    PG_TYPE_INT8,		/* int8,   bigint */
    PG_TYPE_SERIAL,		/* serial */
    PG_TYPE_OID,		/* oid */

    PG_TYPE_FLOAT4,		/* float4, real */
    PG_TYPE_FLOAT8,		/* float8, double precision */
    PG_TYPE_NUMERIC,		/* numeric, decimal */

    PG_TYPE_CHAR,		/* char,   character */
    PG_TYPE_BPCHAR,		/* ??? blank padded character, oid of this type is returned for char fields */
    PG_TYPE_VARCHAR,		/* varchar,        character varying */
    PG_TYPE_TEXT,		/* text */

    PG_TYPE_DATE,		/* date */
    PG_TYPE_TIME,		/* time */
    PG_TYPE_TIMESTAMP,		/* timestamp */

    PG_TYPE_BOOL,		/* bool, boolean */

    PG_TYPE_POSTGIS_GEOM	/* Geometry column of PostGIS, GRASS internal type */
} PG_TYPES;


#ifdef MAIN
PGconn *pg_conn;		/* Database connection */
int (*pg_types)[2] = NULL;	/* array of types, first is internal code, second PG_TYPE_* */
int pg_ntypes = 0;
dbString *errMsg = NULL;	/* error message */
#else
extern PGconn *pg_conn;
extern dbString *errMsg;
extern int (*pg_types)[2];
extern int pg_ntypes;
#endif
