()
| 50 | } |
| 51 | |
| 52 | func (w *Serializer) finalizeObject() error { |
| 53 | root, dataSize, err := w.dynamic.Encode() |
| 54 | if err != nil { |
| 55 | return fmt.Errorf("system error: could not encode CSUP metadata: %w", err) |
| 56 | } |
| 57 | // At this point all the vector data has been written out |
| 58 | // to the underlying spiller, so we start writing BSUP at this point. |
| 59 | var metaBuf bytes.Buffer |
| 60 | zw := bsupio.NewWriter(sio.NopCloser(&metaBuf)) |
| 61 | // First, we write the root segmap of the vector of integer type IDs. |
| 62 | cctx := w.dynamic.cctx |
| 63 | m := sup.NewBSUPMarshalerWithContext(cctx.local) |
| 64 | m.Decorate(sup.StyleSimple) |
| 65 | for id := range len(cctx.metas) { |
| 66 | val, err := m.Marshal(cctx.Lookup(ID(id))) |
| 67 | if err != nil { |
| 68 | return fmt.Errorf("could not marshal CSUP metadata: %w", err) |
| 69 | } |
| 70 | if err := zw.Write(val); err != nil { |
| 71 | return fmt.Errorf("could not write CSUP metadata: %w", err) |
| 72 | } |
| 73 | } |
| 74 | zw.EndStream() |
| 75 | metaSize := zw.Position() |
| 76 | for _, val := range cctx.types() { |
| 77 | if err := zw.Write(val); err != nil { |
| 78 | return fmt.Errorf("could not write CSUP metadata: %w", err) |
| 79 | } |
| 80 | } |
| 81 | zw.EndStream() |
| 82 | typeSize := zw.Position() - metaSize |
| 83 | |
| 84 | // Header |
| 85 | if _, err := w.writer.Write(Header{Version, uint64(metaSize), uint64(typeSize), dataSize, uint32(root)}.Serialize()); err != nil { |
| 86 | return fmt.Errorf("system error: could not write CSUP header: %w", err) |
| 87 | } |
| 88 | // Metadata section |
| 89 | if _, err := w.writer.Write(metaBuf.Bytes()); err != nil { |
| 90 | return fmt.Errorf("system error: could not write CSUP metadata section: %w", err) |
| 91 | } |
| 92 | // Data section |
| 93 | if err := w.dynamic.Emit(w.writer); err != nil { |
| 94 | return fmt.Errorf("system error: could not write CSUP data section: %w", err) |
| 95 | } |
| 96 | // Set new dynamic so we can write the next object. |
| 97 | w.dynamic = NewDynamicEncoder() |
| 98 | return nil |
| 99 | } |
| 100 | |
| 101 | // XXX ValWriter provides a temporary interface to support writing super.Values |
| 102 | // to CSUP. We should remove this at some point in factor of vector-only writes. |
no test coverage detected