Selaa lähdekoodia

modules_k/htable: don't return expired values

If an item has expired, it will be treated as non-existent.
Alex Hermann 13 vuotta sitten
vanhempi
commit
0ba54b551a
1 muutettua tiedostoa jossa 35 lisäystä ja 0 poistoa
  1. 35 0
      modules_k/htable/ht_api.c

+ 35 - 0
modules_k/htable/ht_api.c

@@ -564,6 +564,28 @@ ht_cell_t* ht_cell_value_add(ht_t *ht, str *name, int val, int mode,
 		if(name->len==it->name.len
 		if(name->len==it->name.len
 				&& strncmp(name->s, it->name.s, name->len)==0)
 				&& strncmp(name->s, it->name.s, name->len)==0)
 		{
 		{
+			/* found */
+			if(now>0 && it->expire!=0 && it->expire<now) {
+				/* entry has expired */
+				if(ht->flags==PV_VAL_INT) {
+					/* initval is integer, use it to create a fresh entry */
+					it->flags &= ~AVP_VAL_STR;
+					it->value.n = ht->initval.n;
+					/* increment will be done below */
+				} else {
+					/* delete expired entry */
+					if(it->prev==NULL)
+						ht->entries[idx].first = it->next;
+					else
+						it->prev->next = it->next;
+					if(it->next)
+						it->next->prev = it->prev;
+					ht->entries[idx].esize--;
+					lock_release(&ht->entries[idx].lock);
+					ht_cell_free(it);
+					return NULL;
+				}
+			}
 			/* update value */
 			/* update value */
 			if(it->flags&AVP_VAL_STR)
 			if(it->flags&AVP_VAL_STR)
 			{
 			{
@@ -666,6 +688,19 @@ ht_cell_t* ht_cell_pkg_copy(ht_t *ht, str *name, ht_cell_t *old)
 				&& strncmp(name->s, it->name.s, name->len)==0)
 				&& strncmp(name->s, it->name.s, name->len)==0)
 		{
 		{
 			/* found */
 			/* found */
+			if(ht->htexpire>0 && it->expire!=0 && it->expire<time(NULL)) {
+				/* entry has expired, delete it and return NULL */
+				if(it->prev==NULL)
+					ht->entries[idx].first = it->next;
+				else
+					it->prev->next = it->next;
+				if(it->next)
+					it->next->prev = it->prev;
+				ht->entries[idx].esize--;
+				lock_release(&ht->entries[idx].lock);
+				ht_cell_free(it);
+				return NULL;
+			}
 			if(old!=NULL)
 			if(old!=NULL)
 			{
 			{
 				if(old->msize>=it->msize)
 				if(old->msize>=it->msize)