@@ -46,6 +46,9 @@ type TableEncoder struct {
4646 // summary is the summary map.
4747 summary map [int ]func (io.Writer , int ) (int , error )
4848
49+ // isCustomSummary when summary has been set via options
50+ isCustomSummary bool
51+
4952 // title is the title value.
5053 title * Value
5154
@@ -65,6 +68,10 @@ type TableEncoder struct {
6568 // They are at least as wide as user-supplied widths
6669 maxWidths []int
6770
71+ // maxWidth of whole table, before switching to the ExpandedEncoder,
72+ // zero disables switching
73+ maxWidth int
74+
6875 // scanCount is the number of scanned results in the result set.
6976 scanCount int
7077
@@ -170,29 +177,36 @@ func (enc *TableEncoder) Encode(w io.Writer) error {
170177
171178 enc .calcWidth (vals )
172179
180+ if enc .maxWidth != 0 && enc .tableWidth () > enc .maxWidth {
181+ t := * enc
182+ t .formatter = NewEscapeFormatter ()
183+ exp := ExpandedEncoder {
184+ TableEncoder : t ,
185+ }
186+ exp .offsets = make ([]int , 2 )
187+ exp .maxWidths = make ([]int , 2 )
188+ exp .calcWidth (vals )
189+
190+ if err := exp .encodeVals (vals ); err != nil {
191+ return nil
192+ }
193+ continue
194+ }
195+
173196 // print header if not already done
174197 if ! wroteHeader {
175198 wroteHeader = true
176-
177199 enc .header ()
178200 }
179201
180- rs := enc .rowStyle (enc .lineStyle .Row )
181- // print buffered vals
182- for i := 0 ; i < len (vals ); i ++ {
183- enc .row (vals [i ], rs )
184- if i + 1 % 1000 == 0 {
185- // check error every 1k rows
186- if err := enc .w .Flush (); err != nil {
187- return err
188- }
189- }
202+ if err := enc .encodeVals (vals ); err != nil {
203+ return err
190204 }
191- }
192205
193- // draw end border
194- if enc .border >= 2 {
195- enc .divider (enc .rowStyle (enc .lineStyle .End ))
206+ // draw end border
207+ if enc .border >= 2 {
208+ enc .divider (enc .rowStyle (enc .lineStyle .End ))
209+ }
196210 }
197211
198212 // add summary
@@ -202,6 +216,22 @@ func (enc *TableEncoder) Encode(w io.Writer) error {
202216 return enc .w .Flush ()
203217}
204218
219+ func (enc * TableEncoder ) encodeVals (vals [][]* Value ) error {
220+ rs := enc .rowStyle (enc .lineStyle .Row )
221+ // print buffered vals
222+ for i := 0 ; i < len (vals ); i ++ {
223+ enc .row (vals [i ], rs )
224+ if i + 1 % 1000 == 0 {
225+ // check error every 1k rows
226+ if err := enc .w .Flush (); err != nil {
227+ return err
228+ }
229+ }
230+ }
231+
232+ return nil
233+ }
234+
205235// EncodeAll encodes all result sets to the writer using the encoder settings.
206236func (enc * TableEncoder ) EncodeAll (w io.Writer ) error {
207237 var err error
@@ -518,6 +548,9 @@ func (enc *TableEncoder) writeAligned(b, filler []byte, a Align, width, max int)
518548// summarize writes the table scan count summary.
519549func (enc * TableEncoder ) summarize (w io.Writer ) {
520550 // do summary
551+ if enc .summary == nil {
552+ return
553+ }
521554 var f func (io.Writer , int ) (int , error )
522555 if z , ok := enc .summary [- 1 ]; ok {
523556 f = z
@@ -544,6 +577,9 @@ func NewExpandedEncoder(resultSet ResultSet, opts ...Option) (Encoder, error) {
544577 }
545578 t := tableEnc .(* TableEncoder )
546579 t .formatter = NewEscapeFormatter ()
580+ if ! t .isCustomSummary {
581+ t .summary = nil
582+ }
547583
548584 enc := & ExpandedEncoder {
549585 TableEncoder : * t ,
@@ -601,8 +637,6 @@ func (enc *ExpandedEncoder) Encode(w io.Writer) error {
601637
602638 enc .calcWidth (vals )
603639
604- rs := enc .rowStyle (enc .lineStyle .Row )
605-
606640 // print title if not already done
607641 if ! wroteTitle && enc .title != nil {
608642 wroteTitle = true
@@ -611,14 +645,27 @@ func (enc *ExpandedEncoder) Encode(w io.Writer) error {
611645 enc .w .Write (enc .newline )
612646 }
613647
614- // print buffered vals
615- for i := 0 ; i < len (vals ); i ++ {
616- enc .record (i , vals [i ], rs )
617- if i + 1 % 1000 == 0 {
618- // check error every 1k rows
619- if err := enc .w .Flush (); err != nil {
620- return err
621- }
648+ if err := enc .encodeVals (vals ); err != nil {
649+ return err
650+ }
651+ }
652+
653+ // add summary
654+ enc .summarize (w )
655+
656+ // flush will return the error code
657+ return enc .w .Flush ()
658+ }
659+
660+ func (enc * ExpandedEncoder ) encodeVals (vals [][]* Value ) error {
661+ rs := enc .rowStyle (enc .lineStyle .Row )
662+ // print buffered vals
663+ for i := 0 ; i < len (vals ); i ++ {
664+ enc .record (i , vals [i ], rs )
665+ if i + 1 % 1000 == 0 {
666+ // check error every 1k rows
667+ if err := enc .w .Flush (); err != nil {
668+ return err
622669 }
623670 }
624671 }
@@ -627,9 +674,7 @@ func (enc *ExpandedEncoder) Encode(w io.Writer) error {
627674 if enc .border >= 2 && enc .scanCount != 0 {
628675 enc .divider (enc .rowStyle (enc .lineStyle .End ))
629676 }
630-
631- // flush will return the error code
632- return enc .w .Flush ()
677+ return nil
633678}
634679
635680// EncodeAll encodes all result sets to the writer using the encoder settings.
0 commit comments