summaryrefslogtreecommitdiffstats
path: root/preload-redis.h
diff options
context:
space:
mode:
authorRemi Collet <remi@remirepo.net>2019-10-18 15:00:46 +0200
committerRemi Collet <remi@remirepo.net>2019-10-18 15:00:46 +0200
commit68bb93d4659f1665719af2a284b672d0d80adf01 (patch)
tree7048aec872dda8be875aa74f4fb0de519e281053 /preload-redis.h
initial work
Diffstat (limited to 'preload-redis.h')
-rw-r--r--preload-redis.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/preload-redis.h b/preload-redis.h
new file mode 100644
index 0000000..fe3673d
--- /dev/null
+++ b/preload-redis.h
@@ -0,0 +1,83 @@
+#define FFI_SCOPE "_REMI_REDIS_"
+#define FFI_LIB "libhiredis.so.0"
+
+/* Copy/paste from hiredis/hiredis.h and hiredis/read.h */
+
+typedef struct redisReadTask {
+ int type;
+ int elements; /* number of elements in multibulk container */
+ int idx; /* index in parent (array) object */
+ void *obj; /* holds user-generated value for a read task */
+ struct redisReadTask *parent; /* parent task */
+ void *privdata; /* user-settable arbitrary field */
+} redisReadTask;
+
+
+typedef struct redisReplyObjectFunctions {
+ void *(*createString)(const redisReadTask*, char*, size_t);
+ void *(*createArray)(const redisReadTask*, int);
+ void *(*createInteger)(const redisReadTask*, long long);
+ void *(*createNil)(const redisReadTask*);
+ void (*freeObject)(void*);
+} redisReplyObjectFunctions;
+
+typedef struct redisReader {
+ int err; /* Error flags, 0 when there is no error */
+ char errstr[128]; /* String representation of error when applicable */
+
+ char *buf; /* Read buffer */
+ size_t pos; /* Buffer cursor */
+ size_t len; /* Buffer length */
+ size_t maxbuf; /* Max length of unused buffer */
+
+ redisReadTask rstack[9];
+ int ridx; /* Index of current read task */
+ void *reply; /* Temporary reply pointer */
+
+ redisReplyObjectFunctions *fn;
+ void *privdata;
+} redisReader;
+
+enum redisConnectionType {
+ REDIS_CONN_TCP,
+ REDIS_CONN_UNIX,
+};
+
+typedef struct redisReply {
+ int type; /* REDIS_REPLY_* */
+ long long integer; /* The integer when type is REDIS_REPLY_INTEGER */
+ int len; /* Length of string */
+ char *str; /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING */
+ size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */
+ struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */
+} redisReply;
+
+typedef struct redisContext {
+ int err; /* Error flags, 0 when there is no error */
+ char errstr[128]; /* String representation of error when applicable */
+ int fd;
+ int flags;
+ char *obuf; /* Write buffer */
+ redisReader *reader; /* Protocol reader */
+
+ enum redisConnectionType connection_type;
+ struct timeval *timeout;
+
+ struct {
+ char *host;
+ char *source_addr;
+ int port;
+ } tcp;
+
+ struct {
+ char *path;
+ } unix_sock;
+
+} redisContext;
+
+void redisFree(redisContext *c);
+redisContext *redisConnect(const char *ip, int port);
+redisContext *redisConnectUnix(const char *path);
+redisReply *redisCommand(redisContext *c, const char *format, ...);
+void freeReplyObject(void *reply);
+