diff options
Diffstat (limited to 'ext/mysqlnd/mysqlnd_result.c')
| -rw-r--r-- | ext/mysqlnd/mysqlnd_result.c | 113 | 
1 files changed, 56 insertions, 57 deletions
diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index dfcce71cce..e2dc9500c2 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -55,8 +55,8 @@ MYSQLND_METHOD(mysqlnd_res, initialize_result_set_rest)(MYSQLND_RES * const resu  									data_cursor,  									result->meta->field_count,  									result->meta->fields, -									result->conn->options.numeric_and_datetime_as_unicode, -									result->conn->options.int_and_float_native, +									result->conn->options->numeric_and_datetime_as_unicode, +									result->conn->options->int_and_float_native,  									result->conn->stats TSRMLS_CC);  			if (rc != PASS) {  				ret = FAIL; @@ -332,7 +332,7 @@ MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQLND_RES * result, MYSQLND  	result->meta = result->m.result_meta_init(result->field_count, result->persistent TSRMLS_CC);  	if (!result->meta) { -		SET_OOM_ERROR(conn->error_info); +		SET_OOM_ERROR(*conn->error_info);  		DBG_RETURN(FAIL);  	} @@ -374,7 +374,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)  	do {  		rset_header = conn->protocol->m.get_rset_header_packet(conn->protocol, FALSE TSRMLS_CC);  		if (!rset_header) { -			SET_OOM_ERROR(conn->error_info); +			SET_OOM_ERROR(*conn->error_info);  			ret = FAIL;  			break;  		} @@ -396,19 +396,19 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)  			  a multi-statement or a stored procedure, so it should be  			  safe to unconditionally turn off the flag here.  			*/ -			conn->upsert_status.server_status &= ~SERVER_MORE_RESULTS_EXISTS; +			conn->upsert_status->server_status &= ~SERVER_MORE_RESULTS_EXISTS;  			/*  			  This will copy the error code and the messages, as they  			  are buffers in the struct  			*/ -			COPY_CLIENT_ERROR(conn->error_info, rset_header->error_info); +			COPY_CLIENT_ERROR(*conn->error_info, rset_header->error_info);  			ret = FAIL;  			DBG_ERR_FMT("error=%s", rset_header->error_info.error);  			/* Return back from CONN_QUERY_SENT */  			CONN_SET_STATE(conn, CONN_READY);  			break;  		} -		conn->error_info.error_no = 0; +		conn->error_info->error_no = 0;  		switch (rset_header->field_count) {  			case MYSQLND_NULL_LENGTH: {	/* LOAD DATA LOCAL INFILE */ @@ -426,15 +426,15 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)  				DBG_INF("UPSERT");  				conn->last_query_type = QUERY_UPSERT;  				conn->field_count = rset_header->field_count; -				conn->upsert_status.warning_count = rset_header->warning_count; -				conn->upsert_status.server_status = rset_header->server_status; -				conn->upsert_status.affected_rows = rset_header->affected_rows; -				conn->upsert_status.last_insert_id = rset_header->last_insert_id; +				conn->upsert_status->warning_count = rset_header->warning_count; +				conn->upsert_status->server_status = rset_header->server_status; +				conn->upsert_status->affected_rows = rset_header->affected_rows; +				conn->upsert_status->last_insert_id = rset_header->last_insert_id;  				SET_NEW_MESSAGE(conn->last_message, conn->last_message_len,  								rset_header->info_or_local_file, rset_header->info_or_local_file_len,  								conn->persistent);  				/* Result set can follow UPSERT statement, check server_status */ -				if (conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS) { +				if (conn->upsert_status->server_status & SERVER_MORE_RESULTS_EXISTS) {  					CONN_SET_STATE(conn, CONN_NEXT_RESULT_PENDING);  				} else {  					CONN_SET_STATE(conn, CONN_READY); @@ -450,7 +450,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)  				SET_EMPTY_MESSAGE(conn->last_message, conn->last_message_len, conn->persistent);  				MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_RSET_QUERY); -				memset(&conn->upsert_status, 0, sizeof(conn->upsert_status)); +				memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));  				/* restore after zeroing */  				SET_ERROR_AFF_ROWS(conn); @@ -486,7 +486,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)  					result = stmt->result;  				}  				if (!result) { -					SET_OOM_ERROR(conn->error_info); +					SET_OOM_ERROR(*conn->error_info);  					ret = FAIL;  					break;  				} @@ -504,7 +504,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)  				/* Check for SERVER_STATUS_MORE_RESULTS if needed */  				fields_eof = conn->protocol->m.get_eof_packet(conn->protocol, FALSE TSRMLS_CC);  				if (!fields_eof) { -					SET_OOM_ERROR(conn->error_info); +					SET_OOM_ERROR(*conn->error_info);  					ret = FAIL;  					break;  				} @@ -523,7 +523,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)  					unsigned int to_log = MYSQLND_G(log_mask);  					to_log &= fields_eof->server_status;  					DBG_INF_FMT("warnings=%u server_status=%u", fields_eof->warning_count, fields_eof->server_status); -					conn->upsert_status.warning_count = fields_eof->warning_count; +					conn->upsert_status->warning_count = fields_eof->warning_count;  					/*  					  If SERVER_MORE_RESULTS_EXISTS is set then this is either MULTI_QUERY or a CALL()  					  The first packet after sending the query/com_execute has the bit set only @@ -531,7 +531,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)  					  will include many result sets. What actually matters are the bits set at the end  					  of every result set (the EOF packet).  					*/ -					conn->upsert_status.server_status = fields_eof->server_status; +					conn->upsert_status->server_status = fields_eof->server_status;  					if (fields_eof->server_status & SERVER_QUERY_NO_GOOD_INDEX_USED) {  						statistic = STAT_BAD_INDEX_USED;  					} else if (fields_eof->server_status & SERVER_QUERY_NO_INDEX_USED) { @@ -634,7 +634,7 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TSRMLS_DC)  		DBG_RETURN(retrow);  	}  	if (CONN_GET_STATE(result->conn) != CONN_FETCHING_DATA) { -		SET_CLIENT_ERROR(result->conn->error_info, CR_COMMANDS_OUT_OF_SYNC, +		SET_CLIENT_ERROR(*result->conn->error_info, CR_COMMANDS_OUT_OF_SYNC,  						 UNKNOWN_SQLSTATE, mysqlnd_out_of_sync);   		DBG_RETURN(retrow);  	} @@ -669,8 +669,8 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TSRMLS_DC)  										  result->unbuf->last_row_data,  										  row_packet->field_count,  										  row_packet->fields_metadata, -										  result->conn->options.numeric_and_datetime_as_unicode, -										  result->conn->options.int_and_float_native, +										  result->conn->options->numeric_and_datetime_as_unicode, +										  result->conn->options->int_and_float_native,  										  result->conn->stats TSRMLS_CC);  			if (PASS != rc) {  				DBG_RETURN(retrow); @@ -700,12 +700,12 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TSRMLS_DC)  					}  				}  			} else { -				SET_OOM_ERROR(result->conn->error_info); +				SET_OOM_ERROR(*result->conn->error_info);  			}  		}  	} else if (ret == FAIL) {  		if (row_packet->error_info.error_no) { -			COPY_CLIENT_ERROR(result->conn->error_info, row_packet->error_info); +			COPY_CLIENT_ERROR(*result->conn->error_info, row_packet->error_info);  			DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error);  		}  		CONN_SET_STATE(result->conn, CONN_READY); @@ -714,13 +714,13 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TSRMLS_DC)  		/* Mark the connection as usable again */  		DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status);  		result->unbuf->eof_reached = TRUE; -		result->conn->upsert_status.warning_count = row_packet->warning_count; -		result->conn->upsert_status.server_status = row_packet->server_status; +		result->conn->upsert_status->warning_count = row_packet->warning_count; +		result->conn->upsert_status->server_status = row_packet->server_status;  		/*  		  result->row_packet will be cleaned when  		  destroying the result object  		*/ -		if (result->conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS) { +		if (result->conn->upsert_status->server_status & SERVER_MORE_RESULTS_EXISTS) {  			CONN_SET_STATE(result->conn, CONN_NEXT_RESULT_PENDING);  		} else {  			CONN_SET_STATE(result->conn, CONN_READY); @@ -749,7 +749,7 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, void *param, unsigned int fla  		DBG_RETURN(PASS);  	}  	if (CONN_GET_STATE(result->conn) != CONN_FETCHING_DATA) { -		SET_CLIENT_ERROR(result->conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); +		SET_CLIENT_ERROR(*result->conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync);  		DBG_RETURN(FAIL);  	}  	if (!row_packet) { @@ -784,8 +784,8 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, void *param, unsigned int fla  											result->unbuf->last_row_data,  											field_count,  											row_packet->fields_metadata, -											result->conn->options.numeric_and_datetime_as_unicode, -											result->conn->options.int_and_float_native, +											result->conn->options->numeric_and_datetime_as_unicode, +											result->conn->options->int_and_float_native,  											result->conn->stats TSRMLS_CC);  			if (PASS != rc) {  				DBG_RETURN(FAIL); @@ -840,7 +840,7 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, void *param, unsigned int fla  		result->unbuf->row_count++;  	} else if (ret == FAIL) {  		if (row_packet->error_info.error_no) { -			COPY_CLIENT_ERROR(result->conn->error_info, row_packet->error_info); +			COPY_CLIENT_ERROR(*result->conn->error_info, row_packet->error_info);  			DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error);  		}  		CONN_SET_STATE(result->conn, CONN_READY); @@ -849,13 +849,13 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, void *param, unsigned int fla  		/* Mark the connection as usable again */  		DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status);  		result->unbuf->eof_reached = TRUE; -		result->conn->upsert_status.warning_count = row_packet->warning_count; -		result->conn->upsert_status.server_status = row_packet->server_status; +		result->conn->upsert_status->warning_count = row_packet->warning_count; +		result->conn->upsert_status->server_status = row_packet->server_status;  		/*  		  result->row_packet will be cleaned when  		  destroying the result object  		*/ -		if (result->conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS) { +		if (result->conn->upsert_status->server_status & SERVER_MORE_RESULTS_EXISTS) {  			CONN_SET_STATE(result->conn, CONN_NEXT_RESULT_PENDING);  		} else {  			CONN_SET_STATE(result->conn, CONN_READY); @@ -875,8 +875,7 @@ MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, zend_bool ps  {  	DBG_ENTER("mysqlnd_res::use_result"); -	SET_EMPTY_ERROR(result->conn->error_info); - +	SET_EMPTY_ERROR(*result->conn->error_info);  	if (ps == FALSE) {  		result->type			= MYSQLND_RES_NORMAL; @@ -921,7 +920,7 @@ MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, zend_bool ps  	DBG_RETURN(result);  oom: -	SET_OOM_ERROR(result->conn->error_info); +	SET_OOM_ERROR(*result->conn->error_info);  	DBG_RETURN(NULL);  }  /* }}} */ @@ -951,8 +950,8 @@ mysqlnd_fetch_row_buffered_c(MYSQLND_RES * result TSRMLS_DC)  											current_row,  											result->meta->field_count,  											result->meta->fields, -											result->conn->options.numeric_and_datetime_as_unicode, -											result->conn->options.int_and_float_native, +											result->conn->options->numeric_and_datetime_as_unicode, +											result->conn->options->int_and_float_native,  											result->conn->stats TSRMLS_CC);  			if (rc != PASS) {  				DBG_RETURN(ret); @@ -1024,8 +1023,8 @@ mysqlnd_fetch_row_buffered(MYSQLND_RES * result, void *param, unsigned int flags  											current_row,  											result->meta->field_count,  											result->meta->fields, -											result->conn->options.numeric_and_datetime_as_unicode, -											result->conn->options.int_and_float_native, +											result->conn->options->numeric_and_datetime_as_unicode, +											result->conn->options->int_and_float_native,  											result->conn->stats TSRMLS_CC);  			if (rc != PASS) {  				DBG_RETURN(FAIL); @@ -1116,14 +1115,14 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL  	result->stored_data	= set = mnd_ecalloc(1, sizeof(MYSQLND_RES_BUFFERED));  	if (!set) { -		SET_OOM_ERROR(conn->error_info); +		SET_OOM_ERROR(*conn->error_info);  		ret = FAIL;  		goto end;  	}  	if (free_rows) {  		set->row_buffers = mnd_emalloc((size_t)(free_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *)));  		if (!set->row_buffers) { -			SET_OOM_ERROR(conn->error_info); +			SET_OOM_ERROR(*conn->error_info);  			ret = FAIL;  			goto end;  		} @@ -1133,7 +1132,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL  	/* non-persistent */  	row_packet = conn->protocol->m.get_row_packet(conn->protocol, FALSE TSRMLS_CC);  	if (!row_packet) { -		SET_OOM_ERROR(conn->error_info); +		SET_OOM_ERROR(*conn->error_info);  		ret = FAIL;  		goto end;  	} @@ -1154,13 +1153,13 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL  			/* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */  			if (total_allocated_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *) > SIZE_MAX) { -				SET_OOM_ERROR(conn->error_info); +				SET_OOM_ERROR(*conn->error_info);  				ret = FAIL;  				goto end;  			}  			new_row_buffers = mnd_erealloc(set->row_buffers, (size_t)(total_allocated_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *)));  			if (!new_row_buffers) { -				SET_OOM_ERROR(conn->error_info); +				SET_OOM_ERROR(*conn->error_info);  				ret = FAIL;  				goto end;  			} @@ -1186,14 +1185,14 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL  	if (set->row_count) {  		/* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */  		if (set->row_count * meta->field_count * sizeof(zval *) > SIZE_MAX) { -			SET_OOM_ERROR(conn->error_info); +			SET_OOM_ERROR(*conn->error_info);  			ret = FAIL;  			goto end;  		}  		/* if pecalloc is used valgrind barks gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux) */  		set->data = mnd_emalloc((size_t)(set->row_count * meta->field_count * sizeof(zval *)));  		if (!set->data) { -			SET_OOM_ERROR(conn->error_info); +			SET_OOM_ERROR(*conn->error_info);  			ret = FAIL;  			goto end;  		} @@ -1207,21 +1206,21 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL  	/* Finally clean */  	if (row_packet->eof) {  -		conn->upsert_status.warning_count = row_packet->warning_count; -		conn->upsert_status.server_status = row_packet->server_status; +		conn->upsert_status->warning_count = row_packet->warning_count; +		conn->upsert_status->server_status = row_packet->server_status;  	}  	/* save some memory */  	if (free_rows) {  		/* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */  		if (set->row_count * sizeof(MYSQLND_MEMORY_POOL_CHUNK *) > SIZE_MAX) { -			SET_OOM_ERROR(conn->error_info); +			SET_OOM_ERROR(*conn->error_info);  			ret = FAIL;  			goto end;  		}  		set->row_buffers = mnd_erealloc(set->row_buffers, (size_t) (set->row_count * sizeof(MYSQLND_MEMORY_POOL_CHUNK *)));  	} -	if (conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS) { +	if (conn->upsert_status->server_status & SERVER_MORE_RESULTS_EXISTS) {  		CONN_SET_STATE(conn, CONN_NEXT_RESULT_PENDING);  	} else {  		CONN_SET_STATE(conn, CONN_READY); @@ -1234,10 +1233,10 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL  		set->data_cursor = set->data;  		/* libmysql's documentation says it should be so for SELECT statements */ -		conn->upsert_status.affected_rows = set->row_count; +		conn->upsert_status->affected_rows = set->row_count;  	}  	DBG_INF_FMT("ret=%s row_count=%u warnings=%u server_status=%u", -				ret == PASS? "PASS":"FAIL", (uint) set->row_count, conn->upsert_status.warning_count, conn->upsert_status.server_status); +				ret == PASS? "PASS":"FAIL", (uint) set->row_count, conn->upsert_status->warning_count, conn->upsert_status->server_status);  end:  	PACKET_FREE(row_packet); @@ -1268,7 +1267,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result,  	result->lengths = mnd_ecalloc(result->field_count, sizeof(unsigned long));  	if (!result->result_set_memory_pool || !result->lengths) { -		SET_OOM_ERROR(conn->error_info); +		SET_OOM_ERROR(*conn->error_info);  		DBG_RETURN(NULL);  	} @@ -1277,14 +1276,14 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result,  	ret = result->m.store_result_fetch_data(conn, result, result->meta, ps_protocol TSRMLS_CC);  	if (FAIL == ret) {  		if (result->stored_data) { -			COPY_CLIENT_ERROR(conn->error_info, result->stored_data->error_info); +			COPY_CLIENT_ERROR(*conn->error_info, result->stored_data->error_info);  		} else { -			SET_OOM_ERROR(conn->error_info); +			SET_OOM_ERROR(*conn->error_info);  		}  		DBG_RETURN(NULL);  	}  	/* libmysql's documentation says it should be so for SELECT statements */ -	conn->upsert_status.affected_rows = result->stored_data->row_count; +	conn->upsert_status->affected_rows = result->stored_data->row_count;  	DBG_RETURN(result);  } @@ -1567,7 +1566,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES * result, unsigned int flags,  	if ((!result->unbuf && !set)) {  		php_error_docref(NULL TSRMLS_CC, E_WARNING, "fetch_all can be used only with buffered sets");  		if (result->conn) { -			SET_CLIENT_ERROR(result->conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "fetch_all can be used only with buffered sets"); +			SET_CLIENT_ERROR(*result->conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "fetch_all can be used only with buffered sets");  		}  		RETVAL_NULL();  		DBG_VOID_RETURN;  | 
