Skip to content

Commit 68876e8

Browse files
authored
Merge branch 'main' into v131_test
2 parents 1428a3a + 9a9800f commit 68876e8

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

src/httpserver_extension.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,50 @@ static std::string ConvertResultToCSV(MaterializedQueryResult &result) {
171171
return csv_output;
172172
}
173173

174+
static std::string EscapeXML(const std::string &in) {
175+
std::string out;
176+
out.reserve(in.size());
177+
for (char c : in) {
178+
switch (c) {
179+
case '&': out += "&"; break;
180+
case '<': out += "&lt;"; break;
181+
case '>': out += "&gt;"; break;
182+
case '"': out += "&quot;"; break;
183+
case '\'': out += "&apos;"; break;
184+
default: out += c; break;
185+
}
186+
}
187+
return out;
188+
}
189+
190+
static std::string ConvertResultToXML(MaterializedQueryResult &result) {
191+
std::string xml;
192+
xml += "<results>\n";
193+
194+
for (idx_t row = 0; row < result.RowCount(); ++row) {
195+
xml += " <row>\n";
196+
197+
for (idx_t col = 0; col < result.ColumnCount(); ++col) {
198+
const std::string &col_name = result.ColumnName(col); // keep original
199+
Value val = result.GetValue(col, row);
200+
201+
xml += " <column name=\"";
202+
xml += EscapeXML(col_name);
203+
xml += "\">";
204+
205+
if (!val.IsNull()) {
206+
xml += EscapeXML(val.ToString());
207+
}
208+
209+
xml += "</column>\n";
210+
}
211+
xml += " </row>\n";
212+
}
213+
214+
xml += "</results>\n";
215+
return xml;
216+
}
217+
174218
// Handle both GET and POST requests
175219
void HandleHttpRequest(const duckdb_httplib_openssl::Request& req, duckdb_httplib_openssl::Response& res) {
176220
std::string query;
@@ -261,6 +305,10 @@ void HandleHttpRequest(const duckdb_httplib_openssl::Request& req, duckdb_httpli
261305
std::string csv_output = ConvertResultToCSV(*result);
262306
res.set_header("Content-Type", "text/csv");
263307
res.set_content(csv_output, "text/csv");
308+
} else if (format == "XML") {
309+
std::string xml_output = ConvertResultToXML(*result);
310+
res.set_header("Content-Type", "application/xml");
311+
res.set_content(xml_output, "application/xml");
264312
} else {
265313
// Default to NDJSON for DuckDB's own queries
266314
std::string json_output = ConvertResultToNDJSON(*result);

0 commit comments

Comments
 (0)