mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
93_DbRep: bugfix group by-clause due to incompatible changes made in MyQL 5.7.5 (Forum #msg541103)
git-svn-id: https://svn.fhem.de/fhem/trunk@12808 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
2aae85f188
commit
d22859bda0
@ -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.
|
||||||
|
- bugfix: 93_DbRep: bugfix group by-clause due to incompatible changes made
|
||||||
|
in MyQL 5.7.5 (Forum #msg541103)
|
||||||
- feature: 66_ECMD, 67_ECMDDevice:
|
- feature: 66_ECMD, 67_ECMDDevice:
|
||||||
- if split is used, the strings at which the messages are split
|
- if split is used, the strings at which the messages are split
|
||||||
are still part of the messages
|
are still part of the messages
|
||||||
|
@ -40,6 +40,11 @@
|
|||||||
###########################################################################################################
|
###########################################################################################################
|
||||||
# Versions History:
|
# Versions History:
|
||||||
#
|
#
|
||||||
|
# 4.8.6 17.12.2016 new bugfix group by-clause due to incompatible changes made in MyQL 5.7.5
|
||||||
|
# (Forum #msg541103)
|
||||||
|
# 4.8.5 16.12.2016 bugfix group by-clause due to Forum #msg540610
|
||||||
|
# 4.8.4 13.12.2016 added "group by ...,table_schema" to select in dbmeta_DoParse due to Forum #msg539228,
|
||||||
|
# commandref adapted, changed "not_enough_data_in_period" to "less_data_in_period"
|
||||||
# 4.8.3 12.12.2016 balance diff to next period if value of period is 0 between two periods with
|
# 4.8.3 12.12.2016 balance diff to next period if value of period is 0 between two periods with
|
||||||
# values
|
# values
|
||||||
# 4.8.2 10.12.2016 bugfix negativ diff if balanced
|
# 4.8.2 10.12.2016 bugfix negativ diff if balanced
|
||||||
@ -161,7 +166,7 @@ use Blocking;
|
|||||||
use Time::Local;
|
use Time::Local;
|
||||||
# no if $] >= 5.017011, warnings => 'experimental';
|
# no if $] >= 5.017011, warnings => 'experimental';
|
||||||
|
|
||||||
my $DbRepVersion = "4.8.3";
|
my $DbRepVersion = "4.8.6";
|
||||||
|
|
||||||
my %dbrep_col = ("DEVICE" => 64,
|
my %dbrep_col = ("DEVICE" => 64,
|
||||||
"TYPE" => 64,
|
"TYPE" => 64,
|
||||||
@ -549,9 +554,9 @@ sub DbRep_Attr($$$$) {
|
|||||||
if ($aName eq "reading" || $aName eq "device") {
|
if ($aName eq "reading" || $aName eq "device") {
|
||||||
if ($dbmodel && $dbmodel ne 'SQLITE') {
|
if ($dbmodel && $dbmodel ne 'SQLITE') {
|
||||||
if ($dbmodel eq 'POSTGRESQL') {
|
if ($dbmodel eq 'POSTGRESQL') {
|
||||||
return "Length of \"$aName\" is too big. Maximum lenth for database type $dbmodel is $dbrep_col{READING}" if(length($aVal) > $dbrep_col{READING});
|
return "Length of \"$aName\" is too big. Maximum length for database type $dbmodel is $dbrep_col{READING}" if(length($aVal) > $dbrep_col{READING});
|
||||||
} elsif ($dbmodel eq 'MYSQL') {
|
} elsif ($dbmodel eq 'MYSQL') {
|
||||||
return "Length of \"$aName\" is too big. Maximum lenth for database type $dbmodel is $dbrep_col{READING}" if(length($aVal) > $dbrep_col{READING});
|
return "Length of \"$aName\" is too big. Maximum length for database type $dbmodel is $dbrep_col{READING}" if(length($aVal) > $dbrep_col{READING});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2092,7 +2097,7 @@ sub diffval_ParseDone($) {
|
|||||||
readingsBulkUpdate($hash, "background_processing_time", sprintf("%.4f",$brt)) if(AttrVal($name, "showproctime", undef));
|
readingsBulkUpdate($hash, "background_processing_time", sprintf("%.4f",$brt)) if(AttrVal($name, "showproctime", undef));
|
||||||
readingsBulkUpdate($hash, "sql_processing_time", sprintf("%.4f",$rt)) if(AttrVal($name, "showproctime", undef));
|
readingsBulkUpdate($hash, "sql_processing_time", sprintf("%.4f",$rt)) if(AttrVal($name, "showproctime", undef));
|
||||||
readingsBulkUpdate($hash, "diff-overrun_limit-".$difflimit, $rowsrej) if($rowsrej);
|
readingsBulkUpdate($hash, "diff-overrun_limit-".$difflimit, $rowsrej) if($rowsrej);
|
||||||
readingsBulkUpdate($hash, "not_enough_data_in_period", $ncpstr) if($ncpstr);
|
readingsBulkUpdate($hash, "less_data_in_period", $ncpstr) if($ncpstr);
|
||||||
readingsBulkUpdate($hash, "state", ($ncpstr||$rowsrej)?"Warning":"done");
|
readingsBulkUpdate($hash, "state", ($ncpstr||$rowsrej)?"Warning":"done");
|
||||||
readingsEndUpdate($hash, 1);
|
readingsEndUpdate($hash, 1);
|
||||||
|
|
||||||
@ -3164,6 +3169,18 @@ sub dbmeta_DoParse($) {
|
|||||||
my $sth;
|
my $sth;
|
||||||
my $sql;
|
my $sql;
|
||||||
|
|
||||||
|
# due to incompatible changes made in MyQL 5.7.5, see http://johnemb.blogspot.de/2014/09/adding-or-removing-individual-sql-modes.html
|
||||||
|
if($dbmodel eq "MYSQL") {
|
||||||
|
eval {$dbh->do("SET sql_mode=(SELECT REPLACE(\@\@sql_mode,'ONLY_FULL_GROUP_BY',''));");};
|
||||||
|
}
|
||||||
|
if ($@) {
|
||||||
|
$err = encode_base64($@,"");
|
||||||
|
Log3 ($name, 2, "DbRep $name - $@");
|
||||||
|
$dbh->disconnect;
|
||||||
|
Log3 ($name, 4, "DbRep $name -> BlockingCall dbmeta_DoParse finished");
|
||||||
|
return "$name|''|''|''|$err";
|
||||||
|
}
|
||||||
|
|
||||||
if ($opt ne "svrinfo") {
|
if ($opt ne "svrinfo") {
|
||||||
foreach my $ple (@parlist) {
|
foreach my $ple (@parlist) {
|
||||||
if ($opt eq "dbvars") {
|
if ($opt eq "dbvars") {
|
||||||
@ -3181,7 +3198,7 @@ sub dbmeta_DoParse($) {
|
|||||||
engine,
|
engine,
|
||||||
table_type,
|
table_type,
|
||||||
create_time
|
create_time
|
||||||
from information_schema.tables group by table_name;";
|
from information_schema.tables group by 1;";
|
||||||
}
|
}
|
||||||
|
|
||||||
Log3($name, 4, "DbRep $name - SQL execute: $sql");
|
Log3($name, 4, "DbRep $name - SQL execute: $sql");
|
||||||
@ -3207,7 +3224,7 @@ sub dbmeta_DoParse($) {
|
|||||||
$param =~ tr/%//d;
|
$param =~ tr/%//d;
|
||||||
if($line[0] =~ m/($param)/i) {
|
if($line[0] =~ m/($param)/i) {
|
||||||
push(@row_array, $line[0].".table_schema ".$line[1]);
|
push(@row_array, $line[0].".table_schema ".$line[1]);
|
||||||
push(@row_array, $line[0].".data_index_lenth_MB ".$line[2]);
|
push(@row_array, $line[0].".data_index_length_MB ".$line[2]);
|
||||||
push(@row_array, $line[0].".table_name ".$line[1]);
|
push(@row_array, $line[0].".table_name ".$line[1]);
|
||||||
push(@row_array, $line[0].".data_free_MB ".$line[3]);
|
push(@row_array, $line[0].".data_free_MB ".$line[3]);
|
||||||
push(@row_array, $line[0].".row_format ".$line[4]);
|
push(@row_array, $line[0].".row_format ".$line[4]);
|
||||||
@ -3753,7 +3770,7 @@ return;
|
|||||||
# If "Value=0" has to be inserted, use "Value = 0.0" to do it. <br><br>
|
# If "Value=0" has to be inserted, use "Value = 0.0" to do it. <br><br>
|
||||||
|
|
||||||
<b>example:</b> 2016-08-01,23:00:09,TestValue,TestUnit <br>
|
<b>example:</b> 2016-08-01,23:00:09,TestValue,TestUnit <br>
|
||||||
# field lenth is maximum 32 (MYSQL) / 64 (POSTGRESQL) characters long, Spaces are NOT allowed in fieldvalues ! <br>
|
# field length is maximum 32 (MYSQL) / 64 (POSTGRESQL) characters long, Spaces are NOT allowed in fieldvalues ! <br>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<b>Note: </b><br>
|
<b>Note: </b><br>
|
||||||
@ -3792,15 +3809,22 @@ return;
|
|||||||
The reading to evaluate must be defined using attribute "reading".
|
The reading to evaluate must be defined using attribute "reading".
|
||||||
This function is mostly reasonable if readingvalues are increasing permanently and don't write value-differences to the database.
|
This function is mostly reasonable if readingvalues are increasing permanently and don't write value-differences to the database.
|
||||||
The difference will be generated from the first available dataset (VALUE-Field) to the last available dataset between the
|
The difference will be generated from the first available dataset (VALUE-Field) to the last available dataset between the
|
||||||
specified time linits/aggregation.
|
specified time linits/aggregation, in which a balanced difference value of the previous aggregation period will be transfered to the
|
||||||
|
following aggregation period in case this period contains a value. <br>
|
||||||
An possible counter overrun (restart with value "0") will be considered (compare <a href="#DbRepattr">attribute</a> "diffAccept"). <br>
|
An possible counter overrun (restart with value "0") will be considered (compare <a href="#DbRepattr">attribute</a> "diffAccept"). <br>
|
||||||
If only one dataset will be found within the evalution period, no difference can be calculated
|
If only one dataset will be found within the evalution period, the difference can be calculated only in combination with the balanced
|
||||||
and the reading "not_enough_data_in_period" with a list of concerned periods will be generated in that case. <br><br>
|
difference of the previous aggregation period. In this case a logical inaccuracy according the assignment of the difference to the particular aggregation period
|
||||||
|
can be possible. Hence in warning in "state" will be placed and the reading "less_data_in_period" with a list of periods
|
||||||
|
with only one dataset found in it will be created. <br><br>
|
||||||
|
|
||||||
|
|
||||||
|
no difference can be calculated
|
||||||
|
and the reading "less_data_in_period" with a list of concerned periods will be generated in that case. <br><br>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<b>Note: </b><br>
|
<b>Note: </b><br>
|
||||||
Within the evaluation respectively aggregation period (day, week, month, etc.) AT LEAST two datasets per period MUST be
|
Within the evaluation respectively aggregation period (day, week, month, etc.) you should make available at least one dataset
|
||||||
available for calulation. Otherwise no difference can be calculated and diffValue will be print "0" for the respective period !
|
at the beginning and one dataset at the end of each aggregation period to take the difference calculation as much as possible.
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
</li>
|
</li>
|
||||||
@ -4028,14 +4052,14 @@ return;
|
|||||||
|
|
||||||
<ul><ul>
|
<ul><ul>
|
||||||
<li><b>state </b> - contains the current state of evaluation. If warnings are occured (state = Warning) compare Readings
|
<li><b>state </b> - contains the current state of evaluation. If warnings are occured (state = Warning) compare Readings
|
||||||
"diff-overrun_limit-<diffLimit>" and "not_enough_data_in_period" </li> <br>
|
"diff-overrun_limit-<diffLimit>" and "less_data_in_period" </li> <br>
|
||||||
<li><b>errortext </b> - description about the reason of an error state </li> <br>
|
<li><b>errortext </b> - description about the reason of an error state </li> <br>
|
||||||
<li><b>background_processing_time </b> - the processing time spent for operations in background/forked operation </li> <br>
|
<li><b>background_processing_time </b> - the processing time spent for operations in background/forked operation </li> <br>
|
||||||
<li><b>sql_processing_time </b> - the processing time wasted for all sql-statements used for an operation </li> <br>
|
<li><b>sql_processing_time </b> - the processing time wasted for all sql-statements used for an operation </li> <br>
|
||||||
<li><b>diff-overrun_limit-<diffLimit></b> - contains a list of pairs of datasets which have overrun the threshold (<diffLimit>)
|
<li><b>diff-overrun_limit-<diffLimit></b> - contains a list of pairs of datasets which have overrun the threshold (<diffLimit>)
|
||||||
of calculated difference each other determined by attribute "diffAccept" (default=20). </li> <br>
|
of calculated difference each other determined by attribute "diffAccept" (default=20). </li> <br>
|
||||||
<li><b>not_enough_data_in_period</b> - contains a list of time periods within only one dataset was found and therefor no difference calculation
|
<li><b>less_data_in_period</b> - contains a list of time periods within only one dataset was found. The difference calculation considers
|
||||||
could be done. Valid for function "diffValue". </li> <br>
|
the last value of the aggregation period before the current one. Valid for function "diffValue". </li> <br>
|
||||||
</ul></ul>
|
</ul></ul>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
@ -4261,15 +4285,19 @@ return;
|
|||||||
Es muss das auszuwertende Reading im Attribut "reading" angegeben sein.
|
Es muss das auszuwertende Reading im Attribut "reading" angegeben sein.
|
||||||
Diese Funktion ist z.B. zur Auswertung von Eventloggings sinnvoll, deren Werte sich fortlaufend erhöhen und keine Wertdifferenzen wegschreiben. <br>
|
Diese Funktion ist z.B. zur Auswertung von Eventloggings sinnvoll, deren Werte sich fortlaufend erhöhen und keine Wertdifferenzen wegschreiben. <br>
|
||||||
Es wird immer die Differenz aus dem Value-Wert des ersten verfügbaren Datensatzes und dem Value-Wert des letzten verfügbaren Datensatzes innerhalb der angegebenen
|
Es wird immer die Differenz aus dem Value-Wert des ersten verfügbaren Datensatzes und dem Value-Wert des letzten verfügbaren Datensatzes innerhalb der angegebenen
|
||||||
Zeitgrenzen/Aggregation gebildet. <br>
|
Zeitgrenzen/Aggregation gebildet, wobei ein Übertragswert der Vorperiode (Aggregation) zur darauf folgenden Aggregationsperiode
|
||||||
|
berücksichtigt wird sofern diese einen Value-Wert enhtält. <br>
|
||||||
Dabei wird ein Zählerüberlauf (Neubeginn bei 0) mit berücksichtigt (vergleiche <a href="#DbRepattr">Attribut</a> "diffAccept"). <br>
|
Dabei wird ein Zählerüberlauf (Neubeginn bei 0) mit berücksichtigt (vergleiche <a href="#DbRepattr">Attribut</a> "diffAccept"). <br>
|
||||||
Wird in einer auszuwertenden Zeit- bzw. Aggregationsperiode nur ein Datensatz gefunden, kann keine Differenz berechnet werden
|
Wird in einer auszuwertenden Zeit- bzw. Aggregationsperiode nur ein Datensatz gefunden, kann die Differenz in Verbindung mit dem
|
||||||
und das Reading "not_enough_data_in_period" mit einer Liste der betroffenen Perioden wird erzeugt. <br><br>
|
Differenzübertrag der Vorperiode berechnet werden. in diesem Fall kann es zu einer logischen Ungenauigkeit in der Zuordnung der Differenz
|
||||||
|
zu der Aggregationsperiode kommen. Deswegen wird eine Warnung im "state" und das
|
||||||
|
Reading "less_data_in_period" mit einer Liste der betroffenen Perioden wird erzeugt. <br><br>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<b>Hinweis: </b><br>
|
<b>Hinweis: </b><br>
|
||||||
Im Auswertungs- bzw. Aggregationszeitraum (Tag, Woche, Monat, etc.) MÜSSEN dem Modul pro Periode MINDESTENS zwei
|
Im Auswertungs- bzw. Aggregationszeitraum (Tag, Woche, Monat, etc.) sollten dem Modul pro Periode mindestens ein Datensatz
|
||||||
Datensätze zur Verfügung stehen. Ansonsten kann keine Differenz berechnet werden und diffValue ergibt in diesem Fall "0" !
|
zu Beginn und ein Datensatz gegen Ende des Aggregationszeitraumes zur Verfügung stehen um eine möglichst genaue Auswertung
|
||||||
|
der Differenzwerte vornehmen zu können.
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
</li>
|
</li>
|
||||||
@ -4495,14 +4523,14 @@ return;
|
|||||||
|
|
||||||
<ul><ul>
|
<ul><ul>
|
||||||
<li><b>state </b> - enthält den aktuellen Status der Auswertung. Wenn Warnungen auftraten (state = Warning) vergleiche Readings
|
<li><b>state </b> - enthält den aktuellen Status der Auswertung. Wenn Warnungen auftraten (state = Warning) vergleiche Readings
|
||||||
"diff-overrun_limit-<diffLimit>" und "not_enough_data_in_period" </li> <br>
|
"diff-overrun_limit-<diffLimit>" und "less_data_in_period" </li> <br>
|
||||||
<li><b>errortext </b> - Grund eines Fehlerstatus </li> <br>
|
<li><b>errortext </b> - Grund eines Fehlerstatus </li> <br>
|
||||||
<li><b>background_processing_time </b> - die gesamte Prozesszeit die im Hintergrund/Blockingcall verbraucht wird </li> <br>
|
<li><b>background_processing_time </b> - die gesamte Prozesszeit die im Hintergrund/Blockingcall verbraucht wird </li> <br>
|
||||||
<li><b>sql_processing_time </b> - der Anteil der Prozesszeit die für alle SQL-Statements der ausgeführten Operation verbraucht wird </li> <br>
|
<li><b>sql_processing_time </b> - der Anteil der Prozesszeit die für alle SQL-Statements der ausgeführten Operation verbraucht wird </li> <br>
|
||||||
<li><b>diff-overrun_limit-<diffLimit></b> - enthält eine Liste der Wertepaare die eine durch das Attribut "diffAccept" festgelegte Differenz
|
<li><b>diff-overrun_limit-<diffLimit></b> - enthält eine Liste der Wertepaare die eine durch das Attribut "diffAccept" festgelegte Differenz
|
||||||
<diffLimit> (Standard: 20) überschreiten. Gilt für Funktion "diffValue". </li> <br>
|
<diffLimit> (Standard: 20) überschreiten. Gilt für Funktion "diffValue". </li> <br>
|
||||||
<li><b>not_enough_data_in_period</b> - enthält eine Liste der Zeitperioden in denen nur ein einziger Datensatz gefunden wurde und dadurch keine
|
<li><b>less_data_in_period</b> - enthält eine Liste der Zeitperioden in denen nur ein einziger Datensatz gefunden wurde. Die
|
||||||
Differenzberechnung durchgeführt werden konnte. Gilt für Funktion "diffValue". </li> <br>
|
Differenzberechnung berücksichtigt den letzten Wert der Vorperiode. Gilt für Funktion "diffValue". </li> <br>
|
||||||
|
|
||||||
</ul></ul>
|
</ul></ul>
|
||||||
<br>
|
<br>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user