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

(-)a/reports/guided_reports.pl (-46 lines)
Lines 1090-1137 sub create_non_existing_group_and_subgroup { Link Here
1090
    }
1090
    }
1091
}
1091
}
1092
1092
1093
# pass $sth and sql_params, get back an executable query
1094
sub get_prepped_report {
1095
    my ($sql, $param_names, $sql_params ) = @_;
1096
1097
    # First we split out the placeholders
1098
    # This part of the code supports using [[ table.field | alias ]] in the
1099
    # query and replaces it by table.field AS alias. Not sure why we would
1100
    # need it if we can type the latter (which is simpler)?
1101
    my @split = split /\[\[|\]\]/,$sql;
1102
    my $headers;
1103
    for(my $i=0;$i<$#split/2;$i++){ #The placeholders are always the odd elements of the array
1104
        my ($type,$name) = split /\|/,$split[$i*2+1]; # We split them on '|'
1105
        $headers->{$name} = $type; # Store as a lookup for the template
1106
        $headers->{$name} =~ s/^\w*\.//; # strip the table name just as in $sth->{NAME} array
1107
        $split[$i*2+1] =~ s/(\||\?|\.|\*|\(|\)|\%)/\\$1/g; #Quote any special characters so we can replace the placeholders
1108
        $name = C4::Context->dbh->quote($name);
1109
        $sql =~ s/\[\[$split[$i*2+1]\]\]/$type AS $name/; # Remove placeholders from SQL
1110
    }
1111
1112
    my %lookup;
1113
    @lookup{@$param_names} = @$sql_params;
1114
    @split = split /<<|>>/,$sql;
1115
    my @tmpl_parameters;
1116
    for(my $i=0;$i<$#split/2;$i++) {
1117
        my $quoted = @$param_names ? $lookup{ $split[$i*2+1] } : @$sql_params[$i];
1118
        # if there are special regexp chars, we must \ them
1119
        $split[$i*2+1] =~ s/(\||\?|\.|\*|\(|\)|\%)/\\$1/g;
1120
        if ($split[$i*2+1] =~ /\|\s*date\s*$/) {
1121
            $quoted = output_pref({ dt => dt_from_string($quoted), dateformat => 'iso', dateonly => 1 }) if $quoted;
1122
        }
1123
        unless( $split[$i*2+1] =~ /\|\s*list\s*$/ && $quoted ){
1124
            $quoted = C4::Context->dbh->quote($quoted);
1125
        } else {
1126
            my @list = split /\n/, $quoted;
1127
            my @quoted_list;
1128
            foreach my $item ( @list ){
1129
                $item =~ s/\r//;
1130
              push @quoted_list, C4::Context->dbh->quote($item);
1131
            }
1132
            $quoted="(".join(",",@quoted_list).")";
1133
        }
1134
        $sql =~ s/<<$split[$i*2+1]>>/$quoted/;
1135
    }
1136
    return $sql,$headers;
1137
}
1138
- 

Return to bug 27380