#include "redis.h"
+/*-----------------------------------------------------------------------------
+ * Pubsub low level API
+ *----------------------------------------------------------------------------*/
+
void freePubsubPattern(void *p) {
pubsubPattern *pat = p;
dictAdd(server.pubsub_channels,channel,clients);
incrRefCount(channel);
} else {
- clients = dictGetEntryVal(de);
+ clients = dictGetVal(de);
}
listAddNodeTail(clients,c);
}
retval = 1;
/* Remove the client from the channel -> clients list hash table */
de = dictFind(server.pubsub_channels,channel);
- redisAssert(de != NULL);
- clients = dictGetEntryVal(de);
+ redisAssertWithInfo(c,NULL,de != NULL);
+ clients = dictGetVal(de);
ln = listSearchKey(clients,c);
- redisAssert(ln != NULL);
+ redisAssertWithInfo(c,NULL,ln != NULL);
listDelNode(clients,ln);
if (listLength(clients) == 0) {
/* Free the list and associated hash entry at all if this was
/* Unsubscribe from all the channels. Return the number of channels the
* client was subscribed from. */
int pubsubUnsubscribeAllChannels(redisClient *c, int notify) {
- dictIterator *di = dictGetIterator(c->pubsub_channels);
+ dictIterator *di = dictGetSafeIterator(c->pubsub_channels);
dictEntry *de;
int count = 0;
while((de = dictNext(di)) != NULL) {
- robj *channel = dictGetEntryKey(de);
+ robj *channel = dictGetKey(de);
count += pubsubUnsubscribeChannel(c,channel,notify);
}
/* Send to clients listening for that channel */
de = dictFind(server.pubsub_channels,channel);
if (de) {
- list *list = dictGetEntryVal(de);
+ list *list = dictGetVal(de);
listNode *ln;
listIter li;
return receivers;
}
+/*-----------------------------------------------------------------------------
+ * Pubsub commands implementation
+ *----------------------------------------------------------------------------*/
+
void subscribeCommand(redisClient *c) {
int j;
void publishCommand(redisClient *c) {
int receivers = pubsubPublishMessage(c->argv[1],c->argv[2]);
+ if (server.cluster_enabled) clusterPropagatePublish(c->argv[1],c->argv[2]);
addReplyLongLong(c,receivers);
}