1 |
dpavlin |
2 |
<?php |
2 |
|
|
// vim: ts=4 foldcolumn=4 foldmethod=marker |
3 |
|
|
/** |
4 |
|
|
* DB_mysql_logged class found here. |
5 |
|
|
* |
6 |
|
|
* This file is part of Reblog, |
7 |
|
|
* a derivative work of Feed On Feeds. |
8 |
|
|
* |
9 |
|
|
* Distributed under the Gnu Public License. |
10 |
|
|
* |
11 |
|
|
* @package Refeed |
12 |
|
|
* @license http://opensource.org/licenses/gpl-license.php GNU Public License |
13 |
|
|
* @author Michal Migurski <mike@stamen.com> |
14 |
|
|
* @author Michael Frumin <mfrumin@eyebeam.org> |
15 |
|
|
* @copyright ©2004 Michael Frumin, Michal Migurski |
16 |
|
|
* @link http://reblog.org Reblog |
17 |
|
|
* @link http://feedonfeeds.com Feed On Feeds |
18 |
|
|
* @version $Revision: 1.1 $ |
19 |
|
|
*/ |
20 |
|
|
|
21 |
|
|
require_once 'DB/mysql.php'; |
22 |
|
|
|
23 |
|
|
/** |
24 |
|
|
* DB_mysql_logged is a subclass of DB_mysql. |
25 |
|
|
* |
26 |
|
|
* All queries and statement executions are logged to /tmp/query_log.txt |
27 |
|
|
* with timing information for debugging purposes. This is used only when |
28 |
|
|
* DSN's have "mysql_logged://" at the front instead of "mysql://", and |
29 |
|
|
* this file's containing directory, "DB", is in the include path. |
30 |
|
|
* |
31 |
|
|
* @see DB::connect() |
32 |
|
|
*/ |
33 |
|
|
class DB_mysql_logged extends DB_mysql |
34 |
|
|
{ |
35 |
|
|
function DB_mysql_logged() |
36 |
|
|
{ |
37 |
|
|
$this->DB_mysql(); |
38 |
|
|
} |
39 |
|
|
|
40 |
|
|
/** |
41 |
|
|
* @return float current time, in milliseconds |
42 |
|
|
*/ |
43 |
|
|
function milliseconds() |
44 |
|
|
{ |
45 |
|
|
list($msec, $sec) = split(' ', microtime()); |
46 |
|
|
return (intval($sec) + floatval($msec)) * 1000; |
47 |
|
|
} |
48 |
|
|
|
49 |
|
|
/** |
50 |
|
|
* Scrubs queries a little so they are suitable for logging. |
51 |
|
|
* |
52 |
|
|
* @param string $query raw query |
53 |
|
|
* @return string scrubbed query |
54 |
|
|
*/ |
55 |
|
|
function scrubValues($query) |
56 |
|
|
{ |
57 |
|
|
// find context line |
58 |
|
|
preg_match('/^#\s+Context:\s+((\w+):(\w+)\(\)\s+(\S.*):(\d+))$/mi', $query, $context); |
59 |
|
|
|
60 |
|
|
// clean out comments |
61 |
|
|
$query = preg_replace('/#.+$/m', '', $query); |
62 |
|
|
|
63 |
|
|
// find numbers and strings |
64 |
|
|
//$query = preg_replace('/(\W)[\d\.\-]+(\W)/', '\1CONST\2', $query); |
65 |
|
|
//$query = preg_replace("/'[^']*'/", 'CONST', $query); |
66 |
|
|
|
67 |
|
|
// remove extra spaces |
68 |
|
|
$query = preg_replace('/\s\s+/', ' ', $query); |
69 |
|
|
$query = preg_replace('/\(\s+/', '(', $query); |
70 |
|
|
$query = preg_replace('/\s+\)/', ')', $query); |
71 |
|
|
|
72 |
|
|
// scrub out the reblog root directory |
73 |
|
|
$query = trim($query); |
74 |
|
|
$root = realpath(dirname(__FILE__).'/../../..'); |
75 |
|
|
$context = str_replace("{$root}/", '', $context[1]); |
76 |
|
|
|
77 |
|
|
return array($query, $context); |
78 |
|
|
} |
79 |
|
|
|
80 |
|
|
/** |
81 |
|
|
* Logs queries to /tmp/query_log.txt, with some extra information. |
82 |
|
|
* |
83 |
|
|
* @param string $query database query |
84 |
|
|
* @param float $time current time in milliseconds |
85 |
|
|
* |
86 |
|
|
* @uses DB_mysql_logged::scrubValues() |
87 |
|
|
*/ |
88 |
|
|
function logQuery($query, $time) |
89 |
|
|
{ |
90 |
|
|
list($query, $context) = $this->scrubValues($query); |
91 |
|
|
|
92 |
|
|
if($log = fopen('/tmp/query_log.txt', 'a') /*&& flock($log, LOCK_EX)*/) { |
93 |
|
|
fwrite($log, $query); |
94 |
|
|
fwrite($log, sprintf("\n# Context: %s\n# Query took %0.1f msec\n\n", $context, $time)); |
95 |
|
|
|
96 |
|
|
/*flock($log, LOCK_UN);*/ |
97 |
|
|
fclose($log); |
98 |
|
|
chmod('/tmp/query_log.txt', 0666); |
99 |
|
|
} |
100 |
|
|
|
101 |
|
|
if($log = fopen('/tmp/query_log.sql', 'a') /*&& flock($log, LOCK_EX)*/) { |
102 |
|
|
$insert = sprintf('INSERT INTO query_log (stamp, context, query, duration) VALUES(%s, %s, %s, %f)', |
103 |
|
|
$this->quoteSmart(date('Y-m-d H:i:s')), |
104 |
|
|
$this->quoteSmart($context), |
105 |
|
|
$this->quoteSmart($query), |
106 |
|
|
$time); |
107 |
|
|
|
108 |
|
|
fwrite($log, "{$insert};\n"); |
109 |
|
|
|
110 |
|
|
/*flock($log, LOCK_UN);*/ |
111 |
|
|
fclose($log); |
112 |
|
|
chmod('/tmp/query_log.sql', 0666); |
113 |
|
|
} |
114 |
|
|
} |
115 |
|
|
|
116 |
|
|
/** |
117 |
|
|
* Sends a query to DB_mysql::query, then logs it before returning a result. |
118 |
|
|
* |
119 |
|
|
* @param string $query database query |
120 |
|
|
* @param array $params extra parameters |
121 |
|
|
* @return DB_result Query result |
122 |
|
|
* |
123 |
|
|
* @uses DB_mysql_logged::milliseconds() |
124 |
|
|
* @uses DB_mysql_logged::logQuery() |
125 |
|
|
*/ |
126 |
|
|
function &query($query, $params=array()) |
127 |
|
|
{ |
128 |
|
|
$start = $this->milliseconds(); |
129 |
|
|
$result =& parent::query($query, $params); |
130 |
|
|
|
131 |
|
|
$this->logQuery($query, $this->milliseconds() - $start); |
132 |
|
|
|
133 |
|
|
return $result; |
134 |
|
|
} |
135 |
|
|
|
136 |
|
|
/** |
137 |
|
|
* Sends a statement to DB_mysql::execute, then logs it before returning a result. |
138 |
|
|
* |
139 |
|
|
* @param string $statement database statement |
140 |
|
|
* @param array $data extra parameters |
141 |
|
|
* @return DB_result Query result |
142 |
|
|
* |
143 |
|
|
* @uses DB_mysql_logged::milliseconds() |
144 |
|
|
* @uses DB_mysql_logged::logQuery() |
145 |
|
|
*/ |
146 |
|
|
function &execute($statement, $data=array()) |
147 |
|
|
{ |
148 |
|
|
$start = $this->milliseconds(); |
149 |
|
|
$result =& parent::execute($statement, $data); |
150 |
|
|
|
151 |
|
|
$this->logQuery($statement, $this->milliseconds() - $start); |
152 |
|
|
|
153 |
|
|
return $result; |
154 |
|
|
} |
155 |
|
|
} |
156 |
|
|
|
157 |
|
|
?> |