fix
[libpgclient.git] / include / libpgcli / pgconn.h
blob4cb8d6b0ac3cdcc6076e8447cbe2783574ed6e73
1 #ifndef __PGCONN_H__
2 #define __PGCONN_H__
4 #include <unistd.h>
5 #include <endian.h>
6 #include <sys/types.h>
7 #include <sys/socket.h>
8 #include <netdb.h>
9 #include <netinet/in.h>
10 #include <arpa/inet.h>
11 #include <limits.h>
12 #include <assert.h>
13 #include <libex/list.h>
14 #include "pgerrcodes.h"
15 #include "pgprov3.h"
17 #define EPG_PORT 0x80000000
18 #define EPG_ERRNO 0x40000000
19 #define EPG_HOST 0x0fffffff
21 #define PG_NRECS(C) C->row_list->len
22 #define PG_NFLDS(C) C->rowdesc->nflds
23 #define PG_FLDLEN(C,R,F) C->rows[R]->fields[F].len
24 #define PG_DATA(C,R,F) C->rows[R]->fields[F].data
25 #define PG_ISNULL(C,R,F) C->rows[R]->fields[F].len >= 0 ? 0 : 1
27 #define CHECK_BOUNDS(C,R,F) (R >= 0 && R < PG_NRECS(C) && F >= 0 && F < PG_NFLDS(C))
29 typedef struct {
30 uint32_t code;
31 char *sqlstate;
32 char *msg;
33 } pgerror_t;
35 typedef struct {
36 int fd;
37 list_t *msgs;
38 list_t *row_list;
39 int nflds;
40 uint32_t intr_error;
41 pgmsg_datarow_t **rows;
42 pgmsg_error_t *error;
43 pgmsg_ready_t *ready;
44 pgmsg_rowdesc_t *rowdesc;
45 pgmsg_cmd_complete_t *complete;
46 pgmsg_t *suspended;
47 pgmsg_t *emptyquery;
48 char *date_style;
49 char *client_encoding;
50 char *server_encoding;
51 char *session_auth;
52 int is_int_datetimes;
53 int is_superuser;
54 int major_ver;
55 int minor_ver;
56 int authok;
57 time_t tm_released;
58 list_item_t *li;
59 } pgconn_t;
61 void pgconn_init (const char *pg_srv_addr, const char *pg_srv_service);
62 pgconn_t *pg_connect (const char *conn_info);
63 const int pg_error (pgconn_t *conn, pgerror_t *e);
64 static inline char pg_ready (pgconn_t *conn) {
65 return conn->ready ? conn->ready->tr : 0;
67 int pg_execsql (pgconn_t *conn, const char *sql, size_t sql_len);
68 int pg_prepareln (pgconn_t *conn, const char *name, size_t name_len,
69 const char *sql, size_t sql_len, int fld_len, pgfld_t **flds);
70 static inline int pg_preparel (pgconn_t *conn, const char *sql, size_t sql_len, int fld_len, pgfld_t **flds) {
71 return pg_prepareln(conn, CONST_STR_NULL, sql, sql_len, fld_len, flds);
73 int pg_preparen (pgconn_t *conn, const char *name, size_t name_len,
74 const char *sql, size_t sql_len, pgfld_t *fld, ...);
75 int pg_prepare (pgconn_t *conn, const char *sql, size_t sql_len, pgfld_t *fld, ...);
76 int pg_execln (pgconn_t *conn, const char *portal, size_t portal_len,
77 const char *stmt, size_t stmt_len,
78 int fld_len, pgfld_t **flds, int res_fmt_len, int *res_fmt, int max_data);
79 static inline int pg_execl (pgconn_t *conn, int fld_len, pgfld_t **flds, int res_fmt_len, int *res_fmt, int max_data) {
80 return pg_execln(conn, CONST_STR_NULL, CONST_STR_NULL, fld_len, flds, res_fmt_len, res_fmt, max_data);
82 int pg_execvn (pgconn_t *conn, const char *portal, size_t portal_len, const char *stmt, size_t stmt_len, int max_data, int fmt_out, pgfld_t *fld, va_list ap);
83 static inline int pg_execv (pgconn_t *conn, int max_data, int out_fmt, pgfld_t *fld, va_list ap) {
84 return pg_execvn(conn, CONST_STR_NULL, CONST_STR_NULL, max_data, out_fmt, fld, ap);
86 int pg_execn (pgconn_t *conn, const char *portal, size_t portal_len, const char *stmt, size_t stmt_len, int max_data, int out_fmt, pgfld_t *fld, ...);
87 int pg_exec (pgconn_t *conn, int max_data, int out_fmt, pgfld_t *fld, ...);
88 int pg_nextn (pgconn_t *conn, const char *portal, size_t portal_len, int max_data);
89 static inline int pg_next (pgconn_t *conn, int max_data) {
90 return pg_nextn(conn, CONST_STR_NULL, max_data);
92 static inline char pg_getready (pgconn_t *conn) {
93 return conn->ready ? conn->ready->tr : 0;
95 int pg_release (pgconn_t *conn, const char *name, size_t name_len);
96 void pg_close (pgconn_t *conn);
97 void pg_disconnect(pgconn_t *conn);
99 static inline int pg_nrecs (pgconn_t *conn) { return PG_NRECS(conn); };
100 static inline int pg_nflds (pgconn_t *conn) { return PG_NFLDS(conn); };
101 static inline int pg_isnull (pgconn_t *conn, int row, int col) { return PG_ISNULL(conn, row, col); };
103 #define pg_getdate(C,R,F) pg_geti32(C,R,F)
104 #define pg_gettm(C,R,F) pg_geti64(C,R,F)
105 const strptr_t pg_get (pgconn_t *conn, int row, int col);
106 static inline int pg_fldlen (pgconn_t *conn, int row, int col) {
107 assert(CHECK_BOUNDS(conn, row, col));
108 return PG_FLDLEN(conn, row, col);
110 strptr_t pg_getstr (pgconn_t *conn, int row, int col);
111 static inline int32_t pg_geti32 (pgconn_t *conn, int row, int col) {
112 assert(CHECK_BOUNDS(conn, row, col));
113 return be32toh(*(int32_t*)PG_DATA(conn, row, col));
115 static inline int64_t pg_geti64 (pgconn_t *conn, int row, int col) {
116 assert(CHECK_BOUNDS(conn, row, col));
117 return be64toh(*(int64_t*)PG_DATA(conn, row, col));
119 static inline double pg_getd (pgconn_t *conn, int row, int col) {
120 assert(CHECK_BOUNDS(conn, row, col));
121 return pg_conv_double(*(double*)PG_DATA(conn, row, col));
123 static inline float pg_getf (pgconn_t *conn, int row, int col) {
124 assert(CHECK_BOUNDS(conn, row, col));
125 return pg_conv_float(*(float*)PG_DATA(conn, row, col));
127 static inline int8_t pg_getbool (pgconn_t *conn, int row, int col) {
128 assert(CHECK_BOUNDS(conn, row, col));
129 return *PG_DATA(conn, row, col);
131 int32_t pg_getx32 (pgconn_t *conn, int row, int col);
132 pg_intv_t pg_getintv (pgconn_t *conn, int row, int col);
133 int32_t pg_getinet4 (pgconn_t *conn, int row, int col);
134 static inline void pg_getnum (pgconn_t *conn, int row, int col, mpq_t res, uint16_t *dscale) {
135 assert(CHECK_BOUNDS(conn, row, col));
136 pg_get_numeric(PG_DATA(conn, row, col), res, dscale);
138 static inline unsigned char *pg_getuuid (pgconn_t *conn, int row, int col) {
139 assert(CHECK_BOUNDS(conn, row, col));
140 return PG_DATA(conn, row, col);
143 #endif