8000 Improved Query datatype · postgres-haskell/postgres-wire@f1c7ab2 · GitHub
[go: up one dir, main page]

Skip to content

Commit f1c7ab2

Browse files
Improved Query datatype
1 parent fe7e7f4 commit f1c7ab2

File tree

5 files changed

+29
-17
lines changed

5 files changed

+29
-17
lines changed

src/Database/PostgreSQL/Driver.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ module Database.PostgreSQL.Driver
1616
, Query(..)
1717
, Oid(..)
1818
, Format(..)
19+
, CachePolicy(..)
1920
, sendBatch
2021
, sendBatchAndSync
2122
, sendBatchAndFlush
@@ -34,6 +35,7 @@ module Database.PostgreSQL.Driver
3435
import Database.PostgreSQL.Protocol.Types
3536

3637
import Database.PostgreSQL.Driver.Connection
38+
import Database.PostgreSQL.Driver.StatementStorage
3739
import Database.PostgreSQL.Driver.Settings
3840
import Database.PostgreSQL.Driver.Query
3941
import Database.PostgreSQL.Driver.Error

src/Database/PostgreSQL/Driver/Query.hs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ import Database.PostgreSQL.Driver.StatementStorage
1616
-- Public
1717
data Query = Query
1818
{ qStatement :: B.ByteString
19-
, qOids :: V.Vector Oid
20-
, qValues :: V.Vector B.ByteString
19+
, qValues :: V.Vector (Oid, B.ByteString)
2120
, qParamsFormat :: Format
2221
, qResultFormat :: Format
22+
, qCachePolicy :: CachePolicy
2323
} deriving (Show)
2424

2525
-- | Public
@@ -30,9 +30,11 @@ sendBatch conn = traverse_ sendSingle
3030
sname = StatementName ""
3131
pname = PortalName ""
3232
sendSingle q = do
33-
sendMessage s $ Parse sname (StatementSQL $ qStatement q) (qOids q)
3433
sendMessage s $
35-
Bind pname sname (qParamsFormat q) (qValues q) (qResultFormat q)
34+
Parse sname (StatementSQL $ qStatement q) (fst <$> qValues q)
35+
sendMessage s $
36+
Bind pname sname (qParamsFormat q) (snd <$> qValues q)
37+
(qResultFormat q)
3638
sendMessage s $ Execute pname noLimitToReceive
3739

3840
-- | Public

src/Database/PostgreSQL/Driver/StatementStorage.hs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ import Database.PostgreSQL.Protocol.Types
1212
data StatementStorage = StatementStorage
1313
(H.CuckooHashTable StatementSQL StatementName) (IORef Word)
1414

15+
-- | Cache policy about prepared statements.
16+
data CachePolicy
17+
= AlwaysCache
18+
| NeverCache
19+
deriving (Show)
20+
1521
newStatementStorage :: IO StatementStorage
1622
newStatementStorage = StatementStorage <$> H.new <*> newIORef 0
1723

@@ -26,3 +32,6 @@ storageStatement (StatementStorage table counter) stmt = do
2632
H.insert table stmt name
2733
pure name
2834

35+
getCacheSize :: StatementStorage -> IO Word
36+
getCacheSize (StatementStorage _ counter) = readIORef counter
37+

tests/Driver.hs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import Test.Tasty
1212
import Test.Tasty.HUnit
1313

1414
import Database.PostgreSQL.Driver.Connection
15+
import Database.PostgreSQL.Driver.StatementStorage
1516
import Database.PostgreSQL.Driver.Query
1617
import Database.PostgreSQL.Protocol.Types
1718

@@ -33,12 +34,12 @@ testDriver = testGroup "Driver"
3334
]
3435

3536
makeQuery1 :: B.ByteString -> Query
36-
makeQuery1 n = Query "SELECT $1" (V.fromList [Oid 23]) (V.fromList [n])
37-
Text Text
37+
makeQuery1 n = Query "SELECT $1" (V.fromList [(Oid 23, n)])
38+
Text Text AlwaysCache
3839

