2010-11-03 16:03:04 +01:00
/*
2012-02-19 20:26:36 +01:00
* Copyright ( c ) 2009 - 2011 , Salvatore Sanfilippo < antirez at gmail dot com >
* Copyright ( c ) 2010 - 2011 , Pieter Noordhuis < pcnoordhuis at gmail dot com >
2011-04-19 23:07:36 +02:00
*
2010-11-03 16:03:04 +01:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
*
* * Redistributions of source code must retain the above copyright notice ,
* this list of conditions and the following disclaimer .
* * Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* * Neither the name of Redis nor the names of its contributors may be used
* to endorse or promote products derived from this software without
* specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS "
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR
* CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS
* INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
* CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE )
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE .
*/
# ifndef __HIREDIS_ASYNC_H
# define __HIREDIS_ASYNC_H
# include "hiredis.h"
2010-12-16 23:32:02 +01:00
# ifdef __cplusplus
extern " C " {
# endif
2010-11-03 16:03:04 +01:00
struct redisAsyncContext ; /* need forward declaration of redisAsyncContext */
2011-04-19 23:07:36 +02:00
struct dict ; /* dictionary header is included in async.c */
2010-11-03 16:03:04 +01:00
/* Reply callback prototype and container */
typedef void ( redisCallbackFn ) ( struct redisAsyncContext * , void * , void * ) ;
typedef struct redisCallback {
struct redisCallback * next ; /* simple singly linked list */
redisCallbackFn * fn ;
2018-12-04 19:01:33 +01:00
int pending_subs ;
2010-11-03 16:03:04 +01:00
void * privdata ;
} redisCallback ;
/* List of callbacks for either regular replies or pub/sub */
typedef struct redisCallbackList {
redisCallback * head , * tail ;
} redisCallbackList ;
2010-12-16 23:32:02 +01:00
/* Connection callback prototypes */
2010-11-03 16:03:04 +01:00
typedef void ( redisDisconnectCallback ) ( const struct redisAsyncContext * , int status ) ;
2012-02-19 20:26:36 +01:00
typedef void ( redisConnectCallback ) ( const struct redisAsyncContext * , int status ) ;
2010-11-03 16:03:04 +01:00
/* Context for an async connection to Redis */
typedef struct redisAsyncContext {
/* Hold the regular context, so it can be realloc'ed. */
redisContext c ;
/* Setup error flags so they can be used directly. */
int err ;
char * errstr ;
2010-12-16 23:32:02 +01:00
/* Not used by hiredis */
void * data ;
2011-04-19 23:07:36 +02:00
/* Event library data and hooks */
struct {
void * data ;
2010-12-16 23:32:02 +01:00
2011-04-19 23:07:36 +02:00
/* Hooks that are called when the library expects to start
* reading / writing . These functions should be idempotent . */
void ( * addRead ) ( void * privdata ) ;
void ( * delRead ) ( void * privdata ) ;
void ( * addWrite ) ( void * privdata ) ;
void ( * delWrite ) ( void * privdata ) ;
void ( * cleanup ) ( void * privdata ) ;
} ev ;
2010-11-03 16:03:04 +01:00
/* Called when either the connection is terminated due to an error or per
* user request . The status is set accordingly ( REDIS_OK , REDIS_ERR ) . */
redisDisconnectCallback * onDisconnect ;
2010-12-16 23:32:02 +01:00
/* Called when the first write event was received. */
redisConnectCallback * onConnect ;
2011-04-19 23:07:36 +02:00
/* Regular command callbacks */
2010-11-03 16:03:04 +01:00
redisCallbackList replies ;
2011-04-19 23:07:36 +02:00
2018-12-04 19:01:33 +01:00
/* Address used for connect() */
struct sockaddr * saddr ;
size_t addrlen ;
2011-04-19 23:07:36 +02:00
/* Subscription callbacks */
struct {
redisCallbackList invalid ;
struct dict * channels ;
struct dict * patterns ;
} sub ;
2010-11-03 16:03:04 +01:00
} redisAsyncContext ;
/* Functions that proxy to hiredis */
redisAsyncContext * redisAsyncConnect ( const char * ip , int port ) ;
2014-04-24 15:14:54 -04:00
redisAsyncContext * redisAsyncConnectBind ( const char * ip , int port , const char * source_addr ) ;
2016-12-21 12:11:56 +01:00
redisAsyncContext * redisAsyncConnectBindWithReuse ( const char * ip , int port ,
const char * source_addr ) ;
2011-04-19 23:07:36 +02:00
redisAsyncContext * redisAsyncConnectUnix ( const char * path ) ;
2010-12-16 23:32:02 +01:00
int redisAsyncSetConnectCallback ( redisAsyncContext * ac , redisConnectCallback * fn ) ;
2010-11-03 16:03:04 +01:00
int redisAsyncSetDisconnectCallback ( redisAsyncContext * ac , redisDisconnectCallback * fn ) ;
void redisAsyncDisconnect ( redisAsyncContext * ac ) ;
2011-04-19 23:07:36 +02:00
void redisAsyncFree ( redisAsyncContext * ac ) ;
2010-11-03 16:03:04 +01:00
/* Handle read/write events */
void redisAsyncHandleRead ( redisAsyncContext * ac ) ;
void redisAsyncHandleWrite ( redisAsyncContext * ac ) ;
/* Command functions for an async context. Write the command to the
* output buffer and register the provided callback . */
int redisvAsyncCommand ( redisAsyncContext * ac , redisCallbackFn * fn , void * privdata , const char * format , va_list ap ) ;
int redisAsyncCommand ( redisAsyncContext * ac , redisCallbackFn * fn , void * privdata , const char * format , . . . ) ;
int redisAsyncCommandArgv ( redisAsyncContext * ac , redisCallbackFn * fn , void * privdata , int argc , const char * * argv , const size_t * argvlen ) ;
2016-12-21 12:11:56 +01:00
int redisAsyncFormattedCommand ( redisAsyncContext * ac , redisCallbackFn * fn , void * privdata , const char * cmd , size_t len ) ;
2010-11-03 16:03:04 +01:00
2010-12-16 23:32:02 +01:00
# ifdef __cplusplus
}
# endif
2010-11-03 16:03:04 +01:00
# endif