/* fwmkeys */ JNIEXPORT jobject JNICALL Java_tokyotyrant_TCRDB_fwmkeys (JNIEnv *env, jobject self, jbyteArray prefix, jint max){ if(!prefix){ throwillarg(env); return NULL; } TCRDB *tcrdb = (TCRDB *)(intptr_t)(*env)->GetLongField(env, self, tcrdb_fid_ptr); jboolean icp; jbyte *pbuf = (*env)->GetByteArrayElements(env, prefix, &icp); if(!pbuf){ throwoutmem(env); return NULL; } int psiz = (*env)->GetArrayLength(env, prefix); TCLIST *tkeys = tcrdbfwmkeys(tcrdb, pbuf, psiz, max); jclass clslist = (*env)->FindClass(env, CLSARRAYLIST); jmethodID midinit = (*env)->GetMethodID(env, clslist, "<init>", "()V"); jobject pkeys = (*env)->NewObject(env, clslist, midinit); jmethodID midadd = (*env)->GetMethodID(env, clslist, "add", "(L" CLSOBJECT ";)Z"); for(int i = 0; i < tclistnum(tkeys); i++){ int ksiz; const char *kbuf = tclistval(tkeys, i, &ksiz); jbyteArray pkey = (*env)->NewByteArray(env, ksiz); (*env)->SetByteArrayRegion(env, pkey, 0, ksiz, (jbyte *)kbuf); (*env)->CallVoidMethod(env, pkeys, midadd, pkey); (*env)->DeleteLocalRef(env, pkey); } tclistdel(tkeys); if(icp) (*env)->ReleaseByteArrayElements(env, prefix, pbuf, JNI_ABORT); return pkeys; }
static int rdb_fwmkeys(lua_State *L){ TCRDB *rdb = rdb_getrdb(L, 1); size_t psiz = 0; const char *prefix = rdb_getarg(L, 2, &psiz); int max = luaL_optint(L, 3, -1); TCLIST *keys = tcrdbfwmkeys(rdb, prefix, psiz, max); tclist2array(L, keys); tclistdel(keys); return 1; }
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_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; }