#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <hiredis.h>
#include <async.h>
#include <adapters/libuv.h>
void
debugCallback(redisAsyncContext *c,
void
*r,
void
*privdata) {
(
void
)privdata;
redisReply *reply = r;
if
(reply == NULL) {
printf
(
"`DEBUG SLEEP` error: %s\n"
, c->errstr ? c->errstr :
"unknown error"
);
return
;
}
redisAsyncDisconnect(c);
}
void
getCallback(redisAsyncContext *c,
void
*r,
void
*privdata) {
redisReply *reply = r;
if
(reply == NULL) {
printf
(
"`GET key` error: %s\n"
, c->errstr ? c->errstr :
"unknown error"
);
return
;
}
printf
(
"`GET key` result: argv[%s]: %s\n"
, (
char
*)privdata, reply->str);
redisAsyncCommand(c, debugCallback, NULL,
"DEBUG SLEEP %f"
, 1.5);
}
void
connectCallback(
const
redisAsyncContext *c,
int
status) {
if
(status != REDIS_OK) {
printf
(
"connect error: %s\n"
, c->errstr);
return
;
}
printf
(
"Connected...\n"
);
}
void
disconnectCallback(
const
redisAsyncContext *c,
int
status) {
if
(status != REDIS_OK) {
printf
(
"disconnect because of error: %s\n"
, c->errstr);
return
;
}
printf
(
"Disconnected...\n"
);
}
int
main (
int
argc,
char
**argv) {
#ifndef _WIN32
signal
(SIGPIPE, SIG_IGN);
#endif
uv_loop_t* loop = uv_default_loop();
redisAsyncContext *c = redisAsyncConnect(
"127.0.0.1"
, 6379);
if
(c->err) {
printf
(
"Error: %s\n"
, c->errstr);
return
1;
}
redisLibuvAttach(c,loop);
redisAsyncSetConnectCallback(c,connectCallback);
redisAsyncSetDisconnectCallback(c,disconnectCallback);
redisAsyncSetTimeout(c, (
struct
timeval){ .tv_sec = 1, .tv_usec = 0});
redisAsyncCommand(c, NULL, NULL,
"SET key %b"
, argv[argc-1],
strlen
(argv[argc-1]));
redisAsyncCommand(c, getCallback, (
char
*)
"end-1"
,
"GET key"
);
uv_run(loop, UV_RUN_DEFAULT);
return
0;
}