CBMAP *objtocbmap(JNIEnv *env, jobject obj){ jclass map, set, it; jmethodID midks, midg, midit, midhn, midn; jobject ksobj, itobj, ekobj, evobj; jboolean ickey, icval; CBMAP *tmap; const char *tkey, *tval; assert(obj); tmap = cbmapopenex(31); map = (*env)->GetObjectClass(env, obj); midks = (*env)->GetMethodID(env, map, "keySet", "()L" CLSSET ";"); midg = (*env)->GetMethodID(env, map, "get", "(L" CLSOBJECT ";)L" CLSOBJECT ";"); ksobj = (*env)->CallObjectMethod(env, obj, midks); set = (*env)->GetObjectClass(env, ksobj); midit = (*env)->GetMethodID(env, set, "iterator", "()L" CLSITERATOR ";"); itobj = (*env)->CallObjectMethod(env, ksobj, midit); it = (*env)->GetObjectClass(env, itobj); midhn = (*env)->GetMethodID(env, it, "hasNext", "()Z"); midn = (*env)->GetMethodID(env, it, "next", "()L" CLSOBJECT ";"); while((*env)->CallBooleanMethod(env, itobj, midhn)){ ekobj = (*env)->CallObjectMethod(env, itobj, midn); if(!isinstanceof(env, ekobj, CLSSTRING)) continue; if(!(tkey = (*env)->GetStringUTFChars(env, ekobj, &ickey))) continue; evobj = (*env)->CallObjectMethod(env, obj, midg, ekobj); if(!isinstanceof(env, evobj, CLSSTRING) || !(tval = (*env)->GetStringUTFChars(env, evobj, &icval))){ if(ickey == JNI_TRUE) (*env)->ReleaseStringUTFChars(env, ekobj, tkey); continue; } cbmapput(tmap, tkey, -1, tval, -1, TRUE); if(icval == JNI_TRUE) (*env)->ReleaseStringUTFChars(env, evobj, tval); if(ickey == JNI_TRUE) (*env)->ReleaseStringUTFChars(env, ekobj, tkey); } return tmap; }
/* 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; }
/* Set a link object of a node. */ void node_set_link(NODE *node, const char *url, const char *label, int credit){ char *vbuf; assert(node && url); if(!label || credit < 0){ cbmapout(node->links, url, -1); return; } vbuf = cbsprintf("%s\t%d", label, credit); cbmapput(node->links, url, -1, vbuf, -1, TRUE); free(vbuf); }
/* Add an attribute index to a node manager object. */ void nmgr_add_aidx(NMGR *nmgr, const char *name, const char *type){ int tnum; assert(nmgr && name && type); if(!cbstricmp(type, "str")){ tnum = ESTIDXATTRSTR; } else if(!cbstricmp(type, "num")){ tnum = ESTIDXATTRNUM; } else { tnum = ESTIDXATTRSEQ; } cbmapput(nmgr->aidxs, name, -1, (char *)&tnum, sizeof(int), TRUE); }
/* Set a session variable of a user object. */ void user_set_sess_val(USER *user, const char *name, const char *value){ assert(user && name); if(pthread_mutex_lock(&(user->mutex)) != 0) return; if(user->sess){ if(value){ cbmapput(user->sess, name, -1, value, -1, TRUE); } else { cbmapout(user->sess, name, -1); } } pthread_mutex_unlock(&(user->mutex)); }
/* Add a result document data to a result map object. */ void resmap_put(RESMAP *resmap, int score, ESTDOC *doc, CBMAP *attrs, char *body){ RESDOC resdoc; const char *uri, *vbuf; assert(resmap); uri = NULL; if(doc) uri = est_doc_attr(doc, ESTDATTRURI); if(attrs) uri = cbmapget(attrs, ESTDATTRURI, -1, NULL); if(!uri || pthread_mutex_lock(&(resmap->mutex)) != 0){ if(doc) est_doc_delete(doc); if(attrs) cbmapclose(attrs); if(body) free(body); return; } if((vbuf = cbmapget(resmap->uris, uri, -1, NULL)) != NULL){ if(((RESDOC *)vbuf)->score >= score){ if(doc) est_doc_delete(doc); if(attrs) cbmapclose(attrs); if(body) free(body); } else { if(((RESDOC *)vbuf)->doc) est_doc_delete(((RESDOC *)vbuf)->doc); if(((RESDOC *)vbuf)->attrs) cbmapclose(((RESDOC *)vbuf)->attrs); if(((RESDOC *)vbuf)->body) free(((RESDOC *)vbuf)->body); resdoc.score = score; resdoc.doc = doc; resdoc.attrs = attrs; resdoc.body = body; resdoc.value = NULL; cbmapput(resmap->uris, uri, -1, (char *)&resdoc, sizeof(RESDOC), TRUE); } } else { resdoc.score = score; resdoc.doc = doc; resdoc.attrs = attrs; resdoc.body = body; cbmapput(resmap->uris, uri, -1, (char *)&resdoc, sizeof(RESDOC), FALSE); } pthread_mutex_unlock(&(resmap->mutex)); }
/* 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; }
/* Add a user to a user manager object. */ int umgr_put(UMGR *umgr, const char *name, const char *passwd, const char *flags, const char *fname, const char *misc){ USER user; assert(umgr && name && passwd && flags && fname && misc); log_print(LL_DEBUG, "umgr_put: %s:%s:%s:%s:%s", name, passwd, flags, fname, misc); if(name[0] == '\0' || cbmapget(umgr->users, name, -1, NULL)){ log_print(LL_WARN, "duplicated or empty user name: %s", name); return FALSE; } if(!check_alnum_name(name)){ log_print(LL_WARN, "invalid user name: %s", name); return FALSE; } user.name = cbmemdup(name, -1); user.passwd = cbmemdup(passwd, -1); user.flags = cbmemdup(flags, -1); user.fname = cbmemdup(fname, -1); user.misc = cbmemdup(misc, -1); user.atime = 0; user.sess = NULL; pthread_mutex_init(&(user.mutex), NULL); cbmapput(umgr->users, name, -1, (char *)&user, sizeof(USER), FALSE); return TRUE; }
/* Add a node to a node manager object. */ int nmgr_put(NMGR *nmgr, const char *name, int wmode, int options){ NODE node; ESTMTDB *db; CBLIST *list; const char *cbuf, *pv; char pbuf[URIBUFSIZ], *vbuf; int i, ecode, csiz; assert(nmgr && name); log_print(LL_DEBUG, "nmgr_put: %s", name); if(name[0] == '\0' || cbmapget(nmgr->nodes, name, -1, NULL)){ log_print(LL_WARN, "duplicated or empty node name: %s", name); return FALSE; } if(strlen(name) >= NODENAMEMAX || !check_alnum_name(name)){ log_print(LL_WARN, "invalid node name: %s", name); return FALSE; } log_print(LL_INFO, "opening a node (%s): %s", wmode ? "WRITER" : "READER", name); sprintf(pbuf, "%s%c%s%c%s", nmgr->rootdir, ESTPATHCHR, NODEDIR, ESTPATHCHR, name); if(!(db = est_mtdb_open(pbuf, wmode ? ESTDBWRITER | ESTDBCREAT | options : ESTDBREADER, &ecode))){ log_print(LL_ERROR, "DB-ERROR: %s", est_err_msg(ecode)); return FALSE; } est_mtdb_set_informer(db, db_informer, NULL); cbmapiterinit(nmgr->aidxs); while((cbuf = cbmapiternext(nmgr->aidxs, NULL)) != NULL){ est_mtdb_add_attr_index(db, cbuf, *(int *)cbmapiterval(cbuf, NULL)); } node.db = db; est_mtdb_add_meta(db, NMKNAME, name); node.name = cbmemdup(name, -1); vbuf = est_mtdb_meta(db, NMKLABEL); node.label = vbuf ? vbuf : cbmemdup(name, -1); if((vbuf = est_mtdb_meta(db, NMKADMINS)) != NULL){ list = cbsplit(vbuf, -1, "\n"); node.admins = cbmapopenex(cblistnum(list) + MINIBNUM); for(i = 0; i < cblistnum(list); i++){ cbuf = cblistval(list, i, &csiz); if(csiz < 1) continue; cbmapput(node.admins, cbuf, csiz, "", 0, FALSE); } cblistclose(list); free(vbuf); } else { node.admins = cbmapopenex(MINIBNUM); } if((vbuf = est_mtdb_meta(db, NMKUSERS)) != NULL){ list = cbsplit(vbuf, -1, "\n"); node.users = cbmapopenex(cblistnum(list) + MINIBNUM); for(i = 0; i < cblistnum(list); i++){ cbuf = cblistval(list, i, &csiz); if(csiz < 1) continue; cbmapput(node.users, cbuf, csiz, "", 0, FALSE); } cblistclose(list); free(vbuf); } else { node.users = cbmapopenex(MINIBNUM); } if((vbuf = est_mtdb_meta(db, NMKLINKS)) != NULL){ list = cbsplit(vbuf, -1, "\n"); node.links = cbmapopenex(cblistnum(list) + MINIBNUM); for(i = 0; i < cblistnum(list); i++){ cbuf = cblistval(list, i, NULL); if(!(pv = strchr(cbuf, '\t'))) continue; cbmapput(node.links, cbuf, pv - cbuf, pv + 1, -1, FALSE); } cblistclose(list); free(vbuf); } else { node.links = cbmapopenex(MINIBNUM); } node.mtime = time(NULL); node.dirty = FALSE; pthread_mutex_init(&(node.mutex), NULL); cbmapput(nmgr->nodes, name, -1, (char *)&node, sizeof(NODE), FALSE); return TRUE; }