typedquery
==========
Parser for SQL augmented with types
Till it finalised I would recomend installing it: with `cabal -f debug-typed-queries` just to see what is gonig on.
As the SQL parser is not complete, and will need a major lift to make it readable and sane... however it works fine for all queries I need.
This package provides base parsing facilities for possibly all *-simple database packages converting them into *-simpel-typed
* https://github.com/tolysz/mysql-simple-typed
* https://github.com/tolysz/sqlite-simple-typed
* https://github.com/tolysz/postgresql-simple-typed
example: https://github.com/tolysz/sqlite-simple-typed/blob/master/example/src/Main.hs
The basic idea is to start using SQL again, but use comemnts (`--`) to hide haskell annotation.
This started as `QuasiQuotes` excercise with the TH inpired `printf`.
* `genJsonQuery` produces `[Value]`
* `genTypedQuery` produces `[(T1,...,Tn)]` tuples, `[T]` or `()` all depending on the `SQL` query
If you do not provide value (or a mean to get on inside query you need to give it outside.
They do the same:
$(genJsonQuery "SET SESSION group_concat_max_len = ? ") conn (10000 :: Int)
$(genJsonQuery "SET SESSION group_concat_max_len = ? -- Int ") conn 10000
$(genJsonQuery "SET SESSION group_concat_max_len = ? -- Int -- < 1000 ") conn
$(genJsonQuery "SET SESSION group_concat_max_len = ? -- < (1000 :: Int) ") conn
There is a basic syntax, and the base idea is to have a nice easy for eye syntax.
It fires the correct `execute` or `query` with or without `_` depending on the actual `SQL` syntax
The parser is not complete, I will try to add as many issues there are and try to fix it.
Adnotations start with `-- ` as otherwise `HeidiSQL` was complaining, then `>` `<` `~` or just text.
| syntax | equivalent |
------------------------- | ------------------------------
| `bal -- Type` | `(\v -> v :: Bla)` |
| `bla -- > f` | `(\v -> f bla )` |
| `bla -- Type -- > f` | `(\v -> (f bla):: Type )` |
| `? -- Type -- < var` | `??` |
| `? -- < var` | `??` |
| `? -- < var` | `??` |
| `? -- ~ verbatim` | `??` |
Eg.
$(genJsonQuery [qq| insert into some_table
( timeAsSQLfunction -- ~ now ()
, someInputfromAesonViaLens -- Int -- < v ^? (key "coolValue" . _Integral) ^. non 3
, someUserName -- Text -- < someNameFromContext
) |]) conn
Translates to
execute conn [qq| insert into some_table
( timeAsSQLfunction, someInputfromAesonViaLens, someUserName )
values ( now (), ?, ?) |]
[( (v ^? (key "coolValue" . _Integral) ^. non 3 ) :: Int, someNameFromContext Text)]