void IcingaApplication::DumpModifiedAttributes(void) { String path = GetModAttrPath(); std::fstream fp; String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", 0644, fp); fp.exceptions(std::ofstream::failbit | std::ofstream::badbit); ConfigObject::Ptr previousObject; ConfigObject::DumpModifiedAttributes(boost::bind(&PersistModAttrHelper, boost::ref(fp), boost::ref(previousObject), _1, _2, _3)); if (previousObject) { ConfigWriter::EmitRaw(fp, "\tobj.version = "); ConfigWriter::EmitValue(fp, 0, previousObject->GetVersion()); ConfigWriter::EmitRaw(fp, "\n}\n"); } fp.close(); #ifdef _WIN32 _unlink(path.CStr()); #endif /* _WIN32 */ if (rename(tempFilename.CStr(), path.CStr()) < 0) { BOOST_THROW_EXCEPTION(posix_error() << boost::errinfo_api_function("rename") << boost::errinfo_errno(errno) << boost::errinfo_file_name(tempFilename)); } }
static void PersistModAttrHelper(std::fstream& fp, ConfigObject::Ptr& previousObject, const ConfigObject::Ptr& object, const String& attr, const Value& value) { if (object != previousObject) { if (previousObject) { ConfigWriter::EmitRaw(fp, "\tobj.version = "); ConfigWriter::EmitValue(fp, 0, previousObject->GetVersion()); ConfigWriter::EmitRaw(fp, "\n}\n\n"); } ConfigWriter::EmitRaw(fp, "var obj = "); Array::Ptr args1 = new Array(); args1->Add(object->GetReflectionType()->GetName()); args1->Add(object->GetName()); ConfigWriter::EmitFunctionCall(fp, "get_object", args1); ConfigWriter::EmitRaw(fp, "\nif (obj) {\n"); } ConfigWriter::EmitRaw(fp, "\tobj."); Array::Ptr args2 = new Array(); args2->Add(attr); args2->Add(value); ConfigWriter::EmitFunctionCall(fp, "modify_attribute", args2); ConfigWriter::EmitRaw(fp, "\n"); previousObject = object; }