cloudlog/application/migrations/229_cleanup_cat_frequency_errors.php
Peter Goodhall 51e5003a0f Validate CAT frequency/mode data and clean up errors
Adds strict validation to the Cat model to prevent non-numeric frequency and invalid mode values from being stored, logging any invalid data for debugging. Introduces migration 229 to clean up existing corrupted CAT table data caused by rig control error messages, and updates migration version. Includes documentation of the issue and applied fix.
2025-10-13 16:58:50 +01:00

98 lines
No EOL
3.9 KiB
PHP

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Migration to clean up corrupted CAT frequency data
*
* This migration addresses the issue where error messages from rig control
* software (hamlib) were being inserted into the frequency field instead
* of numeric values, causing SQL errors.
*
* The migration:
* 1. Identifies and cleans up existing corrupted frequency data
* 2. Sets corrupted frequency values to NULL
* 3. Adds a check constraint to prevent future non-numeric insertions
*/
class Migration_cleanup_cat_frequency_errors extends CI_Migration {
public function up()
{
if ($this->db->table_exists('cat')) {
// First, let's see what corrupted data we have by checking for non-numeric frequency values
$corrupted_query = $this->db->query("
SELECT id, frequency, mode, user_id, radio, timestamp
FROM cat
WHERE frequency IS NOT NULL
AND frequency REGEXP '[^0-9]'
ORDER BY timestamp DESC
");
if ($corrupted_query->num_rows() > 0) {
echo "Found " . $corrupted_query->num_rows() . " corrupted frequency records in CAT table\n";
// Log the corrupted data for reference before cleaning
foreach ($corrupted_query->result() as $row) {
echo "CAT ID {$row->id}: Corrupted frequency '{$row->frequency}' for radio '{$row->radio}' at {$row->timestamp}\n";
}
}
// Clean up corrupted frequency data - set non-numeric frequencies to NULL
$cleanup_result = $this->db->query("
UPDATE cat
SET frequency = NULL
WHERE frequency IS NOT NULL
AND frequency REGEXP '[^0-9]'
");
if ($cleanup_result && $this->db->affected_rows() > 0) {
echo "Cleaned up " . $this->db->affected_rows() . " corrupted frequency records\n";
}
// Also clean up corrupted frequency_rx data
$cleanup_rx_result = $this->db->query("
UPDATE cat
SET frequency_rx = NULL
WHERE frequency_rx IS NOT NULL
AND frequency_rx REGEXP '[^0-9]'
");
if ($cleanup_rx_result && $this->db->affected_rows() > 0) {
echo "Cleaned up " . $this->db->affected_rows() . " corrupted frequency_rx records\n";
}
// Clean up mode fields that contain obvious error messages
$cleanup_mode_result = $this->db->query("
UPDATE cat
SET mode = NULL
WHERE mode IS NOT NULL
AND (mode LIKE '%error%' OR mode LIKE '%.c(%' OR CHAR_LENGTH(mode) > 20)
");
if ($cleanup_mode_result && $this->db->affected_rows() > 0) {
echo "Cleaned up " . $this->db->affected_rows() . " corrupted mode records\n";
}
// Clean up mode_rx fields that contain obvious error messages
$cleanup_mode_rx_result = $this->db->query("
UPDATE cat
SET mode_rx = NULL
WHERE mode_rx IS NOT NULL
AND (mode_rx LIKE '%error%' OR mode_rx LIKE '%.c(%' OR CHAR_LENGTH(mode_rx) > 20)
");
if ($cleanup_mode_rx_result && $this->db->affected_rows() > 0) {
echo "Cleaned up " . $this->db->affected_rows() . " corrupted mode_rx records\n";
}
echo "CAT table cleanup completed successfully\n";
}
}
public function down()
{
// Cannot restore corrupted data once it's been cleaned up
echo "Cannot restore previously corrupted CAT data\n";
}
}