PluginProbe
Stream – Activity Log & Audit Trail / 3.4.2
Stream – Activity Log & Audit Trail v3.4.2
4.4.0 4.3.0 4.2.2 4.2.1 trunk 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.1 3.1.1 3.10.0 3.2.0 3.2.1 3.2.2 3.2.3 All 50 releases
← All changes | classes/class-db.php +149 -113 3.0.13.4.2 View file →
@@ -2,83 +2,38 @@
2 2 namespace WP_Stream;
3 3
4 4 class DB {
5 5 /**
6 - * Hold Plugin class
7 - * @var Plugin
8 - */
9 - public $plugin;
10 -
11 - /**
12 - * Hold Query class
13 - * @var Query
14 - */
15 - public $query;
16 -
17 - /**
18 - * Hold records table name
6 + * Hold the Driver class
19 7 *
20 - * @var string
8 + * @var DB_Driver
21 9 */
22 - public $table;
10 + public $driver;
23 11
24 12 /**
25 - * Hold meta table name
13 + * Number of records in last request
26 14 *
27 - * @var string
15 + * @var int
28 16 */
29 - public $table_meta;
17 + protected $found_records_count = 0;
30 18
31 19 /**
32 20 * Class constructor.
33 21 *
34 - * @param Plugin $plugin The main Plugin class.
22 + * @param DB_Driver $driver Driver we want to use.
35 23 */
36 - public function __construct( $plugin ) {
37 - $this->plugin = $plugin;
38 - $this->query = new Query( $this );
39 -
40 - global $wpdb;
41 -
42 - /**
43 - * Allows devs to alter the tables prefix, default to base_prefix
44 - *
45 - * @param string $prefix
46 - *
47 - * @return string
48 - */
49 - $prefix = apply_filters( 'wp_stream_db_tables_prefix', $wpdb->base_prefix );
50 -
51 - $this->table = $prefix . 'stream';
52 - $this->table_meta = $prefix . 'stream_meta';
53 -
54 - $wpdb->stream = $this->table;
55 - $wpdb->streammeta = $this->table_meta;
56 -
57 - // Hack for get_metadata
58 - $wpdb->recordmeta = $this->table_meta;
24 + public function __construct( $driver ) {
25 + $this->driver = $driver;
59 26 }
60 27
61 28 /**
62 - * Public getter to return table names
63 - *
64 - * @return array
65 - */
66 - public function get_table_names() {
67 - return array(
68 - $this->table,
69 - $this->table_meta,
70 - );
71 - }
72 -
73 - /**
74 29 * Insert a record
75 30 *
76 - * @param array $recordarr
31 + * @param array $record
77 32 *
78 33 * @return int
79 34 */
80 - public function insert( $recordarr ) {
35 + public function insert( $record ) {
81 36 if ( defined( 'WP_IMPORTING' ) && WP_IMPORTING ) {
82 37 return false;
83 38 }
84 39
@@ -84,91 +39,60 @@
84 39
85 40 /**
86 41 * Filter allows modification of record information
87 42 *
88 - * @param array $recordarr
43 + * @param array $record
89 44 *
90 45 * @return array
91 46 */
92 - $recordarr = apply_filters( 'wp_stream_record_array', $recordarr );
47 + $record = apply_filters( 'wp_stream_record_array', $record );
93 48
94 - if ( empty( $recordarr ) ) {
49 + array_walk(
50 + $record,
51 + function( &$value, &$key ) {
52 + if ( ! is_array( $value ) ) {
53 + $value = strip_tags( $value );
54 + }
55 + }
56 + );
57 +
58 + if ( empty( $record ) ) {
95 59 return false;
96 60 }
97 61
98 - global $wpdb;
62 + $fields = array( 'object_id', 'site_id', 'blog_id', 'user_id', 'user_role', 'created', 'summary', 'ip', 'connector', 'context', 'action', 'meta' );
63 + $data = array_intersect_key( $record, array_flip( $fields ) );
99 64
100 - $fields = array( 'object_id', 'site_id', 'blog_id', 'user_id', 'user_role', 'created', 'summary', 'ip', 'connector', 'context', 'action' );
101 - $data = array_intersect_key( $recordarr, array_flip( $fields ) );
102 - $data = array_filter( $data );
103 - $result = $wpdb->insert( $this->table, $data );
65 + $record_id = $this->driver->insert_record( $data );
104 66
105 - if ( 1 !== $result ) {
67 + if ( ! $record_id ) {
106 68 /**
107 69 * Fires on a record insertion error
108 70 *
109 - * @param array $recordarr
71 + * @param array $record
110 72 * @param mixed $result
111 73 */
112 - do_action( 'wp_stream_record_insert_error', $recordarr, $result );
74 + do_action( 'wp_stream_record_insert_error', $record, false );
113 75
114 - return $result;
76 + return false;
115 77 }
116 78
117 - $record_id = $wpdb->insert_id;
118 -
119 - // Insert record meta
120 - foreach ( (array) $recordarr['meta'] as $key => $vals ) {
121 - // If associative array, serialize it, otherwise loop on its members
122 - $vals = ( is_array( $vals ) && 0 !== key( $vals ) ) ? array( $vals ) : $vals;
123 -
124 - foreach ( (array) $vals as $val ) {
125 - $val = maybe_serialize( $val );
126 -
127 - $this->insert_meta( $record_id, $key, $val );
128 - }
129 - }
130 -
131 79 /**
132 80 * Fires after a record has been inserted
133 81 *
134 82 * @param int $record_id
135 - * @param array $recordarr
83 + * @param array $record
136 84 */
137 - do_action( 'wp_stream_record_inserted', $record_id, $recordarr );
85 + do_action( 'wp_stream_record_inserted', $record_id, $record );
138 86
139 87 return absint( $record_id );
140 88 }
141 89
142 90 /**
143 - * Insert record meta
144 - *
145 - * @param int $record_id
146 - * @param string $key
147 - * @param string $val
148 - *
149 - * @return array
150 - */
151 - public function insert_meta( $record_id, $key, $val ) {
152 - global $wpdb;
153 -
154 - $result = $wpdb->insert(
155 - $this->table_meta,
156 - array(
157 - 'record_id' => $record_id,
158 - 'meta_key' => $key,
159 - 'meta_value' => $val,
160 - )
161 - );
162 -
163 - return $result;
164 - }
165 -
166 - /**
167 91 * Returns array of existing values for requested column.
168 92 * Used to fill search filters with only used items, instead of all items.
169 93 *
170 - * GROUP BY allows query to find just the first occurance of each value in the column,
94 + * GROUP BY allows query to find just the first occurrence of each value in the column,
171 95 * increasing the efficiency of the query.
172 96 *
173 97 * @see assemble_records
174 98 * @since 1.0.4
@@ -176,12 +100,16 @@
176 100 * @param string $column
177 101 *
178 102 * @return array
179 103 */
180 - function existing_records( $column ) {
181 - global $wpdb;
104 + public function existing_records( $column ) {
105 + // Sanitize column
106 + $allowed_columns = array( 'ID', 'site_id', 'blog_id', 'object_id', 'user_id', 'user_role', 'created', 'summary', 'connector', 'context', 'action', 'ip' );
107 + if ( ! in_array( $column, $allowed_columns, true ) ) {
108 + return array();
109 + }
182 110
183 - $rows = $wpdb->get_results( "SELECT {$column} FROM $wpdb->stream GROUP BY {$column}", 'ARRAY_A' );
111 + $rows = $this->driver->get_column_values( $column );
184 112
185 113 if ( is_array( $rows ) && ! empty( $rows ) ) {
186 114 $output_array = array();
187 115
@@ -195,7 +123,115 @@
195 123 }
196 124
197 125 $column = sprintf( 'stream_%s', $column );
198 126
199 - return isset( $this->plugin->connectors->term_labels[ $column ] ) ? $this->plugin->connectors->term_labels[ $column ] : array();
127 + $term_labels = wp_stream_get_instance()->connectors->term_labels;
128 + return isset( $term_labels[ $column ] ) ? $term_labels[ $column ] : array();
129 + }
130 +
131 + /**
132 + * Get stream records
133 + *
134 + * @param array Query args
135 + *
136 + * @return array Stream Records
137 + */
138 + public function get_records( $args ) {
139 + $defaults = array(
140 + // Search param
141 + 'search' => null,
142 + 'search_field' => 'summary',
143 + 'record_after' => null, // Deprecated, use date_after instead
144 + // Date-based filters
145 + 'date' => null, // Ex: 2015-07-01
146 + 'date_from' => null, // Ex: 2015-07-01
147 + 'date_to' => null, // Ex: 2015-07-01
148 + 'date_after' => null, // Ex: 2015-07-01T15:19:21+00:00
149 + 'date_before' => null, // Ex: 2015-07-01T15:19:21+00:00
150 + // Record ID filters
151 + 'record' => null,
152 + 'record__in' => array(),
153 + 'record__not_in' => array(),
154 + // Pagination params
155 + 'records_per_page' => get_option( 'posts_per_page', 20 ),
156 + 'paged' => 1,
157 + // Order
158 + 'order' => 'desc',
159 + 'orderby' => 'date',
160 + // Fields selection
161 + 'fields' => array(),
162 + );
163 +
164 + // Additional property fields
165 + $properties = array(
166 + 'user_id' => null,
167 + 'user_role' => null,
168 + 'ip' => null,
169 + 'object_id' => null,
170 + 'site_id' => null,
171 + 'blog_id' => null,
172 + 'connector' => null,
173 + 'context' => null,
174 + 'action' => null,
175 + );
176 +
177 + /**
178 + * Filter allows additional query properties to be added
179 + *
180 + * @return array Array of query properties
181 + */
182 + $properties = apply_filters( 'wp_stream_query_properties', $properties );
183 +
184 + // Add property fields to defaults, including their __in/__not_in variations
185 + foreach ( $properties as $property => $default ) {
186 + if ( ! isset( $defaults[ $property ] ) ) {
187 + $defaults[ $property ] = $default;
188 + }
189 +
190 + $defaults[ "{$property}__in" ] = array();
191 + $defaults[ "{$property}__not_in" ] = array();
192 + }
193 +
194 + $args = wp_parse_args( $args, $defaults );
195 +
196 + /**
197 + * Filter allows additional arguments to query $args
198 + *
199 + * @return array Array of query arguments
200 + */
201 + $args = apply_filters( 'wp_stream_query_args', $args );
202 +
203 + $result = (array) $this->driver->get_records( $args );
204 + $this->found_records_count = isset( $result['count'] ) ? $result['count'] : 0;
205 +
206 + return empty( $result['items'] ) ? array() : $result['items'];
207 + }
208 +
209 + /**
210 + * Helper function, backwards compatibility
211 + *
212 + * @param array $args Query args
213 + *
214 + * @return array Stream Records
215 + */
216 + public function query( $args ) {
217 + return $this->get_records( $args );
218 + }
219 +
220 + /**
221 + * Return the number of records found in last request
222 + *
223 + * return int
224 + */
225 + public function get_found_records_count() {
226 + return $this->found_records_count;
227 + }
228 +
229 + /**
230 + * Public getter to return table names
231 + *
232 + * @return array
233 + */
234 + public function get_table_names() {
235 + return $this->driver->get_table_names();
200 236 }
201 237 }