Skip to content

Commit f9a5d13

Browse files
committed
fixes
1 parent 050c014 commit f9a5d13

File tree

4 files changed

+71
-55
lines changed

4 files changed

+71
-55
lines changed

x/bsonx/bsoncore/array.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -82,21 +82,23 @@ func (a Array) DebugString() string {
8282
// String outputs an ExtendedJSON version of Array. If the Array is not valid, this method
8383
// returns an empty string.
8484
func (a Array) String() string {
85-
return a.stringN(0)
85+
str, _ := a.stringN(0)
86+
return str
8687
}
8788

8889
// StringN stringifies an array upto N bytes
8990
func (a Array) StringN(n int) string {
9091
if n <= 0 {
9192
return ""
9293
}
93-
return a.stringN(n)
94+
str, _ := a.stringN(n)
95+
return str
9496
}
9597

9698
// stringN stringify an array. If N is larger than 0, it will truncate the string to N bytes.
97-
func (a Array) stringN(n int) string {
99+
func (a Array) stringN(n int) (string, bool) {
98100
if lens, _, _ := ReadLength(a); lens < 5 {
99-
return ""
101+
return "", true
100102
}
101103

102104
var buf strings.Builder
@@ -105,23 +107,26 @@ func (a Array) stringN(n int) string {
105107
length, rem, _ := ReadLength(a) // We know we have enough bytes to read the length
106108
length -= (4 /* length bytes */ + 1 /* final null byte */)
107109

110+
var truncated bool
108111
var elem Element
109112
var ok bool
110-
113+
var str string
111114
first := true
112-
for length > 0 {
115+
for length > 0 && !truncated {
113116
l := 0
114117
if n > 0 {
115118
if buf.Len() >= n {
119+
truncated = true
116120
break
117121
}
118122
l = n - buf.Len()
119123
}
120124
if !first {
121125
buf.WriteByte(',')
122126
if l > 0 {
123-
l -= 1
127+
l--
124128
if l == 0 {
129+
truncated = true
125130
break
126131
}
127132
}
@@ -130,20 +135,20 @@ func (a Array) stringN(n int) string {
130135
elem, rem, ok = ReadElement(rem)
131136
length -= int32(len(elem))
132137
if !ok || length < 0 {
133-
return ""
138+
return "", true
134139
}
135140

136-
str := elem.Value().stringN(l)
141+
str, truncated = elem.Value().stringN(l)
137142
buf.WriteString(str)
138143

139144
first = false
140145
}
141146

142-
if n <= 0 || buf.Len() < n {
147+
if n <= 0 || !truncated {
143148
buf.WriteByte(']')
144149
}
145150

146-
return buf.String()
151+
return buf.String(), truncated
147152
}
148153

149154
// Values returns this array as a slice of values. The returned slice will contain valid values.

x/bsonx/bsoncore/document.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -261,21 +261,23 @@ func (d Document) DebugString() string {
261261
// String outputs an ExtendedJSON version of Document. If the document is not valid, this method
262262
// returns an empty string.
263263
func (d Document) String() string {
264-
return d.stringN(0)
264+
str, _ := d.stringN(0)
265+
return str
265266
}
266267

267268
// StringN stringifies a document upto N bytes
268269
func (d Document) StringN(n int) string {
269270
if n <= 0 {
270271
return ""
271272
}
272-
return d.stringN(n)
273+
str, _ := d.stringN(n)
274+
return str
273275
}
274276

275277
// stringN stringify a document. If N is larger than 0, it will truncate the string to N bytes.
276-
func (d Document) stringN(n int) string {
278+
func (d Document) stringN(n int) (string, bool) {
277279
if len(d) < 5 {
278-
return ""
280+
return "", true
279281
}
280282

281283
var buf strings.Builder
@@ -284,23 +286,26 @@ func (d Document) stringN(n int) string {
284286
length, rem, _ := ReadLength(d)
285287
length -= (4 /* length bytes */ + 1 /* final null byte */)
286288

289+
var truncated bool
287290
var elem Element
288291
var ok bool
289-
292+
var str string
290293
first := true
291-
for length > 0 {
294+
for length > 0 && !truncated {
292295
l := 0
293296
if n > 0 {
294297
if buf.Len() >= n {
298+
truncated = true
295299
break
296300
}
297301
l = n - buf.Len()
298302
}
299303
if !first {
300304
buf.WriteByte(',')
301305
if l > 0 {
302-
l -= 1
306+
l--
303307
if l == 0 {
308+
truncated = true
304309
break
305310
}
306311
}
@@ -309,20 +314,20 @@ func (d Document) stringN(n int) string {
309314
elem, rem, ok = ReadElement(rem)
310315
length -= int32(len(elem))
311316
if !ok || length < 0 {
312-
return ""
317+
return "", true
313318
}
314319

315-
str := elem.stringN(l)
320+
str, truncated = elem.stringN(l)
316321
buf.WriteString(str)
317322

318323
first = false
319324
}
320325

321-
if n <= 0 || buf.Len() < n {
326+
if n <= 0 || !truncated {
322327
buf.WriteByte('}')
323328
}
324329

325-
return buf.String()
330+
return buf.String(), truncated
326331
}
327332

328333
// Elements returns this document as a slice of elements. The returned slice will contain valid

x/bsonx/bsoncore/element.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,30 +117,32 @@ func (e Element) ValueErr() (Value, error) {
117117

118118
// String implements the fmt.String interface. The output will be in extended JSON format.
119119
func (e Element) String() string {
120-
return e.stringN(0)
120+
str, _ := e.stringN(0)
121+
return str
121122
}
122123

123124
// StringN implements the fmt.String interface for upto N bytes. The output will be in extended JSON format.
124125
func (e Element) StringN(n int) string {
125126
if n <= 0 {
126127
return ""
127128
}
128-
return e.stringN(n)
129+
str, _ := e.stringN(n)
130+
return str
129131
}
130132

131133
// stringN stringify an element. If N is larger than 0, it will truncate the string to N bytes.
132-
func (e Element) stringN(n int) string {
134+
func (e Element) stringN(n int) (string, bool) {
133135
if len(e) == 0 {
134-
return ""
136+
return "", true
135137
}
136138
if n == 1 {
137-
return `"`
139+
return `"`, true
138140
}
139141

140142
t := Type(e[0])
141143
idx := bytes.IndexByte(e[1:], 0x00)
142144
if idx <= 0 {
143-
return ""
145+
return "", true
144146
}
145147
key := e[1 : idx+1]
146148

@@ -161,30 +163,32 @@ func (e Element) stringN(n int) string {
161163
l := 0
162164
if n > 0 {
163165
if buf.Len() >= n {
164-
return buf.String()
166+
return buf.String(), true
165167
}
166168
l = n - buf.Len()
167169
}
168170

169171
val, _, valid := ReadValue(e[idx+2:], t)
170172
if !valid {
171-
return ""
173+
return "", true
172174
}
173175

174176
var str string
177+
var truncated bool
175178
if _, ok := val.StringValueOK(); ok {
176-
str = val.stringN(l)
179+
str, truncated = val.stringN(l)
177180
} else if arr, ok := val.ArrayOK(); ok {
178-
str = arr.stringN(l)
181+
str, truncated = arr.stringN(l)
179182
} else {
180183
str = val.String()
181184
if l > 0 && len(str) > l {
185+
truncated = true
182186
str = bsoncoreutil.Truncate(str, l)
183187
}
184188
}
185189

186190
buf.WriteString(str)
187-
return buf.String()
191+
return buf.String(), truncated
188192
}
189193

190194
// DebugString outputs a human readable version of RawElement. It will attempt to stringify the

0 commit comments

Comments
 (0)