static.cpp 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "static.h"
  2. #include "common.h"
  3. #include <library/cpp/codecs/static/static_codec_info.pb.h>
  4. #include <library/cpp/archive/yarchive.h>
  5. #include <util/draft/datetime.h>
  6. #include <util/string/builder.h>
  7. #include <util/stream/buffer.h>
  8. #include <util/stream/mem.h>
  9. #include <util/string/hex.h>
  10. #include <util/ysaveload.h>
  11. namespace NCodecs {
  12. static constexpr TStringBuf STATIC_CODEC_INFO_MAGIC = "CodecInf";
  13. static TStringBuf GetStaticCodecInfoMagic() {
  14. return STATIC_CODEC_INFO_MAGIC;
  15. }
  16. void SaveCodecInfoToStream(IOutputStream& out, const TStaticCodecInfo& info) {
  17. TBufferOutput bout;
  18. info.SerializeToArcadiaStream(&bout);
  19. ui64 hash = DataSignature(bout.Buffer());
  20. out.Write(GetStaticCodecInfoMagic());
  21. ::Save(&out, hash);
  22. ::Save(&out, bout.Buffer());
  23. }
  24. TStaticCodecInfo LoadCodecInfoFromStream(IInputStream& in) {
  25. {
  26. TBuffer magic;
  27. magic.Resize(GetStaticCodecInfoMagic().size());
  28. Y_ENSURE_EX(in.Read(magic.Data(), GetStaticCodecInfoMagic().size()) == GetStaticCodecInfoMagic().size(),
  29. TCodecException() << "bad codec info");
  30. Y_ENSURE_EX(TStringBuf(magic.data(), magic.size()) == GetStaticCodecInfoMagic(),
  31. TCodecException() << "bad codec info");
  32. }
  33. ui64 hash;
  34. ::Load(&in, hash);
  35. TBuffer info;
  36. ::Load(&in, info);
  37. Y_ENSURE_EX(hash == DataSignature(info), TCodecException() << "bad codec info");
  38. TStaticCodecInfo result;
  39. Y_ENSURE_EX(result.ParseFromArray(info.data(), info.size()), TCodecException() << "bad codec info");
  40. return result;
  41. }
  42. TString SaveCodecInfoToString(const TStaticCodecInfo& info) {
  43. TStringStream s;
  44. SaveCodecInfoToStream(s, info);
  45. return s.Str();
  46. }
  47. TStaticCodecInfo LoadCodecInfoFromString(TStringBuf data) {
  48. TMemoryInput m{data.data(), data.size()};
  49. return LoadCodecInfoFromStream(m);
  50. }
  51. TString FormatCodecInfo(const TStaticCodecInfo& ci) {
  52. TStringBuilder s;
  53. s << "codec name: " << ci.GetDebugInfo().GetCodecName() << Endl;
  54. s << "codec hash: " << HexWriteScalar(ci.GetDebugInfo().GetStoredCodecHash()) << Endl;
  55. s << "dict size: " << ci.GetStoredCodec().Size() << Endl;
  56. s << "sample mult: " << ci.GetDebugInfo().GetSampleSizeMultiplier() << Endl;
  57. s << "orig.compress: " << ci.GetDebugInfo().GetCompression() * 100 << " %" << Endl;
  58. s << "timestamp: " << ci.GetDebugInfo().GetTimestamp() << " ("
  59. << NDatetime::TSimpleTM::NewLocal(ci.GetDebugInfo().GetTimestamp()).ToString()
  60. << ")" << Endl;
  61. s << "revision: " << ci.GetDebugInfo().GetRevisionInfo() << Endl;
  62. s << "training set comment: " << ci.GetDebugInfo().GetTrainingSetComment() << Endl;
  63. s << "training set resId: " << ci.GetDebugInfo().GetTrainingSetResId() << Endl;
  64. return s;
  65. }
  66. TString LoadStringFromArchive(const ui8* begin, size_t size) {
  67. TArchiveReader ar(TBlob::NoCopy(begin, size));
  68. Y_VERIFY(ar.Count() == 1, "invalid number of entries");
  69. auto blob = ar.ObjectBlobByKey(ar.KeyByIndex(0));
  70. return TString{blob.AsCharPtr(), blob.Size()};
  71. }
  72. TCodecConstPtr RestoreCodecFromCodecInfo(const TStaticCodecInfo& info) {
  73. return NCodecs::ICodec::RestoreFromString(info.GetStoredCodec());
  74. }
  75. TCodecConstPtr RestoreCodecFromArchive(const ui8* begin, size_t size) {
  76. const auto& data = LoadStringFromArchive(begin, size);
  77. const auto& info = LoadCodecInfoFromString(data);
  78. const auto& codec = RestoreCodecFromCodecInfo(info);
  79. Y_ENSURE_EX(codec, TCodecException() << "null codec");
  80. return codec;
  81. }
  82. }