Kamirus / purescript-selda

A type-safe, high-level SQL library for PureScript
MIT License
90 stars 3 forks source link

Enable value-level codecs to be used instead of type-level codecs #60

Open JordanMartinez opened 3 years ago

JordanMartinez commented 3 years ago

Right now, the WriteForeign/ReadForeign and ToSQLValue/FromSQLValue type classes are used to encode/decode values to/from the underlying database.

Could this type-level codec requirement be lessened, so that value-level codecs could be used instead (e.g. purescript-codec-argonaut)?

If so, I believe the Table type could take a record as an additional argument whose fields' values correspond to the codecs to use when encoding/decoding values for a given column.

Kamirus commented 3 years ago

Yes, that would be nice to have, but it's a bit problematic right now as it requires quite a bit of work. I don't have enough time to implement it myself, but I can at least describe how I see it, and maybe someone would want to tackle it on their own.

The purpose of codecs or these ad-hoc type classes is to encode/decode records that represent rows in a database. One record is encoded as Array Foreign.

The first problem to tackle is to expose low-level, unsafe API in the postgresql-client as the currently exported functions require these ad-hoc type classes anyway. It would allow us to pass/get Foreign values to/from pg-client and handle conversion on our own. For now we could work around that as ToSQLRow accepts Array Foreign (it's already utilized to simplify the implementation of insert_ but not insert nor query because of the following problem), but the problem is that FromSQLRow does not have an instance for Array Foreign so we have to operate on a typed representation which requires more type-level programming. We need either of the following solutions:

The second step would be to implement a generic query operation that uses codecs


In case anyone would want to implement feel free to ask about any details or questions

JordanMartinez commented 3 years ago

Rather than export unsafeQuery directly as is, couldn't there be other versions of the other functions there (e.g. query) that drop the ToSQLRow and FromSQLRow type class constraints?

Kamirus commented 3 years ago

I think so, yes