Kamailio-与数据库的交互

Kamailio MySQL PostgreSQL JDBC

Posted by Claire on October 21, 2024

对于Kamailio连接数据库,今天介绍3种可用的工具,来解决一些问题:

db_mysql

使用逻辑很简单,引入模块、配置连接信息、调用函数进行增删改查

加载这个模块需要额外的开发库版本支持,一些Linux服务器上是"libmysqlclient-dev",如果是MariaDB的话,叫"libmariadbclient-dev".

  • ping_interval (integer) 存活检测,单位是秒,默认5 min
  • server_timezone 时区,如果Kamailio和数据库不在同一个地区,那么这就是必要的
  • timeout_interval 超时时间,包括连接超时、读写超时,系统会重试3次,默认2秒/次,也就是默认超时是6秒
  • auto_reconnect 是否自动重连,默认是1,自动重连
  • insert_delayed 是否延迟插入,默认是0,不延迟,如果设置为1,所有去MySQL的插入都是延迟的
  • update_affected_found (integer) update操作是否返回影响的行数,默认不返回,那么你只能得到一个updated表示执行过了的结果,而不是准确的行数
  • opt_ssl_mode 连接ssl模式,1开启,0关闭
  • opt_ssl_ca ssl模式的ca证书

MySQL作为一个基础的存储截止,在其余模块中可以引用,使用模块内的逻辑读写对应的表 后续举例

db_postgres

posgresql是类似的,也是需要额外的开发库来支持连接

  • ostgreSQL library - e.g., libpq5.
  • PostgreSQL devel library - to compile the module (e.g., libpq-dev).

具体看你使用的Linux系统进行安装即可

同样也是包含了重试、超时等基础参数

  • retries (integer) 重试次数,默认是2
  • timeout (integer) 超时时间
  • tcp_keepalive (integer) 主要针对于“TCP_KEEPIDLE” socket 选项
  • lockset (integer) 锁的数量,默认是2的次方,默认值4,也就是16
  • bytea_output_escape (integer) 是否应请求转义 bytea 字段的输出
  • con_param (str) url连接额外参数 比如:connect_timeout=15;tcp_user_timeout=5000

使用也是同MySQL,后续举例

数据库使用的样例

话单模块,直接引入DBURL,即可使用数据库模块进行库表数据的读写

modparam("acc", "db_url", DBURL)

其他模块也是直接引入,做数据存储:

modparam("usrloc", "db_url", DBURL) modparam("auth_db", "db_url", DBURL) modparam("permissions", "db_url", DBURL)

sqlops

这个是用于原始jdbc sql查询的组件,可以支持:

  • 多数据库连接
  • 多个查询结果
  • 通过伪变量获取数据
  • 通过数组获取结果
  • 在同一个工作进程中,一个结果可以被多次使用
  • 查询结果可以转存xavps里,虽事务上下文被清理,减少手动处理

不需要额外的开发库,引入后即可使用

数据连接

modparam("sqlops","sqlcon","cb=>mysql://kamailio:kamailiorw@localhost/kamailio")
modparam("sqlops","sqlcon","ca=>dbdriver://username:password@dbhost/dbname")
  • cb,ca是连接的名称,用于后续使用,命名要浅显易懂直观
  • 紧接着就是数据库的常规连接信息

获取数据

sqlres (str),设置SQL返回数据集的结果ID

results_maxsize (int) 结果数量的上限,默认32

其他属性

tr_buf_size (int),SQL操作转换大小,默认2048

log_buf_size (int) 记录原始 SQL 操作时的缓冲区大小 (字符),默认128

connect_mode (int) 0-启动时连接失败则启动失败,1-启动时连接失败依旧启动

如何查询?

sql_query(), sql_xquery() and sql_pvquery() 三种查询方式,参数主要就是connection, query[, result],提供连接信息,书写查询条件,获取查询结果。三个主要是在最终获取查询结果的环节有差异。

modparam("sqlops","sqlcon","ca=>dbdriver://username:password@dbhost/dbname")

#获取一次,需要释放
sql_query("ca", "select * from domain", "ra");
xlog("number of rows in table domain: $dbr(ra=>rows)\n");
sql_result_free("ra");

#可获取多次,与事务绑定,无需手动释放
sql_xquery("ca", "select * from domain", "ra");
xlog("first domain: $xavp(ra=>domain) with id: $xavp(ra=>domain_id)\n");
...
if (sql_xquery("ca", "select * from domain", "ra") == 1) {
    xlog("domain: $xavp(ra=>domain) with id: $xavp(ra=>domain_id)\n");
}

#可一次性获取多个参数值,承载结果的对象必须是可写入的
sql_pvquery("ca", "select 'col1', 2, NULL, 'sip:test@example.com'",
	"$var(a), $avp(col2), $xavp(item[0]=>s), $ru");

sql_result_free(result) 用于释放查询结果

sql_query_async 异步查询

一些伪变量

在查询的时候,也有看到,会出现 $dbr(ra=>rows) 这样的取值方式,那么有哪些其他的参数值可选呢?

  • rows - 返回查询的数量
  • cols - 返回查询结果的列数
  • [row,col] - 返回指定【行,列】的数据,类似二维数组
  • colname[N] - 返回指定某一列的数据集

$sqlrows(con) 通常用于返回在insert\update\delete操作下影响的数据库行数