PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.20.1
GiveWP – Donation Plugin and Fundraising Platform v2.20.1
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Framework / Database / DB.php
give / src / Framework / Database Last commit date
Exceptions 4 years ago DB.php 4 years ago
DB.php
281 lines
1 <?php
2
3 namespace Give\Framework\Database;
4
5 use Exception;
6 use Give\Framework\Database\Exceptions\DatabaseQueryException;
7 use Give\Framework\QueryBuilder\Clauses\RawSQL;
8 use Give\Framework\QueryBuilder\QueryBuilder;
9 use WP_Error;
10
11 /**
12 * Class DB
13 *
14 * A static decorator for the $wpdb class and decorator function which does SQL error checking when performing queries.
15 * If a SQL error occurs a DatabaseQueryException is thrown.
16 *
17 * @method static int|bool query(string $query)
18 * @method static int|false insert(string $table, array $data, array|string $format)
19 * @method static int|false delete(string $table, array $where, array|string $where_format)
20 * @method static int|false update(string $table, array $data, array $where, array|string $format, array|string $where_format)
21 * @method static int|false replace(string $table, array $data, array|string $format)
22 * @method static null|string get_var(string $query = null, int $x = 0, int $y = 0)
23 * @method static array|object|null|void get_row(string $query = null, string $output = OBJECT, int $y = 0)
24 * @method static array get_col(string $query = null, int $x = 0)
25 * @method static array|object|null get_results(string $query = null, string $output = OBJECT)
26 * @method static string get_charset_collate()
27 * @method static string esc_like(string $text)
28 * @method static string remove_placeholder_escape(string $text)
29 */
30 class DB
31 {
32 /**
33 * Runs the dbDelta function and returns a WP_Error with any errors that occurred during the process
34 *
35 * @see dbDelta() for parameter and return details
36 *
37 * @since 2.9.2
38 *
39 * @param $delta
40 *
41 * @return array
42 * @throws DatabaseQueryException
43 */
44 public static function delta($delta)
45 {
46 return self::runQueryWithErrorChecking(
47 function () use ($delta) {
48 return dbDelta($delta);
49 }
50 );
51 }
52
53 /**
54 * A convenience method for the $wpdb->prepare method
55 *
56 * @see WPDB::prepare() for usage details
57 *
58 * @since 2.9.6
59 *
60 * @param string $query
61 * @param mixed ...$args
62 *
63 * @return false|mixed
64 */
65 public static function prepare($query, ...$args)
66 {
67 global $wpdb;
68
69 return $wpdb->prepare($query, ...$args);
70 }
71
72 /**
73 * Magic method which calls the static method on the $wpdb while performing error checking
74 *
75 * @since 2.9.6
76 *
77 * @param $name
78 * @param $arguments
79 *
80 * @return mixed
81 * @throws DatabaseQueryException
82 */
83 public static function __callStatic($name, $arguments)
84 {
85 return self::runQueryWithErrorChecking(
86 function () use ($name, $arguments) {
87 global $wpdb;
88
89 return call_user_func_array([$wpdb, $name], $arguments);
90 }
91 );
92 }
93
94 /**
95 * Get last insert ID
96 *
97 * @since 2.10.0
98 * @return int
99 */
100 public static function last_insert_id()
101 {
102 global $wpdb;
103
104 return $wpdb->insert_id;
105 }
106
107 /**
108 * Prefix given table name with $wpdb->prefix
109 *
110 * @param string $tableName
111 *
112 * @return string
113 */
114 public static function prefix($tableName)
115 {
116 global $wpdb;
117
118 return $wpdb->prefix . $tableName;
119 }
120
121 /**
122 * Create QueryBuilder instance
123 *
124 * @param string $table
125 * @param null|string $alias
126 *
127 * @return QueryBuilder
128 */
129 public static function table($table, $alias = null)
130 {
131 $builder = new QueryBuilder();
132 $builder->from($table, $alias);
133
134 return $builder;
135 }
136
137 /**
138 * Runs a transaction. If the callable works then the transaction is committed. If the callable throws an exception
139 * then the transaction is rolled back.
140 *
141 * @since 2.19.6
142 *
143 * @param callable $callback
144 *
145 * @return void
146 * @throws Exception
147 */
148 public static function transaction(callable $callback)
149 {
150 self::beginTransaction();
151
152 try {
153 $callback();
154 } catch (Exception $e) {
155 self::rollback();
156 throw $e;
157 }
158
159 self::commit();
160 }
161
162 /**
163 * Manually starts a transaction
164 *
165 * @since 2.19.6
166 *
167 * @return void
168 */
169 public static function beginTransaction()
170 {
171 global $wpdb;
172 $wpdb->query('START TRANSACTION');
173 }
174
175 /**
176 * Manually rolls back a transaction
177 *
178 * @since 2.19.6
179 *
180 * @return void
181 */
182 public static function rollback()
183 {
184 global $wpdb;
185 $wpdb->query('ROLLBACK');
186 }
187
188 /**
189 * Manually commits a transaction
190 *
191 * @since 2.19.6
192 *
193 * @return void
194 */
195 public static function commit()
196 {
197 global $wpdb;
198 $wpdb->query('COMMIT');
199 }
200
201 /**
202 * Used as a flag to tell QueryBuilder not to process the provided SQL
203 * If $args are provided, we will assume that dev wants to use DB::prepare method with raw SQL
204 *
205 * @param string $sql
206 * @param array ...$args
207 *
208 * @return RawSQL
209 */
210 public static function raw($sql, ...$args)
211 {
212 return new RawSQL($sql, ...$args);
213 }
214
215 /**
216 * Runs a query callable and checks to see if any unique SQL errors occurred when it was run
217 *
218 * @since 2.9.2
219 *
220 * @param Callable $queryCaller
221 *
222 * @return mixed
223 * @throws DatabaseQueryException
224 */
225 private static function runQueryWithErrorChecking($queryCaller)
226 {
227 global $wpdb, $EZSQL_ERROR;
228 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
229
230 $errorCount = is_array($EZSQL_ERROR) ? count($EZSQL_ERROR) : 0;
231 $hasShowErrors = $wpdb->hide_errors();
232
233 $output = $queryCaller();
234
235 if ($hasShowErrors) {
236 $wpdb->show_errors();
237 }
238
239 $wpError = self::getQueryErrors($errorCount);
240
241 if (!empty($wpError->errors)) {
242 throw DatabaseQueryException::create($wpError->get_error_messages());
243 }
244
245 return $output;
246 }
247
248 /**
249 * Retrieves the SQL errors stored by WordPress
250 *
251 * @since 2.9.2
252 *
253 * @param int $initialCount
254 *
255 * @return WP_Error
256 */
257 private static function getQueryErrors($initialCount = 0)
258 {
259 global $EZSQL_ERROR;
260
261 $wpError = new WP_Error();
262
263 if (is_array($EZSQL_ERROR)) {
264 for ($index = $initialCount, $indexMax = count($EZSQL_ERROR); $index < $indexMax; $index++) {
265 $error = $EZSQL_ERROR[$index];
266
267 if (empty($error['error_str']) || empty($error['query']) || 0 === strpos(
268 $error['query'],
269 'DESCRIBE '
270 )) {
271 continue;
272 }
273
274 $wpError->add('db_delta_error', $error['error_str']);
275 }
276 }
277
278 return $wpError;
279 }
280 }
281