Skip to content

Commit

Permalink
lua: port obsolete memcache to memcached
Browse files Browse the repository at this point in the history
  • Loading branch information
razvancrainea committed Feb 22, 2016
1 parent 6ec4106 commit 1ba0327
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 95 deletions.
1 change: 0 additions & 1 deletion .travis.yml
Expand Up @@ -32,5 +32,4 @@ addons:
- liblua5.1-0-dev
- libncurses5-dev
- libjson0-dev
- libmemcache-dev
script: FASTER=1 make exclude_modules="db_oracle osp sngtc cachedb_cassandra cachedb_couchbase cachedb_mongodb" all
4 changes: 2 additions & 2 deletions modules/lua/Makefile
Expand Up @@ -11,8 +11,8 @@ LIB_LUA = $(shell pkg-config --libs lua5.1 2> /dev/null) $(shell pkg-config --li
ifeq (,$(findstring -l,$(LIB_LUA)))
LIB_LUA = -llua
endif
DEFS += $(shell $(MYSQLCFG) --include | sed 's/\(-I.*\)\/mysql/\1/g' ) -I/usr/include/lua5.1/
LIBS += $(shell $(MYSQLCFG) --libs) -L/usr/lib/ -L/usr/local/lib/ -lmemcache $(LIB_LUA)
DEFS += $(shell $(MYSQLCFG) --include | sed 's/\(-I.*\)\/mysql/\1/g' ) -I/usr/include/lua5.1/ -I$(LOCALBASE)/include/memcached
LIBS += $(shell $(MYSQLCFG) --libs) -L/usr/lib/ -L/usr/local/lib/ -lmemcached $(LIB_LUA)

include ../../Makefile.modules

Expand Down
193 changes: 101 additions & 92 deletions modules/lua/sipmemcache.c
Expand Up @@ -22,32 +22,22 @@

#include <lua.h>
#include <lauxlib.h>
#include <memcache.h>
#include <netinet/in.h>
#include <libmemcached/memcached.h>

#include "../../mem/mem.h"
#include "../../ut.h"

#include "sipluafunc.h"

struct sipmemcache
{
int finalized;
struct memcache *mc;
struct memcache_req *req;
struct memcache_res **res;
memcached_st memc;
const char **keys;
size_t *keyslen;
};

/* Ouhla dis-donc, c'est dangereux ca! */
static struct sipmemcache *coin;

static int32_t sipmemcache_error(MCM_ERR_FUNC_ARGS)
{
struct memcache_err_ctxt *err = MCM_ERR_FUNC_ERR_CTXT;

err->cont = 'y';
coin->finalized = 1;
return 0;
}

static int l_sipmemcache_new(lua_State *L)
{
struct sipmemcache *o;
Expand All @@ -56,137 +46,156 @@ static int l_sipmemcache_new(lua_State *L)
memset(o, '\0', sizeof(*o));
luaL_getmetatable(L, "siplua.memcache");
lua_setmetatable(L, -2);
o->mc = mc_new();
if (!o->mc)
if (!memcached_create(&o->memc) ||
memcached_behavior_set(&o->memc,
MEMCACHED_BEHAVIOR_NO_BLOCK,1) != MEMCACHED_SUCCESS
)
{
lua_remove(L, -1);
lua_pushnil(L);
}
mcErrSetup(sipmemcache_error);
coin = o;
return 1;
}

static int l_sipmemcache_server_add(lua_State *L)
{
memcached_server_st *servers = NULL;
memcached_return rc;
struct sipmemcache *o;
const char *host;
const char *port;
int ret;
in_port_t iport;
str s;

o = luaL_checkudata(L, 1, "siplua.memcache");
host = luaL_checkstring(L, 2);
port = luaL_checkstring(L, 3);
if (o->finalized || !o->mc)
if (o->finalized)
{
lua_pushnil(L);
}
else
{
ret = mc_server_add(o->mc, host, port);
if (ret)
lua_pushboolean(L, 0);
else
lua_pushboolean(L, 1);
}
s.len = strlen(port);
s.s = (char *)port;
if (str2int(&s, (unsigned int *)&iport) < 0)
lua_pushboolean(L, 0);
else
lua_pushboolean(L, 1);
servers = memcached_server_list_append(servers, host, iport, &rc);
if (rc != MEMCACHED_SUCCESS) {
LM_ERR("cannot add server: %s\n", memcached_strerror(&o->memc, rc));
lua_pushboolean(L, 0);
} else
lua_pushboolean(L, 1);
rc = memcached_server_push(&o->memc, servers);
if (rc != MEMCACHED_SUCCESS) {
LM_ERR("cannot push server: %s\n", memcached_strerror(&o->memc, rc));
lua_pushboolean(L, 0);
} else
lua_pushboolean(L, 1);
}
return 1;
}

