Skip to content

Commit 157b633

Browse files
committed
Switched to into_buf for bounds checking [skip ci]
1 parent 632462f commit 157b633

File tree

1 file changed

+28
-22
lines changed

1 file changed

+28
-22
lines changed

include/pgvector/pqxx.hpp

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,16 @@ template<> struct string_traits<pgvector::Vector> {
5656
}
5757

5858
size_t here = 0;
59-
buf[here++] = '[';
59+
here += pqxx::into_buf(buf.subspan(here), "[", c);
6060

6161
for (size_t i = 0; i < values.size(); i++) {
6262
if (i != 0) {
63-
buf[here++] = ',';
63+
here += pqxx::into_buf(buf.subspan(here), ",", c);
6464
}
6565
here += pqxx::into_buf(buf.subspan(here), values[i], c);
6666
}
6767

68-
buf[here++] = ']';
68+
here += pqxx::into_buf(buf.subspan(here), "]", c);
6969

7070
return {std::data(buf), here};
7171
}
@@ -76,11 +76,13 @@ template<> struct string_traits<pgvector::Vector> {
7676
// cannot throw an exception here on overflow
7777
// so throw in into_buf
7878

79-
size_t size = 2; // [ and ]
79+
size_t size = 0;
80+
size += pqxx::size_buffer("[");
8081
for (const auto v : values) {
81-
size += 1; // ,
82-
size += string_traits<float>::size_buffer(v);
82+
size += pqxx::size_buffer(",");
83+
size += pqxx::size_buffer(v);
8384
}
85+
size += pqxx::size_buffer("]");
8486
return size;
8587
}
8688
};
@@ -122,16 +124,16 @@ template<> struct string_traits<pgvector::HalfVector> {
122124
}
123125

124126
size_t here = 0;
125-
buf[here++] = '[';
127+
here += pqxx::into_buf(buf.subspan(here), "[", c);
126128

127129
for (size_t i = 0; i < values.size(); i++) {
128130
if (i != 0) {
129-
buf[here++] = ',';
131+
here += pqxx::into_buf(buf.subspan(here), ",", c);
130132
}
131133
here += pqxx::into_buf(buf.subspan(here), static_cast<float>(values[i]), c);
132134
}
133135

134-
buf[here++] = ']';
136+
here += pqxx::into_buf(buf.subspan(here), "]", c);
135137

136138
return {std::data(buf), here};
137139
}
@@ -142,11 +144,13 @@ template<> struct string_traits<pgvector::HalfVector> {
142144
// cannot throw an exception here on overflow
143145
// so throw in into_buf
144146

145-
size_t size = 2; // [ and ]
147+
size_t size = 0;
148+
size += pqxx::size_buffer("[");
146149
for (const auto v : values) {
147-
size += 1; // ,
148-
size += string_traits<float>::size_buffer(static_cast<float>(v));
150+
size += pqxx::size_buffer(",");
151+
size += pqxx::size_buffer(static_cast<float>(v));
149152
}
153+
size += pqxx::size_buffer("]");
150154
return size;
151155
}
152156
};
@@ -221,19 +225,18 @@ template<> struct string_traits<pgvector::SparseVector> {
221225
}
222226

223227
size_t here = 0;
224-
buf[here++] = '{';
228+
here += pqxx::into_buf(buf.subspan(here), "{", c);
225229

226230
for (size_t i = 0; i < nnz; i++) {
227231
if (i != 0) {
228-
buf[here++] = ',';
232+
here += pqxx::into_buf(buf.subspan(here), ",", c);
229233
}
230234
here += pqxx::into_buf(buf.subspan(here), indices[i] + 1, c);
231-
buf[here++] = ':';
235+
here += pqxx::into_buf(buf.subspan(here), ":", c);
232236
here += pqxx::into_buf(buf.subspan(here), values[i], c);
233237
}
234238

235-
buf[here++] = '}';
236-
buf[here++] = '/';
239+
here += pqxx::into_buf(buf.subspan(here), "}/", c);
237240
here += pqxx::into_buf(buf.subspan(here), dimensions, c);
238241

239242
return {std::data(buf), here};
@@ -248,13 +251,16 @@ template<> struct string_traits<pgvector::SparseVector> {
248251
// cannot throw an exception here on overflow
249252
// so throw in into_buf
250253

251-
size_t size = 3; // {, }, and /
252-
size += string_traits<int>::size_buffer(dimensions);
254+
size_t size = 0;
255+
size += pqxx::size_buffer("{");
253256
for (size_t i = 0; i < nnz; i++) {
254-
size += 2; // : and ,
255-
size += string_traits<int>::size_buffer(indices[i] + 1);
256-
size += string_traits<float>::size_buffer(values[i]);
257+
size += pqxx::size_buffer(",");
258+
size += pqxx::size_buffer(indices[i] + 1);
259+
size += pqxx::size_buffer(":");
260+
size += pqxx::size_buffer(values[i]);
257261
}
262+
size += pqxx::size_buffer("}/");
263+
size += pqxx::size_buffer(dimensions);
258264
return size;
259265
}
260266
};

0 commit comments

Comments
 (0)