Hi Volker

> your comments were helpful, now I am 1 step further and reached the
> next challenge:
> https://lists.kamailio.org/mailman3/hyperkitty/list/sr-users@lists.kamailio.org/thread/JECBJH3OFCFQKHNURCPCBOX3S7SUX4XE/

Did you enable one of the DB modes?

/* enable DB persistency for location entries */
modparam("usrloc", "db_url", DBLOCAL)
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "use_domain", 0)

RPC functions are restricted in the reply size. I found by try and
error, that this limit is at about 1MB and I found no way to increase that 
limit.

We therefore took another approach and started building our own API
using the jansson module to directly access the database and only
return the information we are (or our customer service using our
diagnosis service) is interested in.

Here the snippet with might be interesting for you.

event_route[xhttp:request] {
    route(DEBUGINIT);
    if ($avp(debug) > 0) {
        xlog("L_INFO", "$cfg(route): XHTTP Request to URI: $hu Port: $Rp BODY: 
$rb\n");
    }
    if ($Rp != 8080) {
        xhttp_reply("403", "Forbidden", "text/html", "<html><body>Talk SIP to 
me dude!</body></html>");
        exit;
    }
    if ($hu =~ "^/RPC") {

        ### KAMAILIO JSONRCP passthrough

        jsonrpc_dispatch();
    } else if ($hu =~ "^/API") {

        ### CUSTOM API

        $var(json_reply) = "{}";
        jansson_get("method","$rb","$var(method)");
        jansson_get("id","$rb","$var(id)");
        jansson_set("string","jsonrpc","2.0","$var(json_reply)");
        jansson_set("string","id","$var(id)","$var(json_reply)");
        jansson_set("obj","result","{}","$var(json_reply)");

[...]

        } else if ($var(method) == "location.lookup.by_aor") {
                # Registration Lookup by AoR
                jansson_get("params[0]","$rb","$var(aor)");
                $var(query) = "SELECT 
username,contact,last_modified,expires,callid,user_agent from location"
                        " where username = '" + $var(aor) + "'";
                $var(query_result) = sql_query("localacc", 
"$var(query)","sql_res");
                if($dbr(sql_res=>rows)>0) {
                        $var(i)=0;
                        $var(aor_a) = '[]';
                        while($var(i)<$dbr(sql_res=>rows)) {
                                $var(aor_o) = '{}';
                                jansson_set("string","username",    
"$dbr(sql_res=>[$var(i),0])","$var(aor_o)");
                                jansson_set("string","contact",     
"$dbr(sql_res=>[$var(i),1])","$var(aor_o)");
                                
jansson_set("string","last_modified","$dbr(sql_res=>[$var(i),2])","$var(aor_o)");
                                jansson_set("string","expires",     
"$dbr(sql_res=>[$var(i),3])","$var(aor_o)");
                                jansson_set("string","callid",      
"$dbr(sql_res=>[$var(i),4])","$var(aor_o)");
                                jansson_set("string","user_agent",  
"$dbr(sql_res=>[$var(i),5])","$var(aor_o)");
                                
jansson_append("obj","","$var(aor_o)","$var(aor_a)");
                                $var(i) = $var(i) + 1;
                        }
                        
jansson_set("array","result","$var(aor_a)","$var(json_reply)");
                        sql_result_free("sql_res");
                } else {
                        jansson_set("string","result.error","No 
entries","$var(json_reply)");
                        sql_result_free("sql_res");
                }
        } else if ($var(method) == "location.list_all") {

[...]

} else {
                jansson_set("string","result.error","Unknown api 
call","$var(json_reply)");
        }

        ### SEND REPLY

        if ($avp(debug) > 0) {
                xlog("L_INFO", "$cfg(route): XHTTP Request to URI: $hu Method: 
$var(method) OK\n");
        }
        xhttp_reply("200", "OK", "application/json", "$var(json_reply)");
    } else {

        if ($avp(debug) > 0) {
                xlog("L_INFO", "$cfg(route): XHTTP Request to URI: $hu NOT 
FOUND\n");
        }
        xhttp_reply("404", "Not found", "", "");
    }
    return;
}

-- 
Mit freundlichen Grüssen

-Benoît Panizzon- @ HomeOffice und normal erreichbar
-- 
I m p r o W a r e   A G    -    Leiter Commerce Kunden
______________________________________________________

Zurlindenstrasse 29             Tel  +41 61 826 93 00
CH-4133 Pratteln                Fax  +41 61 826 93 01
Schweiz                         Web  http://www.imp.ch
______________________________________________________
__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions
To unsubscribe send an email to sr-users-le...@lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the 
sender!
Edit mailing list options or unsubscribe:

Reply via email to