10 #include <sys/socket.h>
11 #include <libex/str.h>
12 #include <libex/list.h>
13 #include <libex/array.h>
16 #define PG_MAJOR_VER 3
17 #define PG_MINOR_VER 0
20 #define PG_PARAMSTATUS 'S'
21 #define PG_BACKENDKEYDATA 'K'
25 #define PG_SIMPLEQUERY 'Q'
26 #define PG_ROWDESC 'T'
27 #define PG_DATAROW 'D'
28 #define PG_CMDCOMPLETE 'C'
30 #define PG_PARSECOMPLETE '1'
32 #define PG_BINDCOMPLETE '2'
33 #define PG_DESCRIBE 'D'
34 #define PG_EXECUTE 'E'
37 #define PG_PARAMDESC 't'
38 #define PG_PORTALSUSPENDED 's'
39 #define PG_EMPTYQUERY 'I'
46 #define PG_SEVERITY 'S'
48 #define PG_SQLSTATE 'C'
49 #define PG_MESSAGE 'M'
50 #define PG_POSITION 'P'
53 #define PG_ROUTINE 'R'
58 #define PG_PARAM_END -1
63 #define PG_PREPARED_OPERATOR 'S'
64 #define PG_PREPARED_PORTAL 'P'
68 typedef int32_t oid_t
;
74 } __attribute__ ((packed
)) pgmsg_body_t
;
76 typedef struct pgmsg
{
83 typedef void* (*parse_param_h
) (void*, const char*, const char*, uint32_t*);
84 void *parse_conninfo (void *data
, const char *conn_info
, parse_param_h fn
, uint32_t *flags
);
85 int pgmsg_set_param (pgmsg_t
**msg
, const char *name
, size_t name_len
, const char *value
, size_t value_len
);
87 pgmsg_t
*pgmsg_create (char type
);
88 pgmsg_t
*pgmsg_create_startup (const char *user
, size_t user_len
, const char *database
, size_t database_len
);
89 pgmsg_t
*pgmsg_create_startup_params (const char *conn_info
);
90 pgmsg_t
*pgmsg_create_simple_query (const char *sql
, size_t sql_len
);
91 pgmsg_t
*pgmsg_create_parse (const char *name
, size_t name_len
, const char *sql
, size_t sql_len
, int fld_len
, pgfld_t
**flds
);
92 pgmsg_t
*pgmsg_create_bind (const char *portal
, size_t portal_len
, const char *stmt
, size_t stmt_len
,
93 int fld_len
, pgfld_t
**flds
, int res_fmt_len
, int *res_fmt
);
94 pgmsg_t
*pgmsg_create_describe (uint8_t op
, const char *name
, size_t name_len
);
95 pgmsg_t
*pgmsg_create_execute (const char *portal
, size_t portal_len
, int32_t max_rows
);
96 pgmsg_t
*pgmsg_create_close(char what
, const char *str
, size_t slen
);
97 static inline pgmsg_t
*pgmsg_create_sync () { return pgmsg_create(PG_SYNC
); };
98 static inline pgmsg_t
*pgmsg_create_term () { return pgmsg_create(PG_TERM
); };
100 int pgmsg_send (int fd
, pgmsg_t
*msg
);
101 int pgmsg_recv (int fd
, pgmsg_t
**msg
);
112 } pgmsg_param_status_t
;
118 } pgmsg_backend_keydata_t
;
150 pgmsg_field_t fields
[0];
161 pgmsg_data_t fields
[0];
167 } pgmsg_cmd_complete_t
;
171 pgmsg_auth_t msg_auth
;
172 pgmsg_param_status_t msg_param_status
;
173 pgmsg_backend_keydata_t msg_backend_keydata
;
174 pgmsg_ready_t msg_ready
;
175 pgmsg_error_t msg_error
;
176 pgmsg_rowdesc_t msg_rowdesc
;
177 pgmsg_datarow_t msg_datarow
;
178 pgmsg_cmd_complete_t msg_complete
;
181 pgmsg_resp_t
*pgmsg_parse (pgmsg_t
*msg
);