On Fri, Aug 19, 2011 at 07:23, Henry House <hajho...@hajhouse.org> wrote: > Does there exist any sample code or other resources on writing a custom > SQL-to-Haskell datatype converter instance for use with HDBC that would be > accessible to someone just starting with Haskell? The reason I need this is > because of this problem (using PostgreSQL): > > Prelude Database.HDBC.PostgreSQL Database.HDBC> res <- (quickQuery db "select > 1::numeric(5,4);" []) > Prelude Database.HDBC.PostgreSQL Database.HDBC> res > [[SqlRational (1 % 1)]] > Prelude Database.HDBC.PostgreSQL Database.HDBC> res <- (quickQuery db "select > 1::numeric(5,0);" []) > [[SqlRational (1 % 1)]] > > where db is a database connection. The SQL values 1::numeric(5,4) and > 1::numeric(5,0) are supposed to be fixed-precision numbers having 4 and zero > significant decimal figures after the decimal point, respectively. Both are > offered by HDBC as the same SqlValue, SqlRational (1 % 1) but they are not > really the same at all. The precision information has been lost. The native > outputs of PostgreSQL, before HDBC's type conversion, are 1.0000 and 1 for > 'select 1::numeric(5,4);' and 'select 1::numeric(5,0);', respectively.
Do you really need the precision info about the column, or do you just need the values at the right precision? Because you get the last thing already: Prelude Database.HDBC.PostgreSQL Database.HDBC Data.Ratio Control.Monad> (fromSql . head . head) `liftM` (quickQuery db "select 1.231 ::numeric(5,0);" []) :: IO Rational 1 % 1 Prelude Database.HDBC.PostgreSQL Database.HDBC Data.Ratio Control.Monad> (fromSql . head . head) `liftM` (quickQuery db "select 1.231 ::numeric(5,4);" []) :: IO Rational 1231 % 1000 If you need the precision information, perhaps 'describeResult' will give you what you need. I've never used it, but it looks like it might. Erik _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe