📄 pgsql.c
字号:
/* +----------------------------------------------------------------------+ | PHP Version 4 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Zeev Suraski <zeev@zend.com> | | Jouni Ahto <jouni.ahto@exdec.fi> | | Yasuo Ohgaki <yohgaki@php.net> | | Youichi Iwakiri <yiwakiri@st.rim.or.jp> (pg_copy_*) | +----------------------------------------------------------------------+ */ /* $Id: pgsql.c,v 1.244.2.40.2.7 2007/01/11 16:47:32 tony2001 Exp $ */#include <stdlib.h>#define PHP_PGSQL_PRIVATE 1#ifdef HAVE_CONFIG_H#include "config.h"#endif#define SMART_STR_PREALLOC 512#include "php.h"#include "php_ini.h"#include "ext/standard/php_standard.h"#include "ext/standard/php_smart_str.h"#include "php_pgsql.h"#include "php_globals.h"#if HAVE_PGSQL#ifndef InvalidOid#define InvalidOid ((Oid) 0)#endif#define PGSQL_ASSOC 1<<0#define PGSQL_NUM 1<<1#define PGSQL_BOTH (PGSQL_ASSOC|PGSQL_NUM)#define PGSQL_STATUS_LONG 1#define PGSQL_STATUS_STRING 2#define PGSQL_MAX_LENGTH_OF_LONG 30#define PGSQL_MAX_LENGTH_OF_DOUBLE 60#define PGSQL_RETURN_OID(oid) do { \ if (oid > LONG_MAX) { \ smart_str s = {0}; \ smart_str_append_unsigned(&s, oid); \ smart_str_0(&s); \ RETURN_STRINGL(s.c, s.len, 0); \ } \ RETURN_LONG((long)oid); \} while(0)#if HAVE_PQSETNONBLOCKING#define PQ_SETNONBLOCKING(pg_link, flag) PQsetnonblocking(pg_link, flag)#else#define PQ_SETNONBLOCKING(pg_link, flag) 0#endif#define CHECK_DEFAULT_LINK(x) if ((x) == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No PostgreSQL link opened yet"); }/* {{{ pgsql_functions[] */function_entry pgsql_functions[] = { /* connection functions */ PHP_FE(pg_connect, NULL) PHP_FE(pg_pconnect, NULL) PHP_FE(pg_close, NULL) PHP_FE(pg_connection_status, NULL) PHP_FE(pg_connection_busy, NULL) PHP_FE(pg_connection_reset, NULL) PHP_FE(pg_host, NULL) PHP_FE(pg_dbname, NULL) PHP_FE(pg_port, NULL) PHP_FE(pg_tty, NULL) PHP_FE(pg_options, NULL) PHP_FE(pg_ping, NULL) /* query functions */ PHP_FE(pg_query, NULL) PHP_FE(pg_send_query, NULL) PHP_FE(pg_cancel_query, NULL) /* result functions */ PHP_FE(pg_fetch_result, NULL) PHP_FE(pg_fetch_row, NULL) PHP_FE(pg_fetch_assoc, NULL) PHP_FE(pg_fetch_array, NULL) PHP_FE(pg_fetch_object, NULL) PHP_FE(pg_fetch_all, NULL)#if HAVE_PQCMDTUPLES PHP_FE(pg_affected_rows,NULL)#endif PHP_FE(pg_get_result, NULL) PHP_FE(pg_result_seek, NULL) PHP_FE(pg_result_status,NULL) PHP_FE(pg_free_result, NULL) PHP_FE(pg_last_oid, NULL) PHP_FE(pg_num_rows, NULL) PHP_FE(pg_num_fields, NULL) PHP_FE(pg_field_name, NULL) PHP_FE(pg_field_num, NULL) PHP_FE(pg_field_size, NULL) PHP_FE(pg_field_type, NULL) PHP_FE(pg_field_prtlen, NULL) PHP_FE(pg_field_is_null,NULL) /* async message function */ PHP_FE(pg_get_notify, NULL) PHP_FE(pg_get_pid, NULL) /* error message functions */ PHP_FE(pg_result_error, NULL) PHP_FE(pg_last_error, NULL) PHP_FE(pg_last_notice, NULL) /* copy functions */ PHP_FE(pg_put_line, NULL) PHP_FE(pg_end_copy, NULL) PHP_FE(pg_copy_to, NULL) PHP_FE(pg_copy_from, NULL) /* debug functions */ PHP_FE(pg_trace, NULL) PHP_FE(pg_untrace, NULL) /* large object functions */ PHP_FE(pg_lo_create, NULL) PHP_FE(pg_lo_unlink, NULL) PHP_FE(pg_lo_open, NULL) PHP_FE(pg_lo_close, NULL) PHP_FE(pg_lo_read, NULL) PHP_FE(pg_lo_write, NULL) PHP_FE(pg_lo_read_all, NULL) PHP_FE(pg_lo_import, NULL) PHP_FE(pg_lo_export, NULL) PHP_FE(pg_lo_seek, NULL) PHP_FE(pg_lo_tell, NULL) /* utility functions */#if HAVE_PQESCAPE PHP_FE(pg_escape_string,NULL) PHP_FE(pg_escape_bytea, NULL) PHP_FE(pg_unescape_bytea, NULL)#endif#if HAVE_PQCLIENTENCODING PHP_FE(pg_client_encoding, NULL) PHP_FE(pg_set_client_encoding, NULL)#endif /* misc function */ PHP_FE(pg_meta_data, NULL) PHP_FE(pg_convert, NULL) PHP_FE(pg_insert, NULL) PHP_FE(pg_update, NULL) PHP_FE(pg_delete, NULL) PHP_FE(pg_select, NULL) /* aliases for downwards compatibility */ PHP_FALIAS(pg_exec, pg_query, NULL) PHP_FALIAS(pg_getlastoid, pg_last_oid, NULL)#if HAVE_PQCMDTUPLES PHP_FALIAS(pg_cmdtuples, pg_affected_rows, NULL)#endif PHP_FALIAS(pg_errormessage, pg_last_error, NULL) PHP_FALIAS(pg_numrows, pg_num_rows, NULL) PHP_FALIAS(pg_numfields, pg_num_fields, NULL) PHP_FALIAS(pg_fieldname, pg_field_name, NULL) PHP_FALIAS(pg_fieldsize, pg_field_size, NULL) PHP_FALIAS(pg_fieldtype, pg_field_type, NULL) PHP_FALIAS(pg_fieldnum, pg_field_num, NULL) PHP_FALIAS(pg_fieldprtlen, pg_field_prtlen, NULL) PHP_FALIAS(pg_fieldisnull, pg_field_is_null, NULL) PHP_FALIAS(pg_freeresult, pg_free_result, NULL) PHP_FALIAS(pg_result, pg_fetch_result, NULL) PHP_FALIAS(pg_loreadall, pg_lo_read_all, NULL) PHP_FALIAS(pg_locreate, pg_lo_create, NULL) PHP_FALIAS(pg_lounlink, pg_lo_unlink, NULL) PHP_FALIAS(pg_loopen, pg_lo_open, NULL) PHP_FALIAS(pg_loclose, pg_lo_close, NULL) PHP_FALIAS(pg_loread, pg_lo_read, NULL) PHP_FALIAS(pg_lowrite, pg_lo_write, NULL) PHP_FALIAS(pg_loimport, pg_lo_import, NULL) PHP_FALIAS(pg_loexport, pg_lo_export, NULL)#if HAVE_PQCLIENTENCODING PHP_FALIAS(pg_clientencoding, pg_client_encoding, NULL) PHP_FALIAS(pg_setclientencoding, pg_set_client_encoding, NULL)#endif {NULL, NULL, NULL} };/* }}} *//* {{{ pgsql_module_entry */zend_module_entry pgsql_module_entry = { STANDARD_MODULE_HEADER, "pgsql", pgsql_functions, PHP_MINIT(pgsql), PHP_MSHUTDOWN(pgsql), PHP_RINIT(pgsql), PHP_RSHUTDOWN(pgsql), PHP_MINFO(pgsql), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};/* }}} */#ifdef COMPILE_DL_PGSQLZEND_GET_MODULE(pgsql)#endifstatic int le_link, le_plink, le_result, le_lofp, le_string;ZEND_DECLARE_MODULE_GLOBALS(pgsql)/* {{{ _php_pgsql_trim_message */static char * _php_pgsql_trim_message(const char *message, int *len){ register int i = strlen(message)-1; if (i>1 && (message[i-1] == '\r' || message[i-1] == '\n') && message[i] == '.') { --i; } while (i>0 && (message[i] == '\r' || message[i] == '\n')) { --i; } ++i; if (len) { *len = i; } return estrndup(message, i);}/* }}} *//* {{{ _php_pgsql_trim_result */static inline char * _php_pgsql_trim_result(PGconn * pgsql, char **buf){ return *buf = _php_pgsql_trim_message(PQerrorMessage(pgsql), NULL);}/* }}} */#define PQErrorMessageTrim(pgsql, buf) _php_pgsql_trim_result(pgsql, buf)#define PHP_PQ_ERROR(text, pgsql) { \ char *msgbuf = _php_pgsql_trim_message(PQerrorMessage(pgsql), NULL); \ php_error_docref(NULL TSRMLS_CC, E_WARNING, text, msgbuf); \ efree(msgbuf); \} \/* {{{ php_pgsql_set_default_link */static void php_pgsql_set_default_link(int id TSRMLS_DC){ zend_list_addref(id); if (PGG(default_link) != -1) { zend_list_delete(PGG(default_link)); } PGG(default_link) = id;}/* }}} *//* {{{ _close_pgsql_link */static void _close_pgsql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC){ PGconn *link = (PGconn *)rsrc->ptr; PGresult *res; while ((res = PQgetResult(link))) { PQclear(res); } PQfinish(link); PGG(num_links)--;}/* }}} *//* {{{ _close_pgsql_plink */static void _close_pgsql_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC){ PGconn *link = (PGconn *)rsrc->ptr; PGresult *res; while ((res = PQgetResult(link))) { PQclear(res); } PQfinish(link); PGG(num_persistent)--; PGG(num_links)--;}/* }}} *//* {{{ _php_pgsql_notice_handler */static void _php_pgsql_notice_handler(void *resource_id, const char *message){ php_pgsql_notice *notice; TSRMLS_FETCH(); if (! PGG(ignore_notices)) { notice = (php_pgsql_notice *)emalloc(sizeof(php_pgsql_notice)); notice->message = _php_pgsql_trim_message(message, ¬ice->len); if (PGG(log_notices)) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s", notice->message); } zend_hash_index_update(&PGG(notices), (int)resource_id, (void **)¬ice, sizeof(php_pgsql_notice *), NULL); }}/* }}} */#define PHP_PGSQL_NOTICE_PTR_DTOR (void (*)(void *))_php_pgsql_notice_ptr_dtor/* {{{ _php_pgsql_notice_dtor */static void _php_pgsql_notice_ptr_dtor(void **ptr) { php_pgsql_notice *notice = (php_pgsql_notice *)*ptr; efree(notice->message); efree(notice);}/* }}} *//* {{{ _rollback_transactions */static int _rollback_transactions(zend_rsrc_list_entry *rsrc TSRMLS_DC){ PGconn *link; PGresult *res; int orig; if (Z_TYPE_P(rsrc) != le_plink) return 0; link = (PGconn *) rsrc->ptr; if (PQ_SETNONBLOCKING(link, 0)) { php_error_docref("ref.pgsql" TSRMLS_CC, E_NOTICE, "Cannot set connection to blocking mode"); return -1; } while ((res = PQgetResult(link))) { PQclear(res); } orig = PGG(ignore_notices); PGG(ignore_notices) = 1; res = PQexec(link,"BEGIN;"); PQclear(res); res = PQexec(link,"ROLLBACK;"); PQclear(res); PGG(ignore_notices) = orig; return 0;}/* }}} *//* {{{ _free_ptr */static void _free_ptr(zend_rsrc_list_entry *rsrc TSRMLS_DC){ pgLofp *lofp = (pgLofp *)rsrc->ptr; efree(lofp);}/* }}} *//* {{{ _free_result */static void _free_result(zend_rsrc_list_entry *rsrc TSRMLS_DC){ pgsql_result_handle *pg_result = (pgsql_result_handle *)rsrc->ptr; PQclear(pg_result->result); efree(pg_result);}/* }}} *//* {{{ PHP_INI */PHP_INI_BEGIN()STD_PHP_INI_BOOLEAN( "pgsql.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_persistent, zend_pgsql_globals, pgsql_globals)STD_PHP_INI_ENTRY_EX("pgsql.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_persistent, zend_pgsql_globals, pgsql_globals, display_link_numbers)STD_PHP_INI_ENTRY_EX("pgsql.max_links", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_links, zend_pgsql_globals, pgsql_globals, display_link_numbers)STD_PHP_INI_BOOLEAN( "pgsql.auto_reset_persistent", "0", PHP_INI_SYSTEM, OnUpdateBool, auto_reset_persistent, zend_pgsql_globals, pgsql_globals)STD_PHP_INI_BOOLEAN( "pgsql.ignore_notice", "0", PHP_INI_ALL, OnUpdateBool, ignore_notices, zend_pgsql_globals, pgsql_globals)STD_PHP_INI_BOOLEAN( "pgsql.log_notice", "0", PHP_INI_ALL, OnUpdateBool, log_notices, zend_pgsql_globals, pgsql_globals)PHP_INI_END()/* }}} *//* {{{ php_pgsql_init_globals */static void php_pgsql_init_globals(zend_pgsql_globals *pgsql_globals){ memset(pgsql_globals, 0, sizeof(zend_pgsql_globals)); /* Initilize notice message hash at MINIT only */ zend_hash_init_ex(&pgsql_globals->notices, 0, NULL, PHP_PGSQL_NOTICE_PTR_DTOR, 1, 0); }/* }}} *//* {{{ PHP_MINIT_FUNCTION */PHP_MINIT_FUNCTION(pgsql){ ZEND_INIT_MODULE_GLOBALS(pgsql, php_pgsql_init_globals, NULL); REGISTER_INI_ENTRIES(); le_link = zend_register_list_destructors_ex(_close_pgsql_link, NULL, "pgsql link", module_number); le_plink = zend_register_list_destructors_ex(NULL, _close_pgsql_plink, "pgsql link persistent", module_number); le_result = zend_register_list_destructors_ex(_free_result, NULL, "pgsql result", module_number); le_lofp = zend_register_list_destructors_ex(_free_ptr, NULL, "pgsql large object", module_number); le_string = zend_register_list_destructors_ex(_free_ptr, NULL, "pgsql string", module_number); /* For connection option */ REGISTER_LONG_CONSTANT("PGSQL_CONNECT_FORCE_NEW", PGSQL_CONNECT_FORCE_NEW, CONST_CS | CONST_PERSISTENT); /* For pg_fetch_array() */ REGISTER_LONG_CONSTANT("PGSQL_ASSOC", PGSQL_ASSOC, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_NUM", PGSQL_NUM, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_BOTH", PGSQL_BOTH, CONST_CS | CONST_PERSISTENT); /* For pg_connection_status() */ REGISTER_LONG_CONSTANT("PGSQL_CONNECTION_BAD", CONNECTION_BAD, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_CONNECTION_OK", CONNECTION_OK, CONST_CS | CONST_PERSISTENT); /* For lo_seek() */ REGISTER_LONG_CONSTANT("PGSQL_SEEK_SET", SEEK_SET, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_SEEK_CUR", SEEK_CUR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_SEEK_END", SEEK_END, CONST_CS | CONST_PERSISTENT); /* For pg_result_status() return value type */ REGISTER_LONG_CONSTANT("PGSQL_STATUS_LONG", PGSQL_STATUS_LONG, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_STATUS_STRING", PGSQL_STATUS_STRING, CONST_CS | CONST_PERSISTENT); /* For pg_result_status() return value */ REGISTER_LONG_CONSTANT("PGSQL_EMPTY_QUERY", PGRES_EMPTY_QUERY, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_COMMAND_OK", PGRES_COMMAND_OK, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_TUPLES_OK", PGRES_TUPLES_OK, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_COPY_OUT", PGRES_COPY_OUT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_COPY_IN", PGRES_COPY_IN, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_BAD_RESPONSE", PGRES_BAD_RESPONSE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_NONFATAL_ERROR", PGRES_NONFATAL_ERROR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_FATAL_ERROR", PGRES_FATAL_ERROR, CONST_CS | CONST_PERSISTENT); /* pg_convert options */ REGISTER_LONG_CONSTANT("PGSQL_CONV_IGNORE_DEFAULT", PGSQL_CONV_IGNORE_DEFAULT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_CONV_FORCE_NULL", PGSQL_CONV_FORCE_NULL, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_CONV_IGNORE_NOT_NULL", PGSQL_CONV_IGNORE_NOT_NULL, CONST_CS | CONST_PERSISTENT); /* pg_insert/update/delete/select options */ REGISTER_LONG_CONSTANT("PGSQL_DML_NO_CONV", PGSQL_DML_NO_CONV, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_DML_EXEC", PGSQL_DML_EXEC, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_DML_ASYNC", PGSQL_DML_ASYNC, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_DML_STRING", PGSQL_DML_STRING, CONST_CS | CONST_PERSISTENT); return SUCCESS;}/* }}} *//* {{{ PHP_MSHUTDOWN_FUNCTION */PHP_MSHUTDOWN_FUNCTION(pgsql){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -