4 # report-sql.pl - generate SQL for an existing report
6 # This script was created by taking the clark-kent.pl utility from
7 # Evergreen (http://evergreen-ils.org) and removing all the parts not
8 # directly required for generating report SQL.
10 # Copyright (C) 2008 Equinox Software, Inc.
11 # Copyright (C) 2016 BC Libraries Cooperative
12 # Author: Jeff Davis <jeff.davis@bc.libraries.coop>
14 # This program is free software; you can redistribute it and/or
15 # modify it under the terms of the GNU General Public License
16 # as published by the Free Software Foundation; either version 2
17 # of the License, or (at your option) any later version.
19 # This program is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
28 use OpenSRF::EX qw/:try/;
29 use OpenSRF::Utils qw/:daemon/;
30 use OpenSRF::Utils::JSON;
31 use OpenSRF::Utils::Logger qw/$logger/;
33 use OpenSRF::AppSession;
34 use OpenSRF::Utils::SettingsClient;
35 use OpenILS::Reporter::SQLBuilder;
40 my $config = '/srv/openils/conf/opensrf_core.xml';
45 "bootstrap|boostrap=s" => \$config,
46 "report=i" => \$opt_report,
50 if ($help || !$report) {
52 Output the SQL that will be generated for the specified report.
53 NB: This script must be run on a server with Evergreen running!
56 $0 --report <report-id> [ --bootstrap /openils/conf/opensrf_core.xml ] > query.sql
60 The id of a row in reporter.report.
62 Path to your opensrf_core.xml config file.
68 OpenSRF::System->bootstrap_client( config_file => $config );
70 my (%data_db, %state_db);
72 my $sc = OpenSRF::Utils::SettingsClient->new;
74 $data_db{db_driver} = $sc->config_value( reporter => setup => database => 'driver' );
75 $data_db{db_host} = $sc->config_value( reporter => setup => database => 'host' );
76 $data_db{db_port} = $sc->config_value( reporter => setup => database => 'port' );
77 $data_db{db_name} = $sc->config_value( reporter => setup => database => 'db' );
78 if (!$data_db{db_name}) {
79 $data_db{db_name} = $sc->config_value( reporter => setup => database => 'name' );
80 print STDERR "WARN: <database><name> is a deprecated setting for database name. For future compatibility, you should use <database><db> instead." if $data_db{db_name};
82 $data_db{db_user} = $sc->config_value( reporter => setup => database => 'user' );
83 $data_db{db_pw} = $sc->config_value( reporter => setup => database => 'pw' );
87 # Fetch the optional state database connection info
88 $state_db{db_driver} = $sc->config_value( reporter => setup => state_store => 'driver' ) || $data_db{db_driver};
89 $state_db{db_host} = $sc->config_value( reporter => setup => state_store => 'host' ) || $data_db{db_host};
90 $state_db{db_port} = $sc->config_value( reporter => setup => state_store => 'port' ) || $data_db{db_port};
91 $state_db{db_name} = $sc->config_value( reporter => setup => state_store => 'db' );
92 if (!$state_db{db_name}) {
93 $state_db{db_name} = $sc->config_value( reporter => setup => state_store => 'name' ) || $data_db{db_name};
95 $state_db{db_user} = $sc->config_value( reporter => setup => state_store => 'user' ) || $data_db{db_user};
96 $state_db{db_pw} = $sc->config_value( reporter => setup => state_store => 'pw' ) || $data_db{db_pw};
99 die "Unable to retrieve database connection information from the settings server"
100 unless ($state_db{db_driver} && $state_db{db_host} && $state_db{db_port} && $state_db{db_name} && $state_db{db_user} &&
101 $data_db{db_driver} && $data_db{db_host} && $data_db{db_port} && $data_db{db_name} && $data_db{db_user});
103 my $state_dsn = "dbi:" . $state_db{db_driver} . ":dbname=" . $state_db{db_name} .';host=' . $state_db{db_host} . ';port=' . $state_db{db_port};
104 my $data_dsn = "dbi:" . $data_db{db_driver} . ":dbname=" . $data_db{db_name} .';host=' . $data_db{db_host} . ';port=' . $data_db{db_port};
108 my $dbh = DBI->connect(
113 pg_expand_array => 0,
120 my $s3 = $dbh->selectrow_hashref(<<" SQL", {}, $opt_report);
121 SELECT * FROM reporter.report WHERE id = ?;
124 my $s2 = $dbh->selectrow_hashref(<<" SQL", {}, $s3->{template});
125 SELECT * FROM reporter.template WHERE id = ?;
128 $s3->{template} = $s2;
130 my $b = OpenILS::Reporter::SQLBuilder->new;
131 my $report_data = OpenSRF::Utils::JSON->JSON2perl( $s3->{data} );
132 $b->register_params( $report_data );
134 $s3->{resultset} = $b->parse_report( OpenSRF::Utils::JSON->JSON2perl( $s3->{template}->{data} ) );
136 $s3->{resultset}->set_pivot_data($report_data->{__pivot_data}) if $report_data->{__pivot_data};
137 $s3->{resultset}->set_pivot_label($report_data->{__pivot_label}) if $report_data->{__pivot_label};
138 $s3->{resultset}->set_pivot_default($report_data->{__pivot_default}) if $report_data->{__pivot_default};
139 $s3->{resultset}->resultset_limit($resultset_limit) if $resultset_limit;
141 print $s3->{resultset}->toSQL;