diff options
author | Andrey Hristov <andrey@php.net> | 2011-10-25 23:01:49 +0000 |
---|---|---|
committer | Andrey Hristov <andrey@php.net> | 2011-10-25 23:01:49 +0000 |
commit | 845d8fa10c30f68acf425e20a69d3f33fc565e41 (patch) | |
tree | de8a39dbc4aad0c5cd72cf687de48929132dac80 /ext/mysqlnd/mysqlnd_result.c | |
parent | 5e8bcbb08ac9b63ec33a69638ea6517a05a66bb6 (diff) | |
download | php-git-845d8fa10c30f68acf425e20a69d3f33fc565e41.tar.gz |
Move from directly referencing an aggregated structure to using a
pointer to a structure. The structure is still aggregated but we add
a level of indirection for possible plugins to overwrite the storage
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; |