void storeInDB(const IMC::PlanSpecification* spec) { m_plan_info.plan_size = spec->getPayloadSerializationSize(); m_plan_info.plan_id = spec->plan_id; m_plan_info.change_time = Clock::getSinceEpoch(); m_plan_info.change_sid = spec->getSource(); m_plan_info.change_sname = resolveSystemId(m_plan_info.change_sid); Database::Blob plan_data(m_plan_info.plan_size); spec->serializeFields((uint8_t*)&plan_data[0]); m_plan_info.md5.resize(16); MD5::compute((uint8_t*)&plan_data[0], m_plan_info.plan_size, (uint8_t*)&m_plan_info.md5[0]); m_db->beginTransaction(); int count = 0; try { *m_delete_plan_stmt << m_plan_info.plan_id; m_delete_plan_stmt->execute(&count); m_delete_plan_stmt->reset(); *m_insert_plan_stmt << m_plan_info.plan_id << m_plan_info.change_time << m_plan_info.change_sid << m_plan_info.change_sname << m_plan_info.md5 << plan_data; m_insert_plan_stmt->execute(); onChange(m_plan_info.change_time, m_plan_info.change_sid, m_plan_info.change_sname); } catch (std::runtime_error& e) { onFailure(e.what()); m_db->rollback(); } m_db->commit(); if (m_args.trace) m_plan_info.toText(std::cerr); m_reply.arg.set(m_plan_info); onSuccess(count ? DTR("OK (updated)") : DTR("OK (new entry)")); }
static int externalEntityRefStream(XML_Parser parser, const XML_Char *context, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId) { XML_Char *s; const XML_Char *filename; int ret; XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0); filename = resolveSystemId(base, systemId, &s); XML_SetBase(entParser, filename); ret = processStream(filename, entParser); free(s); XML_ParserFree(entParser); return ret; }
static int externalEntityRefFilemap(XML_Parser parser, const XML_Char *context, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId) { int result; XML_Char *s; const XML_Char *filename; XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0); PROCESS_ARGS args; args.retPtr = &result; args.parser = entParser; filename = resolveSystemId(base, systemId, &s); XML_SetBase(entParser, filename); if (!filemap(filename, processFile, &args)) result = 0; free(s); XML_ParserFree(entParser); return result; }