Author: ahristov
Date: 2007-04-17 16:34:38 +0200 (Tue, 17 Apr 2007)
New Revision: 330
Removed:
branches/qcache/mysqlnd/mysqlnd_qcache.h
Modified:
branches/qcache/mysqlnd/mysqlnd.c
branches/qcache/mysqlnd/mysqlnd.h
branches/qcache/mysqlnd/mysqlnd_priv.h
branches/qcache/mysqlnd/mysqlnd_qcache.c
branches/qcache/mysqlnd/mysqlnd_wireprotocol.c
branches/qcache/mysqlnd/mysqlnd_wireprotocol.h
Log:
Merged last trunk changes into the branch
Modified: branches/qcache/mysqlnd/mysqlnd.c
===================================================================
--- branches/qcache/mysqlnd/mysqlnd.c 2007-04-17 14:11:29 UTC (rev 329)
+++ branches/qcache/mysqlnd/mysqlnd.c 2007-04-17 14:34:38 UTC (rev 330)
@@ -196,7 +196,6 @@
mysqlnd_qcache_free_cache_reference(&set->qcache);
}
pefree(set, set->persistent);
- result->data = NULL;
}
/* }}} */
@@ -205,14 +204,13 @@
void mysqlnd_internal_free_result_buffers(MYSQLND_RES *result TSRMLS_DC)
{
- if (!result->data) {
+ if (result->unbuf) {
mysqlnd_unbuffered_free_last_data(result TSRMLS_CC);
- if (result->unbuf) {
- efree(result->unbuf);
- result->unbuf = NULL;
- }
- } else {
+ efree(result->unbuf);
+ result->unbuf = NULL;
+ } else if (result->data) {
mysqlnd_free_buffered_data(result TSRMLS_CC);
+ result->data = NULL;
}
if (result->lengths) {
@@ -224,7 +222,6 @@
/* {{{ mysqlnd_internal_free_result_metadata */
-static
void mysqlnd_internal_free_result_metadata(MYSQLND_RES_METADATA *meta, zend_bool
persistent TSRMLS_DC)
{
int i;
@@ -281,6 +278,7 @@
if (result->zval_cache) {
mysqlnd_palloc_free_cache_reference(&result->zval_cache);
+ result->zval_cache = NULL;
}
}
/* }}} */
@@ -525,11 +523,11 @@
case CONN_READY:
break;
case CONN_QUIT_SENT:
- SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE,
mysqlnd_server_gone);
- return FAIL;
+ SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE,
mysqlnd_server_gone);
+ return FAIL;
default:
SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE,
- mysqlnd_out_of_sync);
+ mysqlnd_out_of_sync);
return FAIL;
}
@@ -549,7 +547,7 @@
if (!silent) {
php_error(E_WARNING, "Error while sending %s packet",
mysqlnd_command_to_text[command]);
}
- SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE,
mysqlnd_server_gone);
+ SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE,
mysqlnd_server_gone);
ret = FAIL;
} else if (ok_packet != PROT_LAST) {
ret = mysqlnd_simple_command_handle_response(conn, ok_packet, silent, command
TSRMLS_CC);
@@ -601,7 +599,8 @@
unsigned int port,
char *socket,
unsigned int mysql_flags,
- MYSQLND_ZVAL_PCACHE *zval_cache TSRMLS_DC)
+ MYSQLND_ZVAL_PCACHE *zval_cache
+ TSRMLS_DC)
{
char *transport = NULL, *errstr = NULL;
int transport_len, errcode = 0;
@@ -1195,18 +1194,21 @@
static enum_func_status
_mysqlnd_query(MYSQLND *conn, const char *query, unsigned int query_len TSRMLS_DC)
{
+ enum_func_status ret;
if (PASS != mysqlnd_simple_command(conn, COM_QUERY, query, query_len,
PROT_LAST /* we will handle the OK packet*/,
FALSE TSRMLS_CC)) {
- return FAIL;
+ return FAIL;
}
/*
Here read the result set. We don't do it in simple_command because it need
information from the ok packet. We will fetch it ourselves.
*/
- return mysqlnd_query_read_result_set_header(conn, NULL TSRMLS_CC);
+ ret = mysqlnd_query_read_result_set_header(conn, NULL TSRMLS_CC);
+
+ return ret;
}
/* }}} */
@@ -1527,7 +1529,7 @@
if (!conn->current_result) {
return NULL;
}
-
+
/* Nothing to store for UPSERT/LOAD DATA*/
if (conn->last_query_type != QUERY_SELECT || conn->state != CONN_FETCHING_DATA) {
SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE,
@@ -1540,6 +1542,7 @@
result = conn->current_result;
conn->current_result = NULL;
+ result->conn = NULL; /* store result does not reference the connection */
result->type = MYSQLND_RES_NORMAL;
result->m.fetch_row = result->m.fetch_row_normal_buffered;
result->m.fetch_lengths = mysqlnd_fetch_lengths_buffered;
@@ -1550,10 +1553,9 @@
/* Create room for 'next_extend' rows */
- result->conn = NULL; /* store result does not reference the connection */
- result->data = pecalloc(1, sizeof(MYSQLND_RES_BUFFERED), to_cache);
- result->data->data = pemalloc(next_extend * sizeof(zval **), to_cache);
- result->data->row_buffers = pemalloc(next_extend * sizeof(zend_uchar *),
to_cache);
+ result->data = pecalloc(1, sizeof(MYSQLND_RES_BUFFERED), to_cache);
+ result->data->data = pemalloc(next_extend * sizeof(zval **), to_cache);
+ result->data->row_buffers = pemalloc(next_extend * sizeof(zend_uchar *),
to_cache);
result->data->persistent = to_cache;
result->data->qcache = to_cache?
mysqlnd_qcache_get_cache_reference(conn->qcache):NULL;
result->data->references = 1;
@@ -1751,12 +1753,12 @@
const char *newstr_e = newstr + 2 * escapestr_len;
const char *end = escapestr + escapestr_len;
zend_bool escape_overflow = FALSE;
-
+
for (;escapestr < end; escapestr++) {
- uint len;
/* check unicode characters */
if (conn->charset->char_maxlen > 1 &&
conn->charset->mb_charlen(*escapestr) > 1) {
- len = conn->charset->mb_valid(escapestr, end);
+ uint len = conn->charset->mb_valid(escapestr, end);
+
/* check possible overflow */
if ((newstr + len) > newstr_e) {
escape_overflow = TRUE;
@@ -1804,12 +1806,11 @@
zend_bool escape_overflow = FALSE;
for (;escapestr < end; escapestr++) {
- uint len;
char esc = '\0';
/* check unicode characters */
if (conn->charset->char_maxlen > 1 &&
conn->charset->mb_charlen(*escapestr) > 1) {
- len = conn->charset->mb_valid(escapestr, end);
+ uint len = conn->charset->mb_valid(escapestr, end);
/* check possible overflow */
if ((newstr + len) > newstr_e) {
@@ -1864,6 +1865,7 @@
}
}
*newstr = '\0';
+
if (escape_overflow) {
return (ulong)~0;
}
@@ -2490,7 +2492,7 @@
case MYSQL_REPORT_DATA_TRUNCATION:
case MYSQL_OPT_SSL_VERIFY_SERVER_CERT:
/* currently not supported. Todo!! */
- break;
+ break;
case MYSQL_SET_CHARSET_DIR:
case MYSQL_SET_CHARSET_NAME:
case MYSQL_OPT_RECONNECT:
Modified: branches/qcache/mysqlnd/mysqlnd.h
===================================================================
--- branches/qcache/mysqlnd/mysqlnd.h 2007-04-17 14:11:29 UTC (rev 329)
+++ branches/qcache/mysqlnd/mysqlnd.h 2007-04-17 14:34:38 UTC (rev 330)
@@ -585,7 +585,7 @@
MYSQLND_FIELD * (*fetch_field)(MYSQLND_RES * const result);
MYSQLND_FIELD * (*fetch_field_direct)(const MYSQLND_RES * const result,
MYSQLND_FIELD_OFFSET fieldnr);
- unsigned long * (*fetch_lengths)(MYSQLND_RES * const result);
+ unsigned long * (*fetch_lengths)(MYSQLND_RES * const result);
void (*free_result_buffers)(MYSQLND_RES * result TSRMLS_DC); /* private */
enum_func_status (*free_result)(MYSQLND_RES * result, zend_bool implicit TSRMLS_DC);
@@ -751,23 +751,23 @@
unsigned int field_count;
/* For metadata functions */
- MYSQLND_RES_METADATA * meta;
+ MYSQLND_RES_METADATA *meta;
/* To be used with store_result() - both normal and PS */
- MYSQLND_RES_BUFFERED * data;
+ MYSQLND_RES_BUFFERED *data;
- MYSQLND_RES_UNBUFFERED * unbuf;
+ MYSQLND_RES_UNBUFFERED *unbuf;
/*
Column lengths of current row - both buffered and unbuffered.
For buffered results it duplicates the data found in **data
*/
- unsigned long *lengths;
+ unsigned long *lengths;
php_mysql_packet_row *row_packet; /* Unused for PS */
/* zval cache */
- MYSQLND_ZVAL_PCACHE *zval_cache;
+ MYSQLND_ZVAL_PCACHE *zval_cache;
struct st_mysqlnd_res_methods m;
};
@@ -822,10 +822,10 @@
/* Library related */
-PHPAPI void mysqlnd_library_init();
-PHPAPI void mysqlnd_library_end();
-PHPAPI void mysqlnd_restart_psession(MYSQLND *conn);
-PHPAPI void mysqlnd_end_psession(MYSQLND *conn);
+PHPAPI void mysqlnd_library_init();
+PHPAPI void mysqlnd_library_end();
+PHPAPI void mysqlnd_restart_psession(MYSQLND *conn);
+PHPAPI void mysqlnd_end_psession(MYSQLND *conn);
#define mysqlnd_thread_safe() TRUE
const MYSQLND_CHARSET * mysqlnd_find_charset_nr(uint charsetno);
@@ -841,7 +841,8 @@
unsigned int port,
char *socket,
unsigned int mysql_flags,
- MYSQLND_ZVAL_PCACHE *zval_cache TSRMLS_DC);
+ MYSQLND_ZVAL_PCACHE *zval_cache
+ TSRMLS_DC);
#define mysqlnd_change_user(conn, user, passwd, db) (conn)->m->change_user((conn),
(user), (passwd), (db) TSRMLS_CC)
@@ -963,8 +964,8 @@
const char * mysqlnd_field_type_name(enum mysqlnd_field_types field_type);
/* LOAD DATA LOCAL */
-PHPAPI void mysqlnd_local_infile_default(MYSQLND *conn);
-PHPAPI void mysqlnd_set_local_infile_handler(MYSQLND * const conn, const char * const
funcname);
+PHPAPI void mysqlnd_local_infile_default(MYSQLND *conn);
+PHPAPI void mysqlnd_set_local_infile_handler(MYSQLND * const conn, const char * const
funcname);
/* Simple commands */
#define mysqlnd_autocommit(conn, mode) (conn)->m->query((conn),(mode) ? "SET
AUTOCOMMIT=1":"SET AUTOCOMMIT=0", 16 TSRMLS_CC)
@@ -1008,7 +1009,9 @@
#define mysqlnd_stmt_attr_set(stmt, attr, value) (stmt)->m->set_attribute((stmt),
(attr), (value))
-PHPAPI enum_func_status mysqlnd_stmt_fetch(MYSQLND_STMT * const stmt, zend_bool * const
fetched_anything TSRMLS_DC);
+PHPAPI enum_func_status mysqlnd_stmt_fetch(MYSQLND_STMT * const stmt,
+ zend_bool * const fetched_anything
+ TSRMLS_DC);
@@ -1054,7 +1057,7 @@
PHPAPI void mysqlnd_qcache_stats(const MYSQLND_QCACHE * const cache, zval
*return_value);
MYSQLND_RES * mysqlnd_qcache_get(MYSQLND_QCACHE * const cache, const char * query,
size_t query_len);
-void mysqlnd_qcache_put(MYSQLND_QCACHE * const cache, char * query, size_t query_len,
+void mysqlnd_qcache_put(MYSQLND_QCACHE * const cache, char * query, size_t query_len,
MYSQLND_RES_BUFFERED * const result, MYSQLND_RES_METADATA * const meta);
#endif /* MYSQLND_H */
Modified: branches/qcache/mysqlnd/mysqlnd_priv.h
===================================================================
--- branches/qcache/mysqlnd/mysqlnd_priv.h 2007-04-17 14:11:29 UTC (rev 329)
+++ branches/qcache/mysqlnd/mysqlnd_priv.h 2007-04-17 14:34:38 UTC (rev 330)
@@ -163,6 +163,9 @@
void mysqlnd_internal_free_result(MYSQLND_RES *result TSRMLS_DC);
+void mysqlnd_internal_free_result_metadata(MYSQLND_RES_METADATA *meta, zend_bool
persistent TSRMLS_DC);
+
+
enum_func_status mysqlnd_handle_local_infile(MYSQLND *conn, const char *filename,
zend_bool *is_warning TSRMLS_DC);
Modified: branches/qcache/mysqlnd/mysqlnd_qcache.c
===================================================================
--- branches/qcache/mysqlnd/mysqlnd_qcache.c 2007-04-17 14:11:29 UTC (rev 329)
+++ branches/qcache/mysqlnd/mysqlnd_qcache.c 2007-04-17 14:34:38 UTC (rev 330)
@@ -23,7 +23,6 @@
#include "mysqlnd.h"
#include "mysqlnd_priv.h"
#include "mysqlnd_statistics.h"
-#include "mysqlnd_qcache.h"
#define MYSQLND_SILENT
Deleted: branches/qcache/mysqlnd/mysqlnd_qcache.h
===================================================================
--- branches/qcache/mysqlnd/mysqlnd_qcache.h 2007-04-17 14:11:29 UTC (rev 329)
+++ branches/qcache/mysqlnd/mysqlnd_qcache.h 2007-04-17 14:34:38 UTC (rev 330)
@@ -1,21 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | PHP Version 6 |
- +----------------------------------------------------------------------+
- | Copyright (c) 2006-2007 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.01 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | http://www.php.net/license/3_01.txt |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@stripped so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Authors: Georg Richter <georg@stripped> |
- | Andrey Hristov <andrey@stripped> |
- | Ulf Wendel <uwendel@stripped> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id: header,v 1.17 2006/01/01 13:09:48 sniper Exp $ */
Modified: branches/qcache/mysqlnd/mysqlnd_wireprotocol.c
===================================================================
--- branches/qcache/mysqlnd/mysqlnd_wireprotocol.c 2007-04-17 14:11:29 UTC (rev 329)
+++ branches/qcache/mysqlnd/mysqlnd_wireprotocol.c 2007-04-17 14:34:38 UTC (rev 330)
@@ -717,8 +717,8 @@
}
}
/* }}} */
-
+
/* {{{ php_mysqlnd_eof_read */
static enum_func_status
php_mysqlnd_eof_read(void *_packet, MYSQLND *conn TSRMLS_DC)
@@ -1070,7 +1070,7 @@
static enum_func_status
php_mysqlnd_read_row_ex(MYSQLND *conn, zend_uchar **buf, int buf_size,
- size_t *data_size TSRMLS_DC)
+ size_t *data_size, zend_bool persistent_alloc TSRMLS_DC)
{
enum_func_status ret = PASS;
mysqlnd_packet_header header;
@@ -1101,7 +1101,7 @@
We need a trailing \0 for the last string, in case of text-mode,
to be able to implement read-only variables.
*/
- p = new_buf = emalloc(header.size + 1);
+ p = new_buf = pemalloc(header.size + 1, persistent_alloc);
net->stream->chunk_size = header.size;
} else if (!first_iteration) {
/* Empty packet after MYSQLND_MAX_PACKET_SIZE packet. That's ok, break */
@@ -1115,7 +1115,7 @@
We need a trailing \0 for the last string, in case of text-mode,
to be able to implement read-only variables.
*/
- new_buf = erealloc(new_buf, *data_size + 1);
+ new_buf = perealloc(new_buf, *data_size + 1, persistent_alloc);
/* The position could have changed, recalculate */
p = new_buf + (*data_size - header.size);
}
@@ -1318,8 +1318,10 @@
size_t old_chunk_size = net->stream->chunk_size;
php_mysql_packet_row *packet= (php_mysql_packet_row *) _packet;
-
- if (FAIL == (ret = php_mysqlnd_read_row_ex(conn, &packet->row_buffer, 0,
&data_size TSRMLS_CC))) {
+ ret = php_mysqlnd_read_row_ex(conn, &packet->row_buffer, 0, &data_size,
+ packet->persistent_alloc
+ TSRMLS_CC);
+ if (FAIL == ret) {
goto end;
}
@@ -1365,7 +1367,8 @@
but mostly like old-API unbuffered and thus will populate this array with
value.
*/
- packet->fields = (zval **) emalloc(packet->field_count * sizeof(zval *));
+ packet->fields = (zval **) pemalloc(packet->field_count * sizeof(zval *),
+ packet->persistent_alloc);
}
if (packet->binary_protocol) {
@@ -1391,7 +1394,7 @@
{
php_mysql_packet_row *p= (php_mysql_packet_row *) _packet;
if (p->row_buffer) {
- efree(p->row_buffer);
+ pefree(p->row_buffer, p->persistent_alloc);
p->row_buffer = NULL;
}
/*
Modified: branches/qcache/mysqlnd/mysqlnd_wireprotocol.h
===================================================================
--- branches/qcache/mysqlnd/mysqlnd_wireprotocol.h 2007-04-17 14:11:29 UTC (rev 329)
+++ branches/qcache/mysqlnd/mysqlnd_wireprotocol.h 2007-04-17 14:34:38 UTC (rev 330)
@@ -257,6 +257,7 @@
zend_bool skip_extraction;
zend_bool binary_protocol;
+ zend_bool persistent_alloc;
MYSQLND_FIELD *fields_metadata;
/* If error packet, we use these */
| Thread |
|---|
| • PHP mysqlnd svn commit: r330 - branches/qcache/mysqlnd | ahristov | 17 Apr |