static int sipmemcache_storage_cmds(lua_State *L,
int (*f)(struct memcache *mc,
char *key, const size_t key_len,
const void *val, const size_t bytes,
const time_t expire, const u_int16_t flags))
memcached_return (*f)(memcached_st *ptr,
const char *key,
size_t key_length,
const char *value,
size_t value_length,
time_t expiration,
uint32_t flags))
{
struct sipmemcache *o;
const char *key, *val;
size_t keylen, bytes;
int ret;
int expire;
size_t keyslen, bytes;
time_t expire;

o = luaL_checkudata(L, 1, "siplua.memcache");
key = luaL_checklstring(L, 2, &keylen);
key = luaL_checklstring(L, 2, &keyslen);
val = luaL_checklstring(L, 3, &bytes);
expire = luaL_optinteger(L, 4, 3600);
if (o->finalized || !o->mc)
if (o->finalized)
{
lua_pushnil(L);
}
else
{
int flags = 0;
ret = f(o->mc, (char *)key, keylen, val, bytes, expire, flags);
lua_pushinteger(L, ret);
if (f(&o->memc, key, keyslen, val, bytes, expire, 0) == MEMCACHED_SUCCESS)
lua_pushinteger(L, 0);
else
lua_pushinteger(L, -1);
}
return 1;
}

static int l_sipmemcache_add(lua_State *L)
{
return sipmemcache_storage_cmds(L, mc_add);
return sipmemcache_storage_cmds(L, memcached_add);
}

static int l_sipmemcache_replace(lua_State *L)
{
return sipmemcache_storage_cmds(L, mc_replace);
return sipmemcache_storage_cmds(L, memcached_replace);
}

static int l_sipmemcache_set(lua_State *L)
{
return sipmemcache_storage_cmds(L, mc_set);
return sipmemcache_storage_cmds(L, memcached_set);
}

static int sipmemcache_atomic_opts(lua_State *L, u_int32_t (*f)(struct memcache *mc,
char *key, const size_t key_len,
const u_int32_t val))
static int sipmemcache_atomic_opts(lua_State *L, u_int32_t (*f)(memcached_st *st,
const char *key, size_t key_len,
const uint32_t offset, uint64_t *value))
{
struct sipmemcache *o;
const char *key;
size_t keylen;
size_t keyslen;
uint64_t res;
int nb;

o = luaL_checkudata(L, 1, "siplua.memcache");
key = luaL_checklstring(L, 2, &keylen);
key = luaL_checklstring(L, 2, &keyslen);
nb = luaL_checkinteger(L, 3);
if (o->finalized || !o->mc)
if (o->finalized)
{
lua_pushnil(L);
}
else
{
nb = f(o->mc, (char *)key, keylen, nb);
lua_pushinteger(L, nb);
if (f(&o->memc, key, keyslen, nb, &res) == MEMCACHED_SUCCESS)
lua_pushinteger(L, (int)res);
}
return 1;
}

static int l_sipmemcache_incr(lua_State *L)
{
return sipmemcache_atomic_opts(L, mc_incr);
return sipmemcache_atomic_opts(L, memcached_increment);
}

static int l_sipmemcache_decr(lua_State *L)
{
return sipmemcache_atomic_opts(L, mc_decr);
return sipmemcache_atomic_opts(L, memcached_decrement);
}

