mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-03 16:56:54 +00:00
93_DbRep: contrib 8.51.0
git-svn-id: https://svn.fhem.de/fhem/trunk@26956 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
6e1eeb17ab
commit
a2f00e23db
@ -59,7 +59,8 @@ no if $] >= 5.017011, warnings => 'experimental::smartmatch';
|
|||||||
|
|
||||||
# Version History intern
|
# Version History intern
|
||||||
my %DbRep_vNotesIntern = (
|
my %DbRep_vNotesIntern = (
|
||||||
"8.51.0" => "02.01.2023 online formatting of sqlCmd, sqlCmdHistory, sqlSpecial, Commandref edited ",
|
"8.51.0" => "02.01.2023 online formatting of sqlCmd, sqlCmdHistory, sqlSpecial, Commandref edited, get dbValue removed ".
|
||||||
|
"sqlCmdBlocking customized like sqlCmd ",
|
||||||
"8.50.10" => "01.01.2023 Commandref edited ",
|
"8.50.10" => "01.01.2023 Commandref edited ",
|
||||||
"8.50.9" => "28.12.2022 Commandref changed to a id-links ",
|
"8.50.9" => "28.12.2022 Commandref changed to a id-links ",
|
||||||
"8.50.8" => "21.12.2022 add call to DbRep_sqlCmd, DbRep_sqlCmdBlocking ",
|
"8.50.8" => "21.12.2022 add call to DbRep_sqlCmd, DbRep_sqlCmdBlocking ",
|
||||||
@ -1086,7 +1087,6 @@ sub DbRep_Set {
|
|||||||
shift @cmd;
|
shift @cmd;
|
||||||
|
|
||||||
$sqlcmd = join ' ', @cmd;
|
$sqlcmd = join ' ', @cmd;
|
||||||
#$sqlcmd = DbRep_trim ($sqlcmd);
|
|
||||||
|
|
||||||
if ($sqlcmd =~ /^ckey:/ix) {
|
if ($sqlcmd =~ /^ckey:/ix) {
|
||||||
my $key = (split ":", $sqlcmd)[1];
|
my $key = (split ":", $sqlcmd)[1];
|
||||||
@ -1099,7 +1099,7 @@ sub DbRep_Set {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$sqlcmd .= ";" if ($sqlcmd !~ m/\;$/x);
|
$sqlcmd .= ';' if ($sqlcmd !~ m/\;$/x);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($opt eq "sqlCmdHistory") {
|
if($opt eq "sqlCmdHistory") {
|
||||||
@ -1323,18 +1323,16 @@ sub DbRep_Get {
|
|||||||
$prop //= '';
|
$prop //= '';
|
||||||
DbRep_firstconnect("$name|$opt|$prop");
|
DbRep_firstconnect("$name|$opt|$prop");
|
||||||
}
|
}
|
||||||
elsif ($opt =~ /sqlCmdBlocking|dbValue/) {
|
elsif ($opt =~ /sqlCmdBlocking/) {
|
||||||
return qq{get "$opt" needs at least an argument} if ( @a < 3 );
|
return qq{get "$opt" needs at least an argument} if ( @a < 3 );
|
||||||
|
|
||||||
if($opt eq "dbValue") {
|
|
||||||
Log3($name, 1, qq{$name - WARNING - the command "dbValue" is deprecated and will be removed soon. Please use "sqlCmdBlocking" instead.});
|
|
||||||
}
|
|
||||||
|
|
||||||
my @cmd = @a;
|
my @cmd = @a;
|
||||||
shift @cmd; shift @cmd;
|
shift @cmd;
|
||||||
|
shift @cmd;
|
||||||
my $sqlcmd = join " ", @cmd;
|
|
||||||
$sqlcmd =~ tr/ A-Za-z0-9!"#$§%&'()*+,-.\/:;<=>?@[\\]^_`{|}~äöüÄÖÜ߀/ /cs;
|
my $sqlcmd = join ' ', @cmd;
|
||||||
|
$sqlcmd =~ tr/ A-Za-z0-9!"#$§%&'()*+,-.\/:;<=>?@[\\]^_`{|}~äöüÄÖÜ߀/ /cs;
|
||||||
|
$sqlcmd .= ';' if ($sqlcmd !~ m/\;$/xs);
|
||||||
|
|
||||||
DbRep_setLastCmd ($name, $opt, $sqlcmd);
|
DbRep_setLastCmd ($name, $opt, $sqlcmd);
|
||||||
|
|
||||||
@ -6622,13 +6620,14 @@ sub DbRep_sqlCmd {
|
|||||||
my $vars = AttrVal($name, "sqlCmdVars", ""); # Set Session Variablen "SET" oder PRAGMA aus Attribut "sqlCmdVars"
|
my $vars = AttrVal($name, "sqlCmdVars", ""); # Set Session Variablen "SET" oder PRAGMA aus Attribut "sqlCmdVars"
|
||||||
|
|
||||||
if ($vars) {
|
if ($vars) {
|
||||||
@pms = split(";",$vars);
|
@pms = split ';', $vars;
|
||||||
|
|
||||||
for my $pm (@pms) {
|
for my $pm (@pms) {
|
||||||
if($pm !~ /PRAGMA|SET/i) {
|
if($pm !~ /PRAGMA|SET/i) {
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
$pm = ltrim($pm).";";
|
|
||||||
|
$pm = ltrim($pm).';';
|
||||||
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
||||||
|
|
||||||
$err = DbRep_dbhDo ($name, $dbh, $pm, "Set VARIABLE or PRAGMA: $pm");
|
$err = DbRep_dbhDo ($name, $dbh, $pm, "Set VARIABLE or PRAGMA: $pm");
|
||||||
@ -6639,17 +6638,16 @@ sub DbRep_sqlCmd {
|
|||||||
# Abarbeitung von Session Variablen vor einem SQL-Statement
|
# Abarbeitung von Session Variablen vor einem SQL-Statement
|
||||||
# z.B. SET @open:=NULL, @closed:=NULL; Select ...
|
# z.B. SET @open:=NULL, @closed:=NULL; Select ...
|
||||||
if($cmd =~ /^\s*SET.*;/i) {
|
if($cmd =~ /^\s*SET.*;/i) {
|
||||||
@pms = split(";",$cmd);
|
@pms = split ';', $cmd;
|
||||||
$sql = q{};
|
$sql = q{};
|
||||||
|
|
||||||
for my $pm (@pms) {
|
for my $pm (@pms) {
|
||||||
|
|
||||||
if($pm !~ /SET/i) {
|
if($pm !~ /SET/i) {
|
||||||
$sql .= $pm.";";
|
$sql .= $pm.';';
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
$pm = ltrim($pm).";";
|
$pm = ltrim($pm).';';
|
||||||
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
||||||
|
|
||||||
$err = DbRep_dbhDo ($name, $dbh, $pm, "Set SQL session variable: $pm");
|
$err = DbRep_dbhDo ($name, $dbh, $pm, "Set SQL session variable: $pm");
|
||||||
@ -6660,17 +6658,16 @@ sub DbRep_sqlCmd {
|
|||||||
# Abarbeitung aller Pragmas vor einem SQLite Statement, SQL wird extrahiert
|
# Abarbeitung aller Pragmas vor einem SQLite Statement, SQL wird extrahiert
|
||||||
# wenn Pragmas im SQL vorangestellt sind
|
# wenn Pragmas im SQL vorangestellt sind
|
||||||
if($cmd =~ /^\s*PRAGMA.*;/i) {
|
if($cmd =~ /^\s*PRAGMA.*;/i) {
|
||||||
@pms = split ";", $cmd;
|
@pms = split ';', $cmd;
|
||||||
$sql = q{};
|
$sql = q{};
|
||||||
|
|
||||||
for my $pm (@pms) {
|
for my $pm (@pms) {
|
||||||
|
|
||||||
if($pm !~ /PRAGMA.*=/i) { # PRAGMA ohne "=" werden als SQL-Statement mit Abfrageergebnis behandelt
|
if($pm !~ /PRAGMA.*=/i) { # PRAGMA ohne "=" werden als SQL-Statement mit Abfrageergebnis behandelt
|
||||||
$sql .= $pm.";";
|
$sql .= $pm.';';
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
$pm = ltrim($pm).";";
|
$pm = ltrim($pm).';';
|
||||||
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
||||||
|
|
||||||
$err = DbRep_dbhDo ($name, $dbh, $pm, "Exec PRAGMA Statement: $pm");
|
$err = DbRep_dbhDo ($name, $dbh, $pm, "Exec PRAGMA Statement: $pm");
|
||||||
@ -6681,16 +6678,16 @@ sub DbRep_sqlCmd {
|
|||||||
# Abarbeitung von PREPARE statement als Befehl als Bestandteil des SQL Forum: #114293 / https://forum.fhem.de/index.php?topic=114293.0
|
# Abarbeitung von PREPARE statement als Befehl als Bestandteil des SQL Forum: #114293 / https://forum.fhem.de/index.php?topic=114293.0
|
||||||
# z.B. PREPARE statement FROM @CMD
|
# z.B. PREPARE statement FROM @CMD
|
||||||
if($sql =~ /^\s*PREPARE.*;/i) {
|
if($sql =~ /^\s*PREPARE.*;/i) {
|
||||||
@pms = split(";",$sql);
|
@pms = split ';', $sql;
|
||||||
$sql = q{};
|
$sql = q{};
|
||||||
|
|
||||||
for my $pm (@pms) {
|
for my $pm (@pms) {
|
||||||
|
|
||||||
if($pm !~ /PREPARE/i) {
|
if($pm !~ /PREPARE/i) {
|
||||||
$sql .= $pm.";";
|
$sql .= $pm.';';
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
$pm = ltrim($pm).";";
|
$pm = ltrim($pm).';';
|
||||||
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
||||||
|
|
||||||
$err = DbRep_dbhDo ($name, $dbh, $pm, "Exec PREPARE statement: $pm");
|
$err = DbRep_dbhDo ($name, $dbh, $pm, "Exec PREPARE statement: $pm");
|
||||||
@ -6708,7 +6705,7 @@ sub DbRep_sqlCmd {
|
|||||||
rsn => $rsn
|
rsn => $rsn
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
return $err if ($err);
|
return "$name|$err" if ($err);
|
||||||
|
|
||||||
$sql =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
$sql =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
||||||
|
|
||||||
@ -6783,7 +6780,7 @@ sub _DbRep_sqlReplaceKeywords {
|
|||||||
my $rsf = $paref->{rsf};
|
my $rsf = $paref->{rsf};
|
||||||
my $rsn = $paref->{rsn};
|
my $rsn = $paref->{rsn};
|
||||||
|
|
||||||
my $ret = q{};
|
my $err = q{};
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my $sfx = AttrVal("global", "language", "EN");
|
my $sfx = AttrVal("global", "language", "EN");
|
||||||
$sfx = $sfx eq 'EN' ? '' : "_$sfx";
|
$sfx = $sfx eq 'EN' ? '' : "_$sfx";
|
||||||
@ -6791,7 +6788,7 @@ sub _DbRep_sqlReplaceKeywords {
|
|||||||
$sql =~ s/§timestamp_begin§/'$rsf'/g;
|
$sql =~ s/§timestamp_begin§/'$rsf'/g;
|
||||||
$sql =~ s/§timestamp_end§/'$rsn'/g;
|
$sql =~ s/§timestamp_end§/'$rsn'/g;
|
||||||
|
|
||||||
my ($rdspec,$err);
|
my $rdspec;
|
||||||
|
|
||||||
my @keywords = qw(device reading);
|
my @keywords = qw(device reading);
|
||||||
|
|
||||||
@ -6810,8 +6807,7 @@ sub _DbRep_sqlReplaceKeywords {
|
|||||||
$err = qq{<html> $err </html>};
|
$err = qq{<html> $err </html>};
|
||||||
$err =~ s/"${kw}"/<a href='https:\/\/fhem.de\/commandref${sfx}.html#${kw}' target='_blank'>${kw}<\/a>/xs;
|
$err =~ s/"${kw}"/<a href='https:\/\/fhem.de\/commandref${sfx}.html#${kw}' target='_blank'>${kw}<\/a>/xs;
|
||||||
$err = encode_base64($err,"");
|
$err = encode_base64($err,"");
|
||||||
$ret = "$name|$err";
|
return $err;
|
||||||
return $ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$rdspec = DbRep_createCommonSql( {hash => $hash, ${kw} => $vna, dbmodel => $dbmodel} );
|
$rdspec = DbRep_createCommonSql( {hash => $hash, ${kw} => $vna, dbmodel => $dbmodel} );
|
||||||
@ -6819,7 +6815,7 @@ sub _DbRep_sqlReplaceKeywords {
|
|||||||
$sql =~ s/§${kw}§/$rdspec/xg;
|
$sql =~ s/§${kw}§/$rdspec/xg;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ($ret, $sql);
|
return ($err, $sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
####################################################################################################
|
####################################################################################################
|
||||||
@ -13189,80 +13185,158 @@ sub DbRep_sqlCmdBlocking {
|
|||||||
my $name = shift;
|
my $name = shift;
|
||||||
my $cmd = shift;
|
my $cmd = shift;
|
||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
my $dbloghash = $defs{$hash->{HELPER}{DBLOGDEVICE}};
|
|
||||||
my $dbconn = $dbloghash->{dbconn};
|
|
||||||
my $dbuser = $dbloghash->{dbuser};
|
|
||||||
my $dblogname = $dbloghash->{NAME};
|
|
||||||
my $dbpassword = $attr{"sec$dblogname"}{secret};
|
|
||||||
my $utf8 = $hash->{UTF8} // 0;
|
|
||||||
|
|
||||||
my $srs = AttrVal($name, "sqlResultFieldSep", "|" );
|
my $srs = AttrVal ($name, "sqlResultFieldSep", "|");
|
||||||
my $to = AttrVal($name, "timeout", 10 );
|
my $to = AttrVal ($name, "timeout", 10 );
|
||||||
|
|
||||||
my ($err,$ret,$dbh,@pms);
|
my ($ret);
|
||||||
|
|
||||||
readingsDelete ($hash, "errortext");
|
readingsDelete ($hash, "errortext");
|
||||||
ReadingsSingleUpdateValue ($hash, "state", "running", 1);
|
ReadingsSingleUpdateValue ($hash, "state", "running", 1);
|
||||||
|
|
||||||
eval { $dbh = DBI->connect("dbi:$dbconn", $dbuser, $dbpassword, { PrintError => 0,
|
my ($err,$dbh,$dbmodel) = DbRep_dbConnect($name);
|
||||||
RaiseError => 1,
|
if ($err) {
|
||||||
AutoCommit => 1,
|
$err = decode_base64 ($err);
|
||||||
AutoInactiveDestroy => 1,
|
|
||||||
mysql_enable_utf8 => $utf8
|
Log3 ($name, 2, "DbRep $name - ERROR - $err");
|
||||||
}
|
|
||||||
);
|
readingsBeginUpdate ($hash);
|
||||||
};
|
ReadingsBulkUpdateValue ($hash, 'errortext', $err);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'state', 'error');
|
||||||
if ($@) {
|
readingsEndUpdate ($hash, 1);
|
||||||
$err = $@;
|
|
||||||
Log3 ($name, 2, "DbRep $name - $err");
|
return $err;
|
||||||
ReadingsSingleUpdateValue ($hash, "errortext", $err, 1);
|
|
||||||
ReadingsSingleUpdateValue ($hash, "state", "error", 1);
|
|
||||||
return $err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$cmd =~ s/\;\;/ESC_ESC_ESC/gx; # ersetzen von escapeten ";" (;;)
|
||||||
|
|
||||||
my $sql = ($cmd =~ m/\;$/xs) ? $cmd : $cmd.";";
|
$cmd .= ";" if ($cmd !~ m/\;$/x);
|
||||||
|
my $sql = $cmd;
|
||||||
|
|
||||||
Log3 ($name, 4, "DbRep $name - -------- New selection --------- ");
|
Log3 ($name, 4, "DbRep $name - -------- New selection --------- ");
|
||||||
Log3 ($name, 4, "DbRep $name - Command: sqlCmdBlocking");
|
Log3 ($name, 4, "DbRep $name - sqlCmdBlocking Command:\n$sql");
|
||||||
Log3 ($name, 4, "DbRep $name - SQL execute: $sql");
|
|
||||||
|
my @pms;
|
||||||
|
my $vars = AttrVal($name, "sqlCmdVars", ""); # Set Session Variablen "SET" oder PRAGMA aus Attribut "sqlCmdVars"
|
||||||
|
|
||||||
# Set Session Variablen "SET" oder PRAGMA aus Attribut "sqlCmdVars"
|
|
||||||
my $vars = AttrVal($name, "sqlCmdVars", "");
|
|
||||||
if ($vars) {
|
if ($vars) {
|
||||||
@pms = split(";",$vars);
|
@pms = split ';', $vars;
|
||||||
|
|
||||||
for my $pm (@pms) {
|
for my $pm (@pms) {
|
||||||
if($pm !~ /PRAGMA|SET/i) {
|
if($pm !~ /PRAGMA|SET/i) {
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
$pm = ltrim($pm).";";
|
|
||||||
Log3($name, 4, "DbRep $name - Set VARIABLE or PRAGMA: $pm");
|
$pm = ltrim($pm).';';
|
||||||
eval {$dbh->do($pm);} or do { Log3 ($name, 2, "DbRep $name - ERROR - $@");
|
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
||||||
$dbh->disconnect;
|
|
||||||
return $@;
|
$err = DbRep_dbhDo ($name, $dbh, $pm, "Set VARIABLE or PRAGMA: $pm");
|
||||||
}
|
if ($err) {
|
||||||
|
$err = decode_base64 ($err);
|
||||||
|
|
||||||
|
Log3 ($name, 2, "DbRep $name - ERROR - $err");
|
||||||
|
|
||||||
|
readingsBeginUpdate ($hash);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'errortext', $err);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'state', 'error');
|
||||||
|
readingsEndUpdate ($hash, 1);
|
||||||
|
|
||||||
|
return $err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Abarbeitung von Session Variablen vor einem SQL-Statement
|
||||||
|
# z.B. SET @open:=NULL, @closed:=NULL; Select ...
|
||||||
|
if($cmd =~ /^\s*SET.*;/i) {
|
||||||
|
@pms = split ';', $cmd;
|
||||||
|
$sql = q{};
|
||||||
|
|
||||||
my $set;
|
for my $pm (@pms) {
|
||||||
if($cmd =~ /^SET.*;/i) { # split SQL-Parameter Statement falls mitgegeben ->
|
if($pm !~ /SET/i) {
|
||||||
$cmd =~ m/^(SET.*?;)(.*)/i; # z.B. SET @open:=NULL, @closed:=NULL; Select ...
|
$sql .= $pm.';';
|
||||||
$set = $1;
|
next;
|
||||||
$sql = $2;
|
}
|
||||||
|
|
||||||
|
$pm = ltrim($pm).';';
|
||||||
|
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
||||||
|
|
||||||
|
$err = DbRep_dbhDo ($name, $dbh, $pm, "Set SQL session variable: $pm");
|
||||||
|
if ($err) {
|
||||||
|
$err = decode_base64 ($err);
|
||||||
|
|
||||||
|
Log3 ($name, 2, "DbRep $name - ERROR - $err");
|
||||||
|
|
||||||
|
readingsBeginUpdate ($hash);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'errortext', $err);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'state', 'error');
|
||||||
|
readingsEndUpdate ($hash, 1);
|
||||||
|
|
||||||
|
return $err;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Abarbeitung aller Pragmas vor einem SQLite Statement, SQL wird extrahiert
|
||||||
|
# wenn Pragmas im SQL vorangestellt sind
|
||||||
|
if($cmd =~ /^\s*PRAGMA.*;/i) {
|
||||||
|
@pms = split ';', $cmd;
|
||||||
|
$sql = q{};
|
||||||
|
|
||||||
if($set) {
|
for my $pm (@pms) {
|
||||||
Log3($name, 4, "DbRep $name - Set SQL session variables: $set");
|
if($pm !~ /PRAGMA.*=/i) { # PRAGMA ohne "=" werden als SQL-Statement mit Abfrageergebnis behandelt
|
||||||
eval {$dbh->do($set);}; # @\RB = Resetbit wenn neues Selektionsintervall beginnt
|
$sql .= $pm.';';
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
$pm = ltrim($pm).';';
|
||||||
|
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
||||||
|
|
||||||
|
$err = DbRep_dbhDo ($name, $dbh, $pm, "Exec PRAGMA Statement: $pm");
|
||||||
|
if ($err) {
|
||||||
|
$err = decode_base64 ($err);
|
||||||
|
|
||||||
|
Log3 ($name, 2, "DbRep $name - ERROR - $err");
|
||||||
|
|
||||||
|
readingsBeginUpdate ($hash);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'errortext', $err);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'state', 'error');
|
||||||
|
readingsEndUpdate ($hash, 1);
|
||||||
|
|
||||||
|
return $err;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Abarbeitung von PREPARE statement als Befehl als Bestandteil des SQL Forum: #114293 / https://forum.fhem.de/index.php?topic=114293.0
|
||||||
|
# z.B. PREPARE statement FROM @CMD
|
||||||
|
if($sql =~ /^\s*PREPARE.*;/i) {
|
||||||
|
@pms = split ';', $sql;
|
||||||
|
$sql = q{};
|
||||||
|
|
||||||
|
for my $pm (@pms) {
|
||||||
|
if($pm !~ /PREPARE/i) {
|
||||||
|
$sql .= $pm.';';
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
if ($@) {
|
$pm = ltrim($pm).';';
|
||||||
$err = $@;
|
$pm =~ s/ESC_ESC_ESC/;/gx; # wiederherstellen von escapeten ";" -> umwandeln von ";;" in ";"
|
||||||
Log3 ($name, 2, "DbRep $name - $err");
|
|
||||||
ReadingsSingleUpdateValue ($hash, "errortext", $err, 1);
|
$err = DbRep_dbhDo ($name, $dbh, $pm, "Exec PREPARE statement: $pm");
|
||||||
ReadingsSingleUpdateValue ($hash, "state", "error", 1);
|
if ($err) {
|
||||||
return ($err);
|
$err = decode_base64 ($err);
|
||||||
|
|
||||||
|
Log3 ($name, 2, "DbRep $name - ERROR - $err");
|
||||||
|
|
||||||
|
readingsBeginUpdate ($hash);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'errortext', $err);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'state', 'error');
|
||||||
|
readingsEndUpdate ($hash, 1);
|
||||||
|
|
||||||
|
return $err;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
my $st = [gettimeofday]; # SQL-Startzeit
|
my $st = [gettimeofday]; # SQL-Startzeit
|
||||||
@ -13304,8 +13378,10 @@ sub DbRep_sqlCmdBlocking {
|
|||||||
$sth->finish if($sth);
|
$sth->finish if($sth);
|
||||||
$dbh->disconnect;
|
$dbh->disconnect;
|
||||||
|
|
||||||
ReadingsSingleUpdateValue ($hash, "errortext", $err, 1);
|
readingsBeginUpdate ($hash);
|
||||||
ReadingsSingleUpdateValue ($hash, "state", "error", 1);
|
ReadingsBulkUpdateValue ($hash, 'errortext', $err);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'state', 'error');
|
||||||
|
readingsEndUpdate ($hash, 1);
|
||||||
|
|
||||||
return $err;
|
return $err;
|
||||||
}
|
}
|
||||||
@ -13329,8 +13405,11 @@ sub DbRep_sqlCmdBlocking {
|
|||||||
Log3 ($name, 2, "DbRep $name - $err");
|
Log3 ($name, 2, "DbRep $name - $err");
|
||||||
|
|
||||||
$dbh->disconnect;
|
$dbh->disconnect;
|
||||||
ReadingsSingleUpdateValue ($hash, "errortext", $err, 1);
|
|
||||||
ReadingsSingleUpdateValue ($hash, "state", "error", 1);
|
readingsBeginUpdate ($hash);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'errortext', $err);
|
||||||
|
ReadingsBulkUpdateValue ($hash, 'state', 'error');
|
||||||
|
readingsEndUpdate ($hash, 1);
|
||||||
|
|
||||||
return $err;
|
return $err;
|
||||||
}
|
}
|
||||||
@ -13347,7 +13426,7 @@ sub DbRep_sqlCmdBlocking {
|
|||||||
Log3 ($name, 4, "DbRep $name - Number of entries processed in db $hash->{DATABASE}: $nrows by $com");
|
Log3 ($name, 4, "DbRep $name - Number of entries processed in db $hash->{DATABASE}: $nrows by $com");
|
||||||
|
|
||||||
readingsBeginUpdate ($hash);
|
readingsBeginUpdate ($hash);
|
||||||
ReadingsBulkUpdateTimeState ($hash,undef,$rt,"done");
|
ReadingsBulkUpdateTimeState ($hash, undef, $rt, 'done');
|
||||||
readingsEndUpdate ($hash, 1);
|
readingsEndUpdate ($hash, 1);
|
||||||
|
|
||||||
return $ret;
|
return $ret;
|
||||||
@ -15297,50 +15376,52 @@ return;
|
|||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<a id="DbRep-get-sqlCmdBlocking"></a>
|
<a id="DbRep-get-sqlCmdBlocking"></a>
|
||||||
<li><b> sqlCmdBlocking <SQL-statement></b> -
|
<li><b> sqlCmdBlocking <SQL-statement></b> <br><br>
|
||||||
Executes the specified SQL statement <b>blocking</b> with a default timeout of 10 seconds.
|
Executes the specified SQL statement <b>blocking</b> with a default timeout of 10 seconds.
|
||||||
The timeout can be set with the attribute <a href="#DbRep-attr-timeout">timeout</a>.
|
The timeout can be set with the attribute <a href="#DbRep-attr-timeout">timeout</a>.
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<b>Examples:</b> <br>
|
<b>Examples:</b> <br>
|
||||||
{ fhem("get <name> sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device") } <br>
|
{ fhem("get <name> sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device") } <br>
|
||||||
{ CommandGet(undef,"Rep.LogDB1 sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device") } <br>
|
{ CommandGet(undef,"Rep.LogDB1 sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device") } <br>
|
||||||
get <name> sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device <br>
|
get <name> sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device <br>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
Because of its mode of operation this function is particular convenient for user own perl scripts. <br>
|
Because of its mode of operation this function is particular convenient for user own perl scripts. <br>
|
||||||
The input accepts multi line commands and delivers multi line results as well.
|
The input accepts multi line commands and delivers multi line results as well.
|
||||||
This command also accept the setting of SQL session variables like "SET @open:=NULL,
|
This command also accept the setting of SQL session variables like "SET @open:=NULL,
|
||||||
@closed:=NULL;". <br>
|
@closed:=NULL;" or PRAGMA for SQLite. <br>
|
||||||
If several fields are selected and passed back, the fieds are separated by the separator defined
|
If several fields are selected and passed back, the fieds are separated by the separator defined
|
||||||
by attribute <a href="#DbRep-attr-sqlResultFieldSep">sqlResultFieldSep</a> (default "|"). Several result lines
|
by attribute <a href="#DbRep-attr-sqlResultFieldSep">sqlResultFieldSep</a> (default "|"). Several result lines
|
||||||
are separated by newline ("\n"). <br>
|
are separated by newline ("\n"). <br>
|
||||||
This function only set/update status readings, the userExitFn function isn't called.
|
This function only set/update status readings, the userExitFn function isn't called.
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
If you create a little routine in 99_myUtils, for example:
|
If you create a little routine in 99_myUtils, for example:
|
||||||
<br>
|
<br>
|
||||||
<pre>
|
|
||||||
|
<pre>
|
||||||
sub dbval {
|
sub dbval {
|
||||||
my $name = shift;
|
my $name = shift;
|
||||||
my $cmd) = shift;
|
my $cmd) = shift;
|
||||||
my $ret = CommandGet(undef,"$name sqlCmdBlocking $cmd");
|
my $ret = CommandGet(undef,"$name sqlCmdBlocking $cmd");
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
it can be accessed with e.g. those calls:
|
|
||||||
<br><br>
|
it can be accessed with e.g. those calls:
|
||||||
|
<br><br>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<b>Examples:</b> <br>
|
<b>Examples:</b> <br>
|
||||||
{ dbval("<name>","select count(*) from history") } <br>
|
{ dbval("<name>","select count(*) from history") } <br>
|
||||||
$ret = dbval("<name>","select count(*) from history"); <br>
|
$ret = dbval("<name>","select count(*) from history"); <br>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<a id="DbRep-get-storedCredentials"></a>
|
<a id="DbRep-get-storedCredentials"></a>
|
||||||
<li><b> storedCredentials </b> - Reports the users / passwords stored for database access by the device. <br>
|
<li><b> storedCredentials </b> - Reports the users / passwords stored for database access by the device. <br>
|
||||||
@ -18191,52 +18272,55 @@ return;
|
|||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<a id="DbRep-get-sqlCmdBlocking"></a>
|
<a id="DbRep-get-sqlCmdBlocking"></a>
|
||||||
<li><b> sqlCmdBlocking <SQL-Statement></b> -
|
<li><b> sqlCmdBlocking <SQL-Statement></b> <br><br>
|
||||||
Führt das angegebene SQL-Statement <b>blockierend</b> mit einem Standardtimeout von 10 Sekunden aus.
|
|
||||||
Der Timeout kann mit dem Attribut <a href="#DbRep-attr-timeout">timeout</a> eingestellt werden.
|
Führt das angegebene SQL-Statement <b>blockierend</b> mit einem Standardtimeout von 10 Sekunden aus.
|
||||||
<br><br>
|
Der Timeout kann mit dem Attribut <a href="#DbRep-attr-timeout">timeout</a> eingestellt werden.
|
||||||
|
<br><br>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<b>Beispiele:</b> <br>
|
<b>Beispiele:</b> <br>
|
||||||
{ fhem("get <name> sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device") } <br>
|
{ fhem("get <name> sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device") } <br>
|
||||||
{ CommandGet(undef,"Rep.LogDB1 sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device") } <br>
|
{ CommandGet(undef,"Rep.LogDB1 sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device") } <br>
|
||||||
get <name> sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device <br>
|
get <name> sqlCmdBlocking select device,count(*) from history where timestamp > '2018-04-01' group by device <br>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
Diese Funktion ist durch ihre Arbeitsweise speziell für den Einsatz in benutzerspezifischen Scripten geeignet. <br>
|
Diese Funktion ist durch ihre Arbeitsweise speziell für den Einsatz in benutzerspezifischen Scripten geeignet. <br>
|
||||||
Die Eingabe akzeptiert Mehrzeiler und gibt ebenso mehrzeilige Ergebisse zurück.
|
Die Eingabe akzeptiert Mehrzeiler und gibt ebenso mehrzeilige Ergebisse zurück.
|
||||||
Dieses Kommando akzeptiert ebenfalls das Setzen von SQL Session Variablen wie z.B.
|
Dieses Kommando akzeptiert ebenfalls das Setzen von SQL Session Variablen wie z.B.
|
||||||
"SET @open:=NULL, @closed:=NULL;". <br>
|
"SET @open:=NULL, @closed:=NULL;" oder PRAGMA für SQLite. <br>
|
||||||
Werden mehrere Felder selektiert und zurückgegeben, erfolgt die Feldtrennung mit dem Trenner
|
Werden mehrere Felder selektiert und zurückgegeben, erfolgt die Feldtrennung mit dem Trenner
|
||||||
des Attributs <a href="#DbRep-attr-sqlResultFieldSep">sqlResultFieldSep</a> (default "|"). Mehrere Ergebniszeilen
|
des Attributs <a href="#DbRep-attr-sqlResultFieldSep">sqlResultFieldSep</a> (default "|"). Mehrere Ergebniszeilen
|
||||||
werden mit Newline ("\n") separiert. <br>
|
werden mit Newline ("\n") separiert. <br>
|
||||||
Diese Funktion setzt/aktualisiert nur Statusreadings, die Funktion im Attribut "userExitFn"
|
Diese Funktion setzt/aktualisiert nur Statusreadings, die Funktion im Attribut "userExitFn"
|
||||||
wird nicht aufgerufen.
|
wird nicht aufgerufen.
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
Erstellt man eine kleine Routine in 99_myUtils, wie z.B.:
|
Erstellt man eine kleine Routine in 99_myUtils, wie z.B.:
|
||||||
<br>
|
<br>
|
||||||
<pre>
|
|
||||||
|
<pre>
|
||||||
sub dbval {
|
sub dbval {
|
||||||
my $name = shift;
|
my $name = shift;
|
||||||
my $cmd = shift;
|
my $cmd = shift;
|
||||||
my $ret = CommandGet(undef,"$name sqlCmdBlocking $cmd");
|
my $ret = CommandGet(undef,"$name sqlCmdBlocking $cmd");
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
kann sqlCmdBlocking vereinfacht verwendet werden mit Aufrufen wie:
|
|
||||||
<br><br>
|
kann sqlCmdBlocking vereinfacht verwendet werden mit Aufrufen wie:
|
||||||
|
<br><br>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<b>Beispiele:</b> <br>
|
<b>Beispiele:</b> <br>
|
||||||
{ dbval("<name>","select count(*) from history") } <br>
|
{ dbval("<name>","select count(*) from history") } <br>
|
||||||
oder <br>
|
oder <br>
|
||||||
$ret = dbval("<name>","select count(*) from history"); <br>
|
$ret = dbval("<name>","select count(*) from history"); <br>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<a id="DbRep-get-storedCredentials"></a>
|
<a id="DbRep-get-storedCredentials"></a>
|
||||||
<li><b> storedCredentials </b> - Listet die im Device gespeicherten User / Passworte für den Datenbankzugriff auf. <br>
|
<li><b> storedCredentials </b> - Listet die im Device gespeicherten User / Passworte für den Datenbankzugriff auf. <br>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user