diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..8cf5bc1b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Revision history for databases + +## 0.1.0.0 -- YYYY-mm-dd + +* First version. Released on an unsuspecting world. diff --git a/app/Main.hs b/app/Main.hs new file mode 100644 index 00000000..7eaae131 --- /dev/null +++ b/app/Main.hs @@ -0,0 +1,51 @@ +{-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE OverloadedStrings #-} + +module Main where + +import System.Environment +import System.IO +import Text.Read hiding (lift) +import Control.Monad +import Control.Monad.Trans.Maybe +import Control.Monad.Trans.Class +import Data.String.Interpolate + +import Network.Wai +import Network.HTTP.Types (status200) +import Network.Wai.Handler.Warp (run) +import Data.Binary.Builder +import Data.ByteString (ByteString) +import Queries + +type Args = Int -- for now + +printError :: String -> IO () +printError = hPutStrLn stderr + +response200 :: ByteString -> Response +response200 = responseBuilder status200 [("Content-Type", "text/plain")] . fromByteString + +argsParse' :: MaybeT IO Args +argsParse' = do + args <- lift getArgs + guard $ length args == 1 + port <- hoistMaybe $ readMaybe $ head args + guard $ port > 0 + guard $ port < 65535 + hoistMaybe $ Just port + +app :: Application +app req respond = do -- the points req and respond will probably be used later + results <- runTestQuery + respond $ response200 [i|The output is: #{results}|] + +main :: IO () +main = do + arguments <- runMaybeT argsParse' + case arguments of + Just port -> do + putStrLn [i|Running on port #{port}.|] + run port app + Nothing -> printError "Invalid input for port number." + diff --git a/app/Queries.hs b/app/Queries.hs new file mode 100644 index 00000000..f9002fe2 --- /dev/null +++ b/app/Queries.hs @@ -0,0 +1,33 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Queries (runTestQuery) where + +import Database.MySQL.Simple +import Data.ByteString +import Data.ByteString.Char8 as B +import System.Environment + +connectDB :: IO Connection +connectDB = do + host <- getEnv "DB_HOST" + user <- getEnv "DB_USER" + passwd <- getEnv "DB_PASSWORD" + database <- getEnv "DB_DATABASE" + connect defaultConnectInfo { + connectHost = host, + connectUser = user, + connectPassword = passwd, + connectDatabase = database + } + +runTestQuery :: IO ByteString +runTestQuery = do + c <- connectDB + execute_ c "DROP TABLE IF EXISTS diagnostic" -- we don't really care what these queries output + execute_ c "CREATE TABLE diagnostic(id INT PRIMARY KEY, text VARCHAR(255) NOT NULL)" + execute_ c "INSERT INTO diagnostic (id, text) VALUES (1, 'MySQL is working')" + rows <- query_ c "SELECT * FROM diagnostic" :: IO [(Int, String)] + return $ B.pack $ show rows + + + diff --git a/databases.cabal b/databases.cabal new file mode 100644 index 00000000..119db26c --- /dev/null +++ b/databases.cabal @@ -0,0 +1,73 @@ +cabal-version: 3.0 +-- The cabal-version field refers to the version of the .cabal specification, +-- and can be different from the cabal-install (the tool) version and the +-- Cabal (the library) version you are using. As such, the Cabal (the library) +-- version used must be equal or greater than the version stated in this field. +-- Starting from the specification version 2.2, the cabal-version field must be +-- the first thing in the cabal file. + +-- Initial package description 'databases' generated by +-- 'cabal init'. For further documentation, see: +-- http://haskell.org/cabal/users-guide/ +-- +-- The name of the package. +name: databases + +-- The package version. +-- See the Haskell package versioning policy (PVP) for standards +-- guiding when and how versions should be incremented. +-- https://pvp.haskell.org +-- PVP summary: +-+------- breaking API changes +-- | | +----- non-breaking API additions +-- | | | +--- code changes with no API change +version: 0.1.0.0 + +-- A short (one-line) description of the package. +-- synopsis: + +-- A longer description of the package. +-- description: + +-- The license under which the package is released. +license: NONE + +-- The package author(s). +author: Robert + +-- An email address to which users can send suggestions, bug reports, and patches. +maintainer: 6243646+robert0004@users.noreply.github.com + +-- A copyright notice. +-- copyright: +build-type: Simple + +-- Extra doc files to be distributed with the package, such as a CHANGELOG or a README. +extra-doc-files: CHANGELOG.md + +-- Extra source files to be distributed with the package, such as examples, or a tutorial module. +-- extra-source-files: + +common warnings + ghc-options: -Wall + +executable databases + -- Import common warning flags. + import: warnings + + -- .hs or .lhs file containing the Main module. + main-is: Main.hs + + -- Modules included in this executable, other than Main. + other-modules: Queries + + -- LANGUAGE extensions used by modules in this package. + -- other-extensions: + + -- Other library packages from which modules are imported. + build-depends: base ^>=4.18.0.0, string-interpolate, warp, transformers, wai, http-types, binary, bytestring, mysql-simple, aeson + + -- Directories containing source files. + hs-source-dirs: app + + -- Base language which the package is written in. + default-language: Haskell2010