// TODO: merge out and mout? static VALUE mTokyoMessenger_outlist(int argc, VALUE *argv, VALUE vself){ VALUE vkeys, vary, vvalue; TCLIST *list, *result; TCRDB *db = mTokyoMessenger_getdb(vself); rb_scan_args(argc, argv, "*", &vkeys); // I really hope there is a better way to do this if (RARRAY_LEN(vkeys) == 1) { vvalue = rb_ary_entry(vkeys, 0); switch (TYPE(vvalue)){ case T_STRING: case T_FIXNUM: break; case T_ARRAY: vkeys = vvalue; break; case T_OBJECT: vkeys = rb_convert_type(vvalue, T_ARRAY, "Array", "to_a"); break; } } Check_Type(vkeys, T_ARRAY); list = varytolist(vkeys); result = tcrdbmisc(db, "outlist", 0, list); tclistdel(list); vary = listtovary(result); tclistdel(result); return vary; }
static VALUE cDB_mput(VALUE vself, VALUE vhash){ VALUE vary; TCRDB *db; TCLIST *list, *args; Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db); args = vhashtolist(vhash); list = tcrdbmisc(db, "putlist", 0, args); vary = listtovary(list); tclistdel(args); tclistdel(list); return vary; }
static VALUE mTokyoMessenger_misc(int argc, VALUE *argv, VALUE vself){ VALUE vname, vopts, vargs, vary; TCLIST *list, *args; TCRDB *db = mTokyoMessenger_getdb(vself); rb_scan_args(argc, argv, "13", &vname, &vopts, &vargs); args = varytolist(vargs); vname = StringValueEx(vname); list = tcrdbmisc(db, RSTRING_PTR(vname), NUM2INT(vopts), args); vary = listtovary(list); tclistdel(list); return vary; }
static VALUE mTokyoMessenger_delete_keys_with_prefix(int argc, VALUE *argv, VALUE vself){ VALUE vprefix, vmax; TCLIST *keys; int max; TCRDB *db = mTokyoMessenger_getdb(vself); rb_scan_args(argc, argv, "11", &vprefix, &vmax); vprefix = StringValueEx(vprefix); max = (vmax == Qnil) ? -1 : NUM2INT(vmax); keys = tcrdbfwmkeys(db, RSTRING_PTR(vprefix), RSTRING_LEN(vprefix), max); tcrdbmisc(db, "outlist", 0, keys); tclistdel(keys); return Qnil; }
static int rdb_out(lua_State *L){ TCRDB *rdb = rdb_getrdb(L, 1); int type = lua_type(L, 2); if(type==LUA_TSTRING || type==LUA_TNUMBER){ size_t ksiz = 0; const char *key = rdb_getarg(L, 2, &ksiz); if(!tcrdbout(rdb, key, ksiz)) return rdb_error(L, rdb); } else if(type==LUA_TTABLE){ TCLIST *list = array2tclist(L, 2); int opts = luaL_optint(L, 3, 0); TCLIST *useless = tcrdbmisc(rdb, "outlist", opts, list); tclistdel(list); tclistdel(useless); } else return luaL_argerror(L, 2, "must be table, string, or number"); lua_pushboolean(L, 1); return 1; }
static int rdb_put(lua_State *L){ TCRDB *rdb = rdb_getrdb(L, 1); int type = lua_type(L, 2); if(type==LUA_TSTRING || type==LUA_TNUMBER){ size_t ksiz = 0; size_t vsiz = 0; const char *key = rdb_getarg(L, 2, &ksiz); const char *value = rdb_getarg(L, 3, &vsiz); int width; // get option & hit db switch(luaL_optint(L, 4, RDBPUT)){ case RDBPUT: if(!tcrdbput(rdb, key, ksiz, value, vsiz)) return rdb_error(L, rdb); break; case RDBPUTKEEP: if(!tcrdbputkeep(rdb, key, ksiz, value, vsiz)) return rdb_error(L, rdb); break; case RDBPUTCAT: if(!tcrdbputcat(rdb, key, ksiz, value, vsiz)) return rdb_error(L, rdb); break; case RDBPUTSHL: width = luaL_checknumber(L, 4); if(!tcrdbputshl(rdb, key, ksiz, value, vsiz, width)) return rdb_error(L, rdb); break; case RDBPUTNR: if(!tcrdbputnr(rdb, key, ksiz, value, vsiz)) return rdb_error(L, rdb); break; } } else if(type==LUA_TTABLE){ TCLIST *list = hash2tclist(L, 2); int opts = luaL_optint(L, 3, 0); TCLIST *useless = tcrdbmisc(rdb, "putlist", opts, list); tclistdel(list); tclistdel(useless); } else return luaL_argerror(L, 2, "must be table, string, or number"); lua_pushboolean(L, 1); return 1; }
static int rdb_get(lua_State *L){ TCRDB *rdb = rdb_getrdb(L, 1); int type = lua_type(L, 2); if(type==LUA_TSTRING || type==LUA_TNUMBER){ size_t ksiz = 0; const char *key = rdb_getarg(L, 2, &ksiz); int sp; char *value = tcrdbget(rdb, key, ksiz, &sp); if(value){ lua_pushlstring(L, value, sp); free(value); } else lua_pushnil(L); } else if(type==LUA_TTABLE){ TCLIST *list = array2tclist(L, 2); int opts = luaL_optint(L, 3, 0); TCLIST *pairs = tcrdbmisc(rdb, "getlist", opts, list); tclist2hash(L, pairs); tclistdel(list); tclistdel(pairs); } else return luaL_argerror(L, 2, "must be table, string, or number"); return 1; }