Hello,
On 1/20/10 6:10 PM, Alex Balashov wrote:
Marco,
On 01/20/2010 10:53 AM, Marco Bungalski wrote:
Hello all :-)
I have a question about how to get a time-stamps with milliseconds. To
create my own CDR's, i write to my databases timestamps, with a command
like this:
sql_query("ca", "UPDATE active_calls SET state = 'BILLING',
end_time=$Ts
WHERE call_id='$ci'", "ra");
I use the "$Ts"-variable, but with this i can get only "full"
seconds.
But i need milliseconds for my billing-system. Otherwise i have
differences between my CDR's and my carrier's one.
Example: A call has a duration of 0.2 seconds. In my CDR start- and
endtime is the same (=0 seconds), to my carrier a have 1 second to
pay ;-)
Is there a possibility to get a time-stamp or time with milliseconds?
I do not know of any pseudovariables in Kamailio that expose the wall
clock time in milliseconds.
indeed it is none now. Could be added to the broken-time PV class in the
future, not a big effort.
Just for general, $Ts is cached, it will return same value during config
processing of same message (value taken when $Ts is evaluated firt time
for a message), $TS is time snapshot everytime.
For now solution for this case is what you propose - use DB specific
functions.
Cheers,
Daniel
One thing you have to keep in mind, though, is that even if such a
facility were available - for example, it would be relatively simple
to expose via pseudovariables the microsecond values returned by
gettimeofday() down to the nearest millisecond - it would not always
be so precise. The accuracy and resolution of userspace clocks can be
distorted and unpredictable and depends on many things. While this
would probably not affect you if you're interested in a 1/10th second
granularity at most, it is still something to consider.
To solve your problem, I suggest that you not update your records with
values from $Ts. Instead, do it as the 'acc' module does and use the
wall clock time from the database itself, which does go down to the
sub-second level in the manner suggested by ISO timestamps.
The function NOW() is available in both MySQL and PostgreSQL, and
probably most other RDBMs. It returns a date string in the native
timestamp format used within those RDBMs. In Postgres, which I am
most familiar with, this type is 'timestamp'. I think in MySQL it may
be called something else.
So, for example, on 200 OK/pickup:
UPDATE cdr SET start_time = NOW(), ... WHERE call_id = $ci;
And on BYE:
UPDATE cdr SET end_time = NOW(), ... WHERE call_id = $ci;
Making the calculation (end_time - start_time) within the database,
cast and rounded appropriately by various mathematical functions
provided therein, would allow you to do the rounding up and/or the
application of fractional increments you're looking for.
I personally use triggers and stored procedures on the event rows
produced by the 'acc' module to generate my own CDRs in my own desired
format from this data, using the 'db_extra' parameter to pass through
any other values I want from the proxy. I do this in PostgreSQL; I
do not know the practicality of this in MySQL.
--
Daniel-Constantin Mierla
*
http://www.asipto.com/