Files
sdb/memcache/client.c
pancake 63fccb874a Bring back some bugs to make memcached work
Add memcache test.sh for regressions
2014-04-13 14:33:00 +02:00

115 lines
2.9 KiB
C

/* mcsdb - LGPLv3 - Copyright 2011-2014 - pancake */
#include "mcsdb.h"
McSdbClient *mcsdb_client_new (const char *host, const char *port) {
McSdbClient *ms;
int fd = net_connect (host, port);
if (fd == -1)
return NULL;
ms = R_NEW (McSdbClient);
memset (ms, 0, sizeof (McSdbClient));
ms->fd = fd;
return ms;
}
void mcsdb_client_free (McSdbClient* ms) {
net_close (ms->fd);
free (ms);
}
char *mcsdb_client_incr (McSdbClient *ms, const char *key, ut64 val) {
net_printf (ms->fd, "incr %s %lld\r\n", key, val);
net_flush (ms->fd);
return net_readnl (ms->fd);
}
char *mcsdb_client_decr (McSdbClient *ms, const char *key, ut64 val) {
net_printf (ms->fd, "decr %s %lld\r\n", key, val);
net_flush (ms->fd);
return net_readnl (ms->fd);
}
void mcsdb_client_set (McSdbClient *ms, const char *key, const char *body, ut64 exptime UNUSED) {
net_printf (ms->fd, "set %s 0 0 %d\r\n", key, strlen (body));
net_flush (ms->fd);
net_printf (ms->fd, "%s\r\n", body);
net_flush (ms->fd);
free (net_readnl (ms->fd));
}
static int sendcmd (int fd, const char *cmd UNUSED, const char *key, const char *body, ut64 exptime UNUSED) {
int ret;
char *res;
net_printf (fd, "add %s 0 0 %d\r\n", key, strlen (body));
net_flush (fd);
net_printf (fd, "%s\r\n", body);
net_flush (fd);
res = net_readnl (fd);
ret = strstr (res, "NOT")? 0: 1;
free (res);
return ret;
}
int mcsdb_client_add (McSdbClient *ms, const char *key, const char *body, ut64 exptime) {
return sendcmd (ms->fd, "add", key, body, exptime);
}
int mcsdb_client_append (McSdbClient *ms, const char *key, const char *body, ut64 exptime) {
return sendcmd (ms->fd, "append", key, body, exptime);
}
int mcsdb_client_prepend (McSdbClient *ms, const char *key, const char *body, ut64 exptime) {
return sendcmd (ms->fd, "prepend", key, body, exptime);
}
int mcsdb_client_replace (McSdbClient *ms, const char *key, const char *body, ut64 exptime) {
return sendcmd (ms->fd, "replace", key, body, exptime);
}
char *mcsdb_client_get (McSdbClient *ms, const char *key, ut64 *exptime) {
int sexp, slen = 0;
char *buf, *p;
net_printf (ms->fd, "get %s\r\n", key);
net_flush (ms->fd);
buf = net_readnl (ms->fd);
if (!buf)
return NULL;
buf[strlen (buf)]=0;
if (!memcmp (buf, "END", 3)) {
free (buf);
return NULL;
}
p = strchr (buf, ' ');
if (p && (p = strchr (p+1, ' '))) {
sscanf (p+1, "%d %d", &sexp, &slen);
} else {
free (buf);
return NULL;
}
free (buf);
if (exptime)
*exptime = sexp;
if (slen<1)
return NULL;
buf = malloc (slen+2);
if (buf) {
int rv = read (ms->fd, buf, slen+2);
buf[R_MAX(0,rv-1)] = 0;
}
free (net_readnl (ms->fd)); // read END
return buf;
}
int mcsdb_client_remove (McSdbClient *ms, const char *key, ut64 exptime) {
int ret;
char *res;
net_printf (ms->fd, "delete %s %lld 0\r\n", key, exptime);
net_flush (ms->fd);
res = net_readnl (ms->fd);
ret = strstr (res, "NOT")? 0: 1;
free (res);
return ret;
}