View | Details | Raw Unified | Return to bug 24883
Collapse All | Expand All

(-)a/misc/load_yaml.pl (-42 / +23 lines)
Lines 19-88 Link Here
19
19
20
use Modern::Perl;
20
use Modern::Perl;
21
21
22
use YAML::Syck qw( LoadFile );
23
use C4::Context;
24
use Getopt::Long qw(:config no_ignore_case);
22
use Getopt::Long qw(:config no_ignore_case);
25
use Data::Printer;
23
use C4::Context;
24
use C4::Installer;
26
25
27
sub print_usage {
26
sub print_usage {
28
     ( my $basename = $0 ) =~ s|.*/||;
27
     ( my $basename = $0 ) =~ s|.*/||;
29
     print <<USAGE;
28
     print <<USAGE;
30
29
31
$basename
30
$basename
32
 Load file in YAML format into database
31
 Load file in YAML format into database, or convert it to SQL queries
33
32
34
Usage:
33
Usage:
35
$0 [--file=FILE]
34
$0 [--file=FILE]
36
$0 -h
35
$0 -h
37
38
 -f, --file=FILE         File to load.
39
 -h, --help              Show this help
36
 -h, --help              Show this help
37
 -f, --file=FILE         File to load.
38
 --load                  Load the file into the database
39
 --convert               Convert to SQL
40
40
41
USAGE
41
USAGE
42
}
42
}
43
43
44
# Getting parameters
44
# Getting parameters
45
my $file;
45
my ( @files, $dump, $load, $convert, $help );
46
my $help;
47
46
48
GetOptions(
47
GetOptions(
49
 'file|f=s'     => \$file,
48
 'help|h'        => \$help,
50
 'help|h'       => \$help
49
 'load'          => \$load,
50
 'convert'       => \$convert,
51
 'file|f=s@'     => \@files,
51
) or print_usage, exit 1;
52
) or print_usage, exit 1;
52
53
53
if ($help or not $file) {
54
if ($help or not @files or not ($convert or $load)) {
54
 print_usage;
55
    print_usage;
55
 exit;
56
    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
}
57
}
66
58
67
for my $table ( @{ $yaml->{'tables'} } ) {
59
my $installer = C4::Installer->new;
68
    my $table_name   = ( keys %$table )[0];                          # table name
60
if ( $load ) {
69
    my @rows         = @{ $table->{$table_name}->{rows} };           #
61
    for my $f ( @files ) {
70
    my @columns      = ( sort keys %{$rows[0]} );                    # column names
62
        my $error = $installer->load_sql($f);
71
    my $fields       = join ",", map{sprintf("`%s`", $_)} @columns;  # idem, joined
63
        say $error if $error;
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
    }
64
    }
85
}
65
}
86
for my $statement ( @{ $yaml->{'sql_statements'} } ) {               # extra SQL statements
66
if ( $convert ) {
87
    $dbh->do($statement);
67
    for my $f ( @files ) {
68
        say $installer->yml2sql($f);
69
    }
88
}
70
}
89
- 

Return to bug 24883