Could not agree more with Rupa. mod_lcr is an awesome piece of software. Thank you Rupa for that.<br><br>JM<br><br><div class="gmail_quote">On Wed, Oct 14, 2009 at 10:36 AM, Rupa Schomaker <span dir="ltr">&lt;<a href="mailto:rupa@rupa.com">rupa@rupa.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">I would still suggest using mod_lcr for this...  If you have any real<br>
volume, use postgresql with the prefix module.<br>
<br>
It also supports IN lists, OR lists, optional quoting (since mysql is<br>
retarded), and custom sql so you can interface with whatever stored<br>
proc or deal with whatever database table you may need to support.<br>
<br>
It also supports multiple profiles (so you can charge different<br>
amounts based on some other criteria like account code) and...<br>
interstate/intrastate/intralata rating.  probably other stuff I forgot<br>
to mention...<br>
<br>
Let me just recommend to reuse what already exists and improve on that.<br>
<div><div></div><div class="h5"><br>
On Wed, Oct 14, 2009 at 8:22 AM, Muhammad Shahzad<br>
&lt;<a href="mailto:shaheryarkh@googlemail.com">shaheryarkh@googlemail.com</a>&gt; wrote:<br>
&gt; Oops, you are right, this is what happens when you are doing more then one<br>
&gt; thing at a time, i was writing a db function while replying in this email<br>
&gt; thread and confused LIKE with IN. There is one more mistake in my email if<br>
&gt; any one noticed, that is, string class in STL does not support negative<br>
&gt; length in method substr.<br>
&gt;<br>
&gt; Thanks for correction.<br>
&gt;<br>
&gt;<br>
&gt; On Wed, Oct 14, 2009 at 6:43 PM, Michael Giagnocavo &lt;<a href="mailto:mgg@giagnocavo.net">mgg@giagnocavo.net</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Wouldn’t that be SQL “IN” instead of LIKE?<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; First off, see if you can do this in memory. If it’s just a “rate sheet”<br>
&gt;&gt; list of prefixes + billing, it’s probably not that much data. I’d guess<br>
&gt;&gt; maybe 64-128 bytes per record (in Ruby it’s probably more, maybe 256 bytes?)<br>
&gt;&gt; inside a hashtable. Even so, we’re only talking about 1.5 to 3GB of RAM.<br>
&gt;&gt; Stick it in a nice performing dictionary of some sort and you’re set.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Just as a quick test, on one core of a Core2, it takes about 150ms to do<br>
&gt;&gt; 100K lookups against a 1M item hashtable (F#) – that’s just a 1 line loop I<br>
&gt;&gt; tried out with no optimization, doing about 650K/sec. For comparison on the<br>
&gt;&gt; same machine, looping on a simple “SELECT @@VERSION” command only achieved<br>
&gt;&gt; 5000 executions/second on a single thread – that’s just the SQL overhead (to<br>
&gt;&gt; a local SQL instance!).<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; If the memory usage is too excessive, consider caching only subsets of the<br>
&gt;&gt; prefixes. Keep track of which leading prefix (1 or 2 digits) are the most<br>
&gt;&gt; used, and keep those in memory. Have a reasonably fast DB to fall back to.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; If you’re sure the storage requirements or the change frequency truly<br>
&gt;&gt; eliminates keeping it in your own memory, here are some suggestions for<br>
&gt;&gt; working on DB performance:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; A little perf gain is to pre-calculate possible lengths, so you’re<br>
&gt;&gt; performing less lookups. Just have a table based on the first 2 or 3 digits,<br>
&gt;&gt; giving you the valid prefix lengths. That can easily cut down the number of<br>
&gt;&gt; lookups from 10-12 to, say, 3-4. Compare the perf of temp tables, CTEs, and<br>
&gt;&gt; dynamic SQL “IN”.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; But I would be hesitant to do this from a higher level ORM or via dynamic<br>
&gt;&gt; SQL queries:<br>
&gt;&gt;<br>
&gt;&gt; -          You’ll have a much harder time doing DB-specific<br>
&gt;&gt; optimizations/hints<br>
&gt;&gt;<br>
&gt;&gt; -          Dynamic SQL needs to be parsed each time (possibly minor issue)<br>
&gt;&gt;<br>
&gt;&gt; -          If the ad hoc queries are not properly parameterized, query<br>
&gt;&gt; plans might not get reused very well<br>
&gt;&gt;<br>
&gt;&gt; -          You can easily send many times more data to the server (your<br>
&gt;&gt; entire SQL, versus just the sproc name + parameters)<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Really look into doing programmability on the server. There’s all sorts of<br>
&gt;&gt; things you can do to minimize what you need to send to the database, and let<br>
&gt;&gt; the DB engine figure out the most efficient way. You might want to use a<br>
&gt;&gt; product that’s a bit more advanced than MySQL.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; And finally, test, test, test. You should have a nice benchmark with<br>
&gt;&gt; several million rows and be able to execute, say, 10-50K lookups (on<br>
&gt;&gt; multiple threads) after each change. Modify your query, execute it, _inspect<br>
&gt;&gt; the execution plan_. Check your indexes – make sure they are covering the<br>
&gt;&gt; query in the right way. (For example, if the table is (ID, Prefix, Price),<br>
&gt;&gt; you want an index of (Prefix, Price).) Review possible hints (for example,<br>
&gt;&gt; SQL Server usually needs a hint to choose a indexed view). Make sure your<br>
&gt;&gt; transaction level is set appropriately (can you do the query without<br>
&gt;&gt; locking?). Can you batch up several numbers in one command, saving on the<br>
&gt;&gt; per-command overhead?<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Also consider it in light of the rest of your application. If everything<br>
&gt;&gt; is in the same database, then you can probably do the entire rate call/save<br>
&gt;&gt; cdr/update balances in a single command and transaction.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; For us, our initial draft of routing inside SQL Server performed well<br>
&gt;&gt; under 100 calls/sec – not usable. After a few days of playing with things,<br>
&gt;&gt; it went over 1000 calls/sec, which is comfortable enough for a $500 server.<br>
&gt;&gt; This is matching 100 gateways and dialplans with several thousand entries<br>
&gt;&gt; per dialplan, across 4 million+ routes, doing QBR/LCR in the process.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; -Michael<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; From: <a href="mailto:freeswitch-users-bounces@lists.freeswitch.org">freeswitch-users-bounces@lists.freeswitch.org</a><br>
&gt;&gt; [mailto:<a href="mailto:freeswitch-users-bounces@lists.freeswitch.org">freeswitch-users-bounces@lists.freeswitch.org</a>] On Behalf Of Muhammad<br>
&gt;&gt; Shahzad<br>
&gt;&gt; Sent: Wednesday, October 14, 2009 1:55 AM<br>
&gt;&gt; To: <a href="mailto:freeswitch-users@lists.freeswitch.org">freeswitch-users@lists.freeswitch.org</a><br>
&gt;&gt; Subject: Re: [Freeswitch-users] Some help with my post-paid billing<br>
&gt;&gt; project<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; I fully agree that direct matching is much faster then pattern matching in<br>
&gt;&gt; SQL.<br>
&gt;&gt;<br>
&gt;&gt; One of my clients had same problem, he had around 12 million number<br>
&gt;&gt; prefixes in a table and during each call an AGI script use to query that<br>
&gt;&gt; table to find longest prefix match, but this use to take like 3-5 seconds<br>
&gt;&gt; even with indexed columns. So after a lots of R &amp; D we come up with<br>
&gt;&gt; following logic,<br>
&gt;&gt;<br>
&gt;&gt; 1. We break the destination number length-wise, e.g. suppose number is<br>
&gt;&gt; 923344224088 then length chunks would be,<br>
&gt;&gt;<br>
&gt;&gt; 923344224088, 92334422408, 9233442240, 923344224, 92334422, 9233442,<br>
&gt;&gt; 923344, 92334, 9233, 923, 92, 9<br>
&gt;&gt;<br>
&gt;&gt; 2. Then use SQL LIKE function in WHERE clause (you can also use SQL OR<br>
&gt;&gt; function if your DBMS doesn&#39;t support SQL LIKE function), and pass all these<br>
&gt;&gt; chunks to it, e.g.<br>
&gt;&gt;<br>
&gt;&gt; WHERE prefix LIKE (923344224088, 92334422408, 9233442240, 923344224,<br>
&gt;&gt; 92334422, 9233442, 923344, 92334, 9233, 923, 92, 9)<br>
&gt;&gt;<br>
&gt;&gt; 3. Lastly we ORDER the result by prefix length, e.g.<br>
&gt;&gt;<br>
&gt;&gt; ORDER BY LENGTH(prefix) DESC LIMIT 1<br>
&gt;&gt;<br>
&gt;&gt; 4. The complete query will be,<br>
&gt;&gt;<br>
&gt;&gt; SELECT * FROM prefixes<br>
&gt;&gt; WHERE prefix LIKE (923344224088, 92334422408, 9233442240, 923344224,<br>
&gt;&gt; 92334422, 9233442, 923344, 92334, 9233, 923, 92, 9)<br>
&gt;&gt; ORDER BY LENGTH(prefix) DESC LIMIT 1<br>
&gt;&gt;<br>
&gt;&gt; Now the query takes less then 150 ms to execute. :-)<br>
&gt;&gt;<br>
&gt;&gt; Here is an STL method that can generate this query, i am sure you can<br>
&gt;&gt; convert it to any programming language of your choice easily.<br>
&gt;&gt;<br>
&gt;&gt; =========================================================<br>
&gt;&gt; std::string GetQuery(std::string destination) {<br>
&gt;&gt;         std::string query = &quot;SELECT * FROM prefixes WHERE prefix LIKE (&#39;&quot;<br>
&gt;&gt; + destination;<br>
&gt;&gt;<br>
&gt;&gt;         for(int i=1; i&lt;destination.length(); i++) {<br>
&gt;&gt;                 query += &quot;&#39;,&#39;&quot; + destination.substr(0, (i * -1));<br>
&gt;&gt;<br>
&gt;&gt;         }<br>
&gt;&gt;<br>
&gt;&gt;         query += &quot;&#39;) ORDER BY LENGTH(prefix) DESC LIMIT 1&quot;;<br>
&gt;&gt;         return query;<br>
&gt;&gt; }<br>
&gt;&gt; =========================================================<br>
&gt;&gt;<br>
&gt;&gt; I am pretty sure this query is 100% ANSI SQL compatible<br>
&gt;&gt; (<a href="http://en.wikipedia.org/wiki/SQL" target="_blank">http://en.wikipedia.org/wiki/SQL</a>).<br>
&gt;&gt;<br>
&gt;&gt; Thank you.<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Oct 14, 2009 at 10:15 AM, Michael Giagnocavo &lt;<a href="mailto:mgg@giagnocavo.net">mgg@giagnocavo.net</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; In our testing with SQL Server, we found that executing several queries<br>
&gt;&gt; for direct matches yielded far better performance than one query trying to<br>
&gt;&gt; check prefixes. (The column was also part of the clustered index, but AFAIK<br>
&gt;&gt; MySQL doesn’t support defining your own clustered indexes; you get the PK<br>
&gt;&gt; always.)<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; -Michael<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; From: <a href="mailto:freeswitch-users-bounces@lists.freeswitch.org">freeswitch-users-bounces@lists.freeswitch.org</a><br>
&gt;&gt; [mailto:<a href="mailto:freeswitch-users-bounces@lists.freeswitch.org">freeswitch-users-bounces@lists.freeswitch.org</a>] On Behalf Of Diego<br>
&gt;&gt; Viola<br>
&gt;&gt; Sent: Tuesday, October 13, 2009 7:54 PM<br>
&gt;&gt; To: <a href="mailto:freeswitch-users@lists.freeswitch.org">freeswitch-users@lists.freeswitch.org</a><br>
&gt;&gt; Subject: Re: [Freeswitch-users] Some help with my post-paid billing<br>
&gt;&gt; project<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Wrong question.<br>
&gt;&gt;<br>
&gt;&gt; Is there a way to compare numbers with prefixes without using the prefix<br>
&gt;&gt; module?<br>
&gt;&gt;<br>
&gt;&gt; Diego<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Oct 14, 2009 at 1:36 AM, Diego Viola &lt;<a href="mailto:diego.viola@gmail.com">diego.viola@gmail.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; I&#39;m using MySQL now but I will try PostgreSQL with the prefix module, is<br>
&gt;&gt; there a way to do that without the prefix module and with regular SQL?<br>
&gt;&gt;<br>
&gt;&gt; Any examples?<br>
&gt;&gt;<br>
&gt;&gt; Diego<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Tue, Oct 13, 2009 at 10:45 PM, Even André Fiskvik &lt;<a href="mailto:grevenx@me.com">grevenx@me.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; What database are you using?<br>
&gt;&gt; You could do this with regular SQL, but it would by a costly operation,<br>
&gt;&gt; for PostgreSQL we&#39;re using the prefix module:<br>
&gt;&gt; <a href="http://pgfoundry.org/projects/prefix/" target="_blank">http://pgfoundry.org/projects/prefix/</a><br>
&gt;&gt;<br>
&gt;&gt; You can then match the closest prefix by using something like<br>
&gt;&gt; &quot;WHERE myprefix_col @&gt; caller_destination_number ORDER BY LENGTH<br>
&gt;&gt; (myprefix_col::text) LIMIT 1;&quot;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Best regards,<br>
&gt;&gt; Even André<br>
&gt;&gt;<br>
&gt;&gt; On 13. okt. 2009, at 23.53, Diego Viola wrote:<br>
&gt;&gt;<br>
&gt;&gt; &gt; Hello,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I&#39;m trying to write a post-paid billing script, I have the CDR on my<br>
&gt;&gt; &gt; database and also a &quot;rates&quot; table, the CDR contains fields like<br>
&gt;&gt; &gt; caller_destination_number, variable_duration, etc. and the rates<br>
&gt;&gt; &gt; table contains: destination, prefix, rate (cost).<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; The problem is that I can&#39;t just strip the destination number to<br>
&gt;&gt; &gt; take the prefix from it because I have to deal with destination<br>
&gt;&gt; &gt; numbers from different countries and they all have different prefix<br>
&gt;&gt; &gt; lengths... so I need to find another way to take the prefix from the<br>
&gt;&gt; &gt; destination number.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Any ideas how to do this?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Thanks,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Diego<br>
&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;&gt; &gt; _______________________________________________<br>
&gt;&gt; &gt; FreeSWITCH-users mailing list<br>
&gt;&gt; &gt; <a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
&gt;&gt; &gt; <a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
&gt;&gt; &gt; UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-</a><br>
&gt;&gt; &gt; users<br>
&gt;&gt; &gt; <a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; FreeSWITCH-users mailing list<br>
&gt;&gt; <a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
&gt;&gt; <a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
&gt;&gt; UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
&gt;&gt; <a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; FreeSWITCH-users mailing list<br>
&gt;&gt; <a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
&gt;&gt; <a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
&gt;&gt; UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
&gt;&gt; <a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; ________________________________________________________<br>
&gt;&gt; |<br>
&gt;&gt;                        |<br>
&gt;&gt; | FATAL ERROR<br>
&gt;&gt; --- O X |<br>
&gt;&gt; |_______________________________________________________|<br>
&gt;&gt; |                        You have moved the mouse.<br>
&gt;&gt;    |<br>
&gt;&gt; | Windows must be restarted for the changes to take effect.   |<br>
&gt;&gt; |                                        &lt;OK&gt;<br>
&gt;&gt;                  |<br>
&gt;&gt; ####################################/<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Muhammad Shahzad<br>
&gt;&gt; -----------------------------------<br>
&gt;&gt; CISCO Rich Media Communication Specialist (CRMCS)<br>
&gt;&gt; CISCO Certified Network Associate (CCNA)<br>
&gt;&gt; Cell: +92 334 422 40 88<br>
&gt;&gt; MSN: <a href="mailto:shari_786pk@hotmail.com">shari_786pk@hotmail.com</a><br>
&gt;&gt; Email: <a href="mailto:shaheryarkh@googlemail.com">shaheryarkh@googlemail.com</a><br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; FreeSWITCH-users mailing list<br>
&gt;&gt; <a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
&gt;&gt; <a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
&gt;&gt; UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
&gt;&gt; <a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; ________________________________________________________<br>
&gt; |<br>
&gt;                      |<br>
&gt; | FATAL ERROR                                                           ---<br>
&gt; O X |<br>
&gt; |_______________________________________________________|<br>
&gt; |                        You have moved the mouse.<br>
&gt;  |<br>
&gt; | Windows must be restarted for the changes to take effect.   |<br>
&gt; |                                        &lt;OK&gt;<br>
&gt;                |<br>
&gt; ####################################/<br>
&gt;<br>
&gt;<br>
&gt; Muhammad Shahzad<br>
&gt; -----------------------------------<br>
&gt; CISCO Rich Media Communication Specialist (CRMCS)<br>
&gt; CISCO Certified Network Associate (CCNA)<br>
&gt; Cell: +92 334 422 40 88<br>
&gt; MSN: <a href="mailto:shari_786pk@hotmail.com">shari_786pk@hotmail.com</a><br>
&gt; Email: <a href="mailto:shaheryarkh@googlemail.com">shaheryarkh@googlemail.com</a><br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; FreeSWITCH-users mailing list<br>
&gt; <a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
&gt; <a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
&gt; UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
&gt; <a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
&gt;<br>
&gt;<br>
<br>
<br>
<br>
</div></div>--<br>
<font color="#888888">-Rupa<br>
</font><div><div></div><div class="h5"><br>
_______________________________________________<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
</div></div></blockquote></div><br>