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:
parent
2005734a18
commit
c6e693d34e
@ -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};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user