georg           Mon Mar  3 17:36:48 2003 EDT

  Added files:                 
    /php4/ext/mysqli    mysqli_profiler.c 

  Modified files:              
    /php4/ext/mysqli    php_mysqli.h mysqli.c mysqli_nonapi.c mysqli_fe.c 
                        config.m4 
  Log:
  added profiler support
  
  
Index: php4/ext/mysqli/php_mysqli.h
diff -u php4/ext/mysqli/php_mysqli.h:1.10 php4/ext/mysqli/php_mysqli.h:1.11
--- php4/ext/mysqli/php_mysqli.h:1.10   Sat Feb 22 02:31:01 2003
+++ php4/ext/mysqli/php_mysqli.h        Mon Mar  3 17:36:47 2003
@@ -15,7 +15,7 @@
   | Author: Georg Richter <[EMAIL PROTECTED]>                                |
   +----------------------------------------------------------------------+
 
-  $Id: php_mysqli.h,v 1.10 2003/02/22 07:31:01 georg Exp $ 
+  $Id: php_mysqli.h,v 1.11 2003/03/03 22:36:47 georg Exp $ 
 */
 
 /* A little hack to prevent build break, when mysql is used together with
@@ -25,11 +25,21 @@
 #undef LIST
 #endif
 
+#ifdef PHP_WIN32
+#include "win32/time.h"
+#else
+#include "sys/time.h"
+#endif
+
 #include <mysql.h>
 
 #ifndef PHP_MYSQLI_H
 #define PHP_MYSQLI_H
 
+#define MYSQLI_PR_TYPE_QUERY    0
+#define MYSQLI_PR_TYPE_PREPARE  1
+
+
 typedef struct {
        ulong           buflen;
        char            *buffer;
@@ -45,6 +55,18 @@
        char            type;
 } 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;
+
 typedef struct _mysqli_object {
        zend_object zo;
        void *ptr;
@@ -71,6 +93,13 @@
 extern function_entry mysqli_result_methods[];
 extern void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int flag);
 extern void php_clear_stmt_bind(STMT *stmt);
+
+/* Profiler functions */
+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();
+
 zend_class_entry *mysqli_link_class_entry;
 zend_class_entry *mysqli_stmt_class_entry;
 zend_class_entry *mysqli_result_class_entry;
@@ -153,8 +182,8 @@
 #define MYSQLI_BIND_SEND_DATA  4
 
 /* fetch types */
-#define FETCH_SIMPLE           0
-#define FETCH_RESULT           1
+#define FETCH_SIMPLE           1
+#define FETCH_RESULT           2
 
 PHP_MYSQLI_API void mysqli_register_link(zval *return_value, void *link TSRMLS_DC);
 PHP_MYSQLI_API void mysqli_register_stmt(zval *return_value, void *stmt TSRMLS_DC);
@@ -230,6 +259,7 @@
 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);
@@ -245,16 +275,17 @@
 PHP_FUNCTION(mysqli_warning_count);
 
 ZEND_BEGIN_MODULE_GLOBALS(mysqli)
-       long default_link;
-       long num_links;
-       long max_links;
-       unsigned int default_port;
-       char *default_host;
-       char *default_user;
-       char *default_pw;
-       char *default_socket;
-       long error_no;
-       char *error_msg;
+       long            default_link;
+       long            num_links;
+       long            max_links;
+       unsigned int    default_port;
+       char            *default_host;
+       char            *default_user;
+       char            *default_pw;
+       char            *default_socket;
+       long            error_no;
+       char            *error_msg;
+       PROFILER        profiler;
 ZEND_END_MODULE_GLOBALS(mysqli)
 
 #ifdef ZTS
@@ -262,6 +293,18 @@
 #else
 #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", Z_STRVAL_PP(query), 6)){ \
+       php_mysqli_profiler_explain(mysql,query); \
+       if (mysql_errno(mysql)) { \
+               RETURN_FALSE; \
+       } \
+}
 
 ZEND_EXTERN_MODULE_GLOBALS(mysqli);
 
Index: php4/ext/mysqli/mysqli.c
diff -u php4/ext/mysqli/mysqli.c:1.7 php4/ext/mysqli/mysqli.c:1.8
--- php4/ext/mysqli/mysqli.c:1.7        Sat Feb 22 02:31:01 2003
+++ php4/ext/mysqli/mysqli.c    Mon Mar  3 17:36:47 2003
@@ -15,7 +15,7 @@
   | Author: Georg Richter <[EMAIL PROTECTED]>                                |
   +----------------------------------------------------------------------+
 
-  $Id: mysqli.c,v 1.7 2003/02/22 07:31:01 georg Exp $ 
+  $Id: mysqli.c,v 1.8 2003/03/03 22:36:47 georg Exp $ 
 */
 
 #ifdef HAVE_CONFIG_H
@@ -176,6 +176,7 @@
        mysqli_globals->default_user = NULL;
        mysqli_globals->default_pw = NULL;
        mysqli_globals->default_socket = NULL;
+       memset(&mysqli_globals->profiler, '\0', sizeof(PROFILER));
 }
 /* }}} */
 
