PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.9.0
GiveWP – Donation Plugin and Fundraising Platform v3.9.0
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
286 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 = null, array|string $where_format = null)
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 * @since 2.9.2
36 *
37 * @param $delta
38 *
39 * @return array
40 * @throws DatabaseQueryException
41 * @see dbDelta() for parameter and return details
42 *
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 * @since 2.9.6
57 *
58 * @param string $query
59 * @param mixed ...$args
60 *
61 * @return false|mixed
62 * @see WPDB::prepare() for usage details
63 *
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.22.0 add givewp_db_pre_query action
76 * @since 2.9.6
77 *
78 * @param $name
79 * @param $arguments
80 *
81 * @return mixed
82 * @throws DatabaseQueryException
83 */
84 public static function __callStatic($name, $arguments)
85 {
86 return self::runQueryWithErrorChecking(
87 static function () use ($name, $arguments) {
88 global $wpdb;
89
90 if (in_array($name, ['get_row', 'get_col', 'get_results', 'query'], true)) {
91 do_action('givewp_db_pre_query', current($arguments));
92 }
93
94 return call_user_func_array([$wpdb, $name], $arguments);
95 }
96 );
97 }
98
99 /**
100 * Get last insert ID
101 *
102 * @since 2.10.0
103 * @return int
104 */
105 public static function last_insert_id()
106 {
107 global $wpdb;
108
109 return $wpdb->insert_id;
110 }
111
112 /**
113 * Prefix given table name with $wpdb->prefix
114 *
115 * @param string $tableName
116 *
117 * @return string
118 */
119 public static function prefix($tableName)
120 {
121 global $wpdb;
122
123 return $wpdb->prefix . $tableName;
124 }
125
126 /**
127 * Create QueryBuilder instance
128 *
129 * @param string $table
130 * @param null|string $alias
131 *
132 * @return QueryBuilder
133 */
134 public static function table($table, $alias = null)
135 {
136 $builder = new QueryBuilder();
137 $builder->from($table, $alias);
138
139 return $builder;
140 }
141
142 /**
143 * Runs a transaction. If the callable works then the transaction is committed. If the callable throws an exception
144 * then the transaction is rolled back.
145 *
146 * @since 2.19.6
147 *
148 * @param callable $callback
149 *
150 * @return void
151 * @throws Exception
152 */
153 public static function transaction(callable $callback)
154 {
155 self::beginTransaction();
156
157 try {
158 $callback();
159 } catch (Exception $e) {
160 self::rollback();
161 throw $e;
162 }
163
164 self::commit();
165 }
166
167 /**
168 * Manually starts a transaction
169 *
170 * @since 2.19.6
171 *
172 * @return void
173 */
174 public static function beginTransaction()
175 {
176 global $wpdb;
177 $wpdb->query('START TRANSACTION');
178 }
179
180 /**
181 * Manually rolls back a transaction
182 *
183 * @since 2.19.6
184 *
185 * @return void
186 */
187 public static function rollback()
188 {
189 global $wpdb;
190 $wpdb->query('ROLLBACK');
191 }
192
193 /**
194 * Manually commits a transaction
195 *
196 * @since 2.19.6
197 *
198 * @return void
199 */
200 public static function commit()
201 {
202 global $wpdb;
203 $wpdb->query('COMMIT');
204 }
205
206 /**
207 * Used as a flag to tell QueryBuilder not to process the provided SQL
208 * If $args are provided, we will assume that dev wants to use DB::prepare method with raw SQL
209 *
210 * @param string $sql
211 * @param array ...$args
212 *
213 * @return RawSQL
214 */
215 public static function raw($sql, ...$args)
216 {
217 return new RawSQL($sql, ...$args);
218 }
219
220 /**
221 * Runs a query callable and checks to see if any unique SQL errors occurred when it was run
222 *
223 * @since 2.9.2
224 *
225 * @param Callable $queryCaller
226 *
227 * @return mixed
228 * @throws DatabaseQueryException
229 */
230 private static function runQueryWithErrorChecking($queryCaller)
231 {
232 global $wpdb, $EZSQL_ERROR;
233 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
234
235 $errorCount = is_array($EZSQL_ERROR) ? count($EZSQL_ERROR) : 0;
236 $hasShowErrors = $wpdb->hide_errors();
237
238 $output = $queryCaller();
239
240 if ($hasShowErrors) {
241 $wpdb->show_errors();
242 }
243
244 $wpError = self::getQueryErrors($errorCount);
245
246 if ( ! empty($wpError->errors)) {
247 throw new DatabaseQueryException($wpdb->last_query, $wpError->errors);
248 }
249
250 return $output;
251 }
252
253 /**
254 * Retrieves the SQL errors stored by WordPress
255 *
256 * @since 2.9.2
257 *
258 * @param int $initialCount
259 *
260 * @return WP_Error
261 */
262 private static function getQueryErrors($initialCount = 0)
263 {
264 global $EZSQL_ERROR;
265
266 $wpError = new WP_Error();
267
268 if (is_array($EZSQL_ERROR)) {
269 for ($index = $initialCount, $indexMax = count($EZSQL_ERROR); $index < $indexMax; $index++) {
270 $error = $EZSQL_ERROR[$index];
271
272 if (empty($error['error_str']) || empty($error['query']) || 0 === strpos(
273 $error['query'],
274 'DESCRIBE '
275 )) {
276 continue;
277 }
278
279 $wpError->add('db_delta_error', $error['error_str']);
280 }
281 }
282
283 return $wpError;
284 }
285 }
286