query($sql); } if (!self::tableHasColumn('edge_gateway_update_jobs', 'command_job_id')) { $db->query( "ALTER TABLE edge_gateway_update_jobs ADD COLUMN command_job_id INT NULL AFTER gateway_id, ADD INDEX idx_edge_gateway_update_command (command_job_id)" ); } if (!self::tableHasColumn('edge_gateway_command_jobs', 'delivery_json')) { $db->query( "ALTER TABLE edge_gateway_command_jobs ADD COLUMN delivery_json JSON NULL AFTER response_json" ); } if (!self::tableHasColumn('edge_gateway_shell_action_jobs', 'delivery_json')) { $db->query( "ALTER TABLE edge_gateway_shell_action_jobs ADD COLUMN delivery_json JSON NULL AFTER payload_json" ); } if (!self::tableHasColumn('edge_gateway_update_jobs', 'delivery_json')) { $db->query( "ALTER TABLE edge_gateway_update_jobs ADD COLUMN delivery_json JSON NULL AFTER completed_at" ); } self::$initialized = true; } private static function tableHasColumn(string $table, string $column): bool { global $db; $table = $db->escape_string($table); $column = $db->escape_string($column); $database = $db->escape_string($db->getDatabase()); $result = $db->query( "SELECT COUNT(*) AS c FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '$database' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$column'" ); if (!$result) { return false; } $row = $result->fetch_assoc(); return ((int)($row['c'] ?? 0)) > 0; } }