in conversion/store_files.go [144:203]
func WriteBadData(bw *writer.BatchWriter, conv *internal.Conv, banner, name string, out *os.File) {
badConversions := conv.BadRows()
badWrites := utils.SumMapValues(bw.DroppedRowsByTable())
badDataStreaming := int64(0)
if conv.Audit.StreamingStats.Streaming {
badDataStreaming = getBadStreamingDataCount(conv)
}
if badConversions == 0 && badWrites == 0 && badDataStreaming == 0 {
os.Remove(name) // Cleanup bad-data file from previous run.
return
}
f, err := os.Create(name)
if err != nil {
fmt.Fprintf(out, "Can't write out bad data file: %v\n", err)
return
}
f.WriteString(banner)
maxRows := 100
if badConversions > 0 {
l := conv.SampleBadRows(maxRows)
if int64(len(l)) < badConversions {
f.WriteString("A sample of rows that generated conversion errors:\n")
} else {
f.WriteString("Rows that generated conversion errors:\n")
}
for _, r := range l {
_, err := f.WriteString(" " + r + "\n")
if err != nil {
fmt.Fprintf(out, "Can't write out bad data file: %v\n", err)
return
}
}
}
if badWrites > 0 {
l := bw.SampleBadRows(maxRows)
if int64(len(l)) < badWrites {
f.WriteString("A sample of rows that successfully converted but couldn't be written to Spanner:\n")
} else {
f.WriteString("Rows that successfully converted but couldn't be written to Spanner:\n")
}
for _, r := range l {
_, err := f.WriteString(" " + r + "\n")
if err != nil {
fmt.Fprintf(out, "Can't write out bad data file: %v\n", err)
return
}
}
}
if badDataStreaming > 0 {
err = writeBadStreamingData(conv, f)
if err != nil {
fmt.Fprintf(out, "Can't write out bad data file: %v\n", err)
return
}
}
fmt.Fprintf(out, "See file '%s' for details of bad rows\n", name)
}