From 438bb4e7b28a34b1a973f1d01b631a3da593b2ad Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Fri, 18 Jul 2025 16:01:31 +0100 Subject: [PATCH] Bug 40337: (QA follow-up) Make database update idempotent Running this update twice fails before this patch with: ERROR: {UNKNOWN}: DBI Exception: DBD::mysql::db do failed: Data truncated for column 'checkprevcheckout' at row 3 at /kohadevbox/koha/C4/Installer.pm line 825 Signed-off-by: Martin Renvoize --- installer/data/mysql/db_revs/250600003.pl | 81 +++++++++++++++++++---- 1 file changed, 69 insertions(+), 12 deletions(-) diff --git a/installer/data/mysql/db_revs/250600003.pl b/installer/data/mysql/db_revs/250600003.pl index 951097d56dd..da2e544841c 100755 --- a/installer/data/mysql/db_revs/250600003.pl +++ b/installer/data/mysql/db_revs/250600003.pl @@ -8,25 +8,82 @@ return { my ($args) = @_; my ( $dbh, $out ) = @$args{qw(dbh out)}; - $dbh->do( + my $col_type_borrowers = $dbh->selectrow_array( q{ - ALTER TABLE borrowers - MODIFY COLUMN `checkprevcheckout` enum('yes', 'no', 'inherit') NOT NULL DEFAULT 'inherit' COMMENT 'produce a warning for this patron if this item has previously been checked out to this patron if ''yes'', not if ''no'', defer to category setting if ''inherit''.' - } + SELECT COLUMN_TYPE + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'borrowers' + AND COLUMN_NAME = 'checkprevcheckout' + } ); - $dbh->do( - q{ - ALTER TABLE categories - MODIFY COLUMN `checkprevcheckout` enum('yes', 'no', 'inherit') NOT NULL DEFAULT 'inherit' COMMENT 'produce a warning for this patron category if this item has previously been checked out to this patron if ''yes'', not if ''no'', defer to syspref setting if ''inherit''.' + if ( $col_type_borrowers !~ /^enum/i ) { + $dbh->do( + q{ + UPDATE borrowers + SET checkprevcheckout = 'inherit' + WHERE checkprevcheckout NOT IN ('yes','no','inherit'); + } + ); + $dbh->do( + q{ + ALTER TABLE borrowers + MODIFY COLUMN `checkprevcheckout` enum('yes', 'no', 'inherit') NOT NULL DEFAULT 'inherit' COMMENT 'produce a warning for this patron if this item has previously been checked out to this patron if ''yes'', not if ''no'', defer to category setting if ''inherit''.' + } + ); } - ); - $dbh->do( + my $col_type_categories = $dbh->selectrow_array( q{ - ALTER TABLE deletedborrowers - MODIFY COLUMN `checkprevcheckout` enum('yes', 'no', 'inherit') NOT NULL DEFAULT 'inherit' COMMENT 'produce a warning for this patron if this item has previously been checked out to this patron if ''yes'', not if ''no'', defer to category setting if ''inherit''.' + SELECT COLUMN_TYPE + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'categories' + AND COLUMN_NAME = 'checkprevcheckout' + } + ); + + if ( $col_type_categories !~ /^enum/i ) { + $dbh->do( + q{ + UPDATE categories + SET checkprevcheckout = 'inherit' + WHERE checkprevcheckout NOT IN ('yes','no','inherit'); + } + ); + $dbh->do( + q{ + ALTER TABLE categories + MODIFY COLUMN `checkprevcheckout` enum('yes', 'no', 'inherit') NOT NULL DEFAULT 'inherit' COMMENT 'produce a warning for this patron category if this item has previously been checked out to this patron if ''yes'', not if ''no'', defer to syspref setting if ''inherit''.' + } + ); } + + my $col_type_deletedborrowers = $dbh->selectrow_array( + q{ + SELECT COLUMN_TYPE + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'deletedborrowers' + AND COLUMN_NAME = 'checkprevcheckout' + } ); + + if ( $col_type_deletedborrowers !~ /^enum/i ) { + $dbh->do( + q{ + UPDATE deletedborrowers + SET checkprevcheckout = 'inherit' + WHERE checkprevcheckout NOT IN ('yes','no','inherit'); + } + ); + $dbh->do( + q{ + ALTER TABLE deletedborrowers + MODIFY COLUMN `checkprevcheckout` enum('yes', 'no', 'inherit') NOT NULL DEFAULT 'inherit' COMMENT 'produce a warning for this patron if this item has previously been checked out to this patron if ''yes'', not if ''no'', defer to category setting if ''inherit''.' + } + ); + } }, }; -- 2.50.1