3940
makeQuery2 :: B.ByteString -> B.ByteString -> Query
40-
makeQuery2 n1 n2 = Query "SELECT $1 + $2" (V.fromList [Oid 23, Oid 23])
41-
(V.fromList [n1, n2]) Text Text
41+
makeQuery2 n1 n2 = Query "SELECT $1 + $2"
42+
(V.fromList [(Oid 23, n1), (Oid 23, n2)]) Text Text AlwaysCache
4243

4344
fromRight :: Either e a -> a
4445
fromRight (Right v) = v
@@ -94,12 +95,12 @@ testMultipleBatches = withConnection $ replicateM_ 10 . assertSingleBatch
9495
-- | Query is empty string.
9596
testEmptyQuery :: IO ()
9697
testEmptyQuery = assertQueryNoData $
97-
Query "" V.empty V.empty Text Text
98+
Query "" V.empty Text Text NeverCache
9899

99100
-- | Query than returns no datarows.
100101
testQueryWithoutResult :: IO ()
101102
testQueryWithoutResult = assertQueryNoData $
102-
Query "SET client_encoding TO UTF8" V.empty V.empty Text Text
103+
Query "SET client_encoding TO UTF8" V.empty Text Text NeverCache
103104

104105
-- | Asserts that query returns no data rows.
105106
assertQueryNoData :: Query -> IO ()
@@ -127,18 +128,15 @@ checkInvalidResult conn n = readNextData conn >>=
127128
testInvalidBatch :: IO ()
128129
testInvalidBatch = do
129130
let rightQuery = makeQuery1 "5"
130-
q1 = Query "SEL $1" (V.fromList [Oid 23]) (V.fromList ["5"]) Text Text
131-
q2 = Query "SELECT $1" (V.fromList [Oid 23]) (V.fromList ["a"]) Text Text
132-
q3 = Query "SELECT $1" (V.fromList [Oid 23]) (V.fromList []) Text Text
133-
q4 = Query "SELECT $1" (V.fromList []) (V.fromList ["5"]) Text Text
131+
q1 = Query "SEL $1" (V.fromList [(Oid 23, "5")]) Text Text NeverCache
132+
q2 = Query "SELECT $1" (V.fromList [(Oid 23, "a")]) Text Text NeverCache
133+
q4 = Query "SELECT $1" (V.fromList []) Text Text NeverCache
134134

135135
assertInvalidBatch "Parse error" [q1]
136136
assertInvalidBatch "Invalid param" [ q2]
137-
assertInvalidBatch "Missed param" [ q3]
138137
assertInvalidBatch "Missed oid of param" [ q4]
139138
assertInvalidBatch "Parse error" [rightQuery, q1]
140139
assertInvalidBatch "Invalid param" [rightQuery, q2]
141-
assertInvalidBatch "Missed param" [rightQuery, q3]
142140
assertInvalidBatch "Missed oid of param" [rightQuery, q4]
143141
where
144142
assertInvalidBatch desc qs = withConnection $ \c -> do

tests/Protocol.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Test.Tasty
99
import Test.Tasty.HUnit
1010

1111
import Database.PostgreSQL.Driver.Connection
12+
import Database.PostgreSQL.Driver.StatementStorage
1213
import Database.PostgreSQL.Driver.Query
1314
import Database.PostgreSQL.Protocol.Types
1415

@@ -87,7 +88,7 @@ testExtendedQuery = withConnectionAll $ \c -> do
8788
-- string is empty.
8889
testExtendedEmptyQuery :: IO ()
8990
testExtendedEmptyQuery = withConnectionAll $ \c -> do
90-
let query = Query "" V.empty V.empty Text Text
91+
let query = Query "" V.empty Text Text NeverCache
9192
sendBatchAndSync c [query]
9293
msgs <- collectBeforeReadyForQuery c
9394
assertNoErrorResponse msgs

0 commit comments

Comments
 (0)
0