From 91bd5bc76713abc66e5efea4432ed6979d5a5426 Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Mon, 19 Mar 2018 21:50:14 +0000 Subject: [PATCH] 93_DbRep: 7.14.6, attr expimpfile can use some kinds of wildcards git-svn-id: https://svn.fhem.de/fhem/trunk@16449 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/93_DbRep.pm | 120 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 99 insertions(+), 22 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 7c8ed8150..da265ad34 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -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: 7.14.6, attr expimpfile can use some kinds of wildcards - feature: 59_WUup: V0.9.6, calculate solarradiation from lux to W/m² - feature: 73_AMADCommBridge: fix Commandref, add allowfrom support - bugfix: 74_XiaomiBTLESens: Backslash found where operator expected diff --git a/fhem/FHEM/93_DbRep.pm b/fhem/FHEM/93_DbRep.pm index b66ebb304..74397fb99 100644 --- a/fhem/FHEM/93_DbRep.pm +++ b/fhem/FHEM/93_DbRep.pm @@ -37,6 +37,8 @@ ########################################################################################################################### # Versions History: # +# 7.14.6 18.03.2018 attribute expimpfile can use some kinds of wildcards (exportToFile, importFromFile +# adapted) # 7.14.5 17.03.2018 perl warnings of DbLog $dn,$dt,$evt,$rd in changeval_Push & complex # 7.14.4 11.03.2018 increased timeout of BlockingCall in DbRep_firstconnect # 7.14.3 07.03.2018 DbRep_firstconnect changed - get lowest timestamp in database, DbRep_Connect deleted @@ -326,7 +328,7 @@ no if $] >= 5.017011, warnings => 'experimental::smartmatch'; sub DbRep_Main($$;$); sub DbLog_cutCol($$$$$$$); # DbLog-Funktion nutzen um Daten auf maximale Länge beschneiden -my $DbRepVersion = "7.14.5"; +my $DbRepVersion = "7.14.6"; my %dbrep_col = ("DEVICE" => 64, "TYPE" => 64, @@ -1507,10 +1509,10 @@ sub DbRep_Main($$;$) { $hash->{HELPER}{RUNNING_PID} = BlockingCall("delseqdoubl_DoParse", "$name§$cmd§$device§$reading§$ts", "delseqdoubl_ParseDone", $to, "DbRep_ParseAborted", $hash); } elsif ($opt eq "exportToFile") { - $hash->{HELPER}{RUNNING_PID} = BlockingCall("expfile_DoParse", "$name§$device§$reading§$ts", "expfile_ParseDone", $to, "DbRep_ParseAborted", $hash); + $hash->{HELPER}{RUNNING_PID} = BlockingCall("expfile_DoParse", "$name§$device§$reading§$runtime_string_first§$ts", "expfile_ParseDone", $to, "DbRep_ParseAborted", $hash); } elsif ($opt eq "importFromFile") { - $hash->{HELPER}{RUNNING_PID} = BlockingCall("impfile_Push", "$name", "impfile_PushDone", $to, "DbRep_ParseAborted", $hash); + $hash->{HELPER}{RUNNING_PID} = BlockingCall("impfile_Push", "$name|$runtime_string_first", "impfile_PushDone", $to, "DbRep_ParseAborted", $hash); } elsif ($opt eq "maxValue") { $hash->{HELPER}{RUNNING_PID} = BlockingCall("maxval_DoParse", "$name§$device§$reading§$prop§$ts", "maxval_ParseDone", $to, "DbRep_ParseAborted", $hash); @@ -4816,7 +4818,7 @@ return; #################################################################################################### sub expfile_DoParse($) { my ($string) = @_; - my ($name, $device, $reading, $ts) = split("\\§", $string); + my ($name, $device, $reading, $rsf, $ts) = split("\\§", $string); my $hash = $defs{$name}; my $dbloghash = $hash->{dbloghash}; my $dbconn = $dbloghash->{dbconn}; @@ -4835,15 +4837,19 @@ sub expfile_DoParse($) { if ($@) { $err = encode_base64($@,""); Log3 ($name, 2, "DbRep $name - $@"); - return "$name|''|''|$err|''|''"; + return "$name|''|''|$err|''|''|''"; } - my $outfile = AttrVal($name, "expimpfile", undef); + $rsf =~ s/[:\s]/_/g; + my $outfile = AttrVal($name, "expimpfile", undef); + $outfile =~ s/%TSB/$rsf/g; + my @t = localtime; + $outfile = ResolveDateWildcards($outfile, @t); if (open(FH, ">:utf8", "$outfile")) { binmode (FH) if(!$utf8); } else { $err = encode_base64("could not open ".$outfile.": ".$!,""); - return "$name|''|''|$err"; + return "$name|''|''|$err|''|''|''"; } # ist Zeiteingrenzung und/oder Aggregation gesetzt ? (wenn ja -> "?" in SQL sonst undef) @@ -4882,7 +4888,7 @@ sub expfile_DoParse($) { $err = encode_base64($@,""); Log3 ($name, 2, "DbRep $name - $@"); $dbh->disconnect; - return "$name|''|''|$err|''|''"; + return "$name|''|''|$err|''|''|''"; } while (my $row = $sth->fetchrow_arrayref) { @@ -4906,7 +4912,7 @@ sub expfile_DoParse($) { $rt = $rt.",".$brt; - return "$name|$nrows|$rt|$err|$device|$reading"; + return "$name|$nrows|$rt|$err|$device|$reading|$outfile"; } #################################################################################################### @@ -4925,6 +4931,7 @@ sub expfile_ParseDone($) { $device =~ s/[^A-Za-z\/\d_\.-]/\//g; my $reading = $a[5]; $reading =~ s/[^A-Za-z\/\d_\.-]/\//g; + my $outfile = $a[6]; if ($err) { ReadingsSingleUpdateValue ($hash, "errortext", $err, 1); @@ -4946,7 +4953,7 @@ sub expfile_ParseDone($) { readingsEndUpdate($hash, 1); my $rows = $ds.$rds.$nrows; - Log3 ($name, 3, "DbRep $name - Number of exported datasets from $hash->{DATABASE} to file ".AttrVal($name, "expimpfile", undef).": $rows."); + Log3 ($name, 3, "DbRep $name - Number of exported datasets from $hash->{DATABASE} to file $outfile: ".$rows); delete($hash->{HELPER}{RUNNING_PID}); @@ -4957,7 +4964,8 @@ return; # nichtblockierende DB-Funktion impfile #################################################################################################### sub impfile_Push($) { - my ($name) = @_; + my ($string) = @_; + my ($name, $rsf) = split("\\|", $string); my $hash = $defs{$name}; my $dbloghash = $hash->{dbloghash}; my $dbconn = $dbloghash->{dbconn}; @@ -4978,18 +4986,22 @@ sub impfile_Push($) { if ($@) { $err = encode_base64($@,""); Log3 ($name, 2, "DbRep $name - $@"); - return "$name|''|''|$err"; + return "$name|''|''|$err|''"; } # check ob PK verwendet wird, @usepkx?Anzahl der Felder im PK:0 wenn kein PK, $pkx?Namen der Felder:none wenn kein PK my ($usepkh,$usepkc,$pkh,$pkc) = DbRep_checkUsePK($hash,$dbloghash,$dbh); - my $infile = AttrVal($name, "expimpfile", undef); + $rsf =~ s/[:\s]/_/g; + my $infile = AttrVal($name, "expimpfile", undef); + $infile =~ s/%TSB/$rsf/g; + my @t = localtime; + $infile = ResolveDateWildcards($infile, @t); if (open(FH, "<:utf8", "$infile")) { binmode (FH) if(!$utf8); } else { $err = encode_base64("could not open ".$infile.": ".$!,""); - return "$name|''|''|$err"; + return "$name|''|''|$err|''"; } # only for this block because of warnings if details inline is not set @@ -5017,7 +5029,7 @@ sub impfile_Push($) { $err = encode_base64($@,""); Log3 ($name, 2, "DbRep $name - $@"); $dbh->disconnect(); - return "$name|''|''|$err"; + return "$name|''|''|$err|''"; } $dbh->begin_work(); @@ -5050,7 +5062,7 @@ sub impfile_Push($) { Log3 ($name, 2, "DbRep $name -> ERROR - Import from file $infile was not done. Invalid date/time field format in row $irowcount."); close(FH); $dbh->rollback; - return "$name|''|''|$err"; + return "$name|''|''|$err|''"; } # Daten auf maximale Länge (entsprechend der Feldlänge in DbLog DB create-scripts) beschneiden wenn nicht SQLite @@ -5074,7 +5086,7 @@ sub impfile_Push($) { close(FH); $dbh->rollback; $dbh->disconnect; - return "$name|''|''|$err"; + return "$name|''|''|$err|''"; } else { $irowdone++ } @@ -5086,7 +5098,7 @@ sub impfile_Push($) { close(FH); $dbh->rollback; $dbh->disconnect; - return "$name|''|''|$err"; + return "$name|''|''|$err|''"; } } @@ -5102,7 +5114,7 @@ sub impfile_Push($) { $rt = $rt.",".$brt; - return "$name|$irowdone|$rt|$err"; + return "$name|$irowdone|$rt|$err|$infile"; } #################################################################################################### @@ -5117,6 +5129,7 @@ sub impfile_PushDone($) { my ($rt,$brt) = split(",", $bt); my $err = $a[3]?decode_base64($a[3]):undef; my $name = $hash->{NAME}; + my $infile = $a[4]; if ($err) { ReadingsSingleUpdateValue ($hash, "errortext", $err, 1); @@ -5135,7 +5148,7 @@ sub impfile_PushDone($) { ReadingsBulkUpdateTimeState($hash,$brt,$rt,"done"); readingsEndUpdate($hash, 1); - Log3 ($name, 3, "DbRep $name - Number of imported datasets to $hash->{DATABASE} from file ".AttrVal($name, "expimpfile", undef).": $irowdone"); + Log3 ($name, 3, "DbRep $name - Number of imported datasets to $hash->{DATABASE} from file $infile: $irowdone"); delete($hash->{HELPER}{RUNNING_PID}); @@ -9897,7 +9910,39 @@ sub bdump { -
  • expimpfile - Path/filename for data export/import

  • +
  • expimpfile - Path/filename for data export/import.

    + + The filename may contain wildcards which are replaced by corresponding values + (see subsequent table). + Furthermore filename can contain %-wildcards of the POSIX strftime function of the underlying OS (see your + strftime manual).
    + About POSIX wildcard usage please see also explanations in Filelog.
    +
    + + +

  • + + +

  • fetchMarkDuplicates - Highlighting of multiple occuring datasets in result of "fetchrows" command

  • @@ -11513,7 +11558,38 @@ sub bdump { -
  • expimpfile - Pfad/Dateiname für Export/Import in/aus einem File.

  • +
  • expimpfile - Pfad/Dateiname für Export/Import in/aus einem File.

    + + Der Dateiname kann Platzhalter enthalten die gemäß der nachfolgenden Tabelle ersetzt werden. + Weiterhin können %-wildcards der POSIX strftime-Funktion des darunterliegenden OS enthalten + sein (siehe auch strftime Beschreibung).
    + Zur POSIX Wildcardverwendung siehe auch die Erläuterungen zu Filelog.
    +
    + + +

  • + + +

  • fetchMarkDuplicates - Markierung von mehrfach vorkommenden Datensätzen im Ergebnis des "fetchrows" Kommandos