Aufruf von Stored Procedures per DbLog/Usercommand

Begonnen von Icinger, 09 März 2014, 10:15:49

Vorheriges Thema - Nächstes Thema

Icinger

Schönen guten Morgen,

DbLog bietet ja die Möglichkeit, mittels
Zitatset dblog userCommand <cmd>
einen SQL-String an die Datenback zu schicken.

Allerdings schaffe ich es leider nicht, hier mittels
call nightly_cleanup()
eine stored Procedure aufzurufen.

Dieselbe SP läuft in der Workbench oder direkt aus Perl heraus einwandfrei.
Gibt's da einen Trick, oder könnte man das als Feature noch implementieren?

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

betateilchen

Meine Hellseh-Glaskugel ist grade in der Werkstatt...

Was kommt denn als Ergebnis? Irgendwelche Fehlermeldungen im Log?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Icinger

Hallo Betateilchen,

ja, tut mir leid, das hätte sicherlich ausführlicher sein können.
Dann versuch ichs jetzt nochmal :)
Grundsätzlich gehts mir eigentlich darum, dass ich schon über die letzten 10 Jahre Temperatur-Aufzeichnungen habe, die bereits in einer DB sind.
Nun möchte ich einmal täglich, kurz nach Mitternacht, die relevanten Daten aus DbLog in meine bestehende DB überführen.
Dazu habe ich mir eine StoredProcedure erstellt, die eben dies macht.

Rufe ich diese über eine Sub in der MyUtils auf, klappt das einwandfrei:
sub NightlyDatabaseCleanup{
    my ($dbh, $sql, $sth);
    $dbh=DBI->connect('dbi:mysql:database=fhem;host=Mainframe','User','PW') ||  die "Error opening database: $DBI::errstr\n";
    $sql = "CALL Nightly_Cleanup()";
    $sth = $dbh->prepare($sql);
    $sth->execute();
    $sth->finish();
    $dbh->disconnect || die "Failed to disconnect\n";
}


Versuche ich das per
set logDB userCommand call nightly_cleanup;
set logDB userCommand 'call nightly_cleanup;'
o.ä.

aufzurufen, bekomme ich im Log nur:
2014.03.10 06:14:56 5: DbLog: logging of Device: Temp_Wohnzimmer , Type: WMR_WEATHER , Event: temperature: 21.30 , Reading: temperature , Value: 21.30 , Unit:
2014.03.10 06:15:02 5: DbLog: logging of Device: Temp_Aussen , Type: WMR_WEATHER , Event: temperature: -1.10 , Reading: temperature , Value: -1.10 , Unit:
2014.03.10 06:15:03 4: DbLog logdb: userCommand execution requested.
2014.03.10 06:15:07 5: DbLog: logging of Device: Heizung_Umlaufpumpe , Type: DUMMY , Event:  , Reading: data , Value:  , Unit:


Ich hoffe, das war nun ausführlich genug :)
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

betateilchen

#3
nicht ganz...  was steht denn nach dem Versuch des Aufrufs in den readings von DbLog?

Die Hauptursache dürfte sein, dass beim usercommand aus Sicherheitsgründen nicht mit prepare/execute/finish gearbeitet wird, sondern mit selectrow_array(). Und das würde ich ungern ändern.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Icinger

Ok, nu hier noch die Readings nachgereicht:

countCurrent                7                2014-03-08 13:14:42
countHistory             22542            2014-03-08 13:14:42
state                         active            2014-03-10 07:18:10
userCommand    call Nightly_Cleanup();                2014-03-10 06:15:03


Zitataus Sicherheitsgründen nicht mit prepare/execute/finish
Ok, das is verständlich......Hab ich auch kein Problem damit. Mir gings nur darum, obs generell eine Möglichkeit gibt.
Aber mit dem kleinen Script in der MyUtils kann ich auch gut leben :)

Danke und lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Tobias

#5
So wie ich das sehe zurZeit nur Lösbar über umweg...
Das DbLog Handle ist global verfügbar, also in MyUtils.conf schwupts eine Funktion gebaut die die Prozedur aufruft...

Abgesehen davon ist IMHO mittlerweile eine cleanup Funktion verfügbar... Es werden alle Datensätze älter x Tage gelöscht. ICh glaube Betateilchen hat diese mir im Rahmen seines Patches mitgeschickt...
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter