FHEM Forum

FHEM => Sonstiges => Thema gestartet von: betateilchen am 16 September 2017, 13:31:54

Titel: [patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: betateilchen am 16 September 2017, 13:31:54
Analog zu FileWrite() und FileRead() schlage ich folgende neue Funktion vor.


Index: fhem.pl
===================================================================
--- fhem.pl     (revision 15072)
+++ fhem.pl     (working copy)
@@ -59,6 +59,7 @@
sub DoTrigger($$@);
sub EvalSpecials($%);
sub Each($$;$);
+sub FileDelete($);
sub FileRead($);
sub FileWrite($@);
sub FmtDateTime($);
@@ -4830,6 +4831,25 @@
}

sub
+FileDelete($)
+{
+  my ($param) = @_;
+  my ($fileName, $forceType);
+  if(ref($param) eq "HASH") {
+    $fileName = $param->{FileName};
+    $forceType = $param->{ForceType};
+  } else {
+    $fileName = $param;
+  }
+  $forceType //= '';
+  if(configDBUsed() && lc($forceType) ne "file") {
+    return _cfgDB_Filedelete($fileName);
+  } else {
+    return unlink($fileName);
+  }
+}
+
+sub
getUniqueId()
{
   my ($err, $uniqueID) = getKeyValue("uniqueID");

Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: rudolfkoenig am 17 September 2017, 11:58:37
Habs eingecheckt.
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: betateilchen am 17 September 2017, 13:20:50
Danke.
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: Markus Bloch am 19 September 2017, 13:04:29
Hallo zusammen,

ich bin gerade dabei die Funktion FileDelete() ins Wiki aufzunehmen. Dabei bin ich bei der Recherche, was der Return-Wert genau bedeutet etwas arg verwirrt, was damit bezweckt werden soll.

Generell muss man dabei zwischen Filesystem-Löschen und configDB-Löschen unterscheiden:

Filesystem:

Rückgabewert von undef() => https://perldoc.perl.org/functions/unlink.html wobei die Anzahl der gelöschten Dateien zurückgegeben wird oder undef im Fehlerfall. Die eigentliche Fehlermeldung steht dann in $!, welche man selber auswerten müsste.

configDB:

Hier gibts folgendes if-Konstrukt:


        if($ret > 0) {
                $ret = "File $filename deleted from database.";
        } else {
                $ret = "File $filename not found in database.";
        }
        return $ret;


Sowohl im Erfolgs-, als auch Fehlerfall wird ein String zurückgegeben.

Könnte man das ganze nicht harmonisieren mit den Error-Rückgabewerten der anderen File-Funktionen? Also nur im Fehlerfall wird eine Fehlermeldung als String zurückgegeben? Aktuell ist das ein sehr kruder Rückgabewert wo ich etwas Probleme habe zu beschreiben, was dieser Rückgabewert in welchem Fall genau bedeutet.

Danke

Gruß
Markus
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: betateilchen am 19 September 2017, 14:35:42
configDB liefert in beiden Fällen einen String zurück, weil es schon sehr lange den Frontend-Befehl "configdb filedelete <fileName>" gibt und der Anwender an dieser Stelle - zurecht - eine aussagekräftige Rückantwort haben möchte.
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: Markus Bloch am 19 September 2017, 14:51:33
Das ist mir natürlich klar.

Mein Vorschlag daher:

FileDelete($)
{
  my ($param) = @_;
  my ($fileName, $forceType);
  if(ref($param) eq "HASH") {
    $fileName = $param->{FileName};
    $forceType = $param->{ForceType};
  } else {
    $fileName = $param;
  }
  $forceType //= '';
  if(configDBUsed() && lc($forceType) ne "file") {
    my $r = _cfgDB_Filedelete($fileName);
    return $r if($r !~ /deleted from database/);
  } else {
    return $! unless(defined(unlink($fileName)));
  }
  return undef;
}


Damit ist der Rückgabewert klar ein String im Falle eines Fehlers. Bei Erfolg wird undef zurückgegeben.
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: betateilchen am 19 September 2017, 15:08:51
Ab morgen (ab sofort in SVN) gilt folgende Regel:


Das hier:

return $! unless(defined(unlink($fileName)));

halte ich übrigens für fragwürdig, weil unlink() eine (definierte) 0 zurückliefert, wenn eine vorhandene Datei wegen fehlender Berechtigung nicht gelöscht werden konnte. Eigentlich ist das aber ein Fehlerfall.
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: Markus Bloch am 20 September 2017, 11:50:45
Neuer Vorschlag:

FileDelete($)
{
  my ($param) = @_;
  my ($fileName, $forceType);
  if(ref($param) eq "HASH") {
    $fileName = $param->{FileName};
    $forceType = $param->{ForceType};
  } else {
    $fileName = $param;
  }
  $forceType //= '';
  if(configDBUsed() && lc($forceType) ne "file") {
    my $r = _cfgDB_Filedelete($fileName);
    return "unable to delete file from configDB: $fileName" unless($r);
  } else {
    return $! unless(unlink($fileName));
  }
  return undef;
}
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: betateilchen am 20 September 2017, 12:01:24
Das ist ja noch schlimmer als der vorhergehende. Lies bitte nochmal meinen letzten Beitrag.

Ich würde an dieser Stelle gar keinen String zurückgeben, sondern einfach nur einen logischen Wert für den Fehler- und den Erfolgsfall.
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: Markus Bloch am 20 September 2017, 12:17:03
Von mir aus gerne, nur dann aber sollten wir das bei allen File*()-Funktionen machen. Jede Funktion gibt da unterschiedliche Sachen zurück und schlimmer möchte ich es ehrlich gesagt nicht machen:

($err,@content) = FileRead(...)

-> $err ist im Fehlerfall mit einer Fehlermeldung als Zeichenkette befüllt. Im Erfolgsfall ist $err = undef oder "" (Leerstring von configDB)

$err = FileWrite(...)

-> $err ist im Fehlerfall mit einer Fehlermeldung als Zeichenkette befüllt. Im Erfolgsfall ist undef (sowohl regulär als auch configDB)

$ret = FileDelete(...)
-> $ret ist im Fehlerfall 0 und im Erfolgsfall 1 (so?)



Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: betateilchen am 20 September 2017, 13:43:56
Wenn Du in Deinem jetzigen Job mal keinen Spaß mehr hast, kannst Du jederzeit bei der EU in der Abteilung anfangen, die Gurkengrößen normieren will...

mann mann mann...
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: rudolfkoenig am 20 September 2017, 14:10:44
Meiner Erfahrung nach werden Entwickler von nicht genormten "Gurken" schnell frustriert.
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: betateilchen am 20 September 2017, 14:30:15
ich finde nicht genormte Gurken sind einfach "natürlich" und quasi 100% BIO :)

Darüber hinaus sind sie auch noch vegetarisch & vegan. Was wollen wir mehr?
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: Markus Bloch am 20 September 2017, 15:05:52
Ich seh das eher unter gutes Handwerk.  ;)

Rudi darf entscheiden.

Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: betateilchen am 20 September 2017, 17:36:18
Ich finde das alles gut so, wie es jetzt ist.
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: rudolfkoenig am 21 September 2017, 09:26:57
Ich habe FileDelete angepasst: es wird analog zu den anderen File_* Routinen im Fehlerfall ein Text zurueckgeliefert, sonst undef.
Titel: Antw:[patch] fhem.pl - Neue Funktion FileDelete()
Beitrag von: betateilchen am 21 September 2017, 13:09:30
wie langweilig....