mirror of https://github.com/redis/redis.git
				
				
				
			Modules: Allow notifying custom keyspace events
Also, add an API for getting server.notify_keyspace_events Other (unrelated) changes: Add RM_GetKeynameFromModuleKey
This commit is contained in:
		
							parent
							
								
									cfcb475435
								
							
						
					
					
						commit
						cee6dead3c
					
				
							
								
								
									
										22
									
								
								src/module.c
								
								
								
								
							
							
						
						
									
										22
									
								
								src/module.c
								
								
								
								
							| 
						 | 
					@ -3859,6 +3859,11 @@ const RedisModuleString *RM_GetKeyNameFromIO(RedisModuleIO *io) {
 | 
				
			||||||
    return io->key;
 | 
					    return io->key;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Returns a RedisModuleString with the name of the key from RedisModuleKey */
 | 
				
			||||||
 | 
					const RedisModuleString *RM_GetKeyNameFromModuleKey(RedisModuleKey *key) {
 | 
				
			||||||
 | 
					    return key ? key->key : NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* --------------------------------------------------------------------------
 | 
					/* --------------------------------------------------------------------------
 | 
				
			||||||
 * Logging
 | 
					 * Logging
 | 
				
			||||||
 * -------------------------------------------------------------------------- */
 | 
					 * -------------------------------------------------------------------------- */
 | 
				
			||||||
| 
						 | 
					@ -4368,6 +4373,20 @@ int RM_SubscribeToKeyspaceEvents(RedisModuleCtx *ctx, int types, RedisModuleNoti
 | 
				
			||||||
    return REDISMODULE_OK;
 | 
					    return REDISMODULE_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Get the configured bitmap of notify-keyspace-events (Could be used
 | 
				
			||||||
 | 
					 * for additional filtering in RedisModuleNotificationFunc) */
 | 
				
			||||||
 | 
					int RM_GetNotifyKeyspaceEvents() {
 | 
				
			||||||
 | 
					    return server.notify_keyspace_events;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Expose notifyKeyspaceEvent to modules */
 | 
				
			||||||
 | 
					int RM_NotifyKeyspaceEvent(RedisModuleCtx *ctx, int type, const char *event, RedisModuleString *key) {
 | 
				
			||||||
 | 
					    if (!ctx || !ctx->client)
 | 
				
			||||||
 | 
					        return REDISMODULE_ERR;
 | 
				
			||||||
 | 
					    notifyKeyspaceEvent(type, (char *)event, key, ctx->client->db->id);
 | 
				
			||||||
 | 
					    return REDISMODULE_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Dispatcher for keyspace notifications to module subscriber functions.
 | 
					/* Dispatcher for keyspace notifications to module subscriber functions.
 | 
				
			||||||
 * This gets called  only if at least one module requested to be notified on
 | 
					 * This gets called  only if at least one module requested to be notified on
 | 
				
			||||||
 * keyspace notifications */
 | 
					 * keyspace notifications */
 | 
				
			||||||
| 
						 | 
					@ -6471,6 +6490,7 @@ void moduleRegisterCoreAPI(void) {
 | 
				
			||||||
    REGISTER_API(StringCompare);
 | 
					    REGISTER_API(StringCompare);
 | 
				
			||||||
    REGISTER_API(GetContextFromIO);
 | 
					    REGISTER_API(GetContextFromIO);
 | 
				
			||||||
    REGISTER_API(GetKeyNameFromIO);
 | 
					    REGISTER_API(GetKeyNameFromIO);
 | 
				
			||||||
 | 
					    REGISTER_API(GetKeyNameFromModuleKey);
 | 
				
			||||||
    REGISTER_API(BlockClient);
 | 
					    REGISTER_API(BlockClient);
 | 
				
			||||||
    REGISTER_API(UnblockClient);
 | 
					    REGISTER_API(UnblockClient);
 | 
				
			||||||
    REGISTER_API(IsBlockedReplyRequest);
 | 
					    REGISTER_API(IsBlockedReplyRequest);
 | 
				
			||||||
| 
						 | 
					@ -6485,6 +6505,8 @@ void moduleRegisterCoreAPI(void) {
 | 
				
			||||||
    REGISTER_API(DigestAddStringBuffer);
 | 
					    REGISTER_API(DigestAddStringBuffer);
 | 
				
			||||||
    REGISTER_API(DigestAddLongLong);
 | 
					    REGISTER_API(DigestAddLongLong);
 | 
				
			||||||
    REGISTER_API(DigestEndSequence);
 | 
					    REGISTER_API(DigestEndSequence);
 | 
				
			||||||
 | 
					    REGISTER_API(NotifyKeyspaceEvent);
 | 
				
			||||||
 | 
					    REGISTER_API(GetNotifyKeyspaceEvents);
 | 
				
			||||||
    REGISTER_API(SubscribeToKeyspaceEvents);
 | 
					    REGISTER_API(SubscribeToKeyspaceEvents);
 | 
				
			||||||
    REGISTER_API(RegisterClusterMessageReceiver);
 | 
					    REGISTER_API(RegisterClusterMessageReceiver);
 | 
				
			||||||
    REGISTER_API(SendClusterMessage);
 | 
					    REGISTER_API(SendClusterMessage);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,6 +106,11 @@
 | 
				
			||||||
/* There is currently some background process active. */
 | 
					/* There is currently some background process active. */
 | 
				
			||||||
#define REDISMODULE_CTX_FLAGS_ACTIVE_CHILD (1<<18)
 | 
					#define REDISMODULE_CTX_FLAGS_ACTIVE_CHILD (1<<18)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Keyspace changes notification classes. Every class is associated with a
 | 
				
			||||||
 | 
					 * character for configuration purposes.
 | 
				
			||||||
 | 
					 * NOTE: These have to be in sync with NOTIFY_* in server.h */
 | 
				
			||||||
 | 
					#define REDISMODULE_NOTIFY_KEYSPACE (1<<0)    /* K */
 | 
				
			||||||
 | 
					#define REDISMODULE_NOTIFY_KEYEVENT (1<<1)    /* E */
 | 
				
			||||||
#define REDISMODULE_NOTIFY_GENERIC (1<<2)     /* g */
 | 
					#define REDISMODULE_NOTIFY_GENERIC (1<<2)     /* g */
 | 
				
			||||||
#define REDISMODULE_NOTIFY_STRING (1<<3)      /* $ */
 | 
					#define REDISMODULE_NOTIFY_STRING (1<<3)      /* $ */
 | 
				
			||||||
#define REDISMODULE_NOTIFY_LIST (1<<4)        /* l */
 | 
					#define REDISMODULE_NOTIFY_LIST (1<<4)        /* l */
 | 
				
			||||||
| 
						 | 
					@ -651,6 +656,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
 | 
				
			||||||
    REDISMODULE_GET_API(StringCompare);
 | 
					    REDISMODULE_GET_API(StringCompare);
 | 
				
			||||||
    REDISMODULE_GET_API(GetContextFromIO);
 | 
					    REDISMODULE_GET_API(GetContextFromIO);
 | 
				
			||||||
    REDISMODULE_GET_API(GetKeyNameFromIO);
 | 
					    REDISMODULE_GET_API(GetKeyNameFromIO);
 | 
				
			||||||
 | 
					    REDISMODULE_GET_API(GetKeyNameFromModuleKey);
 | 
				
			||||||
    REDISMODULE_GET_API(Milliseconds);
 | 
					    REDISMODULE_GET_API(Milliseconds);
 | 
				
			||||||
    REDISMODULE_GET_API(DigestAddStringBuffer);
 | 
					    REDISMODULE_GET_API(DigestAddStringBuffer);
 | 
				
			||||||
    REDISMODULE_GET_API(DigestAddLongLong);
 | 
					    REDISMODULE_GET_API(DigestAddLongLong);
 | 
				
			||||||
| 
						 | 
					@ -703,6 +709,8 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
 | 
				
			||||||
    REDISMODULE_GET_API(AbortBlock);
 | 
					    REDISMODULE_GET_API(AbortBlock);
 | 
				
			||||||
    REDISMODULE_GET_API(SetDisconnectCallback);
 | 
					    REDISMODULE_GET_API(SetDisconnectCallback);
 | 
				
			||||||
    REDISMODULE_GET_API(SubscribeToKeyspaceEvents);
 | 
					    REDISMODULE_GET_API(SubscribeToKeyspaceEvents);
 | 
				
			||||||
 | 
					    REDISMODULE_GET_API(NotifyKeyspaceEvent);
 | 
				
			||||||
 | 
					    REDISMODULE_GET_API(GetNotifyKeyspaceEvents);
 | 
				
			||||||
    REDISMODULE_GET_API(BlockedClientDisconnected);
 | 
					    REDISMODULE_GET_API(BlockedClientDisconnected);
 | 
				
			||||||
    REDISMODULE_GET_API(RegisterClusterMessageReceiver);
 | 
					    REDISMODULE_GET_API(RegisterClusterMessageReceiver);
 | 
				
			||||||
    REDISMODULE_GET_API(SendClusterMessage);
 | 
					    REDISMODULE_GET_API(SendClusterMessage);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue