⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pgsql.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*   +----------------------------------------------------------------------+   | 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, &notice->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 **)&notice, 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 + -