2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-08 13:24:56 +00:00

93_DbRep: sqlCmdBlocking can use sql Keywords §timestamp_end§ etc.

git-svn-id: https://svn.fhem.de/fhem/trunk@28674 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2024-03-17 18:30:25 +00:00
parent e1557980c5
commit 1983cbb4c9
2 changed files with 46 additions and 15 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
- feature: 93_DbRep: sqlCmdBlocking can use sql Keywords §timestamp_end§ etc.
- change: 93_DbRep: prevent some attr eval as long as init_done is not set
- feature: 76_SolarForecast: currentMeterDev: opt. keys conprice, feedprice
- change: 93_DbRep: executeBefore/AfterProc output: set verbose level to 3

View File

@ -59,6 +59,7 @@ no if $] >= 5.017011, warnings => 'experimental::smartmatch';
# Version History intern
my %DbRep_vNotesIntern = (
"8.53.8" => "17.03.2024 sqlCmdBlocking able to use sql Keywords (§timestamp_end§ etc.) ",
"8.53.7" => "16.03.2024 prevent some attribute evaluation as long as init_done is not set ",
"8.53.6" => "15.03.2024 change verbose level of DbRep_beforeproc, DbRep_afterproc to 3 ",
"8.53.5" => "11.03.2024 some changes for MariaDB Perl driver usage, change DbRep_dbConnect".
@ -1352,7 +1353,7 @@ sub DbRep_Get {
DbRep_delread ($hash); # Readings löschen die nicht in der Ausnahmeliste (Attr readingPreventFromDel) stehen
ReadingsSingleUpdateValue ($hash, "state", "running", 1);
return DbRep_sqlCmdBlocking($name,$sqlcmd);
return DbRep_sqlCmdBlocking ($name,$sqlcmd);
}
elsif ($opt eq "storedCredentials") { # Credentials abrufen
my $atxt;
@ -7006,23 +7007,37 @@ return "$name|$err|$rowstring|$opt|$cmd|$nrows|$rt";
# liefert Ergebnis sofort zurück, setzt keine Readings
####################################################################################################
sub DbRep_sqlCmdBlocking {
my $name = shift;
my $cmd = shift;
my $name = shift;
my $cmd = shift;
my $hash = $defs{$name};
my $srs = AttrVal ($name, 'sqlResultFieldSep', '|');
my $to = AttrVal ($name, 'timeout', $dbrep_deftobl);
my $hash = $defs{$name};
my $srs = AttrVal ($name, 'sqlResultFieldSep', '|');
my $to = AttrVal ($name, 'timeout', $dbrep_deftobl);
my $reading = AttrVal ($name, 'reading', '%');
my $device = AttrVal ($name, 'device', '%');
my ($ret);
my $ret;
my ($err,$dbh,$dbmodel) = DbRep_dbConnect($name);
my ($err, $dbh, $dbmodel) = DbRep_dbConnect ($name);
if ($err) {
_DbRep_sqlBlckgErrorState ($hash, $err);
return $err;
}
my ($IsTimeSet, $IsAggrSet, $aggregation) = DbRep_checktimeaggr ($hash);
my ($runtime_string_first, $runtime_string_next);
if ($IsTimeSet || $IsAggrSet) {
(undef, undef, $runtime_string_first, $runtime_string_next) = DbRep_createTimeArray ($hash, $aggregation, 'sqlCmdBlocking');
}
else {
Log3 ($name, 4, "DbRep $name - Timestamp begin human readable: not set");
Log3 ($name, 4, "DbRep $name - Timestamp end human readable: not set");
}
$cmd =~ s/\;\;/ESC_ESC_ESC/gx; # ersetzen von escapeten ";" (;;)
Log3 ($name, 4, "DbRep $name - Aggregation: $aggregation");
$cmd =~ s/\;\;/ESC_ESC_ESC/gx; # ersetzen von escapeten ";" (;;)
$cmd .= ";" if ($cmd !~ m/\;$/x);
my $sql = $cmd;
@ -7054,6 +7069,21 @@ sub DbRep_sqlCmdBlocking {
_DbRep_sqlBlckgErrorState ($hash, $err);
return $err;
}
# 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 => $runtime_string_first,
rsn => $runtime_string_next
}
);
if ($err) {
_DbRep_sqlBlckgErrorState ($hash, $err);
return $err;
}
my $st = [gettimeofday]; # SQL-Startzeit
@ -7126,7 +7156,7 @@ sub DbRep_sqlCmdBlocking {
Log3 ($name, 4, "DbRep $name - Number of entries processed in db $hash->{DATABASE}: $nrows");
readingsBeginUpdate ($hash);
readingsBeginUpdate ($hash);
if (defined $data{DbRep}{$name}{sqlcache}{temp}) { # SQL incl. Formatierung aus Zwischenspeicherzwischenspeichern
my $tmpsql = delete $data{DbRep}{$name}{sqlcache}{temp};
@ -12334,7 +12364,7 @@ sub DbRep_autoForward {
}
for my $key (keys %{$af}) {
my ($srr, $ddev, $dr) = split("=>", $af->{$key});
my ($srr, $ddev, $dr) = split "=>", $af->{$key};
$ddev = DbRep_trim ($ddev) if($ddev);
next if(!$ddev);
@ -12342,12 +12372,12 @@ sub DbRep_autoForward {
$dr = DbRep_trim ($dr) if($dr);
if (!$defs{$ddev}) { # Vorhandensein Destination Device prüfen
Log3($name, 2, "$name - WARNING - Forward reading \"$reading\" not possible, device \"$ddev\" doesn't exist");
Log3($name, 2, "DbRep $name - WARNING - Forward reading \"$reading\" not possible, device \"$ddev\" doesn't exist");
next;
}
if (!$srr || $reading !~ /^$srr$/) {
# Log3 ($name, 4, "$name - Reading \"$reading\" doesn't match autoForward-Regex: ".($srr?$srr:"")." - no forward to \"$ddev\" ");
# Log3 ($name, 4, "DbRep $name - Reading \"$reading\" doesn't match autoForward-Regex: ".($srr?$srr:"")." - no forward to \"$ddev\" ");
next;
}
@ -12355,7 +12385,7 @@ sub DbRep_autoForward {
$dr = $dr ? $dr : ($sr !~ /\.\*/xs) ? $sr : $reading; # Destination Reading = Source Reading wenn Destination Reading nicht angegeben
$dr = makeReadingName ($dr); # Destination Readingname validieren / entfernt aus dem übergebenen Readingname alle ungültigen Zeichen und ersetzt diese durch einen Unterstrich "_"
Log3 ($name, 4, "$name - Forward reading \"$reading\" to \"$ddev:$dr\" ");
Log3 ($name, 4, "DbRep $name - Forward reading \"$reading\" to \"$ddev:$dr\" ");
CommandSetReading (undef, "$ddev $dr $value");
}
@ -14598,7 +14628,7 @@ sub DbReadingsVal($$$$) {
}
$hash->{LASTCMD} = "sqlCmdBlocking $sql";
$ret = DbRep_sqlCmdBlocking($name,$sql);
$ret = DbRep_sqlCmdBlocking ($name,$sql);
$ret = $ret ? $ret : $default;
return $ret;