Skip to content

Commit 057a8c0

Browse files
authored
Merge pull request #38 from metrico/ndjson-support
JSONEachRow / NDJSON support
2 parents f62bff0 + e6ff18f commit 057a8c0

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

utils/helper.go

+56
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"database/sql"
55
"encoding/json"
66
"fmt"
7+
"bytes"
78
"quackpipe/model"
89
"regexp"
910
"strings"
@@ -30,6 +31,12 @@ func ConversationOfRows(rows *sql.Rows, default_format string, duration time.Dur
3031
return "", err
3132
}
3233
return result, nil
34+
case "JSONEachRow", "NDJSON":
35+
result, err := rowsToNDJSON(rows)
36+
if err != nil {
37+
return "", err
38+
}
39+
return result, nil
3340
case "CSVWithNames":
3441
result, err := rowsToCSV(rows, true)
3542
if err != nil {
@@ -122,6 +129,55 @@ func rowsToJSON(rows *sql.Rows, elapsedTime time.Duration) (string, error) {
122129
return string(jsonData), nil
123130
}
124131

132+
// rowsToNDJSON converts the rows to NDJSON strings
133+
func rowsToNDJSON(rows *sql.Rows) (string, error) {
134+
defer rows.Close()
135+
136+
columns, err := rows.Columns()
137+
if err != nil {
138+
return "", err
139+
}
140+
141+
var buffer bytes.Buffer
142+
values := make([]interface{}, len(columns))
143+
scanArgs := make([]interface{}, len(columns))
144+
for i := range values {
145+
scanArgs[i] = &values[i]
146+
}
147+
148+
for rows.Next() {
149+
err := rows.Scan(scanArgs...)
150+
if err != nil {
151+
return "", err
152+
}
153+
154+
rowMap := make(map[string]interface{})
155+
for i, col := range columns {
156+
val := values[i]
157+
b, ok := val.([]byte)
158+
if ok {
159+
rowMap[col] = string(b)
160+
} else {
161+
rowMap[col] = val
162+
}
163+
}
164+
165+
jsonData, err := json.Marshal(rowMap)
166+
if err != nil {
167+
return "", err
168+
}
169+
170+
buffer.Write(jsonData)
171+
buffer.WriteByte('\n')
172+
}
173+
174+
if err = rows.Err(); err != nil {
175+
return "", err
176+
}
177+
178+
return buffer.String(), nil
179+
}
180+
125181
// rowsToTSV converts the rows to TSV string
126182
func rowsToTSV(rows *sql.Rows, cols bool) (string, error) {
127183
var result []string

0 commit comments

Comments
 (0)