FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: betateilchen am 26 April 2014, 11:18:20

Titel: configDB - 99.* Dateien werden mehrfach geladen
Beitrag von: betateilchen am 26 April 2014, 11:18:20
Zitat von: rudolfkoenig am 26 April 2014, 10:03:47

Wir sollten alles auf einem zu bauenden readFile/writeFile umstellen (Argument und Rueckgabe ein array von Zeilen), damit die eigentlichen Funktionen an eine Stelle sind.


Damit hab ich kein Problem. Wobei das mit den Attributen auch dann ein Sonderfall bleibt, da die Attribute nicht als File gelesen, sondern aus der Datenbank selektiert werden. Ich könnte da aber problemlos ein Array mit drei Werten pro Zeile zurückliefern:

<deviceName>, <attrName>, <attrVal>

Hintergrund ist, dass ich in cfgDB_GlobalAttr nicht nur Attribute für "global" setze, sondern auch Attribute für "configdb" die intern für die Verwaltung gebraucht werden.

Die generelle Umstellung bzw. Vereinheitlichung auf readFile/writeFile können wir auch gerne angehen, aber dazu muss ich erst ermitteln, welche der in den letzten Tagen eingebauten Änderungen dadurch noch einmal geändert werden müssen. Das würde ich wegen bevorstehendem Urlaub aber auf Mitte Mai verschieben.
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: rudolfkoenig am 26 April 2014, 11:22:59
Gerne. Von Hektik war keine Rede.
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: betateilchen am 26 April 2014, 12:07:10
Für die Attribute kannst Du die Lösung jetzt schon umsetzen:


sub
setGlobalAttrBeforeFork($)
{
  my ($f) = @_;
  my @attributes;
 
  if($f eq 'configDB') {
    @attributes = cfgDB_AttrRead('global');
    #  will return an array with lines like
    #  <deviceName>,<attrName>,<attrVal>
    #  e.g.:
    #  global,verbose,3
    #  configdb,private,1
  } else {
    # @attributes = readGlobalAttributesFromConfigFile
  }


#  if($f eq 'configDB') {
#    cfgDB_GlobalAttr();
#    return;
#  }

  open(FH, $f) || die("Cant open $f: $!\n");
  while(my $l = <FH>) {
    $l =~ s/[\r\n]//g;
    next if($l !~ m/^attr\s+global\s+([^\s]+)\s+(.*)$/);
    my ($n,$v) = ($1,$2);
    $v =~ s/#.*//;
    $v =~ s/ .*$//;
    $attr{global}{$n} = $v;
    GlobalAttr("set", "global", $n, $v);
  }
  close(FH);
}


Du musst dann das Lesen des Arrays und das Setzen der Attribute komplett in der fhem.pl vornehmen, configDB wird da nichts mehr aktiv tun.

Im Moment funktionieren  beide Wege. Sobald Du den Umbau in der fhem.pl umgesetzt hast, werde ich die alte Funktion cfgDB_GlobalAttr() entfernen.
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: betateilchen am 28 April 2014, 20:24:11
Zitat von: rudolfkoenig am 26 April 2014, 08:57:12
Ich habe
- in setGlobalAttrBeforeFork GlobalAttr aufgerufen.

Diese Änderung und der dadurch notwendig gewordene Umbau in der korrespondierenden configDB-Funktion führt zur Zeit dazu, dass alle 99er Module während des fhem-Start zweimal geladen werden.
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: rudolfkoenig am 30 April 2014, 12:26:29
Zitatalle 99er Module während des fhem-Start zweimal geladen werden.

Um klar zu sagen, das ist nur im Fall von configDB. Ich habe ein
if(!$modules{$m}{LOADED});
hinzugefuegt, kannst Du es bitte pruefen, ob es hilft?
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: betateilchen am 30 April 2014, 16:49:33
Zitat von: rudolfkoenig am 30 April 2014, 12:26:29
Um klar zu sagen, das ist nur im Fall von configDB.

Das hatte ich doch auch in meinem Hinweis geschrieben?

Ich werde testen und berichten.
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: rudolfkoenig am 01 Mai 2014, 17:12:41
ZitatDas hatte ich doch auch in meinem Hinweis geschrieben?

Stimmt, ich wollte es nur fuer die anderen klarstellen, ich meine das war leicht zu ueberlesen.
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: betateilchen am 02 Mai 2014, 09:05:57
Zitat von: betateilchen am 30 April 2014, 16:49:33
Ich werde testen und berichten.

Bericht: Funktioniert nicht.
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: rudolfkoenig am 02 Mai 2014, 09:36:36
Kannst Du mir bitte das Leben einfacher machen, und etwas gespraechiger sein?
Was funktioniert nicht? Wird es erneut geladen? Woher weisst Du es? Wird es gar nicht geladen? Fehlt dir was anderes?
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: betateilchen am 02 Mai 2014, 09:37:18
Die 99er werden immer noch doppelt geladen.
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: betateilchen am 02 Mai 2014, 09:40:35
Wir sollten auch das Lesen der globalen Attribute standardisieren, damit der Aufruf von GlobalAttr nur jeweils einmal in der fhem.pl durchgeführt werden muss. Eine Möglichkeit, die globalen Attribute aus der configDB zu lesen, um sie in fhem.pl verwenden zu können, hatte ich weiter oben schon beschrieben.

Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: rudolfkoenig am 02 Mai 2014, 16:38:28
ZitatDie 99er werden immer noch doppelt geladen.

