MySQL: Initial connection and corresponding types

https://github.com/hasura/graphql-engine-mono/pull/1517

Co-authored-by: Sibi Prabakaran <737477+psibi@users.noreply.github.com>
Co-authored-by: Chris Done <11019+chrisdone@users.noreply.github.com>
Co-authored-by: Abby Sassel <3883855+sassela@users.noreply.github.com>
GitOrigin-RevId: e0f61664b33d8ca50f223ec7fb76c66940eabc89
This commit is contained in:
Aniket Deshpande 2021-07-13 19:02:15 +05:30 committed by hasura-bot
parent d8fa32776b
commit 921bdf709b
3 changed files with 83 additions and 0 deletions

View File

@ -393,6 +393,9 @@ library
, Hasura.Backends.Postgres.Types.Table
, Hasura.Backends.Postgres.Types.CitusExtraTableMetadata
, Hasura.Backends.MySQL.Types
, Hasura.Backends.MySQL.Connection
-- Exposed for benchmark:
, Hasura.Cache.Bounded
, Hasura.Logging

View File

@ -0,0 +1,26 @@
module Hasura.Backends.MySQL.Connection where
import Data.Pool (createPool)
import qualified Data.Text as T
import Database.MySQL.Base
import Hasura.Backends.MySQL.Types
import Hasura.Base.Error
import Hasura.Prelude
import Hasura.RQL.Types.Common
resolveSourceConfig :: (MonadIO m) =>
SourceName -> ConnSourceConfig -> m (Either QErr SourceConfig)
resolveSourceConfig _name csc@ConnSourceConfig{..} =
let connectInfo =
defaultConnectInfo
{ connectHost = T.unpack _cscHost
, connectPort = _cscPort
, connectUser = T.unpack _cscUser
, connectPassword = T.unpack _cscPassword
, connectDatabase = T.unpack _cscDatabase
}
in runExceptT $
SourceConfig csc <$>
liftIO (createPool (connect connectInfo) close 1 (60 {-seconds-} * 60 {-minutes-}) 1)

View File

@ -0,0 +1,54 @@
{-# LANGUAGE DeriveAnyClass #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Hasura.Backends.MySQL.Types where
import qualified Data.Aeson as J
import qualified Data.Aeson.Casing as J
import qualified Data.Aeson.TH as J
import Data.Hashable
import Data.Pool
import Data.Word (Word16)
import Database.MySQL.Base
import Hasura.Incremental.Internal.Dependency (Cacheable (..))
import Hasura.Prelude
import System.IO.Unsafe (unsafePerformIO)
-- | Partial of Database.MySQL.Simple.ConnectInfo
data ConnSourceConfig
= ConnSourceConfig
{ _cscHost :: !Text -- ^ Works with @127.0.0.1@ but not with @localhost@ for some reason
, _cscPort :: !Word16
, _cscUser :: !Text
, _cscPassword :: !Text
, _cscDatabase :: !Text
} deriving (Eq, Show, NFData, Generic, Hashable)
$(J.deriveJSON (J.aesonDrop 4 J.snakeCase) {J.omitNothingFields = False} ''ConnSourceConfig)
instance Arbitrary ConnSourceConfig where
arbitrary = genericArbitrary
instance Cacheable Word16 where
unchanged _ = (==)
deriving instance Cacheable ConnSourceConfig
data SourceConfig
= SourceConfig
{ scConfig :: !ConnSourceConfig
, scConnectionPool :: !(Pool Connection)
} deriving (Eq, Generic, J.ToJSON)
instance Arbitrary SourceConfig where
arbitrary = genericArbitrary
instance J.ToJSON (Pool Connection) where
toJSON = const (J.String "_REDACTED_")
instance Eq (Pool Connection) where
_ == _ = True
instance Arbitrary (Pool Connection) where
arbitrary = pure . unsafePerformIO $
createPool (connect defaultConnectInfo) close 1 (60 {-seconds-} * 60 {-minutes-}) 1
instance Cacheable SourceConfig where
unchanged _ = (==)