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

📄 php_mssql.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
						dbconvert(NULL, SQLDATETIM4, dbdata(mssql_ptr->link,offset), -1, SQLDATETIME, (LPBYTE) &temp, -1);						dbdatecrack(mssql_ptr->link, &dateinfo, &temp);					} else {						dbdatecrack(mssql_ptr->link, &dateinfo, (DBDATETIME *) dbdata(mssql_ptr->link,offset));					}								res_length = 19;					res_buf = (unsigned char *) emalloc(res_length+1);					sprintf(res_buf, "%d-%02d-%02d %02d:%02d:%02d" , dateinfo.year, dateinfo.month, dateinfo.day, dateinfo.hour, dateinfo.minute, dateinfo.second);				}						Z_STRVAL_P(result) = res_buf;				Z_STRLEN_P(result) = res_length;				Z_TYPE_P(result) = IS_STRING;			} else {				php_error_docref(NULL TSRMLS_CC, E_WARNING, "column %d has unknown data type (%d)", offset, coltype(offset));				ZVAL_FALSE(result);			}		}	}}static void php_mssql_get_column_content_without_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;	}	if (column_type == SQLVARBINARY ||		column_type == SQLBINARY ||		column_type == 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;	}	else if  (dbwillconvert(coltype(offset),SQLCHAR)) {		unsigned 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;				dbconvert(NULL, SQLDATETIM4, dbdata(mssql_ptr->link,offset), -1, SQLDATETIME, (LPBYTE) &temp, -1);				dbdatecrack(mssql_ptr->link, &dateinfo, &temp);			} else {				dbdatecrack(mssql_ptr->link, &dateinfo, (DBDATETIME *) dbdata(mssql_ptr->link,offset));			}						res_length = 19;			res_buf = (unsigned char *) emalloc(res_length+1);			sprintf(res_buf, "%d-%02d-%02d %02d:%02d:%02d" , dateinfo.year, dateinfo.month, dateinfo.day, dateinfo.hour, dateinfo.minute, dateinfo.second);		}		Z_STRVAL_P(result) = res_buf;		Z_STRLEN_P(result) = res_length;		Z_TYPE_P(result) = IS_STRING;	} else {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "column %d has unknown data type (%d)", offset, coltype(offset));		ZVAL_FALSE(result);	}}static void _mssql_get_sp_result(mssql_link *mssql_ptr, mssql_statement *statement TSRMLS_DC) {	int i, num_rets, type;	char *parameter;	mssql_bind *bind;	/* Now to fetch RETVAL and OUTPUT values*/	num_rets = dbnumrets(mssql_ptr->link);		if (num_rets!=0) {		for (i = 1; i <= num_rets; i++) {			parameter = (char*)dbretname(mssql_ptr->link, i);			type = dbrettype(mssql_ptr->link, i);									if (statement->binds != NULL) {	/*	Maybe a non-parameter sp	*/				if (zend_hash_find(statement->binds, parameter, strlen(parameter), (void**)&bind)==SUCCESS) {					switch (type) {						case SQLBIT:						case SQLINT1:						case SQLINT2:						case SQLINT4:							convert_to_long_ex(&bind->zval);							/* FIXME this works only on little endian machine !!! */							Z_LVAL_P(bind->zval) = *((int *)(dbretdata(mssql_ptr->link,i)));							break;									case SQLFLT4:						case SQLFLT8:						case SQLFLTN:						case SQLMONEY4:						case SQLMONEY:						case SQLMONEYN:							convert_to_double_ex(&bind->zval);							Z_DVAL_P(bind->zval) = *((double *)(dbretdata(mssql_ptr->link,i)));							break;						case SQLCHAR:						case SQLVARCHAR:						case SQLTEXT:							convert_to_string_ex(&bind->zval);							Z_STRLEN_P(bind->zval) = dbretlen(mssql_ptr->link,i);							Z_STRVAL_P(bind->zval) = estrndup(dbretdata(mssql_ptr->link,i),Z_STRLEN_P(bind->zval));							break;						/* TODO binary */					}				}				else {					php_error_docref(NULL TSRMLS_CC, E_WARNING, "An output parameter variable was not provided");				}			}		}	}	if (statement->binds != NULL) {	/*	Maybe a non-parameter sp	*/		if (zend_hash_find(statement->binds, "RETVAL", 6, (void**)&bind)==SUCCESS) {			if (dbhasretstat(mssql_ptr->link)) {				convert_to_long_ex(&bind->zval);				Z_LVAL_P(bind->zval)=dbretstatus(mssql_ptr->link);			}			else {				php_error_docref(NULL TSRMLS_CC, E_WARNING, "stored procedure has no return value. Nothing was returned into RETVAL");			}		}	}}static int _mssql_fetch_batch(mssql_link *mssql_ptr, mssql_result *result, int retvalue TSRMLS_DC) {	int i, j = 0;	int *column_types;	char computed_buf[16];	column_types = (int *) emalloc(sizeof(int) * result->num_fields);	for (i=0; i<result->num_fields; i++) {		char *source = NULL;		char *fname = (char *)dbcolname(mssql_ptr->link,i+1);		if (*fname) {			result->fields[i].name = estrdup(fname);		} else {			if (j>0) {				snprintf(computed_buf,16,"computed%d",j);			} else {				strcpy(computed_buf,"computed");			}			result->fields[i].name = estrdup(computed_buf);			j++;		}		result->fields[i].max_length = dbcollen(mssql_ptr->link,i+1);		source = (char *)dbcolsource(mssql_ptr->link,i+1);		if (source) {			result->fields[i].column_source = estrdup(source);		}		else {			result->fields[i].column_source = empty_string;		}		column_types[i] = coltype(i+1);		Z_TYPE(result->fields[i]) = column_types[i];		/* set numeric flag */		switch (column_types[i]) {			case SQLINT1:			case SQLINT2:			case SQLINT4:			case SQLINTN:			case SQLFLT4:			case SQLFLT8:			case SQLNUMERIC:			case SQLDECIMAL:				result->fields[i].numeric = 1;				break;			case SQLCHAR:			case SQLVARCHAR:			case SQLTEXT:			default:				result->fields[i].numeric = 0;				break;		}	}	i=0;	if (!result->data) {		result->data = (zval **) emalloc(sizeof(zval *)*MSSQL_ROWS_BLOCK*(++result->blocks_initialized));	}	while (retvalue!=FAIL && retvalue!=NO_MORE_ROWS) {		result->num_rows++;		if (result->num_rows > result->blocks_initialized*MSSQL_ROWS_BLOCK) {			result->data = (zval **) erealloc(result->data,sizeof(zval *)*MSSQL_ROWS_BLOCK*(++result->blocks_initialized));		}		result->data[i] = (zval *) emalloc(sizeof(zval)*result->num_fields);		for (j=0; j<result->num_fields; j++) {			INIT_ZVAL(result->data[i][j]);			MS_SQL_G(get_column_content(mssql_ptr, j+1, &result->data[i][j], column_types[j] TSRMLS_CC));		}		if (i<result->batchsize || result->batchsize==0) {			i++;			dbclrbuf(mssql_ptr->link,DBLASTROW(mssql_ptr->link)); 			retvalue=dbnextrow(mssql_ptr->link);		}		else			break;		result->lastresult = retvalue;	}	efree(column_types);	if (result->statement && (retvalue == NO_MORE_RESULTS || retvalue == NO_MORE_RPC_RESULTS)) {		_mssql_get_sp_result(mssql_ptr, result->statement TSRMLS_CC);	}	return i;}/* {{{ proto int mssql_fetch_batch(resource result_index)   Returns the next batch of records */PHP_FUNCTION(mssql_fetch_batch){	zval **mssql_result_index;	mssql_result *result;	mssql_link *mssql_ptr;		if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_result_index)==FAILURE) {		WRONG_PARAM_COUNT;	}		if (Z_TYPE_PP(mssql_result_index)==IS_RESOURCE && Z_LVAL_PP(mssql_result_index)==0) {		RETURN_FALSE;	}	ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS SQL-result", le_result);	mssql_ptr = result->mssql_ptr;	_free_result(result, 0);	result->cur_row=result->num_rows=0;	result->num_rows = _mssql_fetch_batch(mssql_ptr, result, result->lastresult TSRMLS_CC);	RETURN_LONG(result->num_rows);}/* }}} *//* {{{ proto resource mssql_query(string query [, resource conn_id [, int batch_size]])   Perform an SQL query on a MS-SQL server database */PHP_FUNCTION(mssql_query){	zval **query, **mssql_link_index, **zbatchsize;	int retvalue;	mssql_link *mssql_ptr;	mssql_result *result;	int id, num_fields;	int batchsize;	batchsize = MS_SQL_G(batchsize);	switch(ZEND_NUM_ARGS()) {		case 1:			if (zend_get_parameters_ex(1, &query)==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, &query, &mssql_link_index)==FAILURE) {				RETURN_FALSE;			}			id = -1;			break;		case 3:			if (zend_get_parameters_ex(3, &query, &mssql_link_index, &zbatchsize)==FAILURE) {				RETURN_FALSE;			}			id = -1;			convert_to_long_ex(zbatchsize);			batchsize = Z_LVAL_PP(zbatchsize);			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(query);		if (dbcmd(mssql_ptr->link, Z_STRVAL_PP(query))==FAIL) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to set query");		RETURN_FALSE;	}	if (dbsqlexec(mssql_ptr->link)==FAIL || (retvalue = dbresults(mssql_ptr->link))==FAIL) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Query failed");		dbcancel(mssql_ptr->link);		RETURN_FALSE;	}		/* Skip results not returning any columns */	while ((num_fields = dbnumcols(mssql_ptr->link)) <= 0 && retvalue == SUCCEED) {		retvalue = dbresults(mssql_ptr->link);	}	if (num_fields <= 0) {		RETURN_TRUE;	}	retvalue=dbnextrow(mssql_ptr->link);		if (retvalue==FAIL) {		dbcancel(mssql_ptr->link);		RETURN_FALSE;	}	result = (mssql_result *) emalloc(sizeof(mssql_result));	result->statement = NULL;	result->num_fields = num_fields;	result->blocks_initialized = 1;		result->batchsize = batchsize;	result->data = NULL;	result->blocks_initialized = 0;	result->mssql_ptr = mssql_ptr;	result->cur_field=result->cur_row=result->num_rows=0;	result->fields = (mssql_field *) emalloc(sizeof(mssql_field)*result->num_fields);	result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue TSRMLS_CC);		ZEND_REGISTER_RESOURCE(return_value, result, le_result);}/* }}} *//* {{{ proto int mssql_rows_affected(resource conn_id)   Returns the number of records affected by the query */PHP_FUNCTION(mssql_rows_affected){	zval **mssql_link_index;	mssql_link *mssql_ptr;	if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_link_index)==FAILURE) {		WRONG_PARAM_COUNT;	}		ZEND_FETCH_RESOURCE2(mssql_ptr, mssql_link *, mssql_link_index, -1, "MS SQL-Link", le_link, le_plink);	RETURN_LONG(DBCOUNT(mssql_ptr->link));}/* }}} *//* {{{ proto bool mssql_free_result(resource result_index)   Free a MS-SQL result index */PHP_FUNCTION(mssql_free_result){	zval **mssql_result_index;	mssql_result *result;	int retvalue;		if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_result_index)==FAILURE) {		WRONG_PARAM_COUNT;	}		if (Z_TYPE_PP(mssql_result_index)==IS_RESOURCE && Z_LVAL_PP(mssql_result_index)==0) {		RETURN_FALSE;	}	ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS SQL-result", le_result);		/* Release remaining results */	do {		dbcanquery(result->mssql_ptr->link);		retvalue = dbresults(result->mssql_ptr->link);	} while (retvalue == SUCCEED);	zend_list_delete(Z_RESVAL_PP(mssql_result_index));	RETURN_TRUE;}/* }}} *//* {{{ proto string mssql_get_last_message(void)   Gets the last message from the MS-SQL server */PHP_FUNCTION(mssql_get_last_message){	if (MS_SQL_G(server_message)) {		RETURN_STRING(MS_SQL_G(server_message),1);	}	else {		RETURN_STRING(empty_string,1);	}}/* }}} *//* {{{ proto int mssql_num_rows(resource mssql_result_index)   Returns the number of rows fetched in from the result id specified */PHP_FUNCTION(mssql_num_rows){	zval **mssql_result_index;	mssql_result *result;		if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_result_index)==FAILURE) {		WRONG_PARAM_COUNT;	}		ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS SQL-result", le_result);			Z_LVAL_P(return_value) = result->num_rows;	Z_TYPE_P(return_value) = IS_LONG;}/* }}} *//* {{{ proto int mssql_num_fields(resource mssql_result_index)   Returns the number of fields fetched in from the result id specified */PHP_FUNCTION(mssql_num_fields){	zval **mssql_result_index;	mssql_result *result;		if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_result_index)==FAILURE) {		WRONG_PARAM_COUNT;	}		ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS SQL-result", le_result);		Z_LVAL_P(return_value) = result->num_fields;	Z_TYPE_P(return_value) = IS_LONG;}/* }}} */static void php_mssql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type, int expected_args){	zval **mssql_result_index, **resulttype = NULL;	mssql_result *result;

⌨️ 快捷键说明

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