@@ -4,18 +4,22 @@ import Data.ByteString.Lazy (toStrict)
4
4
import Data.ByteString.Builder (toLazyByteString )
5
5
import Data.ByteString (ByteString )
6
6
import Data.Monoid
7
+ import Data.Foldable
7
8
import System.IO.Unsafe
8
9
import Data.Vector as V (fromList , empty )
9
10
import Criterion.Main
10
11
import Data.Time
11
12
import Data.UUID
12
13
import Data.UUID.V4 (nextRandom )
13
14
import Data.Scientific
15
+ import Data.Vector (Vector )
16
+ import qualified Data.ByteString as B
14
17
15
18
import Database.PostgreSQL.Protocol.Types
16
19
import Database.PostgreSQL.Protocol.Encoders
17
20
import Database.PostgreSQL.Protocol.Store.Encode
18
21
import Database.PostgreSQL.Protocol.Store.Decode
22
+ import Database.PostgreSQL.Protocol.DataRows
19
23
import qualified Database.PostgreSQL.Protocol.Codecs.Decoders as PD
20
24
import qualified Database.PostgreSQL.Protocol.Codecs.Encoders as PE
21
25
import qualified Database.PostgreSQL.Protocol.Codecs.PgTypes as PGT
@@ -27,7 +31,14 @@ main = defaultMain
27
31
, bench " Scientific" $ nf (runEncode . PE. numeric) testScientific
28
32
, bench " UTCTime" $ nf (runEncode . PE. timestamptz) testUTCTime
29
33
, bench " UUID" $ nf (runEncode . PE. uuid) testUUID
30
- ]
34
+ ]
35
+ , bgroup " Decoding"
36
+ [ bench " Message" $ nf decodeMessage testDataRows
37
+ , bench " Message as bytes" $ nf decodeMessageBytes testDataRows
38
+ , bench " Scientific" $ nf (runDecode $ PD. numeric 0 ) testScientificEncoded
39
+ , bench " UTCTime" $ nf (runDecode $ PD. timestamptz 0 ) testUTCTimeEncoded
40
+ , bench " UUID" $ nf (runDecode $ PD. uuid 0 ) testUUIDEncoded
41
+ ]
31
42
]
32
43
33
44
type QueryParams
@@ -48,14 +59,23 @@ queryParams =
48
59
testScientific :: Scientific
49
60
testScientific = scientific 11111111111111 (- 18 )
50
61
62
+ testScientificEncoded :: ByteString
63
+ testScientificEncoded = runEncode $ PE. numeric testScientific
64
+
51
65
{-# NOINLINE testUTCTime #-}
52
66
testUTCTime :: UTCTime
53
67
testUTCTime = unsafePerformIO getCurrentTime
54
68
69
+ testUTCTimeEncoded :: ByteString
70
+ testUTCTimeEncoded = runEncode $ PE. timestamptz testUTCTime
71
+
55
72
{-# NOINLINE testUUID #-}
56
73
testUUID :: UUID
57
74
testUUID = unsafePerformIO nextRandom
58
75
76
+ testUUIDEncoded :: ByteString
77
+ testUUIDEncoded = runEncode $ PE. uuid testUUID
78
+
59
79
encodeMessage :: QueryParams -> ByteString
60
80
encodeMessage params = runEncode $
61
81
encodeClientMessage parseMessage <> encodeClientMessage bindMessage
@@ -85,3 +105,37 @@ encodeMessage params = runEncode $
85
105
, PGT. uuid
86
106
]
87
107
108
+ decodeMessage :: DataRows -> Vector QueryParams
109
+ decodeMessage = decodeManyRows (PD. dataRowHeader *> decoder)
110
+ where
111
+ decoder = (,,,,,,)
112
+ <$> PD. getNonNullable PD. bool
113
+ <*> PD. getNonNullable PD. bytea
114
+ <*> PD. getNonNullable PD. float8
115
+ <*> PD. getNonNullable PD. interval
116
+ <*> PD. getNonNullable PD. numeric
117
+ <*> PD. getNonNullable PD. timestamptz
118
+ <*> PD. getNonNullable PD. uuid
119
+
120
+ decodeMessageBytes
121
+ :: DataRows
122
+ -> Vector ( ByteString , ByteString , ByteString , ByteString , ByteString
123
+ , ByteString , ByteString )
124
+ decodeMessageBytes = decodeManyRows (PD. dataRowHeader *> decoder)
125
+ where
126
+ decoder = (,,,,,,)
127
+ <$> PD. getNonNullable PD. bytea
128
+ <*> PD. getNonNullable PD. bytea
129
+ <*> PD. getNonNullable PD. bytea
130
+ <*> PD. getNonNullable PD. bytea
131
+ <*> PD. getNonNullable PD. bytea
132
+ <*> PD. getNonNullable PD. bytea
133
+ <*> PD. getNonNullable PD. bytea
134
+
135
+ {-# NOINLINE testDataRows #-}
136
+ testDataRows :: DataRows
137
+ testDataRows = DataRows chunk (DataRows chunk (DataRows chunk Empty ))
138
+ where
139
+ row = unsafePerformIO $ B. readFile " bench/row.out"
140
+ rows = fold $ replicate 10 row
141
+ chunk = DataChunk 10 rows
0 commit comments