Das kann ich nach ein weiteres Mal eine Weile auf dem Code starren immer noch nicht nachvollziehen.
CommandReload setzt $modules->{$m}{LOADED}, und sie wird nur bei einem nicht gesetzten LOADED wieder aufgerufen.

Zitathatte ich weiter oben schon beschrieben.

Waere es moeglich, dass ich fuer desen Zweck auch FileRead (und damit in configDB Fall cfgDB_FileRead) verwende? Oder wenn nicht, dass ich das gleiche Format (attr global xxx yyy) zurueckgeliefert bekomme?
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: betateilchen am 02 Mai 2014, 19:04:59
Zitat von: rudolfkoenig am 02 Mai 2014, 16:38:28
Oder wenn nicht, dass ich das gleiche Format (attr global xxx yyy) zurueckgeliefert bekomme?

Also ein Array mit Zeilen, die jeweils einen kompletten fhem-Befehl enthalten? Das ist kein Problem, das kann ich Dir bauen.

Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: betateilchen am 02 Mai 2014, 19:14:47
erledigt.

cfgDB_AttrRead('global')

liefert jetzt ein Array mit folgenden Elementen (ein Arrayelement = 1 Zeile)


attr global group System
attr global logfile ./log/fhem-%Y-%m-%d.log
attr global modpath .
attr global motd none
attr global nrarchive 1
attr global room 99 System
attr global title fhem@MBA
attr global userattr devStateIcon devStateStyle icon sortby webCmd
attr global verbose 3


Diese Funktion funktioniert auch mit jedem anderen Device, nicht nur für 'global'
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: rudolfkoenig am 02 Mai 2014, 20:51:10
Geaendert, mit Dateien getestet & eingecheckt.
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: betateilchen am 03 Mai 2014, 08:45:42
aber mit Attributen hast Du das nicht getestet, das funktioniert nämlich nicht.

Die Funktion heißt cfgDB_AttrRead und nicht cfgDB_attrRead
Titel: Antw:Antw:Interfaces durch Type Library ersetzen
Beitrag von: betateilchen am 03 Mai 2014, 09:31:28
Und dann werde ich mich mal auf die Suche machen, warum die 99_myUtils aus der configDB immer noch zweimal geladen wird, die 99_Utils aus dem Dateisystem aber nicht.


2014.05.03 09:29:05 0: Server shutdown
2014.05.03 09:29:08 1: DEBUG>99_myUtils loaded...
2014.05.03 09:29:08 1: DEBUG>99_myUtils loaded...
2014.05.03 09:29:08 3: telnetPort: port 7072 opened
2014.05.03 09:29:08 3: WEB: port 8083 opened
2014.05.03 09:29:08 0: Server started with 4 defined entities
Titel: configDB: 99.* Dateien werden mehrfach geladen
Beitrag von: betateilchen am 03 Mai 2014, 11:02:31
Zitat von: betateilchen am 03 Mai 2014, 09:31:28
Und dann werde ich mich mal auf die Suche machen, warum die 99_myUtils aus der configDB immer noch zweimal geladen wird

Gefunden und gelöst.


Edit: zu früh gefreut :(
Titel: Antw:configDB - 99.* Dateien werden mehrfach geladen
Beitrag von: betateilchen am 03 Mai 2014, 11:34:18
jetzt aber...


Index: fhem.pl
===================================================================
--- fhem.pl (revision 5725)
+++ fhem.pl (working copy)
@@ -154,7 +154,10 @@
sub cfgDB_ReadAll($);
sub cfgDB_SaveState;
sub cfgDB_SaveCfg;
-sub cfgDB_GlobalAttr;
+sub cfgDB_AttrRead($);
+sub cfgDB_ReadFile($);
+sub cfgDB_UpdateFile($);
+sub cfgDB_WriteFile($@);
sub cfgDB_svnId;

##################################################
@@ -2119,7 +2122,8 @@
     if(configDBUsed()) {
       my @dbList = split(/,/,cfgDB_Read99()); # retrieve filelist from configDB
       foreach my $m (@dbList) {
-        CommandReload(undef, $m) if(!$modules{$m}{LOADED});
+        $m =~ m/^([0-9][0-9])_(.*)\.pm$/;
+        CommandReload(undef, $m) if(!$modules{$2}{LOADED});
         $counter++;
       }
     }
@@ -3210,7 +3214,7 @@

   my ($err, @rows);
   if($f eq 'configDB') {
-    @rows = cfgDB_attrRead('global');
+    @rows = cfgDB_AttrRead('global');
   } else {
     ($err, @rows) = FileRead($f);
     die("$err\n") if($err);
Titel: Antw:configDB - 99.* Dateien werden mehrfach geladen
Beitrag von: rudolfkoenig am 03 Mai 2014, 11:41:22
Eingecheckt.
Titel: Antw:configDB - 99.* Dateien werden mehrfach geladen
Beitrag von: betateilchen am 03 Mai 2014, 11:48:09
Danke.


Den von Dir beschriebenen Fehler mit der locked Database kann ich übrigens auch mit einer neu angelegten leeren Datenbank nicht erzeugen.

Kannst Du mir nochmal genau beschreiben, wie Du das Anlegen der db durchgeführt hast?