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

📄 php_mssql.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.               |   +----------------------------------------------------------------------+   | Author: Frank M. Kromann <frank@kromann.info>                        |   +----------------------------------------------------------------------+ *//* $Id: php_mssql.c,v 1.86.2.44.2.12 2007/01/01 09:46:44 sebastian Exp $ */#ifdef COMPILE_DL_MSSQL#define HAVE_MSSQL 1#endif#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php.h"#include "php_globals.h"#include "ext/standard/php_standard.h"#include "ext/standard/info.h"#include "php_mssql.h"#include "php_ini.h"#if HAVE_MSSQL#define SAFE_STRING(s) ((s)?(s):"")#define MSSQL_ASSOC		1<<0#define MSSQL_NUM		1<<1#define MSSQL_BOTH		(MSSQL_ASSOC|MSSQL_NUM)static int le_result, le_link, le_plink, le_statement;static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type TSRMLS_DC);static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type TSRMLS_DC);static void _mssql_bind_hash_dtor(void *data);static unsigned char a3_arg_force_ref[] = { 3, BYREF_NONE, BYREF_NONE, BYREF_FORCE };function_entry mssql_functions[] = {	PHP_FE(mssql_connect,				NULL)	PHP_FE(mssql_pconnect,				NULL)	PHP_FE(mssql_close,					NULL)	PHP_FE(mssql_select_db,				NULL)	PHP_FE(mssql_query,					NULL)	PHP_FE(mssql_fetch_batch,			NULL)	PHP_FE(mssql_rows_affected,			NULL)	PHP_FE(mssql_free_result,			NULL)	PHP_FE(mssql_get_last_message,		NULL)	PHP_FE(mssql_num_rows,				NULL)	PHP_FE(mssql_num_fields,			NULL)	PHP_FE(mssql_fetch_field,			NULL)	PHP_FE(mssql_fetch_row,				NULL)	PHP_FE(mssql_fetch_array,			NULL)	PHP_FE(mssql_fetch_assoc,			NULL)	PHP_FE(mssql_fetch_object,			NULL)	PHP_FE(mssql_field_length,			NULL)	PHP_FE(mssql_field_name,			NULL)	PHP_FE(mssql_field_type,			NULL)	PHP_FE(mssql_data_seek,				NULL)	PHP_FE(mssql_field_seek,			NULL)	PHP_FE(mssql_result,				NULL)	PHP_FE(mssql_next_result,			NULL)	PHP_FE(mssql_min_error_severity,	NULL)	PHP_FE(mssql_min_message_severity,	NULL) 	PHP_FE(mssql_init,					NULL) 	PHP_FE(mssql_bind,					a3_arg_force_ref) 	PHP_FE(mssql_execute,				NULL)	PHP_FE(mssql_free_statement,		NULL) 	PHP_FE(mssql_guid_string,			NULL)	{NULL, NULL, NULL}};zend_module_entry mssql_module_entry = {	STANDARD_MODULE_HEADER,	"mssql", 	mssql_functions, 	PHP_MINIT(mssql), 	PHP_MSHUTDOWN(mssql), 	PHP_RINIT(mssql), 	PHP_RSHUTDOWN(mssql), 	PHP_MINFO(mssql),         NO_VERSION_YET,	STANDARD_MODULE_PROPERTIES};ZEND_DECLARE_MODULE_GLOBALS(mssql)#ifdef COMPILE_DL_MSSQLZEND_GET_MODULE(mssql)#endif#define CHECK_LINK(link) { if (link==-1) { php_error(E_WARNING, "%s(): A link to the server could not be established", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } }static PHP_INI_DISP(display_text_size){	char *value;	TSRMLS_FETCH();	    if (type == PHP_INI_DISPLAY_ORIG && ini_entry->modified) {		value = ini_entry->orig_value;	} else if (ini_entry->value) {		value = ini_entry->value;	} else {		value = NULL;	}	if (atoi(value) == -1) {		PUTS("Server default");	} else {		php_printf("%s", value);	}}PHP_INI_BEGIN()	STD_PHP_INI_BOOLEAN("mssql.allow_persistent",		"1",	PHP_INI_SYSTEM,	OnUpdateBool,	allow_persistent,			zend_mssql_globals,		mssql_globals)	STD_PHP_INI_ENTRY_EX("mssql.max_persistent",		"-1",	PHP_INI_SYSTEM,	OnUpdateInt,	max_persistent,				zend_mssql_globals,		mssql_globals,	display_link_numbers)	STD_PHP_INI_ENTRY_EX("mssql.max_links",				"-1",	PHP_INI_SYSTEM,	OnUpdateInt,	max_links,					zend_mssql_globals,		mssql_globals,	display_link_numbers)	STD_PHP_INI_ENTRY_EX("mssql.min_error_severity",	"10",	PHP_INI_ALL,	OnUpdateInt,	cfg_min_error_severity,		zend_mssql_globals,		mssql_globals,	display_link_numbers)	STD_PHP_INI_ENTRY_EX("mssql.min_message_severity",	"10",	PHP_INI_ALL,	OnUpdateInt,	cfg_min_message_severity,	zend_mssql_globals,		mssql_globals,	display_link_numbers)	STD_PHP_INI_BOOLEAN("mssql.compatability_mode",		"0",	PHP_INI_ALL,	OnUpdateBool,	compatability_mode,			zend_mssql_globals,		mssql_globals)	STD_PHP_INI_ENTRY_EX("mssql.connect_timeout",    	"5",	PHP_INI_ALL,	OnUpdateInt,	connect_timeout,			zend_mssql_globals,		mssql_globals,	display_link_numbers)	STD_PHP_INI_ENTRY_EX("mssql.timeout",      			"60",	PHP_INI_ALL,	OnUpdateInt,	timeout,					zend_mssql_globals,		mssql_globals,	display_link_numbers)	STD_PHP_INI_ENTRY_EX("mssql.textsize",   			"-1",	PHP_INI_ALL,	OnUpdateInt,	textsize,					zend_mssql_globals,		mssql_globals,	display_text_size)	STD_PHP_INI_ENTRY_EX("mssql.textlimit",   			"-1",	PHP_INI_ALL,	OnUpdateInt,	textlimit,					zend_mssql_globals,		mssql_globals,	display_text_size)	STD_PHP_INI_ENTRY_EX("mssql.batchsize",   			"0",	PHP_INI_ALL,	OnUpdateInt,	batchsize,					zend_mssql_globals,		mssql_globals,	display_link_numbers)	STD_PHP_INI_BOOLEAN("mssql.datetimeconvert",  		"1",	PHP_INI_ALL,	OnUpdateBool,	datetimeconvert,			zend_mssql_globals,		mssql_globals)	STD_PHP_INI_BOOLEAN("mssql.secure_connection",		"0",	PHP_INI_SYSTEM, OnUpdateBool,	secure_connection,			zend_mssql_globals,		mssql_globals)	STD_PHP_INI_ENTRY_EX("mssql.max_procs",				"-1",	PHP_INI_ALL,	OnUpdateInt,	max_procs,					zend_mssql_globals,		mssql_globals,	display_link_numbers)PHP_INI_END()/* error handler */static int php_mssql_error_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, char *dberrstr, char *oserrstr){	TSRMLS_FETCH();	if (severity >= MS_SQL_G(min_error_severity)) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s (severity %d)", dberrstr, severity);	}	return INT_CANCEL;  }/* message handler */static int php_mssql_message_handler(DBPROCESS *dbproc, DBINT msgno,int msgstate, int severity,char *msgtext,char *srvname, char *procname,DBUSMALLINT line){	TSRMLS_FETCH();	if (severity >= MS_SQL_G(min_message_severity)) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "message: %s (severity %d)", msgtext, severity);	}	if (MS_SQL_G(server_message)) {		STR_FREE(MS_SQL_G(server_message));		MS_SQL_G(server_message) = NULL;	}	MS_SQL_G(server_message) = estrdup(msgtext);	return 0;}static int _clean_invalid_results(list_entry *le TSRMLS_DC){	if (Z_TYPE_P(le) == le_result) {		mssql_link *mssql_ptr = ((mssql_result *) le->ptr)->mssql_ptr;				if (!mssql_ptr->valid) {			return 1;		}	}	return 0;}static void _free_result(mssql_result *result, int free_fields) {	int i,j;	if (result->data) {		for (i=0; i<result->num_rows; i++) {			if (result->data[i]) {				for (j=0; j<result->num_fields; j++) {					zval_dtor(&result->data[i][j]);				}				efree(result->data[i]);			}		}		efree(result->data);		result->data = NULL;		result->blocks_initialized = 0;	}		if (free_fields && result->fields) {		for (i=0; i<result->num_fields; i++) {			STR_FREE(result->fields[i].name);			STR_FREE(result->fields[i].column_source);		}		efree(result->fields);	}}static void _free_mssql_statement(mssql_statement *statement){	if (statement->binds) {		zend_hash_destroy(statement->binds);		efree(statement->binds);	}		efree(statement);}static void _free_mssql_result(zend_rsrc_list_entry *rsrc TSRMLS_DC){	mssql_result *result = (mssql_result *)rsrc->ptr;	_free_result(result, 1);	dbcancel(result->mssql_ptr->link);	efree(result);}static void php_mssql_set_default_link(int id TSRMLS_DC){	if (MS_SQL_G(default_link)!=-1) {		zend_list_delete(MS_SQL_G(default_link));	}	MS_SQL_G(default_link) = id;	zend_list_addref(id);}static void _close_mssql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC){	mssql_link *mssql_ptr = (mssql_link *)rsrc->ptr;	mssql_ptr->valid = 0;	zend_hash_apply(&EG(regular_list),(apply_func_t) _clean_invalid_results TSRMLS_CC);	dbclose(mssql_ptr->link);	dbfreelogin(mssql_ptr->login);	efree(mssql_ptr);	MS_SQL_G(num_links)--;}static void _close_mssql_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC){	mssql_link *mssql_ptr = (mssql_link *)rsrc->ptr;	dbclose(mssql_ptr->link);	dbfreelogin(mssql_ptr->login);	free(mssql_ptr);	MS_SQL_G(num_persistent)--;	MS_SQL_G(num_links)--;}static void _mssql_bind_hash_dtor(void *data){	mssql_bind *bind= (mssql_bind *) data;   	zval_ptr_dtor(&(bind->zval));}static void php_mssql_init_globals(zend_mssql_globals *mssql_globals){	long compatability_mode;	mssql_globals->num_persistent = 0;	mssql_globals->get_column_content = php_mssql_get_column_content_with_type;	if (cfg_get_long("mssql.compatability_mode", &compatability_mode) == SUCCESS) {		if (compatability_mode) {			mssql_globals->get_column_content = php_mssql_get_column_content_without_type;			}	}}PHP_MINIT_FUNCTION(mssql){	ZEND_INIT_MODULE_GLOBALS(mssql, php_mssql_init_globals, NULL);	REGISTER_INI_ENTRIES();	le_statement = register_list_destructors(_free_mssql_statement, NULL);	le_result = zend_register_list_destructors_ex(_free_mssql_result, NULL, "mssql result", module_number);	le_link = zend_register_list_destructors_ex(_close_mssql_link, NULL, "mssql link", module_number);	le_plink = zend_register_list_destructors_ex(NULL, _close_mssql_plink, "mssql link persistent", module_number);	Z_TYPE(mssql_module_entry) = type;	if (dbinit()==FAIL) {		return FAILURE;	}	/* BEGIN MSSQL data types for mssql_bind */	REGISTER_LONG_CONSTANT("MSSQL_ASSOC", MSSQL_ASSOC, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MSSQL_NUM", MSSQL_NUM, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MSSQL_BOTH", MSSQL_BOTH, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SQLTEXT",SQLTEXT, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SQLVARCHAR",SQLVARCHAR, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SQLCHAR",SQLCHAR, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SQLINT1",SQLINT1, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SQLINT2",SQLINT2, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SQLINT4",SQLINT4, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SQLBIT",SQLBIT, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SQLFLT4",SQLFLT4, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SQLFLT8",SQLFLT8, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SQLFLTN",SQLFLTN, CONST_CS | CONST_PERSISTENT);	/* END MSSQL data types for mssql_sp_bind */	return SUCCESS;}PHP_MSHUTDOWN_FUNCTION(mssql){	UNREGISTER_INI_ENTRIES();#ifndef HAVE_FREETDS	dbwinexit();#else	dbexit();#endif	return SUCCESS;}PHP_RINIT_FUNCTION(mssql){	MS_SQL_G(default_link) = -1;	MS_SQL_G(num_links) = MS_SQL_G(num_persistent);	MS_SQL_G(appname) = estrndup("PHP 4.0",7);	MS_SQL_G(server_message) = empty_string;	MS_SQL_G(min_error_severity) = MS_SQL_G(cfg_min_error_severity);	MS_SQL_G(min_message_severity) = MS_SQL_G(cfg_min_message_severity);	if (MS_SQL_G(connect_timeout) < 1) MS_SQL_G(connect_timeout) = 1;	dbsetlogintime(MS_SQL_G(connect_timeout));	if (MS_SQL_G(timeout) < 0) MS_SQL_G(timeout) = 60;	dbsettime(MS_SQL_G(timeout));	if (MS_SQL_G(max_procs) != -1) {		dbsetmaxprocs((TDS_SHORT)MS_SQL_G(max_procs));	}	return SUCCESS;}PHP_RSHUTDOWN_FUNCTION(mssql){	STR_FREE(MS_SQL_G(appname));	MS_SQL_G(appname) = NULL;	if (MS_SQL_G(server_message)) {		STR_FREE(MS_SQL_G(server_message));		MS_SQL_G(server_message) = NULL;	}	return SUCCESS;}PHP_MINFO_FUNCTION(mssql){	char buf[32];	php_info_print_table_start();	php_info_print_table_header(2, "MSSQL Support", "enabled");	sprintf(buf, "%ld", MS_SQL_G(num_persistent));	php_info_print_table_row(2, "Active Persistent Links", buf);	sprintf(buf, "%ld", MS_SQL_G(num_links));	php_info_print_table_row(2, "Active Links", buf);	php_info_print_table_row(2, "Library version", MSSQL_VERSION);	php_info_print_table_end();	DISPLAY_INI_ENTRIES();}static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent){	char *user, *passwd, *host;	char *hashed_details;	int hashed_details_length, new_link = 0;	mssql_link mssql, *mssql_ptr;	char buffer[32];	switch(ZEND_NUM_ARGS()) {		case 0: /* defaults */			host=user=passwd=NULL;			hashed_details_length=5+3;			hashed_details = (char *) emalloc(hashed_details_length+1);			strcpy(hashed_details,"mssql___");			break;		case 1: {				zval **yyhost;								if (zend_get_parameters_ex(1, &yyhost)==FAILURE) {					WRONG_PARAM_COUNT;				}				convert_to_string_ex(yyhost);				host = Z_STRVAL_PP(yyhost);				user=passwd=NULL;				hashed_details_length = Z_STRLEN_PP(yyhost)+5+3;				hashed_details = (char *) emalloc(hashed_details_length+1);				sprintf(hashed_details,"mssql_%s__",Z_STRVAL_PP(yyhost));			}			break;		case 2: {				zval **yyhost,**yyuser;								if (zend_get_parameters_ex(2, &yyhost, &yyuser)==FAILURE) {					WRONG_PARAM_COUNT;				}				convert_to_string_ex(yyhost);				convert_to_string_ex(yyuser);				host = Z_STRVAL_PP(yyhost);				user = Z_STRVAL_PP(yyuser);				passwd=NULL;				hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+5+3;				hashed_details = (char *) emalloc(hashed_details_length+1);				sprintf(hashed_details,"mssql_%s_%s_",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser));			}			break;		case 3: {				zval **yyhost,**yyuser,**yypasswd;							if (zend_get_parameters_ex(3, &yyhost, &yyuser, &yypasswd) == FAILURE) {					WRONG_PARAM_COUNT;				}				convert_to_string_ex(yyhost);				convert_to_string_ex(yyuser);				convert_to_string_ex(yypasswd);				host = Z_STRVAL_PP(yyhost);				user = Z_STRVAL_PP(yyuser);				passwd = Z_STRVAL_PP(yypasswd);				hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+Z_STRLEN_PP(yypasswd)+5+3;				hashed_details = (char *) emalloc(hashed_details_length+1);				sprintf(hashed_details,"mssql_%s_%s_%s",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser),Z_STRVAL_PP(yypasswd)); /* SAFE */			}			break;		case 4: {				zval **yyhost,**yyuser,**yypasswd, **yynew_link;							if (zend_get_parameters_ex(4, &yyhost, &yyuser, &yypasswd, &yynew_link) == FAILURE) {					WRONG_PARAM_COUNT;				}				convert_to_string_ex(yyhost);				convert_to_string_ex(yyuser);				convert_to_string_ex(yypasswd);				convert_to_long_ex(yynew_link);				host = Z_STRVAL_PP(yyhost);				user = Z_STRVAL_PP(yyuser);				passwd = Z_STRVAL_PP(yypasswd);				new_link = Z_LVAL_PP(yynew_link);				hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+Z_STRLEN_PP(yypasswd)+5+3;				hashed_details = (char *) emalloc(hashed_details_length+1);				sprintf(hashed_details,"mssql_%s_%s_%s",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser),Z_STRVAL_PP(yypasswd)); /* SAFE */			}

⌨️ 快捷键说明

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