Bug 13380: Follow-up - only run database update, when it hasn't been run already
authorKatrin Fischer <Katrin.Fischer.83@web.de>
Mon, 23 Mar 2015 20:42:14 +0000 (21:42 +0100)
committerTomas Cohen Arazi <tomascohen@gmail.com>
Wed, 8 Apr 2015 14:08:20 +0000 (11:08 -0300)
As the ORDER_CANCELLATION_REASON authorised value has been
backported to 3.18.5, we need to make sure that the database
update is only run once.

This patch adds a check for the existance of the authorised
value in order to decide if the databaes update can be run.

To test:
- Create a branch 3.19.00.016
- Make sure you have a few orders where the cancellationreason
  is set (cancel an order, enter a reason)
- Update your branch to master + this patch
- Run the web installer
- ORDER_CANCELLATION_REASON authorised value category is created
- Reset your system preference Version to 3.19.00.015
- Run database update again - no changes are made, all is fine

Or:
- Create a branch 3.18.04 with cancelled orders
- Update to latest 3.18.x
- Make sure ORDER_CANCELLATION_REASON has been created
- Dump database
- Switch to master without this patch
- Run update - verify more O_C_R were created (bad)
- Load database
- Update to master with this patch
- All should be fine

Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
installer/data/mysql/updatedatabase.pl

index 0592a94..78e79d3 100755 (executable)
@@ -9876,36 +9876,43 @@ if ( CheckVersion($DBversion) ) {
 
 $DBversion = "3.19.00.016";
 if(CheckVersion($DBversion)) {
-    $dbh->do(q{
-        INSERT INTO authorised_values (category, authorised_value, lib) VALUES
-         ('ORDER_CANCELLATION_REASON', 0, 'No reason provided'),
-         ('ORDER_CANCELLATION_REASON', 1, 'Out of stock'),
-         ('ORDER_CANCELLATION_REASON', 2, 'Restocking')
-    });
+    my @order_cancellation_reason = $dbh->selectrow_array("SELECT count(*) FROM authorised_values WHERE category='ORDER_CANCELLATION_REASON'");
+    if ($order_cancellation_reason[0] == 0) {
+        $dbh->do(q{
+            INSERT INTO authorised_values (category, authorised_value, lib) VALUES
+             ('ORDER_CANCELLATION_REASON', 0, 'No reason provided'),
+             ('ORDER_CANCELLATION_REASON', 1, 'Out of stock'),
+             ('ORDER_CANCELLATION_REASON', 2, 'Restocking')
+        });
 
-    my $already_existing_reasons = $dbh->selectcol_arrayref(q{
-        SELECT DISTINCT( cancellationreason )
-        FROM aqorders;
-    }, { Slice => {} });
+        my $already_existing_reasons = $dbh->selectcol_arrayref(q{
+            SELECT DISTINCT( cancellationreason )
+            FROM aqorders;
+        }, { Slice => {} });
 
-    my $update_orders_sth = $dbh->prepare(q{
-        UPDATE aqorders
-        SET cancellationreason = ?
-        WHERE cancellationreason = ?
-    });
+        my $update_orders_sth = $dbh->prepare(q{
+            UPDATE aqorders
+            SET cancellationreason = ?
+            WHERE cancellationreason = ?
+        });
 
-    my $insert_av_sth = $dbh->prepare(q{
-        INSERT INTO authorised_values (category, authorised_value, lib) VALUES
-         ('ORDER_CANCELLATION_REASON', ?, ?)
-    });
-    my $i = 3;
-    for my $reason ( @$already_existing_reasons ) {
-        next unless $reason;
-        $insert_av_sth->execute( $i, $reason );
-        $update_orders_sth->execute( $i, $reason );
-        $i++;
+        my $insert_av_sth = $dbh->prepare(q{
+            INSERT INTO authorised_values (category, authorised_value, lib) VALUES
+             ('ORDER_CANCELLATION_REASON', ?, ?)
+        });
+        my $i = 3;
+        for my $reason ( @$already_existing_reasons ) {
+            next unless $reason;
+            $insert_av_sth->execute( $i, $reason );
+            $update_orders_sth->execute( $i, $reason );
+            $i++;
+        }
+        print "Upgrade to $DBversion done (Bug 13380: Add the ORDER_CANCELLATION_REASON authorised value)\n";
+    }
+    else {
+        print "Upgrade to $DBversion done (Bug 13380: ORDER_CANCELLATION_REASON authorised value already existed from earlier update!)\n";
     }
-    print "Upgrade to $DBversion done (Bug 13380: Add the ORDER_CANCELLATION_REASON authorised value)\n";
+
     SetVersion($DBversion);
 }