Exemplo n.º 1
0
/* Synchronize all nodes into the node directory. */
int nmgr_sync(NMGR *nmgr, int phis){
  NODE *node;
  CBDATUM *datum;
  const char *kbuf, *vbuf;
  int err, ksiz, vsiz;
  assert(nmgr);
  log_print(LL_INFO, "synchronizing the node manager");
  err = FALSE;
  cbmapiterinit(nmgr->nodes);
  while((kbuf = cbmapiternext(nmgr->nodes, NULL)) != NULL){
    vbuf = cbmapiterval(kbuf, NULL);
    node = (NODE *)vbuf;
    est_mtdb_add_meta(node->db, NMKNAME, node->name);
    est_mtdb_add_meta(node->db, NMKLABEL, node->label);
    datum = cbdatumopen(NULL, -1);
    cbmapiterinit(node->admins);
    while((kbuf = cbmapiternext(node->admins, &ksiz)) != NULL){
      cbdatumcat(datum, kbuf, ksiz);
      cbdatumcat(datum, "\n", 1);
    }
    est_mtdb_add_meta(node->db, NMKADMINS, cbdatumptr(datum));
    cbdatumclose(datum);
    datum = cbdatumopen(NULL, -1);
    cbmapiterinit(node->users);
    while((kbuf = cbmapiternext(node->users, &ksiz)) != NULL){
      cbdatumcat(datum, kbuf, ksiz);
      cbdatumcat(datum, "\n", 1);
    }
    est_mtdb_add_meta(node->db, NMKUSERS, cbdatumptr(datum));
    cbdatumclose(datum);
    datum = cbdatumopen(NULL, -1);
    cbmapiterinit(node->links);
    while((kbuf = cbmapiternext(node->links, &ksiz)) != NULL){
      vbuf = cbmapiterval(kbuf, &vsiz);
      cbdatumcat(datum, kbuf, ksiz);
      cbdatumcat(datum, "\t", 1);
      cbdatumcat(datum, vbuf, vsiz);
      cbdatumcat(datum, "\n", 1);
    }
    est_mtdb_add_meta(node->db, NMKLINKS, cbdatumptr(datum));
    cbdatumclose(datum);
    if(phis && !est_mtdb_sync(node->db)){
      log_print(LL_ERROR, "DB-ERROR: %s", est_err_msg(est_mtdb_error(node->db)));
      err = TRUE;
    }
  }
  return err ? FALSE : TRUE;
}
Exemplo n.º 2
0
/* Destroy a node manager object. */
int nmgr_delete(NMGR *nmgr){
  NODE *node;
  const char *kbuf, *vbuf;
  int err, ecode;
  assert(nmgr);
  log_print(LL_INFO, "finishing the node manager");
  err = FALSE;
  if(!nmgr_sync(nmgr, FALSE)) err = TRUE;
  cbmapclose(nmgr->aidxs);
  cbmapiterinit(nmgr->nodes);
  while((kbuf = cbmapiternext(nmgr->nodes, NULL)) != NULL){
    vbuf = cbmapiterval(kbuf, NULL);
    node = (NODE *)vbuf;
    pthread_mutex_destroy(&(node->mutex));
    cbmapclose(node->links);
    cbmapclose(node->users);
    cbmapclose(node->admins);
    free(node->label);
    free(node->name);
    est_mtdb_close(node->db, &ecode);
  }
  cbmapclose(nmgr->nodes);
  free(nmgr->rootdir);
  free(nmgr);
  return err ? FALSE : TRUE;
}
Exemplo n.º 3
0
/* Synchronize all users into the user file. */
int umgr_sync(UMGR *umgr){
  FILE *ofp;
  USER *user;
  const char *kbuf, *vbuf;
  char path[URIBUFSIZ];
  int err;
  assert(umgr);
  log_print(LL_INFO, "saving the user list");
  sprintf(path, "%s%c%s", umgr->rootdir, ESTPATHCHR, USERFILE);
  if(!(ofp = fopen(path, "wb"))){
    log_print(LL_ERROR, "synchronizing the user list failed");
    return FALSE;
  }
  err = FALSE;
  cbmapiterinit(umgr->users);
  while((kbuf = cbmapiternext(umgr->users, NULL)) != NULL){
    vbuf = cbmapiterval(kbuf, NULL);
    user = (USER *)vbuf;
    fprintf(ofp, "%s\t%s\t%s\t%s\t%s\n",
            user->name, user->passwd, user->flags, user->fname, user->misc);
  }
  if(fclose(ofp) == EOF){
    log_print(LL_ERROR, "saving the user list failed");
    err = TRUE;
  }
  return err ? FALSE : TRUE;
}
Exemplo n.º 4
0
/* Destroy a user manager object. */
int umgr_delete(UMGR *umgr){
  USER *user;
  const char *kbuf, *vbuf;
  int err;
  assert(umgr);
  log_print(LL_INFO, "finishing the user manager");
  err = FALSE;
  if(!umgr_sync(umgr)) err = TRUE;
  cbmapiterinit(umgr->users);
  while((kbuf = cbmapiternext(umgr->users, NULL)) != NULL){
    vbuf = cbmapiterval(kbuf, NULL);
    user = (USER *)vbuf;
    pthread_mutex_destroy(&(user->mutex));
    if(user->sess) cbmapclose(user->sess);
    free(user->misc);
    free(user->fname);
    free(user->flags);
    free(user->passwd);
    free(user->name);
  }
  cbmapclose(umgr->users);
  free(umgr->rootdir);
  free(umgr);
  return err ? FALSE : TRUE;
}
Exemplo n.º 5
0
/* Destroy a result map object. */
void resmap_delete(RESMAP *resmap){
  RESDOC *resdoc;
  const char *kbuf, *vbuf;
  assert(resmap);
  cbmapiterinit(resmap->uris);
  while((kbuf = cbmapiternext(resmap->uris, NULL)) != NULL){
    vbuf = cbmapiterval(kbuf, NULL);
    resdoc = (RESDOC *)vbuf;
    if(resdoc->doc) est_doc_delete(resdoc->doc);
    if(resdoc->attrs) cbmapclose(resdoc->attrs);
    if(resdoc->body) free(resdoc->body);
  }
  pthread_mutex_destroy(&(resmap->mutex));
  cbmapclose(resmap->uris);
  free(resmap);
}
Exemplo n.º 6
0
jobject cbmaptoobj(JNIEnv *env, CBMAP *map){
  jclass cls;
  jmethodID mid;
  jobject obj, kobj, vobj;
  const char *kbuf, *vbuf;
  assert(list);
  cls = (*env)->FindClass(env, CLSLHMAP);
  mid = (*env)->GetMethodID(env, cls, "<init>", "()V");
  obj = (*env)->NewObject(env, cls, mid);
  mid = (*env)->GetMethodID(env, cls, "put", "(L" CLSOBJECT ";L" CLSOBJECT ";)L" CLSOBJECT ";");
  cbmapiterinit(map);
  while((kbuf = cbmapiternext(map, NULL)) != NULL){
    vbuf = cbmapiterval(kbuf, NULL);
    kobj = (*env)->NewStringUTF(env, kbuf);
    vobj = (*env)->NewStringUTF(env, vbuf);
    (*env)->CallObjectMethod(env, obj, mid, kobj, vobj);
    (*env)->DeleteLocalRef(env, kobj);
    (*env)->DeleteLocalRef(env, vobj);
  }
  return obj;
}
Exemplo n.º 7
0
/** Converts a CBMAP of char * strings into a Ruby Hash of Strings. */
VALUE CBMAP_2_hash(CBMAP *map) 
{
    int key_size = 0;
    int val_size = 0;
    const char *map_key = NULL;
    const char *map_val = NULL;
    VALUE hash = rb_hash_new();
    VALUE key;
    VALUE val;
    
    cbmapiterinit(map);
    while((map_key = cbmapiternext(map, &key_size)) != NULL) {
        map_val = cbmapget(map, map_key, key_size, &val_size);
        
        key = rb_str_new(map_key, key_size);
        val = rb_str_new(map_val, val_size);
        
        rb_hash_aset(hash, key, val);
    }
    
    return hash;
}
Exemplo n.º 8
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;
}