Bug 24883: Command line utility to load yaml files
[koha.git] / misc / load_yaml.pl
blobe670f56660af051612c6f73a637243ab17cb1b73
1 #!/usr/bin/perl
3 # Copyright 2020 Koha Development Team
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
20 use Modern::Perl;
22 use YAML::Syck qw( LoadFile );
23 use C4::Context;
24 use Getopt::Long qw(:config no_ignore_case);
25 use Data::Printer;
27 sub print_usage {
28 ( my $basename = $0 ) =~ s|.*/||;
29 print <<USAGE;
31 $basename
32 Load file in YAML format into database
34 Usage:
35 $0 [--file=FILE]
36 $0 -h
38 -f, --file=FILE File to load.
39 -h, --help Show this help
41 USAGE
44 # Getting parameters
45 my $file;
46 my $help;
48 GetOptions(
49 'file|f=s' => \$file,
50 'help|h' => \$help
51 ) or print_usage, exit 1;
53 if ($help or not $file) {
54 print_usage;
55 exit;
58 my $dbh = C4::Context->dbh;
59 my $yaml;
60 eval {
61 $yaml = LoadFile( $file ); # Load YAML
63 if ($@){
64 die "Something went wrong loading file $file ($@)";
67 for my $table ( @{ $yaml->{'tables'} } ) {
68 my $table_name = ( keys %$table )[0]; # table name
69 my @rows = @{ $table->{$table_name}->{rows} }; #
70 my @columns = ( sort keys %{$rows[0]} ); # column names
71 my $fields = join ",", map{sprintf("`%s`", $_)} @columns; # idem, joined
72 my $placeholders = join ",", map { "?" } @columns; # '?,..,?' string
73 my $query = "INSERT INTO $table_name ( $fields ) VALUES ( $placeholders )";
74 my $sth = $dbh->prepare($query);
75 my @multiline = @{ $table->{$table_name}->{'multiline'} }; # to check multiline values;
76 foreach my $row ( @rows ) {
77 my @values = map {
78 my $col = $_;
79 ( @multiline and grep { $_ eq $col } @multiline )
80 ? join "\r\n", @{$row->{$col}} # join multiline values
81 : $row->{$col};
82 } @columns;
83 $sth->execute( @values );
86 for my $statement ( @{ $yaml->{'sql_statements'} } ) { # extra SQL statements
87 $dbh->do($statement);