1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #ifndef PHP_PGSQL_H
23 #define PHP_PGSQL_H
24
25 #if HAVE_PGSQL
26
27 #define PHP_PGSQL_API_VERSION 20140217
28
29 extern zend_module_entry pgsql_module_entry;
30 #define pgsql_module_ptr &pgsql_module_entry
31
32 #ifdef PHP_PGSQL_PRIVATE
33 #undef SOCKET_SIZE_TYPE
34 #include <libpq-fe.h>
35
36 #ifdef PHP_WIN32
37 #define INV_WRITE 0x00020000
38 #define INV_READ 0x00040000
39 #undef PHP_PGSQL_API
40 #ifdef PGSQL_EXPORTS
41 #define PHP_PGSQL_API __declspec(dllexport)
42 #else
43 #define PHP_PGSQL_API __declspec(dllimport)
44 #endif
45 #else
46 #include <libpq/libpq-fs.h>
47 # if defined(__GNUC__) && __GNUC__ >= 4
48 # define PHP_PGSQL_API __attribute__ ((visibility("default")))
49 # else
50 # define PHP_PGSQL_API
51 # endif
52 #endif
53
54 #ifdef HAVE_PG_CONFIG_H
55 #include <pg_config.h>
56 #endif
57
58 #ifdef HAVE_PGSQL_WITH_MULTIBYTE_SUPPORT
59 const char * pg_encoding_to_char(int encoding);
60 #endif
61
62 PHP_MINIT_FUNCTION(pgsql);
63 PHP_MSHUTDOWN_FUNCTION(pgsql);
64 PHP_RINIT_FUNCTION(pgsql);
65 PHP_RSHUTDOWN_FUNCTION(pgsql);
66 PHP_MINFO_FUNCTION(pgsql);
67
68 PHP_FUNCTION(pg_connect);
69 PHP_FUNCTION(pg_pconnect);
70 PHP_FUNCTION(pg_connect_poll);
71 PHP_FUNCTION(pg_close);
72 PHP_FUNCTION(pg_connection_reset);
73 PHP_FUNCTION(pg_connection_status);
74 PHP_FUNCTION(pg_connection_busy);
75 PHP_FUNCTION(pg_host);
76 PHP_FUNCTION(pg_dbname);
77 PHP_FUNCTION(pg_port);
78 PHP_FUNCTION(pg_tty);
79 PHP_FUNCTION(pg_options);
80 PHP_FUNCTION(pg_version);
81 PHP_FUNCTION(pg_ping);
82 #if HAVE_PQPARAMETERSTATUS
83 PHP_FUNCTION(pg_parameter_status);
84 #endif
85 #if HAVE_PGTRANSACTIONSTATUS
86 PHP_FUNCTION(pg_transaction_status);
87 #endif
88
89 PHP_FUNCTION(pg_query);
90 #if HAVE_PQEXECPARAMS
91 PHP_FUNCTION(pg_query_params);
92 #endif
93 #if HAVE_PQPREPARE
94 PHP_FUNCTION(pg_prepare);
95 #endif
96 #if HAVE_PQEXECPREPARED
97 PHP_FUNCTION(pg_execute);
98 #endif
99 PHP_FUNCTION(pg_send_query);
100 #if HAVE_PQSENDQUERYPARAMS
101 PHP_FUNCTION(pg_send_query_params);
102 #endif
103 #if HAVE_PQSENDPREPARE
104 PHP_FUNCTION(pg_send_prepare);
105 #endif
106 #if HAVE_PQSENDQUERYPREPARED
107 PHP_FUNCTION(pg_send_execute);
108 #endif
109 PHP_FUNCTION(pg_cancel_query);
110
111 PHP_FUNCTION(pg_fetch_assoc);
112 PHP_FUNCTION(pg_fetch_array);
113 PHP_FUNCTION(pg_fetch_object);
114 PHP_FUNCTION(pg_fetch_result);
115 PHP_FUNCTION(pg_fetch_row);
116 PHP_FUNCTION(pg_fetch_all);
117 PHP_FUNCTION(pg_fetch_all_columns);
118 #if HAVE_PQCMDTUPLES
119 PHP_FUNCTION(pg_affected_rows);
120 #endif
121 PHP_FUNCTION(pg_get_result);
122 PHP_FUNCTION(pg_result_seek);
123 PHP_FUNCTION(pg_result_status);
124 PHP_FUNCTION(pg_free_result);
125 PHP_FUNCTION(pg_last_oid);
126 PHP_FUNCTION(pg_num_rows);
127 PHP_FUNCTION(pg_num_fields);
128 PHP_FUNCTION(pg_field_name);
129 PHP_FUNCTION(pg_field_num);
130 PHP_FUNCTION(pg_field_size);
131 PHP_FUNCTION(pg_field_type);
132 PHP_FUNCTION(pg_field_type_oid);
133 PHP_FUNCTION(pg_field_prtlen);
134 PHP_FUNCTION(pg_field_is_null);
135 PHP_FUNCTION(pg_field_table);
136
137 PHP_FUNCTION(pg_get_notify);
138 PHP_FUNCTION(pg_socket);
139 PHP_FUNCTION(pg_consume_input);
140 PHP_FUNCTION(pg_flush);
141 PHP_FUNCTION(pg_get_pid);
142
143 PHP_FUNCTION(pg_result_error);
144 #if HAVE_PQRESULTERRORFIELD
145 PHP_FUNCTION(pg_result_error_field);
146 #endif
147 PHP_FUNCTION(pg_last_error);
148 PHP_FUNCTION(pg_last_notice);
149
150 PHP_FUNCTION(pg_put_line);
151 PHP_FUNCTION(pg_end_copy);
152 PHP_FUNCTION(pg_copy_to);
153 PHP_FUNCTION(pg_copy_from);
154
155 PHP_FUNCTION(pg_lo_create);
156 PHP_FUNCTION(pg_lo_unlink);
157 PHP_FUNCTION(pg_lo_open);
158 PHP_FUNCTION(pg_lo_close);
159 PHP_FUNCTION(pg_lo_read);
160 PHP_FUNCTION(pg_lo_write);
161 PHP_FUNCTION(pg_lo_read_all);
162 PHP_FUNCTION(pg_lo_import);
163 PHP_FUNCTION(pg_lo_export);
164 PHP_FUNCTION(pg_lo_seek);
165 PHP_FUNCTION(pg_lo_tell);
166 #if HAVE_PG_LO_TRUNCATE
167 PHP_FUNCTION(pg_lo_truncate);
168 #endif
169
170
171 PHP_FUNCTION(pg_trace);
172 PHP_FUNCTION(pg_untrace);
173
174
175 PHP_FUNCTION(pg_client_encoding);
176 PHP_FUNCTION(pg_set_client_encoding);
177 #if HAVE_PQSETERRORVERBOSITY
178 PHP_FUNCTION(pg_set_error_verbosity);
179 #endif
180 #if HAVE_PQESCAPE
181 PHP_FUNCTION(pg_escape_string);
182 PHP_FUNCTION(pg_escape_bytea);
183 PHP_FUNCTION(pg_unescape_bytea);
184 PHP_FUNCTION(pg_escape_literal);
185 PHP_FUNCTION(pg_escape_identifier);
186 #endif
187
188
189 PHP_FUNCTION(pg_meta_data);
190 PHP_FUNCTION(pg_convert);
191 PHP_FUNCTION(pg_insert);
192 PHP_FUNCTION(pg_update);
193 PHP_FUNCTION(pg_delete);
194 PHP_FUNCTION(pg_select);
195
196
197 #define PGSQL_CONNECT_FORCE_NEW (1<<1)
198 #define PGSQL_CONNECT_ASYNC (1<<2)
199
200 #define PGSQL_CONV_IGNORE_DEFAULT (1<<1)
201 #define PGSQL_CONV_FORCE_NULL (1<<2)
202 #define PGSQL_CONV_IGNORE_NOT_NULL (1<<3)
203 #define PGSQL_CONV_OPTS (PGSQL_CONV_IGNORE_DEFAULT|PGSQL_CONV_FORCE_NULL|PGSQL_CONV_IGNORE_NOT_NULL)
204
205 #define PGSQL_DML_NO_CONV (1<<8)
206 #define PGSQL_DML_EXEC (1<<9)
207 #define PGSQL_DML_ASYNC (1<<10)
208 #define PGSQL_DML_STRING (1<<11)
209 #define PGSQL_DML_ESCAPE (1<<12)
210
211
212
213 PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, const char *table_name, zval *meta, zend_bool extended TSRMLS_DC);
214 PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval *values, zval *result, ulong opt TSRMLS_DC);
215 PHP_PGSQL_API int php_pgsql_insert(PGconn *pg_link, const char *table, zval *values, ulong opt, char **sql TSRMLS_DC);
216 PHP_PGSQL_API int php_pgsql_update(PGconn *pg_link, const char *table, zval *values, zval *ids, ulong opt , char **sql TSRMLS_DC);
217 PHP_PGSQL_API int php_pgsql_delete(PGconn *pg_link, const char *table, zval *ids, ulong opt, char **sql TSRMLS_DC);
218 PHP_PGSQL_API int php_pgsql_select(PGconn *pg_link, const char *table, zval *ids, zval *ret_array, ulong opt, char **sql TSRMLS_DC);
219 PHP_PGSQL_API int php_pgsql_result2array(PGresult *pg_result, zval *ret_array TSRMLS_DC);
220
221
222 static void php_pgsql_do_connect(INTERNAL_FUNCTION_PARAMETERS,int persistent);
223 static void php_pgsql_get_link_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type);
224 static void php_pgsql_get_result_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type);
225 static char *get_field_name(PGconn *pgsql, Oid oid, HashTable *list TSRMLS_DC);
226 static void php_pgsql_get_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type);
227 static void php_pgsql_data_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type);
228 static void php_pgsql_do_async(INTERNAL_FUNCTION_PARAMETERS,int entry_type);
229
230 static size_t php_pgsql_fd_write(php_stream *stream, const char *buf, size_t count TSRMLS_DC);
231 static size_t php_pgsql_fd_read(php_stream *stream, char *buf, size_t count TSRMLS_DC);
232 static int php_pgsql_fd_close(php_stream *stream, int close_handle TSRMLS_DC);
233 static int php_pgsql_fd_flush(php_stream *stream TSRMLS_DC);
234 static int php_pgsql_fd_set_option(php_stream *stream, int option, int value, void *ptrparam TSRMLS_DC);
235 static int php_pgsql_fd_cast(php_stream *stream, int cast_as, void **ret TSRMLS_DC);
236
237 typedef enum _php_pgsql_data_type {
238
239 PG_BOOL,
240
241 PG_OID,
242 PG_INT2,
243 PG_INT4,
244 PG_INT8,
245 PG_FLOAT4,
246 PG_FLOAT8,
247 PG_NUMERIC,
248 PG_MONEY,
249
250 PG_TEXT,
251 PG_CHAR,
252 PG_VARCHAR,
253
254 PG_UNIX_TIME,
255 PG_UNIX_TIME_INTERVAL,
256 PG_DATE,
257 PG_TIME,
258 PG_TIME_WITH_TIMEZONE,
259 PG_TIMESTAMP,
260 PG_TIMESTAMP_WITH_TIMEZONE,
261 PG_INTERVAL,
262
263 PG_BYTEA,
264
265 PG_CIDR,
266 PG_INET,
267 PG_MACADDR,
268
269 PG_BIT,
270 PG_VARBIT,
271
272 PG_LINE,
273 PG_LSEG,
274 PG_POINT,
275 PG_BOX,
276 PG_PATH,
277 PG_POLYGON,
278 PG_CIRCLE,
279
280 PG_UNKNOWN
281 } php_pgsql_data_type;
282
283 typedef struct pgLofp {
284 PGconn *conn;
285 int lofd;
286 } pgLofp;
287
288 typedef struct _php_pgsql_result_handle {
289 PGconn *conn;
290 PGresult *result;
291 int row;
292 } pgsql_result_handle;
293
294 typedef struct _php_pgsql_notice {
295 char *message;
296 size_t len;
297 } php_pgsql_notice;
298
299 static php_stream_ops php_stream_pgsql_fd_ops = {
300 php_pgsql_fd_write,
301 php_pgsql_fd_read,
302 php_pgsql_fd_close,
303 php_pgsql_fd_flush,
304 "PostgreSQL link",
305 NULL,
306 php_pgsql_fd_cast,
307 NULL,
308 php_pgsql_fd_set_option
309 };
310
311 ZEND_BEGIN_MODULE_GLOBALS(pgsql)
312 long default_link;
313 long num_links,num_persistent;
314 long max_links,max_persistent;
315 long allow_persistent;
316 long auto_reset_persistent;
317 int le_lofp,le_string;
318 int ignore_notices,log_notices;
319 HashTable notices;
320 ZEND_END_MODULE_GLOBALS(pgsql)
321
322 ZEND_EXTERN_MODULE_GLOBALS(pgsql)
323
324 #ifdef ZTS
325 # define PGG(v) TSRMG(pgsql_globals_id, zend_pgsql_globals *, v)
326 #else
327 # define PGG(v) (pgsql_globals.v)
328 #endif
329
330 #endif
331
332 #else
333
334 #define pgsql_module_ptr NULL
335
336 #endif
337
338 #define phpext_pgsql_ptr pgsql_module_ptr
339
340 #endif