2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 12:49:34 +00:00
git-svn-id: https://svn.fhem.de/fhem/trunk@7605 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
betateilchen 2015-01-17 20:44:19 +00:00
parent d4a9077a24
commit 981f4fbfd6
2 changed files with 58 additions and 338 deletions

View File

@ -375,6 +375,11 @@ compare device: telnetPort in current version 0 (left) to version: 1 (right)
| 1|define telnetPort telnet 7072 global | 1|define telnetPort telnet 7072 global | | 1|define telnetPort telnet 7072 global | 1|define telnetPort telnet 7072 global |
* 2|attr telnetPort room telnet * | | * 2|attr telnetPort room telnet * | |
+--+--------------------------------------+--+--------------------------------------+</pre> +--+--------------------------------------+--+--------------------------------------+</pre>
<b>Special: configdb diff all current</b><br/>
<br/>
Will show a diff table containing all changes between saved version 0<br/>
and UNSAVED version from memory (currently running installation).<br/>
<br/>
<li><code>configdb filedelete &lt;Filename&gt;</code></li><br/> <li><code>configdb filedelete &lt;Filename&gt;</code></li><br/>
Delete file from database.<br/> Delete file from database.<br/>
@ -524,319 +529,4 @@ attr Melder_FAr peerIDs 00000000,2286BC03,
=end html =end html
=begin html_DE
<a name="configdb"></a>
<h3>configdb</h3>
<ul>
Seit version 5079 unterst&uuml;tzt fhem die Verwendung einer SQL Datenbank zum Abspeichern der kompletten Konfiguration<br/>
Dadurch kann man auf alle cfg Dateien, includes usw. verzichten und die daraus immer wieder resultierenden Probleme vermeiden.<br/>
Desweiteren gibt es damit eine Versionierung von Konfigurationen und die M&ouml;glichkeit,
jederzeit eine &auml;ltere Version wiederherstellen zu k&ouml;nnen.<br/>
Der Zugriff auf die Datenbank erfolgt &uuml;ber die perl-eigene Datenbankschnittstelle DBI.<br/>
<br/>
<b>Zusammenspiel mit anderen fhem Modulen</b><br/>
<ul><br/>
Momentan verwenden die Module<br/>
<br/>
<li>02_RSS.pm</li>
<li>91_eventTypes</li>
<li>93_DbLog.pm</li>
<li>95_holiday.pm</li>
<li>98_SVG.pm</li>
<br/>
die configDB, um ihre Konfigurationsdaten von dort zu lesen<br/>
anstatt aus den bisherigen Konfigurationsdateien im Dateisystem.<br/>
Hierzu ist es notwendig, die Konfigurationsdateien aus dem Dateisystem in die Datenbank zu importieren.<br/>
<br/>
Beispiel:<br/>
<code>configdb fileimport FHEM/nrw.holiday</code><br/>
<code>configdb fileimport FHEM/myrss.layout</code><br/>
<code>configdb fileimport www/gplot/xyz.gplot</code><br/>
<br/>
<b>Dies hat keinerlei Auswirkungen auf die Definition der holiday oder RSS Instanzen.</b><br/>
<br>
<b>Während einer Migration werden alle in der aktuell bestehenden Konfiguration verwendeten externen<br/>
Konfigurationsdateien automatisch in die Datenbank importiert.</b></br>
<br/>
Jeder Neuimport einer bereits in der Datenbank gespeicherten Datei &uuml;berschreibt die vorherige Datei in der Datenbank.<br/>
<br/>
</ul><br/>
<br/>
<b>Voraussetzungen / Installation</b><br/>
<ul><br/>
<li>Bitte das perl Paket Text::Diff installieren, falls noch nicht auf dem System vorhanden.</li><br/>
<li>Es muss eine SQL Datenbank verf&uuml;gbar sein, untsrst&uuml;tzt werden SQLITE, MYSQL und POSTGRESQLL.</li><br/>
<li>Das zum Datenbanktype geh&ouml;rende DBD Modul muss in perl installiert sein,<br/>
f&uuml;r sqlite3 auf einem Debian System z.B. das Paket libdbd-sqlite3-perl</li><br/>
<li>Eine leere Datenbank muss angelegt werden, z.B. in sqlite3:<br/>
<pre>
mba:fhem udo$ sqlite3 configDB.db
SQLite version 3.7.13 2012-07-17 17:46:21
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> pragma auto_vacuum=2;
sqlite> .quit
mba:fhem udo$
</pre></li>
<li>Die ben&ouml;tigten Datenbanktabellen werden automatisch angelegt.</li><br/>
<li>Eine Konfigurationsdatei f&uuml;r die Verbindung zur Datenbank muss angelegt werden.<br/>
<br/>
<b>WICHTIG:</b>
<ul><br/>
<li>Diese Datei <b>muss</b> den Namen "configDB.conf" haben</li>
<li>Diese Datei <b>muss</b> im gleichen Verzeichnis liegen wie fhem.pl und configDB.pm, z.B. /opt/fhem</li>
</ul>
<br/>
<pre>
## f&uuml;r MySQL
################################################################
#%dbconfig= (
# connection => "mysql:database=configDB;host=db;port=3306",
# user => "fhemuser",
# password => "fhempassword",
#);
################################################################
#
## f&uuml;r PostgreSQL
################################################################
#%dbconfig= (
# connection => "Pg:database=configDB;host=localhost",
# user => "fhemuser",
# password => "fhempassword"
#);
################################################################
#
## f&uuml;r SQLite (username and password bleiben bei SQLite leer)
################################################################
#%dbconfig= (
# connection => "SQLite:dbname=/opt/fhem/configDB.db",
# user => "",
# password => ""
#);
################################################################
</pre></li><br/>
</ul>
<b>Aufruf mit einer vollst&auml;ndig neuen fhem Installation</b><br/>
<ul><br/>
Sehr einfach... fhem muss lediglich folgendermassen gestartet werden:<br/><br/>
<ul><code>perl fhem.pl configDB</code></ul><br/>
<b>configDB</b> ist das Schl&uuml;sselwort, an dem fhem erkennt, <br/>
dass eine Datenbank f&uuml;r die Konfiguration verwendet werden soll.<br/>
<br/>
<b>Das war es schon.</b> Alle Befehle (save, rereadcfg etc) arbeiten wie gewohnt.
</ul>
<br/>
<b>oder:</b><br/>
<br/>
<b>&uuml;bertragen einer bestehenden fhem Konfiguration in die Datenbank</b><br/>
<ul><br/>
Auch sehr einfach... <br/>
<br/>
<li>fhem wird zum letzten Mal mit der fhem.cfg gestartet<br/><br/>
<ul><code>perl fhem.pl fhem.cfg</code></ul></li><br/>
<br/>
<li>Bestehende Konfiguration in die Datenbank &uuml;bertragen<br/><br/>
<ul><code>configdb migrate</code><br/>
<br/>
in die Befehlszeile der fhem-Oberfl&auml;che eingeben</ul><br/></br>
Nicht die Geduld verlieren! Die Migration eine Weile dauern, speziell bei Mini-Systemen wie<br/>
RaspberryPi or Beaglebone.<br/>
Am Ende der Migration wird eine aktuelle Datenbankstatistik angezeigt.<br/>
Die urspr&uuml;ngliche Konfigurationsdatei wird bei diesem Vorgang nicht angetastet.</li><br/>
<li>fhem beenden.</li><br/>
<li>fhem mit dem Schl&uuml;sselwort configDB starten<br/><br/>
<ul><code>perl fhem.pl configDB</code></ul></li><br/>
<b>configDB</b> ist das Schl&uuml;sselwort, an dem fhem erkennt, <br/>
dass eine Datenbank f&uuml;r die Konfiguration verwendet werden soll.<br/>
<br/>
<b>Das war es schon.</b> Alle Befehle (save, rereadcfg etc) arbeiten wie gewohnt.
</ul>
<br/><br/>
<b>Zus&auml;tzliche Funktionen</b><br/>
<ul><br/>
Es wird ein neuer Befehl <code>configdb</code> bereitgestellt,<br/>
der mit verschiedenen Parametern aufgerufen werden kann.<br/>
<br/>
<li><code>configdb attr [attribute] [value]</code></li><br/>
Hiermit lassen sich attribute setzen, die das Verhalten von Front- und Backend beeinflussen.<br/>
<br/>
<code> configdb attr private 1</code> - setzt das Attribut 'private' auf den Wert 1.<br/>
<br/>
<code> configdb attr private</code> - l&ouml;scht das Attribut 'private'<br/>
<br/>
<code> configdb attr</code> - zeigt alle gespeicherten Attribute<br/>
<br/>
Im Moment ist nur ein Attribut definiert. Wenn 'private' auf 1 gesetzt wird, werden bei 'configdb info' <br/>
keine Benutzer- und Passwortdaten angezeigt.<br/>
<br/>
<br/>
<li><code>configdb diff &lt;device&gt; &lt;version&gt;</code></li><br/>
Vergleicht die Konfigurationsdaten des Ger&auml;tes &lt;device&gt; aus der aktuellen Version 0 mit den Daten aus Version &lt;version&gt;<br/>
Beispielaufruf:<br/>
<br/>
<code>configdb diff telnetPort 1</code><br/>
<br/>
liefert ein Ergebnis &auml;hnlich dieser Ausgabe:
<pre>
compare device: telnetPort in current version 0 (left) to version: 1 (right)
+--+--------------------------------------+--+--------------------------------------+
| 1|define telnetPort telnet 7072 global | 1|define telnetPort telnet 7072 global |
* 2|attr telnetPort room telnet * | |
+--+--------------------------------------+--+--------------------------------------+</pre>
<li><code>configdb filedelete &lt;Dateiname&gt;</code></li><br/>
L&ouml;scht eine gespeicherte Datei aus der Datenbank.<br/>
<br/>
<br/>
<li><code>configdb fileexport &lt;zielDatei&gt;</code></li><br/>
Schreibt die angegebene Datei aus der Datenbank in das Dateisystem.
Beispiel:<br/>
<br/>
<code>configdb fileexport FHEM/99_myUtils.pm</code><br/>
<br/>
<br/>
<li><code>configdb fileimport &lt;quellDatei&gt;</code></li><br/>
Liest die angegbene Textdatei aus dem Dateisystem und schreibt den Inhalt in die Datenbank.<br/>
Beispiel:<br/>
<br/>
<code>configdb fileimport FHEM/99_myUtils.pm</code><br/>
<br/>
<br/>
<li><code>configdb filelist</code></li><br/>
Liefert eine Liste mit allen Namen der gespeicherten Dateien.<br/>
<br/>
<br/>
<li><code>configdb filemove &lt;quellDatei&gt;</code></li><br/>
Liest die angegbene Datei aus dem Dateisystem und schreibt den Inhalt in die Datenbank.<br/>
Anschliessend wird die Datei aus dem lokalen Dateisystem gel&ouml;scht.<br/>
Beispiel:<br/>
<br/>
<code>configdb filemove FHEM/99_myUtils.pm</code><br/>
<br/>
<br/>
<li><code>configdb fileshow &lt;Dateiname&gt;</code></li><br/>
Zeigt den Inhalt einer in der Datenbank gespeichert Datei an.<br/>
<br/>
<br/>
<li><code>configdb info</code></li><br/>
Liefert eine Datenbankstatistik<br/>
<pre>
--------------------------------------------------------------------------------
configDB Database Information
--------------------------------------------------------------------------------
dbconn: SQLite:dbname=/opt/fhem/configDB.db
dbuser:
dbpass:
dbtype: SQLITE
--------------------------------------------------------------------------------
fhemconfig: 7707 entries
Ver 0 saved: Sat Mar 1 11:37:00 2014 def: 293 attr: 1248
Ver 1 saved: Fri Feb 28 23:55:13 2014 def: 293 attr: 1248
Ver 2 saved: Fri Feb 28 23:49:01 2014 def: 293 attr: 1248
Ver 3 saved: Fri Feb 28 22:24:40 2014 def: 293 attr: 1247
Ver 4 saved: Fri Feb 28 22:14:03 2014 def: 293 attr: 1246
--------------------------------------------------------------------------------
fhemstate: 1890 entries saved: Sat Mar 1 12:05:00 2014
--------------------------------------------------------------------------------
</pre>
Ver 0 bezeichnet immer die aktuell verwendete Konfiguration.<br/>
<br/>
<li><code>configdb list [device] [version]</code></li><br/>
Sucht das Ger&auml;t [device] in der Konfiguration der Version [version]<br/>
in der Datenbank.<br/>
Standardwert f&uuml;r [device] = % um alle Ger&auml;te anzuzeigen<br/>
Standardwert f&uuml;r [version] = 0 um Ger&auml;te in der aktuellen Version anzuzeigen.<br/>
Beispiele f&uuml;r g&uuml;ltige Aufrufe:<br/>
<br/>
<code>configdb list</code><br/>
<code>configdb list global</code><br/>
<code>configdb list '' 1</code><br/>
<code>configdb list global 1</code><br/>
<br/>
<li><code>configdb recover &lt;version&gt;</code></li><br/>
Stellt eine &auml;ltere Version aus dem Datenbankarchiv wieder her.<br/>
<code>configdb recover 3</code> <b>kopiert</b> die Version #3 aus der Datenbank
zur Version #0.<br/>
Die urspr&uuml;ngliche Version #0 wird dabei gel&ouml;scht.<br/><br/>
<b>Wichtig!</b><br/>
Die zur&uuml;ckgeholte Version wird <b>NICHT</b> automatisch aktiviert!<br/>
Ein <code>rereadcfg</code> oder - besser - <code>shutdown restart</code> muss manuell erfolgen.<br/>
<br/>
<br/>
<li><code>configdb reorg [keep]</code></li><br/>
L&ouml;scht alle gespeicherten Konfigurationen mit Versionsnummern gr&ouml;&szlig;er als [keep].<br/>
Standardwert f&uuml;r den optionalen Parameter keep = 3.<br/>
Mit dieser Funktion l&auml;&szlig;t sich eine n&auml;chtliche Reorganisation per at umsetzen.<br/>
<br/>
<li><code>configdb search <suchBegriff> [inVersion]</code></li><br/>
Sucht nach dem Suchbegriff in der angegeben Konfigurationsversion (default=0)<br/>
<pre>
Beispiel:
configdb search %2286BC%
Ergebnis:
search result for: %2286BC% in version: 0
--------------------------------------------------------------------------------
define az_RT CUL_HM 2286BC
define az_RT_Clima CUL_HM 2286BC04
define az_RT_Climate CUL_HM 2286BC02
define az_RT_ClimaTeam CUL_HM 2286BC05
define az_RT_remote CUL_HM 2286BC06
define az_RT_Weather CUL_HM 2286BC01
define az_RT_WindowRec CUL_HM 2286BC03
attr Melder_FAl peerIDs 00000000,2286BC03,
attr Melder_FAr peerIDs 00000000,2286BC03,
</pre>
<br/>
<li><code>configdb uuid</code></li><br/>
Liefert eine uuid, die man f&uuml;r eigene Zwecke verwenden kann.<br/>
<br/>
<b>Hinweise</b><br/>
<br/>
<ul>
<li>Im Verzeichnis contrib/configDB befinden sich zwei Vorlagen f&uuml;r Datenbank und Konfiguration,<br/>
die durch einfaches Kopieren in das fhem Verzeichnis sofort verwendet werden k&ouml;nnen (Nur f&uuml;r sqlite!).</li>
<br/>
<li>Der Men&uuml;punkt "Edit files"-&gt;"config file" wird bei Verwendung von configDB nicht mehr angezeigt.</li>
<br/>
<li>Beim Speichern einer Konfiguration nicht ungeduldig werden (egal ob manuell oder durch Klicken auf "save config")<br/>
Durch das Schreiben der Versionsinformationen dauert das ein paar Sekunden.<br/>
Der Abschluss des Speichern wird durch eine entsprechende Meldung angezeigt.</li>
<br/>
<li>Diese Erweiterung wird laufend weiterentwickelt. Speziell an der Verbesserung der Performance wird gearbeitet.</li>
<br/>
<li>Viel Spass!</li>
</ul>
</ul>
</ul>
=end html_DE
=cut =cut

