@@ -9,6 +9,7 @@ module Database.PostgreSQL.Connection where
9
9
10
10
11
11
import qualified Data.ByteString as B
12
+ import qualified Data.ByteString.Char8 as BS (pack )
12
13
import Data.ByteString.Lazy (toStrict )
13
14
import Data.ByteString.Builder (Builder , toLazyByteString )
14
15
import Control.Monad
@@ -72,29 +73,60 @@ data RawConnection = RawConnection
72
73
, rReceive :: Int -> IO B. ByteString
73
74
}
74
75
76
+ defaultUnixPathDirectory :: B. ByteString
77
+ defaultUnixPathDirectory = " /var/run/postgresql"
78
+
79
+ unixPathFilename :: B. ByteString
80
+ unixPathFilename = " .s.PGSQL."
81
+
75
82
address :: SocketAddress Unix
76
83
address = fromJust $ socketAddressUnixPath " /var/run/postgresql/.s.PGSQL.5432"
77
84
78
- connect :: ConnectionSettings -> IO Connection
79
- connect settings = do
80
- s <- socket
85
+ createRawConnection :: ConnectionSettings -> IO RawConnection
86
+ createRawConnection settings = do
87
+ (s, address) <- createSocket settings
81
88
Socket. connect s address
82
- sendStartMessage s $ consStartupMessage settings
83
- r <- Socket. receive s 4096 mempty
89
+ pure $ constructRawConnection s
90
+ where
91
+ createSocket settings
92
+ | host == " " = unixSocket defaultUnixPathDirectory
93
+ | " /" `B.isPrefixOf` host = unixSocket host
94
+ | otherwise = tcpSocket
95
+ where
96
+ host = settingsHost settings
97
+ unixSocket dirPath = do
98
+ -- 47 - `/`
99
+ let dir = B. reverse . B. dropWhile (== 47 ) $ B. reverse dirPath
100
+ path = dir <> " /" <> unixPathFilename
101
+ <> BS. pack (show $ settingsPort settings)
102
+ -- TODO check for Nothing
103
+ address = fromJust $ socketAddressUnixPath path
104
+ s <- socket :: IO (Socket Unix Stream Unix )
105
+ pure (s, address)
106
+ tcpSocket = do
107
+ undefined
108
+
109
+ constructRawConnection :: Socket f t p -> RawConnection
110
+ constructRawConnection s = RawConnection
111
+ { rFlush = pure ()
112
+ , rClose = Socket. close s
113
+ , rSend = \ msg -> void $ Socket. send s msg mempty
114
+ , rReceive = \ n -> Socket. receive s n mempty
115
+ }
116
+
117
+ connect :: ConnectionSettings -> IO Connection
118
+ connect settings = do
119
+ rawConn <- createRawConnection settings
120
+ sendStartMessage rawConn $ consStartupMessage settings
121
+ r <- rReceive rawConn 4096
84
122
readAuthMessage r
85
123
86
124
(inDataChan, outDataChan) <- newChan
87
125
(inAllChan, outAllChan) <- newChan
88
- let rawConnection = RawConnection
89
- { rFlush = pure ()
90
- , rClose = Socket. close s
91
- , rSend = \ msg -> void $ Socket. send s msg mempty
92
- , rReceive = \ n -> Socket. receive s n mempty
93
- }
94
- tid <- forkIO $ receiverThread rawConnection inDataChan inAllChan
126
+ tid <- forkIO $ receiverThread rawConn inDataChan inAllChan
95
127
storage <- newStatementStorage
96
128
pure Connection
97
- { connRawConnection = rawConnection
129
+ { connRawConnection = rawConn
98
130
, connReceiverThread = tid
99
131
, connOutDataChan = outDataChan
100
132
, connOutAllChan = outAllChan
@@ -115,10 +147,10 @@ consStartupMessage :: ConnectionSettings -> StartMessage
115
147
consStartupMessage stg = StartupMessage
116
148
(Username $ settingsUser stg) (DatabaseName $ settingsDatabase stg)
117
149
118
- sendStartMessage :: UnixSocket -> StartMessage -> IO ()
119
- sendStartMessage sock msg = void $ do
150
+ sendStartMessage :: RawConnection -> StartMessage -> IO ()
151
+ sendStartMessage rawConn msg = void $ do
120
152
let smsg = toStrict . toLazyByteString $ encodeStartMessage msg
121
- Socket. send sock smsg mempty
153
+ rSend rawConn smsg
122
154
123
155
sendMessage :: RawConnection -> ClientMessage -> IO ()
124
156
sendMessage rawConn msg = void $ do
0 commit comments