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

📄 php_mysql.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>                                |   |          Zak Greant <zak@mysql.com>                                  |   |          Georg Richter <georg@php.net>                               |   +----------------------------------------------------------------------+*/ /* $Id: php_mysql.c,v 1.174.2.29.2.3 2007/01/01 09:46:45 sebastian Exp $ *//* TODO: * * ? Safe mode implementation */#ifdef HAVE_CONFIG_H# include "config.h"#endif#include "php.h"#include "php_globals.h"#include "ext/standard/info.h"#include "ext/standard/php_string.h"#if HAVE_MYSQL#ifdef PHP_WIN32# include <winsock.h># define signal(a, b) NULL#elif defined(NETWARE)# include <sys/socket.h># define signal(a, b) NULL#else# if HAVE_SIGNAL_H#  include <signal.h># endif# if HAVE_SYS_TYPES_H#  include <sys/types.h># endif# include <netdb.h># include <netinet/in.h># if HAVE_ARPA_INET_H#  include <arpa/inet.h># endif#endif#include <mysql.h>#include "php_ini.h"#include "php_mysql.h"/* True globals, no need for thread safety */static int le_result, le_link, le_plink;#ifdef HAVE_MYSQL_REAL_CONNECT# ifdef HAVE_ERRMSG_H#  include <errmsg.h># endif#endif#define SAFE_STRING(s) ((s)?(s):"")#if MYSQL_VERSION_ID > 32199# define mysql_row_length_type unsigned long# define HAVE_MYSQL_ERRNO#else# define mysql_row_length_type unsigned int# ifdef mysql_errno#  define HAVE_MYSQL_ERRNO# endif#endif#if MYSQL_VERSION_ID >= 32032#define HAVE_GETINFO_FUNCS#endif#if MYSQL_VERSION_ID > 32133 || defined(FIELD_TYPE_TINY)#define MYSQL_HAS_TINY#endif#if MYSQL_VERSION_ID >= 32200#define MYSQL_HAS_YEAR#endif#define MYSQL_ASSOC		1<<0#define MYSQL_NUM		1<<1#define MYSQL_BOTH		(MYSQL_ASSOC|MYSQL_NUM)#define MYSQL_USE_RESULT	0#define MYSQL_STORE_RESULT	1#if MYSQL_VERSION_ID < 32224#define PHP_MYSQL_VALID_RESULT(mysql)		\	(mysql_num_fields(mysql)>0)#else#define PHP_MYSQL_VALID_RESULT(mysql)		\	(mysql_field_count(mysql)>0)#endiftypedef struct _php_mysql_conn {	MYSQL conn;	int active_result_id;} php_mysql_conn;/* {{{ mysql_functions[] */function_entry mysql_functions[] = {	PHP_FE(mysql_connect,								NULL)	PHP_FE(mysql_pconnect,								NULL)	PHP_FE(mysql_close,									NULL)	PHP_FE(mysql_select_db,								NULL)#ifndef NETWARE		/* The below two functions not supported on NetWare */#if MYSQL_VERSION_ID < 40000	PHP_FE(mysql_create_db,								NULL)	PHP_FE(mysql_drop_db,								NULL)#endif#endif	/* NETWARE */	PHP_FE(mysql_query,									NULL)	PHP_FE(mysql_unbuffered_query,						NULL)	PHP_FE(mysql_db_query,								NULL)	PHP_FE(mysql_list_dbs,								NULL)	PHP_FE(mysql_list_tables,							NULL)	PHP_FE(mysql_list_fields,							NULL)	PHP_FE(mysql_list_processes,						NULL)	PHP_FE(mysql_error,									NULL)#ifdef HAVE_MYSQL_ERRNO	PHP_FE(mysql_errno,									NULL)#endif	PHP_FE(mysql_affected_rows,							NULL)	PHP_FE(mysql_insert_id,								NULL)	PHP_FE(mysql_result,								NULL)	PHP_FE(mysql_num_rows,								NULL)	PHP_FE(mysql_num_fields,							NULL)	PHP_FE(mysql_fetch_row,								NULL)	PHP_FE(mysql_fetch_array,							NULL)	PHP_FE(mysql_fetch_assoc,							NULL)	PHP_FE(mysql_fetch_object,							NULL)	PHP_FE(mysql_data_seek,								NULL)	PHP_FE(mysql_fetch_lengths,							NULL)	PHP_FE(mysql_fetch_field,							NULL)	PHP_FE(mysql_field_seek,							NULL)	PHP_FE(mysql_free_result,							NULL)	PHP_FE(mysql_field_name,							NULL)	PHP_FE(mysql_field_table,							NULL)	PHP_FE(mysql_field_len,								NULL)	PHP_FE(mysql_field_type,							NULL)	PHP_FE(mysql_field_flags,							NULL)	PHP_FE(mysql_escape_string,							NULL)	PHP_FE(mysql_real_escape_string,					NULL)	PHP_FE(mysql_stat,									NULL)	PHP_FE(mysql_thread_id,								NULL)	PHP_FE(mysql_client_encoding,					NULL)	PHP_FE(mysql_ping,									NULL)#ifdef HAVE_GETINFO_FUNCS	PHP_FE(mysql_get_client_info,						NULL)	PHP_FE(mysql_get_host_info,							NULL)	PHP_FE(mysql_get_proto_info,						NULL)	PHP_FE(mysql_get_server_info,						NULL)#endif	PHP_FE(mysql_info,		            				NULL)	 	/* for downwards compatability */	PHP_FALIAS(mysql,				mysql_db_query,		NULL)	PHP_FALIAS(mysql_fieldname,		mysql_field_name,	NULL)	PHP_FALIAS(mysql_fieldtable,	mysql_field_table,	NULL)	PHP_FALIAS(mysql_fieldlen,		mysql_field_len,	NULL)	PHP_FALIAS(mysql_fieldtype,		mysql_field_type,	NULL)	PHP_FALIAS(mysql_fieldflags,	mysql_field_flags,	NULL)	PHP_FALIAS(mysql_selectdb,		mysql_select_db,	NULL)#ifndef NETWARE		/* The below two functions not supported on NetWare */#if MYSQL_VERSION_ID < 40000	PHP_FALIAS(mysql_createdb,		mysql_create_db,	NULL)	PHP_FALIAS(mysql_dropdb,		mysql_drop_db,		NULL)#endif#endif	/* NETWARE */	PHP_FALIAS(mysql_freeresult,	mysql_free_result,	NULL)	PHP_FALIAS(mysql_numfields,		mysql_num_fields,	NULL)	PHP_FALIAS(mysql_numrows,		mysql_num_rows,		NULL)	PHP_FALIAS(mysql_listdbs,		mysql_list_dbs,		NULL)	PHP_FALIAS(mysql_listtables,	mysql_list_tables,	NULL)	PHP_FALIAS(mysql_listfields,	mysql_list_fields,	NULL)	PHP_FALIAS(mysql_db_name,		mysql_result,		NULL)	PHP_FALIAS(mysql_dbname,		mysql_result,		NULL)	PHP_FALIAS(mysql_tablename,		mysql_result,		NULL)	PHP_FALIAS(mysql_table_name,	mysql_result,		NULL)	{NULL, NULL, NULL}};/* }}} *//* {{{ mysql_module_entry */zend_module_entry mysql_module_entry = {	STANDARD_MODULE_HEADER,	"mysql",	mysql_functions,	ZEND_MODULE_STARTUP_N(mysql),	PHP_MSHUTDOWN(mysql),	PHP_RINIT(mysql),	PHP_RSHUTDOWN(mysql),	PHP_MINFO(mysql),	NO_VERSION_YET,	STANDARD_MODULE_PROPERTIES};/* }}} */ZEND_DECLARE_MODULE_GLOBALS(mysql)#ifdef COMPILE_DL_MYSQLZEND_GET_MODULE(mysql)#endifvoid timeout(int sig);#define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } }#define PHPMY_UNBUFFERED_QUERY_CHECK()			\{							\	if (mysql->active_result_id) {			\		do {					\			int type;			\			MYSQL_RES *mysql_result;	\							\			mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type);	\			if (mysql_result && type==le_result) {						\				if (!mysql_eof(mysql_result)) {						\					php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Function called without first fetching all rows from a previous unbuffered query");	\					while (mysql_fetch_row(mysql_result));	\				}						\				zend_list_delete(mysql->active_result_id);	\				mysql->active_result_id = 0;			\			}							\		} while(0);							\	}									\}										\/* {{{ _free_mysql_result * This wrapper is required since mysql_free_result() returns an integer, and * thus, cannot be used directly */static void _free_mysql_result(zend_rsrc_list_entry *rsrc TSRMLS_DC){	MYSQL_RES *mysql_result = (MYSQL_RES *)rsrc->ptr;	mysql_free_result(mysql_result);	MySG(result_allocated)--;}/* }}} *//* {{{ php_mysql_set_default_link */static void php_mysql_set_default_link(int id TSRMLS_DC){	if (MySG(default_link) != -1) {		zend_list_delete(MySG(default_link));	}	MySG(default_link) = id;	zend_list_addref(id);}/* }}} *//* {{{ php_mysql_select_db*/static int php_mysql_select_db(php_mysql_conn *mysql, char *db TSRMLS_DC){	PHPMY_UNBUFFERED_QUERY_CHECK();	if (mysql_select_db(&mysql->conn, db) != 0) {		return 0;	} else {		return 1;	}}/* }}} *//* {{{ _close_mysql_link */static void _close_mysql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC){	php_mysql_conn *link = (php_mysql_conn *)rsrc->ptr;	void (*handler) (int); 	handler = signal(SIGPIPE, SIG_IGN);	mysql_close(&link->conn);	signal(SIGPIPE, handler);	efree(link);	MySG(num_links)--;}/* }}} *//* {{{ _close_mysql_plink */static void _close_mysql_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC){	php_mysql_conn *link = (php_mysql_conn *)rsrc->ptr;	void (*handler) (int);	handler = signal(SIGPIPE, SIG_IGN);	mysql_close(&link->conn);	signal(SIGPIPE, handler);	free(link);	MySG(num_persistent)--;	MySG(num_links)--;}/* }}} *//* {{{ PHP_INI_MH */static PHP_INI_MH(OnMySQLPort){	if (new_value==NULL) { /* default port */#if !defined(PHP_WIN32) && !defined(NETWARE)		struct servent *serv_ptr;		char *env;				MySG(default_port) = MYSQL_PORT;		if ((serv_ptr = getservbyname("mysql", "tcp"))) {			MySG(default_port) = (uint) ntohs((ushort) serv_ptr->s_port);		}		if ((env = getenv("MYSQL_TCP_PORT"))) {			MySG(default_port) = (uint) atoi(env);		}#else		MySG(default_port) = MYSQL_PORT;#endif	} else {		MySG(default_port) = atoi(new_value);	}	return SUCCESS;}/* }}} *//* {{{ PHP_INI */PHP_INI_BEGIN()	STD_PHP_INI_BOOLEAN("mysql.allow_persistent",	"1",	PHP_INI_SYSTEM,		OnUpdateInt,		allow_persistent,	zend_mysql_globals,		mysql_globals)	STD_PHP_INI_ENTRY_EX("mysql.max_persistent",	"-1",	PHP_INI_SYSTEM,		OnUpdateInt,		max_persistent,		zend_mysql_globals,		mysql_globals,	display_link_numbers)	STD_PHP_INI_ENTRY_EX("mysql.max_links",			"-1",	PHP_INI_SYSTEM,		OnUpdateInt,		max_links,			zend_mysql_globals,		mysql_globals,	display_link_numbers)	STD_PHP_INI_ENTRY("mysql.default_host",			NULL,	PHP_INI_ALL,		OnUpdateString,		default_host,		zend_mysql_globals,		mysql_globals)	STD_PHP_INI_ENTRY("mysql.default_user",			NULL,	PHP_INI_ALL,		OnUpdateString,		default_user,		zend_mysql_globals,		mysql_globals)	STD_PHP_INI_ENTRY("mysql.default_password",		NULL,	PHP_INI_ALL,		OnUpdateString,		default_password,	zend_mysql_globals,		mysql_globals)	PHP_INI_ENTRY("mysql.default_port",				NULL,	PHP_INI_ALL,		OnMySQLPort)	STD_PHP_INI_ENTRY("mysql.default_socket",		NULL,	PHP_INI_ALL,		OnUpdateStringUnempty,	default_socket,	zend_mysql_globals,		mysql_globals)	STD_PHP_INI_ENTRY("mysql.connect_timeout",		"60",	PHP_INI_ALL,		OnUpdateInt,		connect_timeout, 	zend_mysql_globals,		mysql_globals)	STD_PHP_INI_BOOLEAN("mysql.trace_mode",			"0",	PHP_INI_ALL,		OnUpdateInt,		trace_mode, 		zend_mysql_globals,		mysql_globals)PHP_INI_END()/* }}} *//* {{{ php_mysql_init_globals */static void php_mysql_init_globals(zend_mysql_globals *mysql_globals){	mysql_globals->num_persistent = 0;	mysql_globals->default_socket = NULL;	mysql_globals->default_host = NULL;	mysql_globals->default_user = NULL;	mysql_globals->default_password = NULL;	mysql_globals->connect_errno = 0;	mysql_globals->connect_error = NULL;	mysql_globals->connect_timeout = 0;	mysql_globals->trace_mode = 0;	mysql_globals->result_allocated = 0;}/* }}} *//* {{{ PHP_MINIT_FUNCTION */ZEND_MODULE_STARTUP_D(mysql){	ZEND_INIT_MODULE_GLOBALS(mysql, php_mysql_init_globals, NULL);	REGISTER_INI_ENTRIES();	le_result = zend_register_list_destructors_ex(_free_mysql_result, NULL, "mysql result", module_number);	le_link = zend_register_list_destructors_ex(_close_mysql_link, NULL, "mysql link", module_number);	le_plink = zend_register_list_destructors_ex(NULL, _close_mysql_plink, "mysql link persistent", module_number);	Z_TYPE(mysql_module_entry) = type;		REGISTER_LONG_CONSTANT("MYSQL_ASSOC", MYSQL_ASSOC, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MYSQL_NUM", MYSQL_NUM, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MYSQL_BOTH", MYSQL_BOTH, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MYSQL_CLIENT_COMPRESS", CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT);#if MYSQL_VERSION_ID >= 40000		REGISTER_LONG_CONSTANT("MYSQL_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT);#endif	REGISTER_LONG_CONSTANT("MYSQL_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MYSQL_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT); #ifdef ZTS# if MYSQL_VERSION_ID >= 40000	mysql_thread_init();# endif#endif	return SUCCESS;}/* }}} *//* {{{ PHP_MSHUTDOWN_FUNCTION */PHP_MSHUTDOWN_FUNCTION(mysql){#ifdef ZTS# if MYSQL_VERSION_ID >= 40000	mysql_thread_end();# endif#endif	UNREGISTER_INI_ENTRIES();	return SUCCESS;}/* }}} *//* {{{ PHP_RINIT_FUNCTION */PHP_RINIT_FUNCTION(mysql){	MySG(default_link)=-1;	MySG(num_links) = MySG(num_persistent);	/* Reset connect error/errno on every request */	MySG(connect_error) = NULL;	MySG(connect_errno) =0;	MySG(result_allocated) = 0;	return SUCCESS;}/* }}} *//* {{{ PHP_RSHUTDOWN_FUNCTION */PHP_RSHUTDOWN_FUNCTION(mysql){	if (MySG(trace_mode)) {		if (MySG(result_allocated)){			php_error_docref("function.mysql-free-result" TSRMLS_CC, E_WARNING, "%lu result set(s) not freed. Use mysql_free_result to free result sets which were requested using mysql_query()", MySG(result_allocated));		}	}	if (MySG(connect_error)!=NULL) {		efree(MySG(connect_error));	}	return SUCCESS;}/* }}} *//* {{{ PHP_MINFO_FUNCTION */PHP_MINFO_FUNCTION(mysql){	char buf[32];	php_info_print_table_start();	php_info_print_table_header(2, "MySQL Support", "enabled");	sprintf(buf, "%ld", MySG(num_persistent));	php_info_print_table_row(2, "Active Persistent Links", buf);	sprintf(buf, "%ld", MySG(num_links));	php_info_print_table_row(2, "Active Links", buf);	php_info_print_table_row(2, "Client API version", mysql_get_client_info());#if !defined (PHP_WIN32) && !defined (NETWARE)	php_info_print_table_row(2, "MYSQL_MODULE_TYPE", PHP_MYSQL_TYPE);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -