static VALUE cDB_put_method(VALUE vself, VALUE vkey, VALUE vstr, int method){ int ecode; bool res; TCRDB *db; Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db); vkey = StringValueEx(vkey); vstr = StringValueEx(vstr); switch(method){ case TTPUT: res = tcrdbput2(db, RSTRING_PTR(vkey), RSTRING_PTR(vstr)); break; case TTPUTKEEP: res = tcrdbputkeep2(db, RSTRING_PTR(vkey), RSTRING_PTR(vstr)); break; case TTPUTCAT: res = tcrdbputcat2(db, RSTRING_PTR(vkey), RSTRING_PTR(vstr)); break; case TTPUTNR: res = tcrdbputnr2(db, RSTRING_PTR(vkey), RSTRING_PTR(vstr)); break; default: res = false; break; } if(!res){ ecode = tcrdbecode(db); rb_raise(eTokyoTyrantError, "put error: %s", tcrdberrmsg(ecode)); } return Qtrue; }
static VALUE mTokyoMessenger_ext(VALUE vself, VALUE vext, VALUE vkey, VALUE vvalue){ int vsiz; char *vbuf; TCRDB *db = mTokyoMessenger_getdb(vself); vext = StringValueEx(vext); vkey = StringValueEx(vkey); vvalue = StringValueEx(vvalue); if(!(vbuf = tcrdbext(db, RSTRING_PTR(vext), 0, RSTRING_PTR(vkey), RSTRING_LEN(vkey), RSTRING_PTR(vvalue), RSTRING_LEN(vvalue), &vsiz))){ return Qnil; } else { return rb_str_new(vbuf, vsiz); } }
static VALUE cDB_putshl(VALUE vself, VALUE vkey, VALUE vstr, VALUE vwidth){ int ecode; TCRDB *db; Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db); vkey = StringValueEx(vkey); vstr = StringValueEx(vstr); if(!tcrdbputshl2(db, RSTRING_PTR(vkey), RSTRING_PTR(vstr), FIXNUM_P(vwidth))){ ecode = tcrdbecode(db); rb_raise(eTokyoTyrantError, "put error: %s", tcrdberrmsg(ecode)); } return Qtrue; }
static VALUE mTokyoMessenger_adddouble(VALUE vself, VALUE vkey, double dnum){ TCRDB *db = mTokyoMessenger_getdb(vself); vkey = StringValueEx(vkey); dnum = tcrdbadddouble(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey), dnum); return isnan(dnum) ? Qnil : rb_float_new(dnum); }
static VALUE mTokyoMessenger_addint(VALUE vself, VALUE vkey, int inum){ TCRDB *db = mTokyoMessenger_getdb(vself); vkey = StringValueEx(vkey); inum = tcrdbaddint(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey), inum); return inum == INT_MIN ? Qnil : INT2NUM(inum); }
static VALUE cDB_vsiz(VALUE vself, VALUE vkey){ TCRDB *db; Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db); vkey = StringValueEx(vkey); return INT2NUM(tcrdbvsiz2(db, RSTRING_PTR(vkey))); }
extern TCMAP *vhashtomap(VALUE vhash){ VALUE vkeys, vkey, vval; TCMAP *map; int i, num; map = tcmapnew2(31); vkeys = rb_funcall(vhash, rb_intern("keys"), 0); num = RARRAY_LEN(vkeys); for(i = 0; i < num; i++){ vkey = rb_ary_entry(vkeys, i); vval = rb_hash_aref(vhash, vkey); vkey = StringValueEx(vkey); vval = StringValueEx(vval); tcmapput(map, RSTRING_PTR(vkey), RSTRING_LEN(vkey), RSTRING_PTR(vval), RSTRING_LEN(vval)); } return map; }
static VALUE cQuery_setorder(VALUE vself, VALUE vname, VALUE vtype){ VALUE vqry; RDBQRY *qry; vname = StringValueEx(vname); if (TYPE(vtype) == T_SYMBOL) vtype = rb_str_new2(rb_id2name(SYM2ID(vtype))); if (TYPE(vtype) == T_STRING){ vtype = StringValueEx(vtype); vtype = tctdbqrystrtoordertype(RSTRING_PTR(toupper(vtype))); vtype = INT2NUM(vtype); } vqry = rb_iv_get(vself, RDBQRYVNDATA); Data_Get_Struct(vqry, RDBQRY, qry); tcrdbqrysetorder(qry, RSTRING_PTR(vname), NUM2INT(vtype)); return vself; }
static VALUE mTokyoMessenger_add_int(int argc, VALUE *argv, VALUE vself){ VALUE vkey, vnum; int inum = 1; rb_scan_args(argc, argv, "11", &vkey, &vnum); vkey = StringValueEx(vkey); if(NIL_P(vnum)) vnum = INT2NUM(inum); return mTokyoMessenger_addint(vself, vkey, NUM2INT(vnum)); }
static VALUE mTokyoMessenger_add_double(int argc, VALUE *argv, VALUE vself){ VALUE vkey, vnum; double dnum = 1.0; rb_scan_args(argc, argv, "11", &vkey, &vnum); vkey = StringValueEx(vkey); if(NIL_P(vnum)) vnum = rb_float_new(dnum); return mTokyoMessenger_adddouble(vself, vkey, NUM2DBL(vnum)); }
static VALUE cQuery_addcond(VALUE vself, VALUE vname, VALUE vop, VALUE vexpr){ VALUE vqry; RDBQRY *qry; vname = StringValueEx(vname); vexpr = StringValueEx(vexpr); if (TYPE(vop) == T_SYMBOL) vop = rb_str_new2(rb_id2name(SYM2ID(vop))); if (TYPE(vop) == T_STRING){ vop = StringValueEx(vop); vop = tctdbqrystrtocondop(RSTRING_PTR(toupper(vop))); vop = INT2NUM(vop); } vqry = rb_iv_get(vself, RDBQRYVNDATA); Data_Get_Struct(vqry, RDBQRY, qry); tcrdbqryaddcond(qry, RSTRING_PTR(vname), NUM2INT(vop), RSTRING_PTR(vexpr)); return vself; }
static VALUE cDB_get(VALUE vself, VALUE vkey){ VALUE vval; char *vbuf; TCRDB *db; Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db); vkey = StringValueEx(vkey); if(!(vbuf = tcrdbget2(db, RSTRING_PTR(vkey)))) return Qnil; vval = rb_str_new2(vbuf); tcfree(vbuf); return vval; }
extern TCLIST *varytolist(VALUE vary){ VALUE vval; TCLIST *list; int i, num; num = RARRAY_LEN(vary); list = tclistnew2(num); for(i = 0; i < num; i++){ vval = rb_ary_entry(vary, i); vval = StringValueEx(vval); tclistpush(list, RSTRING_PTR(vval), RSTRING_LEN(vval)); } return list; }
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_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 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; }
extern TCLIST *vhashtolist(VALUE vhash){ /* Seems like something like this might work just as well vary = rb_hash_to_a(vhash); vary = rb_ary_flatten(vary); args = varytolist(vary); */ VALUE vkeys, vkey, vval; TCLIST *list; int i, num; vkeys = rb_funcall(vhash, rb_intern("keys"), 0); num = RARRAY_LEN(vkeys); list = tclistnew2(num); for(i = 0; i < num; i++){ vkey = rb_ary_entry(vkeys, i); vval = rb_hash_aref(vhash, vkey); vkey = StringValueEx(vkey); vval = StringValueEx(vval); tclistpush(list, RSTRING_PTR(vkey), RSTRING_LEN(vkey)); tclistpush(list, RSTRING_PTR(vval), RSTRING_LEN(vval)); } return list; }
static VALUE cDB_fetch(int argc, VALUE *argv, VALUE vself){ VALUE vkey, vdef, vval; TCRDB *db; char *vbuf; int vsiz; rb_scan_args(argc, argv, "11", &vkey, &vdef); vkey = StringValueEx(vkey); Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db); if((vbuf = tcrdbget(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey), &vsiz)) != NULL){ vval = rb_str_new(vbuf, vsiz); tcfree(vbuf); } else { vval = vdef; } return vval; }
static VALUE mTokyoMessenger_check(VALUE vself, VALUE vkey){ TCRDB *db = mTokyoMessenger_getdb(vself); vkey = StringValueEx(vkey); return tcrdbvsiz(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey)) >= 0 ? Qtrue : Qfalse; }