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

📄 php_msql.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*   +----------------------------------------------------------------------+   | 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.               |   +----------------------------------------------------------------------+   | Author: Zeev Suraski <zeev@zend.com>                                 |   +----------------------------------------------------------------------+ */ /* $Id: php_msql.c,v 1.49.4.2.2.2 2007/01/01 09:46:44 sebastian Exp $ */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php.h"#include "php_msql.h"#include "ext/standard/php_standard.h"#include "ext/standard/info.h"#include "php_globals.h"#if HAVE_MSQL#define OS_UNIX 1#if defined(WIN32) && defined(MSQL1)#include <msql1.h>#else#include <msql.h>#endifstatic php_msql_globals msql_globals;#define MSQL_ASSOC		1<<0#define MSQL_NUM		1<<1#define MSQL_BOTH		(MSQL_ASSOC|MSQL_NUM)/* {{{ msql_functions[] */function_entry msql_functions[] = {	PHP_FE(msql_connect,							NULL)	PHP_FE(msql_pconnect,							NULL)	PHP_FE(msql_close,								NULL)	PHP_FE(msql_select_db,							NULL)	PHP_FE(msql_create_db,							NULL)	PHP_FE(msql_drop_db,							NULL)	PHP_FE(msql_query,								NULL)	PHP_FE(msql_db_query,							NULL)	PHP_FE(msql_list_dbs,							NULL)	PHP_FE(msql_list_tables,						NULL)	PHP_FE(msql_list_fields,						NULL)	PHP_FE(msql_error,								NULL)	PHP_FE(msql_result,								NULL)	PHP_FE(msql_num_rows,							NULL)	PHP_FE(msql_num_fields,							NULL)	PHP_FE(msql_fetch_row,							NULL)	PHP_FE(msql_fetch_array,						NULL)	PHP_FE(msql_fetch_object,						NULL)	PHP_FE(msql_data_seek,							NULL)	PHP_FE(msql_fetch_field,						NULL)	PHP_FE(msql_field_seek,							NULL)	PHP_FE(msql_free_result,						NULL)	PHP_FE(msql_field_name,							NULL)	PHP_FE(msql_field_table,						NULL)	PHP_FE(msql_field_len,							NULL)	PHP_FE(msql_field_type,							NULL)	PHP_FE(msql_field_flags,						NULL)		PHP_FALIAS(msql_fieldname,		msql_field_name,		NULL)	PHP_FALIAS(msql_fieldtable,		msql_field_table,		NULL)	PHP_FALIAS(msql_fieldlen,		msql_field_len,			NULL)	PHP_FALIAS(msql_fieldtype,		msql_field_type,		NULL)	PHP_FALIAS(msql_fieldflags,		msql_field_flags,		NULL)		PHP_FALIAS(msql_regcase,		sql_regcase,			NULL)		PHP_FALIAS(msql_affected_rows,	msql_affected_rows,		NULL)		/* for downwards compatability */	PHP_FALIAS(msql,				msql_db_query,			NULL)	PHP_FALIAS(msql_selectdb,		msql_select_db,			NULL)	PHP_FALIAS(msql_createdb,		msql_create_db,			NULL)	PHP_FALIAS(msql_dropdb,			msql_drop_db,			NULL)	PHP_FALIAS(msql_freeresult,		msql_free_result,		NULL)	PHP_FALIAS(msql_numfields,		msql_num_fields,		NULL)	PHP_FALIAS(msql_numrows,		msql_num_rows,			NULL)	PHP_FALIAS(msql_listdbs,		msql_list_dbs,			NULL)	PHP_FALIAS(msql_listtables,		msql_list_tables,		NULL)	PHP_FALIAS(msql_listfields,		msql_list_fields,		NULL)	PHP_FALIAS(msql_dbname,			msql_result,			NULL)	PHP_FALIAS(msql_tablename,		msql_result,			NULL)	{NULL, NULL, NULL}};/* }}} */zend_module_entry msql_module_entry = {	STANDARD_MODULE_HEADER,	"msql", msql_functions, PHP_MINIT(msql), NULL, PHP_RINIT(msql), NULL,			PHP_MINFO(msql), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};#ifdef COMPILE_DL_MSQLZEND_GET_MODULE(msql)#endiftypedef struct {	m_result *result;	int af_rows;} m_query;#define MSQL_GET_QUERY(res)																			\	ZEND_FETCH_RESOURCE(msql_query, m_query *, &res, -1, "mSQL result", msql_globals.le_query);	\	msql_result = msql_query->resultstatic void _delete_query(zend_rsrc_list_entry *rsrc TSRMLS_DC){	m_query *query = (m_query *)rsrc->ptr;	if(query->result) msqlFreeResult(query->result);	efree(query);}static m_query *php_msql_query_wrapper(m_result *res, int af_rows){	m_query *query = (m_query *) emalloc(sizeof(m_query));		query->result = res;	query->af_rows = af_rows;		return query;}static void _close_msql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC){	int link = (int)rsrc->ptr;	msqlClose(link);	msql_globals.num_links--;}static void _close_msql_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC){	int link = (int)rsrc->ptr;	msqlClose(link);	msql_globals.num_persistent--;	msql_globals.num_links--;}/* {{{ PHP_MINIT_FUNCTION */PHP_MINIT_FUNCTION(msql){	if (cfg_get_long("msql.allow_persistent",&msql_globals.allow_persistent)==FAILURE) {		msql_globals.allow_persistent=1;	}	if (cfg_get_long("msql.max_persistent",&msql_globals.max_persistent)==FAILURE) {		msql_globals.max_persistent=-1;	}	if (cfg_get_long("msql.max_links",&msql_globals.max_links)==FAILURE) {		msql_globals.max_links=-1;	}	msql_globals.num_persistent=0;	msql_globals.le_query = zend_register_list_destructors_ex(_delete_query, NULL, "msql query", module_number);	msql_globals.le_link = zend_register_list_destructors_ex(_close_msql_link, NULL, "msql link", module_number);	msql_globals.le_plink = zend_register_list_destructors_ex(NULL, _close_msql_plink, "msql link persistent", module_number);		Z_TYPE(msql_module_entry) = type;	REGISTER_LONG_CONSTANT("MSQL_ASSOC", MSQL_ASSOC, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MSQL_NUM", MSQL_NUM, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MSQL_BOTH", MSQL_BOTH, CONST_CS | CONST_PERSISTENT);	return SUCCESS;}/* }}} *//* {{{ PHP_RINIT_FUNCTION */PHP_RINIT_FUNCTION(msql){	msql_globals.default_link=-1;	msql_globals.num_links = msql_globals.num_persistent;	msqlErrMsg[0]=0;	return SUCCESS;}/* }}} *//* {{{ PHP_MINFO_FUNCTION */PHP_MINFO_FUNCTION(msql){	char maxp[32],maxl[32];	if (msql_globals.max_persistent==-1) {		snprintf(maxp, 31, "%d/unlimited", msql_globals.num_persistent );	} else {		snprintf(maxp, 31, "%d/%ld", msql_globals.num_persistent, msql_globals.max_persistent);	}	maxp[31]=0;	if (msql_globals.max_links==-1) {		snprintf(maxl, 15, "%d/unlimited", msql_globals.num_links );	} else {		snprintf(maxl, 15, "%d/%ld", msql_globals.num_links, msql_globals.max_links);	}	maxl[31]=0;	php_info_print_table_start();	php_info_print_table_row(2, "MSQL Support", "enabled" );	php_info_print_table_row(2, "Allow Persistent Links", (msql_globals.allow_persistent?"yes":"no") );	php_info_print_table_row(2, "Persistent Links", maxp );	php_info_print_table_row(2, "Total Links", maxl );	php_info_print_table_end();}/* }}} *//* {{{ php_msql_do_connect */static void php_msql_do_connect(INTERNAL_FUNCTION_PARAMETERS,int persistent){	char *host;	char *hashed_details;	int hashed_details_length;	int msql;		switch(ZEND_NUM_ARGS()) {		case 0: /* defaults */			host=NULL;			hashed_details=estrndup("msql_",5);			hashed_details_length=4+1;			break;		case 1: {				pval *yyhost;							if (getParameters(ht, 1, &yyhost) == FAILURE) {					RETURN_FALSE;				}				convert_to_string(yyhost);				host = Z_STRVAL_P(yyhost);				hashed_details_length = Z_STRLEN_P(yyhost)+4+1;				hashed_details = emalloc(hashed_details_length+1);				sprintf(hashed_details,"msql_%s",Z_STRVAL_P(yyhost)); /* SAFE */			}			break;		default:			WRONG_PARAM_COUNT;			break;	}		if (!msql_globals.allow_persistent) {		persistent=0;	}	if (persistent) {		list_entry *le;				if (msql_globals.max_links!=-1 && msql_globals.num_links>=msql_globals.max_links) {			php_error(E_WARNING, "%s(): Too many open links (%d)", get_active_function_name(TSRMLS_C), msql_globals.num_links);			efree(hashed_details);			RETURN_FALSE;		}		if (msql_globals.max_persistent!=-1 && msql_globals.num_persistent>=msql_globals.max_persistent) {			php_error(E_WARNING, "%s(): Too many open persistent links (%d)", get_active_function_name(TSRMLS_C), msql_globals.num_persistent);			efree(hashed_details);			RETURN_FALSE;		}				/* try to find if we already have this link in our persistent list */		if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) {  /* we don't */			list_entry new_le;						/* create the link */			if ((msql=msqlConnect(host))==-1) {				efree(hashed_details);				RETURN_FALSE;			}						/* hash it up */			Z_TYPE(new_le) = msql_globals.le_plink;			new_le.ptr = (void *) msql;			if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(list_entry), NULL)==FAILURE) {				efree(hashed_details);				RETURN_FALSE;			}			msql_globals.num_persistent++;			msql_globals.num_links++;		} else {  /* we do */			if (Z_TYPE_P(le) != msql_globals.le_plink) {				efree(hashed_details);				RETURN_FALSE;			}#if 0			/* ensure that the link did not die */			/* still have to find a way to do this nicely with mSQL */			if (msql_stat(le->ptr)==NULL) { /* the link died */				if (msql_connect(le->ptr,host,user,passwd)==NULL) {					php_error(E_WARNING,"mSQL link lost, unable to reconnect");					zend_hash_del(&EG(persistent_list),hashed_details,hashed_details_length+1);					efree(hashed_details);					RETURN_FALSE;				}			}#endif			msql = (int) le->ptr;		}		ZEND_REGISTER_RESOURCE(return_value, (void *) msql, msql_globals.le_plink);	} else {		list_entry *index_ptr,new_index_ptr;				/* first we check the hash for the hashed_details key.  if it exists,		 * it should point us to the right offset where the actual msql link sits.		 * if it doesn't, open a new msql link, add it to the resource list,		 * and add a pointer to it with hashed_details as the key.		 */		if (zend_hash_find(&EG(regular_list),hashed_details,hashed_details_length+1,(void **) &index_ptr)==SUCCESS) {			int type,link;			void *ptr;			if (Z_TYPE_P(index_ptr) != le_index_ptr) {				RETURN_FALSE;			}			link = (int) index_ptr->ptr;			ptr = zend_list_find(link,&type);   /* check if the link is still there */			if (ptr && (type==msql_globals.le_link || type==msql_globals.le_plink)) {				Z_LVAL_P(return_value) = msql_globals.default_link = link;				Z_TYPE_P(return_value) = IS_RESOURCE;				efree(hashed_details);				return;			} else {				zend_hash_del(&EG(regular_list),hashed_details,hashed_details_length+1);			}		}		if (msql_globals.max_links!=-1 && msql_globals.num_links>=msql_globals.max_links) {			php_error(E_WARNING, "%s(): Too many open links (%d)", get_active_function_name(TSRMLS_C),msql_globals.num_links);			efree(hashed_details);			RETURN_FALSE;		}		if ((msql=msqlConnect(host))==-1) {			efree(hashed_details);			RETURN_FALSE;		}		/* add it to the list */		ZEND_REGISTER_RESOURCE(return_value, (void *) msql, msql_globals.le_link);				/* add it to the hash */		new_index_ptr.ptr = (void *) Z_LVAL_P(return_value);		Z_TYPE(new_index_ptr) = le_index_ptr;		if (zend_hash_update(&EG(regular_list),hashed_details,hashed_details_length+1,(void *) &new_index_ptr, sizeof(list_entry), NULL)==FAILURE) {			efree(hashed_details);			RETURN_FALSE;		}		msql_globals.num_links++;	}	efree(hashed_details);	msql_globals.default_link=Z_LVAL_P(return_value);}/* }}} *//* {{{ php_msql_get_default_link */static int php_msql_get_default_link(INTERNAL_FUNCTION_PARAMETERS){	if (msql_globals.default_link==-1) { /* no link opened yet, implicitly open one */		ht = 0;		php_msql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);	}	return msql_globals.default_link;}/* }}} *//* {{{ proto int msql_connect([string hostname[:port]] [, string username] [, string password])   Open a connection to an mSQL Server */PHP_FUNCTION(msql_connect){	php_msql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,0);}/* }}} *//* {{{ proto int msql_pconnect([string hostname[:port]] [, string username] [, string password])   Open a persistent connection to an mSQL Server */PHP_FUNCTION(msql_pconnect){	php_msql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,1);}/* }}} *//* {{{ proto int msql_close([int link_identifier])   Close an mSQL connection */PHP_FUNCTION(msql_close){	pval *msql_link;	int id;	int msql;		switch (ZEND_NUM_ARGS()) {		case 0:			id = msql_globals.default_link;			break;		case 1:			if (getParameters(ht, 1, &msql_link)==FAILURE) {				RETURN_FALSE;			}			id = -1;			break;		default:			WRONG_PARAM_COUNT;			break;	}		ZEND_FETCH_RESOURCE2(msql, int, &msql_link, id, "mSQL-Link", msql_globals.le_link, msql_globals.le_plink);		if (id==-1) { /* explicit resource number */		zend_list_delete(Z_RESVAL_P(msql_link));	}	if (id!=-1 		|| (msql_link && Z_RESVAL_P(msql_link)==msql_globals.default_link)) {		zend_list_delete(msql_globals.default_link);		msql_globals.default_link = -1;	}	RETURN_TRUE;}/* }}} *//* {{{ proto int msql_select_db(string database_name [, int link_identifier])   Select an mSQL database */PHP_FUNCTION(msql_select_db){	pval *db,*msql_link;

⌨️ 快捷键说明

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