int xtcrdb_tblputkeep(void* rdb, const char* pkey, void* cols) { // XXX from sample code, I assume for safety... char pkbuf[256]; int pksiz = sprintf(pkbuf, "%s", pkey); return tcrdbtblputkeep(rdb, pkbuf, pksiz, cols); }
/* putimpl */ JNIEXPORT jboolean JNICALL Java_tokyotyrant_TCRDB_putimpl (JNIEnv *env, jobject self, jbyteArray pkey, jobjectArray cols, jint dmode){ if(!pkey || !cols){ throwillarg(env); return false; } TCRDB *tcrdb = (TCRDB *)(intptr_t)(*env)->GetLongField(env, self, tcrdb_fid_ptr); jboolean ick; jbyte *kbuf = (*env)->GetByteArrayElements(env, pkey, &ick); if(!kbuf){ throwoutmem(env); return false; } int ksiz = (*env)->GetArrayLength(env, pkey); jsize cnum = (*env)->GetArrayLength(env, cols); TCMAP *tcols = tcmapnew2(cnum + 1); cnum--; for(int i = 0; i < cnum; i += 2){ jobject name = (*env)->GetObjectArrayElement(env, cols, i); jboolean icn; jbyte *nbuf = (*env)->GetByteArrayElements(env, name, &icn); if(!nbuf){ throwoutmem(env); return false; } int nsiz = (*env)->GetArrayLength(env, name); jobject val = (*env)->GetObjectArrayElement(env, cols, i + 1); jboolean icv; jbyte *vbuf = (*env)->GetByteArrayElements(env, val, &icv); if(!vbuf){ throwoutmem(env); return false; } int vsiz = (*env)->GetArrayLength(env, val); tcmapputkeep(tcols, nbuf, nsiz, vbuf, vsiz); if(icv) (*env)->ReleaseByteArrayElements(env, val, vbuf, JNI_ABORT); if(icn) (*env)->ReleaseByteArrayElements(env, name, nbuf, JNI_ABORT); } bool rv; switch(dmode){ case 0: rv = tcrdbtblput(tcrdb, kbuf, ksiz, tcols); break; case 1: rv = tcrdbtblputkeep(tcrdb, kbuf, ksiz, tcols); break; case 2: rv = tcrdbtblputcat(tcrdb, kbuf, ksiz, tcols); break; default: rv = false; break; } tcmapdel(tcols); if(ick) (*env)->ReleaseByteArrayElements(env, pkey, kbuf, JNI_ABORT); return rv; }