//----------------------------------------------------------------------------------------- int precompfixt(XmlElement& xft, XmlElement& xf, ostream& outf, bool nounique) { int depth(1); XmlElement::XmlSet fldlist; xft.find("fix/fields/field", fldlist); xf.find("fix/fields/field", fldlist); if (!nounique) filter_unique(fldlist); XmlElement::XmlSet comlist, comlistfixt; Components components, componentsfixt; xft.find("fix/components/component", comlistfixt); xf.find("fix/components/component", comlist); load_components(comlistfixt, componentsfixt); load_components(comlist, components); outf << doctype << endl; outf << '<' << xft.GetTag(); output_attributes(xft, outf); outf << '>' << endl; const XmlElement *header(xft.find("fix/header")); if (header) process_messages(*header, componentsfixt, "header", 0, outf); const XmlElement *trailer(xft.find("fix/trailer")); if (trailer) process_messages(*trailer, componentsfixt, "trailer", 0, outf); outf << string(depth * 2, ' ') << "<messages>" << endl; XmlElement::XmlSet msglist; xft.find("fix/messages/message", msglist); for(XmlElement::XmlSet::const_iterator itr(msglist.begin()); itr != msglist.end(); ++itr) process_messages(**itr, componentsfixt, "message", depth, outf); msglist.clear(); xf.find("fix/messages/message", msglist); for(XmlElement::XmlSet::const_iterator itr(msglist.begin()); itr != msglist.end(); ++itr) process_messages(**itr, components, "message", depth, outf); outf << string(depth * 2, ' ') << "</messages>" << endl; process_fields(fldlist, depth, outf); outf << "</" << xft.GetTag() << '>' << endl; return 0; }
bool lsb_decode_heka_message(lsb_heka_message *m, const char *buf, size_t len, lsb_logger *logger) { if (!m || !buf || len == 0) { if (logger && logger->cb) { logger->cb(logger->context, __func__, 4, LSB_ERR_UTIL_NULL); } return false; } const char *cp = buf; // current position const char *lp = buf; // last position const char *ep = buf + len; // end position int wiretype = 0; int tag = 0; long long val = 0; bool timestamp = false; lsb_clear_heka_message(m); do { cp = lsb_pb_read_key(cp, &tag, &wiretype); switch (tag) { case LSB_PB_UUID: cp = read_string(wiretype, cp, ep, &m->uuid); if (m->uuid.len != LSB_UUID_SIZE) cp = NULL; break; case LSB_PB_TIMESTAMP: cp = process_varint(wiretype, cp, ep, &m->timestamp); if (cp) timestamp = true; break; case LSB_PB_TYPE: cp = read_string(wiretype, cp, ep, &m->type); break; case LSB_PB_LOGGER: cp = read_string(wiretype, cp, ep, &m->logger); break; case LSB_PB_SEVERITY: cp = process_varint(wiretype, cp, ep, &val); if (cp) m->severity = (int)val; break; case LSB_PB_PAYLOAD: cp = read_string(wiretype, cp, ep, &m->payload); break; case LSB_PB_ENV_VERSION: cp = read_string(wiretype, cp, ep, &m->env_version); break; case LSB_PB_PID: cp = process_varint(wiretype, cp, ep, &val); if (cp) m->pid = (int)val; break; case LSB_PB_HOSTNAME: cp = read_string(wiretype, cp, ep, &m->hostname); break; case LSB_PB_FIELDS: if (wiretype != 2) { cp = NULL; break; } if (m->fields_len == m->fields_size) { int step = 8; m->fields_size += step; lsb_heka_field *tmp = realloc(m->fields, m->fields_size * sizeof(lsb_heka_field)); if (!tmp) { if (logger && logger->cb) { logger->cb(logger->context, __func__, 0, "fields reallocation failed"); } return false; } m->fields = tmp; memset(&m->fields[m->fields_len], 0, step * sizeof(lsb_heka_field)); } cp = process_fields(&m->fields[m->fields_len], cp, ep); ++m->fields_len; break; default: cp = NULL; break; } if (cp) lp = cp; } while (cp && cp < ep); if (!cp) { if (logger && logger->cb) { logger->cb(logger->context, __func__, 4, "tag:%d wiretype:%d position:%d", tag, wiretype, lp - buf); } return false; } if (!m->uuid.s) { if (logger && logger->cb) { logger->cb(logger->context, __func__, 4, "missing " LSB_UUID); } return false; } if (!timestamp) { if (logger && logger->cb) { logger->cb(logger->context, __func__, 4, "missing " LSB_TIMESTAMP); } return false; } m->raw.s = buf; m->raw.len = len; return true; }
int heka_decode_message(lua_State *lua) { int n = lua_gettop(lua); if (n != 1 || lua_type(lua, 1) != LUA_TSTRING) { return luaL_argerror(lua, 0, "must have one string argument"); } size_t len; const char *pbstr = lua_tolstring(lua, 1, &len); if (len < 20) { return luaL_error(lua, "invalid message, too short"); } const char *p = pbstr; const char *lp = p; const char *e = pbstr + len; int wiretype = 0; int tag = 0; int has_uuid = 0; int has_timestamp = 0; int field_count = 0; lua_newtable(lua); // message table index 2 do { p = lsb_pb_read_key(p, &tag, &wiretype); switch (tag) { case 1: p = read_string(lua, wiretype, p, e); if (p && p - lp == 18) { lua_setfield(lua, 2, "Uuid"); has_uuid = 1; } else { p = NULL; } break; case 2: p = process_varint(lua, "Timestamp", wiretype, 2, p, e); if (p) { has_timestamp = 1; } break; case 3: p = read_string(lua, wiretype, p, e); if (p) { lua_setfield(lua, 2, "Type"); } break; case 4: p = read_string(lua, wiretype, p, e); if (p) { lua_setfield(lua, 2, "Logger"); } break; case 5: p = process_varint(lua, "Severity", wiretype, 2, p, e); break; case 6: p = read_string(lua, wiretype, p, e); if (p) { lua_setfield(lua, 2, "Payload"); } break; case 7: p = read_string(lua, wiretype, p, e); if (p) { lua_setfield(lua, 2, "EnvVersion"); } break; case 8: p = process_varint(lua, "Pid", wiretype, 2, p, e); break; case 9: p = read_string(lua, wiretype, p, e); if (p) { lua_setfield(lua, 2, "Hostname"); } break; case 10: if (wiretype != 2) { p = NULL; break; } if (field_count == 0) { lua_newtable(lua); // Fields table index 3 } p = process_fields(lua, p, e); if (p) { lua_rawseti(lua, 3, ++field_count); } break; default: p = NULL; // don't allow unknown tags break; } if (p) lp = p; } while (p && p < e); if (!p) { return luaL_error(lua, "error in tag: %d wiretype: %d offset: %d", tag, wiretype, (const char *)lp - pbstr); } if (!has_uuid || !has_timestamp) { return luaL_error(lua, "missing required field uuid: %s timestamp: %s", has_uuid ? "found" : "not found", has_timestamp ? "found" : "not found"); } if (field_count) { lua_setfield(lua, 2, "Fields"); } return 1; }