static void cxActionRootLoadCodesWithReader(cxAny pav,xmlTextReaderPtr reader) { cxActionRoot this = pav; cxReaderAttrInfo *info = cxReaderAttrInfoMake(reader, pav, pav); while(xmlTextReaderRead(reader) && !this->isError){ if(xmlTextReaderNodeType(reader) != XML_READER_TYPE_ELEMENT){ continue; } cxConstChars temp = cxXMLReadElementName(reader); if(!ELEMENT_IS_TYPE(cxActionRoot)){ continue; } cxObjectReadAttrRun(info); break; } while(xmlTextReaderRead(reader)){ CX_CONTINUE(xmlTextReaderNodeType(reader) != XML_READER_TYPE_ELEMENT); cxConstChars id = cxXMLAttr(reader, "id"); CX_CONTINUE(id == NULL); cxString code = cxXMLReaderReadOuterXml(reader); cxHashSet(this->codes, cxHashStrKey(id), code); } }
void cxHashRootReadDBEnv(cxHashRoot root,xmlTextReaderPtr reader) { cxReaderAttrInfo *info = cxReaderAttrInfoMake(reader, root, NULL); cxConstChars type = cxXMLAttr(reader, "type"); cxBool logger = cxXMLReadBoolAttr(info, "logger", false); cxDBEnv env = cxDBEnvCreate(type, logger); if(env != NULL){ cxHashRootReadDB(env, root, reader); } }
static void cxHashRootReadDB(cxDBEnv env,cxHashRoot root,xmlTextReaderPtr reader) { cxReaderAttrInfo *info = cxReaderAttrInfoMake(reader, root, env); int depth = xmlTextReaderDepth(reader); while(xmlTextReaderRead(reader) && depth != xmlTextReaderDepth(reader)){ if(xmlTextReaderNodeType(reader) != XML_READER_TYPE_ELEMENT){ continue; } cxConstChars temp = cxXMLReadElementName(reader); if(!ELEMENT_IS_TYPE(cxDB)){ continue; } cxConstChars file = cxXMLAttr(reader,"file"); cxConstChars table = cxXMLAttr(reader,"table"); cxConstChars type = cxXMLAttr(reader,"type"); cxConstChars sid = cxXMLAttr(reader,"id"); cxConstChars path = cxXMLAttr(reader,"path"); //assert file copy ->to document cxBool copy = cxXMLReadBoolAttr(info, "copy", false); if(copy && file != NULL){ cxCopyFile(file, NULL, NULL); } cxBool rdonly = cxXMLReadBoolAttr(info, "rdonly", false); if(sid == NULL){ CX_WARN("db id not set,will can't add dataset"); } cxString sfile = NULL; if(cxConstCharsEqu(path, "assert")){ sfile = cxAssetsPath(file); //assert must set true rdonly = true; }else if(cxConstCharsEqu(path, "document")){ sfile = cxDocumentPath(file); }else{ CX_ERROR("must set path assert or document"); } cxAny db = NULL; if(file != NULL && table != NULL && type != NULL){ db = cxDBCreate(env, cxStringBody(sfile), table, type, rdonly); } if(db != NULL && sid != NULL){ cxHashSet(root->items, cxHashStrKey(sid), cxDBTypesCreate(db)); }else{ CX_ERROR("open dbenv type %s,db %s:%s failed",cxStringBody(env->type),file,table); } } }
cxAny cxActionRootGet(cxConstChars src) { cxUrlPath path = cxUrlPathParse(src); CX_RETURN(path == NULL, NULL); cxActionRoot this = cxActionRootCreate(path->path); CX_RETURN(this == NULL, NULL); cxString code = cxHashGet(this->codes, (path->count == 1) ? cxHashStrKey(path->path) : cxHashStrKey(path->key)); CX_RETURN(code == NULL, NULL); //create by code xmlTextReaderPtr reader = cxXMLReaderForString(code, NULL, NULL); cxReaderAttrInfo *info = cxReaderAttrInfoMake(reader, this, NULL); while(xmlTextReaderRead(reader)){ CX_CONTINUE(xmlTextReaderNodeType(reader) != XML_READER_TYPE_ELEMENT); cxConstChars temp = cxXMLReadElementName(reader); info->object = CX_METHOD_FIRE(NULL, this->Make,temp,reader); CX_CONTINUE(info->object == NULL); //save root cxObjectSetRoot(info->object, this); cxObjectReadAttrRun(info); } return info->object; }