| 104 | } |
| 105 | |
| 106 | func escapeBackslashCSV(s []byte, bf *bytes.Buffer, opt *csvOption) { |
| 107 | var ( |
| 108 | escape byte |
| 109 | last int |
| 110 | specCmt byte |
| 111 | ) |
| 112 | if len(opt.delimiter) > 0 { |
| 113 | specCmt = opt.delimiter[0] // if csv has a delimiter, we should use backslash to comment the delimiter in field value |
| 114 | } else if len(opt.separator) > 0 { |
| 115 | specCmt = opt.separator[0] // if csv's delimiter is "", we should escape the separator to avoid error |
| 116 | } |
| 117 | |
| 118 | for i := 0; i < len(s); i++ { |
| 119 | escape = 0 |
| 120 | |
| 121 | switch s[i] { |
| 122 | case 0: /* Must be escaped for 'mysql' */ |
| 123 | escape = '0' |
| 124 | case '\r': |
| 125 | escape = 'r' |
| 126 | case '\n': /* escaped for line terminators */ |
| 127 | escape = 'n' |
| 128 | case '\\': |
| 129 | escape = '\\' |
| 130 | case specCmt: |
| 131 | escape = specCmt |
| 132 | } |
| 133 | |
| 134 | if escape != 0 { |
| 135 | bf.Write(s[last:i]) |
| 136 | bf.WriteByte('\\') |
| 137 | bf.WriteByte(escape) |
| 138 | last = i + 1 |
| 139 | } |
| 140 | } |
| 141 | bf.Write(s[last:]) |
| 142 | } |
| 143 | |
| 144 | func escapeSQL(s []byte, bf *bytes.Buffer, escapeBackslash bool) { // revive:disable-line:flag-parameter |
| 145 | if escapeBackslash { |