fix
[libpgclient.git] / include / libpgcli / pgprov3.h
blob7996122ac76f09501c4a6ea6b0f51a08917d0311
1 #ifndef __PGPROV3_H__
2 #define __PGPROV3_H__
4 #include <stdint.h>
5 #include <errno.h>
6 #include <endian.h>
7 #include <stdarg.h>
8 #include <limits.h>
9 #include <sys/types.h>
10 #include <sys/socket.h>
11 #include <libex/str.h>
12 #include <libex/list.h>
13 #include <libex/array.h>
14 #include "pgfld.h"
16 #define PG_MAJOR_VER 3
17 #define PG_MINOR_VER 0
19 #define PG_AUTHOK 'R'
20 #define PG_PARAMSTATUS 'S'
21 #define PG_BACKENDKEYDATA 'K'
22 #define PG_READY 'Z'
23 #define PG_TERM 'X'
24 #define PG_ERROR 'E'
25 #define PG_SIMPLEQUERY 'Q'
26 #define PG_ROWDESC 'T'
27 #define PG_DATAROW 'D'
28 #define PG_CMDCOMPLETE 'C'
29 #define PG_PARSE 'P'
30 #define PG_PARSECOMPLETE '1'
31 #define PG_BIND 'B'
32 #define PG_BINDCOMPLETE '2'
33 #define PG_DESCRIBE 'D'
34 #define PG_EXECUTE 'E'
35 #define PG_SYNC 'S'
36 #define PG_NODATA 'n'
37 #define PG_PARAMDESC 't'
38 #define PG_PORTALSUSPENDED 's'
39 #define PG_EMPTYQUERY 'I'
40 #define PG_CLOSE 'C'
42 #define PG_IDLE 'I'
43 #define PG_ACTIVE 'T'
44 #define PG_EXCEPT 'E'
46 #define PG_SEVERITY 'S'
47 #define PG_FATAL 'V'
48 #define PG_SQLSTATE 'C'
49 #define PG_MESSAGE 'M'
50 #define PG_POSITION 'P'
51 #define PG_FILE 'F'
52 #define PG_LINE 'L'
53 #define PG_ROUTINE 'R'
55 #define PG_OPNAME 'S'
56 #define PG_PORTAL 'P'
58 #define PG_PARAM_END -1
60 #define PG_TEXT 0
61 #define PG_BIN 1
63 #define PG_PREPARED_OPERATOR 'S'
64 #define PG_PREPARED_PORTAL 'P'
66 #define PG_FULL 0
68 typedef int32_t oid_t;
70 typedef struct {
71 char type;
72 int32_t len;
73 char ptr [0];
74 } __attribute__ ((packed)) pgmsg_body_t;
76 typedef struct pgmsg {
77 size_t bufsize;
78 size_t len;
79 char *pc;
80 pgmsg_body_t body;
81 } pgmsg_t;
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);
103 typedef struct {
104 char type;
105 int32_t success;
106 } pgmsg_auth_t;
108 typedef struct {
109 char type;
110 const char *name;
111 const char *value;
112 } pgmsg_param_status_t;
114 typedef struct {
115 char type;
116 int32_t pid;
117 int32_t sk;
118 } pgmsg_backend_keydata_t;
120 typedef struct {
121 char type;
122 char tr;
123 } pgmsg_ready_t;
125 typedef struct {
126 char type;
127 char *severity;
128 char *text;
129 char *code;
130 char *message;
131 char *position;
132 char *file;
133 char *line;
134 char *routine;
135 } pgmsg_error_t;
137 typedef struct {
138 const char *fname;
139 int32_t oid_table;
140 int16_t idx_field;
141 int32_t oid_field;
142 int16_t field_len;
143 int32_t type_mod;
144 int16_t field_fmt;
145 } pgmsg_field_t;
147 typedef struct {
148 char type;
149 int16_t nflds;
150 pgmsg_field_t fields [0];
151 } pgmsg_rowdesc_t;
153 typedef struct {
154 int32_t len;
155 uint8_t *data;
156 } pgmsg_data_t;
158 typedef struct {
159 char type;
160 int16_t nflds;
161 pgmsg_data_t fields [0];
162 } pgmsg_datarow_t;
164 typedef struct {
165 char type;
166 const char *tag;
167 } pgmsg_cmd_complete_t;
169 typedef union {
170 char type;
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;
179 } pgmsg_resp_t;
181 pgmsg_resp_t *pgmsg_parse (pgmsg_t *msg);
183 #endif