git.iko.soy/typeable/postgresql-simple
on master help sign in
Add support for Range types to TypeInfo system
commitdb14cf8ded7f270e63d1b19d573b76ddac153d02 authorLeon P Smith <leon@melding-monads.com> dateTue 26 Mar 2013, 17:41 (14 years ago) parentf685f92
3 files changed+26−3
src/Database/PostgreSQL/Simple/FromRow.hs-boot+3 src/Database/PostgreSQL/Simple/TypeInfo.hs+15−3 src/Database/PostgreSQL/Simple/TypeInfo/Types.hs+8
src/Database/PostgreSQL/Simple/FromRow.hs-boot+3
@@ -1,8 +1,11 @@
11module Database.PostgreSQL.Simple.FromRow where
22
33import {-# SOURCE #-} Database.PostgreSQL.Simple.FromField
4+import Database.PostgreSQL.Simple.Types
45
56class FromRow a
67
8+instance (FromField a) => FromRow (Only a)
79instance (FromField a, FromField b, FromField c, FromField d) => FromRow (a,b,c,d)
810instance (FromField a, FromField b, FromField c, FromField d, FromField e) => FromRow (a,b,c,d,e)
11+
src/Database/PostgreSQL/Simple/TypeInfo.hs+15−3
@@ -67,12 +67,24 @@ getTypeInfo' conn oid oidmap =
6767 [(typoid, typcategory_, typdelim_, typname, typelem_)] -> do
6868 let !typcategory = B8.index typcategory_ 0
6969 !typdelim = B8.index typdelim_ 0
70− if typcategory == 'A'
71− then do
70+ case typcategory of
71+ 'A' -> do
7272 (oidmap', typelem) <- getTypeInfo' conn typelem_ oidmap
7373 let !typeInfo = Array{..}
7474 return (oidmap', typeInfo)
75− else do
75+ 'R' -> do
76+ rngsubtypeOids <- query conn "SELECT rngsubtype\
77+ \ FROM pg_range\
78+ \ WHERE rngtypid = ?"
79+ (Only oid)
80+ case rngsubtypeOids of
81+ [Only rngsubtype_] -> do
82+ (oidmap', rngsubtype) <-
83+ getTypeInfo' conn rngsubtype_ oidmap
84+ let !typeInfo = Range{..}
85+ return (oidmap', typeInfo)
86+ _ -> fail "range subtype query failed to return exactly one result"
87+ _ -> do
7688 let !typeInfo = Basic{..}
7789 return (oidmap, typeInfo)
7890 _ -> fail "typename query returned more than one result"
src/Database/PostgreSQL/Simple/TypeInfo/Types.hs+8
@@ -30,4 +30,12 @@ data TypeInfo
3030 , typname :: !ByteString
3131 , typelem :: !TypeInfo
3232 }
33+
34+ | Range { typoid :: {-# UNPACK #-} !Oid
35+ , typcategory :: {-# UNPACK #-} !Char
36+ , typdelim :: {-# UNPACK #-} !Char
37+ , typname :: !ByteString
38+ , rngsubtype :: !TypeInfo
39+ }
40+
3341 deriving (Show)