|
4 | 4 | "encoding/base64" |
5 | 5 | "encoding/json" |
6 | 6 | "fmt" |
| 7 | + "strings" |
7 | 8 | "time" |
8 | 9 | ) |
9 | 10 |
|
@@ -88,12 +89,12 @@ func serializeValue(v interface{}, qdbType QuestDBType) (string, error) { |
88 | 89 | case Symbol: |
89 | 90 | switch val := v.(type) { |
90 | 91 | case string: |
91 | | - return val, nil |
| 92 | + return quoteEscape(val, needsEscapeForSymbol, quoteSymbolFn), nil |
92 | 93 | } |
93 | 94 | case String: |
94 | 95 | switch val := v.(type) { |
95 | 96 | case string: |
96 | | - return fmt.Sprintf("\"%s\"", val), nil |
| 97 | + return quoteEscape(val, needsEscapeForStr, quoteStringFn), nil |
97 | 98 | } |
98 | 99 | case Long: |
99 | 100 | switch val := v.(type) { |
@@ -147,6 +148,37 @@ func serializeValue(v interface{}, qdbType QuestDBType) (string, error) { |
147 | 148 | return "", fmt.Errorf("type %T is not compatible with %s", v, qdbType) |
148 | 149 | } |
149 | 150 |
|
| 151 | +// Quote and escape an ILP input value, returns new string that is properly quoted and escaped. |
| 152 | +func quoteEscape(s string, needsEscape func(byte) bool, quoteFn func(*strings.Builder)) string { |
| 153 | + var b strings.Builder |
| 154 | + quoteFn(&b) |
| 155 | + for i := 0; i < len(s); i++ { |
| 156 | + if needsEscape(s[i]) { |
| 157 | + b.WriteByte('\\') |
| 158 | + } |
| 159 | + b.WriteByte(s[i]) |
| 160 | + } |
| 161 | + quoteFn(&b) |
| 162 | + |
| 163 | + return b.String() |
| 164 | +} |
| 165 | + |
| 166 | +func needsEscapeForStr(c byte) bool { |
| 167 | + return c == '\n' || c == '\r' || c == '\\' || c == '"' |
| 168 | +} |
| 169 | + |
| 170 | +func quoteStringFn(b *strings.Builder) { |
| 171 | + b.WriteByte('"') |
| 172 | +} |
| 173 | + |
| 174 | +func needsEscapeForSymbol(c byte) bool { |
| 175 | + return c == '\n' || c == '\r' || c == '\\' || c == ' ' || c == ',' || c == '=' |
| 176 | +} |
| 177 | + |
| 178 | +func quoteSymbolFn(*strings.Builder) { |
| 179 | + // no op, symbols are not quoted in ILP format |
| 180 | +} |
| 181 | + |
150 | 182 | var supportedQDBTypes = []QuestDBType{ |
151 | 183 | Boolean, |
152 | 184 | Byte, |
|
0 commit comments