2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-28 15:04:51 +00:00

93_DbRep: contrib v 8.46.1

git-svn-id: https://svn.fhem.de/fhem/trunk@25320 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2021-12-07 22:36:38 +00:00
parent 2005734a18
commit c6e693d34e

View File

@ -1637,7 +1637,17 @@ sub DbRep_firstconnect {
# DB Strukturelemente abrufen # DB Strukturelemente abrufen
Log3 ($name, 3, "DbRep $name - Connectiontest to database $dbconn with user $dbuser") if($hash->{LASTCMD} ne "minTimestamp"); Log3 ($name, 3, "DbRep $name - Connectiontest to database $dbconn with user $dbuser") if($hash->{LASTCMD} ne "minTimestamp");
$hash->{HELPER}{RUNNING_PID} = BlockingCall("DbRep_getInitData", "$name|$opt|$prop|$fret", "DbRep_getInitDataDone", $to, "DbRep_getInitDataAborted", $hash); ReadingsSingleUpdateValue ($hash, "state", "read database properties", 1);
my $params = {
hash => $hash,
name => $name,
opt => $opt,
prop => $prop,
fret => $fret,
};
$hash->{HELPER}{RUNNING_PID} = BlockingCall("DbRep_getInitData", $params, "DbRep_getInitDataDone", $to, "DbRep_getInitDataAborted", $hash);
if($hash->{HELPER}{RUNNING_PID}) { if($hash->{HELPER}{RUNNING_PID}) {
$hash->{HELPER}{RUNNING_PID}{loglevel} = 5; # Forum #77057 $hash->{HELPER}{RUNNING_PID}{loglevel} = 5; # Forum #77057
@ -1655,31 +1665,26 @@ return;
# DatenDatenbankeigenschaften ermitteln # DatenDatenbankeigenschaften ermitteln
#################################################################################################### ####################################################################################################
sub DbRep_getInitData { sub DbRep_getInitData {
my $string = shift; my $paref = shift;
my ($name,$opt,$prop,$fret) = split("\\|", $string); my $hash = $paref->{hash};
my $hash = $defs{$name}; my $name = $paref->{name};
my $dbloghash = $defs{$hash->{HELPER}{DBLOGDEVICE}}; my $opt = $paref->{opt};
my $dbconn = $dbloghash->{dbconn}; my $prop = $paref->{prop};
my $dbuser = $dbloghash->{dbuser}; my $fret = $paref->{fret};
my $dblogname = $dbloghash->{NAME};
my $dbmodel = $dbloghash->{MODEL};
my $database = $hash->{DATABASE}; my $database = $hash->{DATABASE};
my $dbpassword = $attr{"sec$dblogname"}{secret};
my $mintsdef = "1970-01-01 01:00:00"; my $mintsdef = "1970-01-01 01:00:00";
my $idxstate = ""; my $idxstate = "";
my ($dbh,$sth,$sql,$err);
# Background-Startzeit my $bst = [gettimeofday]; # Background-Startzeit
my $bst = [gettimeofday];
($err,$dbh) = DbRep_dbConnect($name, 0); my ($err,$dbh,$dbmodel) = DbRep_dbConnect($name, 0);
if ($err) { if ($err) {
$err = encode_base64($err,""); $err = encode_base64($err,"");
return "$name|''|''|$err"; return "$name|''|''|$err";
} }
# SQL-Startzeit my $st = [gettimeofday]; # SQL-Startzeit
my $st = [gettimeofday];
# ältesten Datensatz der DB ermitteln # ältesten Datensatz der DB ermitteln
my $mints = qq{}; my $mints = qq{};
@ -1688,11 +1693,14 @@ sub DbRep_getInitData {
# Report_Idx Status ermitteln # Report_Idx Status ermitteln
my ($ava,$sqlava); my ($ava,$sqlava);
my $idx = "Report_Idx"; my $idx = "Report_Idx";
if($dbmodel =~ /MYSQL/) { if($dbmodel =~ /MYSQL/) {
$sqlava = "SHOW INDEX FROM history where Key_name='$idx';"; $sqlava = "SHOW INDEX FROM history where Key_name='$idx';";
} elsif($dbmodel =~ /SQLITE/) { }
elsif($dbmodel =~ /SQLITE/) {
$sqlava = "SELECT name FROM sqlite_master WHERE type='index' AND name='$idx';"; $sqlava = "SELECT name FROM sqlite_master WHERE type='index' AND name='$idx';";
} elsif($dbmodel =~ /POSTGRESQL/) { }
elsif($dbmodel =~ /POSTGRESQL/) {
$sqlava = "SELECT indexname FROM pg_indexes WHERE tablename='history' and indexname ='$idx';"; $sqlava = "SELECT indexname FROM pg_indexes WHERE tablename='history' and indexname ='$idx';";
} }
@ -1715,7 +1723,8 @@ sub DbRep_getInitData {
} }
# effektive Userrechte in MYSQL ermitteln # effektive Userrechte in MYSQL ermitteln
my ($grants,@uniq); my ($grants,$sth,@uniq);
if($dbmodel =~ /MYSQL/) { if($dbmodel =~ /MYSQL/) {
eval {$sth = $dbh->prepare("SHOW GRANTS FOR CURRENT_USER();"); $sth->execute();}; eval {$sth = $dbh->prepare("SHOW GRANTS FOR CURRENT_USER();"); $sth->execute();};
if($@) { if($@) {
@ -1730,23 +1739,26 @@ sub DbRep_getInitData {
$row .= (split(" ON ",(split("GRANT ", $l, 2))[1], 2))[0]; $row .= (split(" ON ",(split("GRANT ", $l, 2))[1], 2))[0];
} }
} }
$sth->finish; $sth->finish;
my %seen = (); my %seen = ();
my @g = split(/,(\s?)/, $row); my @g = split(/,(\s?)/, $row);
for my $e (@g) { for my $e (@g) {
next if(!$e || $e =~ /^\s+$/); next if(!$e || $e =~ /^\s+$/);
$seen{$e}++; $seen{$e}++;
} }
@uniq = keys %seen; @uniq = keys %seen;
$grants = join(",",@uniq); $grants = join(",",@uniq);
Log3 ($name, 4, "DbRep $name - all grants: $grants"); Log3 ($name, 4, "DbRep $name - all grants: $grants");
} }
} }
$dbh->disconnect; $dbh->disconnect;
# SQL-Laufzeit ermitteln my $rt = tv_interval($st); # SQL-Laufzeit ermitteln
my $rt = tv_interval($st);
Log3 ($name, 5, "DbRep $name - minimum timestamp found in database: $mints"); Log3 ($name, 5, "DbRep $name - minimum timestamp found in database: $mints");
@ -1754,19 +1766,14 @@ sub DbRep_getInitData {
$idxstate = encode_base64($idxstate, ""); $idxstate = encode_base64($idxstate, "");
$grants = encode_base64($grants, "") if($grants); $grants = encode_base64($grants, "") if($grants);
# Background-Laufzeit ermitteln my $brt = tv_interval($bst); # Background-Laufzeit ermitteln
my $brt = tv_interval($bst);
$rt = $rt.",".$brt; $rt = $rt.",".$brt;
$opt = DbRep_trim ($opt) if($opt); $opt = DbRep_trim ($opt) if($opt);
$prop = DbRep_trim ($prop) if($prop); $prop = DbRep_trim ($prop) if($prop);
my $ret = "$name|$mints|$rt|0|$opt|$prop|$fret|$idxstate|$grants"; return "$name|$mints|$rt|0|$opt|$prop|$fret|$idxstate|$grants";
# Log3 ($name, 5, "DbRep $name - return summary string: $ret");
return $ret;
} }
#################################################################################################### ####################################################################################################
@ -12046,16 +12053,52 @@ sub DbRep_removeLeadingZero {
return $val; return $val;
} }
#################################################################################################### ################################################################
# löscht einen Wert vom $hash des Hauptprozesses aus einem BlockingCall heraus # Werte aus BlockingCall heraus setzen
#################################################################################################### # Erwartete Liste:
# @setl = $name,$setread,$helper
################################################################
sub DbRep_setFromBlocking {
my $name = shift;
my $setread = shift // "NULL";
my $helper = shift // "NULL";
my $hash = $defs{$name};
if($setread ne "NULL") {
my @cparts = split ":", $setread, 2;
ReadingsSingleUpdateValue ($hash, $cparts[0], $cparts[1], 1);
}
if($helper ne "NULL") {
my ($hnam,$k1,$k2,$k3) = split ":", $helper, 4;
if(defined $k3) {
$hash->{HELPER}{"$hnam"}{"$k1"}{"$k2"} = $k3;
}
elsif (defined $k2) {
$hash->{HELPER}{"$hnam"}{"$k1"} = $k2;
}
else {
$hash->{HELPER}{"$hnam"} = $k1;
}
}
return 1;
}
################################################################
# löscht einen Wert vom $hash des Hauptprozesses aus
# einem BlockingCall heraus
################################################################
sub DbRep_delHashValFromBlocking { sub DbRep_delHashValFromBlocking {
my ($name,$v1,$v2) = @_; my ($name,$v1,$v2) = @_;
my $hash = $defs{$name}; my $hash = $defs{$name};
if($v2) { if($v2) {
delete $hash->{$v1}{$v2}; delete $hash->{$v1}{$v2};
} elsif ($v1) { }
elsif ($v1) {
delete $hash->{$v1}; delete $hash->{$v1};
} }