georg Sat Mar 8 18:33:13 2003 EDT Modified files: /php4/ext/mysqli mysqli_fe.c mysqli_nonapi.c mysqli_profiler.c mysqli_api.c php_mysqli.h mysqli.c Log: various changes for profiler
Index: php4/ext/mysqli/mysqli_fe.c diff -u php4/ext/mysqli/mysqli_fe.c:1.8 php4/ext/mysqli/mysqli_fe.c:1.9 --- php4/ext/mysqli/mysqli_fe.c:1.8 Mon Mar 3 17:36:47 2003 +++ php4/ext/mysqli/mysqli_fe.c Sat Mar 8 18:33:12 2003 @@ -15,7 +15,7 @@ | Author: Georg Richter <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ - $Id: mysqli_fe.c,v 1.8 2003/03/03 22:36:47 georg Exp $ + $Id: mysqli_fe.c,v 1.9 2003/03/08 23:33:12 georg Exp $ */ #ifdef HAVE_CONFIG_H @@ -86,6 +86,7 @@ PHP_FE(mysqli_ping, NULL) PHP_FE(mysqli_prepare, NULL) PHP_FE(mysqli_prepare_result, NULL) + PHP_FE(mysqli_profiler, NULL) PHP_FE(mysqli_query, NULL) PHP_FE(mysqli_read_query_result, NULL) PHP_FE(mysqli_real_connect, NULL) @@ -102,7 +103,6 @@ PHP_FE(mysqli_send_long_data, NULL) PHP_FE(mysqli_send_query, NULL) PHP_FALIAS(mysqli_set_opt, mysqli_options, NULL) - PHP_FE(mysqli_set_profiler_opt, NULL) PHP_FE(mysqli_slave_query, NULL) PHP_FE(mysqli_ssl_set, NULL) PHP_FE(mysqli_stat, NULL) Index: php4/ext/mysqli/mysqli_nonapi.c diff -u php4/ext/mysqli/mysqli_nonapi.c:1.6 php4/ext/mysqli/mysqli_nonapi.c:1.7 --- php4/ext/mysqli/mysqli_nonapi.c:1.6 Mon Mar 3 17:36:47 2003 +++ php4/ext/mysqli/mysqli_nonapi.c Sat Mar 8 18:33:12 2003 @@ -15,7 +15,7 @@ | Author: Georg Richter <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ - $Id: mysqli_nonapi.c,v 1.6 2003/03/03 22:36:47 georg Exp $ + $Id: mysqli_nonapi.c,v 1.7 2003/03/08 23:33:12 georg Exp $ */ #ifdef HAVE_CONFIG_H @@ -33,11 +33,14 @@ open a connection to a mysql server */ PHP_FUNCTION(mysqli_connect) { - MYSQL *mysql; - zval *object = getThis(); - char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL; - unsigned int hostname_len, username_len, passwd_len, dbname_len, socket_len; - unsigned int port=0; + MYSQL *mysql; + MYSQLI_RESOURCE *mysqli_resource; + PR_MYSQL *prmysql = NULL; + zval *object = getThis(); + char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL; + unsigned int hostname_len, username_len, passwd_len, dbname_len, socket_len; + unsigned int port=0; + struct timeval starttime; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ssssls", &hostname, &hostname_len, &username, &username_len, &passwd, &passwd_len, &dbname, &dbname_len, &port, &socket, &socket_len) == FAILURE) { @@ -59,6 +62,10 @@ } mysql = mysql_init(NULL); + if (MyG(profiler)){ + gettimeofday(&starttime, NULL); + } + if (mysql_real_connect(mysql,hostname,username,passwd,dbname,port,socket,0) == NULL) { /* Save error messages */ @@ -70,10 +77,24 @@ RETURN_FALSE; } + if (MyG(profiler)) { + prmysql = (PR_MYSQL *)MYSQLI_PROFILER_NEW(NULL, MYSQLI_PR_MYSQL, 0); + php_mysqli_profiler_timediff(starttime, &prmysql->header.elapsedtime); + MYSQLI_PROFILER_STARTTIME(prmysql); + prmysql->hostname = estrdup(hostname); + prmysql->username = estrdup(username); + prmysql->thread_id = mysql->thread_id; + } + + mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); + mysqli_resource->ptr = (void *)mysql; + mysqli_resource->prinfo = prmysql; + + if (!object) { - MYSQLI_RETURN_RESOURCE(mysql, mysqli_link_class_entry); + MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry); } else { - ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr = mysql; + ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr = mysqli_resource; } } /* }}} */ @@ -109,46 +130,70 @@ /* {{{ proto resource mysqli_query(resource link, string query, [int resultmode]) */ PHP_FUNCTION(mysqli_query) { - MYSQL *mysql; - zval *mysql_link; - MYSQL_RES *result; - char *query = NULL; - unsigned int query_len; - unsigned int resultmode = 0; + MYSQL *mysql; + zval *mysql_link; + MYSQLI_RESOURCE *mysqli_resource; + MYSQL_RES *result; + PR_MYSQL *prmysql; + PR_QUERY *prquery; + PR_RESULT *prresult; + char *query = NULL; + unsigned int query_len; + unsigned int resultmode = 0; + struct timeval starttime; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|l", &mysql_link, mysqli_link_class_entry, &query, &query_len, &resultmode) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL*, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); - /* profiler reports */ - if (MyG(profiler.active)) { - MYSQLI_PROFILER_HEADER(query); - MYSQLI_PROFILER_EXPLAIN(mysql,query); - MYSQLI_PROFILER_GETTIME; - if (mysql_real_query(mysql, query, query_len)){ - RETURN_FALSE; + /* profiling information */ + if (MyG(profiler)) { + prquery = (PR_QUERY *)MYSQLI_PROFILER_NEW(prmysql, MYSQLI_PR_QUERY, 1); + prquery->explain.query = my_estrdup(query); + if (!strncasecmp("select", query, 6)){ + if (!(MYSQLI_PROFILER_EXPLAIN(&prquery->explain, &prquery->header, mysql, query))) { + RETURN_FALSE; + } } - MYSQLI_PROFILER_REPORTTIME; } - else { - if (mysql_real_query(mysql, query, query_len)) { - RETURN_FALSE; - } + + if (mysql_real_query(mysql, query, query_len)) { + RETURN_FALSE; + } + + if (MyG(profiler)) { + MYSQLI_PROFILER_ELAPSEDTIME(prquery); + prquery->insertid = mysql_insert_id(mysql); + prquery->affectedrows = mysql_affected_rows(mysql); } if (!mysql_field_count(mysql)) { RETURN_FALSE; } + /* profiler result information */ + if (MyG(profiler)) { + gettimeofday(&starttime, NULL); + prresult = (PR_RESULT *)MYSQLI_PROFILER_NEW(prquery, MYSQLI_PR_RESULT, 1); + } + result = (resultmode == MYSQLI_USE_RESULT) ? mysql_use_result(mysql) : mysql_store_result(mysql); + + if (result && MyG(profiler)) { + MYSQLI_PROFILER_ELAPSEDTIME(prresult); + prresult->rows = result->row_count; + prresult->columns = result->field_count; + } + if (!result) { RETURN_FALSE; - } - if (MyG(profiler.active)) { - MYSQLI_PROFILER_REPORT_RESULT(result); } - MYSQLI_RETURN_RESOURCE(result, mysqli_result_class_entry); + + mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); + mysqli_resource->ptr = (void *)result; + mysqli_resource->prinfo = (void *)prresult; + MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry); } /* }}} */ Index: php4/ext/mysqli/mysqli_profiler.c diff -u php4/ext/mysqli/mysqli_profiler.c:1.1 php4/ext/mysqli/mysqli_profiler.c:1.2 --- php4/ext/mysqli/mysqli_profiler.c:1.1 Mon Mar 3 17:36:47 2003 +++ php4/ext/mysqli/mysqli_profiler.c Sat Mar 8 18:33:12 2003 @@ -15,7 +15,7 @@ | Author: Georg Richter <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ - $Id: mysqli_profiler.c,v 1.1 2003/03/03 22:36:47 georg Exp $ + $Id: mysqli_profiler.c,v 1.2 2003/03/08 23:33:12 georg Exp $ */ #ifdef HAVE_CONFIG_H @@ -27,89 +27,356 @@ #include "ext/standard/info.h" #include "php_mysqli.h" -#define DIVIDER "************************************************************" -#define DIVIDER1 "------------------------------------------------------------" - -/* {{{ void php_mysqli_profiler_header(char *query) */ -void php_mysqli_profiler_header(char *query) +/* {{{ PR_COMMON *php_mysqli_profiler_new_object(PR_COMMON *parent, unsigned int type, unsigned int settime) */ +PR_COMMON *php_mysqli_profiler_new_object(PR_COMMON *parent, unsigned int type, unsigned int settime) { - printf("%s\n", DIVIDER); - printf("File: %s\nLine: %d\n", zend_get_executed_filename(TSRMLS_C), zend_get_executed_lineno(TSRMLS_C)); - printf("Function: %s\n", get_active_function_name(TSRMLS_C)); - if (query) { - printf("SQL: %s\n", query); + PR_COMMON *prnew, *child; + + switch (type) { + case MYSQLI_PR_MYSQL: + prnew = (PR_COMMON *)ecalloc(1, sizeof(PR_MYSQL)); + break; + case MYSQLI_PR_QUERY: + prnew = (PR_COMMON *)ecalloc(1, sizeof(PR_QUERY)); + break; + case MYSQLI_PR_STMT: + prnew = (PR_COMMON *)ecalloc(1, sizeof(PR_STMT)); + break; + case MYSQLI_PR_COMMAND: + prnew = (PR_COMMON *)ecalloc(1, sizeof(PR_COMMAND)); + break; + case MYSQLI_PR_RESULT: + prnew = (PR_COMMON *)ecalloc(1, sizeof(PR_RESULT)); + break; + } + prnew->header.type = type; + prnew->header.filename = estrdup(zend_get_executed_filename(TSRMLS_C)); + prnew->header.lineno = zend_get_executed_lineno(TSRMLS_C); + prnew->header.functionname = estrdup(get_active_function_name(TSRMLS_C)); + if (settime) { + gettimeofday(&prnew->header.starttime, NULL); } -} -/* }}} */ -/* {{{ void php_mysqli_profiler_result(MYSQL_RES *) */ -void php_mysqli_profiler_result_info(MYSQL_RES *res) -{ - printf("%s\nRows returned: %d\n", DIVIDER1, mysql_num_rows(res)); + if (!parent) { + return prnew; + } + + if (!parent->header.child) { + parent->header.child = (void *)prnew; + return (prnew); + } + child = parent->header.child; + while (child->header.next != NULL) { + child = child->header.next; + } + child->header.next = (void *)prnew; + return (prnew); } /* }}} */ -/* {{{ void php_mysqli_profiler_explain(MYSQL *, char *) */ -void php_mysqli_profiler_explain(MYSQL *mysql, char *query) +/* {{{ int *php_mysqli_profiler_explain(PR_EXPLAIN *, PR_HEADER *, MYSQL *, char *) */ +int php_mysqli_profiler_explain(PR_EXPLAIN *explain, PR_HEADER *header, MYSQL *mysql, char *query) { MYSQL_RES *res; MYSQL_ROW row; - MYSQL_FIELD *fields; unsigned int i; char *newquery = (char *)emalloc(strlen(query) + 10); + sprintf (newquery, "EXPLAIN %s", query); mysql_real_query(mysql, newquery, strlen(newquery)); efree (newquery); if (mysql_errno(mysql)) { - printf ("%s\nError (%d): %s\n", DIVIDER1, mysql_errno(mysql), mysql_error(mysql)); - return; + header->error = mysql_errno(mysql); + header->errormsg = my_estrdup(mysql_error(mysql)); + return 0; } - res = mysql_use_result(mysql); + res = mysql_store_result(mysql); - printf ("%s\nEXPLAIN:\n", DIVIDER1); - fields = mysql_fetch_fields(res); - while ((row = mysql_fetch_row(res))) { - for (i=0; i < mysql_num_fields(res); i++) { - printf ("%20s: %s\n", fields[i].name, row[i]); - } - printf("\n"); + if (!(explain->exp_cnt = mysql_num_rows(res))) { + return 0; } + explain->exp_table = (char **)emalloc(sizeof(char *) * explain->exp_cnt); + explain->exp_type = (char **)emalloc(sizeof(char *) * explain->exp_cnt); + explain->exp_key = (char **)emalloc(sizeof(char *) * explain->exp_cnt); + explain->exp_rows = (ulong *)emalloc(sizeof(ulong) * explain->exp_cnt); + + for (i=0; i < explain->exp_cnt; i++) { + row = mysql_fetch_row(res); + explain->exp_table[i] = my_estrdup(row[2]); + explain->exp_type[i] = my_estrdup(row[3]); + explain->exp_key[i] = my_estrdup(row[4]); + explain->exp_rows[i] = atol(row[8]); + } + mysql_free_result(res); - return; + return 1; } /* }}} */ -/* {{{ void php_mysqli_profiler_elapsed_time() */ -void php_mysqli_profiler_elapsed_time() +/* {{{ void php_mysqli_profiler_timediff(struct timeval, struct timeval *) */ +void php_mysqli_profiler_timediff(struct timeval starttime, struct timeval *elapsed) { - struct timeval end, elapsed; + struct timeval end; gettimeofday(&end, NULL); - elapsed.tv_sec = end.tv_sec - MyG(profiler.start.tv_sec); - elapsed.tv_usec = end.tv_usec - MyG(profiler.start.tv_usec); - if (elapsed.tv_usec < 0) { - --(elapsed.tv_sec); - elapsed.tv_usec = 1000000; - } - printf("%s\nElapsed time: %3d.%06d seconds\n", DIVIDER1, elapsed.tv_sec, elapsed.tv_usec); + elapsed->tv_sec = end.tv_sec - starttime.tv_sec; + elapsed->tv_usec = end.tv_usec - starttime.tv_usec; + if (elapsed->tv_usec < 0) { + --(elapsed->tv_sec); + elapsed->tv_usec = 1000000; + } + return; +} +/* }}} */ + +/* {{{ char *php_mysqli_profiler_indent(int) */ +char *php_mysqli_profiler_indent(int i) +{ + char *ret = (char *)ecalloc(i*4+1, sizeof(char)); + memset(ret, 0x20, i*4); + return ret; +} +/* }}} */ + +/* {{{ void php_mysqli_profiler_report_header(PR_HEADER, char *) */ +void php_mysqli_profiler_report_header(PR_HEADER header, char *ident) +{ + switch (header.type) { + case MYSQLI_PR_MYSQL: + printf("%s[Connection]\n", ident); + php_mysqli_profiler_timediff(header.starttime, &header.lifetime); + break; + case MYSQLI_PR_QUERY: + printf("%s[Query]\n", ident); + break; + case MYSQLI_PR_STMT: + printf("%s[Statement]\n", ident); + php_mysqli_profiler_timediff(header.starttime, &header.lifetime); + break; + case MYSQLI_PR_RESULT: + printf("%s[Resultset]\n", ident); + php_mysqli_profiler_timediff(header.starttime, &header.lifetime); + break; + case MYSQLI_PR_COMMAND: + printf("%s[Command]\n", ident); + break; + } + printf ("%sFunction: %s\n", ident, header.functionname); + printf ("%sFile: %s\n", ident, header.filename); + printf ("%sLine: %d\n", ident, header.lineno); + printf ("%sExecution time: %ld.%06ld\n", ident, header.elapsedtime.tv_sec, header.elapsedtime.tv_usec); + if (header.lifetime.tv_sec + header.lifetime.tv_usec) { + printf ("%sLife time: %ld.%06ld\n", ident, header.lifetime.tv_sec, header.lifetime.tv_usec); + } + if (header.error) { + printf("%sError: %s (%ld)\n", ident, header.errormsg, header.error); + } + + /* free header */ + my_efree(header.functionname); + my_efree(header.filename); + my_efree(header.errormsg); +} +/* }}} */ + +/* {{{ void php_mysqli_profiler_report_explain(PR_EXPLAIN, char *) */ +void php_mysqli_profiler_report_explain(PR_EXPLAIN explain, char *ident) +{ + int i; + + if (explain.query) { + printf("%sQuery: %s\n", ident, explain.query); + } + + if (explain.exp_cnt) { + printf("%sTable(s):", ident); + for (i=0; i < explain.exp_cnt; i++) { + printf(" %s%c", explain.exp_table[i], (i == explain.exp_cnt - 1) ? '\n' : ','); + my_efree(explain.exp_table[i]); + } + printf("%sJoin-Types(s):", ident); + for (i=0; i < explain.exp_cnt; i++) { + printf(" %s%c", explain.exp_type[i], (i == explain.exp_cnt - 1) ? '\n' : ','); + my_efree(explain.exp_type[i]); + } + printf("%sKey(s):", ident); + for (i=0; i < explain.exp_cnt; i++) { + printf(" %s%c", explain.exp_key[i], (i == explain.exp_cnt - 1) ? '\n' : ','); + my_efree(explain.exp_key[i]); + } + printf("%sRow(s):", ident); + for (i=0; i < explain.exp_cnt; i++) { + printf(" %ld%c", explain.exp_rows[i], (i == explain.exp_cnt - 1) ? '\n' : ','); + } + my_efree(explain.exp_table); + my_efree(explain.exp_type); + my_efree(explain.exp_key); + my_efree(explain.exp_rows); + } + /* free explain */ + my_efree(explain.query); +} +/* }}} */ + +/* {{{ php_mysqli_profiler_report_mysql(PR_MYSQL *, int) */ +void php_mysqli_profiler_report_mysql(PR_MYSQL *prmysql, int depth) +{ + char *ident = php_mysqli_profiler_indent(depth); + + php_mysqli_profiler_report_header(prmysql->header, ident); + + printf ("%sHost: %s\n", ident, prmysql->hostname); + printf ("%sUser: %s\n", ident, prmysql->username); + printf ("%sThread-id: %d\n", ident, prmysql->thread_id); + if (!prmysql->closed) { + printf ("%sWarning: connection wasn't closed by mysqli_close()\n", ident); + } + printf("\n"); + + my_efree(prmysql->hostname); + my_efree(prmysql->username); + + efree(ident); +} +/* }}} */ + +/* {{{ void php_mysqli_profiler_report_query(PR_QUERY *, int) */ +void php_mysqli_profiler_report_query(PR_QUERY *prquery, int depth) +{ + char *ident = php_mysqli_profiler_indent(depth); + + php_mysqli_profiler_report_header(prquery->header, ident); + php_mysqli_profiler_report_explain(prquery->explain, ident); + + if (prquery->affectedrows > 0) { + printf ("%saffected rows: %ld\n", ident, prquery->affectedrows); + } + if (prquery->insertid) { + printf ("%sinsert id: %ld\n", ident, prquery->insertid); + } + + + printf("\n"); + efree(ident); +} +/* }}} */ + +/* {{{ void php_mysqli_profiler_report_stmt(PR_STMT *, int) */ +void php_mysqli_profiler_report_stmt(PR_STMT *prstmt, int depth) +{ + char *ident = php_mysqli_profiler_indent(depth); + + php_mysqli_profiler_report_header(prstmt->header, ident); + php_mysqli_profiler_report_explain(prstmt->explain, ident); + + printf("\n"); + efree(ident); +} +/* }}} */ + +/* {{{ void php_mysqli_profiler_report_result(PR_RESULT *, int) */ +void php_mysqli_profiler_report_result(PR_RESULT *prresult, int depth) +{ + char *ident = php_mysqli_profiler_indent(depth); + + php_mysqli_profiler_report_header(prresult->header, ident); + + printf ("%sColumns: %d\n", ident, prresult->columns); + printf ("%sRows: %ld\n", ident, prresult->rows); + printf ("%sFetched rows: %ld\n", ident, prresult->fetched_rows); + if (!prresult->closed) { + printf ("%sWarning: resultset wasn't closed by mysqli_free_result()\n", ident); + } + printf("\n"); + efree(ident); +} +/* }}} */ + +/* {{{ void php_mysqli_profiler_report_command(PR_COMMAND *, int) */ +void php_mysqli_profiler_report_command(PR_COMMAND *prcommand, int depth) +{ + char *ident = php_mysqli_profiler_indent(depth); + + php_mysqli_profiler_report_header(prcommand->header, ident); + if (prcommand->returnvalue) { + printf("%sReturnvalue: %s\n", ident, prcommand->returnvalue); + efree(prcommand->returnvalue); + } + printf("\n"); + efree(ident); +} +/* }}} */ + +/* {{{ php_mysqli_profiler_report(PR_COMMON *, int) */ +void php_mysqli_profiler_report(PR_COMMON *current, int depth) +{ + PR_COMMON *child; + PR_COMMON *next; + switch (current->header.type) { + case MYSQLI_PR_MYSQL: + { + PR_MYSQL *prmysql = (PR_MYSQL *)current; + php_mysqli_profiler_report_mysql(prmysql, depth); + } + break; + case MYSQLI_PR_COMMAND: + { + PR_COMMAND *prcommand = (PR_COMMAND *)current; + child = NULL; + php_mysqli_profiler_report_command(prcommand, depth); + } + break; + case MYSQLI_PR_RESULT: + { + PR_RESULT *prresult = (PR_RESULT *)current; + php_mysqli_profiler_report_result(prresult, depth); + } + break; + case MYSQLI_PR_STMT: + case MYSQLI_PR_STMT_RESULT: + { + PR_STMT *prstmt = (PR_STMT *)current; + php_mysqli_profiler_report_stmt(prstmt, depth); + } + break; + case MYSQLI_PR_QUERY: + case MYSQLI_PR_QUERY_RESULT: + { + PR_QUERY *prquery = (PR_QUERY *)current; + php_mysqli_profiler_report_query(prquery, depth); + } + break; + } + child = current->header.child; + if (child) { + php_mysqli_profiler_report(child, depth+1); + } + + next = (current->header.next) ? current->header.next : NULL; + + if (next) { + php_mysqli_profiler_report(next, depth); + } + efree(current); + return; } /* }}} */ -/* {{{ proto void mysqli_set_profiler_opt (bool profiler) +/* {{{ proto void mysqli_profiler (bool profiler) */ -PHP_FUNCTION(mysqli_set_profiler_opt) +PHP_FUNCTION(mysqli_profiler) { int flags; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &flags) == FAILURE) { return; } - MyG(profiler.active) = flags; + MyG(profiler) = flags; return; } Index: php4/ext/mysqli/mysqli_api.c diff -u php4/ext/mysqli/mysqli_api.c:1.17 php4/ext/mysqli/mysqli_api.c:1.18 --- php4/ext/mysqli/mysqli_api.c:1.17 Sat Feb 22 02:47:46 2003 +++ php4/ext/mysqli/mysqli_api.c Sat Mar 8 18:33:12 2003 @@ -15,7 +15,7 @@ | Author: Georg Richter <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ - $Id: mysqli_api.c,v 1.17 2003/02/22 07:47:46 georg Exp $ + $Id: mysqli_api.c,v 1.18 2003/03/08 23:33:12 georg Exp $ */ #ifdef HAVE_CONFIG_H @@ -36,15 +36,19 @@ { MYSQL *mysql; zval *mysql_link; - my_ulonglong rc; + PR_MYSQL *prmysql; + my_ulonglong rc; + PR_COMMAND *prcommand; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_PROFILER_COMMAND_START(prcommand, prmysql); rc = mysql_affected_rows(mysql); + MYSQLI_PROFILER_COMMAND_RETURNLONG(prcommand, rc); MYSQLI_RETURN_LONG_LONG(rc); } /* }}} */ @@ -53,16 +57,23 @@ */ PHP_FUNCTION(mysqli_autocommit) { - MYSQL *mysql; - zval *mysql_link; - unsigned long automode; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; + PR_COMMAND *prcommand; + unsigned long rc; + unsigned long automode; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ob", &mysql_link, mysqli_link_class_entry, &automode) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); - RETURN_BOOL((long) mysql_autocommit(mysql, automode)); + MYSQLI_PROFILER_COMMAND_START(prcommand, prmysql); + rc = (long) mysql_autocommit(mysql, automode); + MYSQLI_PROFILER_COMMAND_RETURNLONG(prcommand, rc); + + RETURN_BOOL(rc); } /* }}} */ @@ -71,15 +82,18 @@ PHP_FUNCTION(mysqli_bind_param) { - zval ***args; - int argc = ZEND_NUM_ARGS(); - int i; - int num_vars; - int start = 0; - int ofs; - STMT *stmt; - MYSQL_BIND *bind; - zval **object; + zval ***args; + int argc = ZEND_NUM_ARGS(); + int i; + int num_vars; + int start = 0; + int ofs; + STMT *stmt; + MYSQL_BIND *bind; + zval **object; + PR_STMT *prstmt; + PR_COMMAND *prcommand; + unsigned long rc; /* check if number of parameters > 2 and odd */ if (argc < 3 || !(argc & 1)) { @@ -100,11 +114,11 @@ efree(args); RETURN_FALSE; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, args[0], "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, args[0], "mysqli_stmt"); start = 1; } else { object = &(getThis()); - MYSQLI_FETCH_RESOURCE(stmt, STMT *, object, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, object, "mysqli_stmt"); } @@ -162,7 +176,11 @@ } } - if (mysql_bind_param(stmt->stmt, bind)) { + MYSQLI_PROFILER_COMMAND_START(prcommand, prstmt); + rc = mysql_bind_param(stmt->stmt, bind); + MYSQLI_PROFILER_COMMAND_RETURNLONG(prcommand, rc); + + if (rc) { efree(args); efree(bind); RETURN_FALSE; @@ -199,12 +217,15 @@ int argc = ZEND_NUM_ARGS(); zval **object; int i; - int start = 0; - int var_cnt; - int ofs; + int start = 0; + int var_cnt; + int ofs; long col_type; + ulong rc; STMT *stmt; MYSQL_BIND *bind; + PR_STMT *prstmt; + PR_COMMAND *prcommand; if (argc < 2) { WRONG_PARAM_COUNT; @@ -222,11 +243,11 @@ efree(args); RETURN_FALSE; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, args[0], "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, args[0], "mysqli_stmt"); start = 1; } else { object = &(getThis()); - MYSQLI_FETCH_RESOURCE(stmt, STMT *, object, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, object, "mysqli_stmt"); } var_cnt = argc - start; @@ -310,7 +331,11 @@ } } - if (mysql_bind_result(stmt->stmt, bind)) { + MYSQLI_PROFILER_COMMAND_START(prcommand, prstmt); + rc = mysql_bind_result(stmt->stmt, bind); + MYSQLI_PROFILER_COMMAND_RETURNLONG(prcommand, rc); + + if (rc) { efree(bind); efree(args); php_clear_stmt_bind(stmt); @@ -336,17 +361,23 @@ */ PHP_FUNCTION(mysqli_change_user) { - MYSQL *mysql; - zval *mysql_link = NULL; - char *user, *password, *dbname; - int user_len, password_len, dbname_len; + MYSQL *mysql; + zval *mysql_link = NULL; + char *user, *password, *dbname; + int user_len, password_len, dbname_len; + ulong rc; + PR_COMMAND *prcommand; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osss", &mysql_link, mysqli_link_class_entry, &user, &user_len, &password, &password_len, &dbname, &dbname_len) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); - if (mysql_change_user(mysql, user, password, dbname)) { + MYSQLI_PROFILER_COMMAND_START(prcommand, prmysql); + rc = mysql_change_user(mysql, user, password, dbname); + MYSQLI_PROFILER_COMMAND_RETURNLONG(prcommand, rc); + if (rc) { RETURN_FALSE; } @@ -358,15 +389,23 @@ */ PHP_FUNCTION(mysqli_character_set_name) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; + char *charsetname; + PR_COMMAND *prcommand; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); - RETURN_STRING((char *)mysql_character_set_name(mysql), 1); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); + + MYSQLI_PROFILER_COMMAND_START(prcommand, prmysql); + charsetname = (char *)mysql_character_set_name(mysql); + MYSQLI_PROFILER_COMMAND_RETURNSTRING(prcommand, charsetname); + + RETURN_STRING(charsetname, 1); } /* }}} */ @@ -374,16 +413,26 @@ close connection */ PHP_FUNCTION(mysqli_close) { - zval *mysql_link; - MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; + MYSQL *mysql; + PR_COMMON *current; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); mysql_close(mysql); + + if (MyG(profiler)) { + prmysql->closed = 1; + } + current = (PR_COMMON *)prmysql; + if (MyG(profiler)) { + php_mysqli_profiler_report(current, 0); + } MYSQLI_CLEAR_RESOURCE(&mysql_link); RETURN_TRUE; } @@ -393,14 +442,20 @@ */ PHP_FUNCTION(mysqli_commit) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; + PR_COMMAND *prcommand; + ulong rc; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); - RETURN_BOOL(mysql_commit(mysql)); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_PROFILER_COMMAND_START(prcommand, prmysql); + rc = mysql_commit(mysql); + MYSQLI_PROFILER_COMMAND_RETURNLONG(prcommand, rc); + RETURN_BOOL(rc); } /* }}} */ @@ -408,23 +463,26 @@ */ PHP_FUNCTION(mysqli_data_seek) { - MYSQL_RES *result; - zval *mysql_result; - - long offset; + MYSQL_RES *result; + zval *mysql_result; + PR_RESULT *prresult; + PR_COMMAND *prcommand; + long offset; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Orl", &mysql_result, mysqli_result_class_entry, &mysql_result, &offset) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); + MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, prresult, PR_RESULT *, &mysql_result, "mysqli_result"); if (result->handle && result->handle->status == MYSQL_STATUS_USE_RESULT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function cannot be used with MYSQL_USE_RESULT"); RETURN_LONG(0); } + MYSQLI_PROFILER_COMMAND_START(prcommand, prresult); mysql_data_seek(result, offset); + MYSQLI_PROFILER_COMMAND_RETURNSTRING(prcommand, NULL); return; } /* }}} */ @@ -449,14 +507,18 @@ */ PHP_FUNCTION(mysqli_disable_reads_from_master) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; + PR_COMMAND *prcommand; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_PROFILER_COMMAND_START(prcommand, prmysql); mysql_disable_reads_from_master(mysql); + MYSQLI_PROFILER_COMMAND_RETURNSTRING(prcommand, NULL); RETURN_TRUE; } /* }}} */ @@ -465,14 +527,18 @@ */ PHP_FUNCTION(mysqli_disable_rpl_parse) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; + PR_COMMAND *prcommand; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_PROFILER_COMMAND_START(prcommand, prmysql); mysql_disable_rpl_parse(mysql); + MYSQLI_PROFILER_COMMAND_RETURNSTRING(prcommand, NULL); RETURN_TRUE; } /* }}} */ @@ -481,15 +547,22 @@ */ PHP_FUNCTION(mysqli_dump_debug_info) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; + PR_COMMAND *prcommand; + ulong rc; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); + + MYSQLI_PROFILER_COMMAND_START(prcommand, prmysql); + rc = mysql_dump_debug_info(mysql); + MYSQLI_PROFILER_COMMAND_RETURNLONG(prcommand, rc); - if (mysql_dump_debug_info(mysql)) { + if (rc) { RETURN_FALSE; } RETURN_TRUE; @@ -500,15 +573,19 @@ */ PHP_FUNCTION(mysqli_enable_reads_from_master) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; + PR_COMMAND *prcommand; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_PROFILER_COMMAND_START(prcommand, prmysql); mysql_enable_reads_from_master(mysql); + MYSQLI_PROFILER_COMMAND_RETURNSTRING(prcommand, NULL); RETURN_TRUE; } /* }}} */ @@ -517,15 +594,19 @@ */ PHP_FUNCTION(mysqli_enable_rpl_parse) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; + PR_COMMAND *prcommand; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_PROFILER_COMMAND_START(prcommand, prmysql); mysql_enable_rpl_parse(mysql); + MYSQLI_PROFILER_COMMAND_RETURNSTRING(prcommand, NULL); RETURN_TRUE; } /* }}} */ @@ -534,13 +615,14 @@ */ PHP_FUNCTION(mysqli_errno) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_LONG(mysql_errno(mysql)); } /* }}} */ @@ -549,13 +631,14 @@ */ PHP_FUNCTION(mysqli_error) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_STRING((char *)mysql_error(mysql),1); } /* }}} */ @@ -564,14 +647,15 @@ */ PHP_FUNCTION(mysqli_execute) { - STMT *stmt; - zval *mysql_stmt; - unsigned int i; + STMT *stmt; + zval *mysql_stmt; + unsigned int i; + PR_STMT *prstmt; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, &mysql_stmt, "mysqli_stmt"); if (stmt->type == FETCH_SIMPLE) { for (i = 0; i < stmt->var_cnt; i++) { @@ -607,15 +691,16 @@ */ PHP_FUNCTION(mysqli_fetch) { - STMT *stmt; - zval *mysql_stmt; - unsigned int i; - ulong ret; + STMT *stmt; + zval *mysql_stmt; + unsigned int i; + ulong ret; + PR_STMT *prstmt; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, &mysql_stmt, "mysqli_stmt"); /* reset buffers */ @@ -676,15 +761,16 @@ */ PHP_FUNCTION(mysqli_fetch_field) { - MYSQL_RES *result; - zval *mysql_result; + MYSQL_RES *result; + zval *mysql_result; MYSQL_FIELD *field; + PR_RESULT *prresult; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); + MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, prresult, PR_RESULT *, &mysql_result, "mysqli_result"); if (!(field = mysql_fetch_field(result))) { RETURN_FALSE; @@ -708,10 +794,11 @@ */ PHP_FUNCTION(mysqli_fetch_fields) { - MYSQL_RES *result; - zval *mysql_result; - MYSQL_FIELD *field; - zval *obj; + MYSQL_RES *result; + zval *mysql_result; + MYSQL_FIELD *field; + zval *obj; + PR_RESULT *prresult; unsigned int i; @@ -719,7 +806,7 @@ return; } - MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); + MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, prresult, PR_RESULT *, &mysql_result, "mysqli_result"); if (!(field = mysql_fetch_field(result))) { RETURN_FALSE; @@ -753,16 +840,17 @@ */ PHP_FUNCTION(mysqli_fetch_field_direct) { - MYSQL_RES *result; - zval *mysql_result; + MYSQL_RES *result; + zval *mysql_result; MYSQL_FIELD *field; - int offset; + int offset; + PR_RESULT *prresult; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_result, mysqli_result_class_entry, &offset) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); + MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, prresult, PR_RESULT *, &mysql_result, "mysqli_result"); if (!(field = mysql_fetch_field_direct(result,offset))) { RETURN_FALSE; @@ -786,17 +874,18 @@ */ PHP_FUNCTION(mysqli_fetch_lengths) { - MYSQL_RES *result; - zval *mysql_result; - unsigned int i; - unsigned long *ret; + MYSQL_RES *result; + zval *mysql_result; + unsigned int i; + unsigned long *ret; + PR_RESULT *prresult; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); + MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, prresult, PR_RESULT *, &mysql_result, "mysqli_result"); if (!(ret = mysql_fetch_lengths(result))) { RETURN_FALSE; @@ -822,13 +911,14 @@ */ PHP_FUNCTION(mysqli_field_count) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_LONG(mysql_field_count(mysql)); } @@ -838,14 +928,15 @@ */ PHP_FUNCTION(mysqli_field_seek) { - MYSQL_RES *result; - zval *mysql_result; - unsigned int fieldnr; + MYSQL_RES *result; + zval *mysql_result; + unsigned int fieldnr; + PR_RESULT *prresult; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_result, mysqli_result_class_entry, &fieldnr) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); + MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, prresult, PR_RESULT *, &mysql_result, "mysqli_result"); if (fieldnr < 0 || fieldnr >= mysql_num_fields(result)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field offset is invalid for resultset"); @@ -861,13 +952,14 @@ */ PHP_FUNCTION(mysqli_field_tell) { - MYSQL_RES *result; - zval *mysql_result; + MYSQL_RES *result; + zval *mysql_result; + PR_RESULT *prresult; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); + MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, prresult, PR_RESULT *, &mysql_result, "mysqli_result"); RETURN_LONG(mysql_field_tell(result)); } @@ -877,15 +969,19 @@ */ PHP_FUNCTION(mysqli_free_result) { - MYSQL_RES *result; - zval *mysql_result; + MYSQL_RES *result; + zval *mysql_result; + PR_RESULT *prresult; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); + MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, prresult, PR_RESULT *, &mysql_result, "mysqli_result"); - mysql_free_result(result); + mysql_free_result(result); + if (MyG(profiler)) { + prresult->closed = 1; + } MYSQLI_CLEAR_RESOURCE(&mysql_result); RETURN_TRUE; @@ -900,17 +996,18 @@ } /* }}} */ -/* {{{ proto string mysqli_get_host_info +/* {{{ proto string mysqli_get_host_info (resource link) */ PHP_FUNCTION(mysqli_get_host_info) { - MYSQL *mysql; - zval *mysql_link = NULL; + MYSQL *mysql; + zval *mysql_link = NULL; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_STRING((char *)mysql_get_host_info(mysql), 1); } @@ -920,46 +1017,49 @@ */ PHP_FUNCTION(mysqli_get_proto_info) { - MYSQL *mysql; - zval *mysql_link = NULL; + MYSQL *mysql; + zval *mysql_link = NULL; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_LONG(mysql_get_proto_info(mysql)); } /* }}} */ -/* {{{ proto string mysqli_get_server_info +/* {{{ proto string mysqli_get_server_info(resource link) */ PHP_FUNCTION(mysqli_get_server_info) { - MYSQL *mysql; - zval *mysql_link = NULL; + MYSQL *mysql; + zval *mysql_link = NULL; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_STRING((char *)mysql_get_server_info(mysql), 1); } /* }}} */ -/* {{{ proto int mysqli_get_server_version +/* {{{ proto int mysqli_get_server_version(resource link) */ PHP_FUNCTION(mysqli_get_server_version) { MYSQL *mysql; zval *mysql_link = NULL; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_LONG(mysql_get_server_version(mysql)); } @@ -970,14 +1070,15 @@ */ PHP_FUNCTION(mysqli_info) { - MYSQL *mysql; - char *info = NULL; - zval *mysql_link = NULL; + MYSQL *mysql; + char *info = NULL; + zval *mysql_link = NULL; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); if (!(info = (char *)mysql_info(mysql))) { RETURN_FALSE; @@ -991,8 +1092,9 @@ initialize mysqli */ PHP_FUNCTION(mysqli_init) { - MYSQL *mysql = mysql_init(NULL); - MYSQLI_RETURN_RESOURCE(mysql, mysqli_link_class_entry); + MYSQLI_RESOURCE *mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); + mysqli_resource->ptr = (void *)mysql_init(NULL); + MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry); } /* }}} */ @@ -1001,13 +1103,14 @@ PHP_FUNCTION(mysqli_insert_id) { MYSQL *mysql; - my_ulonglong rc; + my_ulonglong rc; zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); rc = mysql_insert_id(mysql); MYSQLI_RETURN_LONG_LONG(rc) } @@ -1017,14 +1120,15 @@ */ PHP_FUNCTION(mysqli_kill) { - MYSQL *mysql; - zval *mysql_link; - int processid; + MYSQL *mysql; + zval *mysql_link; + int processid; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_link, mysqli_link_class_entry, &processid) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); if (mysql_kill(mysql, processid)) { RETURN_FALSE; @@ -1037,15 +1141,16 @@ /* {{{ proto bool mysqli_master_query(resource link, string query) */ PHP_FUNCTION(mysqli_master_query) { - MYSQL *mysql; - zval *mysql_link; - char *query = NULL; - unsigned int query_len; + MYSQL *mysql; + zval *mysql_link; + char *query = NULL; + unsigned int query_len; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); if (mysql_master_query(mysql, query, query_len)) { RETURN_FALSE; @@ -1058,13 +1163,14 @@ */ PHP_FUNCTION(mysqli_num_fields) { - MYSQL_RES *result; - zval *mysql_result; + MYSQL_RES *result; + zval *mysql_result; + PR_RESULT *prresult; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); + MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, prresult, PR_RESULT *, &mysql_result, "mysqli_result"); RETURN_LONG(mysql_num_fields(result)); @@ -1075,20 +1181,26 @@ */ PHP_FUNCTION(mysqli_num_rows) { - MYSQL_RES *result; - zval *mysql_result; + MYSQL_RES *result; + zval *mysql_result; + PR_RESULT *prresult; + PR_COMMAND *prcommand; + ulong rc; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); + MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, prresult, PR_RESULT *, &mysql_result, "mysqli_result"); if (result->handle && result->handle->status == MYSQL_STATUS_USE_RESULT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function cannot be used with MYSQL_USE_RESULT"); RETURN_LONG(0); } - RETURN_LONG(mysql_num_rows(result)); + MYSQLI_PROFILER_COMMAND_START(prcommand, prresult); + rc = mysql_num_rows(result); + MYSQLI_PROFILER_COMMAND_RETURNLONG(prcommand, rc); + RETURN_LONG(rc); } /* }}} */ @@ -1096,17 +1208,18 @@ set options */ PHP_FUNCTION(mysqli_options) { - MYSQL *mysql; - zval *mysql_link = NULL; - zval *mysql_value; - long mysql_option; - unsigned int l_value; - long ret; + MYSQL *mysql; + zval *mysql_link = NULL; + zval *mysql_value; + long mysql_option; + unsigned int l_value; + long ret; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oslz", &mysql_link, mysqli_link_class_entry, &mysql_option, &mysql_value) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); switch (Z_TYPE_PP(&mysql_value)) { case IS_STRING: @@ -1131,13 +1244,14 @@ return the number of parameter for the given statement */ PHP_FUNCTION(mysqli_param_count) { - STMT *stmt; - zval *mysql_stmt; + STMT *stmt; + zval *mysql_stmt; + PR_STMT *prstmt; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, &mysql_stmt, "mysqli_stmt"); RETURN_LONG(mysql_param_count(stmt->stmt)); } @@ -1147,13 +1261,14 @@ */ PHP_FUNCTION(mysqli_ping) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_LONG(mysql_ping(mysql)); } /* }}} */ @@ -1162,27 +1277,54 @@ */ PHP_FUNCTION(mysqli_prepare) { - MYSQL *mysql; - STMT *stmt; - char *query = NULL; - unsigned int query_len; - zval *mysql_link; + MYSQL *mysql; + STMT *stmt; + PR_MYSQL *prmysql; + PR_STMT *prstmt; + char *query = NULL; + unsigned int query_len; + zval *mysql_link; + MYSQLI_RESOURCE *mysqli_resource; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",&mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); stmt = (STMT *)ecalloc(1,sizeof(STMT)); stmt->var_cnt = 0; + + /* profiling information */ + if (MyG(profiler)) { + prstmt = (PR_STMT *)MYSQLI_PROFILER_NEW(prmysql, MYSQLI_PR_STMT, 1); + prstmt->explain.query = my_estrdup(query); + if (!strncasecmp("select", query, 6)){ + if (!(MYSQLI_PROFILER_EXPLAIN(&prstmt->explain, &prstmt->header, mysql, query))) { + RETURN_FALSE; + } + } + } stmt->stmt = mysql_prepare(mysql, query, query_len); + if (MyG(profiler)) { + MYSQLI_PROFILER_ELAPSEDTIME(prstmt); + if (!stmt->stmt) { + prstmt->header.error = mysql_errno(mysql); + prstmt->header.errormsg = my_estrdup(mysql_error(mysql)); + } else { + prstmt->param_cnt = mysql_param_count(stmt->stmt); + prstmt->field_cnt = stmt->stmt->field_count; + } + } + if (!stmt->stmt) { efree(stmt); RETURN_FALSE; } - MYSQLI_RETURN_RESOURCE(stmt, mysqli_stmt_class_entry); + mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); + mysqli_resource->ptr = (void *)stmt; + MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_stmt_class_entry); } /* }}} */ @@ -1190,14 +1332,15 @@ */ PHP_FUNCTION(mysqli_prepare_result) { - STMT *stmt; - MYSQL_RES *result; - zval *mysql_stmt; + STMT *stmt; + MYSQL_RES *result; + zval *mysql_stmt; + PR_STMT *prstmt; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, &mysql_stmt, "mysqli_stmt"); if (!(result = mysql_prepare_result(stmt->stmt))){ RETURN_FALSE; @@ -1211,13 +1354,14 @@ */ PHP_FUNCTION(mysqli_read_query_result) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); if (mysql_read_query_result(mysql)) { RETURN_FALSE; @@ -1231,11 +1375,12 @@ open a connection to a mysql server */ PHP_FUNCTION(mysqli_real_connect) { - MYSQL *mysql; - char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL; + MYSQL *mysql; + char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL; unsigned int hostname_len, username_len, passwd_len, dbname_len, socket_len; unsigned int port=0, flags=0; - zval *mysql_link; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|sssslsl", &mysql_link, mysqli_link_class_entry, &hostname, &hostname_len, &username, &username_len, &passwd, &passwd_len, &dbname, &dbname_len, &port, &socket, &socket_len, @@ -1261,7 +1406,7 @@ } } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); if (mysql_real_connect(mysql,hostname,username,passwd,dbname,port,socket,flags) == NULL) { /* Save error messages */ @@ -1278,15 +1423,16 @@ */ PHP_FUNCTION(mysqli_real_query) { - MYSQL *mysql; - zval *mysql_link; - char *query = NULL; - unsigned int query_len; + MYSQL *mysql; + zval *mysql_link; + char *query = NULL; + unsigned int query_len; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); if (mysql_real_query(mysql, query, query_len)) { RETURN_FALSE; @@ -1298,15 +1444,16 @@ /* {{{ proto string mysqli_real_escape_string(resource link, string escapestr) close statement */ PHP_FUNCTION(mysqli_real_escape_string) { - MYSQL *mysql; - zval *mysql_link = NULL; - char *escapestr, *newstr; - int escapestr_len, newstr_len; + MYSQL *mysql; + zval *mysql_link = NULL; + char *escapestr, *newstr; + int escapestr_len, newstr_len; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &escapestr, &escapestr_len) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); newstr = emalloc(2 * escapestr_len + 1); newstr_len = mysql_real_escape_string(mysql, newstr, escapestr, escapestr_len); @@ -1320,13 +1467,14 @@ */ PHP_FUNCTION(mysqli_reload) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_BOOL(!mysql_reload(mysql)); } @@ -1336,13 +1484,14 @@ */ PHP_FUNCTION(mysqli_rollback) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_BOOL(mysql_rollback(mysql)); } @@ -1352,13 +1501,14 @@ */ PHP_FUNCTION(mysqli_rpl_parse_enabled) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_LONG(mysql_rpl_parse_enabled(mysql)); } @@ -1368,13 +1518,14 @@ */ PHP_FUNCTION(mysqli_rpl_probe) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); if (mysql_rpl_probe(mysql)) { @@ -1388,15 +1539,16 @@ */ PHP_FUNCTION(mysqli_rpl_query_type) { - MYSQL *mysql; - zval *mysql_link; - char *query; - int query_len; + MYSQL *mysql; + zval *mysql_link; + char *query; + int query_len; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_LONG(mysql_rpl_query_type(query, query_len)); } @@ -1406,8 +1558,9 @@ */ PHP_FUNCTION(mysqli_send_long_data) { - STMT *stmt; - zval *mysql_stmt; + STMT *stmt; + zval *mysql_stmt; + PR_STMT *prstmt; char *data; long param_nr, data_len; @@ -1415,7 +1568,7 @@ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols", &mysql_stmt, mysqli_stmt_class_entry, ¶m_nr, &data, &data_len) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, &mysql_stmt, "mysqli_stmt"); if (!param_nr) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter number"); @@ -1434,15 +1587,16 @@ */ PHP_FUNCTION(mysqli_send_query) { - MYSQL *mysql; - zval *mysql_link; - char *query = NULL; - unsigned int query_len; + MYSQL *mysql; + zval *mysql_link; + char *query = NULL; + unsigned int query_len; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); if (mysql_send_query(mysql, query, query_len)) { RETURN_FALSE; @@ -1455,15 +1609,16 @@ */ PHP_FUNCTION(mysqli_slave_query) { - MYSQL *mysql; - zval *mysql_link; - char *query = NULL; - unsigned int query_len; + MYSQL *mysql; + zval *mysql_link; + char *query = NULL; + unsigned int query_len; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); if (mysql_slave_query(mysql, query, query_len)) { RETURN_FALSE; @@ -1472,38 +1627,19 @@ } /* }}} */ -/* {{{ proto resource mysqli_store_result(resource link) -*/ -PHP_FUNCTION(mysqli_store_result) -{ - MYSQL *mysql; - MYSQL_RES *result; - zval *mysql_link; - - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { - return; - } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); - - if (!(result = mysql_store_result(mysql))) { - RETURN_FALSE; - } - MYSQLI_RETURN_RESOURCE(result, mysqli_result_class_entry); -} -/* }}} */ - /* {{{ proto mixed mysqli_stmt_affected_rows(object stmt) */ PHP_FUNCTION(mysqli_stmt_affected_rows) { STMT *stmt; zval *mysql_stmt; - my_ulonglong rc; + my_ulonglong rc; + PR_STMT *prstmt; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, &mysql_stmt, "mysqli_stmt"); rc = mysql_stmt_affected_rows(stmt->stmt); MYSQLI_RETURN_LONG_LONG(rc) @@ -1514,13 +1650,14 @@ close statement */ PHP_FUNCTION(mysqli_stmt_close) { - STMT *stmt; - zval *mysql_stmt; + STMT *stmt; + zval *mysql_stmt; + PR_STMT *prstmt; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, &mysql_stmt, "mysqli_stmt"); mysql_stmt_close(stmt->stmt); stmt->stmt = NULL; php_clear_stmt_bind(stmt); @@ -1534,16 +1671,17 @@ */ PHP_FUNCTION(mysqli_select_db) { - MYSQL *mysql; - zval *mysql_link; - char *dbname; - int dbname_len; + MYSQL *mysql; + zval *mysql_link; + char *dbname; + int dbname_len; + PR_MYSQL *prmysql; // if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os", &mysql_link, mysqli_link_class_entry, &dbname, &dbname_len) == FAILURE) { if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &dbname, &dbname_len) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); if (!mysql_select_db(mysql, dbname)) { RETURN_TRUE; @@ -1557,16 +1695,17 @@ */ PHP_FUNCTION(mysqli_ssl_set) { - MYSQL *mysql; - zval *mysql_link; - char *key=NULL, *cert=NULL, *ca=NULL, *capath=NULL, *cipher=NULL; - int key_len, cert_len, ca_len, capath_len, cipher_len; + MYSQL *mysql; + zval *mysql_link; + char *key=NULL, *cert=NULL, *ca=NULL, *capath=NULL, *cipher=NULL; + int key_len, cert_len, ca_len, capath_len, cipher_len; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osssss", &mysql_link, mysqli_link_class_entry, &key, &key_len, &cert, &cert_len, &ca, &ca_len, &capath, &capath_len, &cipher, &cipher_len) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); mysql_ssl_set(mysql, key, cert, ca, capath, cipher); @@ -1578,13 +1717,14 @@ */ PHP_FUNCTION(mysqli_stat) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_STRING((char *)mysql_stat(mysql), 1); } @@ -1595,13 +1735,14 @@ */ PHP_FUNCTION(mysqli_stmt_errno) { - STMT *stmt; - zval *mysql_stmt; + STMT *stmt; + zval *mysql_stmt; + PR_STMT *prstmt; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, &mysql_stmt, "mysqli_stmt"); RETURN_LONG(mysql_stmt_errno(stmt->stmt)); } @@ -1611,13 +1752,14 @@ */ PHP_FUNCTION(mysqli_stmt_error) { - STMT *stmt; - zval *mysql_stmt; + STMT *stmt; + zval *mysql_stmt; + PR_STMT *prstmt; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, &mysql_stmt, "mysqli_stmt"); RETURN_STRING((char *)mysql_stmt_error(stmt->stmt),1); } @@ -1627,13 +1769,14 @@ */ PHP_FUNCTION(mysqli_stmt_store_result) { - STMT *stmt; - zval *mysql_stmt; + STMT *stmt; + zval *mysql_stmt; + PR_STMT *prstmt; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); + MYSQLI_FETCH_RESOURCE(stmt, STMT *, prstmt, PR_STMT *, &mysql_stmt, "mysqli_stmt"); if (mysql_stmt_store_result(stmt->stmt)){ RETURN_FALSE; @@ -1641,18 +1784,44 @@ RETURN_TRUE; } /* }}} */ + +/* {{{ proto resource mysqli_store_result(resource link) +*/ +PHP_FUNCTION(mysqli_store_result) +{ + MYSQL *mysql; + MYSQL_RES *result; + zval *mysql_link; + PR_MYSQL *prmysql; + MYSQLI_RESOURCE *mysqli_resource; + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { + return; + } + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); + + if (!(result = mysql_store_result(mysql))) { + RETURN_FALSE; + } + mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); + mysqli_resource->ptr = (void *)result; + MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry); +} +/* }}} */ + /* {{{ proto int mysqli_thread_id(resource link) */ PHP_FUNCTION(mysqli_thread_id) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_LONG(mysql_thread_id(mysql)); } @@ -1671,19 +1840,23 @@ */ PHP_FUNCTION(mysqli_use_result) { - MYSQL *mysql; - MYSQL_RES *result; - zval *mysql_link; + MYSQL *mysql; + MYSQL_RES *result; + zval *mysql_link; + PR_MYSQL *prmysql; + MYSQLI_RESOURCE *mysqli_resource; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); if (!(result = mysql_use_result(mysql))) { RETURN_FALSE; } - MYSQLI_RETURN_RESOURCE(result, mysqli_result_class_entry); + mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); + mysqli_resource->ptr = (void *)result; + MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry); } /* }}} */ @@ -1691,13 +1864,14 @@ */ PHP_FUNCTION(mysqli_warning_count) { - MYSQL *mysql; - zval *mysql_link; + MYSQL *mysql; + zval *mysql_link; + PR_MYSQL *prmysql; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } - MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); + MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, prmysql, PR_MYSQL *, &mysql_link, "mysqli_link"); RETURN_LONG(mysql_warning_count(mysql)); } Index: php4/ext/mysqli/php_mysqli.h diff -u php4/ext/mysqli/php_mysqli.h:1.12 php4/ext/mysqli/php_mysqli.h:1.13 --- php4/ext/mysqli/php_mysqli.h:1.12 Mon Mar 3 17:50:56 2003 +++ php4/ext/mysqli/php_mysqli.h Sat Mar 8 18:33:12 2003 @@ -15,7 +15,7 @@ | Author: Georg Richter <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ - $Id: php_mysqli.h,v 1.12 2003/03/03 22:50:56 georg Exp $ + $Id: php_mysqli.h,v 1.13 2003/03/08 23:33:12 georg Exp $ */ /* A little hack to prevent build break, when mysql is used together with @@ -36,9 +36,6 @@ #ifndef PHP_MYSQLI_H #define PHP_MYSQLI_H -#define MYSQLI_PR_TYPE_QUERY 0 -#define MYSQLI_PR_TYPE_PREPARE 1 - typedef struct { ulong buflen; @@ -56,22 +53,98 @@ } STMT; typedef struct { - char active; - struct timeval start; - unsigned int count[2]; - ulong min_row_val[2]; - ulong max_row_val[2]; - ulong row_val[2]; - double min_elapsed[2]; - double max_elapsed[2]; - double elapsed[2]; -} PROFILER; + void *prinfo; /* profiler info */ + void *ptr; /* resource: (mysql, result, stmt) */ +} MYSQLI_RESOURCE; + +/* common profiler header struct */ + +typedef struct { + unsigned int type; + void *child; + void *next; + char *filename; + unsigned int lineno; + char *functionname; + struct timeval starttime; + struct timeval elapsedtime; + struct timeval lifetime; + char *errormsg; + ulong error; +} PR_HEADER; + +/* explain output */ +typedef struct { + char *query; + unsigned int exp_cnt; + char **exp_table; + char **exp_type; + char **exp_key; + ulong *exp_rows; +} PR_EXPLAIN; + +/* common */ +typedef struct { + PR_HEADER header; +} PR_COMMON; + +/* connection */ +typedef struct { + PR_HEADER header; + unsigned int thread_id; + char *hostname; + char *username; + unsigned int closed; +} PR_MYSQL; + +/* resultset */ +typedef struct { + PR_HEADER header; + unsigned int columns; + ulong rows; + ulong fields; + ulong fetched_rows; + unsigned int closed; +} PR_RESULT; + +/* command */ +/* TODO: return values */ +typedef struct { + PR_HEADER header; + ulong returntype; + void *returnvalue; +} PR_COMMAND; + +/* query */ +typedef struct { + PR_HEADER header; + PR_EXPLAIN explain; + ulong affectedrows; + ulong insertid; +} PR_QUERY; + +/* statement */ +typedef struct { + PR_HEADER header; + PR_EXPLAIN explain; + unsigned int param_cnt; + unsigned int field_cnt; +} PR_STMT; typedef struct _mysqli_object { zend_object zo; void *ptr; } mysqli_object; /* extends zend_object */ +#define MYSQLI_PR_MYSQL 0 +#define MYSQLI_PR_QUERY 1 +#define MYSQLI_PR_QUERY_RESULT 2 +#define MYSQLI_PR_STMT 3 +#define MYSQLI_PR_STMT_RESULT 4 +#define MYSQLI_PR_RESULT 5 +#define MYSQLI_PR_COMMAND 6 + + #define phpext_mysqli_ptr &mysqli_module_entry #ifdef PHP_WIN32 @@ -95,10 +168,11 @@ extern void php_clear_stmt_bind(STMT *stmt); /* Profiler functions */ +extern void php_mysqli_profiler_report(PR_COMMON *, int); +extern PR_COMMON *php_mysqli_profiler_new_object(PR_COMMON *parent, unsigned int type, unsigned int settime); extern void php_mysqli_profiler_result_info(MYSQL_RES *res); -void php_mysqli_profiler_explain(MYSQL *mysql, char *query); -void php_mysqli_profiler_header(char *query); -void php_mysqli_profiler_elapsed_time(); +extern int php_mysqli_profiler_explain(PR_EXPLAIN *explain, PR_HEADER *header, MYSQL *mysql, char *query); +extern void php_mysqli_profiler_timediff(struct timeval start, struct timeval *elapsed); zend_class_entry *mysqli_link_class_entry; zend_class_entry *mysqli_stmt_class_entry; @@ -135,13 +209,16 @@ MYSQLI_REGISTER_RESOURCE_EX(__ptr, object, __ce)\ } -#define MYSQLI_FETCH_RESOURCE(__ptr, __type, __id, __name) \ +#define MYSQLI_FETCH_RESOURCE(__ptr, __type, __prptr, __prtype, __id, __name) \ { \ + MYSQLI_RESOURCE *my_res; \ mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*(__id) TSRMLS_CC);\ - if (!(__ptr = (__type)intern->ptr)) {\ + if (!(my_res = (MYSQLI_RESOURCE *)intern->ptr)) {\ php_error(E_WARNING, "Couldn't fetch %s", intern->zo.ce->name);\ RETURN_NULL();\ }\ + __ptr = (__type)my_res->ptr; \ + __prptr = (__prtype)my_res->prinfo; \ if (!strcmp((char *)__name, "mysqli_stmt")) {\ if (!((STMT *)__ptr)->stmt->mysql) {\ php_error(E_WARNING, "Statement isn't valid anymore");\ @@ -153,6 +230,7 @@ #define MYSQLI_CLEAR_RESOURCE(__id) \ { \ mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*(__id) TSRMLS_CC);\ + efree(intern->ptr); \ intern->ptr = NULL; \ } @@ -246,6 +324,7 @@ PHP_FUNCTION(mysqli_prepare); PHP_FUNCTION(mysqli_query); PHP_FUNCTION(mysqli_prepare_result); +PHP_FUNCTION(mysqli_profiler); PHP_FUNCTION(mysqli_read_query_result); PHP_FUNCTION(mysqli_real_connect); PHP_FUNCTION(mysqli_real_query); @@ -259,7 +338,6 @@ PHP_FUNCTION(mysqli_select_db); PHP_FUNCTION(mysqli_send_long_data); PHP_FUNCTION(mysqli_send_query); -PHP_FUNCTION(mysqli_set_profiler_opt); PHP_FUNCTION(mysqli_slave_query); PHP_FUNCTION(mysqli_ssl_set); PHP_FUNCTION(mysqli_stat); @@ -285,7 +363,7 @@ char *default_socket; long error_no; char *error_msg; - PROFILER profiler; + unsigned int profiler; ZEND_END_MODULE_GLOBALS(mysqli) #ifdef ZTS @@ -294,17 +372,36 @@ #define MyG(v) (mysqli_globals.v) #endif -#define MYSQLI_PROFILER_GETTIME gettimeofday(&MyG(profiler.start), NULL) -#define MYSQLI_PROFILER_REPORTTIME php_mysqli_profiler_elapsed_time() -#define MYSQLI_PROFILER_HEADER(query) php_mysqli_profiler_header(query) -#define MYSQLI_PROFILER_REPORT_RESULT(res) php_mysqli_profiler_result_info(res) -#define MYSQLI_PROFILER_EXPLAIN(mysql,query) \ -if (!strncasecmp("select", query, 6)){ \ - php_mysqli_profiler_explain(mysql,query); \ - if (mysql_errno(mysql)) { \ - RETURN_FALSE; \ - } \ +#define my_estrdup(x) (x) ? estrdup(x) : NULL +#define my_efree(x) if (x) efree(x) + +/****** PROFILER MACROS *******/ +#define MYSQLI_PROFILER_STARTTIME(ptr) gettimeofday(&ptr##->header.starttime, NULL) +#define MYSQLI_PROFILER_ELAPSEDTIME(ptr) php_mysqli_profiler_timediff(ptr##->header.starttime, &ptr##->header.elapsedtime) +#define MYSQLI_PROFILER_LIFETIME(ptr) php_mysqli_profiler_timediff((ptr)->starttime, &(ptr)->lifetime) + +#define MYSQLI_PROFILER_NEW(parent, type, time) php_mysqli_profiler_new_object((PR_COMMON *)parent, type, time) +#define MYSQLI_PROFILER_COMMAND_START(cmd,parent)\ +if (MyG(profiler))\ +{\ + cmd = (PR_COMMAND *)php_mysqli_profiler_new_object((PR_COMMON *)parent, MYSQLI_PR_COMMAND,1);\ +} +#define MYSQLI_PROFILER_COMMAND_RETURNLONG(cmd, value)\ +if (MyG(profiler))\ +{\ + char tmp[30];\ + sprintf ((char *)&tmp, "%ld", value);\ + MYSQLI_PROFILER_ELAPSEDTIME(cmd);\ + cmd##->returnvalue = my_estrdup(tmp);\ } +#define MYSQLI_PROFILER_COMMAND_RETURNSTRING(cmd, value)\ +if (MyG(profiler))\ +{\ + MYSQLI_PROFILER_ELAPSEDTIME(cmd);\ + cmd##->returnvalue = my_estrdup(value);\ +} +#define MYSQLI_PROFILER_EXPLAIN(explain,header,mysql,query) php_mysqli_profiler_explain(explain,header, mysql, query) + ZEND_EXTERN_MODULE_GLOBALS(mysqli); Index: php4/ext/mysqli/mysqli.c diff -u php4/ext/mysqli/mysqli.c:1.9 php4/ext/mysqli/mysqli.c:1.10 --- php4/ext/mysqli/mysqli.c:1.9 Fri Mar 7 00:15:19 2003 +++ php4/ext/mysqli/mysqli.c Sat Mar 8 18:33:12 2003 @@ -15,7 +15,7 @@ | Author: Georg Richter <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ - $Id: mysqli.c,v 1.9 2003/03/07 05:15:19 sniper Exp $ + $Id: mysqli.c,v 1.10 2003/03/08 23:33:12 georg Exp $ */ #ifdef HAVE_CONFIG_H @@ -35,7 +35,6 @@ #define MYSQLI_USE_RESULT 1 ZEND_DECLARE_MODULE_GLOBALS(mysqli) - static zend_object_handlers mysqli_object_handlers; /* {{{ php_clear_stmt_bind */ @@ -73,25 +72,27 @@ */ static void mysqli_objects_dtor(void *object, zend_object_handle handle TSRMLS_DC) { - mysqli_object *intern = (mysqli_object *)object; + mysqli_object *intern = (mysqli_object *)object; + MYSQLI_RESOURCE *my_res = (MYSQLI_RESOURCE *)intern->ptr; /* link object */ if (intern->zo.ce == mysqli_link_class_entry) { - MYSQL *mysql = (MYSQL *)intern->ptr; - if (mysql) { - mysql_close(mysql); + if (my_res && my_res->ptr) { + mysql_close(my_res->ptr); + if (MyG(profiler)) { + php_mysqli_profiler_report(my_res->prinfo, 0); + } } } else if (intern->zo.ce == mysqli_stmt_class_entry) { /* stmt object */ - STMT *stmt = (STMT *)intern->ptr; - if (stmt) { - php_clear_stmt_bind(stmt); + if (my_res && my_res->ptr) { + php_clear_stmt_bind((STMT *)my_res->ptr); } } else if (intern->zo.ce == mysqli_result_class_entry) { /* result object */ - MYSQL_RES *res = (MYSQL_RES *)intern->ptr; - if (res) { - mysql_free_result(res); + if (my_res && my_res->ptr) { + mysql_free_result(my_res->ptr); } } + my_efree(my_res); zend_objects_destroy_object(object, handle TSRMLS_CC); } /* }}} */ @@ -176,7 +177,7 @@ mysqli_globals->default_user = NULL; mysqli_globals->default_pw = NULL; mysqli_globals->default_socket = NULL; - memset(&mysqli_globals->profiler, '\0', sizeof(PROFILER)); + mysqli_globals->profiler = 0; } /* }}} */ @@ -337,14 +338,16 @@ */ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags) { - MYSQL_RES *result; - zval *mysql_result; - int fetchtype; - int copyflag; - unsigned int i; - MYSQL_FIELD *fields; - MYSQL_ROW row; - unsigned long *field_len; + MYSQL_RES *result; + zval *mysql_result; + int fetchtype; + int copyflag; + unsigned int i; + MYSQL_FIELD *fields; + MYSQL_ROW row; + unsigned long *field_len; + PR_RESULT *prresult; + PR_COMMAND *prcommand; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &fetchtype) == FAILURE) { return; @@ -358,12 +361,15 @@ fetchtype = override_flags; } - MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); + MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, prresult, PR_RESULT *, &mysql_result, "mysqli_result"); + + MYSQLI_PROFILER_COMMAND_START(prcommand, prresult); fields = mysql_fetch_fields(result); if (!(row = mysql_fetch_row(result))) { RETURN_FALSE; } + array_init(return_value); field_len = mysql_fetch_lengths(result); @@ -396,6 +402,11 @@ add_assoc_null(return_value, fields[i].name); } } + } + + if (MyG(profiler)) { + MYSQLI_PROFILER_COMMAND_RETURNSTRING(prcommand, NULL); + prresult->fetched_rows++; } } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php