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