/* 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; }
/* 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; }
/* 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; }
/* 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; }
/* 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); }
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; }
/** 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; }
/* 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; }