|
@@ -214,9 +214,10 @@ void print_udomain(FILE* _f, udomain_t* _d)
|
|
|
* ua, received, path, socket, methods, last_modified)
|
|
|
* \param vals database values
|
|
|
* \param contact contact
|
|
|
+ * \param rcon restore connection id
|
|
|
* \return pointer to the ucontact_info on success, 0 on failure
|
|
|
*/
|
|
|
-static inline ucontact_info_t* dbrow2info( db_val_t *vals, str *contact)
|
|
|
+static inline ucontact_info_t* dbrow2info(db_val_t *vals, str *contact, int rcon)
|
|
|
{
|
|
|
static ucontact_info_t ci;
|
|
|
static str callid, ua, received, host, path;
|
|
@@ -342,8 +343,21 @@ static inline ucontact_info_t* dbrow2info( db_val_t *vals, str *contact)
|
|
|
ci.reg_id = VAL_UINT(vals+15);
|
|
|
}
|
|
|
|
|
|
- /* tcp connection id */
|
|
|
+ /* server_id */
|
|
|
+ if (!VAL_NULL(vals+16)) {
|
|
|
+ ci.server_id = VAL_UINT(vals+16);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* tcp connection id (not restored always) */
|
|
|
ci.tcpconn_id = -1;
|
|
|
+ if(rcon==1 && !VAL_NULL(vals+17)) {
|
|
|
+ ci.tcpconn_id = VAL_UINT(vals+17);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* keepalive */
|
|
|
+ if (!VAL_NULL(vals+18)) {
|
|
|
+ ci.keepalive = VAL_UINT(vals+18);
|
|
|
+ }
|
|
|
|
|
|
return &ci;
|
|
|
}
|
|
@@ -363,7 +377,7 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
|
|
|
char uri[MAX_URI_SIZE];
|
|
|
ucontact_info_t *ci;
|
|
|
db_row_t *row;
|
|
|
- db_key_t columns[18];
|
|
|
+ db_key_t columns[21];
|
|
|
db1_res_t* res = NULL;
|
|
|
str user, contact;
|
|
|
char* domain;
|
|
@@ -390,7 +404,10 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
|
|
|
columns[14] = &ruid_col;
|
|
|
columns[15] = &instance_col;
|
|
|
columns[16] = ®_id_col;
|
|
|
- columns[17] = &domain_col;
|
|
|
+ columns[17] = &srv_id_col;
|
|
|
+ columns[18] = &con_id_col;
|
|
|
+ columns[19] = &keepalive_col;
|
|
|
+ columns[20] = &domain_col;
|
|
|
|
|
|
if (ul_dbf.use_table(_c, _d->name) < 0) {
|
|
|
LM_ERR("sql use_table failed\n");
|
|
@@ -402,7 +419,7 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
|
|
|
#endif
|
|
|
|
|
|
if (DB_CAPABILITY(ul_dbf, DB_CAP_FETCH)) {
|
|
|
- if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain)?(18):(17), 0,
|
|
|
+ if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain)?(21):(20), 0,
|
|
|
0) < 0) {
|
|
|
LM_ERR("db_query (1) failed\n");
|
|
|
return -1;
|
|
@@ -412,7 +429,7 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
|
|
|
return -1;
|
|
|
}
|
|
|
} else {
|
|
|
- if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain)?(18):(17), 0,
|
|
|
+ if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain)?(21):(20), 0,
|
|
|
&res) < 0) {
|
|
|
LM_ERR("db_query failed\n");
|
|
|
return -1;
|
|
@@ -440,7 +457,7 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
|
|
|
}
|
|
|
user.len = strlen(user.s);
|
|
|
|
|
|
- ci = dbrow2info( ROW_VALUES(row)+1, &contact);
|
|
|
+ ci = dbrow2info(ROW_VALUES(row)+1, &contact, 0);
|
|
|
if (ci==0) {
|
|
|
LM_ERR("sipping record for %.*s in table %s\n",
|
|
|
user.len, user.s, _d->name->s);
|
|
@@ -448,7 +465,7 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
|
|
|
}
|
|
|
|
|
|
if (use_domain) {
|
|
|
- domain = (char*)VAL_STRING(ROW_VALUES(row) + 17);
|
|
|
+ domain = (char*)VAL_STRING(ROW_VALUES(row) + 20);
|
|
|
if (VAL_NULL(ROW_VALUES(row)+17) || domain==0 || domain[0]==0){
|
|
|
LM_CRIT("empty domain record for user %.*s...skipping\n",
|
|
|
user.len, user.s);
|
|
@@ -525,7 +542,7 @@ urecord_t* db_load_urecord(db1_con_t* _c, udomain_t* _d, str *_aor)
|
|
|
char tname_buf[64];
|
|
|
str tname;
|
|
|
ucontact_info_t *ci;
|
|
|
- db_key_t columns[16];
|
|
|
+ db_key_t columns[19];
|
|
|
db_key_t keys[2];
|
|
|
db_key_t order;
|
|
|
db_val_t vals[2];
|
|
@@ -578,6 +595,9 @@ urecord_t* db_load_urecord(db1_con_t* _c, udomain_t* _d, str *_aor)
|
|
|
columns[13] = &ruid_col;
|
|
|
columns[14] = &instance_col;
|
|
|
columns[15] = ®_id_col;
|
|
|
+ columns[16] = &srv_id_col;
|
|
|
+ columns[17] = &con_id_col;
|
|
|
+ columns[18] = &keepalive_col;
|
|
|
|
|
|
if (desc_time_order)
|
|
|
order = &last_mod_col;
|
|
@@ -604,7 +624,7 @@ urecord_t* db_load_urecord(db1_con_t* _c, udomain_t* _d, str *_aor)
|
|
|
r = 0;
|
|
|
|
|
|
for(i = 0; i < RES_ROW_N(res); i++) {
|
|
|
- ci = dbrow2info( ROW_VALUES(RES_ROWS(res) + i), &contact);
|
|
|
+ ci = dbrow2info(ROW_VALUES(RES_ROWS(res) + i), &contact, 1);
|
|
|
if (ci==0) {
|
|
|
LM_ERR("skipping record for %.*s in table %s\n",
|
|
|
_aor->len, _aor->s, _d->name->s);
|
|
@@ -722,7 +742,7 @@ done:
|
|
|
urecord_t* db_load_urecord_by_ruid(db1_con_t* _c, udomain_t* _d, str *_ruid)
|
|
|
{
|
|
|
ucontact_info_t *ci;
|
|
|
- db_key_t columns[18];
|
|
|
+ db_key_t columns[21];
|
|
|
db_key_t keys[1];
|
|
|
db_key_t order;
|
|
|
db_val_t vals[1];
|
|
@@ -757,8 +777,11 @@ urecord_t* db_load_urecord_by_ruid(db1_con_t* _c, udomain_t* _d, str *_ruid)
|
|
|
columns[13] = &ruid_col;
|
|
|
columns[14] = &instance_col;
|
|
|
columns[15] = ®_id_col;
|
|
|
- columns[16] = &user_col;
|
|
|
- columns[17] = &domain_col;
|
|
|
+ columns[16] = &srv_id_col;
|
|
|
+ columns[17] = &con_id_col;
|
|
|
+ columns[18] = &keepalive_col;
|
|
|
+ columns[19] = &user_col;
|
|
|
+ columns[20] = &domain_col;
|
|
|
|
|
|
if (desc_time_order)
|
|
|
order = &last_mod_col;
|
|
@@ -788,19 +811,19 @@ urecord_t* db_load_urecord_by_ruid(db1_con_t* _c, udomain_t* _d, str *_ruid)
|
|
|
/* use first row - shouldn't be more */
|
|
|
row = RES_ROWS(res);
|
|
|
|
|
|
- ci = dbrow2info(ROW_VALUES(RES_ROWS(res)), &contact);
|
|
|
+ ci = dbrow2info(ROW_VALUES(RES_ROWS(res)), &contact, 1);
|
|
|
if (ci==0) {
|
|
|
LM_ERR("skipping record for %.*s in table %s\n",
|
|
|
_ruid->len, _ruid->s, _d->name->s);
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
- aor.s = (char*)VAL_STRING(ROW_VALUES(row) + 16);
|
|
|
+ aor.s = (char*)VAL_STRING(ROW_VALUES(row) + 19);
|
|
|
aor.len = strlen(aor.s);
|
|
|
|
|
|
if (use_domain) {
|
|
|
- domain.s = (char*)VAL_STRING(ROW_VALUES(row) + 17);
|
|
|
- if (VAL_NULL(ROW_VALUES(row)+17) || domain.s==0 || domain.s[0]==0){
|
|
|
+ domain.s = (char*)VAL_STRING(ROW_VALUES(row) + 20);
|
|
|
+ if (VAL_NULL(ROW_VALUES(row)+20) || domain.s==0 || domain.s[0]==0){
|
|
|
LM_CRIT("empty domain record for user %.*s...skipping\n",
|
|
|
aor.len, aor.s);
|
|
|
goto done;
|