-- |
-- Module      : Database.Custom.Oracle
-- Copyright   : 2019 Kei Hibino
-- License     : BSD3
--
-- Maintainer  : ex8k.hibino@gmail.com
-- Stability   : experimental
-- Portability : unknown
--
-- This module provides custom APIs with appropriate configuration
-- for Oracle.
module Database.Custom.Oracle (
  module Database.Relational,

  relationalQuery,

  insertValue, insertValueNoPH, insertQuery,
  update, updateNoPH,
  delete, deleteNoPH,
  ) where

import Language.SQL.Keyword (Keyword)
import Database.Relational.Schema.Oracle.Config (config)
import Database.Relational hiding
  (relationalQuery,
   insertValue, insertValueNoPH, insertQuery,
   update, updateNoPH,
   delete, deleteNoPH, )

-- | From 'Relation' into typed 'Query' with suffix SQL words.
relationalQuery :: Relation p r  -- ^ relation to finalize building
                -> [Keyword]     -- ^ suffix SQL words. for example, `[FOR, UPDATE]`, `[FETCH, FIRST, "3", ROWS, ONLY]` ...
                -> Query p r     -- ^ finalized query
relationalQuery :: Relation p r -> [Keyword] -> Query p r
relationalQuery = Config -> Relation p r -> [Keyword] -> Query p r
forall p r. Config -> Relation p r -> [Keyword] -> Query p r
relationalQuery_ Config
config

-- | Make 'Insert' from derived table and monadic builded 'Register' object.
insertValue :: TableDerivable r
            => Register r (PlaceHolders p)
            -> Insert p
insertValue :: Register r (PlaceHolders p) -> Insert p
insertValue = Config -> Register r (PlaceHolders p) -> Insert p
forall r p.
TableDerivable r =>
Config -> Register r (PlaceHolders p) -> Insert p
insertValue' Config
config

-- | Make 'Insert' from derived table and monadic builded 'Register' object with no(unit) placeholder.
insertValueNoPH :: TableDerivable r
                => Register r ()
                -> Insert ()
insertValueNoPH :: Register r () -> Insert ()
insertValueNoPH body :: Register r ()
body = Register r (PlaceHolders ()) -> Insert ()
forall r p.
TableDerivable r =>
Register r (PlaceHolders p) -> Insert p
insertValue (Register r (PlaceHolders ()) -> Insert ())
-> Register r (PlaceHolders ()) -> Insert ()
forall a b. (a -> b) -> a -> b
$ Register r ()
body Register r ()
-> Register r (PlaceHolders ()) -> Register r (PlaceHolders ())
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> PlaceHolders () -> Register r (PlaceHolders ())
forall (m :: * -> *) a. Monad m => a -> m a
return PlaceHolders ()
unitPH

-- | Make 'InsertQuery' from derived table, 'Pi' and 'Relation'.
insertQuery :: TableDerivable r => Pi r r' -> Relation p r' -> InsertQuery p
insertQuery :: Pi r r' -> Relation p r' -> InsertQuery p
insertQuery = Config -> Pi r r' -> Relation p r' -> InsertQuery p
forall r r' p.
TableDerivable r =>
Config -> Pi r r' -> Relation p r' -> InsertQuery p
insertQuery' Config
config

-- | Make 'Update' from derived table and 'Assign' computation.
update :: TableDerivable r
       => (Record Flat r -> Assign r (PlaceHolders p))
       -> Update p
update :: (Record Flat r -> Assign r (PlaceHolders p)) -> Update p
update = Config -> (Record Flat r -> Assign r (PlaceHolders p)) -> Update p
forall r p.
TableDerivable r =>
Config -> (Record Flat r -> Assign r (PlaceHolders p)) -> Update p
update' Config
config

-- | Make 'Update' from derived table and 'Assign' computation with no(unit) placeholder.
updateNoPH :: TableDerivable r
           => (Record Flat r -> Assign r ())
           -> Update ()
updateNoPH :: (Record Flat r -> Assign r ()) -> Update ()
updateNoPH body :: Record Flat r -> Assign r ()
body = (Record Flat r -> Assign r (PlaceHolders ())) -> Update ()
forall r p.
TableDerivable r =>
(Record Flat r -> Assign r (PlaceHolders p)) -> Update p
update ((Record Flat r -> Assign r (PlaceHolders ())) -> Update ())
-> (Record Flat r -> Assign r (PlaceHolders ())) -> Update ()
forall a b. (a -> b) -> a -> b
$ (Assign r ()
-> Assign r (PlaceHolders ()) -> Assign r (PlaceHolders ())
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> PlaceHolders () -> Assign r (PlaceHolders ())
forall (m :: * -> *) a. Monad m => a -> m a
return PlaceHolders ()
unitPH) (Assign r () -> Assign r (PlaceHolders ()))
-> (Record Flat r -> Assign r ())
-> Record Flat r
-> Assign r (PlaceHolders ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Record Flat r -> Assign r ()
body

-- | Make 'Delete' from derived table and 'Restrict' computation.
delete :: TableDerivable r
       => (Record Flat r -> Restrict (PlaceHolders p))
       -> Delete p
delete :: (Record Flat r -> Restrict (PlaceHolders p)) -> Delete p
delete = Config -> (Record Flat r -> Restrict (PlaceHolders p)) -> Delete p
forall r p.
TableDerivable r =>
Config -> (Record Flat r -> Restrict (PlaceHolders p)) -> Delete p
delete' Config
config

-- | Make 'Delete' from 'defaultConfig', derived table and 'Restrict' computation with no(unit) placeholder.
deleteNoPH :: TableDerivable r
           => (Record Flat r -> Restrict ())
           -> Delete ()
deleteNoPH :: (Record Flat r -> Restrict ()) -> Delete ()
deleteNoPH body :: Record Flat r -> Restrict ()
body = (Record Flat r -> Restrict (PlaceHolders ())) -> Delete ()
forall r p.
TableDerivable r =>
(Record Flat r -> Restrict (PlaceHolders p)) -> Delete p
delete ((Record Flat r -> Restrict (PlaceHolders ())) -> Delete ())
-> (Record Flat r -> Restrict (PlaceHolders ())) -> Delete ()
forall a b. (a -> b) -> a -> b
$ (Restrict ()
-> Restrict (PlaceHolders ()) -> Restrict (PlaceHolders ())
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> PlaceHolders () -> Restrict (PlaceHolders ())
forall (m :: * -> *) a. Monad m => a -> m a
return PlaceHolders ()
unitPH) (Restrict () -> Restrict (PlaceHolders ()))
-> (Record Flat r -> Restrict ())
-> Record Flat r
-> Restrict (PlaceHolders ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Record Flat r -> Restrict ()
body