From 2fcf7ebdbdcc55890fdbebb239396fdabc15d905 Mon Sep 17 00:00:00 2001 From: ivan Date: Sun, 30 Jan 2011 22:32:18 +0000 Subject: [PATCH] fix bw graphs for mysql?, RT#10574 --- FS/FS/Record.pm | 29 +++++++++++++++++++++++++++-- FS/FS/svc_port.pm | 51 +++++++++++++-------------------------------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm index 29e5322ef..e23699cce 100644 --- a/FS/FS/Record.pm +++ b/FS/FS/Record.pm @@ -30,8 +30,10 @@ use Tie::IxHash; @ISA = qw(Exporter); #export dbdef for now... everything else expects to find it here -@EXPORT_OK = qw(dbh fields hfields qsearch qsearchs dbdef jsearch - str2time_sql str2time_sql_closing regexp_sql not_regexp_sql ); +@EXPORT_OK = qw( + dbh fields hfields qsearch qsearchs dbdef jsearch + str2time_sql str2time_sql_closing regexp_sql not_regexp_sql concat_sql +); $DEBUG = 0; $me = '[FS::Record]'; @@ -3099,6 +3101,29 @@ sub not_regexp_sql { } +=item concat_sql [ DRIVER_NAME ] ITEMS_ARRAYREF + +Returns the items concatendated based on database type, using "CONCAT()" for +mysql and " || " for Pg and other databases. + +You can pass an optional driver name such as "Pg", "mysql" or +$dbh->{Driver}->{Name} to return a function for that database instead of +the current database. + +=cut + +sub concat_sql { + my $driver = ref($_[0]) ? driver_name : shift; + my $items = shift; + + if ( $driver =~ /^mysql/i ) { + 'CONCAT('. join(',', @$items). ')'; + } else { + join('||', @$items); + } + +} + =back =head1 BUGS diff --git a/FS/FS/svc_port.pm b/FS/FS/svc_port.pm index 16d520813..78da13d19 100644 --- a/FS/FS/svc_port.pm +++ b/FS/FS/svc_port.pm @@ -3,7 +3,8 @@ package FS::svc_port; use strict; use vars qw($conf $system $DEBUG $me ); use base qw( FS::svc_Common ); -use FS::Record qw( qsearch qsearchs dbh str2time_sql str2time_sql_closing ); +use FS::Record qw( qsearch qsearchs dbh + str2time_sql str2time_sql_closing concat_sql ); #dbh use FS::cust_svc; use GD::Graph; use GD::Graph::mixed; @@ -255,50 +256,24 @@ sub graph_png { || $end <= $start || $end < 0 || $end > $now || $start > $now || $end-$start > 86400*366 ); - local($FS::Record::nowarn_classload) = 1; + my $_date = str2time_sql. concat_sql([ 'srv_date', "' '", 'srv_time' ]). + str2time_sql_closing; my $serviceid_sql = "('${serviceid}_IN','${serviceid}_OUT')"; - my @records; - my $dbh = dbh; - if ( $dbh->{Driver}->{Name} eq 'Pg' ) { - @records = qsearch({ - 'table' => 'srvexport', - 'select' => "*, date_part('epoch',to_timestamp(srv_date||' '||srv_time,'YYYY-MM-DD HH:MI:SS')) as _date", - 'extra_sql' => "where serviceid in $serviceid_sql and - date_part('epoch',to_timestamp(srv_date||' '||srv_time,'YYYY-MM-DD HH:MI:SS')) >= $start - and date_part('epoch',to_timestamp(srv_date||' '||srv_time,'YYYY-MM-DD HH:MI:SS')) <= $end", - 'order_by' => "order by date_part('epoch',to_timestamp(srv_date||' '||srv_time,'YYYY-MM-DD HH:MI:SS')) asc", - }); - } elsif ( $dbh->{Driver}->{Name} eq 'mysql' ) { - @records = qsearch({ - 'table' => 'srvexport', - 'select' => "*, unix_timestamp(srv_date||' '||srv_time) as _date", - 'extra_sql' => "where serviceid in $serviceid_sql and - unix_timestamp(srv_date||' '||srv_time) >= $start - and unix_timestamp(srv_date||' '||srv_time) <= $end", - 'order_by' => "order by unix_timestamp(srv_date||' '||srv_time) asc", - }); - } else { - return 'Unsupported DBMS'; - } - - #my $_date = str2time_sql. "srv_date||' '||srv_time". - # str2time_sql_closing; - - #my @records = qsearch({ - # 'table' => 'srvexport', - # 'select' => "*, $_date as _date", - # 'extra_sql' => "where serviceid in $serviceid_sql - # and $_date >= $start - # and $_date <= $end", - # 'order_by' => "order by $_date asc", - #}); + local($FS::Record::nowarn_classload) = 1; + my @records = qsearch({ + 'table' => 'srvexport', + 'select' => "*, $_date as _date", + 'extra_sql' => "where serviceid in $serviceid_sql + and $_date >= $start + and $_date <= $end", + 'order_by' => "order by $_date asc", + }); warn "$me ". scalar(@records). " records returned for $serviceid\n" if $DEBUG; - # assume data in DB is correct, # assume always _IN and _OUT pair, assume intvl = 300 -- 2.11.0