CSVToWriter streams query results as CSV directly to the writer. This minimizes memory usage by avoiding intermediate buffering.
(w io.Writer, result *v1pb.QueryResult)
| 20 | // CSVToWriter streams query results as CSV directly to the writer. |
| 21 | // This minimizes memory usage by avoiding intermediate buffering. |
| 22 | func CSVToWriter(w io.Writer, result *v1pb.QueryResult) error { |
| 23 | if _, err := w.Write([]byte(strings.Join(result.ColumnNames, ","))); err != nil { |
| 24 | return err |
| 25 | } |
| 26 | if _, err := w.Write([]byte{'\n'}); err != nil { |
| 27 | return err |
| 28 | } |
| 29 | for i, row := range result.Rows { |
| 30 | for j, value := range row.Values { |
| 31 | if j != 0 { |
| 32 | if _, err := w.Write([]byte{','}); err != nil { |
| 33 | return err |
| 34 | } |
| 35 | } |
| 36 | if _, err := w.Write(convertValueToBytesInCSV(value)); err != nil { |
| 37 | return err |
| 38 | } |
| 39 | } |
| 40 | if i != len(result.Rows)-1 { |
| 41 | if _, err := w.Write([]byte{'\n'}); err != nil { |
| 42 | return err |
| 43 | } |
| 44 | } |
| 45 | } |
| 46 | return nil |
| 47 | } |
| 48 | |
| 49 | func convertValueToBytesInCSV(value *v1pb.RowValue) []byte { |
| 50 | if value == nil || value.Kind == nil { |
no test coverage detected