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

📄 php_mssql.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			break;		default:			WRONG_PARAM_COUNT;			break;	}	if (hashed_details == NULL) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Out of memory");		RETURN_FALSE;	}	/* set a DBLOGIN record */		if ((mssql.login = dblogin()) == NULL) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to allocate login record");		RETURN_FALSE;	}		DBERRHANDLE(mssql.login, (EHANDLEFUNC) php_mssql_error_handler);	DBMSGHANDLE(mssql.login, (MHANDLEFUNC) php_mssql_message_handler);#ifndef HAVE_FREETDS	if (MS_SQL_G(secure_connection)){		DBSETLSECURE(mssql.login);	}	else {#endif		if (user) {			DBSETLUSER(mssql.login,user);		}		if (passwd) {			DBSETLPWD(mssql.login,passwd);		}#ifndef HAVE_FREETDS	}#endif	DBSETLAPP(mssql.login,MS_SQL_G(appname));	mssql.valid = 1;#ifndef HAVE_FREETDS	DBSETLVERSION(mssql.login, DBVER60);#endif/*	DBSETLTIME(mssql.login, TIMEOUT_INFINITE); */	if (!MS_SQL_G(allow_persistent)) {		persistent=0;	}	if (persistent) {		list_entry *le;		/* try to find if we already have this link in our persistent list */		if (new_link || zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length + 1, (void **) &le)==FAILURE) {  /* we don't */			list_entry new_le;			if (MS_SQL_G(max_links) != -1 && MS_SQL_G(num_links) >= MS_SQL_G(max_links)) {				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MS_SQL_G(num_links));				efree(hashed_details);				dbfreelogin(mssql.login);				RETURN_FALSE;			}			if (MS_SQL_G(max_persistent) != -1 && MS_SQL_G(num_persistent) >= MS_SQL_G(max_persistent)) {				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%ld)", MS_SQL_G(num_persistent));				efree(hashed_details);				dbfreelogin(mssql.login);				RETURN_FALSE;			}			/* create the link */			if ((mssql.link = dbopen(mssql.login, host)) == FAIL) {				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to connect to server:  %s", host);				efree(hashed_details);				dbfreelogin(mssql.login);				RETURN_FALSE;			}			if (DBSETOPT(mssql.link, DBBUFFER, "2")==FAIL) {				efree(hashed_details);				dbfreelogin(mssql.login);				dbclose(mssql.link);				RETURN_FALSE;			}#ifndef HAVE_FREETDS			if (MS_SQL_G(textlimit) != -1) {				sprintf(buffer, "%li", MS_SQL_G(textlimit));				if (DBSETOPT(mssql.link, DBTEXTLIMIT, buffer)==FAIL) {					efree(hashed_details);					dbfreelogin(mssql.login);					dbclose(mssql.link);					RETURN_FALSE;				}			}#endif			if (MS_SQL_G(textsize) != -1) {				sprintf(buffer, "SET TEXTSIZE %li", MS_SQL_G(textsize));				dbcmd(mssql.link, buffer);				dbsqlexec(mssql.link);				dbresults(mssql.link);			}			/* hash it up */			mssql_ptr = (mssql_link *) malloc(sizeof(mssql_link));			memcpy(mssql_ptr, &mssql, sizeof(mssql_link));			Z_TYPE(new_le) = le_plink;			new_le.ptr = mssql_ptr;			if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length + 1, &new_le, sizeof(list_entry), NULL)==FAILURE) {				free(mssql_ptr);				efree(hashed_details);				dbfreelogin(mssql.login);				dbclose(mssql.link);				RETURN_FALSE;			}			MS_SQL_G(num_persistent)++;			MS_SQL_G(num_links)++;		} else {  /* we do */			if (Z_TYPE_P(le) != le_plink) {#if BROKEN_MSSQL_PCONNECTS				log_error("PHP/MS SQL:  Hashed persistent link is not a MS SQL link!",php_rqst->server);#endif				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hashed persistent link is not a MS SQL link!");				efree(hashed_details);				RETURN_FALSE;			}						mssql_ptr = (mssql_link *) le->ptr;			/* test that the link hasn't died */			if (DBDEAD(mssql_ptr->link) == TRUE) {				dbclose(mssql_ptr->link);#if BROKEN_MSSQL_PCONNECTS				log_error("PHP/MS SQL:  Persistent link died, trying to reconnect...",php_rqst->server);#endif				if ((mssql_ptr->link=dbopen(mssql_ptr->login,host))==NULL) {#if BROKEN_MSSQL_PCONNECTS					log_error("PHP/MS SQL:  Unable to reconnect!",php_rqst->server);#endif					php_error_docref(NULL TSRMLS_CC, E_WARNING, "Link to server lost, unable to reconnect");					zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length+1);					efree(hashed_details);					dbfreelogin(mssql_ptr->login);					RETURN_FALSE;				}#if BROKEN_MSSQL_PCONNECTS				log_error("PHP/MS SQL:  Reconnect successful!",php_rqst->server);#endif				if (DBSETOPT(mssql_ptr->link, DBBUFFER, "2")==FAIL) {#if BROKEN_MSSQL_PCONNECTS					log_error("PHP/MS SQL:  Unable to set required options",php_rqst->server);#endif					zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length + 1);					efree(hashed_details);					dbfreelogin(mssql_ptr->login);					dbclose(mssql_ptr->link);					RETURN_FALSE;				}			}		}		ZEND_REGISTER_RESOURCE(return_value, mssql_ptr, le_plink);	} else { /* non persistent */		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 mssql link sits.		 * if it doesn't, open a new mssql link, add it to the resource list,		 * and add a pointer to it with hashed_details as the key.		 */		if (!new_link && 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) {				efree(hashed_details);				dbfreelogin(mssql.login);				RETURN_FALSE;			}			link = (int) index_ptr->ptr;			ptr = zend_list_find(link,&type);   /* check if the link is still there */			if (ptr && (type==le_link || type==le_plink)) {				zend_list_addref(link);				Z_LVAL_P(return_value) = link;				php_mssql_set_default_link(link TSRMLS_CC);				Z_TYPE_P(return_value) = IS_RESOURCE;				dbfreelogin(mssql.login);				efree(hashed_details);				return;			} else {				zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length + 1);			}		}		if (MS_SQL_G(max_links) != -1 && MS_SQL_G(num_links) >= MS_SQL_G(max_links)) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MS_SQL_G(num_links));			efree(hashed_details);			dbfreelogin(mssql.login);			RETURN_FALSE;		}				if ((mssql.link=dbopen(mssql.login, host))==NULL) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to connect to server:  %s", host);			efree(hashed_details);			dbfreelogin(mssql.login);			RETURN_FALSE;		}		if (DBSETOPT(mssql.link, DBBUFFER,"2")==FAIL) {			efree(hashed_details);			dbfreelogin(mssql.login);			dbclose(mssql.link);			RETURN_FALSE;		}#ifndef HAVE_FREETDS		if (MS_SQL_G(textlimit) != -1) {			sprintf(buffer, "%li", MS_SQL_G(textlimit));			if (DBSETOPT(mssql.link, DBTEXTLIMIT, buffer)==FAIL) {				efree(hashed_details);				dbfreelogin(mssql.login);				dbclose(mssql.link);				RETURN_FALSE;			}		}#endif		if (MS_SQL_G(textsize) != -1) {			sprintf(buffer, "SET TEXTSIZE %li", MS_SQL_G(textsize));			dbcmd(mssql.link, buffer);			dbsqlexec(mssql.link);			dbresults(mssql.link);		}		/* add it to the list */		mssql_ptr = (mssql_link *) emalloc(sizeof(mssql_link));		memcpy(mssql_ptr, &mssql, sizeof(mssql_link));		ZEND_REGISTER_RESOURCE(return_value, mssql_ptr, 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;		}		MS_SQL_G(num_links)++;	}	efree(hashed_details);	php_mssql_set_default_link(Z_LVAL_P(return_value) TSRMLS_CC);}static int php_mssql_get_default_link(INTERNAL_FUNCTION_PARAMETERS){	if (MS_SQL_G(default_link)==-1) { /* no link opened yet, implicitly open one */		ht = 0;		php_mssql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,0);	}	return MS_SQL_G(default_link);}/* {{{ proto int mssql_connect([string servername [, string username [, string password [, bool new_link]]]])   Establishes a connection to a MS-SQL server */PHP_FUNCTION(mssql_connect){	php_mssql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,0);}/* }}} *//* {{{ proto int mssql_pconnect([string servername [, string username [, string password [, bool new_link]]]])   Establishes a persistent connection to a MS-SQL server */PHP_FUNCTION(mssql_pconnect){	php_mssql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,1);}/* }}} *//* {{{ proto bool mssql_close([resource conn_id])   Closes a connection to a MS-SQL server */PHP_FUNCTION(mssql_close){	zval **mssql_link_index=NULL;	int id;	mssql_link *mssql_ptr;		switch (ZEND_NUM_ARGS()) {		case 0:			id = php_mssql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);			CHECK_LINK(id);			break;		case 1:			if (zend_get_parameters_ex(1, &mssql_link_index)==FAILURE) {				RETURN_FALSE;			}			id = -1;			break;		default:			WRONG_PARAM_COUNT;			break;	}	ZEND_FETCH_RESOURCE2(mssql_ptr, mssql_link *, mssql_link_index, id, "MS SQL-Link", le_link, le_plink);	if (mssql_link_index) 		zend_list_delete(Z_RESVAL_PP(mssql_link_index));	else 		zend_list_delete(id);	RETURN_TRUE;}/* }}} *//* {{{ proto bool mssql_select_db(string database_name [, resource conn_id])   Select a MS-SQL database */PHP_FUNCTION(mssql_select_db){	zval **db, **mssql_link_index;	int id;	mssql_link  *mssql_ptr;		switch(ZEND_NUM_ARGS()) {		case 1:			if (zend_get_parameters_ex(1, &db)==FAILURE) {				RETURN_FALSE;			}			id = php_mssql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);			CHECK_LINK(id);			break;		case 2:			if (zend_get_parameters_ex(2, &db, &mssql_link_index)==FAILURE) {				RETURN_FALSE;			}			id = -1;			break;		default:			WRONG_PARAM_COUNT;			break;	}	ZEND_FETCH_RESOURCE2(mssql_ptr, mssql_link *, mssql_link_index, id, "MS SQL-Link", le_link, le_plink);		convert_to_string_ex(db);		if (dbuse(mssql_ptr->link, Z_STRVAL_PP(db))==FAIL) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to select database:  %s", Z_STRVAL_PP(db));		RETURN_FALSE;	} else {		RETURN_TRUE;	}}/* }}} */static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type  TSRMLS_DC){	if (dbdatlen(mssql_ptr->link,offset) == 0) {		ZVAL_NULL(result);		return;	}	switch (column_type)	{		case SQLBIT:		case SQLINT1:		case SQLINT2:		case SQLINT4:		case SQLINTN: {				Z_LVAL_P(result) = (long) anyintcol(offset);			Z_TYPE_P(result) = IS_LONG;			break;		} 		case SQLCHAR:		case SQLVARCHAR:		case SQLTEXT: {			int length;			char *data = charcol(offset);			length=dbdatlen(mssql_ptr->link,offset);#if ilia_0			while (length>0 && data[length-1] == ' ') { /* nuke trailing whitespace */				length--;			}#endif			Z_STRVAL_P(result) = estrndup(data,length);			Z_STRLEN_P(result) = length;			Z_TYPE_P(result) = IS_STRING;			break;		}		case SQLFLT4:			Z_DVAL_P(result) = (double) floatcol4(offset);			Z_TYPE_P(result) = IS_DOUBLE;			break;		case SQLMONEY:		case SQLMONEY4:		case SQLMONEYN: {			DBFLT8 res_buf;			dbconvert(NULL, column_type, dbdata(mssql_ptr->link,offset), 8, SQLFLT8, (LPBYTE)&res_buf, -1);			Z_DVAL_P(result) = res_buf;			Z_TYPE_P(result) = IS_DOUBLE;			}			break;		case SQLFLT8:			Z_DVAL_P(result) = (double) floatcol8(offset);			Z_TYPE_P(result) = IS_DOUBLE;			break;#ifdef SQLUNIQUE		case SQLUNIQUE: {#else		case 36: {			/* FreeTDS hack */#endif			char *data = charcol(offset);			/* uniqueidentifier is a 16-byte binary number */			ZVAL_STRINGL(result, data, 16, 1);			}			break;		case SQLVARBINARY:		case SQLBINARY:		case SQLIMAGE: {			DBBINARY *bin;			unsigned char *res_buf;			int res_length = dbdatlen(mssql_ptr->link, offset);			res_buf = (unsigned char *) emalloc(res_length+1);			bin = ((DBBINARY *)dbdata(mssql_ptr->link, offset));			memcpy(res_buf,bin,res_length);			res_buf[res_length] = '\0';			Z_STRLEN_P(result) = res_length;			Z_STRVAL_P(result) = res_buf;			Z_TYPE_P(result) = IS_STRING;			}			break;		case SQLNUMERIC:		default: {			if (dbwillconvert(column_type,SQLCHAR)) {				char *res_buf;				DBDATEREC dateinfo;					int res_length = dbdatlen(mssql_ptr->link,offset);				if ((column_type != SQLDATETIME && column_type != SQLDATETIM4) || MS_SQL_G(datetimeconvert)) {					switch (column_type) {						case SQLDATETIME :						case SQLDATETIM4 :							res_length += 20;							break;						case SQLMONEY :						case SQLMONEY4 :						case SQLMONEYN :						case SQLDECIMAL :						case SQLNUMERIC :							res_length += 5;						case 127 :							res_length += 20;							break;					}								res_buf = (unsigned char *) emalloc(res_length+1);					res_length = dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length, SQLCHAR,res_buf,-1);					res_buf[res_length] = '\0';				} else {					if (column_type == SQLDATETIM4) {						DBDATETIME temp;

⌨️ 快捷键说明

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