PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.22.2
GiveWP – Donation Plugin and Fundraising Platform v2.22.2
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
Actions 3 years ago Exceptions 4 years ago DB.php 3 years ago ServiceProvider.php 3 years ago
DB.php
287 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 Give\Helpers\Hooks;
10 use WP_Error;
11
12 /**
13 * Class DB
14 *
15 * A static decorator for the $wpdb class and decorator function which does SQL error checking when performing queries.
16 * If a SQL error occurs a DatabaseQueryException is thrown.
17 *
18 * @method static int|bool query(string $query)
19 * @method static int|false insert(string $table, array $data, array|string $format)
20 * @method static int|false delete(string $table, array $where, array|string $where_format)
21 * @method static int|false update(string $table, array $data, array $where, array|string $format, array|string $where_format)
22 * @method static int|false replace(string $table, array $data, array|string $format)
23 * @method static null|string get_var(string $query = null, int $x = 0, int $y = 0)
24 * @method static array|object|null|void get_row(string $query = null, string $output = OBJECT, int $y = 0)
25 * @method static array get_col(string $query = null, int $x = 0)
26 * @method static array|object|null get_results(string $query = null, string $output = OBJECT)
27 * @method static string get_charset_collate()
28 * @method static string esc_like(string $text)
29 * @method static string remove_placeholder_escape(string $text)
30 */
31 class DB
32 {
33 /**
34 * Runs the dbDelta function and returns a WP_Error with any errors that occurred during the process
35 *
36 * @see dbDelta() for parameter and return details
37 *
38 * @since 2.9.2
39 *
40 * @param $delta
41 *
42 * @return array
43 * @throws DatabaseQueryException
44 */
45 public static function delta($delta)
46 {
47 return self::runQueryWithErrorChecking(
48 function () use ($delta) {
49 return dbDelta($delta);
50 }
51 );
52 }
53
54 /**
55 * A convenience method for the $wpdb->prepare method
56 *
57 * @see WPDB::prepare() for usage details
58 *
59 * @since 2.9.6
60 *
61 * @param string $query
62 * @param mixed ...$args
63 *
64 * @return false|mixed
65 */
66 public static function prepare($query, ...$args)
67 {
68 global $wpdb;
69
70 return $wpdb->prepare($query, ...$args);
71 }
72
73 /**
74 * Magic method which calls the static method on the $wpdb while performing error checking
75 *
76 * @since 2.22.0 add givewp_db_pre_query action
77 * @since 2.9.6
78 *
79 * @param $name
80 * @param $arguments
81 *
82 * @return mixed
83 * @throws DatabaseQueryException
84 */
85 public static function __callStatic($name, $arguments)
86 {
87 return self::runQueryWithErrorChecking(
88 static function () use ($name, $arguments) {
89 global $wpdb;
90
91 if (in_array($name, ['get_row', 'get_col', 'get_results', 'query'], true)) {
92 Hooks::doAction('givewp_db_pre_query', current($arguments));
93 }
94
95 return call_user_func_array([$wpdb, $name], $arguments);
96 }
97 );
98 }
99
100 /**
101 * Get last insert ID
102 *
103 * @since 2.10.0
104 * @return int
105 */
106 public static function last_insert_id()
107 {
108 global $wpdb;
109
110 return $wpdb->insert_id;
111 }
112
113 /**
114 * Prefix given table name with $wpdb->prefix
115 *
116 * @param string $tableName
117 *
118 * @return string
119 */
120 public static function prefix($tableName)
121 {
122 global $wpdb;
123
124 return $wpdb->prefix . $tableName;
125 }
126
127 /**
128 * Create QueryBuilder instance
129 *
130 * @param string $table
131 * @param null|string $alias
132 *
133 * @return QueryBuilder
134 */
135 public static function table($table, $alias = null)
136 {
137 $builder = new QueryBuilder();
138 $builder->from($table, $alias);
139
140 return $builder;
141 }
142
143 /**
144 * Runs a transaction. If the callable works then the transaction is committed. If the callable throws an exception
145 * then the transaction is rolled back.
146 *
147 * @since 2.19.6
148 *
149 * @param callable $callback
150 *
151 * @return void
152 * @throws Exception
153 */
154 public static function transaction(callable $callback)
155 {
156 self::beginTransaction();
157
158 try {
159 $callback();
160 } catch (Exception $e) {
161 self::rollback();
162 throw $e;
163 }
164
165 self::commit();
166 }
167
168 /**
169 * Manually starts a transaction
170 *
171 * @since 2.19.6
172 *
173 * @return void
174 */
175 public static function beginTransaction()
176 {
177 global $wpdb;
178 $wpdb->query('START TRANSACTION');
179 }
180
181 /**
182 * Manually rolls back a transaction
183 *
184 * @since 2.19.6
185 *
186 * @return void
187 */
188 public static function rollback()
189 {
190 global $wpdb;
191 $wpdb->query('ROLLBACK');
192 }
193
194 /**
195 * Manually commits a transaction
196 *
197 * @since 2.19.6
198 *
199 * @return void
200 */
201 public static function commit()
202 {
203 global $wpdb;
204 $wpdb->query('COMMIT');
205 }
206
207 /**
208 * Used as a flag to tell QueryBuilder not to process the provided SQL
209 * If $args are provided, we will assume that dev wants to use DB::prepare method with raw SQL
210 *
211 * @param string $sql
212 * @param array ...$args
213 *
214 * @return RawSQL
215 */
216 public static function raw($sql, ...$args)
217 {
218 return new RawSQL($sql, ...$args);
219 }
220
221 /**
222 * Runs a query callable and checks to see if any unique SQL errors occurred when it was run
223 *
224 * @since 2.9.2
225 *
226 * @param Callable $queryCaller
227 *
228 * @return mixed
229 * @throws DatabaseQueryException
230 */
231 private static function runQueryWithErrorChecking($queryCaller)
232 {
233 global $wpdb, $EZSQL_ERROR;
234 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
235
236 $errorCount = is_array($EZSQL_ERROR) ? count($EZSQL_ERROR) : 0;
237 $hasShowErrors = $wpdb->hide_errors();
238
239 $output = $queryCaller();
240
241 if ($hasShowErrors) {
242 $wpdb->show_errors();
243 }
244
245 $wpError = self::getQueryErrors($errorCount);
246
247 if (!empty($wpError->errors)) {
248 throw new DatabaseQueryException($wpdb->last_query, $wpError->errors);
249 }
250
251 return $output;
252 }
253
254 /**
255 * Retrieves the SQL errors stored by WordPress
256 *
257 * @since 2.9.2
258 *
259 * @param int $initialCount
260 *
261 * @return WP_Error
262 */
263 private static function getQueryErrors($initialCount = 0)
264 {
265 global $EZSQL_ERROR;
266
267 $wpError = new WP_Error();
268
269 if (is_array($EZSQL_ERROR)) {
270 for ($index = $initialCount, $indexMax = count($EZSQL_ERROR); $index < $indexMax; $index++) {
271 $error = $EZSQL_ERROR[$index];
272
273 if (empty($error['error_str']) || empty($error['query']) || 0 === strpos(
274 $error['query'],
275 'DESCRIBE '
276 )) {
277 continue;
278 }
279
280 $wpError->add('db_delta_error', $error['error_str']);
281 }
282 }
283
284 return $wpError;
285 }
286 }
287