Module: sip-router
Branch: master
Commit: d947e7528ff1fc2693d04657592f37f6b2f97b4e
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=d947e75…
Author: Alex Hermann <alex(a)speakup.nl>
Committer: Alex Hermann <alex(a)speakup.nl>
Date: Tue Aug 9 12:31:48 2011 +0200
modules_k/sqlops: new PV $sqlrows return affected rows of previous query
The PV $sqlrows(<con>) returns the number of affected rows of the
previous UPDATE, INSERT or DELETE query on the specified connection.
---
modules_k/sqlops/README | 20 +++++++++++++++
modules_k/sqlops/doc/sqlops_admin.xml | 25 ++++++++++++++++++-
modules_k/sqlops/sql_api.c | 43 +++++++++++++++++++++++++++++++++
modules_k/sqlops/sql_api.h | 4 +++
modules_k/sqlops/sqlops.c | 2 +
5 files changed, 93 insertions(+), 1 deletions(-)
diff --git a/modules_k/sqlops/README b/modules_k/sqlops/README
index 75379b9..d0de106 100644
--- a/modules_k/sqlops/README
+++ b/modules_k/sqlops/README
@@ -38,6 +38,7 @@ Daniel-Constantin Mierla
5. Exported pseudo-variables
5.1. $dbr(result=>key)
+ 5.2. $sqlrows(con)
List of Examples
@@ -47,6 +48,7 @@ Daniel-Constantin Mierla
1.4. sql_xquery() usage
1.5. sql_result_free() usage
1.6. $dbr(result=>key) usage
+ 1.7. $sqlrows(con) usage
Chapter 1. Admin Guide
@@ -72,6 +74,7 @@ Chapter 1. Admin Guide
5. Exported pseudo-variables
5.1. $dbr(result=>key)
+ 5.2. $sqlrows(con)
1. Overview
@@ -224,6 +227,7 @@ sql_result_free("ra");
5. Exported pseudo-variables
5.1. $dbr(result=>key)
+ 5.2. $sqlrows(con)
5.1. $dbr(result=>key)
@@ -290,3 +294,19 @@ if (sql_xquery("ca", "select * from domain",
"ra") == 1)
}
}
...
+
+5.2. $sqlrows(con)
+
+ Number of affected rows of the previous query on the specified
+ connection. Its primary use is to get the number of rows affected by
+ UPDATE, INSERT and DELETE queries.
+
+ “con” must be the name identifying an SQL connection.
+
+ Example 1.7. $sqlrows(con) usage
+...
+modparam("sqlops","sqlcon","ca=>dbdriver://username:password@dbhost/dbname")
+...
+sql_query("ca", "update domain set domain='mydomain' where
id=5");
+xlog("Affected rows: $sqlrows(ca)\n");
+...
diff --git a/modules_k/sqlops/doc/sqlops_admin.xml
b/modules_k/sqlops/doc/sqlops_admin.xml
index a0a8512..f8bd3e6 100644
--- a/modules_k/sqlops/doc/sqlops_admin.xml
+++ b/modules_k/sqlops/doc/sqlops_admin.xml
@@ -379,7 +379,30 @@ if (sql_xquery("ca", "select * from domain",
"ra") == 1)
...
</programlisting>
</example>
- </section>
+ </section>
+ <section>
+ <title><varname>$sqlrows(con)</varname></title>
+ <para>
+ Number of affected rows of the previous query on the
+ specified connection. Its primary use is to get the number
+ of rows affected by UPDATE, INSERT and DELETE queries.
+ </para>
+ <para>
+ <quote>con</quote> must be the name identifying an SQL
+ connection.
+ </para>
+ <example>
+ <title><function moreinfo="none">$sqlrows(con)</function>
usage</title>
+ <programlisting format="linespecific">
+...
+modparam("sqlops","sqlcon","ca=>&exampledb;")
+...
+sql_query("ca", "update domain set domain='mydomain' where
id=5");
+xlog("Affected rows: $sqlrows(ca)\n");
+...
+ </programlisting>
+ </example>
+ </section>
</section>
</chapter>
diff --git a/modules_k/sqlops/sql_api.c b/modules_k/sqlops/sql_api.c
index ef69071..a61b00a 100644
--- a/modules_k/sqlops/sql_api.c
+++ b/modules_k/sqlops/sql_api.c
@@ -96,6 +96,49 @@ int sql_init_con(str *name, str *url)
return 0;
}
+int pv_parse_con_name(pv_spec_p sp, str *in)
+{
+ sql_con_t *con;
+
+ if(sp==NULL || in==NULL || in->len<=0)
+ return -1;
+
+ con = sql_get_connection(in);
+ if (con==NULL) {
+ LM_ERR("invalid connection [%.*s]\n", in->len, in->s);
+ return -1;
+ }
+
+ sp->pvp.pvn.type = PV_NAME_INTSTR;
+ sp->pvp.pvn.u.isname.type = AVP_VAL_STR;
+ sp->pvp.pvn.u.isname.name.s = *in;
+ return 0;
+}
+
+int pv_get_sqlrows(struct sip_msg *msg, pv_param_t *param,
+ pv_value_t *res)
+{
+ sql_con_t *con;
+ str* sc;
+
+ sc = ¶m->pvn.u.isname.name.s;
+ con = sql_get_connection(sc);
+ if(con==NULL)
+ {
+ LM_ERR("invalid connection [%.*s]\n", sc->len, sc->s);
+ return -1;
+ }
+
+ if (!DB_CAPABILITY(con->dbf, DB_CAP_AFFECTED_ROWS))
+ {
+ LM_ERR("con: %p database module does not have DB_CAP_AFFECTED_ROWS
[%.*s]\n",
+ con, sc->len, sc->s);
+ return -1;
+ }
+
+ return pv_get_sintval(msg, param, res, con->dbf.affected_rows(con->dbh));
+}
+
int sql_connect(void)
{
sql_con_t *sc;
diff --git a/modules_k/sqlops/sql_api.h b/modules_k/sqlops/sql_api.h
index ce00672..c198eee 100644
--- a/modules_k/sqlops/sql_api.h
+++ b/modules_k/sqlops/sql_api.h
@@ -77,6 +77,10 @@ int sql_do_query(sql_con_t *con, str *query, sql_result_t *res);
int sql_do_xquery(struct sip_msg *msg, sql_con_t *con, pv_elem_t *query,
pv_elem_t *res);
#endif
+int pv_get_sqlrows(struct sip_msg *msg, pv_param_t *param,
+ pv_value_t *res);
+int pv_parse_con_name(pv_spec_p sp, str *in);
+
sql_con_t* sql_get_connection(str *name);
sql_result_t* sql_get_result(str *name);
diff --git a/modules_k/sqlops/sqlops.c b/modules_k/sqlops/sqlops.c
index a34a7d9..5bb4b2f 100644
--- a/modules_k/sqlops/sqlops.c
+++ b/modules_k/sqlops/sqlops.c
@@ -80,6 +80,8 @@ static int sql_res_param(modparam_t type, void* val);
static pv_export_t mod_pvs[] = {
{ {"dbr", sizeof("dbr")-1}, PVT_OTHER, pv_get_dbr, 0,
pv_parse_dbr_name, 0, 0, 0 },
+ { {"sqlrows", sizeof("sqlrows")-1}, PVT_OTHER, pv_get_sqlrows, 0,
+ pv_parse_con_name, 0, 0, 0 },
{ {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
};