suppress_errors(true); try { foreach(Schema::externalContacts($wpdb) as $table=>$sql){ if($table===\ABeCe\Booking\Infrastructure\Database\Tables::name( $wpdb, 'external_contacts' )){ if(!$wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s',$wpdb->esc_like($table)))){dbDelta($sql);$this->check($wpdb);} }else{ $columns=$wpdb->get_col($wpdb->prepare('SHOW COLUMNS FROM %i',$table));$this->check($wpdb);$changes=[]; foreach(['external_contact_id'=>'bigint unsigned DEFAULT NULL','external_customer_label'=>'varchar(190) DEFAULT NULL','external_contact_snapshot'=>'longtext NULL'] as $column=>$definition)if(!in_array($column,$columns,true))$changes[]='ADD '.$column.' '.$definition; $indexes=$wpdb->get_col($wpdb->prepare('SHOW INDEX FROM %i',$table),2);$this->check($wpdb); if(!in_array('idx_asb_bookings_external_contact',$indexes,true))$changes[]='ADD KEY idx_asb_bookings_external_contact (external_contact_id)'; if($changes){$wpdb->query($wpdb->prepare('ALTER TABLE %i '.implode(', ',$changes),$table));$this->check($wpdb);} } Schema::verify($wpdb,$table,$sql); } }finally{$wpdb->suppress_errors($old);} } private function check(\wpdb $wpdb): void {if($wpdb->last_error)throw new RuntimeException(__('ABeCe Booking database migration failed. Existing data has been retained.','abece-booking'));} }