2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 06:39:11 +00:00

93_DBLog: attributes colEvent, colReading, colValue now also valid for SQLite DB

git-svn-id: https://svn.fhem.de/fhem/trunk@13373 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2017-02-09 17:44:34 +00:00
parent eb4576fb81
commit 93e30193cb
2 changed files with 75 additions and 31 deletions

View File

@ -1,5 +1,7 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it. # Do not insert empty lines here, update check depends on it.
- feature: 93_DBLog: attributes colEvent, colReading, colValue now also
valid for SQLite DB
- update: 98_DOIFtools: two more checks in checkDOIF - update: 98_DOIFtools: two more checks in checkDOIF
output language depends now on global attribute language output language depends now on global attribute language
recommedation in checkDOIF is now in german language available recommedation in checkDOIF is now in german language available

View File

@ -13,6 +13,10 @@
################################################################################################################################ ################################################################################################################################
# Versions History done by DS_Starter: # Versions History done by DS_Starter:
# #
# 2.11.4 03.02.2017 check of missing modules added
# 2.11.3 01.02.2017 make errorlogging of DbLog_PushAsync more identical to DbLog_Push
# 2.11.2 31.01.2017 if attr colEvent, colReading, colValue is set, the limitation of fieldlength is also valid
# for SQLite databases
# 2.11.1 30.01.2017 output to central logfile enhanced for DbLog_Push # 2.11.1 30.01.2017 output to central logfile enhanced for DbLog_Push
# 2.11 28.01.2017 DbLog_connect substituted by DbLog_connectPush completely # 2.11 28.01.2017 DbLog_connect substituted by DbLog_connectPush completely
# 2.10.8 27.01.2017 setinternalcols delayed at fhem start # 2.10.8 27.01.2017 setinternalcols delayed at fhem start
@ -73,12 +77,12 @@
package main; package main;
use strict; use strict;
use warnings; use warnings;
use DBI; eval "use DBI;1" or my $DbLogMMDBI = "DBI";
use Data::Dumper; use Data::Dumper;
use Blocking; use Blocking;
use Time::HiRes qw(gettimeofday tv_interval); use Time::HiRes qw(gettimeofday tv_interval);
my $DbLogVersion = "2.11.1"; my $DbLogVersion = "2.11.4";
my %columns = ("DEVICE" => 64, my %columns = ("DEVICE" => 64,
"TYPE" => 64, "TYPE" => 64,
@ -149,6 +153,9 @@ sub DbLog_Define($@)
{ {
my ($hash, $def) = @_; my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def); my @a = split("[ \t][ \t]*", $def);
return "Error: Perl module ".$DbLogMMDBI." is missing.
Install it on Debian with: sudo apt-get install libdbi-perl" if($DbLogMMDBI);
return "wrong syntax: define <name> DbLog configuration regexp" return "wrong syntax: define <name> DbLog configuration regexp"
if(int(@a) != 4); if(int(@a) != 4);
@ -873,8 +880,11 @@ sub DbLog_Log($$) {
if ($DoIt) { if ($DoIt) {
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME} = $now; $defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME} = $now;
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE} = $value; $defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE} = $value;
if ($hash->{DBMODEL} ne 'SQLITE') { my $colevent = AttrVal($name, 'colEvent', undef);
my $colreading = AttrVal($name, 'colReading', undef);
my $colvalue = AttrVal($name, 'colValue', undef);
if ($hash->{DBMODEL} ne 'SQLITE' || defined($colevent) || defined($colreading) || defined($colvalue) ) {
# Daten auf maximale Länge beschneiden # Daten auf maximale Länge beschneiden
$dev_name = substr($dev_name,0, $hash->{HELPER}{DEVICECOL}); $dev_name = substr($dev_name,0, $hash->{HELPER}{DEVICECOL});
$dev_type = substr($dev_type,0, $hash->{HELPER}{TYPECOL}); $dev_type = substr($dev_type,0, $hash->{HELPER}{TYPECOL});
@ -991,7 +1001,10 @@ sub DbLog_Push(@) {
if (lc($DbLogType) =~ m(history)) { if (lc($DbLogType) =~ m(history)) {
# for insert history # for insert history
$sth_ih = $dbh->prepare("INSERT INTO history (TIMESTAMP, DEVICE, TYPE, EVENT, READING, VALUE, UNIT) VALUES (?,?,?,?,?,?,?)"); eval { $sth_ih = $dbh->prepare("INSERT INTO history (TIMESTAMP, DEVICE, TYPE, EVENT, READING, VALUE, UNIT) VALUES (?,?,?,?,?,?,?)"); };
if ($@) {
return $@;
}
$sth_ih->bind_param_array(1, [@timestamp]); $sth_ih->bind_param_array(1, [@timestamp]);
$sth_ih->bind_param_array(2, [@device]); $sth_ih->bind_param_array(2, [@device]);
$sth_ih->bind_param_array(3, [@type]); $sth_ih->bind_param_array(3, [@type]);
@ -1003,8 +1016,10 @@ sub DbLog_Push(@) {
if (lc($DbLogType) =~ m(current) ) { if (lc($DbLogType) =~ m(current) ) {
# for insert current # for insert current
$sth_ic = $dbh->prepare("INSERT INTO current (TIMESTAMP, DEVICE, TYPE, EVENT, READING, VALUE, UNIT) VALUES (?,?,?,?,?,?,?)"); eval { $sth_ic = $dbh->prepare("INSERT INTO current (TIMESTAMP, DEVICE, TYPE, EVENT, READING, VALUE, UNIT) VALUES (?,?,?,?,?,?,?)"); };
if ($@) {
return $@;
}
# for update current # for update current
$sth_uc = $dbh->prepare("UPDATE current SET TIMESTAMP=?, TYPE=?, EVENT=?, VALUE=?, UNIT=? WHERE (DEVICE=?) AND (READING=?)"); $sth_uc = $dbh->prepare("UPDATE current SET TIMESTAMP=?, TYPE=?, EVENT=?, VALUE=?, UNIT=? WHERE (DEVICE=?) AND (READING=?)");
$sth_uc->bind_param_array(1, [@timestamp]); $sth_uc->bind_param_array(1, [@timestamp]);
@ -1316,6 +1331,9 @@ sub DbLog_PushAsync(@) {
my $st = [gettimeofday]; my $st = [gettimeofday];
eval {$dbh->begin_work();}; # issue: begin_work failed: Turning off AutoCommit failed eval {$dbh->begin_work();}; # issue: begin_work failed: Turning off AutoCommit failed
if ($@) {
Log3($name, 2, "DbLog $name -> DBLog_PushAsync - $@");
}
my ($tuples, $rows); my ($tuples, $rows);
eval { eval {
# insert into history # insert into history
@ -1388,13 +1406,19 @@ sub DbLog_PushAsync(@) {
if ($@) { if ($@) {
Log3 $hash->{NAME}, 2, "DbLog $name -> Error: $@"; Log3 $hash->{NAME}, 2, "DbLog $name -> Error: $@";
$dbh->rollback() if(!$dbh->{AutoCommit});
$error = $@; $error = $@;
eval {$dbh->rollback() if(!$dbh->{AutoCommit});}; # issue Turning on AutoCommit failed
if ($@) {
Log3($name, 2, "DbLog $name -> DBLog_Push - $@");
}
$dbh->disconnect(); $dbh->disconnect();
$rowlback = $rowlist; $rowlback = $rowlist;
} }
else { else {
$dbh->commit() if(!$dbh->{AutoCommit}); eval {$dbh->commit() if(!$dbh->{AutoCommit});}; # issue Turning on AutoCommit failed
if ($@) {
Log3($name, 2, "DbLog $name -> DBLog_Push - $@");
}
$dbh->disconnect(); $dbh->disconnect();
} }
# SQL-Laufzeit ermitteln # SQL-Laufzeit ermitteln
@ -1595,8 +1619,6 @@ sub DbLog_ConnectPush($) {
$dbhp->do("PRAGMA synchronous=NORMAL"); $dbhp->do("PRAGMA synchronous=NORMAL");
$dbhp->do("PRAGMA journal_mode=WAL"); $dbhp->do("PRAGMA journal_mode=WAL");
$dbhp->do("PRAGMA cache_size=4000"); $dbhp->do("PRAGMA cache_size=4000");
$dbhp->do("CREATE TABLE IF NOT EXISTS history (TIMESTAMP TIMESTAMP, DEVICE varchar(64), TYPE varchar(64), EVENT varchar(512), READING varchar(64), VALUE varchar(128), UNIT varchar(32))");
$dbhp->do("CREATE INDEX IF NOT EXISTS Search_Idx ON `history` (DEVICE, READING, TIMESTAMP)");
} }
return 1; return 1;
@ -1632,18 +1654,6 @@ sub DbLog_ConnectNewDBH($) {
# param2: pointer : DBFilehandle # param2: pointer : DBFilehandle
# param3: string : SQL # param3: string : SQL
################################################################ ################################################################
sub DbLog_ExecSQL1($$$)
{
my ($hash,$dbh,$sql)= @_;
my $sth = $dbh->do($sql);
if(!$sth) {
Log3 $hash->{NAME}, 2, "DBLog error: " . $DBI::errstr;
return 0;
}
return $sth;
}
sub DbLog_ExecSQL($$) sub DbLog_ExecSQL($$)
{ {
my ($hash,$sql)= @_; my ($hash,$sql)= @_;
@ -1666,6 +1676,18 @@ sub DbLog_ExecSQL($$)
return $sth; return $sth;
} }
sub DbLog_ExecSQL1($$$)
{
my ($hash,$dbh,$sql)= @_;
my $sth = $dbh->do($sql);
if(!$sth) {
Log3 $hash->{NAME}, 2, "DBLog error: " . $DBI::errstr;
return 0;
}
return $sth;
}
################################################################ ################################################################
# #
# GET Funktion # GET Funktion
@ -3210,7 +3232,10 @@ return;
</code><br> </code><br>
The field length of database field EVENT will be adjusted. By this attribute the default value in the DbLog-device can be The field length of database field EVENT will be adjusted. By this attribute the default value in the DbLog-device can be
adjusted if the field length in the databse was changed nanually. <br> adjusted if the field length in the databse was changed nanually. If colEvent=0 is set, the database field
EVENT won't be filled . <br>
<b>Note:</b> <br>
If the attribute is set, all of the field length limits are valid also for SQLite databases as noticed in Internal COLUMNS ! <br>
</ul> </ul>
</ul> </ul>
<br> <br>
@ -3222,7 +3247,10 @@ return;
</code><br> </code><br>
The field length of database field READING will be adjusted. By this attribute the default value in the DbLog-device can be The field length of database field READING will be adjusted. By this attribute the default value in the DbLog-device can be
adjusted if the field length in the databse was changed nanually. <br> adjusted if the field length in the databse was changed nanually. If colReading=0 is set, the database field
READING won't be filled . <br>
<b>Note:</b> <br>
If the attribute is set, all of the field length limits are valid also for SQLite databases as noticed in Internal COLUMNS ! <br>
</ul> </ul>
</ul> </ul>
<br> <br>
@ -3234,7 +3262,10 @@ return;
</code><br> </code><br>
The field length of database field VALUE will be adjusted. By this attribute the default value in the DbLog-device can be The field length of database field VALUE will be adjusted. By this attribute the default value in the DbLog-device can be
adjusted if the field length in the databse was changed nanually. <br> adjusted if the field length in the databse was changed nanually. If colEvent=0 is set, the database field
VALUE won't be filled . <br>
<b>Note:</b> <br>
If the attribute is set, all of the field length limits are valid also for SQLite databases as noticed in Internal COLUMNS ! <br>
</ul> </ul>
</ul> </ul>
<br> <br>
@ -3247,7 +3278,8 @@ return;
This attribute determines which table or which tables in the database are wanted to use. If the attribute isn't set, This attribute determines which table or which tables in the database are wanted to use. If the attribute isn't set,
the table <i>history</i> will be used as default. <br> the table <i>history</i> will be used as default. <br>
<b>NOTE:</b> The current-table has to be used to get a Device:Reading-DropDown list when a SVG-Plot will be created. <br> <b>Note:</b> <br>
The current-table has to be used to get a Device:Reading-DropDown list when a SVG-Plot will be created. <br>
</ul> </ul>
</ul> </ul>
<br> <br>
@ -3826,7 +3858,10 @@ return;
</code><br> </code><br>
Die Feldlänge für das DB-Feld EVENT wird userspezifisch angepasst. Mit dem Attribut kann der Default-Wert im Modul Die Feldlänge für das DB-Feld EVENT wird userspezifisch angepasst. Mit dem Attribut kann der Default-Wert im Modul
verändert werden wenn die Feldlänge in der Datenbank manuell geändert wurde. <br> verändert werden wenn die Feldlänge in der Datenbank manuell geändert wurde. Mit colEvent=0 wird das Datenbankfeld
EVENT nicht gefüllt. <br>
<b>Hinweis:</b> <br>
Mit gesetztem Attribut gelten alle Feldlängenbegrenzungen auch für SQLite DB wie im Internal COLUMNS angezeigt ! <br>
</ul> </ul>
</ul> </ul>
<br> <br>
@ -3838,7 +3873,10 @@ return;
</code><br> </code><br>
Die Feldlänge für das DB-Feld READING wird userspezifisch angepasst. Mit dem Attribut kann der Default-Wert im Modul Die Feldlänge für das DB-Feld READING wird userspezifisch angepasst. Mit dem Attribut kann der Default-Wert im Modul
verändert werden wenn die Feldlänge in der Datenbank manuell geändert wurde. <br> verändert werden wenn die Feldlänge in der Datenbank manuell geändert wurde. Mit colReading=0 wird das Datenbankfeld
READING nicht gefüllt. <br>
<b>Hinweis:</b> <br>
Mit gesetztem Attribut gelten alle Feldlängenbegrenzungen auch für SQLite DB wie im Internal COLUMNS angezeigt ! <br>
</ul> </ul>
</ul> </ul>
<br> <br>
@ -3850,7 +3888,10 @@ return;
</code><br> </code><br>
Die Feldlänge für das DB-Feld VALUE wird userspezifisch angepasst. Mit dem Attribut kann der Default-Wert im Modul Die Feldlänge für das DB-Feld VALUE wird userspezifisch angepasst. Mit dem Attribut kann der Default-Wert im Modul
verändert werden wenn die Feldlänge in der Datenbank manuell geändert wurde. <br> verändert werden wenn die Feldlänge in der Datenbank manuell geändert wurde. Mit colValue=0 wird das Datenbankfeld
VALUE nicht gefüllt. <br>
<b>Hinweis:</b> <br>
Mit gesetztem Attribut gelten alle Feldlängenbegrenzungen auch für SQLite DB wie im Internal COLUMNS angezeigt ! <br>
</ul> </ul>
</ul> </ul>
<br> <br>
@ -3863,7 +3904,8 @@ return;
Dieses Attribut legt fest, welche Tabelle oder Tabellen in der Datenbank genutzt werden sollen. Ist dieses Attribut nicht gesetzt, wird Dieses Attribut legt fest, welche Tabelle oder Tabellen in der Datenbank genutzt werden sollen. Ist dieses Attribut nicht gesetzt, wird
per default die Tabelle <i>history</i> verwendet. <br> per default die Tabelle <i>history</i> verwendet. <br>
<b>HINWEIS:</b> Die Current-Tabelle muß genutzt werden um eine Device:Reading-DropDownliste zur Erstellung eines <b>Hinweis:</b> <br>
Die Current-Tabelle muß genutzt werden um eine Device:Reading-DropDownliste zur Erstellung eines
SVG-Plots zu erhalten. <br> SVG-Plots zu erhalten. <br>
</ul> </ul>
</ul> </ul>