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.
Gerne. Von Hektik war keine Rede.
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.
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.
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?
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.
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.
Zitat von: betateilchen am 30 April 2014, 16:49:33
Ich werde testen und berichten.
Bericht: Funktioniert nicht.
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?
Die 99er werden immer noch doppelt geladen.
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.
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?
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.
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'
Geaendert, mit Dateien getestet & eingecheckt.
aber mit Attributen hast Du das nicht getestet, das funktioniert nämlich nicht.
Die Funktion heißt cfgDB_AttrRead und nicht cfgDB_attrRead
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
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 :(
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);
Eingecheckt.
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?