static int l_sipmemcache_delete(lua_State *L)
{
struct sipmemcache *o;
const char *key;
size_t keylen;
int ret;
size_t keyslen;
memcached_return ret;

o = luaL_checkudata(L, 1, "siplua.memcache");
key = luaL_checklstring(L, 2, &keylen);
if (o->finalized || !o->mc)
key = luaL_checklstring(L, 2, &keyslen);
if (o->finalized)
{
lua_pushnil(L);
}
else
{
int hold_timer = 0;
ret = mc_delete(o->mc, (char *)key, keylen, hold_timer);
ret = memcached_delete(&o->memc, (char *)key, keyslen, 0);
lua_pushinteger(L, ret);
}
return 1;
Expand All @@ -196,20 +205,21 @@ static int l_sipmemcache_get(lua_State *L)
{
struct sipmemcache *o;
const char *key;
size_t keylen;
void *blah;
size_t keyslen;
char *blah;
size_t retlen;
memcached_return_t rc;

o = luaL_checkudata(L, 1, "siplua.memcache");
key = luaL_checklstring(L, 2, &keylen);
if (o->finalized || !o->mc)
key = luaL_checklstring(L, 2, &keyslen);
if (o->finalized)
{
lua_pushnil(L);
}
else
{
blah = mc_aget2(o->mc, (char *)key, keylen, &retlen);
if (retlen && blah)
blah = memcached_get(&o->memc, (char *)key, keyslen, &retlen, 0, &rc);
if (rc == MEMCACHED_SUCCESS && blah)
{
lua_pushlstring(L, blah, retlen);
free(blah);
Expand All @@ -225,20 +235,19 @@ static void sipmemcache_close(lua_State *L)
struct sipmemcache *o;

o = luaL_checkudata(L, 1, "siplua.memcache");
if (!o->finalized && o->mc)
if (!o->finalized)
{
if (o->res)
if (o->keys)
{
pkg_free(o->res);
o->res = NULL;
pkg_free(o->keys);
o->keys = NULL;
}
if (o->req)
if (o->keyslen)
{
mc_req_free(o->req);
o->req = NULL;
pkg_free(o->keyslen);
o->keyslen = NULL;
}
mc_free(o->mc);
o->mc = NULL;
memcached_quit(&o->memc);
o->finalized = 1;
}
}
Expand Down Expand Up @@ -269,12 +278,12 @@ int l_sipmemcache___index(lua_State *L)
int l_sipmemcache_multi_get(lua_State *L)
{
struct sipmemcache *o;
const char *key;
size_t key_len;
int i, n;
memcached_return rc;
memcached_result_st res;

o = luaL_checkudata(L, 1, "siplua.memcache");
if (o->finalized || !o->mc)
if (o->finalized)
{
lua_pushnil(L);
return 1;
Expand All @@ -283,31 +292,31 @@ int l_sipmemcache_multi_get(lua_State *L)
lua_newtable(L);
if (n < 2)
return 1;
o->req = mc_req_new();
o->res = pkg_malloc((n - 1) * sizeof(struct memcache_res *));
o->keys = pkg_malloc((n - 1) * sizeof(char *));
o->keyslen = pkg_malloc((n - 1) * sizeof(size_t));
for (i = 0; i < n - 1; ++i)
{
key = luaL_checklstring(L, i + 2, &key_len);
o->res[i] = mc_req_add(o->req, (char *)key, key_len);
o->keys[i] = luaL_checklstring(L, i + 2, &o->keyslen[i]);
/* o->res[i]->size = 1024; */
/* o->res[i]->val = malloc(o->res[i]->size); */
/* mc_res_free_on_delete(o->res[i], 1); */
}
mc_get(o->mc, o->req);
if (memcached_mget(&o->memc, o->keys, o->keyslen, n) == MEMCACHED_SUCCESS) {
for (i = 0; i < n - 1; ++i)
{
if (o->res[i]->bytes)
{
lua_pushvalue(L, i + 2);
lua_pushlstring(L, o->res[i]->val, o->res[i]->bytes);
lua_rawset(L, -3);
}
if (memcached_fetch_result(&o->memc, &res, &rc))
{
lua_pushvalue(L, i + 2);
lua_pushlstring(L, memcached_result_value(&res), memcached_result_length(&res));
lua_rawset(L, -3);
}
/* mc_res_free(o->req, o->res[i]); */
}
pkg_free(o->res);
o->res = NULL;
mc_req_free(o->req);
o->req = NULL;
}
pkg_free(o->keys);
o->keys = NULL;
pkg_free(o->keyslen);
o->keyslen = NULL;
return 1;
}

Expand Down

0 comments on commit 1ba0327

Please sign in to comment.