예제 #1
0
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;
}
예제 #2
0
파일: qutil.c 프로젝트: Piro77/qupl
/* 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;
}
예제 #3
0
/* 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);
}
예제 #4
0
/* 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);
}
예제 #5
0
/* 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));
}
예제 #6
0
/* 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));
}
예제 #7
0
파일: qutil.c 프로젝트: Piro77/qupl
/* 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;
}
예제 #8
0
/* 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;
}
예제 #9
0
/* 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;
}