From 6b20b464a4a23915b6f25acb78f0ce50f92e320a Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Sun, 9 Jan 2022 17:22:10 +0000 Subject: [PATCH] 93_DbRep: contrib v 8.46.12 git-svn-id: https://svn.fhem.de/fhem/trunk@25445 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/DS_Starter/93_DbRep.pm | 137 +++++++++++++++++----------- 1 file changed, 84 insertions(+), 53 deletions(-) diff --git a/fhem/contrib/DS_Starter/93_DbRep.pm b/fhem/contrib/DS_Starter/93_DbRep.pm index 09ec96a16..1b243a431 100644 --- a/fhem/contrib/DS_Starter/93_DbRep.pm +++ b/fhem/contrib/DS_Starter/93_DbRep.pm @@ -6721,15 +6721,15 @@ return; # set logdbrep sqlCmd select count(*) from history # set logdbrep sqlCmd select DEVICE,count(*) from history group by DEVICE HAVING count(*) > 10000 sub DbRep_sqlCmd { - my $paref = shift; - my $hash = $paref->{hash}; - my $name = $paref->{name}; - my $opt = $paref->{opt}; - my $device = $paref->{device}; - my $reading = $paref->{reading}; - my $runtime_string_first = $paref->{rsf}; - my $runtime_string_next = $paref->{rsn}; - my $cmd = $paref->{prop}; + my $paref = shift; + my $hash = $paref->{hash}; + my $name = $paref->{name}; + my $opt = $paref->{opt}; + my $device = $paref->{device}; + my $reading = $paref->{reading}; + my $rsf = $paref->{rsf}; + my $rsn = $paref->{rsn}; + my $cmd = $paref->{prop}; my $srs = AttrVal($name, "sqlResultFieldSep", "|"); @@ -6828,49 +6828,18 @@ sub DbRep_sqlCmd { } } - # Allow inplace replacement of keywords for timings, device, reading (using attribute syntax) - my $sfx = AttrVal("global", "language", "EN"); - $sfx = $sfx eq "EN" ? "" : "_$sfx"; - - $sql =~ s/§timestamp_begin§/'$runtime_string_first'/g; - $sql =~ s/§timestamp_end§/'$runtime_string_next'/g; - - my $rdspec; - - if ($sql =~ /§device§/xs) { - if ($device eq "%") { - $err = qq{You must specify device(s) in attribute "device" if you use the placeholder "§device§" in your statement}; - - Log3 ($name, 2, "DbRep $name - ERROR - $err"); - - $err = qq{ $err }; - $err =~ s/"device"/device<\/a>/xs; - $err = encode_base64($err,""); - return "$name|$err"; - } - - $rdspec = DbRep_createCommonSql( {hash => $hash, device => $device, dbmodel => $dbmodel} ); - $rdspec = (split /AND\s(?:1|true)/xis, $rdspec)[0]; - $sql =~ s/§device§/$rdspec/xg; - } - - if ($sql =~ /§reading§/xs) { - if ($reading eq "%") { - $err = qq{You must specify reading(s) in attribute "reading" if you use the placeholder "§reading§" in your statement}; - - Log3 ($name, 2, "DbRep $name - ERROR - $err"); - - $err = qq{ $err }; - $err =~ s/"reading"/reading<\/a>/xs; - $err = encode_base64($err,""); - return "$name|$err"; - } - - $rdspec = DbRep_createCommonSql( {hash => $hash, reading => $reading, dbmodel => $dbmodel} ); - $rdspec = (split /AND\s(?:1|true)/xis, $rdspec)[0]; - $sql =~ s/§reading§/$rdspec/xg; - } - + # Ersetzung von Schlüsselwörtern für Timing, Gerät, Lesen (unter Verwendung der Attributsyntax) + ($err, $sql) = _DbRep_sqlReplaceKeywords ( { hash => $hash, + sql => $sql, + device => $device, + reading => $reading, + dbmodel => $dbmodel, + rsf => $rsf, + rsn => $rsn + } + ); + return $err if ($err); + $sql =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";" my $st = [gettimeofday]; # SQL-Startzeit @@ -6930,6 +6899,69 @@ sub DbRep_sqlCmd { return "$name|$err|$rowstring|$opt|$cmd|$nrows|$rt"; } +#################################################################################################### +# Ersetzung von Schlüsselwörtern für Time*, Devices und Readings +# in SQL-Statements (unter Verwendung der Attributsyntax) +#################################################################################################### +sub _DbRep_sqlReplaceKeywords { + my $paref = shift; + my $hash = $paref->{hash}; + my $sql = $paref->{sql}; + my $device = $paref->{device}; + my $reading = $paref->{reading}; + my $dbmodel = $paref->{dbmodel}; + my $rsf = $paref->{rsf}; + my $rsn = $paref->{rsn}; + + my $ret = q{}; + my $name = $hash->{NAME}; + my $sfx = AttrVal("global", "language", "EN"); + $sfx = $sfx eq 'EN' ? '' : "_$sfx"; + + $sql =~ s/§timestamp_begin§/'$rsf'/g; + $sql =~ s/§timestamp_end§/'$rsn'/g; + + my ($rdspec,$err); + + if ($sql =~ /§device§/xs) { + if ($device eq "%") { + $err = qq{You must specify device(s) in attribute "device" if you use the placeholder "§device§" in your statement}; + + Log3 ($name, 2, "DbRep $name - ERROR - $err"); + + $err = qq{ $err }; + $err =~ s/"device"/device<\/a>/xs; + $err = encode_base64($err,""); + $ret = "$name|$err"; + return $ret; + } + + $rdspec = DbRep_createCommonSql( {hash => $hash, device => $device, dbmodel => $dbmodel} ); + $rdspec = (split /AND\s(?:1|true)/xis, $rdspec)[0]; + $sql =~ s/§device§/$rdspec/xg; + } + + if ($sql =~ /§reading§/xs) { + if ($reading eq "%") { + $err = qq{You must specify reading(s) in attribute "reading" if you use the placeholder "§reading§" in your statement}; + + Log3 ($name, 2, "DbRep $name - ERROR - $err"); + + $err = qq{ $err }; + $err =~ s/"reading"/reading<\/a>/xs; + $err = encode_base64($err,""); + $ret = "$name|$err"; + return $ret; + } + + $rdspec = DbRep_createCommonSql( {hash => $hash, reading => $reading, dbmodel => $dbmodel} ); + $rdspec = (split /AND\s(?:1|true)/xis, $rdspec)[0]; + $sql =~ s/§reading§/$rdspec/xg; + } + +return ($ret, $sql); +} + #################################################################################################### # Auswertungsroutine der nichtblockierenden DB-Abfrage sqlCmd #################################################################################################### @@ -9261,7 +9293,6 @@ sub DbRep_reduceLog { my $selspec = "SELECT TIMESTAMP,DEVICE,'',READING,VALUE FROM history where "; my $addon = "ORDER BY TIMESTAMP ASC"; - my $specs; my $valfilter = AttrVal($name, "valueFilter", undef); # Wertefilter my $specs = {