// 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;
}
Example #2
0
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;
}
Example #5
0
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;
}
Example #6
0
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;
}
Example #7
0
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;
}