Alarmmeldungen auslösen


Aufgabenstellung

Individuelle Datenbanken (Custom Databases) sind ein herausragendes Merkmal von todo4teams, um aus Skripten heraus auf eine Datenbank zuzugreifen.
Der große Vorteil hierbei ist, dass die Datenbanken problemspezifische Lösungen sehr stark vereinfachen.
In unserem Beispiel wollen wir z.B. eine Datenbank anlegen, um Alarmmeldungen zu verwalten.
So soll durch eine E-Mail mit einer bestimmten Kennung eine oder mehrere Alarm-SMS an einen bestimmten Benutzerkreis versandt werden.
Allerdings sollen nur dann diese Alarm-SMS versandt werden, wenn dies innerhalb der letzten 15 Minuten nicht bereits geschehen ist.

Schritt 1: Definieren der Servereigenschaft

Im ersten Schritt legen wir dazu eine Servereigenschaft an,
die zwei wichtige Eigenschaften der neu zu erstellenden Datenbank in ihrem Wert enthält.
Das ist zum einen der Name der Datenbank, definiert über die Variable dbname, zum anderen das Verzeichnis,
in dem die Dateien der Datenbank abgelegt werden sollen. Dies wird über die Variable basedir festgelegt:

dbname=AlarmMessageDB
basedir=/tmp/alarmmessagedb

customdbserverproperty.png

Schritt 2: Anlegen der benötigten Tabellen

Dann meldet man im Web-Frontend von todo4teams an und wechselt in den Reiter "Custom-DB".
Dort sollte die Datenbank AlarmMessageDB bereits angeboten werden.
Jetzt legt man z.B. die Tabelle alarmmessage an. Dazu wird, wie bei relationalen Datenbanken üblich,
die SQL Syntax verwendet:

CREATE TABLE alarmmessage (smssend BOOLEAN, eventdate TIMESTAMP)

customdbcreatetable.png

Mit dem Befehl SHOW TABLES kann man sich alle Tabellen der Datenbank anzeigen lassen.

Schritt 3: Zugriff auf die Datenbank aus einem Skript heraus

Um jetzt beim Eintreffen einer neuen E-Mail darauf zu prüfen, ob in der letzten 15 Minuten bereits eine E-Mail eingetroffen ist,
kann in einem E-Mail Eingang folgendes Skript benutzt werden:

var sender=message.getFrom()[0].getAddress().toLowerCase();
var subject=message.getSubject();

// email received that triggers sending alarm
if (subject.contains("send alarm message") && sender.contains("@bergener-bluma.de"))
{
   // fetch last alarm messages from database
   var con  = helper.getCustomDB("AlarmMessageDB");
    var selectStmt = con.createStatement();
    var lastMessages = selectStmt.executeQuery("SELECT smssend from alarmmessage " +
                      "WHERE ABS({fn timestampdiff(SQL_TSI_MINUTE, CURRENT_TIMESTAMP, eventdate)})<15 and smssend=true");
    var updateStmt = con.createStatement();
   if (lastMessages.next())// no alarm send because we found message younger than 15 minutes
   {
       updateStmt.execute("INSERT INTO alarmmessage(smssend,eventdate) VALUES (false, CURRENT_TIMESTAMP)");
   }
   else // sending alarm now
   {
       helper.sendSMS("foo", "baa", "017123456789", "Alarm email received!", "016123456789");
       updateStmt.execute("INSERT INTO alarmmessage(smssend,eventdate) VALUES (true, CURRENT_TIMESTAMP)");
   }
    selectStmt.close();
    updateStmt.close();
}
     

Unterseiten