[asterisk-commits] mnicholson: trunk r227435 - in /trunk: ./ apps/ configs/ funcs/ include/aster...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Nov 3 15:21:18 CST 2009
Author: mnicholson
Date: Tue Nov 3 15:21:09 2009
New Revision: 227435
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=227435
Log:
This patch adds a sequence field to CDRs that can be combined with the linkedid or uniqueid field to uniquely identify a CDR.
(closes issue #15180)
Reported by: Nick_Lewis
Patches:
cdr-sequence10.diff uploaded by mnicholson (license 96)
Tested by: mnicholson
Modified:
trunk/CHANGES
trunk/apps/app_forkcdr.c
trunk/configs/cdr_custom.conf.sample
trunk/funcs/func_cdr.c
trunk/include/asterisk/cdr.h
trunk/main/cdr.c
trunk/main/features.c
Modified: trunk/CHANGES
URL: http://svnview.digium.com/svn/asterisk/trunk/CHANGES?view=diff&rev=227435&r1=227434&r2=227435
==============================================================================
--- trunk/CHANGES (original)
+++ trunk/CHANGES Tue Nov 3 15:21:09 2009
@@ -277,6 +277,8 @@
* Multiple files and formats can now be specified in cdr_custom.conf.
* cdr_syslog has been added which allows CDRs to be written directly to syslog.
See configs/cdr_syslog.conf.sample for more information.
+ * A 'sequence' field has been added to CDRs which can be combined with
+ linkedid or uniqueid to uniquely identify a CDR.
Calendaring for Asterisk
------------------------
Modified: trunk/apps/app_forkcdr.c
URL: http://svnview.digium.com/svn/asterisk/trunk/apps/app_forkcdr.c?view=diff&rev=227435&r1=227434&r2=227435
==============================================================================
--- trunk/apps/app_forkcdr.c (original)
+++ trunk/apps/app_forkcdr.c Tue Nov 3 15:21:09 2009
@@ -184,7 +184,7 @@
while (cdr->next)
cdr = cdr->next;
- if (!(newcdr = ast_cdr_dup(cdr)))
+ if (!(newcdr = ast_cdr_dup_unique(cdr)))
return;
ast_cdr_append(cdr, newcdr);
Modified: trunk/configs/cdr_custom.conf.sample
URL: http://svnview.digium.com/svn/asterisk/trunk/configs/cdr_custom.conf.sample?view=diff&rev=227435&r1=227434&r2=227435
==============================================================================
--- trunk/configs/cdr_custom.conf.sample (original)
+++ trunk/configs/cdr_custom.conf.sample Tue Nov 3 15:21:09 2009
@@ -7,6 +7,6 @@
; Master.csv, Simple.csv, or both.
;
;[mappings]
-;Master.csv => ${CSV_QUOTE(${CDR(clid)})},${CSV_QUOTE(${CDR(src)})},${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(dcontext)})},${CSV_QUOTE(${CDR(channel)})},${CSV_QUOTE(${CDR(dstchannel)})},${CSV_QUOTE(${CDR(lastapp)})},${CSV_QUOTE(${CDR(lastdata)})},${CSV_QUOTE(${CDR(start)})},${CSV_QUOTE(${CDR(answer)})},${CSV_QUOTE(${CDR(end)})},${CSV_QUOTE(${CDR(duration)})},${CSV_QUOTE(${CDR(billsec)})},${CSV_QUOTE(${CDR(disposition)})},${CSV_QUOTE(${CDR(amaflags)})},${CSV_QUOTE(${CDR(accountcode)})},${CSV_QUOTE(${CDR(uniqueid)})},${CSV_QUOTE(${CDR(userfield)})}
+;Master.csv => ${CSV_QUOTE(${CDR(clid)})},${CSV_QUOTE(${CDR(src)})},${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(dcontext)})},${CSV_QUOTE(${CDR(channel)})},${CSV_QUOTE(${CDR(dstchannel)})},${CSV_QUOTE(${CDR(lastapp)})},${CSV_QUOTE(${CDR(lastdata)})},${CSV_QUOTE(${CDR(start)})},${CSV_QUOTE(${CDR(answer)})},${CSV_QUOTE(${CDR(end)})},${CSV_QUOTE(${CDR(duration)})},${CSV_QUOTE(${CDR(billsec)})},${CSV_QUOTE(${CDR(disposition)})},${CSV_QUOTE(${CDR(amaflags)})},${CSV_QUOTE(${CDR(accountcode)})},${CSV_QUOTE(${CDR(uniqueid)})},${CSV_QUOTE(${CDR(userfield)})},${CDR(sequence)}
;Simple.csv => ${CSV_QUOTE(${EPOCH})},${CSV_QUOTE(${CDR(src)})},${CSV_QUOTE(${CDR(dst)})}
Modified: trunk/funcs/func_cdr.c
URL: http://svnview.digium.com/svn/asterisk/trunk/funcs/func_cdr.c?view=diff&rev=227435&r1=227434&r2=227435
==============================================================================
--- trunk/funcs/func_cdr.c (original)
+++ trunk/funcs/func_cdr.c Tue Nov 3 15:21:09 2009
@@ -98,6 +98,9 @@
</enum>
<enum name="channel">
<para>Channel name.</para>
+ </enum>
+ <enum name="sequence">
+ <para>CDR sequence number.</param>
</enum>
</enumlist>
</parameter>
Modified: trunk/include/asterisk/cdr.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/cdr.h?view=diff&rev=227435&r1=227434&r2=227435
==============================================================================
--- trunk/include/asterisk/cdr.h (original)
+++ trunk/include/asterisk/cdr.h Tue Nov 3 15:21:09 2009
@@ -110,6 +110,8 @@
char linkedid[32];
/*! User field */
char userfield[AST_MAX_USER_FIELD];
+ /*! Sequence field */
+ int sequence;
/*! A linked list for variables */
struct varshead varshead;
@@ -143,9 +145,37 @@
struct ast_cdr *ast_cdr_alloc(void);
/*!
- * \brief Duplicate a record
+ * \brief Duplicate a record and increment the sequence number.
+ * \param cdr the record to duplicate
* \retval a malloc'd ast_cdr structure,
* \retval NULL on error (malloc failure)
+ * \see ast_cdr_dup()
+ * \see ast_cdr_dup_unique_swap()
+ */
+struct ast_cdr *ast_cdr_dup_unique(struct ast_cdr *cdr);
+
+/*!
+ * \brief Duplicate a record and increment the sequence number of the old
+ * record.
+ * \param cdr the record to duplicate
+ * \retval a malloc'd ast_cdr structure,
+ * \retval NULL on error (malloc failure)
+ * \note This version increments the original CDR's sequence number rather than
+ * the duplicate's sequence number. The effect is as if the original CDR's
+ * sequence number was swapped with the duplicate's sequence number.
+ *
+ * \see ast_cdr_dup()
+ * \see ast_cdr_dup_unique()
+ */
+struct ast_cdr *ast_cdr_dup_unique_swap(struct ast_cdr *cdr);
+
+/*!
+ * \brief Duplicate a record
+ * \param cdr the record to duplicate
+ * \retval a malloc'd ast_cdr structure,
+ * \retval NULL on error (malloc failure)
+ * \see ast_cdr_dup_unique()
+ * \see ast_cdr_dup_unique_swap()
*/
struct ast_cdr *ast_cdr_dup(struct ast_cdr *cdr);
Modified: trunk/main/cdr.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/cdr.c?view=diff&rev=227435&r1=227434&r2=227435
==============================================================================
--- trunk/main/cdr.c (original)
+++ trunk/main/cdr.c Tue Nov 3 15:21:09 2009
@@ -74,6 +74,11 @@
struct ast_cdr_batch_item *tail;
} *batch = NULL;
+
+static int cdr_sequence = 0;
+
+static int cdr_seq_inc(struct ast_cdr *cdr);
+
static struct sched_context *sched;
static int cdr_sched = -1;
static pthread_t cdr_thread = AST_PTHREADT_NULL;
@@ -163,6 +168,26 @@
int ast_cdr_isset_unanswered(void)
{
return unanswered;
+}
+
+struct ast_cdr *ast_cdr_dup_unique(struct ast_cdr *cdr)
+{
+ struct ast_cdr *newcdr = ast_cdr_dup(cdr);
+ if (!newcdr)
+ return NULL;
+
+ cdr_seq_inc(newcdr);
+ return newcdr;
+}
+
+struct ast_cdr *ast_cdr_dup_unique_swap(struct ast_cdr *cdr)
+{
+ struct ast_cdr *newcdr = ast_cdr_dup(cdr);
+ if (!newcdr)
+ return NULL;
+
+ cdr_seq_inc(cdr);
+ return newcdr;
}
/*! Duplicate a CDR record
@@ -279,6 +304,8 @@
ast_copy_string(workspace, cdr->linkedid, workspacelen);
else if (!strcasecmp(name, "userfield"))
ast_copy_string(workspace, cdr->userfield, workspacelen);
+ else if (!strcasecmp(name, "sequence"))
+ snprintf(workspace, workspacelen, "%d", cdr->sequence);
else if ((varbuf = ast_cdr_getvar_internal(cdr, name, recur)))
ast_copy_string(workspace, varbuf, workspacelen);
else
@@ -292,7 +319,7 @@
static const char * const cdr_readonly_vars[] = { "clid", "src", "dst", "dcontext", "channel", "dstchannel",
"lastapp", "lastdata", "start", "answer", "end", "duration",
"billsec", "disposition", "amaflags", "accountcode", "uniqueid", "linkedid",
- "userfield", NULL };
+ "userfield", "sequence", NULL };
/*! Set a CDR channel variable
\note You can't set the CDR variables that belong to the actual CDR record, like "billsec".
*/
@@ -847,6 +874,11 @@
return 0;
}
+static int cdr_seq_inc(struct ast_cdr *cdr)
+{
+ return (cdr->sequence = ast_atomic_fetchadd_int(&cdr_sequence, +1));
+}
+
int ast_cdr_init(struct ast_cdr *cdr, struct ast_channel *c)
{
char *chan;
@@ -856,6 +888,7 @@
chan = S_OR(cdr->channel, "<unknown>");
ast_copy_string(cdr->channel, c->name, sizeof(cdr->channel));
set_one_cid(cdr, c);
+ cdr_seq_inc(cdr);
cdr->disposition = (c->_state == AST_STATE_UP) ? AST_CDR_ANSWERED : AST_CDR_NOANSWER;
cdr->amaflags = c->amaflags ? c->amaflags : ast_default_amaflags;
@@ -1116,7 +1149,7 @@
if (ast_test_flag(&flags, AST_CDR_FLAG_LOCKED) || !ast_test_flag(cdr, AST_CDR_FLAG_LOCKED)) {
if (ast_test_flag(&flags, AST_CDR_FLAG_POSTED)) {
ast_cdr_end(cdr);
- if ((duplicate = ast_cdr_dup(cdr))) {
+ if ((duplicate = ast_cdr_dup_unique_swap(cdr))) {
ast_cdr_detach(duplicate);
}
ast_set_flag(cdr, AST_CDR_FLAG_POSTED);
Modified: trunk/main/features.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/features.c?view=diff&rev=227435&r1=227434&r2=227435
==============================================================================
--- trunk/main/features.c (original)
+++ trunk/main/features.c Tue Nov 3 15:21:09 2009
@@ -2804,7 +2804,7 @@
if (chan_cdr) {
ast_set_flag(chan_cdr, AST_CDR_FLAG_MAIN);
ast_cdr_update(chan);
- bridge_cdr = ast_cdr_dup(chan_cdr);
+ bridge_cdr = ast_cdr_dup_unique_swap(chan_cdr);
ast_copy_string(bridge_cdr->lastapp, S_OR(chan->appl, ""), sizeof(bridge_cdr->lastapp));
ast_copy_string(bridge_cdr->lastdata, S_OR(chan->data, ""), sizeof(bridge_cdr->lastdata));
} else {
More information about the asterisk-commits
mailing list