ODBC_funktionsname
(arg1
[,arg2
[,...
]]])
func_odbc.conf
definierte
ODBC_...
()
-Funktionen.func_odbc.conf
können eigene Funktionen zum Lesen aus
einer und zum Schreiben in eine ODBC[225]-Datenbank definiert werden. Diese Funktionen stehen dann im
Dialplan als normale Funktionen zur Verfügung./etc/asterisk/res_odbc.conf
eingetragen werden:[meine_db_verbindung] dsn => meine_db_verbindung ;username => myuser ;password => mypass pre-connect => yes enabled => yes
pre-connect
besagt, dass die Verbindung zu
dieser Datenbank schon aufgebaut wird, bevor sie von einer Funktion benötigt
wird.*CLI> odbc show
Name: meine_db_verbindung
DSN: meine_db_verbindung
Pooled: no
Connected: yes
/etc/asterisk/func_odbc.conf
definiert. Jeder Abschnitt definiert eine eigene Funktion.
Funktionsnamen bestehen in Asterisk normalerweise immer aus Großbuchstaben.
Hier hat man die Wahl, das entweder so zu übernehmen oder Kleinbuchstaben zu
verwenden. Beachten Sie dabei, dass im Dialplan bei den Funktionsnamen
zwischen Groß- und Kleinschreibung unterschieden wird.[BEISPIEL]
definierte Funktion würde im
Dialplan als ODBC_BEISPIEL()
aufgerufen. Wer will, kann
durch Angabe von prefix=XYZ
auch ein anderes Präfix verwenden. Im Dialplan hieße die Funktion dann
XYZ_BEISPIEL()
.dsn=Datenquelle
.
Mit read=SQL-Abfrage
kann man
die SQL-Abfrage zum Lesen angeben (ab Asterisk 1.6:
readsql
), mit
write=SQL-Befehl
den
SQL-Befehl zum Schreiben (ab Asterisk 1.6:
writesql
).read
nur solche
Abfragen verwenden, die nicht mehr als eine Ergebniszeile zurückliefern,
denn auf die weiteren kann im Dialplan nicht zugegriffen werden. Ab
Asterisk 1.6 gibt es den optionalen Parameter
mode=multirow
, siehe Abschnitt D.68, „ODBC_FETCH()
“.CREATE TABLE `exfreundinnen` ( `callerid` varchar(20) character set ascii NOT NULL, `vorname` varchar(50) collate utf8_unicode_ci NOT NULL, `nachname` varchar(50) collate utf8_unicode_ci NOT NULL, UNIQUE KEY `callerid` (`callerid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
func_odbc.conf
:[ANTI_EXFREUNDIN] dsn = meine_db_verbindung read = SELECT COUNT(*) FROM `exfreundinnen` WHERE `callerid`='${SQL_ESC(${ARG1})}'
${ARG1}
, ${ARG2}
usw. übergeben. Dabei ist es
wichtig, Argumente (vor allem Strings) immer in einfachen Anführungszeichen
zu schreiben und wie im Beispiel mit SQL_ESC()
(Abschnitt D.96, „SQL_ESC()
“) zu maskieren.read
) würde im
Dialplan folgendermaßen aufgerufen:20 => {
// Lesen:
Set(ARRAY(anz)=${ODBC_ANTI_EXFREUNDIN(${CALLERID(num)})});
Verbose(1,### ODBC-Ergebnis: ${anz});
if ("${anz}" != "0") {
Busy(5);
}
else {
Dial(SIP/xyz);
}
Hangup();
}
CREATE TABLE `kontakte` ( `telnr` varchar(20) character set ascii NOT NULL, `vorname` varchar(50) collate utf8_unicode_ci NOT NULL, `nachname` varchar(50) collate utf8_unicode_ci NOT NULL, UNIQUE KEY `telnr` (`telnr`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
func_odbc.conf
:[RUECKWAERTSSUCHE] dsn = meine_db_verbindung read = SELECT `vorname`, `nachname` FROM `kontakte` WHERE `telnr`='${SQL_ESC(${ARG1})}'
_X. => {
// Lesen:
Set(ARRAY(vn,nn)=${ODBC_RUECKWAERTSSUCHE(${CALLERID(num)})});
Verbose(1,### ODBC-Ergebnis: ${vn}\,${nn});
Set(CALLERID(name)=${vn} ${nn});
Dial(SIP/${EXTEN});
Hangup();
}
ODBC_*
-Funktionen an, statt
mit ARRAY()
mit HASH()
(Abschnitt D.43, „HASH()
“) zu arbeiten. Beispiel:Set(HASH(kontakt)=${ODBC_RUECKWAERTSSUCHE(${CALLERID(num)})}); Verbose(1,### Vorname : ${HASH(kontakt,vorname)}); Verbose(1,### Nachname : ${HASH(kontakt,nachname)});
CREATE TABLE `dndstates` ( `extension` varchar(4) character set ascii NOT NULL, `dnd` tinyint(1) unsigned NOT NULL default '0', `modified` int(10) unsigned NOT NULL default '0', PRIMARY KEY (`extension`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
func_odbc.conf
:[DND] dsn = meine_db_verbindung read = SELECT `dnd`, `modified` FROM `dndstates` WHERE `extension`='${SQL_ESC(${ARG1})}' write = REPLACE INTO `dndstates` SET `extension`='${SQL_ESC(${ARG1})}', `dnd`='${SQL_ESC(${VAL1})}', `modified`='${SQL_ESC(${VAL2})}'
// DND aktivieren/deaktivieren _*2[01] => { Set(an_aus=${EXTEN:2:1}); Set(nst=${CALLERID(num)}); if (${LEN(${nst})} < 5) { Verbose(1,### Setze DND fuer Nst. ${nst} auf ${an_aus}); // Schreiben: Set(ODBC_DND(${nst})=${an_aus}\,${EPOCH}); } Hangup(); } // Nst. anrufen _X. => { // Lesen: Set(ARRAY(dnd,modified)=${ODBC_DND(${EXTEN})}); if ("${dnd}" = "1") { Verbose(1,### DND fuer Nst. ${EXTEN} ist aktiviert seit ${STRFTIME(${modified},Europe/Berlin,%c)}); Busy(5); } else { Verbose(1,### DND fuer Nst. ${EXTEN} ist nicht aktiviert); Dial(SIP/${nst}); } Hangup(); }
\,
“ getrennt werden müssen.func_odbc.conf
definieren lässt, ist folgendes Konstrukt:[SQL] dsn = meine_db_verbindung read = ${ARG1} write = ${ARG1}
func_odbc.conf
festgelegt
wurden. Dabei ist natürlich zu beachten, dass das Maskieren von
Sonderzeichen mit SQL_ESC()
dann im Dialplan erfolgen
muss. Das obige Beispiel zur Rückwärtssuche ließe sich also auch so
realisieren:_X. => {
// Lesen:
Set(ARRAY(vn,nn)=${ODBC_SQL(SELECT `vorname`\, `nachname` FROM `kontakte` WHERE `telnr`='${SQL_ESC(${CALLERID(num)})}')});;
Verbose(1,### ODBC-Ergebnis: ${vn} ${nn});
Set(CALLERID(name)=${vn} ${nn});
Dial(SIP/${EXTEN});
Hangup();
}
,
“) im SQL-Befehl maskiert werden
müssen, also als „\,
“ geschrieben
werden.| | | 1.4 |————————| 1.6 |————————
-= Info about function 'ODBC_funktionsname
' =-
[Syntax]
ODBC_funktionsname
(<arg1>[...[,<argN>]])
[Synopsis]
Runs the referenced query with the specified arguments
[Description]
Runs the following query, as defined in func_odbc.conf, performing
substitution of the arguments into the query as specified by ${ARG1},
${ARG2}, ... ${ARGn}. When setting the function, the values are provided
either in whole as ${VALUE} or parsed as ${VAL1}, ${VAL2}, ... ${VALn}.
[...]
ODBC_SQL()
“, Abschnitt D.68, „ODBC_FETCH()
“, Abschnitt D.96, „SQL_ESC()
“,
Abschnitt D.43, „HASH()
“, Abschnitt D.3, „ARRAY()
“[226] Genauer gesagt: unixODBC, http://www.unixodbc.org/, http://packages.debian.org/stable/unixodbc
[227] Alternative Methode zum Abfragen der registrierten Treiber:
odbcinst -q -d
[228] Für weitere Beispiele siehe
/usr/share/doc/libmyodbc/examples/odbc.ini
[229] Spezifische Optionen für den MySQL-ODBC-Treiber MyODBC können Sie unter http://dev.mysql.com/doc/refman/5.1/de/myodbc-configuration-connection-parameters.html nachlesen.
[230] Weitere Informationen zu MyODBC-Datentypen: http://dev.mysql.com/doc/refman/5.1/de/myodbc-reference-datatypes.html, Fehlercodes: http://dev.mysql.com/doc/refman/5.1/de/myodbc-reference-errorcodes.html