-
Notifications
You must be signed in to change notification settings - Fork 10.8k
/
class-wc-log-handler-db.php
189 lines (163 loc) · 4.82 KB
/
class-wc-log-handler-db.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<?php
/**
* Class WC_Log_Handler_DB file.
*
* @package WooCommerce\Log Handlers
*/
use Automattic\Jetpack\Constants;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/**
* Handles log entries by writing to database.
*
* @class WC_Log_Handler_DB
* @version 1.0.0
* @package WooCommerce\Classes\Log_Handlers
*/
class WC_Log_Handler_DB extends WC_Log_Handler {
/**
* Handle a log entry.
*
* @param int $timestamp Log timestamp.
* @param string $level emergency|alert|critical|error|warning|notice|info|debug.
* @param string $message Log message.
* @param array $context {
* Additional information for log handlers.
*
* @type string $source Optional. Source will be available in log table.
* If no source is provided, attempt to provide sensible default.
* }
*
* @see WC_Log_Handler_DB::get_log_source() for default source.
*
* @return bool False if value was not handled and true if value was handled.
*/
public function handle( $timestamp, $level, $message, $context ) {
if ( isset( $context['source'] ) && $context['source'] ) {
$source = $context['source'];
} else {
$source = $this->get_log_source();
}
return $this->add( $timestamp, $level, $message, $source, $context );
}
/**
* Add a log entry to chosen file.
*
* @param int $timestamp Log timestamp.
* @param string $level emergency|alert|critical|error|warning|notice|info|debug.
* @param string $message Log message.
* @param string $source Log source. Useful for filtering and sorting.
* @param array $context Context will be serialized and stored in database.
*
* @return bool True if write was successful.
*/
protected static function add( $timestamp, $level, $message, $source, $context ) {
global $wpdb;
$insert = array(
'timestamp' => date( 'Y-m-d H:i:s', $timestamp ),
'level' => WC_Log_Levels::get_level_severity( $level ),
'message' => $message,
'source' => $source,
);
$format = array(
'%s',
'%d',
'%s',
'%s',
'%s', // possible serialized context.
);
if ( ! empty( $context ) ) {
$insert['context'] = serialize( $context ); // @codingStandardsIgnoreLine.
}
return false !== $wpdb->insert( "{$wpdb->prefix}woocommerce_log", $insert, $format );
}
/**
* Clear all logs from the DB.
*
* @return bool True if flush was successful.
*/
public static function flush() {
global $wpdb;
return $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_log" );
}
/**
* Clear entries for a chosen handle/source.
*
* @param string $source Log source.
* @return bool
*/
public function clear( $source ) {
global $wpdb;
return $wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->prefix}woocommerce_log WHERE source = %s",
$source
)
);
}
/**
* Delete selected logs from DB.
*
* @param int|string|array $log_ids Log ID or array of Log IDs to be deleted.
*
* @return bool
*/
public static function delete( $log_ids ) {
global $wpdb;
if ( ! is_array( $log_ids ) ) {
$log_ids = array( $log_ids );
}
$format = array_fill( 0, count( $log_ids ), '%d' );
$query_in = '(' . implode( ',', $format ) . ')';
return $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}woocommerce_log WHERE log_id IN {$query_in}", $log_ids ) ); // @codingStandardsIgnoreLine.
}
/**
* Delete all logs older than a defined timestamp.
*
* @since 3.4.0
* @param integer $timestamp Timestamp to delete logs before.
*/
public static function delete_logs_before_timestamp( $timestamp = 0 ) {
if ( ! $timestamp ) {
return;
}
global $wpdb;
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->prefix}woocommerce_log WHERE timestamp < %s",
date( 'Y-m-d H:i:s', $timestamp )
)
);
}
/**
* Get appropriate source based on file name.
*
* Try to provide an appropriate source in case none is provided.
*
* @return string Text to use as log source. "" (empty string) if none is found.
*/
protected static function get_log_source() {
static $ignore_files = array( 'class-wc-log-handler-db', 'class-wc-logger' );
/**
* PHP < 5.3.6 correct behavior
*
* @see http://php.net/manual/en/function.debug-backtrace.php#refsect1-function.debug-backtrace-parameters
*/
if ( Constants::is_defined( 'DEBUG_BACKTRACE_IGNORE_ARGS' ) ) {
$debug_backtrace_arg = DEBUG_BACKTRACE_IGNORE_ARGS; // phpcs:ignore PHPCompatibility.Constants.NewConstants.debug_backtrace_ignore_argsFound
} else {
$debug_backtrace_arg = false;
}
$trace = debug_backtrace( $debug_backtrace_arg ); // @codingStandardsIgnoreLine.
foreach ( $trace as $t ) {
if ( isset( $t['file'] ) ) {
$filename = pathinfo( $t['file'], PATHINFO_FILENAME );
if ( ! in_array( $filename, $ignore_files, true ) ) {
return $filename;
}
}
}
return '';
}
}