[OpenSER-Devel] patch for dialog module to update DB with more
states
Ben Smithurst
openserdev.29f4da9a at bensmithurst.com
Tue Sep 4 13:17:49 CEST 2007
And here's the attachments :-)
--
Ben Smithurst
http://www.bensmithurst.com/
-------------- next part --------------
Index: modules/dialog/dlg_db_handler.c
===================================================================
--- modules/dialog/dlg_db_handler.c (revision 2709)
+++ modules/dialog/dlg_db_handler.c (working copy)
@@ -405,6 +405,12 @@
from_cseq_column, to_cseq_column, from_route_column,
to_route_column, from_contact_column, to_contact_column};
+ db_key_t update_keys[DIALOG_TABLE_COL_NO] = { h_entry_column,
+ h_id_column, to_sock_column,
+ state_column, timeout_column,
+ to_contact_column, from_cseq_column,
+ to_cseq_column, start_time_column};
+
if(use_dialog_table()!=0)
return -1;
@@ -441,10 +447,14 @@
DBG("DBG:dialog:update_dialog_dbinfo: sock_info is %.*s\n",
cell->bind_addr[DLG_CALLER_LEG]->sock_str.len,
- cell->bind_addr[DLG_CALLEE_LEG]->sock_str.s);
+ cell->bind_addr[DLG_CALLER_LEG]->sock_str.s);
SET_STR_VALUE(values+7, cell->bind_addr[DLG_CALLER_LEG]->sock_str);
- SET_STR_VALUE(values+8, cell->bind_addr[DLG_CALLEE_LEG]->sock_str);
+ if (cell->bind_addr[DLG_CALLEE_LEG]) {
+ SET_STR_VALUE(values+8, cell->bind_addr[DLG_CALLEE_LEG]->sock_str);
+ } else {
+ VAL_NULL(values+8) = 1;
+ }
SET_STR_VALUE(values+12, cell->cseq[DLG_CALLER_LEG]);
SET_STR_VALUE(values+13, cell->cseq[DLG_CALLEE_LEG]);
@@ -470,29 +480,43 @@
} else if((cell->flags & DLG_FLAG_CHANGED) != 0) {
/* save only dialog's state and timeout */
VAL_TYPE(values) = VAL_TYPE(values+1) =
- VAL_TYPE(values+10) = VAL_TYPE(values+11) = DB_INT;
+ VAL_TYPE(values+3) = VAL_TYPE(values+4) =
+ VAL_TYPE(values+8) = DB_INT;
- VAL_TYPE(values+12) = VAL_TYPE(values+13) =DB_STR;
+ VAL_TYPE(values+2) = VAL_TYPE(values+5) =
+ VAL_TYPE(values+6) = VAL_TYPE(values+7) =DB_STR;
+ VAL_NULL(values) = VAL_NULL(values+1) =
+ VAL_NULL(values+2) = VAL_NULL(values+3) =
+ VAL_NULL(values+4) = VAL_NULL(values+5) =
+ VAL_NULL(values+6) = VAL_NULL(values+7) =
+ VAL_NULL(values+8) = 0;
+
/* lock the entry */
entry = (d_table->entries)[cell->h_entry];
dlg_lock( d_table, &entry);
VAL_INT(values) = cell->h_entry;
VAL_INT(values+1) = cell->h_id;
- VAL_INT(values+10) = cell->state;
- VAL_INT(values+11) = cell->tl.timeout - get_ticks() +
+ VAL_INT(values+3) = cell->state;
+ VAL_INT(values+4) = cell->tl.timeout - get_ticks() +
(unsigned int)clock_time;
- SET_STR_VALUE(values+12, cell->cseq[DLG_CALLER_LEG]);
- SET_STR_VALUE(values+13, cell->cseq[DLG_CALLEE_LEG]);
+ VAL_INT(values+8) = cell->start_ts;
+ if (cell->bind_addr[DLG_CALLEE_LEG]) {
+ SET_STR_VALUE(values+2, cell->bind_addr[DLG_CALLEE_LEG]->sock_str);
+ } else {
+ VAL_NULL(values+2) = 1;
+ }
+ SET_STR_VALUE(values+5, cell->contact[DLG_CALLEE_LEG]);
+ SET_PROPER_NULL_FLAG(cell->contact[DLG_CALLEE_LEG], values, 5);
- VAL_NULL(values) = VAL_NULL(values+1) =
- VAL_NULL(values+10) = VAL_NULL(values+11) =
- VAL_NULL(values+12) = VAL_NULL(values+13) = 0;
+ LOG(L_ERR, "DIALOG: cseq %s/%s\n", cell->cseq[DLG_CALLER_LEG].s, cell->cseq[DLG_CALLEE_LEG].s);
+ SET_STR_VALUE(values+6, cell->cseq[DLG_CALLER_LEG]);
+ SET_STR_VALUE(values+7, cell->cseq[DLG_CALLEE_LEG]);
- if((dialog_dbf.update(dialog_db_handle, (insert_keys), 0,
- (values), (insert_keys+10), (values+10), 2, 4)) !=0){
+ if((dialog_dbf.update(dialog_db_handle, (update_keys), 0,
+ (values), (update_keys+2), (values+2), 2, 7)) !=0){
LOG(L_ERR, "ERROR:dialog:update_single_dialog_dbinfo:could not "
"update database info\n");
goto error;
Index: modules/dialog/dlg_hash.c
===================================================================
--- modules/dialog/dlg_hash.c (revision 2709)
+++ modules/dialog/dlg_hash.c (working copy)
@@ -179,6 +179,7 @@
memset( dlg, 0, len);
dlg->state = DLG_STATE_UNCONFIRMED;
+ dlg->flags = DLG_FLAG_NEW;
dlg->h_entry = core_hash( callid, from_tag->len?from_tag:0, d_table->size);
DBG("DEBUG:dialog:build_new_dlg: new dialog on hash %u\n",dlg->h_entry);
Index: modules/dialog/dlg_handlers.c
===================================================================
--- modules/dialog/dlg_handlers.c (revision 2709)
+++ modules/dialog/dlg_handlers.c (working copy)
@@ -275,6 +275,9 @@
if (new_state==DLG_STATE_EARLY) {
run_dlg_callbacks(DLGCB_EARLY, dlg, rpl);
+ dlg->flags |= DLG_FLAG_CHANGED;
+ if ( dlg_db_mode==DB_MODE_REALTIME )
+ update_dialog_dbinfo(dlg);
if (old_state!=DLG_STATE_EARLY)
if_update_stat(dlg_enable_stats, early_dlgs, 1);
return;
@@ -311,7 +314,7 @@
/* save the settings to the database,
* if realtime saving mode configured- save dialog now
* else: the next time the timer will fire the update*/
- dlg->flags |= DLG_FLAG_NEW;
+ dlg->flags |= DLG_FLAG_CHANGED;
if ( dlg_db_mode==DB_MODE_REALTIME )
update_dialog_dbinfo(dlg);
@@ -601,6 +604,11 @@
if (event==DLG_EVENT_REQBYE && new_state==DLG_STATE_DELETED &&
old_state!=DLG_STATE_DELETED) {
DBG("DEBUG:dialog:dlg_onroute: BYE successfully processed\n");
+
+ dlg->flags |= DLG_FLAG_CHANGED;
+ if ( dlg_db_mode==DB_MODE_REALTIME )
+ update_dialog_dbinfo(dlg);
+
/* remove from timer */
remove_dlg_timer(&dlg->tl);
/* dialog terminated (BYE) */
@@ -634,7 +642,7 @@
}
}
- if(new_state == DLG_STATE_CONFIRMED && old_state == DLG_STATE_CONFIRMED_NA){
+ if (new_state != old_state) {
dlg->flags |= DLG_FLAG_CHANGED;
if(dlg_db_mode == DB_MODE_REALTIME)
-------------- next part --------------
Index: db/schema/dialog.xml
===================================================================
--- db/schema/dialog.xml (revision 2709)
+++ db/schema/dialog.xml (working copy)
@@ -9,7 +9,7 @@
<table id="dialog" xmlns:db="http://docbook.org/ns/docbook">
<name>dialog</name>
- <version>1</version>
+ <version>2</version>
<type db="mysql">&MYSQL_TABLE_TYPE;</type>
<description>
<db:para>Persistent dialog information for the dialog module. More
@@ -77,6 +77,7 @@
<name>to_tag</name>
<type>string</type>
<size>&user_len;</size>
+ <null/>
<description>The tag parameter serves as a general mechanism to
identify a dialog, which is the combination of the Call-ID along
with two tags, one from participant in the dialog.</description>
@@ -123,6 +124,7 @@
<name>callee_contact</name>
<type>string</type>
<size>&uri_len;</size>
+ <null/>
<description>Callee's contact uri.</description>
</column>
@@ -137,6 +139,7 @@
<name>callee_sock</name>
<type>string</type>
<size>64</size>
+ <null/>
<description>Local socket used to communicate with callee</description>
</column>
More information about the Devel
mailing list