// 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 cQuery_search(VALUE vself){ VALUE vqry, vary; RDBQRY *qry; TCLIST *res; vqry = rb_iv_get(vself, RDBQRYVNDATA); Data_Get_Struct(vqry, RDBQRY, qry); res = tcrdbqrysearch(qry); vary = listtovary(res); tclistdel(res); 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_fwmkeys(int argc, VALUE *argv, VALUE vself){ VALUE vprefix, vmax, vary; 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); vary = listtovary(keys); tclistdel(keys); return vary; }
static VALUE mTokyoMessenger_keys(VALUE vself){ /* VALUE vary; char *kxstr; TCRDB *db = mTokyoMessenger_getdb(vself); vary = rb_ary_new2(tcrdbrnum(db)); tcrdbiterinit(db); while((kxstr = tcrdbiternext2(db)) != NULL){ rb_ary_push(vary, rb_str_new2(kxstr)); } return vary; */ // Using forward matching keys with an empty string is 100x faster than iternext+get VALUE vary; TCLIST *keys; char *prefix; TCRDB *db = mTokyoMessenger_getdb(vself); prefix = ""; keys = tcrdbfwmkeys2(db, prefix, -1); vary = listtovary(keys); tclistdel(keys); return vary; }