View File

@ -93,11 +93,16 @@
# #
# 2015-01-15 - changed remove 99_Utils.pm from filelist # 2015-01-15 - changed remove 99_Utils.pm from filelist
# #
# 2015-01-17 - added configdb diff all current
# shows diff table between version 0
# and currently running version (in memory)
#
############################################################################## ##############################################################################
# #
use strict; use strict;
use warnings; use warnings;
use Text::Diff;
use DBI; use DBI;
################################################## ##################################################
@ -119,14 +124,15 @@ sub cfgDB_FileWrite($@);
sub cfgDB_FW_fileList($$@); sub cfgDB_FW_fileList($$@);
sub cfgDB_Read99(); sub cfgDB_Read99();
sub cfgDB_ReadAll($); sub cfgDB_ReadAll($);
sub cfgDB_SaveCfg(); sub cfgDB_SaveCfg(;$);
sub cfgDB_SaveState(); sub cfgDB_SaveState();
sub cfgDB_svnId(); sub cfgDB_svnId();
sub _cfgDB_binFileimport($$;$); sub _cfgDB_binFileimport($$;$);
sub _cfgDB_Connect(); sub _cfgDB_Connect();
sub _cfgDB_DeleteTemp();
sub _cfgDB_Diff($$); sub _cfgDB_Diff($$);
sub __cfgDB_Diff($$$); sub __cfgDB_Diff($$$$);
sub _cfgDB_InsertLine($$$$); sub _cfgDB_InsertLine($$$$);
sub _cfgDB_Execute($@); sub _cfgDB_Execute($@);
sub _cfgDB_Filedelete($); sub _cfgDB_Filedelete($);
@ -139,7 +145,7 @@ sub _cfgDB_ReadCfg(@);
sub _cfgDB_ReadState(@); sub _cfgDB_ReadState(@);
sub _cfgDB_Recover($); sub _cfgDB_Recover($);
sub _cfgDB_Reorg(;$$); sub _cfgDB_Reorg(;$$);
sub _cfgDB_Rotate($); sub _cfgDB_Rotate($$);
sub _cfgDB_Search($$;$); sub _cfgDB_Search($$;$);
sub _cfgDB_Uuid(); sub _cfgDB_Uuid();
@ -338,7 +344,11 @@ sub cfgDB_ReadAll($) {
} }
# save running configuration to version 0 # save running configuration to version 0
sub cfgDB_SaveCfg() { sub cfgDB_SaveCfg(;$) {
my ($internal) = shift;
$internal = defined($internal) ? $internal : 0;
my (%devByNr, @rowList, %comments, $t, $out); my (%devByNr, @rowList, %comments, $t, $out);
map { $devByNr{$defs{$_}{NR}} = $_ } keys %defs; map { $devByNr{$defs{$_}{NR}} = $_ } keys %defs;
@ -384,14 +394,6 @@ sub cfgDB_SaveCfg() {
push @rowList, "attr $d $a $val"; push @rowList, "attr $d $a $val";
} }
# foreach my $a (sort keys %{$attr{$d}}) {
# next if($d eq "global" &&
# ($a eq "configfile" || $a eq "version"));
# my $val = $attr{$d}{$a};
# $val =~ s/;/;;/g;
# push @rowList, "attr $d $a $val";
# }
} }
foreach my $a (sort keys %{$attr{configdb}}) { foreach my $a (sort keys %{$attr{configdb}}) {
@ -402,7 +404,7 @@ sub cfgDB_SaveCfg() {
# Insert @rowList into database table # Insert @rowList into database table
my $fhem_dbh = _cfgDB_Connect; my $fhem_dbh = _cfgDB_Connect;
my $uuid = _cfgDB_Rotate($fhem_dbh); my $uuid = _cfgDB_Rotate($fhem_dbh,$internal);
$t = localtime; $t = localtime;
$out = "#created $t"; $out = "#created $t";
push @rowList, $out; push @rowList, $out;
@ -415,7 +417,7 @@ sub cfgDB_SaveCfg() {
$fhem_dbh->disconnect(); $fhem_dbh->disconnect();
my $maxVersions = $attr{configdb}{maxversions}; my $maxVersions = $attr{configdb}{maxversions};
$maxVersions = ($maxVersions) ? $maxVersions : 0; $maxVersions = ($maxVersions) ? $maxVersions : 0;
_cfgDB_Reorg($maxVersions,1) if($maxVersions); _cfgDB_Reorg($maxVersions,1) if($maxVersions && $internal != -1);
return 'configDB saved.'; return 'configDB saved.';
} }
@ -663,11 +665,11 @@ sub _cfgDB_ReadState(@) {
# rotate all versions to versionnum + 1 # rotate all versions to versionnum + 1
# return uuid for new version 0 # return uuid for new version 0
sub _cfgDB_Rotate($) { sub _cfgDB_Rotate($$) {
my ($fhem_dbh) = @_; my ($fhem_dbh,$newversion) = @_;
my $uuid = _cfgDB_Uuid; my $uuid = _cfgDB_Uuid;
$fhem_dbh->do("UPDATE fhemversions SET VERSION = VERSION+1"); $fhem_dbh->do("UPDATE fhemversions SET VERSION = VERSION+1 where VERSION >= 0") if $newversion == 0;
$fhem_dbh->do("INSERT INTO fhemversions values (0, '$uuid')"); $fhem_dbh->do("INSERT INTO fhemversions values ('$newversion', '$uuid')");
return $uuid; return $uuid;
} }
@ -826,12 +828,25 @@ sub _cfgDB_Reorg(;$$) {
my $fhem_dbh = _cfgDB_Connect; my $fhem_dbh = _cfgDB_Connect;
$fhem_dbh->do("delete FROM fhemconfig where versionuuid in (select versionuuid from fhemversions where version > $lastversion)"); $fhem_dbh->do("delete FROM fhemconfig where versionuuid in (select versionuuid from fhemversions where version > $lastversion)");
$fhem_dbh->do("delete from fhemversions where version > $lastversion"); $fhem_dbh->do("delete from fhemversions where version > $lastversion");
$fhem_dbh->do("delete FROM fhemconfig where versionuuid in (select versionuuid from fhemversions where version = -1)");
$fhem_dbh->do("delete from fhemversions where version = -1");
$fhem_dbh->commit(); $fhem_dbh->commit();
$fhem_dbh->disconnect(); $fhem_dbh->disconnect();
return if(defined($quiet)); return if(defined($quiet));
return " Result after database reorg:\n"._cfgDB_Info; return " Result after database reorg:\n"._cfgDB_Info;
} }
# delete temporary version
sub _cfgDB_DeleteTemp() {
Log3('configDB', 4, "configDB: delete temporary Version -1");
my $fhem_dbh = _cfgDB_Connect;
$fhem_dbh->do("delete FROM fhemconfig where versionuuid in (select versionuuid from fhemversions where version = -1)");
$fhem_dbh->do("delete from fhemversions where version = -1");
$fhem_dbh->commit();
$fhem_dbh->disconnect();
return;
}
# search for device or fulltext in db # search for device or fulltext in db
sub _cfgDB_Search($$;$) { sub _cfgDB_Search($$;$) {
my ($search,$searchversion,$dsearch) = @_; my ($search,$searchversion,$dsearch) = @_;
@ -858,11 +873,16 @@ sub _cfgDB_Search($$;$) {
} }
# called from cfgDB_Diff # called from cfgDB_Diff
sub __cfgDB_Diff($$$) { sub __cfgDB_Diff($$$$) {
my ($fhem_dbh,$search,$searchversion) = @_; my ($fhem_dbh,$search,$searchversion,$svinternal) = @_;
my ($sql, $sth, @line, $ret); my ($sql, $sth, @line, $ret);
if($svinternal != -1) {
$sql = "SELECT command, device, p1, p2 FROM fhemconfig as c join fhemversions as v ON v.versionuuid=c.versionuuid ". $sql = "SELECT command, device, p1, p2 FROM fhemconfig as c join fhemversions as v ON v.versionuuid=c.versionuuid ".
"WHERE v.version = '$searchversion' AND device = '$search' ORDER BY command DESC"; "WHERE v.version = '$searchversion' AND device = '$search' ORDER BY command DESC";
} else {
$sql = "SELECT command, device, p1, p2 FROM fhemconfig as c join fhemversions as v ON v.versionuuid=c.versionuuid ".
"WHERE v.version = '$searchversion' ORDER BY command DESC";
}
$sth = $fhem_dbh->prepare( $sql); $sth = $fhem_dbh->prepare( $sql);
$sth->execute(); $sth->execute();
while (@line = $sth->fetchrow_array()) { while (@line = $sth->fetchrow_array()) {
@ -874,13 +894,23 @@ sub __cfgDB_Diff($$$) {
# compare device configurations from 2 versions # compare device configurations from 2 versions
sub _cfgDB_Diff($$) { sub _cfgDB_Diff($$) {
my ($search,$searchversion) = @_; my ($search,$searchversion) = @_;
use Text::Diff;
my ($ret, $v0, $v1); my ($ret, $v0, $v1);
if ($search eq 'all' && $searchversion eq 'current') {
_cfgDB_DeleteTemp();
cfgDB_SaveCfg(-1);
$searchversion = -1;
}
my $fhem_dbh = _cfgDB_Connect; my $fhem_dbh = _cfgDB_Connect;
$v0 = __cfgDB_Diff($fhem_dbh,$search,0); $v0 = __cfgDB_Diff($fhem_dbh,$search,0,$searchversion);
$v1 = __cfgDB_Diff($fhem_dbh,$search,$searchversion); $v1 = __cfgDB_Diff($fhem_dbh,$search,$searchversion,$searchversion);
$fhem_dbh->disconnect(); $fhem_dbh->disconnect();
$ret = diff \$v0, \$v1, { STYLE => "Table" }; $ret = diff \$v0, \$v1, { STYLE => "Table" };
if($searchversion == -1) {
_cfgDB_DeleteTemp();
$searchversion = "UNSAVED";
}
$ret = "\nNo differences found!" if !$ret; $ret = "\nNo differences found!" if !$ret;
$ret = "compare device: $search in current version 0 (left) to version: $searchversion (right)\n$ret\n"; $ret = "compare device: $search in current version 0 (left) to version: $searchversion (right)\n$ret\n";
return $ret; return $ret;