Die Asterisk-Datenbank

Asterisk bringt eine eingebaute Key-Value-Datenbank mit, die AstDB. Historisch basierte sie auf Berkeley DB; seit Asterisk 11 nutzt sie SQLite3 und speichert die Daten typischerweise unter /var/lib/asterisk/astdb.sqlite3. Das Daten-Modell ist unverändert: Jeder Eintrag besteht aus einer family (Gruppe), einem key und einem value.

Für komplexe Daten (User-Profile, Queue-Zustände, Realtime-Konfiguration) ist AstDB nicht das richtige Werkzeug. Dann lohnt sich ein Blick auf ARA (Asterisk RealTime Architecture) mit einer externen Datenbank wie PostgreSQL oder MySQL. AstDB ist für kleine, schnelle Key-Value-Aufgaben da: Call-Forwarding-Ziele, kleine Zähler, einfache Feature-Flags, Session-Merker.

Auf AstDB greifen Sie mit der Funktion DB() zu — sowohl lesend als auch schreibend.

Werte in die Datenbank schreiben

Die Funktion DB() kann innerhalb der Applikation Set() aufgerufen werden. Soll in der Family obst der Eintrag apfel den Wert 20 bekommen, so geschieht das mit folgendem Aufruf:

exten => 1234,1,Set(DB(obst/apfel)=20)

Werte aus der Datenbank lesen

Die Werte in der Datenbank können mit der Funktion DB() in der Form $\{DB(family/key)} abgerufen werden. Um den Inhalt des Eintrags apfel in der Family obst auf dem Command Line Interface auszugeben, kann man folgenden Aufruf ausführen:

exten => 1234,1,NoOp(obst/apfel hat den Wert ${DB(obst/apfel)})

Soll der Inhalt dieses Datenbankfeldes in der Variablen apfelmenge gespeichert werden, so kann dies mit Set() erfolgen:

exten => 1234,1,Set(apfelmenge=${DB(obst/apfel)})

Werte aus der Datenbank löschen

Einzelne Einträge werden über die Funktion DB_DELETE() gelöscht, ganze Familien über die Applikation DBdeltree().

Die frühere Applikation DBdel() ist aus aktuellen Asterisk-Versionen entfernt. Benutzen Sie stattdessen die Funktion DB_DELETE() innerhalb von NoOp() oder Set().

DB_DELETE()

DB_DELETE(family/key) liest den aktuellen Wert und löscht den Eintrag in einem Schritt. Der Rückgabewert lässt sich einfach mit NoOp() verwerfen, wenn er nicht gebraucht wird:

exten => 1234,1,NoOp(${DB_DELETE(obst/apfel)})

Oder man fängt den gelöschten Wert in einer Variablen auf:

exten => 1234,1,Set(ALTER_WERT=${DB_DELETE(obst/apfel)})
 same => n,NoOp(Geloescht wurde: ${ALTER_WERT})

DBdeltree()

Soll eine ganze Family gelöscht werden, so verwendet man DBdeltree(). Die Family obst kann mit

exten => 1234,1,DBdeltree(obst)

gelöscht werden.