FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Icinger am 09 März 2014, 10:15:49

Titel: Aufruf von Stored Procedures per DbLog/Usercommand
Beitrag von: Icinger am 09 März 2014, 10:15:49
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
Titel: Antw:Aufruf von Stored Procedures per DbLog/Usercommand
Beitrag von: betateilchen am 09 März 2014, 20:30:37
Meine Hellseh-Glaskugel ist grade in der Werkstatt...

Was kommt denn als Ergebnis? Irgendwelche Fehlermeldungen im Log?
Titel: Antw:Aufruf von Stored Procedures per DbLog/Usercommand
Beitrag von: Icinger am 10 März 2014, 14:28:29
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 :)
Titel: Antw:Aufruf von Stored Procedures per DbLog/Usercommand
Beitrag von: betateilchen am 10 März 2014, 14:34:22
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.
Titel: Antw:Aufruf von Stored Procedures per DbLog/Usercommand
Beitrag von: Icinger am 10 März 2014, 15:08:47
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
Titel: Antw:Aufruf von Stored Procedures per DbLog/Usercommand
Beitrag von: Tobias am 16 März 2014, 07:58:06
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...