Commit | Line | Data |
---|---|---|
08186954 JD |
1 | #!/usr/bin/perl |
2 | # vim:ts=4:noet: | |
3 | ||
4 | # report-sql.pl - generate SQL for an existing report | |
5 | # | |
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. | |
9 | # | |
10 | # Copyright (C) 2008 Equinox Software, Inc. | |
11 | # Copyright (C) 2016 BC Libraries Cooperative | |
12 | # Author: Jeff Davis <jeff.davis@bc.libraries.coop> | |
13 | # | |
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. | |
18 | # | |
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. | |
23 | ||
24 | use strict; | |
25 | use DBI; | |
26 | use Getopt::Long; | |
27 | use Data::Dumper; | |
28 | use OpenSRF::EX qw/:try/; | |
29 | use OpenSRF::Utils qw/:daemon/; | |
30 | use OpenSRF::Utils::JSON; | |
31 | use OpenSRF::Utils::Logger qw/$logger/; | |
32 | use OpenSRF::System; | |
33 | use OpenSRF::AppSession; | |
34 | use OpenSRF::Utils::SettingsClient; | |
35 | use OpenILS::Reporter::SQLBuilder; | |
36 | ||
37 | use open ':utf8'; | |
38 | ||
39 | ||
40 | my $config = '/srv/openils/conf/opensrf_core.xml'; | |
41 | my $opt_report; | |
42 | my $help; | |
43 | ||
44 | GetOptions( | |
45 | "bootstrap|boostrap=s" => \$config, | |
46 | "report=i" => \$opt_report, | |
47 | "help" => \$help | |
48 | ); | |
49 | ||
50 | if ($help || !$report) { | |
51 | print <<"HELP"; | |
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! | |
54 | ||
55 | USAGE: | |
56 | $0 --report <report-id> [ --bootstrap /openils/conf/opensrf_core.xml ] > query.sql | |
57 | ||
58 | OPTIONS: | |
59 | --report | |
60 | The id of a row in reporter.report. | |
61 | --bootstrap | |
62 | Path to your opensrf_core.xml config file. | |
63 | ||
64 | HELP | |
65 | exit; | |
66 | } | |
67 | ||
68 | OpenSRF::System->bootstrap_client( config_file => $config ); | |
69 | ||
70 | my (%data_db, %state_db); | |
71 | ||
72 | my $sc = OpenSRF::Utils::SettingsClient->new; | |
73 | ||
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}; | |
81 | } | |
82 | $data_db{db_user} = $sc->config_value( reporter => setup => database => 'user' ); | |
83 | $data_db{db_pw} = $sc->config_value( reporter => setup => database => 'pw' ); | |
84 | ||
85 | ||
86 | ||
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}; | |
94 | } | |
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}; | |
97 | ||
98 | ||
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}); | |
102 | ||
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}; | |
105 | ||
106 | my $resultset_limit; | |
107 | ||
108 | my $dbh = DBI->connect( | |
109 | $state_dsn, | |
110 | $state_db{db_user}, | |
111 | $state_db{db_pw}, | |
112 | { AutoCommit => 1, | |
113 | pg_expand_array => 0, | |
114 | pg_enable_utf8 => 1, | |
115 | RaiseError => 1 | |
116 | } | |
117 | ); | |
118 | ||
119 | if ($opt_report) { | |
120 | my $s3 = $dbh->selectrow_hashref(<<" SQL", {}, $opt_report); | |
121 | SELECT * FROM reporter.report WHERE id = ?; | |
122 | SQL | |
123 | ||
124 | my $s2 = $dbh->selectrow_hashref(<<" SQL", {}, $s3->{template}); | |
125 | SELECT * FROM reporter.template WHERE id = ?; | |
126 | SQL | |
127 | ||
128 | $s3->{template} = $s2; | |
129 | ||
130 | my $b = OpenILS::Reporter::SQLBuilder->new; | |
131 | my $report_data = OpenSRF::Utils::JSON->JSON2perl( $s3->{data} ); | |
132 | $b->register_params( $report_data ); | |
133 | ||
134 | $s3->{resultset} = $b->parse_report( OpenSRF::Utils::JSON->JSON2perl( $s3->{template}->{data} ) ); | |
135 | ||
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; | |
140 | ||
141 | print $s3->{resultset}->toSQL; | |
142 | } | |
143 | ||
144 | $dbh->disconnect; | |
145 |