5 refresh_matviews.pl - run PL/pgSQL functions to do a basic or concurrent refresh of all database materialized views
9 refresh_matviews.pl -H [database handle] -D [database name] -c [to run concurrent refresh] -m [materialized view select]
17 -c flag; if present, run concurrent refresh
18 -m materialized view select. can be either 'fullview' or 'stockprop' or 'phenotypes'
21 All materialized views that are included in the refresh function will be refreshed
22 If -c is used, the refresh will be done concurrently, a process that takes longer than a standard refresh but that is completed without locking the views.
26 Bryan Ellerbrock <bje24@cornell.edu>
27 Naama Menda <nm249@cornell.edu>
37 my ( $dbhost, $dbname, $username, $password, $mode, $concurrent, $test);
44 'dbname|D=s' => \
$dbname,
45 'dbhost|H=s' => \
$dbhost,
49 unless ($mode =~ m/^(fullview|stockprop|phenotypes)$/ ) { die "Option -m must be fullview, stockprop, or phenotypes. -m = $mode\n"; }
51 print STDERR
"Connecting to database...\n";
52 my $dsn = 'dbi:Pg:database='.$dbname.";host=".$dbhost.";port=5432";
53 my $dbh = DBI
->connect($dsn, $username, $password, { RaiseError
=> 1, AutoCommit
=>0 });
55 my $cur_refreshing_q = "UPDATE public.matviews SET currently_refreshing=?";
56 if ($mode eq 'stockprop'){
57 $cur_refreshing_q .= " WHERE mv_name = 'materialized_stockprop'";
59 if ($mode eq 'phenotypes') {
60 $cur_refreshing_q .= " WHERE mv_name = 'materialized_phenotype_jsonb_table'";
63 #set TRUE before the transaction begins
65 print STDERR
"*Setting currently_refreshing = TRUE\n";
66 my $cur_refreshing_h = $dbh->prepare($cur_refreshing_q);
67 $cur_refreshing_h->execute($state);
71 print STDERR
"Refreshing materialized views . . ." . localtime() . "\n";
74 if ($mode eq 'fullview') {
75 @mv_names = ('materialized_phenoview','materialized_genoview');
77 if ($mode eq 'stockprop'){
78 @mv_names = ('materialized_stockprop');
80 if ($mode eq 'phenotypes') {
81 @mv_names = ("materialized_phenoview", "materialized_phenotype_jsonb_table");
84 my $status = refresh_mvs
($dbh, \
@mv_names, $concurrent);
86 #rollback if running in test mode
90 warn "Refresh failed: @_";
91 if ($test ) { print STDERR
"TEST MODE\n" ; }
96 print "The try block died. Rolling back.\n";
98 print STDERR
"COMMITTING\n";
101 #always set the refreshing status to FALSE at the end
103 my $done_h = $dbh->prepare($cur_refreshing_q);
104 print STDERR
"*Setting currently_refreshing = FALSE \n";
105 $done_h->execute($state);
111 my $mv_names_ref = shift;
113 my $start_q = "UPDATE matviews SET refresh_start = statement_timestamp() where mv_name = ?";
114 my $end_q = "UPDATE matviews SET last_refresh = statement_timestamp() where mv_name = ? ";
115 my $refresh_q = "REFRESH MATERIALIZED VIEW ";
116 if ($concurrent) { $refresh_q .= " CONCURRENTLY "; }
119 foreach my $name ( @
$mv_names_ref ) {
120 print STDERR
"**Refreshing view $name ". localtime() . " \n";
121 my $start_h = $dbh->prepare($start_q);
122 $start_h->execute($name);
123 print STDERR
"**QUERY = " . $refresh_q . $name . "\n";
124 my $refresh_h = $dbh->prepare($refresh_q . $name) ;
125 $status = $refresh_h->execute();
127 print STDERR
"Materialized view $name refreshed! Status: $status " . localtime() . "\n\n";
129 my $end_h = $dbh->prepare($end_q);
130 $end_h->execute($name);