📄 php_mssql.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. | +----------------------------------------------------------------------+ | 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 + -