packages feed

typedquery-0.1.0.1: README.md

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)]