git.iko.soy/typeable/postgresql-simple
on master help sign in
Add support for Range types to TypeInfo system
db14cf8Leon P Smith
src/Database/PostgreSQL/Simple/FromRow.hs-boot+3
@@ -1,8 +1,11 @@
1module Database.PostgreSQL.Simple.FromRow where
1module Database.PostgreSQL.Simple.FromRow where
2
2
3import {-# SOURCE #-} Database.PostgreSQL.Simple.FromField
3import {-# SOURCE #-} Database.PostgreSQL.Simple.FromField
4+import Database.PostgreSQL.Simple.Types
4
5
5class FromRow a
6class FromRow a
6
7
8+instance (FromField a) => FromRow (Only a)
7instance (FromField a, FromField b, FromField c, FromField d) => FromRow (a,b,c,d)
9instance (FromField a, FromField b, FromField c, FromField d) => FromRow (a,b,c,d)
8instance (FromField a, FromField b, FromField c, FromField d, FromField e) => FromRow (a,b,c,d,e)
10instance (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 =
67 [(typoid, typcategory_, typdelim_, typname, typelem_)] -> do
67 [(typoid, typcategory_, typdelim_, typname, typelem_)] -> do
68 let !typcategory = B8.index typcategory_ 0
68 let !typcategory = B8.index typcategory_ 0
69 !typdelim = B8.index typdelim_ 0
69 !typdelim = B8.index typdelim_ 0
70− if typcategory == 'A'
70+ case typcategory of
71− then do
71+ 'A' -> do
72 (oidmap', typelem) <- getTypeInfo' conn typelem_ oidmap
72 (oidmap', typelem) <- getTypeInfo' conn typelem_ oidmap
73 let !typeInfo = Array{..}
73 let !typeInfo = Array{..}
74 return (oidmap', typeInfo)
74 return (oidmap', typeInfo)
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"
75− else do
87+ _ -> do
76 let !typeInfo = Basic{..}
88 let !typeInfo = Basic{..}
77 return (oidmap, typeInfo)
89 return (oidmap, typeInfo)
78 _ -> fail "typename query returned more than one result"
90 _ -> fail "typename query returned more than one result"
src/Database/PostgreSQL/Simple/TypeInfo/Types.hs+8
@@ -30,4 +30,12 @@ data TypeInfo
30 , typname :: !ByteString
30 , typname :: !ByteString
31 , typelem :: !TypeInfo
31 , typelem :: !TypeInfo
32 }
32 }
33+
34+ | Range { typoid :: {-# UNPACK #-} !Oid
35+ , typcategory :: {-# UNPACK #-} !Char
36+ , typdelim :: {-# UNPACK #-} !Char
37+ , typname :: !ByteString
38+ , rngsubtype :: !TypeInfo
39+ }
40+
33 deriving (Show)
41 deriving (Show)