graphql-engine/server/src-lib/Hasura/Backends/MySQL/SQL.hs
Robert 11a454c2d6 server, pro: actually reformat the code-base using ormolu
This commit applies ormolu to the whole Haskell code base by running `make format`.

For in-flight branches, simply merging changes from `main` will result in merge conflicts.
To avoid this, update your branch using the following instructions. Replace `<format-commit>`
by the hash of *this* commit.

$ git checkout my-feature-branch
$ git merge <format-commit>^    # and resolve conflicts normally
$ make format
$ git commit -a -m "reformat with ormolu"
$ git merge -s ours post-ormolu

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

GitOrigin-RevId: 75049f5c12f430c615eafb4c6b8e83e371e01c8e
2021-09-23 22:57:37 +00:00

47 lines
1.5 KiB
Haskell

module Hasura.Backends.MySQL.SQL
( runSQL,
RunSQL (..),
)
where
import Data.Aeson qualified as J
import Data.Aeson.TH
import Data.ByteString hiding (null, reverse)
import Data.Pool (withResource)
import Data.String (fromString)
import Data.Text qualified as T
import Data.Text.Encoding (decodeUtf8With)
import Data.Text.Encoding.Error (lenientDecode)
import Database.MySQL.Base (fetchFields, query, storeResult)
import Database.MySQL.Base.Types (Field (fieldName))
import Hasura.Backends.MySQL.Connection (fetchAllRows)
import Hasura.Backends.MySQL.Types (SourceConfig (..))
import Hasura.Base.Error
import Hasura.EncJSON
import Hasura.Prelude
import Hasura.RQL.DDL.Schema (RunSQLRes (..))
import Hasura.RQL.Types
data RunSQL = RunSQL
{ _Sql :: !Text,
_Source :: !SourceName
}
deriving (Show, Eq)
$(deriveJSON hasuraJSON ''RunSQL)
runSQL :: (MonadIO m, CacheRWM m, MonadError QErr m, MetadataM m) => RunSQL -> m EncJSON
runSQL (RunSQL sql source) = do
pool <- scConnectionPool <$> askSourceConfig @'MySQL source
result :: [[Maybe ByteString]] <- liftIO $
withResource pool $ \conn -> do
query conn (fromString . T.unpack $ sql)
r <- storeResult conn
fieldNames <- fmap (Just . fieldName) <$> fetchFields r -- fieldNames as Maybes for convenience
rows <- fetchAllRows r
pure (fieldNames : rows)
pure . encJFromJValue $
if null result
then RunSQLRes "CommandOK" J.Null
else RunSQLRes "TuplesOk" . J.toJSON . (fmap . fmap . fmap) (decodeUtf8With lenientDecode) $ result