Logo: monitord

Das mySQL-Plugin

Einleitung

Der monitord kann mit dem mySQL-Plugin (wie der Name schon sagt) zu einer mySQL-Datenbank connecten und empfangene Tonfolgen und Telegramme darin speichern. In den hier im Handbuch erklärten Beispielen wird davon ausgegangen, dass eine mySQL-Datenbank auf einem mySQL-Server auf demselben Host wie der monitord läuft (localhost), und dass ein Datenbank-Benutzer namens "monitord" mit dem Passwort "monitord" existiert.

Verfügbare Telegramm-Elemente

Die Auswerter geben gewisse Resultsets zurück. Diese sind sowohl im Konfigurations-Block zum mySQL-Plugin verwertbar (ihre Inhalte können in die Datenbank geschrieben werden), im Kapitel zu LUA-Filterskripten werden sie in Form eines Arrays auch noch einmal auftreten. Für alle bestehenden Auswerter ist hier angegeben, welche Felder zur Speicherung bzw. für Filter und ähnliches zur Verfügung stehen.

ZVEI-Fünftonfolgen

FMS-Telegramme

POCSAG-Telegramme

mySQL-Plugin-Konfiguration in der monitord.xml

Zunächst bilden wir hier den relevanten Bereich aus der monitord.xml ab, der das mySQL-Plugin konfiguriert:

<dataplugins>
 <!-- Daten Plugin -->
 <plugin name="mysql">
	<file> plugins/libmplugin_mysql-0.dll</file>
  	<parameters>
  		<logfile> mysql.log </logfile>
		<loglevel> DEBUG </loglevel>
		<hostname> localhost</hostname>
		<port> 3306 </port>
		<username> monitord </username>
		<password> monitord </password>
		<database> monitord </database>

		<!---- 
		Attribut name=XYZ": Zielfeld in der mySQL Tabelle
		Attribut source="mysql": Inhalt nicht aus dem Resultset nehmen, 
		sondern "AS IS", also im Klartext als Parameter einfuegen (default="result")
		Wert des Tags: Feldname im Resultset oder Klartext(je nach Attribut source)
		Beispiele:
		<field name="Uhrzeit" 		source="mysql"	> NOW() </field>
			(laesst MySQL die aktuelle Uhr Zeit in das Feld "Uhrzeit" einfuegen)
		<field name="Typ" 			source="mysql"	> "T" </field>
			(fuegt ein "T" in das Feld "Typ" ein)
		<field name="Meldung"> text </field>
			(fuegt das Element "text" aus dem Resultset in das Feld "Meldung" ein)
		--->

		<mapping typ="fms"> 
			<table> monitord_fms </table>
			<field name="uhrzeit" source="mysql"> now() </field>
			<field name="status"> statusdezimal </field>
			<field name="kennung"> fmskennung </field>
			<field name="richtung"> richtung </field>
			<field name="text"> textuebertragung </field>
			<field name="tki"> tki </field>
			<field name="quelle"> channelnum </field>
		</mapping>

		<mapping typ="pocsag"> 
			<table> monitord_pocsag </table>
			<field name="uhrzeit" source="mysql"> now() </field>
			<field name="kennung"> ric </field>
			<field name="sub"> sub </field>
			<field name="text"> text </field>
			<field name="quelle"> channelnum </field>
		</mapping>
		
		<mapping typ="zvei"> 
			<table> monitord_zvei </table>
			<field name="uhrzeit" source="mysql"> now() </field>
			<field name="typ"> weckton </field>
			<field name="kennung"> zvei </field>
			<field name="text"> text </field>
			<field name="quelle"> channelnum </field>
		</mapping>
	</parameters>

 </plugin>
</dataplugins>

Das mySQL-Plugin kann einmal oder auch mehrmals (z.B. zur Verbindung zu mehreren Datenbanken) eingebunden werden. Wichtig ist dabei ein eindeutiger Identifier, der im "name"-Attribut des "plugin"-Tags notiert wird.

