this post was submitted on 27 Dec 2023
540 points (96.9% liked)

Programmer Humor

19551 readers
987 users here now

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

founded 1 year ago
MODERATORS
 
you are viewing a single comment's thread
view the rest of the comments
[โ€“] [email protected] 2 points 10 months ago* (last edited 10 months ago) (1 children)

I mean, that's just a bad library interface. With a halfway decent interface, you can do something like

query('insert into foo (status, name) values (:status, :name)', ent)

No orm required. With tagged templates in JS, you can do

q`insert into foo (status, name) values (${ent.status}, ${ent.name})`

Even wrap it in a function with destructuring to get rid of ent:

const addFoo = (q, {status, name}) =>
    q`insert into foo (status, name) values (${status}, ${name})`

Typescript can add type safety on top of that, of course. And there's the option to prepare a query once and execute it multiple times.

Honestly, the idea of manipulating XML queries, if you mean anything more fancy than the equivalent of parameter injection, sounds over-complicated, but I'd love to see a more concrete example of what you mean by that.

[โ€“] akash_rawal 2 points 10 months ago* (last edited 10 months ago)

I was thinking along the lines of

Plenty of libraries can build the XML using structs/classes. e.g. with serde:

//Data type for row
#[derive(serde::Serialize)]
pub struct Foo {
	pub status: String,
	pub name: String,
}

//Example row
let ent = Foo {
    status: "paid".into(),
    name: "bob".into(),
}

//Example execution
sqlx::query(&serde_xml_rs::to_string(&InsertStmt{
	table: "foo".into(),
	value: &ent,
})?).execute(&conn)?;

Or with jackson-dataformat-xml:

//Data type for row
public class Foo {
    public string status;
    public string name;
}

//Example row
Foo ent = new Foo();
foo.status = "paid";
foo.value = "bob";

//Example execution
XmlMapper xmlMapper = new XmlMapper();
String xml = xmlMapper.writeValueAsString(new InsertStmt("foo", ent));
try (Statement stmt = conn.createStatement()) {
    stmt.executeUpdate(xml)
}

I don't do JS (yet) but maybe JSX could also do similar things with XML queries.

No more matching $1, $2, ... (or ? for mysql) with individual columns, I could dump entire structs/objects into a query and it would work.