mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-01-31 12:49:34 +00:00
configDB: #32296
git-svn-id: https://svn.fhem.de/fhem/trunk@7605 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
d4a9077a24
commit
981f4fbfd6
@ -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 |
|
||||
* 2|attr telnetPort room telnet * | |
|
||||
+--+--------------------------------------+--+--------------------------------------+</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 <Filename></code></li><br/>
|
||||
Delete file from database.<br/>
|
||||
@ -524,319 +529,4 @@ attr Melder_FAr peerIDs 00000000,2286BC03,
|
||||
|
||||
=end html
|
||||
|
||||
=begin html_DE
|
||||
|
||||
<a name="configdb"></a>
|
||||
<h3>configdb</h3>
|
||||
<ul>
|
||||
Seit version 5079 unterstü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öglichkeit,
|
||||
jederzeit eine ältere Version wiederherstellen zu können.<br/>
|
||||
Der Zugriff auf die Datenbank erfolgt ü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 ü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ügbar sein, untsrstützt werden SQLITE, MYSQL und POSTGRESQLL.</li><br/>
|
||||
<li>Das zum Datenbanktype gehörende DBD Modul muss in perl installiert sein,<br/>
|
||||
fü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ötigten Datenbanktabellen werden automatisch angelegt.</li><br/>
|
||||
<li>Eine Konfigurationsdatei fü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ür MySQL
|
||||
################################################################
|
||||
#%dbconfig= (
|
||||
# connection => "mysql:database=configDB;host=db;port=3306",
|
||||
# user => "fhemuser",
|
||||
# password => "fhempassword",
|
||||
#);
|
||||
################################################################
|
||||
#
|
||||
## für PostgreSQL
|
||||
################################################################
|
||||
#%dbconfig= (
|
||||
# connection => "Pg:database=configDB;host=localhost",
|
||||
# user => "fhemuser",
|
||||
# password => "fhempassword"
|
||||
#);
|
||||
################################################################
|
||||
#
|
||||
## fü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ä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üsselwort, an dem fhem erkennt, <br/>
|
||||
dass eine Datenbank fü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>ü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 übertragen<br/><br/>
|
||||
<ul><code>configdb migrate</code><br/>
|
||||
<br/>
|
||||
in die Befehlszeile der fhem-Oberflä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üngliche Konfigurationsdatei wird bei diesem Vorgang nicht angetastet.</li><br/>
|
||||
<li>fhem beenden.</li><br/>
|
||||
<li>fhem mit dem Schlüsselwort configDB starten<br/><br/>
|
||||
<ul><code>perl fhem.pl configDB</code></ul></li><br/>
|
||||
<b>configDB</b> ist das Schlüsselwort, an dem fhem erkennt, <br/>
|
||||
dass eine Datenbank fü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ä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ö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 <device> <version></code></li><br/>
|
||||
Vergleicht die Konfigurationsdaten des Gerätes <device> aus der aktuellen Version 0 mit den Daten aus Version <version><br/>
|
||||
Beispielaufruf:<br/>
|
||||
<br/>
|
||||
<code>configdb diff telnetPort 1</code><br/>
|
||||
<br/>
|
||||
liefert ein Ergebnis ä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 <Dateiname></code></li><br/>
|
||||
Löscht eine gespeicherte Datei aus der Datenbank.<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<li><code>configdb fileexport <zielDatei></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 <quellDatei></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 <quellDatei></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öscht.<br/>
|
||||
Beispiel:<br/>
|
||||
<br/>
|
||||
<code>configdb filemove FHEM/99_myUtils.pm</code><br/>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<li><code>configdb fileshow <Dateiname></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ät [device] in der Konfiguration der Version [version]<br/>
|
||||
in der Datenbank.<br/>
|
||||
Standardwert für [device] = % um alle Geräte anzuzeigen<br/>
|
||||
Standardwert für [version] = 0 um Geräte in der aktuellen Version anzuzeigen.<br/>
|
||||
Beispiele für gü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 <version></code></li><br/>
|
||||
Stellt eine ä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üngliche Version #0 wird dabei gelöscht.<br/><br/>
|
||||
<b>Wichtig!</b><br/>
|
||||
Die zurü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öscht alle gespeicherten Konfigurationen mit Versionsnummern größer als [keep].<br/>
|
||||
Standardwert für den optionalen Parameter keep = 3.<br/>
|
||||
Mit dieser Funktion läßt sich eine nä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ür eigene Zwecke verwenden kann.<br/>
|
||||
<br/>
|
||||
|
||||
<b>Hinweise</b><br/>
|
||||
<br/>
|
||||
<ul>
|
||||
<li>Im Verzeichnis contrib/configDB befinden sich zwei Vorlagen für Datenbank und Konfiguration,<br/>
|
||||
die durch einfaches Kopieren in das fhem Verzeichnis sofort verwendet werden können (Nur für sqlite!).</li>
|
||||
<br/>
|
||||
<li>Der Menüpunkt "Edit files"->"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
|
||||
|
@ -93,11 +93,16 @@
|
||||
#
|
||||
# 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 warnings;
|
||||
use Text::Diff;
|
||||
use DBI;
|
||||
|
||||
##################################################
|
||||
@ -119,14 +124,15 @@ sub cfgDB_FileWrite($@);
|
||||
sub cfgDB_FW_fileList($$@);
|
||||
sub cfgDB_Read99();
|
||||
sub cfgDB_ReadAll($);
|
||||
sub cfgDB_SaveCfg();
|
||||
sub cfgDB_SaveCfg(;$);
|
||||
sub cfgDB_SaveState();
|
||||
sub cfgDB_svnId();
|
||||
|
||||
sub _cfgDB_binFileimport($$;$);
|
||||
sub _cfgDB_Connect();
|
||||
sub _cfgDB_DeleteTemp();
|
||||
sub _cfgDB_Diff($$);
|
||||
sub __cfgDB_Diff($$$);
|
||||
sub __cfgDB_Diff($$$$);
|
||||
sub _cfgDB_InsertLine($$$$);
|
||||
sub _cfgDB_Execute($@);
|
||||
sub _cfgDB_Filedelete($);
|
||||
@ -139,7 +145,7 @@ sub _cfgDB_ReadCfg(@);
|
||||
sub _cfgDB_ReadState(@);
|
||||
sub _cfgDB_Recover($);
|
||||
sub _cfgDB_Reorg(;$$);
|
||||
sub _cfgDB_Rotate($);
|
||||
sub _cfgDB_Rotate($$);
|
||||
sub _cfgDB_Search($$;$);
|
||||
sub _cfgDB_Uuid();
|
||||
|
||||
@ -338,7 +344,11 @@ sub cfgDB_ReadAll($) {
|
||||
}
|
||||
|
||||
# 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);
|
||||
|
||||
map { $devByNr{$defs{$_}{NR}} = $_ } keys %defs;
|
||||
@ -384,14 +394,6 @@ sub cfgDB_SaveCfg() {
|
||||
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}}) {
|
||||
@ -402,7 +404,7 @@ sub cfgDB_SaveCfg() {
|
||||
|
||||
# Insert @rowList into database table
|
||||
my $fhem_dbh = _cfgDB_Connect;
|
||||
my $uuid = _cfgDB_Rotate($fhem_dbh);
|
||||
my $uuid = _cfgDB_Rotate($fhem_dbh,$internal);
|
||||
$t = localtime;
|
||||
$out = "#created $t";
|
||||
push @rowList, $out;
|
||||
@ -415,7 +417,7 @@ sub cfgDB_SaveCfg() {
|
||||
$fhem_dbh->disconnect();
|
||||
my $maxVersions = $attr{configdb}{maxversions};
|
||||
$maxVersions = ($maxVersions) ? $maxVersions : 0;
|
||||
_cfgDB_Reorg($maxVersions,1) if($maxVersions);
|
||||
_cfgDB_Reorg($maxVersions,1) if($maxVersions && $internal != -1);
|
||||
return 'configDB saved.';
|
||||
}
|
||||
|
||||
@ -663,11 +665,11 @@ sub _cfgDB_ReadState(@) {
|
||||
|
||||
# rotate all versions to versionnum + 1
|
||||
# return uuid for new version 0
|
||||
sub _cfgDB_Rotate($) {
|
||||
my ($fhem_dbh) = @_;
|
||||
sub _cfgDB_Rotate($$) {
|
||||
my ($fhem_dbh,$newversion) = @_;
|
||||
my $uuid = _cfgDB_Uuid;
|
||||
$fhem_dbh->do("UPDATE fhemversions SET VERSION = VERSION+1");
|
||||
$fhem_dbh->do("INSERT INTO fhemversions values (0, '$uuid')");
|
||||
$fhem_dbh->do("UPDATE fhemversions SET VERSION = VERSION+1 where VERSION >= 0") if $newversion == 0;
|
||||
$fhem_dbh->do("INSERT INTO fhemversions values ('$newversion', '$uuid')");
|
||||
return $uuid;
|
||||
}
|
||||
|
||||
@ -826,12 +828,25 @@ sub _cfgDB_Reorg(;$$) {
|
||||
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 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->disconnect();
|
||||
return if(defined($quiet));
|
||||
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
|
||||
sub _cfgDB_Search($$;$) {
|
||||
my ($search,$searchversion,$dsearch) = @_;
|
||||
@ -858,11 +873,16 @@ sub _cfgDB_Search($$;$) {
|
||||
}
|
||||
|
||||
# called from cfgDB_Diff
|
||||
sub __cfgDB_Diff($$$) {
|
||||
my ($fhem_dbh,$search,$searchversion) = @_;
|
||||
sub __cfgDB_Diff($$$$) {
|
||||
my ($fhem_dbh,$search,$searchversion,$svinternal) = @_;
|
||||
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 ".
|
||||
"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->execute();
|
||||
while (@line = $sth->fetchrow_array()) {
|
||||
@ -874,13 +894,23 @@ sub __cfgDB_Diff($$$) {
|
||||
# compare device configurations from 2 versions
|
||||
sub _cfgDB_Diff($$) {
|
||||
my ($search,$searchversion) = @_;
|
||||
use Text::Diff;
|
||||
my ($ret, $v0, $v1);
|
||||
|
||||
if ($search eq 'all' && $searchversion eq 'current') {
|
||||
_cfgDB_DeleteTemp();
|
||||
cfgDB_SaveCfg(-1);
|
||||
$searchversion = -1;
|
||||
}
|
||||
|
||||
my $fhem_dbh = _cfgDB_Connect;
|
||||
$v0 = __cfgDB_Diff($fhem_dbh,$search,0);
|
||||
$v1 = __cfgDB_Diff($fhem_dbh,$search,$searchversion);
|
||||
$v0 = __cfgDB_Diff($fhem_dbh,$search,0,$searchversion);
|
||||
$v1 = __cfgDB_Diff($fhem_dbh,$search,$searchversion,$searchversion);
|
||||
$fhem_dbh->disconnect();
|
||||
$ret = diff \$v0, \$v1, { STYLE => "Table" };
|
||||
if($searchversion == -1) {
|
||||
_cfgDB_DeleteTemp();
|
||||
$searchversion = "UNSAVED";
|
||||
}
|
||||
$ret = "\nNo differences found!" if !$ret;
|
||||
$ret = "compare device: $search in current version 0 (left) to version: $searchversion (right)\n$ret\n";
|
||||
return $ret;
|
||||
|
Loading…
Reference in New Issue
Block a user