return ud ? ((struct cdb_make *)ud) : NULL;
}
+static const char *
+lua_cdb_get_input (lua_State *L, int pos, gsize *olen)
+{
+ int t = lua_type (L, pos);
+
+ switch (t) {
+ case LUA_TSTRING:
+ return lua_tolstring (L, pos, olen);
+ case LUA_TNUMBER: {
+ static char numbuf[sizeof(lua_Number)];
+ lua_Number n = lua_tonumber(L, pos);
+ memcpy(numbuf, &n, sizeof(numbuf));
+ *olen = sizeof(n);
+ return numbuf;
+ }
+ case LUA_TUSERDATA: {
+ void *p = rspamd_lua_check_udata_maybe (L, pos, "rspamd{text}");
+ if (p) {
+ struct rspamd_lua_text *t = (struct rspamd_lua_text *)p;
+ *olen = t->len;
+ return t->start;
+ }
+
+ p = rspamd_lua_check_udata_maybe (L, pos, "rspamd{int64}");
+ if (p) {
+ static char numbuf[sizeof(gint64)];
+
+ memcpy(numbuf, p, sizeof(numbuf));
+ *olen = sizeof(numbuf);
+ return numbuf;
+ }
+ }
+ default:
+ break;
+ }
+
+ return NULL;
+}
+
static gint
lua_cdb_create (lua_State *L)
{
{
struct cdb *cdb = lua_check_cdb (L, 1);
gsize klen;
- const gchar *what = luaL_checklstring(L, 2, &klen);
+ const gchar *what = lua_cdb_get_input(L, 2, &klen);
if (!cdb || what == NULL) {
return lua_error (L);
{
struct cdb_make *cdbm = lua_check_cdb_builder(L, 1);
gsize data_sz, key_sz;
- const char *key = lua_tolstring (L, 2, &key_sz);
- const char *data = lua_tolstring (L, 3, &data_sz);
+ const char *key = lua_cdb_get_input (L, 2, &key_sz);
+ const char *data = lua_cdb_get_input (L, 3, &data_sz);
if (cdbm == NULL || key == NULL || data == NULL || cdbm->cdb_fd == -1) {
return luaL_error(L, "invalid arguments");