Index: php4/ext/mysqli/mysqli_nonapi.c
diff -u php4/ext/mysqli/mysqli_nonapi.c:1.5 php4/ext/mysqli/mysqli_nonapi.c:1.6
--- php4/ext/mysqli/mysqli_nonapi.c:1.5 Sun Feb 16 07:03:37 2003
+++ php4/ext/mysqli/mysqli_nonapi.c     Mon Mar  3 17:36:47 2003
@@ -1,8 +1,8 @@
 /*
   +----------------------------------------------------------------------+
-  | PHP Version 4                                                        |
+  | PHP Version 5                                                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) 1997-2002 The PHP Group                                |
+  | Copyright (c) 1997-2003 The PHP Group                                |
   +----------------------------------------------------------------------+
   | This source file is subject to version 2.02 of the PHP license,      |
   | that is bundled with this package in the file LICENSE, and is        |
@@ -15,7 +15,7 @@
   | Author: Georg Richter <[EMAIL PROTECTED]>                                |
   +----------------------------------------------------------------------+
 
-  $Id: mysqli_nonapi.c,v 1.5 2003/02/16 12:03:37 georg Exp $ 
+  $Id: mysqli_nonapi.c,v 1.6 2003/03/03 22:36:47 georg Exp $ 
 */
 
 #ifdef HAVE_CONFIG_H
@@ -121,8 +121,20 @@
        }
        MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
 
-       if (mysql_real_query(mysql, query, query_len)) {
-               RETURN_FALSE;
+       /* 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;
+               }
+               MYSQLI_PROFILER_REPORTTIME;
+       }
+       else {
+               if (mysql_real_query(mysql, query, query_len)) {
+                       RETURN_FALSE;
+               }
        }
 
        if (!mysql_field_count(mysql)) {
@@ -133,6 +145,9 @@
        if (!result) {
                RETURN_FALSE;
        }       
+       if (MyG(profiler.active)) {
+               MYSQLI_PROFILER_REPORT_RESULT(result);
+       }
        MYSQLI_RETURN_RESOURCE(result, mysqli_result_class_entry);
 }
 /* }}} */
Index: php4/ext/mysqli/mysqli_fe.c
diff -u php4/ext/mysqli/mysqli_fe.c:1.7 php4/ext/mysqli/mysqli_fe.c:1.8
--- php4/ext/mysqli/mysqli_fe.c:1.7     Tue Feb 18 03:49:00 2003
+++ php4/ext/mysqli/mysqli_fe.c Mon Mar  3 17:36:47 2003
@@ -15,7 +15,7 @@
   | Author: Georg Richter <[EMAIL PROTECTED]>                                |
   +----------------------------------------------------------------------+
 
-  $Id: mysqli_fe.c,v 1.7 2003/02/18 08:49:00 georg Exp $ 
+  $Id: mysqli_fe.c,v 1.8 2003/03/03 22:36:47 georg Exp $ 
 */
 
 #ifdef HAVE_CONFIG_H
@@ -102,6 +102,7 @@
        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/config.m4
diff -u php4/ext/mysqli/config.m4:1.2 php4/ext/mysqli/config.m4:1.3
--- php4/ext/mysqli/config.m4:1.2       Sat Feb 15 15:09:49 2003
+++ php4/ext/mysqli/config.m4   Mon Mar  3 17:36:47 2003
@@ -1,4 +1,4 @@
-dnl $Id: config.m4,v 1.2 2003/02/15 20:09:49 iliaa Exp $
+dnl $Id: config.m4,v 1.3 2003/03/03 22:36:47 georg Exp $
 dnl config.m4 for extension mysqli
 
 dnl Comments in this file start with the string 'dnl'.
@@ -54,5 +54,5 @@
   ])
   PHP_SUBST(MYSQLI_SHARED_LIBADD)
 
-  PHP_NEW_EXTENSION(mysqli, mysqli.c mysqli_api.c mysqli_nonapi.c mysqli_fe.c, 
$ext_shared)
+  PHP_NEW_EXTENSION(mysqli, mysqli.c mysqli_api.c mysqli_nonapi.c mysqli_fe.c 
mysqli_profiler.c, $ext_shared)
 fi

Index: php4/ext/mysqli/mysqli_profiler.c
+++ php4/ext/mysqli/mysqli_profiler.c
/*
  +----------------------------------------------------------------------+
  | PHP Version 5                                                        |
  +----------------------------------------------------------------------+
  | Copyright (c) 1997-2003 The PHP Group                                |
  +----------------------------------------------------------------------+
  | This source file is subject to version 2.02 of the PHP license,      |
  | that is bundled with this package in the file LICENSE, and is        |
  | available at through the world-wide-web at                           |
  | http://www.php.net/license/2_02.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          |
  | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
  +----------------------------------------------------------------------+
  | Author: Georg Richter <[EMAIL PROTECTED]>                                |
  +----------------------------------------------------------------------+

  $Id: mysqli_profiler.c,v 1.1 2003/03/03 22:36:47 georg Exp $ 
*/

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#include "php_ini.h"
#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)
{
        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);
        }
}
/* }}} */

/* {{{ 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));
}
/* }}} */

/* {{{ void php_mysqli_profiler_explain(MYSQL *, char *) */
void php_mysqli_profiler_explain(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;
        }

        res = mysql_use_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");
        }

        mysql_free_result(res);
        return;
}
/* }}} */

/* {{{ void php_mysqli_profiler_elapsed_time() */
void php_mysqli_profiler_elapsed_time()
{
        struct timeval  end, elapsed;

        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);
}
/* }}} */

/* {{{ proto void mysqli_set_profiler_opt (bool profiler)
*/
PHP_FUNCTION(mysqli_set_profiler_opt)
{ 
        int flags;

        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &flags) == FAILURE) {
                return;
        }
        MyG(profiler.active) = flags;
        
        return;
}
/* }}} */
/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: noet sw=4 ts=4 fdm=marker
 * vim<600: noet sw=4 ts=4
 */

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to