CREATE TABLE-Beispiele

Für die oben gezeigte Konfiguration des mySQL-Plugins müssen natürlich passende Tabellen bestehen. Entsprechende CREATE TABLE-Statements sind hier kurz zusammen gefasst. Die Datenfelder sind so definiert, dass es nicht zu Problemen kommen sollte - wir empfehlen, alle drei Tabellen anzulegen, auch wenn z.B. "vorerst" nur Fünftonfolgen abgelegt werden sollen: Fügt man später weitere Auswerter hinzu oder nutzt ein an diese Struktur angepasstes Web-Frontend, kommt es nicht zu Fehlern, die durch die Anlage und Speicherung einer leeren Tabelle vermeidbar wären.

DROP TABLE IF EXISTS `monitord_fms`;
CREATE TABLE  `monitord_fms` (
  `id` int(11) NOT NULL auto_increment,
  `uhrzeit` datetime NOT NULL,
  `status` smallint(2) unsigned default NULL,
  `kennung` varchar(9) collate latin1_german1_ci NOT NULL,
  `richtung` char(10) collate latin1_german1_ci NOT NULL,
  `text` varchar(255) collate latin1_german1_ci NOT NULL,
  `tki` char(1) collate latin1_german1_ci NOT NULL default '',
  `quelle` varchar(2) collate latin1_german1_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;

DROP TABLE IF EXISTS `monitord_pocsag`;
CREATE TABLE  `monitord_pocsag` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `uhrzeit` datetime NOT NULL,
  `kennung` varchar(45) collate latin1_german1_ci NOT NULL,
  `sub` varchar(45) collate latin1_german1_ci NOT NULL,
  `text` varchar(500) collate latin1_german1_ci NOT NULL,
  `quelle` tinyint(2) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;

DROP TABLE IF EXISTS `monitord_zvei`;
CREATE TABLE  `monitord_zvei` (
  `id` int(11) NOT NULL auto_increment,
  `uhrzeit` datetime NOT NULL,
  `kennung` varchar(5) collate latin1_german1_ci NOT NULL,
  `typ` char(1) collate latin1_german1_ci NOT NULL,
  `text` varchar(80) collate latin1_german1_ci NOT NULL,
  `quelle` varchar(2) collate latin1_german1_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;

Automatisches Löschen

MySQL ist in der Version 5 in der Lage, auch so genannte Trigger zu verwenden. Die hier gezeigten Zeilen legen Trigger an, die bei Einfügeoperationen durch den monitord bei den anderen(!) Tabellen dafür sorgen, dass alle Einträge, die älter als 8 Tage sind, gelöscht werden. Natürlich kann die Zeitspanne angepasst werden.

CREATE TRIGGER autodel_fms AFTER INSERT ON monitord_zvei FOR EACH ROW
    DELETE FROM monitord_fms WHERE uhrzeit < DATE_SUB(NOW(), INTERVAL '8' DAY);
    
CREATE TRIGGER autodel_zvei AFTER INSERT ON monitord_fms FOR EACH ROW
    DELETE FROM monitord_zvei WHERE uhrzeit < DATE_SUB(NOW(), INTERVAL '8' DAY);
	
CREATE TRIGGER autodel_pocsag AFTER INSERT ON monitord_fms FOR EACH ROW
    DELETE FROM monitord_pocsag WHERE uhrzeit < DATE_SUB(NOW(), INTERVAL '8' DAY);

Es sei erwähnt, dass hier der monitord keinerlei Arbeit leisten muss, das Löschen geschieht datenbankintern nach dem Einfügen eines neuen Datensatzes in die jeweilige Tabelle. Es ist allerdings nicht möglich, in der Tabelle Daten zu löschen, in der gerade das INSERT-Statement verarbeitet wurde.

© monitord.de - http://www.monitord.de/index.php?article=4 - 03.10.2019