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

📄 php_odbc.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
#ifdef HAVE_SQL_EXTENDED_FETCH	if (rownum > 0 && result->fetch_abs)		result->fetched = rownum;	else#endif		result->fetched++;	for(i = 0; i < result->numcols; i++) {		ALLOC_INIT_ZVAL(tmp);		Z_TYPE_P(tmp) = IS_STRING;		Z_STRLEN_P(tmp) = 0;		sql_c_type = SQL_C_CHAR;		switch(result->values[i].coltype) {			case SQL_BINARY:			case SQL_VARBINARY:			case SQL_LONGVARBINARY:				if (result->binmode <= 0) {					Z_STRVAL_P(tmp) = empty_string;					break;				}				if (result->binmode == 1) sql_c_type = SQL_C_BINARY;			case SQL_LONGVARCHAR:				if (IS_SQL_LONG(result->values[i].coltype) && result->longreadlen <= 0) {					Z_STRVAL_P(tmp) = empty_string;					break;				}				if (buf == NULL) buf = emalloc(result->longreadlen + 1);				rc = SQLGetData(result->stmt, (UWORD)(i + 1), sql_c_type,						buf, result->longreadlen + 1, &result->values[i].vallen);				if (rc == SQL_ERROR) {					odbc_sql_error(result->conn_ptr, result->stmt, "SQLGetData");					efree(buf);					RETURN_FALSE;				}				if (rc == SQL_SUCCESS_WITH_INFO) {					Z_STRLEN_P(tmp) = result->longreadlen;				} else if (result->values[i].vallen == SQL_NULL_DATA) {					ZVAL_NULL(tmp);					break;				} else {					Z_STRLEN_P(tmp) = result->values[i].vallen;				}				Z_STRVAL_P(tmp) = estrndup(buf, Z_STRLEN_P(tmp));				break;			default:				if (result->values[i].vallen == SQL_NULL_DATA) {					ZVAL_NULL(tmp);					break;				}				Z_STRLEN_P(tmp) = result->values[i].vallen;				Z_STRVAL_P(tmp) = estrndup(result->values[i].value,Z_STRLEN_P(tmp));				break;		}		if (result_type & ODBC_NUM) {			zend_hash_index_update(Z_ARRVAL_P(return_value), i, &tmp, sizeof(pval *), NULL);		} else {			if (!*(result->values[i].name)) {				zend_hash_update(Z_ARRVAL_P(return_value), Z_STRVAL_P(tmp),					Z_STRLEN_P(tmp)+1, &tmp, sizeof(pval *), NULL);			} else {				zend_hash_update(Z_ARRVAL_P(return_value), result->values[i].name, 					strlen(result->values[i].name)+1, &tmp, sizeof(pval *), NULL);			}		}	}	if (buf) efree(buf);}/* }}} *//* {{{ proto object odbc_fetch_object(int result [, int rownumber])   Fetch a result row as an object */PHP_FUNCTION(odbc_fetch_object){	php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, ODBC_OBJECT);	if (Z_TYPE_P(return_value) == IS_ARRAY) {		object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value));	}}/* }}} *//* {{{ proto array odbc_fetch_array(int result [, int rownumber])   Fetch a result row as an associative array */PHP_FUNCTION(odbc_fetch_array){	php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, ODBC_OBJECT);}/* }}} */#endif/* {{{ proto int odbc_fetch_into(resource result_id, array result_array, [, int rownumber])   Fetch one result row into an array */ PHP_FUNCTION(odbc_fetch_into){	int numArgs, i;	odbc_result *result;	RETCODE rc;	SWORD sql_c_type;	char *buf = NULL;	pval **pv_res, **pv_res_arr, *tmp;#ifdef HAVE_SQL_EXTENDED_FETCH	pval **pv_row;	UDWORD crow;	UWORD  RowStatus[1];	SDWORD rownum = -1;#endif /* HAVE_SQL_EXTENDED_FETCH */		numArgs = ZEND_NUM_ARGS();	switch(numArgs) {		case 2:			if (zend_get_parameters_ex(2, &pv_res, &pv_res_arr) == FAILURE) {				WRONG_PARAM_COUNT;			}			break;#ifdef HAVE_SQL_EXTENDED_FETCH		case 3:			if (zend_get_parameters_ex(3, &pv_res, &pv_res_arr, &pv_row) == FAILURE) {				WRONG_PARAM_COUNT;			}			SEPARATE_ZVAL(pv_row);			convert_to_long_ex(pv_row);			rownum = Z_LVAL_PP(pv_row);			break;#endif /* HAVE_SQL_EXTENDED_FETCH */		default:			WRONG_PARAM_COUNT;	}	ZEND_FETCH_RESOURCE(result, odbc_result *, pv_res, -1, "ODBC result", le_result);		if (result->numcols == 0) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "No tuples available at this result index");		RETURN_FALSE;	}		if (Z_TYPE_PP(pv_res_arr) != IS_ARRAY) {		array_init(*pv_res_arr);	}#ifdef HAVE_SQL_EXTENDED_FETCH	if (result->fetch_abs) {		if (rownum > 0)			rc = SQLExtendedFetch(result->stmt,SQL_FETCH_ABSOLUTE,rownum,&crow,RowStatus);		else			rc = SQLExtendedFetch(result->stmt,SQL_FETCH_NEXT,1,&crow,RowStatus);	} else#endif		rc = SQLFetch(result->stmt);	if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)		RETURN_FALSE;#ifdef HAVE_SQL_EXTENDED_FETCH	if (rownum > 0 && result->fetch_abs)		result->fetched = rownum;	else#endif		result->fetched++;	for(i = 0; i < result->numcols; i++) {		ALLOC_ZVAL(tmp);		tmp->refcount = 1;		Z_TYPE_P(tmp) = IS_STRING;		Z_STRLEN_P(tmp) = 0;		sql_c_type = SQL_C_CHAR;		switch(result->values[i].coltype) {			case SQL_BINARY:			case SQL_VARBINARY:			case SQL_LONGVARBINARY:				if (result->binmode <= 0) {					Z_STRVAL_P(tmp) = empty_string;					break;				}				if (result->binmode == 1) sql_c_type = SQL_C_BINARY; 			case SQL_LONGVARCHAR:				if (IS_SQL_LONG(result->values[i].coltype) && result->longreadlen <= 0) {					Z_STRVAL_P(tmp) = empty_string;					break;				}				if (buf == NULL) buf = emalloc(result->longreadlen + 1);				rc = SQLGetData(result->stmt, (UWORD)(i + 1),sql_c_type,								buf, result->longreadlen + 1, &result->values[i].vallen);					if (rc == SQL_ERROR) {					odbc_sql_error(result->conn_ptr, result->stmt, "SQLGetData");					efree(buf);					RETURN_FALSE;				}				if (rc == SQL_SUCCESS_WITH_INFO) {					Z_STRLEN_P(tmp) = result->longreadlen;				} else if (result->values[i].vallen == SQL_NULL_DATA) {					ZVAL_NULL(tmp);					break;				} else {					Z_STRLEN_P(tmp) = result->values[i].vallen;				}				Z_STRVAL_P(tmp) = estrndup(buf, Z_STRLEN_P(tmp));				break;			default:				if (result->values[i].vallen == SQL_NULL_DATA) {					ZVAL_NULL(tmp);					break;				}				Z_STRLEN_P(tmp) = result->values[i].vallen;				Z_STRVAL_P(tmp) = estrndup(result->values[i].value,Z_STRLEN_P(tmp));				break;		}		zend_hash_index_update(Z_ARRVAL_PP(pv_res_arr), i, &tmp, sizeof(pval *), NULL);	}	if (buf) efree(buf);	RETURN_LONG(result->numcols);	}/* }}} *//* {{{ proto bool solid_fetch_prev(resource result_id)   */ #if defined(HAVE_SOLID) || defined(HAVE_SOLID_30) || defined(HAVE_SOLID_35)PHP_FUNCTION(solid_fetch_prev){	odbc_result *result;	RETCODE rc;	pval **pv_res;		if (zend_get_parameters_ex(1, &pv_res) == FAILURE) {		WRONG_PARAM_COUNT;	}		ZEND_FETCH_RESOURCE(result, odbc_result *, pv_res, -1, "ODBC result", le_result);	if (result->numcols == 0) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "No tuples available at this result index");		RETURN_FALSE;	}	rc = SQLFetchPrev(result->stmt);	if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {		RETURN_FALSE;	}	if (result->fetched > 1) result->fetched--;	RETURN_TRUE;}#endif/* }}} *//* {{{ proto bool odbc_fetch_row(resource result_id [, int row_number])   Fetch a row */PHP_FUNCTION(odbc_fetch_row){	int numArgs;	SDWORD rownum = 1;	odbc_result *result;	RETCODE rc;	pval **pv_res, **pv_row;#ifdef HAVE_SQL_EXTENDED_FETCH	UDWORD crow;	UWORD RowStatus[1];#endif	numArgs = ZEND_NUM_ARGS();	switch (numArgs) {		case 1:			if (zend_get_parameters_ex(1, &pv_res) == FAILURE)				WRONG_PARAM_COUNT;			break;		case 2:			if (zend_get_parameters_ex(2, &pv_res, &pv_row) == FAILURE)				WRONG_PARAM_COUNT;			convert_to_long_ex(pv_row);			rownum = Z_LVAL_PP(pv_row);			break;		default:			WRONG_PARAM_COUNT;	}		ZEND_FETCH_RESOURCE(result, odbc_result *, pv_res, -1, "ODBC result", le_result);		if (result->numcols == 0) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "No tuples available at this result index");		RETURN_FALSE;	}#ifdef HAVE_SQL_EXTENDED_FETCH	if (result->fetch_abs) {		if (numArgs > 1)			rc = SQLExtendedFetch(result->stmt,SQL_FETCH_ABSOLUTE,rownum,&crow,RowStatus);		else			rc = SQLExtendedFetch(result->stmt,SQL_FETCH_NEXT,1,&crow,RowStatus);	} else#endif		rc = SQLFetch(result->stmt);	if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {		RETURN_FALSE;	}		if (numArgs > 1) {		result->fetched = rownum;	} else {		result->fetched++;	}		RETURN_TRUE;}	/* }}} *//* {{{ proto mixed odbc_result(resource result_id, mixed field)   Get result data */ PHP_FUNCTION(odbc_result){	char *field;	int field_ind;	SWORD sql_c_type = SQL_C_CHAR;	odbc_result *result;	int i = 0;	RETCODE rc;	SDWORD	fieldsize;	pval **pv_res, **pv_field;#ifdef HAVE_SQL_EXTENDED_FETCH	UDWORD crow;	UWORD RowStatus[1];#endif	field_ind = -1;	field = NULL;	if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2 , &pv_res, &pv_field) == FAILURE) {		WRONG_PARAM_COUNT;	}		if (Z_TYPE_PP(pv_field) == IS_STRING) {		field = Z_STRVAL_PP(pv_field);	} else {		convert_to_long_ex(pv_field);		field_ind = Z_LVAL_PP(pv_field) - 1;	}		ZEND_FETCH_RESOURCE(result, odbc_result *, pv_res, -1, "ODBC result", le_result);		if ((result->numcols == 0)) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "No tuples available at this result index");		RETURN_FALSE;	}		/* get field index if the field parameter was a string */	if (field != NULL) {		if (result->values == NULL) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Result set contains no data");			RETURN_FALSE;		}		for(i = 0; i < result->numcols; i++) {			if (!strcasecmp(result->values[i].name, field)) {				field_ind = i;				break;			}		}		if (field_ind < 0) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %s not found", field);			RETURN_FALSE;		}	} else {		/* check for limits of field_ind if the field parameter was an int */		if (field_ind >= result->numcols || field_ind < 0) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field index is larger than the number of fields");			RETURN_FALSE;		}	}	if (result->fetched == 0) {		/* User forgot to call odbc_fetch_row(), or wants to reload the results, do it now */#ifdef HAVE_SQL_EXTENDED_FETCH		if (result->fetch_abs)			rc = SQLExtendedFetch(result->stmt, SQL_FETCH_NEXT, 1, &crow,RowStatus);		else#endif			rc = SQLFetch(result->stmt);		if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)			RETURN_FALSE;				result->fetched++;	}	switch(result->values[field_ind].coltype) {		case SQL_BINARY:		case SQL_VARBINARY:		case SQL_LONGVARBINARY:			if (result->binmode <= 1) sql_c_type = SQL_C_BINARY;			if (result->binmode <= 0) break; 		case SQL_LONGVARCHAR:			if (IS_SQL_LONG(result->values[field_ind].coltype)) {			   if (result->longreadlen <= 0) 				   break;			   else 				   fieldsize = result->longreadlen;			} else {			   SQLColAttributes(result->stmt, (UWORD)(field_ind + 1), 					   			(UWORD)((sql_c_type == SQL_C_BINARY) ? SQL_COLUMN_LENGTH :					   			SQL_COLUMN_DISPLAY_SIZE),					   			NULL, 0, NULL, &fieldsize);			}			/* For char data, the length of the returned string will be longreadlen - 1 */			fieldsize = (result->longreadlen <= 0) ? 4096 : result->longreadlen;			field = emalloc(fieldsize);		/* SQLGetData will truncate CHAR data to fieldsize - 1 bytes and append \0.		 * For binary data it is truncated to fieldsize bytes. 		 */			rc = SQLGetData(result->stmt, (UWORD)(field_ind + 1), sql_c_type,							field, fieldsize, &result->values[field_ind].vallen);			if (rc == SQL_ERROR) {				odbc_sql_error(result->conn_ptr, result->stmt, "SQLGetData");				efree(field);				RETURN_FALSE;			}			if (result->values[field_ind].vallen == SQL_NULL_DATA) {				efree(field);				RETURN_NULL();			} else if (rc == SQL_NO_DATA_FOUND) {				efree(field);				RETURN_FALSE;			}			/* Reduce fieldlen by 1 if we have char data. One day we might 			   have binary strings... */			if (result->values[field_ind].coltype == SQL_LONGVARCHAR) fieldsize -= 1;			/* Don't duplicate result, saves one emalloc.			   For SQL_SUCCESS, the length is in vallen.			 */			RETURN_STRINGL(field, (rc == SQL_SUCCESS_WITH_INFO) ? fieldsize :						   result->values[field_ind].vallen, 0);			break;					default:			if (result->values[field_ind].vallen == SQL_NULL_DATA) {				RETURN_NULL();			} else {				RETURN_STRINGL(result->values[field_ind].value, result->values[field_ind].vallen, 1);			}			break;	}/* If we come here, output unbound LONG and/or BINARY column data to the client */		/* We emalloc 1 byte more for SQL_C_CHAR (trailing \0) */	fieldsize = (sql_c_type == SQL_C_CHAR) ? 4096 : 4095;	field = emalloc(fieldsize);		/* Call SQLGetData() until SQL_SUCCESS is returned */	while(1) {		rc = SQLGetData(result->stmt, (UWORD)(field_ind + 1),sql_c_type,							field, fieldsize, &result->values[field_ind].vallen);		if (rc == SQL_ERROR) {			odbc_sql_error(result->conn_ptr, result->stmt, "SQLGetData");			efree(field);

⌨️ 快捷键说明

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