PluginProbe
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards / 5.5.84
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards v5.5.84
5.5.84 5.5.83 5.5.82 5.5.81 5.5.80 5.5.79 5.5.77 5.5.76 5.5.75 5.5.73 5.5.72 5.5.22 5.5.23 5.5.29 5.5.3 5.5.31 5.5.32 5.5.34 5.5.35 5.5.36 5.5.37 5.5.4 5.5.40 5.5.41 5.5.42 All 160 releases
← All changes | WPDataAccess/API/WPDA_Actions.php +291 -35 5.5.325.5.84 View file →
@@ -1,14 +1,18 @@
1 1 <?php
2 2
3 3 namespace WPDataAccess\API;
4 4
5 +use PDOException;
5 6 use WPDataAccess\Connection\WPDADB;
6 7 use WPDataAccess\Plugin_Table_Models\WPDA_Media_Model;
7 8 use WPDataAccess\Plugin_Table_Models\WPDA_Table_Settings_Model;
8 9 use WPDataAccess\Plugin_Table_Models\WPDA_User_Menus_Model;
10 +use WPDataAccess\Utilities\WPDA_Mail;
9 11 use WPDataAccess\WPDA;
10 12 class WPDA_Actions extends WPDA_API_Core {
13 + const WPDA_COPY_TABLE = 'wpda_copy_table';
14 +
11 15 protected $file_pointer;
12 16
13 17 protected $file_content;
14 18
@@ -38,10 +42,27 @@
38 42 'description' => __( 'Copy data from source to destination table', 'wp-data-access' ),
39 43 'sanitize_callback' => 'sanitize_text_field',
40 44 'validate_callback' => 'rest_validate_request_arg',
41 45 ),
46 + 'copy_key' => $this->get_param( 'copy_key' ),
42 47 ),
43 48 ) );
49 + register_rest_route( WPDA_API::WPDA_NAMESPACE, 'action/copy/start', array(
50 + 'methods' => array('POST'),
51 + 'callback' => array($this, 'action_copy_start'),
52 + 'permission_callback' => '__return_true',
53 + 'args' => array(
54 + 'copy_key' => $this->get_param( 'copy_key' ),
55 + ),
56 + ) );
57 + register_rest_route( WPDA_API::WPDA_NAMESPACE, 'action/copy/cancel', array(
58 + 'methods' => array('POST'),
59 + 'callback' => array($this, 'action_copy_cancel'),
60 + 'permission_callback' => '__return_true',
61 + 'args' => array(
62 + 'copy_key' => $this->get_param( 'copy_key' ),
63 + ),
64 + ) );
44 65 register_rest_route( WPDA_API::WPDA_NAMESPACE, 'action/truncate', array(
45 66 'methods' => array('POST'),
46 67 'callback' => array($this, 'action_truncate'),
47 68 'permission_callback' => '__return_true',
@@ -64,15 +85,144 @@
64 85 'methods' => array('POST'),
65 86 'callback' => array($this, 'action_import'),
66 87 'permission_callback' => '__return_true',
67 88 ) );
89 + register_rest_route( WPDA_API::WPDA_NAMESPACE, 'action/mail', array(
90 + 'methods' => array('POST'),
91 + 'callback' => array($this, 'action_mail'),
92 + 'permission_callback' => '__return_true',
93 + 'args' => array(
94 + 'to' => array(
95 + 'required' => false,
96 + 'type' => 'string',
97 + 'description' => __( 'To', 'wp-data-access' ),
98 + 'sanitize_callback' => 'sanitize_text_field',
99 + 'validate_callback' => 'rest_validate_request_arg',
100 + ),
101 + 'subject' => array(
102 + 'required' => false,
103 + 'type' => 'string',
104 + 'description' => __( 'Subject', 'wp-data-access' ),
105 + 'sanitize_callback' => 'sanitize_text_field',
106 + 'validate_callback' => 'rest_validate_request_arg',
107 + ),
108 + 'message' => array(
109 + 'required' => false,
110 + 'type' => 'string',
111 + 'description' => __( 'Message', 'wp-data-access' ),
112 + 'sanitize_callback' => 'sanitize_text_field',
113 + 'validate_callback' => 'rest_validate_request_arg',
114 + ),
115 + ),
116 + ) );
117 + register_rest_route( WPDA_API::WPDA_NAMESPACE, 'action/get_row_count', array(
118 + 'methods' => array('POST'),
119 + 'callback' => array($this, 'action_get_row_count'),
120 + 'permission_callback' => '__return_true',
121 + 'args' => array(
122 + 'dbs' => $this->get_param( 'dbs', __( 'Local database name or remote connection string', 'wp-data-access' ) ),
123 + 'tbl' => $this->get_param( 'tbl', __( 'Table name', 'wp-data-access' ) ),
124 + ),
125 + ) );
126 + register_rest_route( WPDA_API::WPDA_NAMESPACE, 'action/update_row_count', array(
127 + 'methods' => array('POST'),
128 + 'callback' => array($this, 'action_update_row_count'),
129 + 'permission_callback' => '__return_true',
130 + 'args' => array(
131 + 'dbs' => $this->get_param( 'dbs', __( 'Local database name or remote connection string', 'wp-data-access' ) ),
132 + 'tbl' => $this->get_param( 'tbl', __( 'Table name', 'wp-data-access' ) ),
133 + 'cnt' => $this->get_param( 'row_count', __( 'Hard row count estimation', 'wp-data-access' ) ),
134 + ),
135 + ) );
68 136 }
69 137
138 + public function action_update_row_count( $request ) {
139 + if ( !$this->current_user_can_access() ) {
140 + return $this->unauthorized();
141 + }
142 + if ( !$this->current_user_token_valid( $request ) ) {
143 + return $this->invalid_nonce();
144 + }
145 + $dbs = $request->get_param( 'dbs' );
146 + $tbl = $request->get_param( 'tbl' );
147 + $cnt = $request->get_param( 'cnt' );
148 + // Get table settings.
149 + $settings_db = WPDA_Table_Settings_Model::query( $tbl, $dbs );
150 + if ( isset( $settings_db[0]['wpda_table_settings'] ) ) {
151 + // Convert string to JSON.
152 + $settings = json_decode( $settings_db[0]['wpda_table_settings'], true );
153 + if ( isset( $settings['table_settings']['row_count_estimate_value_hard'] ) ) {
154 + // Store actual row count as hard estimate.
155 + $settings['table_settings']['row_count_estimate_value_hard'] = $cnt;
156 + // Save new hard row count.
157 + WPDA_Table_Settings_Model::update( $tbl, json_encode( $settings ), $dbs );
158 + }
159 + return $this->WPDA_Rest_Response( "OK" );
160 + } else {
161 + WPDA::wpda_log_wp_error( "Error saving hard row count. Please try again later." );
162 + }
163 + }
164 +
165 + public function action_get_row_count( $request ) {
166 + if ( !$this->current_user_can_access() ) {
167 + return $this->unauthorized();
168 + }
169 + if ( !$this->current_user_token_valid( $request ) ) {
170 + return $this->invalid_nonce();
171 + }
172 + $dbs = $request->get_param( 'dbs' );
173 + $tbl = $request->get_param( 'tbl' );
174 + $count = $this->get_row_count( $dbs, $tbl );
175 + return $this->WPDA_Rest_Response( $count );
176 + }
177 +
178 + public function action_set_row_count( $request ) {
179 + if ( !$this->current_user_can_access() ) {
180 + return $this->unauthorized();
181 + }
182 + if ( !$this->current_user_token_valid( $request ) ) {
183 + return $this->invalid_nonce();
184 + }
185 + $dbs = $request->get_param( 'dbs' );
186 + $tbl = $request->get_param( 'tbl' );
187 + $count = $this->get_row_count( $dbs, $tbl );
188 + return $this->WPDA_Rest_Response( $count );
189 + }
190 +
191 + public static function get_row_count( $dbs, $tbl ) {
192 + $wpdadb = WPDADB::get_db_connection( $dbs );
193 + if ( null === $wpdadb ) {
194 + /* translators: %s = database name */
195 + return sprintf( __( 'Database %s not available', 'wp-data-access' ), esc_attr( $dbs ) );
196 + }
197 + $suppress_errors = $wpdadb->suppress_errors;
198 + $wpdadb->suppress_errors = true;
199 + $count = $wpdadb->get_results( $wpdadb->prepare( 'select count(*) from `%1s`', array($tbl) ), 'ARRAY_N' );
200 + $wpdadb->suppress_errors = $suppress_errors;
201 + if ( $wpdadb->last_error !== '' ) {
202 + WPDA::wpda_log_wp_error( $wpdadb->last_error );
203 + }
204 + return ( isset( $count[0][0] ) ? $count[0][0] : false );
205 + }
206 +
207 + public function action_mail( $request ) {
208 + if ( !$this->current_user_can_access() ) {
209 + return $this->unauthorized();
210 + }
211 + if ( !$this->current_user_token_valid( $request ) ) {
212 + return $this->invalid_nonce();
213 + }
214 + $to = $request['to'];
215 + $subject = $request['subject'];
216 + $message = $request['message'];
217 + return WPDA_Mail::send( $to, $subject, $message );
218 + }
219 +
70 220 public function action_import( $request ) {
71 - if ( !$this->current_user_can_access( true ) ) {
221 + if ( !$this->current_user_can_access() ) {
72 222 return $this->unauthorized();
73 223 }
74 - if ( !$this->current_user_token_valid( $request, true ) ) {
224 + if ( !$this->current_user_token_valid( $request ) ) {
75 225 return $this->invalid_nonce();
76 226 }
77 227 $dbs = $this->sanitize_db_identifier( $request->get_param( 'dbs' ) );
78 228 $files = $request->get_file_params();
@@ -81,12 +231,10 @@
81 231 if ( 0 === count( $files ) || '' === trim( $dbs ) ) {
82 232 return $this->bad_request();
83 233 } else {
84 234 foreach ( $files as $file ) {
85 - // phpcs:disable
86 235 $temp_file_name = sanitize_text_field( $file['tmp_name'] );
87 236 // For Windows: do NOT unslash!
88 - // phpcs:enable
89 237 $temp_file_type = sanitize_text_field( wp_unslash( $file['type'] ) );
90 238 $orig_file_name = sanitize_text_field( wp_unslash( $file['name'] ) );
91 239 if ( 0 === $file['error'] && is_uploaded_file( $temp_file_name ) ) {
92 240 if ( 'application/zip' === $temp_file_type || 'application/x-zip' === $temp_file_type || 'application/x-zip-compressed' === $temp_file_type ) {
@@ -110,8 +258,9 @@
110 258 }
111 259 } else {
112 260 // Error reading ZIP file.
113 261 $errors = true;
262 + // phpcs:disable WordPress.WP.I18n.MissingTranslatorsComment
114 263 $response[] = array(
115 264 $orig_file_name => array(
116 265 'status' => 'error',
117 266 'msg' => sprintf( __( 'Import failed [error reading ZIP file `%s`]', 'wp-data-access' ), $orig_file_name ),
@@ -116,8 +265,9 @@
116 265 'status' => 'error',
117 266 'msg' => sprintf( __( 'Import failed [error reading ZIP file `%s`]', 'wp-data-access' ), $orig_file_name ),
118 267 ),
119 268 );
269 + // phpcs:enable WordPress.WP.I18n.MissingTranslatorsComment
120 270 }
121 271 } else {
122 272 // ZipArchive not installed.
123 273 $errors = true;
@@ -123,15 +273,17 @@
123 273 $errors = true;
124 274 $response[] = array(
125 275 $orig_file_name => array(
126 276 'status' => 'error',
127 - 'msg' => sprintf( __( 'Import failed - ZipArchive not installed %s', 'wp-data-access' ) ),
277 + 'msg' => __( 'Import failed - ZipArchive not installed', 'wp-data-access' ),
128 278 ),
129 279 );
130 280 }
131 281 } else {
132 282 // Process plain file.
283 + // phpcs:disable WordPress.WP.AlternativeFunctions.file_system_operations_fopen
133 284 $this->file_pointer = fopen( $temp_file_name, 'rb' );
285 + // phpcs:enable WordPress.WP.AlternativeFunctions.file_system_operations_fopen
134 286 $status = $this->import( $orig_file_name, $dbs );
135 287 if ( isset( $status['status'], $status['msg'] ) ) {
136 288 $errors = $errors || 'error' === $status['status'];
137 289 $response[] = array(
@@ -156,12 +308,12 @@
156 308 ) );
157 309 }
158 310
159 311 public function action_drop( $request ) {
160 - if ( !$this->current_user_can_access( true ) ) {
312 + if ( !$this->current_user_can_access() ) {
161 313 return $this->unauthorized();
162 314 }
163 - if ( !$this->current_user_token_valid( $request, true ) ) {
315 + if ( !$this->current_user_token_valid( $request ) ) {
164 316 return $this->invalid_nonce();
165 317 }
166 318 $dbs = $request->get_param( 'dbs' );
167 319 $tbl = $request->get_param( 'tbl' );
@@ -187,12 +339,12 @@
187 339 }
188 340 }
189 341
190 342 public function action_truncate( $request ) {
191 - if ( !$this->current_user_can_access( true ) ) {
343 + if ( !$this->current_user_can_access() ) {
192 344 return $this->unauthorized();
193 345 }
194 - if ( !$this->current_user_token_valid( $request, true ) ) {
346 + if ( !$this->current_user_token_valid( $request ) ) {
195 347 return $this->invalid_nonce();
196 348 }
197 349 $dbs = $request->get_param( 'dbs' );
198 350 $tbl = $request->get_param( 'tbl' );
@@ -213,12 +365,12 @@
213 365 }
214 366 }
215 367
216 368 public function action_copy( $request ) {
217 - if ( !$this->current_user_can_access( true ) ) {
369 + if ( !$this->current_user_can_access() ) {
218 370 return $this->unauthorized();
219 371 }
220 - if ( !$this->current_user_token_valid( $request, true ) ) {
372 + if ( !$this->current_user_token_valid( $request ) ) {
221 373 return $this->invalid_nonce();
222 374 }
223 375 $from_dbs = $request->get_param( 'from_dbs' );
224 376 $to_dbs = $request->get_param( 'to_dbs' );
@@ -224,8 +376,9 @@
224 376 $to_dbs = $request->get_param( 'to_dbs' );
225 377 $from_tbl = $request->get_param( 'from_tbl' );
226 378 $to_tbl = $request->get_param( 'to_tbl' );
227 379 $copy_data = $request->get_param( 'copy_data' );
380 + $copy_key = $request->get_param( 'copy_key' );
228 381 if ( '' === $from_dbs || '' === $to_dbs || '' === $from_tbl || '' === $to_tbl ) {
229 382 return $this->bad_request();
230 383 }
231 384 $msg = $this->copy(
@@ -232,9 +385,10 @@
232 385 $from_dbs,
233 386 $to_dbs,
234 387 $from_tbl,
235 388 $to_tbl,
236 - $copy_data
389 + $copy_data,
390 + $copy_key
237 391 );
238 392 if ( '' === $msg ) {
239 393 return $this->WPDA_Rest_Response( __( 'Table successfully copied', 'wp-data-access' ) );
240 394 } else {
@@ -243,13 +397,49 @@
243 397 ));
244 398 }
245 399 }
246 400
401 + public function action_copy_start( $request ) {
402 + if ( !$this->current_user_can_access() ) {
403 + return $this->unauthorized();
404 + }
405 + if ( !$this->current_user_token_valid( $request ) ) {
406 + return $this->invalid_nonce();
407 + }
408 + if ( !WPDA::current_user_is_admin() ) {
409 + return $this->unauthorized();
410 + }
411 + $copy_key = $request->get_param( 'copy_key' );
412 + if ( '' === $copy_key ) {
413 + return $this->bad_request();
414 + }
415 + $this->copy_start( $copy_key );
416 + return $this->WPDA_Rest_Response( 'ok', self::copy_in_progress() );
417 + }
418 +
419 + public function action_copy_cancel( $request ) {
420 + if ( !$this->current_user_can_access() ) {
421 + return $this->unauthorized();
422 + }
423 + if ( !$this->current_user_token_valid( $request ) ) {
424 + return $this->invalid_nonce();
425 + }
426 + if ( !WPDA::current_user_is_admin() ) {
427 + return $this->unauthorized();
428 + }
429 + $copy_key = $request->get_param( 'copy_key' );
430 + if ( '' === $copy_key ) {
431 + return $this->bad_request();
432 + }
433 + $this->copy_stop( $copy_key );
434 + return $this->WPDA_Rest_Response( 'ok', self::copy_in_progress() );
435 + }
436 +
247 437 public function action_rename( $request ) {
248 - if ( !$this->current_user_can_access( true ) ) {
438 + if ( !$this->current_user_can_access() ) {
249 439 return $this->unauthorized();
250 440 }
251 - if ( !$this->current_user_token_valid( $request, true ) ) {
441 + if ( !$this->current_user_token_valid( $request ) ) {
252 442 return $this->invalid_nonce();
253 443 }
254 444 $dbs = $request->get_param( 'dbs' );
255 445 $from_tbl = $request->get_param( 'from_tbl' );
@@ -285,8 +475,9 @@
285 475 return 'Unauthorized';
286 476 }
287 477 $wpdadb = WPDADB::get_db_connection( $dbs );
288 478 if ( null === $wpdadb ) {
479 + /* translators: %s = database name */
289 480 return sprintf( __( 'Remote database %s not available', 'wp-data-access' ), esc_attr( $dbs ) );
290 481 }
291 482 $suppress_errors = $wpdadb->suppress_errors;
292 483 $wpdadb->suppress_errors = true;
@@ -299,9 +490,10 @@
299 490 $from_dbs,
300 491 $to_dbs,
301 492 $from_tbl,
302 493 $to_tbl,
303 - $copy_data
494 + $copy_data,
495 + $copy_key
304 496 ) {
305 497 // All values have already been validated and sanitized in the rest route registration.
306 498 if ( !WPDA::current_user_is_admin() ) {
307 499 return 'Unauthorized';
@@ -307,12 +499,14 @@
307 499 return 'Unauthorized';
308 500 }
309 501 $wpdadb_from = WPDADB::get_db_connection( $from_dbs );
310 502 if ( null === $wpdadb_from ) {
503 + /* translators: %s = database name */
311 504 return sprintf( __( 'Remote database %s not available', 'wp-data-access' ), esc_attr( $from_dbs ) );
312 505 }
313 506 $wpdadb_to = WPDADB::get_db_connection( $to_dbs );
314 507 if ( null === $wpdadb_to ) {
508 + /* translators: %s = database name */
315 509 return sprintf( __( 'Remote database %s not available', 'wp-data-access' ), esc_attr( $to_dbs ) );
316 510 }
317 511 $suppress_errors_from = $wpdadb_from->suppress_errors;
318 512 $wpdadb_from->suppress_errors = true;
@@ -356,34 +550,96 @@
356 550 return $wpdadb_to->last_error;
357 551 }
358 552 if ( '1' === $copy_data ) {
359 553 // Copy data from source to destination table.
554 + // Prevent time out.
555 + // phpcs:disable Squiz.PHP.DiscouragedFunctions.Discouraged
360 556 set_time_limit( 0 );
361 - // Prevent time out.
362 - // Use a cursor to process all rows and prevent exhausting memory.
363 - // Process 100 rows per batch to prevent exhausting memory.
364 - $buffer_size = 100;
557 + // phpcs:enable Squiz.PHP.DiscouragedFunctions.Discouraged
558 + // Buffer rows to prevent exhausting memory.
559 + $buffer_size = 1000;
560 + // Default buffer
561 + $settings_db = WPDA_Table_Settings_Model::query( $from_tbl, $from_dbs );
562 + if ( isset( $settings_db[0]['wpda_table_settings'] ) ) {
563 + // Convert string to JSON.
564 + $settings = json_decode( $settings_db[0]['wpda_table_settings'], true );
565 + if ( isset( $settings['table_settings']['query_buffer_size'] ) && is_numeric( $settings['table_settings']['query_buffer_size'] ) ) {
566 + $buffer_size = intval( $settings['table_settings']['query_buffer_size'] );
567 + }
568 + }
365 569 $index = 0;
366 570 $loop_done = false;
571 + $wpdadb_from->save_queries = false;
572 + $wpdadb_to->save_queries = false;
367 573 while ( !$loop_done ) {
368 574 // Get rows.
369 - $rows = $wpdadb_from->get_results( $wpdadb_from->prepare( 'select * from `%1s` limit %1s offset %1s', array($from_tbl, $buffer_size, $index * $buffer_size) ), 'ARRAY_A' );
575 + $rows = $wpdadb_from->get_results( $wpdadb_from->prepare( 'select * from `%1s` limit %d offset %d', array($from_tbl, $buffer_size, $index * $buffer_size) ), 'ARRAY_A' );
370 576 // Process rows.
371 577 foreach ( $rows as $row ) {
372 578 $wpdadb_to->insert( $to_tbl, $row );
373 579 }
580 + // Cleanup = IMPORTANT!
581 + $wpdadb_from->flush();
582 + $wpdadb_to->flush();
583 + $wpdadb_to->queries = array();
584 + $wpdadb_to->last_query = '';
585 + $wpdadb_to->last_error = '';
586 + $wpdadb_to->result = null;
587 + $wpdadb_to->num_rows = 0;
588 + $wpdadb_to->rows_affected = 0;
589 + wp_cache_flush();
590 + if ( function_exists( 'gc_collect_cycles' ) ) {
591 + gc_collect_cycles();
592 + }
374 593 if ( 100 > count( $rows ) ) {
375 594 // No more rows to process.
376 595 $loop_done = true;
377 596 }
597 + unset($rows);
378 598 $index++;
599 + // Check if job was cancelled
600 + $in_progress = self::copy_in_progress();
601 + if ( !in_array( $copy_key, $in_progress ) ) {
602 + $loop_done = true;
603 + }
379 604 }
380 605 }
381 606 $wpdadb_from->suppress_errors = $suppress_errors_from;
382 607 $wpdadb_to->suppress_errors = $suppress_errors_to;
608 + $this->copy_stop( $copy_key );
609 + if ( '' !== $wpdadb_from->last_error ) {
610 + return $wpdadb_from->last_error;
611 + }
612 + if ( '' !== $wpdadb_to->last_error ) {
613 + return $wpdadb_to->last_error;
614 + }
383 615 return '';
384 616 }
385 617
618 + private function copy_start( $copy_key ) {
619 + $in_progress = self::copy_in_progress();
620 + $in_progress[] = $copy_key;
621 + update_user_meta( WPDA::get_current_user_id(), self::WPDA_COPY_TABLE, $in_progress );
622 + }
623 +
624 + private function copy_stop( $copy_key ) {
625 + $in_progress = self::copy_in_progress();
626 + if ( ($array_key = array_search( $copy_key, $in_progress )) !== false ) {
627 + unset($in_progress[$array_key]);
628 + $in_progress = array_values( $in_progress );
629 + // Reset indexes to start at 0
630 + }
631 + update_user_meta( WPDA::get_current_user_id(), self::WPDA_COPY_TABLE, $in_progress );
632 + }
633 +
634 + public static function copy_in_progress() {
635 + $in_progress = get_user_meta( WPDA::get_current_user_id(), self::WPDA_COPY_TABLE, true );
636 + if ( $in_progress === false || $in_progress === '' ) {
637 + return array();
638 + }
639 + return maybe_unserialize( $in_progress );
640 + }
641 +
386 642 private function truncate( $dbs, $tbl ) {
387 643 // All values have already been validated and sanitized in the rest route registration.
388 644 if ( !WPDA::current_user_is_admin() ) {
389 645 return 'Unauthorized';
@@ -389,8 +645,9 @@
389 645 return 'Unauthorized';
390 646 }
391 647 $wpdadb = WPDADB::get_db_connection( $dbs );
392 648 if ( null === $wpdadb ) {
649 + /* translators: %s = database name */
393 650 return sprintf( __( 'Remote database %s not available', 'wp-data-access' ), esc_attr( $dbs ) );
394 651 }
395 652 $suppress_errors = $wpdadb->suppress_errors;
396 653 $wpdadb->suppress_errors = true;
@@ -405,8 +662,9 @@
405 662 return 'Unauthorized';
406 663 }
407 664 $wpdadb = WPDADB::get_db_connection( $dbs );
408 665 if ( null === $wpdadb ) {
666 + /* translators: %s = database name */
409 667 return sprintf( __( 'Remote database %s not available', 'wp-data-access' ), esc_attr( $dbs ) );
410 668 }
411 669 $suppress_errors = $wpdadb->suppress_errors;
412 670 $wpdadb->suppress_errors = true;
@@ -414,8 +672,11 @@
414 672 $wpdadb->query( $wpdadb->prepare( 'drop view `%1s`', array($tbl) ) );
415 673 } else {
416 674 $wpdadb->query( $wpdadb->prepare( 'drop table `%1s`', array($tbl) ) );
417 675 }
676 + if ( '' !== $wpdadb->last_error ) {
677 + return $wpdadb->last_error;
678 + }
418 679 $this->post_drop_table( $dbs, $tbl );
419 680 $wpdadb->suppress_errors = $suppress_errors;
420 681 return $wpdadb->last_error;
421 682 }
@@ -422,26 +683,15 @@
422 683
423 684 private function post_drop_table( $dbs, $tbl ) {
424 685 global $wpdb;
425 686 $suppress = $wpdb->suppress_errors( true );
687 + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQLPlaceholders, WordPress.DB.PreparedSQLPlaceholders.UnquotedComplexPlaceholder -- plugin table
426 688 // Table settings...
427 - $wpdb->query( $wpdb->prepare(
428 - 'delete from `%1s` where wpda_schema_name = %s and wpda_table_name = %s ',
429 - // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders
430 - array(WPDA::remove_backticks( WPDA_Table_Settings_Model::get_base_table_name() ), $dbs, $tbl)
431 - ) );
689 + $wpdb->query( $wpdb->prepare( 'delete from `%1s` where wpda_schema_name = %s and wpda_table_name = %s ', array(WPDA::remove_backticks( WPDA_Table_Settings_Model::get_base_table_name() ), $dbs, $tbl) ) );
432 690 // WordPress media library columns...
433 - $wpdb->query( $wpdb->prepare(
434 - 'delete from `%1s` where media_schema_name = %s and media_table_name = %s ',
435 - // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders
436 - array(WPDA::remove_backticks( WPDA_Media_Model::get_base_table_name() ), $dbs, $tbl)
437 - ) );
691 + $wpdb->query( $wpdb->prepare( 'delete from `%1s` where media_schema_name = %s and media_table_name = %s ', array(WPDA::remove_backticks( WPDA_Media_Model::get_base_table_name() ), $dbs, $tbl) ) );
438 692 // Data menus...
439 - $wpdb->query( $wpdb->prepare(
440 - 'delete from `%1s` where menu_schema_name = %s and menu_table_name = %s ',
441 - // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders
442 - array(WPDA::remove_backticks( WPDA_User_Menus_Model::get_base_table_name() ), $dbs, $tbl)
443 - ) );
693 + $wpdb->query( $wpdb->prepare( 'delete from `%1s` where menu_schema_name = %s and menu_table_name = %s ', array(WPDA::remove_backticks( WPDA_User_Menus_Model::get_base_table_name() ), $dbs, $tbl) ) );
444 694 $wpdb->suppress_errors( $suppress );
445 695 }
446 696
447 697 private function import( $file_name, $dbs ) {
@@ -454,17 +704,21 @@
454 704 $errors = array();
455 705 global $wpdb;
456 706 $wpdadb = WPDADB::get_db_connection( $dbs );
457 707 if ( null === $wpdadb ) {
708 + // phpcs:disable WordPress.WP.I18n.MissingTranslatorsComment
458 709 return array(
459 710 'status' => 'error',
460 711 'msg' => sprintf( __( 'ERROR - Remote database %s not available', 'wp-data-access' ), esc_attr( $dbs ) ),
461 712 );
713 + // phpcs:enable WordPress.WP.I18n.MissingTranslatorsComment
462 714 }
463 715 $suppress = $wpdadb->suppress_errors( true );
464 716 if ( false !== $this->file_pointer ) {
465 717 while ( !feof( $this->file_pointer ) ) {
718 + // phpcs:disable WordPress.WP.AlternativeFunctions.file_system_operations_fread
466 719 $this->file_content .= fread( $this->file_pointer, 4096 );
720 + // phpcs:enable WordPress.WP.AlternativeFunctions.file_system_operations_fread
467 721 // Replace WP prefix and WPDA prefix.
468 722 $this->file_content = str_replace( '{wp_schema}', $wpdb->dbname, $this->file_content );
469 723 $this->file_content = str_replace( '{wp_prefix}', $wpdb->prefix, $this->file_content );
470 724 $this->file_content = str_replace( '{wpda_prefix}', 'wpda', $this->file_content );
@@ -494,8 +748,9 @@
494 748 }
495 749 }
496 750 $wpdadb->suppress_errors( $suppress );
497 751 // Process file content.
752 + // phpcs:disable WordPress.WP.I18n.MissingTranslatorsComment
498 753 if ( 0 < count( $errors ) ) {
499 754 return array(
500 755 'status' => 'error',
501 756 'msg' => sprintf( __( 'Import `%s` failed [check import file]', 'wp-data-access' ), $file_name ),
@@ -508,7 +763,8 @@
508 763 'msg' => sprintf( __( 'Import `%s` completed succesfully', 'wp-data-access' ), $file_name ),
509 764 'errors' => $errors,
510 765 );
511 766 }
767 + // phpcs:enable WordPress.WP.I18n.MissingTranslatorsComment
512 768 }
513 769
514 770 }