/* Create a result map object. */ RESMAP *resmap_new(void){ RESMAP *resmap; resmap = cbmalloc(sizeof(RESMAP)); resmap->uris = cbmapopen(); pthread_mutex_init(&(resmap->mutex), NULL); return resmap; }
/* get a map of the cookie */ CBMAP *getcookie(void){ CBMAP *params; CBLIST *pairs; char *rbuf, *buf, *key, *val, *dkey, *dval; int i; params = cbmapopen(); rbuf = NULL; buf = NULL; buf = getenv("HTTP_COOKIE"); if(buf != NULL){ buf = cbmemdup(buf, -1); pairs = cbsplit(buf, -1, ";"); for(i = 0; i < cblistnum(pairs); i++){ key = cbmemdup(cblistval(pairs, i, NULL), -1); if((val = strchr(key, '=')) != NULL){ *(val++) = '\0'; dkey = cburldecode(key, NULL); dval = cburldecode(val, NULL); cbmapput(params, dkey, -1, dval, -1, FALSE); free(dval); free(dkey); } free(key); } cblistclose(pairs); free(buf); } else { return NULL; } return params; }
/* Create a user manager object. */ UMGR *umgr_new(const char *rootdir){ UMGR *umgr; assert(rootdir); log_print(LL_INFO, "starting the user manager"); umgr = cbmalloc(sizeof(UMGR)); umgr->rootdir = cbmemdup(rootdir, -1); umgr->users = cbmapopen(); return umgr; }
/* search */ JNIEXPORT jobject JNICALL Java_estraier_Database_search(JNIEnv *env, jobject obj, jobject cond){ jclass cls; jfieldID fid; jmethodID mid; jlong coreptr, condptr; jintArray resary; jint *resaryptr; jobject hintsobj, resobj; jboolean icresary; CBMAP *hints; int i, *res, rnum; cls = (*env)->GetObjectClass(env, obj); fid = (*env)->GetFieldID(env, cls, "coreptr", "J"); coreptr = (*env)->GetLongField(env, obj, fid); if(coreptr == 0 || !cond || !isinstanceof(env, cond, CLSCOND)){ throwillarg(env); return NULL; } cls = (*env)->GetObjectClass(env, cond); fid = (*env)->GetFieldID(env, cls, "coreptr", "J"); condptr = (*env)->GetLongField(env, cond, fid); hints = cbmapopen(); res = est_mtdb_search((ESTMTDB *)(PTRNUM)coreptr, (ESTCOND *)(PTRNUM)condptr, &rnum, hints); if(!(resary = (*env)->NewIntArray(env, rnum))){ throwoutmem(env); return NULL; } resaryptr = (*env)->GetIntArrayElements(env, resary, &icresary); for(i = 0; i < rnum; i++){ resaryptr[i] = res[i]; } if(icresary == JNI_TRUE) (*env)->ReleaseIntArrayElements(env, resary, resaryptr, 0); cls = (*env)->FindClass(env, CLSRES); mid = (*env)->GetMethodID(env, cls, "<init>", "([IL" CLSMAP ";J)V"); hintsobj = cbmaptoobj(env, hints); if(!(resobj = (*env)->NewObject(env, cls, mid, resary, hintsobj, (PTRNUM)est_cond_dup((ESTCOND *)(PTRNUM)condptr)))){ throwoutmem(env); return NULL; } free(res); cbmapclose(hints); return resobj; }
/* get a map of the CGI parameters */ CBMAP *getparams(void){ CBMAP *params; CBLIST *pairs; char *rbuf, *buf, *key, *val, *dkey, *dval; const char *tmp; int i, len, c; params = cbmapopen(); rbuf = NULL; buf = NULL; if((tmp = getenv("CONTENT_LENGTH")) != NULL && (len = atoi(tmp)) > 0 && len <= RDATAMAX){ rbuf = cbmalloc(len + 1); for(i = 0; i < len && (c = getchar()) != EOF; i++){ rbuf[i] = c; } rbuf[i] = '\0'; if(i == len) buf = rbuf; } else { buf = getenv("QUERY_STRING"); } if(buf != NULL){ buf = cbmemdup(buf, -1); pairs = cbsplit(buf, -1, "&"); for(i = 0; i < cblistnum(pairs); i++){ key = cbmemdup(cblistval(pairs, i, NULL), -1); if((val = strchr(key, '=')) != NULL){ *(val++) = '\0'; dkey = cburldecode(key, NULL); dval = cburldecode(val, NULL); cbmapput(params, dkey, -1, dval, -1, FALSE); free(dval); free(dkey); } free(key); } cblistclose(pairs); free(buf); } free(rbuf); return params; }
/* search_meta */ JNIEXPORT jobject JNICALL Java_estraier_Database_search_1meta(JNIEnv *env, jclass cls, jobjectArray dbary, jobject cond){ jfieldID fid; jmethodID mid; jobject dbobj, hintsobj, resobj; jlong coreptr, condptr; jintArray resary, idxary; jint *resaryptr, *idxaryptr; jboolean icresary, icidxary; ESTMTDB **dbs; CBMAP *hints; int i, dbnum, *res, rnum; fid = (*env)->GetFieldID(env, cls, "coreptr", "J"); if(!dbary || !cond || !isinstanceof(env, cond, CLSCOND)){ throwillarg(env); return NULL; } dbnum = (int)((*env)->GetArrayLength(env, dbary)); dbs = cbmalloc(dbnum * sizeof(ESTMTDB) + 1); for(i = 0; i < dbnum; i++){ dbobj = (*env)->GetObjectArrayElement(env, dbary, i); if(!dbobj || !isinstanceof(env, dbobj, CLSDB)){ throwillarg(env); return NULL; } coreptr = (*env)->GetLongField(env, dbobj, fid); if(coreptr == 0){ throwillarg(env); return NULL; } dbs[i] = (ESTMTDB *)(PTRNUM)coreptr; } cls = (*env)->GetObjectClass(env, cond); fid = (*env)->GetFieldID(env, cls, "coreptr", "J"); condptr = (*env)->GetLongField(env, cond, fid); hints = cbmapopen(); res = est_mtdb_search_meta(dbs, dbnum, (ESTCOND *)(PTRNUM)condptr, &rnum, hints); if(!(resary = (*env)->NewIntArray(env, rnum / 2))){ throwoutmem(env); return NULL; } resaryptr = (*env)->GetIntArrayElements(env, resary, &icresary); for(i = 0; i < rnum; i += 2){ resaryptr[i/2] = res[i+1]; } if(icresary == JNI_TRUE) (*env)->ReleaseIntArrayElements(env, resary, resaryptr, 0); if(!(idxary = (*env)->NewIntArray(env, rnum / 2))){ throwoutmem(env); return NULL; } idxaryptr = (*env)->GetIntArrayElements(env, idxary, &icidxary); for(i = 0; i < rnum; i += 2){ idxaryptr[i/2] = res[i]; } if(icidxary == JNI_TRUE) (*env)->ReleaseIntArrayElements(env, idxary, idxaryptr, 0); cls = (*env)->FindClass(env, CLSRES); mid = (*env)->GetMethodID(env, cls, "<init>", "([I[IL" CLSMAP ";J)V"); hintsobj = cbmaptoobj(env, hints); if(!(resobj = (*env)->NewObject(env, cls, mid, resary, idxary, hintsobj, (PTRNUM)est_cond_dup((ESTCOND *)(PTRNUM)condptr)))){ throwoutmem(env); return NULL; } free(res); cbmapclose(hints); return resobj; }