Bug 25040: monkeypatch Schema::Loader for recent MariaDB
authorMartin Renvoize <martin.renvoize@ptfs-europe.com>
Fri, 3 Apr 2020 10:16:39 +0000 (11:16 +0100)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Tue, 14 Apr 2020 07:26:10 +0000 (08:26 +0100)
Recent versions of MariaDB changed the output of 'DESCRIBE' for
timestamp columns with defaults from `CURRENT_TIMESTAMP` to
`current_timestamp()`.  As such the code inside
DBIx::Class::Schema::Loader which catches such cases and outputs
`\"current_timestamp"` as a sensible cross platform default is missed
and this leads of inconsistent class files and bugs with out default
lookup code in Koha::Objects.

This patch serves as a backport of the code I have submitted upstream
such that out developers can continue to use update_dbix_class_files.pl
to build their schema classes from the database and regardless of their
db server version get a consistently correct output.

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Koha/Schema/Loader/mysql.pm [new file with mode: 0644]
misc/devel/update_dbix_class_files.pl

diff --git a/Koha/Schema/Loader/mysql.pm b/Koha/Schema/Loader/mysql.pm
new file mode 100644 (file)
index 0000000..f272e65
--- /dev/null
@@ -0,0 +1,59 @@
+use utf8;
+
+package Koha::Schema::Loader::mysql;
+
+# Copyright 2020 PTFS Europe
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+
+use base 'DBIx::Class::Schema::Loader::DBI::mysql';
+use mro 'c3';
+
+use Scalar::Util 'blessed';
+
+# This is being upstreamed, but for now lets make sure whatever version of DBIx::Class::Schema::Loader you are using,
+# we will catch MariaDB current_timestamp() and convert it to \"current_timestamp" correctly.
+sub _extra_column_info {
+    no warnings 'uninitialized';
+    my ( $self, $table, $col, $info, $dbi_info ) = @_;
+    my %extra_info;
+
+    if ( $dbi_info->{mysql_is_auto_increment} ) {
+        $extra_info{is_auto_increment} = 1;
+    }
+    if ( $dbi_info->{mysql_type_name} =~ /\bunsigned\b/i ) {
+        $extra_info{extra}{unsigned} = 1;
+    }
+    if ( $dbi_info->{mysql_values} ) {
+        $extra_info{extra}{list} = $dbi_info->{mysql_values};
+    }
+    if (
+        ( not blessed $dbi_info)    # isa $sth
+        && lc( $dbi_info->{COLUMN_DEF} ) =~ m/^current_timestamp/
+        && lc( $dbi_info->{mysql_type_name} ) eq 'timestamp'
+      )
+    {
+
+        my $current_timestamp = 'current_timestamp';
+        $extra_info{default_value} = \$current_timestamp;
+    }
+
+    return \%extra_info;
+}
+
+1;
index b89ec63..0c4a88e 100755 (executable)
@@ -19,7 +19,6 @@
 # along with Koha; if not, see <http://www.gnu.org/licenses>.
 
 use Modern::Perl;
-
 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
 
 use Getopt::Long;
@@ -99,7 +98,12 @@ if (! defined $db_name ) {
     make_schema_at(
         "Koha::Schema",
         { debug => 1, dump_directory => $path, preserve_case => 1 },
-        ["DBI:$db_driver:dbname=$db_name;host=$db_host;port=$db_port",$db_user, $db_passwd ]
+        [
+            "DBI:$db_driver:dbname=$db_name;host=$db_host;port=$db_port",
+            $db_user,
+            $db_passwd,
+            { loader_class => 'Koha::Schema::Loader::mysql' }
+        ]
     );
 }