From b9b0121ebbb6d45916649f067d6f7f3376b4bfce Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Tue, 18 Jan 2022 13:35:03 +0000 Subject: [PATCH] 93_DbRep: contrib 8.47.1 git-svn-id: https://svn.fhem.de/fhem/trunk@25495 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/DS_Starter/93_DbRep.pm | 205 +++++++++++++++++++--------- 1 file changed, 137 insertions(+), 68 deletions(-) diff --git a/fhem/contrib/DS_Starter/93_DbRep.pm b/fhem/contrib/DS_Starter/93_DbRep.pm index ad85eeeda..7b4959b9c 100644 --- a/fhem/contrib/DS_Starter/93_DbRep.pm +++ b/fhem/contrib/DS_Starter/93_DbRep.pm @@ -1,5 +1,5 @@ ########################################################################################################## -# $Id: 93_DbRep.pm 25451 2022-01-10 18:40:13Z DS_Starter $ +# $Id: 93_DbRep.pm 25492 2022-01-17 22:28:33Z DS_Starter $ ########################################################################################################## # 93_DbRep.pm # @@ -57,7 +57,8 @@ no if $] >= 5.017011, warnings => 'experimental::smartmatch'; # Version History intern my %DbRep_vNotesIntern = ( - "8.47.0" => "16.01.2022 new design of sqlCmdHistory ", + "8.47.1" => "18.01.2022 new sqlCmdHistory func ___restore_sqlhistory___ ", + "8.47.0" => "17.01.2022 new design of sqlCmdHistory, minor fixes ", "8.46.13" => "12.01.2022 more code refacturing, minor fixes ", "8.46.12" => "10.01.2022 more code refacturing, minor fixes, change usage of placeholder §device§, §reading§ in sqlCmd ", "8.46.11" => "03.01.2022 more code refacturing, minor fixes ", @@ -344,7 +345,11 @@ my %DbRep_vHintsExt_de = ( my %dbrep_col = ("DEVICE" => 64, "READING" => 64, ); # Standard Feldbreiten falls noch nicht getInitData ausgeführt my $dbrep_defdecplaces = 4; # Nachkommastellen Standard my $dbrep_dump_path_def = $attr{global}{modpath}."/log/"; # default Pfad für local Dumps -my $dbrep_dump_remotepath_def = "./"; # default Pfad für remote Dumps +my $dbrep_dump_remotepath_def = "./"; # default Pfad für remote Dumps +my $dbrep_fName = $attr{global}{modpath}."/FHEM/FhemUtils/cacheDbRep"; # default Pfad/Name SQL Cache File + + + ################################################################################### # DbRep_Initialize @@ -500,6 +505,7 @@ sub DbRep_Set { my $dbloghash = $defs{$hash->{HELPER}{DBLOGDEVICE}}; my $dbmodel = $dbloghash->{MODEL}; my $dbname = $hash->{DATABASE}; + my $sd =""; my (@bkps,$dir); @@ -529,9 +535,10 @@ sub DbRep_Set { # Drop-Down Liste bisherige Befehle in "sqlCmd" erstellen my (undef, $hl) = DbRep_listSQLcmdCache ($name); - if ($hl) { + if (AttrVal($name, "sqlCmdHistoryLength", 0)) { $hl .= "___purge_sqlhistory___"; - $hl .= ",___list_sqlhistory___"; + $hl .= ",___list_sqlhistory___"; + $hl .= ",___restore_sqlhistory___"; } my $setlist = "Unknown argument $opt, choose one of ". @@ -1013,7 +1020,6 @@ sub DbRep_Set { @cmd = split(/\s/, $sqlcmd); $sqlcmd = join(" ", @cmd); - # $sqlcmd =~ tr/ A-Za-z0-9!"#$§%&'()*+,-.\/:;<=>?@[\\]^_`{|}~äöüÄÖÜ߀/ /cs; # V8.36.0 20.03.2020 } if($opt eq "sqlCmdHistory") { @@ -1033,6 +1039,11 @@ sub DbRep_Set { my ($cache) = DbRep_listSQLcmdCache ($name); return $cache; } + + if($sqlcmd eq "___restore_sqlhistory___") { + my $count = DbRep_initSQLcmdCache ($name); + return $count ? "SQL history entries of $name restored: $count" : undef; + } } $hash->{LASTCMD} = $sqlcmd ? "$opt $sqlcmd" : "$opt"; @@ -1763,13 +1774,18 @@ return; # Gerät zu löschen die mit dieser Gerätedefinition zu tun haben. ################################################################################### sub DbRep_Delete { - my ($hash, $arg) = @_; + my $hash = shift; + my $arg = shift; + my $name = $hash->{NAME}; # gespeicherte Credentials löschen my $index = $hash->{TYPE}."_".$name."_adminCredentials"; setKeyValue($index, undef); + # gespeichertes SQL Cache löschen + DbRep_deleteSQLhistFromFile ($name); + return; } @@ -1777,12 +1793,13 @@ return; # DbRep_Shutdown ################################################################################### sub DbRep_Shutdown { - my ($hash) = @_; + my $hash = shift; my $dbh = $hash->{DBH}; $dbh->disconnect() if(defined($dbh)); - DbRep_delread($hash,1); - RemoveInternalTimer($hash); + + DbRep_delread ($hash,1); + RemoveInternalTimer ($hash); return; } @@ -11352,16 +11369,33 @@ sub DbRep_getcredentials { return ($success, $username, $passwd); } +#################################################################################################### +# anlegen Keyvalue-File für DbRep wenn nicht vorhanden +#################################################################################################### +sub DbRep_createCmdFile { + my $hash = shift; + + my $param = { + FileName => $dbrep_fName, + #ForceType => "file", + }; + my @new; + push(@new, "# This file is auto generated from 93_DbRep.pm", + "# Please do not modify, move or delete it.", + ""); + +return FileWrite($param, @new); +} + #################################################################################################### # Schreibroutine in DbRep Keyvalue-File #################################################################################################### sub DbRep_setCmdFile { my ($key,$value,$hash) = @_; - my $fName = $attr{global}{modpath}."/FHEM/FhemUtils/cacheDbRep"; my $param = { - FileName => $fName, - ForceType => "file", + FileName => $dbrep_fName, + #ForceType => "file", }; my ($err, @old) = FileRead($param); @@ -11387,35 +11421,60 @@ return FileWrite($param, @new); } #################################################################################################### -# anlegen Keyvalue-File für DbRep wenn nicht vorhanden +# Leseroutine aus DbRep Keyvalue-File #################################################################################################### -sub DbRep_createCmdFile { - my $hash = shift; - my $fName = $attr{global}{modpath}."/FHEM/FhemUtils/cacheDbRep"; +sub DbRep_getCmdFile { + my $key = shift; my $param = { - FileName => $fName, - ForceType => "file", + FileName => $dbrep_fName, + #ForceType => "file", }; - my @new; - push(@new, "# This file is auto generated from 93_DbRep.pm", - "# Please do not modify, move or delete it.", - ""); + + my ($err, @l) = FileRead($param); + return ($err, '') if($err); + + for my $line (@l) { + return ('', $line) if($line =~ m/^$key:(.*)/); + } -return FileWrite($param, @new); +return; } #################################################################################################### -# SQL Cache für sqlCmd History löschen +# SQL Cache für sqlCmd History aus RAM löschen #################################################################################################### sub DbRep_deleteSQLcmdCache { my $name = shift; - my $hash = $defs{$name}; delete $data{DbRep}{$name}{sqlcache}; $data{DbRep}{$name}{sqlcache}{index} = 0; # SQL-CommandHistory CacheIndex - DbRep_setCmdFile($name."_sqlCmdList", "", $hash); # Löschen der sql History Liste im DbRep-Keyfile +return; +} + +#################################################################################################### +# SQL Cache für sqlCmd History aus File löschen +#################################################################################################### +sub DbRep_deleteSQLhistFromFile { + my $name = shift; + + my $key = $name."_sqlCmdList"; + my ($err, @old) = FileRead($dbrep_fName); + my @new; + + if(!$err) { + for my $l (@old) { + if($l =~ m/^$key:/) { + next; + } + else { + push @new, $l; + } + } + + FileWrite($dbrep_fName, @new); + } return; } @@ -11424,7 +11483,8 @@ return; # SQL Cache für sqlCmd History initialisieren #################################################################################################### sub DbRep_initSQLcmdCache { - my $name = shift; + my $name = shift; + my $hash = $defs{$name}; RemoveInternalTimer ($name, "DbRep_initSQLcmdCache"); @@ -11433,15 +11493,15 @@ sub DbRep_initSQLcmdCache { return; } - $data{DbRep}{$name}{sqlcache}{index} = 0; # SQL-CommandHistory CacheIndex + DbRep_deleteSQLcmdCache ($name); my ($err,$hl) = DbRep_getCmdFile($name."_sqlCmdList"); + my $count = 0; if($hl) { $hl = (split ":", $hl, 2)[1]; my @cmds = split ",", $hl; - my $count = 0; for my $elem (@cmds) { $elem = _DbRep_deconvertSQL ($elem); @@ -11452,7 +11512,7 @@ sub DbRep_initSQLcmdCache { Log3 ($name, 4, qq{DbRep $name - SQL history restored from Cache file - count: $count}) if($count); } -return; +return $count; } #################################################################################################### @@ -11479,9 +11539,7 @@ sub DbRep_addSQLcmdCache { if($doIns) { _DbRep_insertSQLtoCache ($name, $tmpsql); - - my (undef, $cstr) = DbRep_listSQLcmdCache ($name, 1); - DbRep_setCmdFile($name."_sqlCmdList", $cstr, $hash) if($cstr); + DbRep_writeSQLcmdCache ($hash); # SQL Cache File schreiben } return; @@ -11548,6 +11606,20 @@ sub _DbRep_insertSQLtoCache { return; } +#################################################################################################### +# SQL Cache History speichern +#################################################################################################### +sub DbRep_writeSQLcmdCache { + my $hash = shift; + + my $name = $hash->{NAME}; + + my (undef, $cstr) = DbRep_listSQLcmdCache ($name, 1); + DbRep_setCmdFile($name."_sqlCmdList", $cstr, $hash); + +return; +} + #################################################################################################### # SQL Statement konvertieren # $write - setzen für Schreiben Cache File @@ -11581,28 +11653,6 @@ sub _DbRep_deconvertSQL { return $cmd; } -#################################################################################################### -# Leseroutine aus DbRep Keyvalue-File -#################################################################################################### -sub DbRep_getCmdFile { - my $key = shift; - my $fName = $attr{global}{modpath}."/FHEM/FhemUtils/cacheDbRep"; - - my $param = { - FileName => $fName, - ForceType => "file", - }; - - my ($err, @l) = FileRead($param); - return ($err, '') if($err); - - for my $line (@l) { - return ('', $line) if($line =~ m/^$key:(.*)/); - } - -return; -} - #################################################################################################### # Tabellenoptimierung MySQL #################################################################################################### @@ -12625,12 +12675,12 @@ sub DbRep_setVersionInfo { if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) { # META-Daten sind vorhanden $modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SMAPortal}{META}} - if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 93_DbRep.pm 25451 2022-01-10 18:40:13Z DS_Starter $ im Kopf komplett! vorhanden ) + if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 93_DbRep.pm 25492 2022-01-17 22:28:33Z DS_Starter $ im Kopf komplett! vorhanden ) $modules{$type}{META}{x_version} =~ s/1.1.1/$v/g; } else { $modules{$type}{META}{x_version} = $v; } - return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 93_DbRep.pm 25451 2022-01-10 18:40:13Z DS_Starter $ im Kopf komplett! vorhanden ) + return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 93_DbRep.pm 25492 2022-01-17 22:28:33Z DS_Starter $ im Kopf komplett! vorhanden ) if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) { # es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen # mit {->VERSION()} im FHEMWEB kann Modulversion abgefragt werden @@ -14433,12 +14483,22 @@ return;
-
  • sqlCmdHistory - If history is activated with attribute sqlCmdHistoryLength, an already - successfully executed sqlCmd-command can be repeated from a drop-down list.
    - With execution of "___purge_sqlhistory___" the history can be deleted. -

    +
  • sqlCmdHistory - If activated with the attribute sqlCmdHistoryLength, + a stored SQL statement can be selected from a list and executed. + The following entries execute special functions: +

    + +
      + + + + + +
      ___purge_sqlhistory___ : deletes the history cache
      ___list_sqlhistory___ : shows the SQL statements currently in the cache, including their cache key (ckey)
      ___restore_sqlhistory___ : Undoes a previously executed "___purge_sqlhistory___"
      +
    +
    - For a better overview the relevant attributes for this command are listed in a table:

    + The attributes relevant to controlling this function are:

      @@ -17232,12 +17292,21 @@ return;
    • sqlCmdHistory - Wenn mit dem Attribut sqlCmdHistoryLength aktiviert, kann - aus einer Liste ein bereits erfolgreich ausgeführtes sqlCmd-Kommando wiederholt werden.
      - Mit Ausführung von "___purge_sqlhistory___" kann die Historie gelöscht - werden.

      + ein gespeichertes SQL-Statement aus einer Liste ausgewählt und ausgeführt werden. + Mit den nachfolgenden Einträgen werden spezielle Funktionen ausgeführt: +

      - Zur besseren Übersicht sind die zur Steuerung dieser Funktion von relevanten Attribute - hier noch einmal zusammenstellt:

      +
        +
    • + + + + +
      ___purge_sqlhistory___ : löscht den History Cache
      ___list_sqlhistory___ : zeigt die aktuell im Cache vorhandenen SQL-Statements incl. ihrem Cache Key (ckey)
      ___restore_sqlhistory___ : macht ein zuvor ausgeführtes "___purge_sqlhistory___" rückgängig
      +
    +
    + + Die zur Steuerung dieser Funktion relevante Attribute sind: