/* +----------------------------------------------------------------------+ | 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 | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Georg Richter | +----------------------------------------------------------------------+ */ #ifndef __HAVE_MYSQLI_PROFILER_H__ #define __HAVE_MYSQLI_PROFILER_H__ #ifdef PHP_WIN32 #include "win32/time.h" #else #include "sys/time.h" #endif #define MYSQLI_PROFILER_PROTOCOL_VERSION 1.0 /* 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; typedef struct { char **value; } PR_ROW; /* explain output */ typedef struct { char *query; unsigned int exp_cnt; unsigned int columns; char **fields; PR_ROW *row; } PR_EXPLAIN; /* main profiler */ typedef struct { PR_HEADER header; unsigned int mode; char *name; int port; char *info; int connection; FILE *fp; } PR_MAIN; /* 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; char *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; /* Profiler protofypes */ 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); 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); extern PR_MAIN *prmain; /*** PROFILER MODES ***/ #define MYSQLI_PR_REPORT_STDERR 1 #define MYSQLI_PR_REPORT_PORT 2 #define MYSQLI_PR_REPORT_FILE 3 /*** PROFILER CONSTANTS ***/ #define MYSQLI_PR_MAIN 0 #define MYSQLI_PR_MYSQL 1 #define MYSQLI_PR_QUERY 2 #define MYSQLI_PR_QUERY_RESULT 3 #define MYSQLI_PR_STMT 4 #define MYSQLI_PR_STMT_RESULT 5 #define MYSQLI_PR_RESULT 6 /*** 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) #define MYSQLI_PROFILER_OUT(buffer)\ switch (prmain->mode) {\ case MYSQLI_PR_REPORT_STDERR:\ fprintf(stderr, "%s", buffer);\ break;\ case MYSQLI_PR_REPORT_FILE:\ fprintf(prmain->fp, "%s", buffer);\ break;\ case MYSQLI_PR_REPORT_PORT:\ PR_SSEND(prmain->port,buffer);\ break;\ }\ buffer[0] = '\0'; #define MYSQLI_PROFILER_ADD_STARTTAG(buffer, str, out)\ if (prmain->mode == MYSQLI_PR_REPORT_STDERR) {\ if (out) { \ sprintf((char *)&buffer, "%s[%s]\n", ident, str);\ } \ }\ else {\ sprintf((char *)&buffer, "<%s>\n", str);\ }\ MYSQLI_PROFILER_OUT(buffer); #define MYSQLI_PROFILER_ADD_ATTR_STRING(buffer, tag, value)\ if (prmain->mode == MYSQLI_PR_REPORT_STDERR) {\ sprintf((char *)&buffer, "%s%s: %s\n", ident, tag, value);\ }\ else {\ sprintf((char *)&buffer, "<%s>%s\n", tag, value, tag);\ }\ MYSQLI_PROFILER_OUT(buffer); #define MYSQLI_PROFILER_ADD_ATTR_LONG(buffer, tag, value)\ if (prmain->mode == MYSQLI_PR_REPORT_STDERR) {\ sprintf((char *)&buffer, "%s%s: %ld\n", ident, tag, (long)value);\ }\ else {\ sprintf((char *)&buffer, "<%s>%ld\n", tag, (long)value, tag);\ }\ MYSQLI_PROFILER_OUT(buffer); #define MYSQLI_PROFILER_ADD_ATTR_TIME(buffer, tag, sec, usec)\ if (prmain->mode == MYSQLI_PR_REPORT_STDERR) {\ sprintf((char *)&buffer, "%s%s: %ld.%06ld\n", ident, tag, sec, usec);\ }\ else {\ sprintf((char *)&buffer, "<%s>%ld.%06ld\n", tag, sec, usec, tag);\ }\ MYSQLI_PROFILER_OUT(buffer); #define MYSQLI_PROFILER_ADD_ENDTAG(buffer, tag)\ if (prmain->mode == MYSQLI_PR_REPORT_STDERR) {\ fprintf(stderr, "\n"); \ } else { \ sprintf((char *)&buffer, "\n", tag);\ }\ MYSQLI_PROFILER_OUT(buffer); #endif