Kaynağa Gözat

usrloc: delete location_attrs in db_only mode on delete_urecord

When calling delete_urecord in DB_ONLY mode the location_attrs are not deleted.
This fix makes sure to delete location_attrs when calling db_delete_urecord is called.
Rick Barenthin 1 yıl önce
ebeveyn
işleme
6b8f6d3b5d
2 değiştirilmiş dosya ile 25 ekleme ve 15 silme
  1. 21 15
      src/modules/usrloc/ucontact.c
  2. 4 0
      src/modules/usrloc/urecord.c

+ 21 - 15
src/modules/usrloc/ucontact.c

@@ -1784,9 +1784,11 @@ int uldb_delete_attrs(str *_dname, str *_user, str *_domain, str *_ruid)
 	str tname;
 	db_key_t keys[3];
 	db_val_t vals[3];
+	int n = 0;
 
-	if(ul_db_ops_ruid == 1)
+	if(ul_db_ops_ruid == 1 && _ruid) {
 		return uldb_delete_attrs_ruid(_dname, _ruid);
+	}
 
 	LM_DBG("trying to delete location attributes\n");
 
@@ -1805,22 +1807,26 @@ int uldb_delete_attrs(str *_dname, str *_user, str *_domain, str *_ruid)
 	tname.s = tname_buf;
 	tname.len = _dname->len + 6;
 
-	keys[0] = &ulattrs_user_col;
-	keys[1] = &ulattrs_ruid_col;
-	keys[2] = &ulattrs_domain_col;
-
-	vals[0].type = DB1_STR;
-	vals[0].nul = 0;
-	vals[0].val.str_val = *_user;
+	keys[n] = &ulattrs_user_col;
+	vals[n].type = DB1_STR;
+	vals[n].nul = 0;
+	vals[n].val.str_val = *_user;
+	n++;
 
-	vals[1].type = DB1_STR;
-	vals[1].nul = 0;
-	vals[1].val.str_val = *_ruid;
+	if(_ruid) {
+		keys[n] = &ulattrs_ruid_col;
+		vals[n].type = DB1_STR;
+		vals[n].nul = 0;
+		vals[n].val.str_val = *_ruid;
+		n++;
+	}
 
 	if(ul_use_domain) {
-		vals[2].type = DB1_STR;
-		vals[2].nul = 0;
-		vals[2].val.str_val = *_domain;
+		keys[n] = &ulattrs_domain_col;
+		vals[n].type = DB1_STR;
+		vals[n].nul = 0;
+		vals[n].val.str_val = *_domain;
+		n++;
 	}
 
 	if(ul_dbf.use_table(ul_dbh, &tname) < 0) {
@@ -1828,7 +1834,7 @@ int uldb_delete_attrs(str *_dname, str *_user, str *_domain, str *_ruid)
 		return -1;
 	}
 
-	if(ul_dbf.delete(ul_dbh, keys, 0, vals, (ul_use_domain) ? (3) : (2)) < 0) {
+	if(ul_dbf.delete(ul_dbh, keys, 0, vals, n) < 0) {
 		LM_ERR("deleting from database failed\n");
 		return -1;
 	}

+ 4 - 0
src/modules/usrloc/urecord.c

@@ -502,6 +502,10 @@ int db_delete_urecord(urecord_t *_r)
 			vals[1].val.str_val.s = dom + 1;
 			vals[1].val.str_val.len = _r->aor.s + _r->aor.len - dom - 1;
 		}
+		uldb_delete_attrs(
+				_r->domain, &vals[0].val.str_val, &vals[1].val.str_val, NULL);
+	} else {
+		uldb_delete_attrs(_r->domain, &vals[0].val.str_val, NULL, NULL);
 	}
 
 	if(ul_dbf.use_table(ul_dbh, _r->domain) < 0) {