Fügt der 93_DbLog eine reopen Funktion zu, die ein commit & schließen der Datenbank mit anschließendem wiederverbinden durchführt.
Hintergrund:
Die Journaldatei kann bei längerem Gebrauch (mehrere Tage) von DbLog so groß werden, dass der Speicherplatz auf einem Einplatinencomputer knapp wird, was bis Totalausfall führen kann.
Mit "set <dbLog> reopen" kann z.B. ein at definiert werden, das einmal pro Tag (vorzugsweise nachts) ein Schließen und Wiederöffnen der Log-Datenbank durchführt.
-- edit --- Patch zur Überarbeitung entfernt
Ich habe den ursprünglichen Patch nochmal überarbeitet, um eine einfache Möglichkeit zu schaffen, ggf. weitere Set-Kommandos zu implementieren (ich hab dazu noch ein paar Ideen im Hinterkopf)
Index: 93_DbLog.pm
===================================================================
--- 93_DbLog.pm (revision 5050)
+++ 93_DbLog.pm (working copy)
@@ -17,6 +17,7 @@
use warnings;
use DBI;
use Data::Dumper;
+use feature qw/say switch/;
my %columns = ("DEVICE" => 64,
"TYPE" => 64,
@@ -34,6 +35,7 @@
$hash->{DefFn} = "DbLog_Define";
$hash->{UndefFn} = "DbLog_Undef";
$hash->{NotifyFn} = "DbLog_Log";
+ $hash->{SetFn} = "DbLog_Set";
$hash->{GetFn} = "DbLog_Get";
$hash->{AttrFn} = "DbLog_Attr";
$hash->{ShutdownFn} = "DbLog_Shutdown";
@@ -1019,6 +1021,32 @@
}
}
+sub
+DbLog_Set($@) {
+ my ($hash, @a) = @_;
+ my $name = $hash->{NAME};
+ my $usage = "Unknown argument, choose one of reopen:noArg";
+ return $usage if(int(@a) < 2);
+ my $ret;
+
+ given ($a[1]) {
+
+ when ('reopen') {
+ my $dbh= $hash->{DBH};
+ Log3($name, 4, "DbLog $name: Reopen requested.");
+ $dbh->commit();
+ $dbh->disconnect();
+ DbLog_Connect($hash);
+ $ret = "Reopen executed.";
+ }
+
+ default { $ret = $usage; }
+ }
+
+ return $ret;
+}
+
+
################################################################
#
# Charting Specific functions start here
"set" Funktionalität um eine Zählfunktion erweitert
(http://up.picr.de/17502632pq.png)
sub DbLog_Set($@) {
my ($hash, @a) = @_;
my $name = $hash->{NAME};
my $usage = "Unknown argument, choose one of reopen:noArg count:noArg";
return $usage if(int(@a) < 2);
my $dbh = $hash->{DBH};
my $ret;
given ($a[1]) {
when ('reopen') {
Log3($name, 4, "DbLog $name: Reopen requested.");
$dbh->commit();
$dbh->disconnect();
DbLog_Connect($hash);
$ret = "Reopen executed.";
}
when ('count') {
my $c = $dbh->selectrow_array('SELECT count(*) FROM history');
readingsSingleUpdate($hash, 'countHistory', $c ,1);
$c = $dbh->selectrow_array('SELECT count(*) FROM current');
readingsSingleUpdate($hash, 'countCurrent', $c ,1);
}
default { $ret = $usage; }
}
return $ret;
}
Als nächstes kommen Löschbefehle, um alte Einträge zu löschen.
Schön wäre mE die Möglichkeit, beliebige SQL-Befehler per notify abzusetzen?
Wenn dies über dieses Modul ginge, müsste man keinen eigenes Notify mit Passwort im Klartext verwenden...
kein Problem.... aber die Nutzung geht dann nur auf eigene Verantwortung 8)
Na klar!! :D
Hab auch schob überlegt, das ganze abzusichern, indem man zB nur stored procedures erlaubt.... aber viel zu aufwendig!!
Und wer ein "delete all" absetzt, ist selber schuld!
Damit möchte ich gerne meine Stundenzusammenfassungen der Readings in die DB schreiben.
und wer immer nur an Microsoft SQL Server denkt, ist doof... 8)
ich denke an mysql!
ja, mag sein, ändert nichts daran, dass sqlite keine stored procedures kennt ;)
userCommand funktioniert (siehe zugehörige Readings im Screenshot)
(http://up.picr.de/17502949sr.png)
Man müsste natürlich noch eine ganze Reihe komplexerer Befehle testen.
set <dbLog> deleteOldDays <n>
Funktioniert inzwischen auch, es werden alle Einträge gelöscht, die älter als <n> Tage sind.
bekomm ich eine Version zum testen?
gibt es auch mehrere Usercommands? ;-)
Ich bräuchte je eines für: Tages-Wochen-Monats-Jahresstatistik, ...
Du kannst als userCommand eingeben, was auch immer Du möchtest, das ist ja gerade Sinn und Zweck.
Das Modul protokolliert lediglich den eingegebenen Befehl (und sein Ergebnis) als reading, damit man sich das "delete from history" danach nochmal vor Augen führen kann ;D
Schick mir eine email hier über das Forum zweckst Testversion. Ich will die hier nicht reinstellen, um keine Verwirrung mit unterschiedlichen Versionen zu stiften, zumal es überhaupt nicht "mein" Modul ist.
Zitat von: betateilchen am 28 Februar 2014, 13:52:11
Schick mir eine email hier über das Forum zweckst Testversion.
Mitglied 'betateilchen' hat deine Mitteilungen geblockt.
;-)
Ja, und weiter? Wer lesen kann, ist klar im Vorteil, guckst Du nochmal genau ...
Hatte ich EMAIL oder hatte ich PN geschrieben?
Ohne deine emailadresse zu haben, nicht so einfach.
Herr schmeiß Hirn ra...
(http://up.picr.de/17504869zd.png)
Was glaubst Du eigentlich, wofür der Briefumschlag da gut ist?
Und das ist jetzt nicht OT? Mann, sags doch einfach und gut ist.
was soll ich sagen? Den PN Button hattest Du doch auch gefunden...
Da stehts mit Text beschrieben! Dass der Brief was anderes bedeutet als PN schicken... tja, wußte ich nicht.
Jeder der es anders macht wie du, ist blöd, oder?
Nö. Aber wenn ich email schreibe, meine ich auch email.
Und auch im Profil gibts den Briefumschlag...
(http://up.picr.de/17505028ll.png)
Aber inzwischen wirds wirklich offtopic.
aber ohne Text, nur mit TTT. Nicht ganz offensichtlich!
Das wird mir jetzt echt zu blöd hier.