Convert sensor data denominator to a signed int because PostgreSQL does not support unsigned. #213

This commit is contained in:
Michael Stenta 2020-04-09 10:58:57 -04:00
parent 0bbec04d09
commit 9c392b93e8
1 changed files with 30 additions and 1 deletions

View File

@ -41,7 +41,6 @@ function farm_sensor_listener_schema() {
'value_denominator' => array(
'description' => 'Value denominator',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 1,
),
@ -80,3 +79,33 @@ function farm_sensor_listener_update_7000(&$sandbox) {
);
db_change_field('farm_sensor_data', 'timestamp', 'timestamp', $timestamp, $timestamp_keys);
}
/**
* Alter sensor data schema to make denominator signed.
*
* This is done so the field is leveled between MySQL and Postgres and migration
* is possible between the two. When an integer is unsigned in Postges, Drupal
* will create a bigint for it, while with MySQL, it would create a regular int.
*
* @see https://www.drupal.org/project/fraction/issues/2729315
*/
function farm_sensor_listener_update_7001(&$sandbox) {
// Max value on signed int for MySQL or int in PostgreSQL is 2147483648. If
// the max value is bigger than the limits for MySQL/Postgres, warn the user.
$max_denominator = db_query('SELECT MAX(value_denominator) FROM {farm_sensor_data}')->fetchField();
if ($max_denominator >= 2147483648) {
throw new DrupalUpdateException('Fraction works with signed integer schema fields for denominator, some of your values in the database exceed this limit, please check the farm_sensor_data table and review the data before running this update. See https://www.drupal.org/project/fraction/issues/2729315 for further details.');
}
// Alter schema to make denominator signed.
db_change_field('farm_sensor_data', 'value_denominator', 'value_denominator', array(
'description' => 'Fraction denominator value',
'type' => 'int',
'not null' => TRUE,
'default' => 1,
));
// Return a message.
return 'Sensor data table schema updated.';
}