e670f56660af051612c6f73a637243ab17cb1b73
[koha.git] / misc / load_yaml.pl
1 #!/usr/bin/perl
2 #
3 #  Copyright 2020 Koha Development Team
4 #
5 #  This file is part of Koha.
6 #
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.
11 #
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.
16 #
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>.
19
20 use Modern::Perl;
21
22 use YAML::Syck qw( LoadFile );
23 use C4::Context;
24 use Getopt::Long qw(:config no_ignore_case);
25 use Data::Printer;
26
27 sub print_usage {
28      ( my $basename = $0 ) =~ s|.*/||;
29      print <<USAGE;
30
31 $basename
32  Load file in YAML format into database
33
34 Usage:
35 $0 [--file=FILE]
36 $0 -h
37
38  -f, --file=FILE         File to load.
39  -h, --help              Show this help
40
41 USAGE
42 }
43
44 # Getting parameters
45 my $file;
46 my $help;
47
48 GetOptions(
49  'file|f=s'     => \$file,
50  'help|h'       => \$help
51 ) or print_usage, exit 1;
52
53 if ($help or not $file) {
54  print_usage;
55  exit;
56 }
57
58 my $dbh  = C4::Context->dbh;
59 my $yaml;
60 eval {
61     $yaml = LoadFile( $file );                                    # Load YAML
62 };
63 if ($@){
64     die "Something went wrong loading file $file ($@)";
65 }
66
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 );
84     }
85 }
86 for my $statement ( @{ $yaml->{'sql_statements'} } ) {               # extra SQL statements
87     $dbh->do($statement);
88 }