text: #ifndef _ECPG_LIB_EXTERN_H
  #define _ECPG_LIB_EXTERN_H
  
  #include "postgres_fe.h"
  #include "libpq-fe.h"
  #include "sqlca.h"
  
  enum COMPAT_MODE
  {
  	ECPG_COMPAT_PGSQL = 0, ECPG_COMPAT_INFORMIX, ECPG_COMPAT_INFORMIX_SE
  };
  
  #define INFORMIX_MODE(X) ((X) == ECPG_COMPAT_INFORMIX || (X) == ECPG_COMPAT_INFORMIX_SE)
  
  enum ARRAY_TYPE
  {
  	ECPG_ARRAY_NOT_SET, ECPG_ARRAY_ARRAY, ECPG_ARRAY_VECTOR, ECPG_ARRAY_NONE
  };
  
  /* Here are some methods used by the lib. */
  
  /* Returns a pointer to a string containing a simple type name. */
  void		ECPGadd_mem(void *ptr, int lineno);
  
  bool ECPGget_data(const PGresult *, int, int, int, enum ECPGttype type,
  			 enum ECPGttype, char *, char *, long, long, long,
  			 enum ARRAY_TYPE, enum COMPAT_MODE, bool);
  struct connection *ECPGget_connection(const char *);
  char	   *ECPGalloc(long, int);
  char	   *ECPGrealloc(void *, long, int);
  void		ECPGfree(void *);
  bool		ECPGinit(const struct connection *, const char *, const int);
  char	   *ECPGstrdup(const char *, int);
  const char *ECPGtype_name(enum ECPGttype);
  unsigned int ECPGDynamicType(Oid);
  void		ECPGfree_auto_mem(void);
  void		ECPGclear_auto_mem(void);
  
  struct descriptor *ecpggetdescp(int, char *);
  
  /* A generic varchar type. */
  struct ECPGgeneric_varchar
  {
  	int			len;
  	char		arr[1];
  };
  
  /*
   * type information cache
   */
  
  struct ECPGtype_information_cache
  {
  	struct ECPGtype_information_cache *next;
  	int			oid;
  	bool		isarray;
  };
  
  /* structure to store one statement */
  struct statement
  {
  	int			lineno;
  	char	   *command;
  	struct connection *connection;
  	enum COMPAT_MODE compat;
  	bool		force_indicator;
  	struct variable *inlist;
  	struct variable *outlist;
  };
  
  /* structure to store connections */
  struct connection
  {
  	char	   *name;
  	PGconn	   *connection;
  	bool		committed;
  	int			autocommit;
  	struct ECPGtype_information_cache *cache_head;
  	struct connection *next;
  };
  
  /* structure to store descriptors */
  struct descriptor
  {
  	char	   *name;
  	PGresult   *result;
  	struct descriptor *next;
  	int			count;
  	struct descriptor_item *items;
  };
  
  extern struct descriptor *all_descriptors;
  
  struct descriptor_item
  {
  	int			num;
  	char	   *data;
  	int			indicator;
  	int			length;
  	int			precision;
  	int			scale;
  	int			type;
  	struct descriptor_item *next;
  };
  
  struct variable
  {
  	enum ECPGttype type;
  	void	   *value;
  	void	   *pointer;
  	long		varcharsize;
  	long		arrsize;
  	long		offset;
  	enum ECPGttype ind_type;
  	void	   *ind_value;
  	void	   *ind_pointer;
  	long		ind_varcharsize;
  	long		ind_arrsize;
  	long		ind_offset;
  	struct variable *next;
  };
  
  PGresult  **ECPGdescriptor_lvalue(int line, const char *descriptor);
  
  bool ECPGstore_result(const PGresult *results, int act_field,
  				 const struct statement * stmt, struct variable * var);
  bool		ECPGstore_input(const int, const bool, const struct variable *, const char **, bool *);
  
  #if defined(__GNUC__) && (defined (__powerpc__) || defined(__amd64__) || defined(__x86_64__))
   /* work around a gcc/ABI bug with va_lists on ppc+amd64 */
  void		ECPGget_variable(va_list, enum ECPGttype, struct variable *, bool);
  #else
  void		ECPGget_variable(va_list *, enum ECPGttype, struct variable *, bool);
  #endif
  
  /* SQLSTATE values generated or processed by ecpglib (intentionally
   * not exported -- users should refer to the codes directly) */
  
  #define ECPG_SQLSTATE_NO_DATA				"02000"
  #define ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_PARAMETERS	"07001"
  #define ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_TARGETS		"07002"
  #define ECPG_SQLSTATE_RESTRICTED_DATA_TYPE_ATTRIBUTE_VIOLATION	"07006"
  #define ECPG_SQLSTATE_INVALID_DESCRIPTOR_INDEX		"07009"
  #define ECPG_SQLSTATE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION	"08001"
  #define ECPG_SQLSTATE_CONNECTION_DOES_NOT_EXIST		"08003"
  #define ECPG_SQLSTATE_TRANSACTION_RESOLUTION_UNKNOWN	"08007"
  #define ECPG_SQLSTATE_CARDINALITY_VIOLATION "21000"
  #define ECPG_SQLSTATE_NULL_VALUE_NO_INDICATOR_PARAMETER "22002"
  #define ECPG_SQLSTATE_ACTIVE_SQL_TRANSACTION		"25001"
  #define ECPG_SQLSTATE_NO_ACTIVE_SQL_TRANSACTION		"25P01"
  #define ECPG_SQLSTATE_INVALID_SQL_STATEMENT_NAME	"26000"
  #define ECPG_SQLSTATE_INVALID_SQL_DESCRIPTOR_NAME	"33000"
  #define ECPG_SQLSTATE_INVALID_CURSOR_NAME	"34000"
  #define ECPG_SQLSTATE_SYNTAX_ERROR			"42601"
  #define ECPG_SQLSTATE_DATATYPE_MISMATCH		"42804"
  #define ECPG_SQLSTATE_DUPLICATE_CURSOR		"42P03"
  
  /* implementation-defined internal errors of ecpg */
  #define ECPG_SQLSTATE_ECPG_INTERNAL_ERROR	"YE000"
  #define ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY	"YE001"
  
  #endif   /* _ECPG_LIB_EXTERN_H */
  