PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.2
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.2
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-sync / src / replicastore / class-table-checksum-users.php
jetpack / jetpack_vendor / automattic / jetpack-sync / src / replicastore Last commit date
class-table-checksum-usermeta.php 9 months ago class-table-checksum-users.php 9 months ago class-table-checksum.php 4 months ago
class-table-checksum-users.php
190 lines
1 <?php
2 /**
3 * Table Checksums Class.
4 *
5 * @package automattic/jetpack-sync
6 */
7
8 namespace Automattic\Jetpack\Sync\Replicastore;
9
10 use Exception;
11
12 if ( ! defined( 'ABSPATH' ) ) {
13 exit( 0 );
14 }
15
16 /**
17 * Class to handle Table Checksums for the Users table.
18 */
19 class Table_Checksum_Users extends Table_Checksum {
20
21 /**
22 * Returns the checksum query. All validation of fields and configurations are expected to occur prior to usage.
23 *
24 * @param int|null $range_from The start of the range.
25 * @param int|null $range_to The end of the range.
26 * @param array|null $filter_values Additional filter values. Not used at the moment.
27 * @param bool $granular_result If the function should return a granular result.
28 *
29 * @return string
30 *
31 * @throws Exception Throws an exception if validation fails in the internal function calls.
32 */
33 protected function build_checksum_query( $range_from = null, $range_to = null, $filter_values = null, $granular_result = false ) {
34 global $wpdb;
35
36 // Escape the salt.
37 $salt = $wpdb->prepare( '%s', $this->salt );
38
39 // Prepare the compound key.
40 $key_fields = array();
41
42 // Prefix the fields with the table name, to avoid clashes in queries with sub-queries (e.g. meta tables).
43 foreach ( $this->key_fields as $field ) {
44 $key_fields[] = $this->table . '.' . $field;
45 }
46
47 $key_fields = implode( ',', $key_fields );
48
49 // Prepare the checksum fields.
50 $checksum_fields = array();
51 // Prefix the fields with the table name, to avoid clashes in queries with sub-queries (e.g. meta tables).
52 foreach ( $this->checksum_fields as $field ) {
53 $checksum_fields[] = $this->table . '.' . $field;
54 }
55 // Apply latin1 conversion if enabled.
56 if ( $this->perform_text_conversion ) {
57 // Convert text fields to allow for encoding discrepancies as WP.com is latin1.
58 foreach ( $this->checksum_text_fields as $field ) {
59 $checksum_fields[] = 'CONVERT(' . $this->table . '.' . $field . ' using latin1 )';
60 }
61 } else {
62 // Conversion disabled, default to table prefixing.
63 foreach ( $this->checksum_text_fields as $field ) {
64 $checksum_fields[] = $this->table . '.' . $field;
65 }
66 }
67
68 $checksum_fields_string = implode( ',', array_merge( $checksum_fields, array( $salt ) ) );
69
70 $additional_fields = '';
71 if ( $granular_result ) {
72 // TODO uniq the fields as sometimes(most) range_index is the key and there's no need to select the same field twice.
73 $additional_fields = "
74 {$this->table}.{$this->range_field} as range_index,
75 {$key_fields},
76 ";
77 }
78
79 $filter_stamenet = $this->build_filter_statement( $range_from, $range_to, $filter_values );
80
81 // usermeta join to limit on user_level.
82 $join_statement = "JOIN {$wpdb->usermeta} as um_table ON um_table.user_id = {$this->table}.ID";
83
84 $query = "
85 SELECT
86 {$additional_fields}
87 SUM(
88 CRC32(
89 CONCAT_WS( '#', {$salt}, {$checksum_fields_string} )
90 )
91 ) AS checksum
92 FROM
93 {$this->table}
94 {$join_statement}
95 WHERE
96 {$filter_stamenet}
97 AND um_table.meta_key = '{$wpdb->prefix}user_level'
98 AND um_table.meta_value > 0
99 ";
100
101 /**
102 * We need the GROUP BY only for compound keys.
103 */
104 if ( $granular_result ) {
105 $query .= "
106 GROUP BY {$key_fields}
107 LIMIT 9999999
108 ";
109 }
110
111 return $query;
112 }
113
114 /**
115 * Obtain the min-max values (edges) of the range.
116 *
117 * @param int|null $range_from The start of the range.
118 * @param int|null $range_to The end of the range.
119 * @param int|null $limit How many values to return.
120 *
121 * @return array|object|void
122 * @throws Exception Throws an exception if validation fails on the internal function calls.
123 */
124 public function get_range_edges( $range_from = null, $range_to = null, $limit = null ) {
125 global $wpdb;
126
127 $this->validate_fields( array( $this->range_field ) );
128
129 // `trim()` to make sure we don't add the statement if it's empty.
130 $filters = trim( $this->build_filter_statement( $range_from, $range_to ) );
131
132 $filter_statement = '';
133 if ( ! empty( $filters ) ) {
134 $filter_statement = "
135 JOIN {$wpdb->usermeta} as um_table ON um_table.user_id = {$this->table}.ID
136 WHERE
137 {$filters}
138 AND um_table.meta_key = '{$wpdb->prefix}user_level'
139 AND um_table.meta_value > 0
140 ";
141 }
142
143 $query = "
144 SELECT
145 MIN({$this->range_field}) as min_range,
146 MAX({$this->range_field}) as max_range,
147 COUNT( {$this->range_field} ) as item_count
148 FROM
149 ";
150
151 /**
152 * If `$limit` is not specified, we can directly use the table.
153 */
154 if ( ! $limit ) {
155 $query .= "
156 {$this->table}
157 {$filter_statement}
158 ";
159 } else {
160 /**
161 * If there is `$limit` specified, we can't directly use `MIN/MAX()` as they don't work with `LIMIT`.
162 * That's why we will alter the query for this case.
163 */
164 $limit = intval( $limit );
165
166 $query .= "
167 (
168 SELECT
169 {$this->range_field}
170 FROM
171 {$this->table}
172 {$filter_statement}
173 ORDER BY
174 {$this->range_field} ASC
175 LIMIT {$limit}
176 ) as ids_query
177 ";
178 }
179
180 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
181 $result = $wpdb->get_row( $query, ARRAY_A );
182
183 if ( ! $result || ! is_array( $result ) ) {
184 throw new Exception( 'Unable to get range edges' );
185 }
186
187 return $result;
188 }
189 }
190