relational-record-0.2.2.0: Meta package of Relational Record
Copyright2014-2017 Kei Hibino
LicenseBSD3
Maintainerex8k.hibino@gmail.com
Stabilityexperimental
Portabilityunknown
Safe HaskellNone
LanguageHaskell2010

Database.Relational.Documentation

Description

This module is documentation module for relational-record. The project page of relational-record is http://khibino.github.io/haskell-relational-record/ .

Synopsis

Concepts

User interface of Relational Record has main two part of modules.

Database.Relational
Relational Query Building DSL
Database.Record and Database.HDBC.Record
Database Operation Actions

Relational Query Building DSL

Relational Query (Database.Relational) module defines Typed DSL to build complex SQL query.

Monadic Query Context Building

On building query, query structures can be accumulated in monadic context.

Monadic Operators

Some operators are defined to build query structures in monadic context.

query and queryMaybe operators grow query product of monadic context like join operation of SQL. on operator appends a new condition into recent join product condition.

groupBy operator aggregates flat record value, and can be used only in MonadAggregate context.

wheres and having operators appends a new condition into whole query condition. having only accepts aggregated record value, and can be used only in MonadRestrict Aggregated context.

distinct operator and all' operator specify SELECT DISTINCT or SELECT ALL, the last specified in monad is used.

<-# operator assigns update target column and record value to build update statement structure.

query :: (MonadQualify ConfigureQuery m, MonadQuery m) => Relation () r -> m (Record Flat r) #

queryMaybe :: (MonadQualify ConfigureQuery m, MonadQuery m) => Relation () r -> m (Record Flat (Maybe r)) #

on :: MonadQuery m => Predicate Flat -> m () #

wheres :: MonadRestrict Flat m => Predicate Flat -> m () #

groupBy :: MonadAggregate m => Record Flat r -> m (Record Aggregated r) #

having :: MonadRestrict Aggregated m => Predicate Aggregated -> m () #

distinct :: MonadQuery m => m () #

all' :: MonadQuery m => m () #

(<-#) :: forall (m :: Type -> Type) r v. Monad m => AssignTarget r v -> Record Flat v -> Assignings r m () #

Direct Join Operators

Not monadic style join is supported by some direct join operators.

inner, left, right, full operators can construct join products directly like SQL. inner operator is INNER JOIN of SQL, left operator is LEFT OUTER JOIN of SQL, and so on. on' operator specifies condition of join product. JoinRestriction is the type of lambda form which expresses condition of join product.

inner :: Relation () a -> Relation () b -> [JoinRestriction a b] -> Relation () (a, b) #

left :: Relation () a -> Relation () b -> [JoinRestriction a (Maybe b)] -> Relation () (a, Maybe b) #

right :: Relation () a -> Relation () b -> [JoinRestriction (Maybe a) b] -> Relation () (Maybe a, b) #

full :: Relation () a -> Relation () b -> [JoinRestriction (Maybe a) (Maybe b)] -> Relation () (Maybe a, Maybe b) #

on' :: ([JoinRestriction a b] -> Relation pc (a, b)) -> [JoinRestriction a b] -> Relation pc (a, b) #

type JoinRestriction a b = Record Flat a -> Record Flat b -> Predicate Flat #

Finalize Context

Several operators are defined to make Relation type with finalizing query monadic context.

relation operator finalizes flat (not aggregated) query monadic context, and aggregateRelation operator finalizes aggregated query monadic context. Both operator convert monadic context into Relation type, and finalized Relation can be reused as joining and sub-querying in another queries.

updateTarget operator finalize monadic context into UpdateTarget type which can be used as update statement.

restriction operator finalize monadic context into Restriction type which can be used as delete statement.

data Relation p r #

Instances

Instances details
Show (Relation p r) 
Instance details

Defined in Database.Relational.Monad.BaseType

Methods

showsPrec :: Int -> Relation p r -> ShowS

show :: Relation p r -> String

showList :: [Relation p r] -> ShowS

relation :: QuerySimple (Record Flat r) -> Relation () r #

aggregateRelation :: QueryAggregate (Record Aggregated r) -> Relation () r #

type UpdateTarget p r = Record Flat r -> Assign r (PlaceHolders p) #

updateTarget :: (Record Flat r -> Assign r ()) -> UpdateTarget () r #

type Restriction p r = Record Flat r -> Restrict (PlaceHolders p) #

restriction :: (Record Flat r -> Restrict ()) -> Restriction () r #

Record

SQL expression corresponds to Haskell record phantom type in this DSL.

Record Type

Record c a is projected SQL value type corresponding to Haskell record type a with context type c.

Flat is not aggregated query context type, Aggregated is aggregated query context type, OverWindow is window function context type, and so on.

Module Database.Relational.Context contains documentation of other context types.

data Record c t #

Instances

Instances details
ProjectableMaybe (Record c) 
Instance details

Defined in Database.Relational.Projectable

Methods

just :: Record c a -> Record c (Maybe a) #

flattenMaybe :: Record c (Maybe (Maybe a)) -> Record c (Maybe a) #

Show (Record c t) 
Instance details

Defined in Database.Relational.SqlSyntax.Types

Methods

showsPrec :: Int -> Record c t -> ShowS

show :: Record c t -> String

showList :: [Record c t] -> ShowS

data Flat #

data Exists #

Projection Path

! operator is record value selector using projection path type Pi r0 r1. Pi r0 r1 is projection path type selecting column type r1 from record type r0. <.> operator makes composed projection path from two projection paths. fst' and snd' are projection paths for pair type.

data Pi r0 r1 #

Instances

Instances details
ProductIsoFunctor (Pi a) 
Instance details

Defined in Database.Relational.Pi.Unsafe

Methods

(|$|) :: ProductConstructor (a0 -> b) => (a0 -> b) -> Pi a a0 -> Pi a b Source #

ProductIsoApplicative (Pi a) 
Instance details

Defined in Database.Relational.Pi.Unsafe

Methods

pureP :: ProductConstructor a0 => a0 -> Pi a a0 Source #

(|*|) :: Pi a (a0 -> b) -> Pi a a0 -> Pi a b Source #

ProductIsoEmpty (Pi a) () 
Instance details

Defined in Database.Relational.Pi.Unsafe

Methods

pureE :: Pi a () Source #

peRight :: Pi a (a0, ()) -> Pi a a0 Source #

peLeft :: Pi a ((), a0) -> Pi a a0 Source #

Category Pi 
Instance details

Defined in Database.Relational.Pi.Unsafe

Methods

id :: forall (a :: k). Pi a a

(.) :: forall (b :: k) (c :: k) (a :: k). Pi b c -> Pi a b -> Pi a c

PersistableWidth r0 => Show (Pi r0 r1) 
Instance details

Defined in Database.Relational.Pi.Unsafe

Methods

showsPrec :: Int -> Pi r0 r1 -> ShowS

show :: Pi r0 r1 -> String

showList :: [Pi r0 r1] -> ShowS

(!) :: PersistableWidth a => Record c a -> Pi a b -> Record c b #

(<.>) :: Pi a b -> Pi b c -> Pi a c #

Overloaded Projection

On newer or equal GHC 8.0, overloaded projections are supported. So you can use projections like below:

   a ! #foo .=. b ! #bar

instead of:

   a ! A.foo' .=. b ! B.bar'

Function application style is also available:

   #foo a .=. #bar b

#fst and #snd are overloaded-projection for pair type.

Record Operators

Some operators are defined to calculate record values.

For example, value operator lifts from Haskell value into Record corresponding SQL row value, which conversion is implicitly specified by ShowConstantTermsSQL class. Generic programming with default signature is available to define instances of ShowConstantTermsSQL.

values operator converts from Haskell list value into RecordList, corresponding SQL set value, .=. operator is equal compare operation of record value correspond to SQL =, .+. operator is plus operation of record value correspond to SQL +, and so on.

Module Database.Relational.Projectable contains documentation of other record operators.

type ShowConstantTermsSQL = LiteralSQL #

value :: (LiteralSQL t, OperatorContext c) => t -> Record c t #

values :: (LiteralSQL t, OperatorContext c) => [t] -> RecordList (Record c) t #

(.=.) :: OperatorContext c => Record c ft -> Record c ft -> Record c (Maybe Bool) #

(.<.) :: OperatorContext c => Record c ft -> Record c ft -> Record c (Maybe Bool) #

(.<=.) :: OperatorContext c => Record c ft -> Record c ft -> Record c (Maybe Bool) #

(.>.) :: OperatorContext c => Record c ft -> Record c ft -> Record c (Maybe Bool) #

(.>=.) :: OperatorContext c => Record c ft -> Record c ft -> Record c (Maybe Bool) #

(.<>.) :: OperatorContext c => Record c ft -> Record c ft -> Record c (Maybe Bool) #

and' :: OperatorContext c => Record c (Maybe Bool) -> Record c (Maybe Bool) -> Record c (Maybe Bool) #

or' :: OperatorContext c => Record c (Maybe Bool) -> Record c (Maybe Bool) -> Record c (Maybe Bool) #

in' :: OperatorContext c => Record c t -> RecordList (Record c) t -> Record c (Maybe Bool) #

(.||.) :: OperatorContext c => Record c a -> Record c a -> Record c a #

like :: (OperatorContext c, IsString a, LiteralSQL a) => Record c a -> a -> Record c (Maybe Bool) #

like' :: (OperatorContext c, IsString a) => Record c a -> Record c a -> Record c (Maybe Bool) #

(.+.) :: (OperatorContext c, Num a) => Record c a -> Record c a -> Record c a #

(.-.) :: (OperatorContext c, Num a) => Record c a -> Record c a -> Record c a #

(.*.) :: (OperatorContext c, Num a) => Record c a -> Record c a -> Record c a #

(./.) :: (OperatorContext c, Num a) => Record c a -> Record c a -> Record c a #

isNothing :: (OperatorContext c, HasColumnConstraint NotNull r) => Record c (Maybe r) -> Predicate c #

isJust :: (OperatorContext c, HasColumnConstraint NotNull r) => Record c (Maybe r) -> Predicate c #

fromMaybe :: (OperatorContext c, HasColumnConstraint NotNull r) => Record c r -> Record c (Maybe r) -> Record c r #

not' :: OperatorContext c => Record c (Maybe Bool) -> Record c (Maybe Bool) #

exists :: OperatorContext c => RecordList (Record Exists) r -> Record c (Maybe Bool) #

negate' :: (OperatorContext c, Num a) => Record c a -> Record c a #

fromIntegral' :: (SqlContext c, Integral a, Num b) => Record c a -> Record c b #

showNum :: (SqlContext c, Num a, IsString b) => Record c a -> Record c b #

casesOrElse :: OperatorContext c => [(Predicate c, Record c a)] -> Record c a -> Record c a #

case' :: OperatorContext c => Record c a -> [(Record c a, Record c b)] -> Record c b -> Record c b #

Aggregate and Window Functions

Typed aggregate function operators are defined. Aggregated value types is distinguished with Flat value types.

For example, sum' operator is aggregate function of flat (not aggregated) record value correspond to SQL SUM(...), rank operator is window function of record value correspond to SQL RANK(), and so on.

To convert window function result into normal record, use the over operator with built Window monad.

Module Database.Relational.Projectable contains documentation of other aggregate function operators and window function operators.

count :: (Integral b, AggregatedContext ac, SqlContext ac) => Record Flat a -> Record ac b #

sum' :: (Num a, AggregatedContext ac, SqlContext ac) => Record Flat a -> Record ac (Maybe a) #

avg :: (Num a, Fractional b, AggregatedContext ac, SqlContext ac) => Record Flat a -> Record ac (Maybe b) #

max' :: (Ord a, AggregatedContext ac, SqlContext ac) => Record Flat a -> Record ac (Maybe a) #

min' :: (Ord a, AggregatedContext ac, SqlContext ac) => Record Flat a -> Record ac (Maybe a) #

every :: (AggregatedContext ac, SqlContext ac) => Predicate Flat -> Record ac (Maybe Bool) #

any' :: (AggregatedContext ac, SqlContext ac) => Predicate Flat -> Record ac (Maybe Bool) #

some' :: (AggregatedContext ac, SqlContext ac) => Predicate Flat -> Record ac (Maybe Bool) #

over :: SqlContext c => Record OverWindow a -> Window c () -> Record c a #

rank :: Integral a => Record OverWindow a #

denseRank :: Integral a => Record OverWindow a #

rowNumber :: Integral a => Record OverWindow a #

Set Operators

Several operators are defined to manipulate relation set.

union operator makes union relation set of two relation set correspond to SQL UNION. except operator makes difference relation set of two relation set correspond to SQL EXCEPT. intersect operator makes intersection relation set of two relation set correspond to SQL INTERSECT.

union :: Relation () a -> Relation () a -> Relation () a #

except :: Relation () a -> Relation () a -> Relation () a #

intersect :: Relation () a -> Relation () a -> Relation () a #

Maybe Records

Some operators are provided to manage records with Maybe phantom type.

just operator creates Maybe typed record, flattenMaybe operator joins nested Maybe typed record.

Maybe type flavor of operators against projection path, record and aggregation are also provided.

For example, ?! operator is maybe flavor of !, <?.> operator is maybe flavor of <.>. ?!? operator and <?.?> operator join two Maybe phantom functors.

? is same as ?!, which is assumed to use with overloaded-projection like (? #foo) . ?? is same as ?!?, which is assumed to use with overloaded-projection like (?? #foo) .

?+? operator is maybe flavor of .+., negateMaybe operator is maybe flavor of negate', sumMaybe operator is maybe flavor of sum'.

Module Database.Relational.Projectable and Database.Relational.ProjectableExtended contain documentation of other Maybe flavor operators.

just :: ProjectableMaybe p => p a -> p (Maybe a) #

flattenMaybe :: ProjectableMaybe p => p (Maybe (Maybe a)) -> p (Maybe a) #

(?!) :: PersistableWidth a => Record c (Maybe a) -> Pi a b -> Record c (Maybe b) #

(?!?) :: PersistableWidth a => Record c (Maybe a) -> Pi a (Maybe b) -> Record c (Maybe b) #

(<?.>) :: Pi a (Maybe b) -> Pi b c -> Pi a (Maybe c) #

(<?.?>) :: Pi a (Maybe b) -> Pi b (Maybe c) -> Pi a (Maybe c) #

(?+?) :: (OperatorContext c, Num a) => Record c (Maybe a) -> Record c (Maybe a) -> Record c (Maybe a) #

negateMaybe :: (OperatorContext c, Num a) => Record c (Maybe a) -> Record c (Maybe a) #

sumMaybe :: (Num a, AggregatedContext ac, SqlContext ac) => Record Flat (Maybe a) -> Record ac (Maybe a) #

Placeholders

placeholders operator takes a lambda-form which argument is Record typed placeholders and its scope is restricted by that lambda-form and then creates dummy value with Placeholders typed which propagate placeholder type information into Relation layer.

Placeholders' flavor of operators against query operation and set operation are also provided, to realize type safe placeholders.

query', left', relation', updateTarget', restriction', and union' operator are placeholders' flavor query, left, relation, updateTarget, restriction and union.

Module Database.Relational.Relation and Database.Relational.Effect contains documentation of other placeholders' flavor operators.

placeholder :: (PersistableWidth t, SqlContext c, Monad m) => (Record c t -> m a) -> m (PlaceHolders t, a) #

query' :: MonadQuery m => Relation p r -> m (PlaceHolders p, Record Flat r) #

left' :: Relation pa a -> Relation pb b -> [JoinRestriction a (Maybe b)] -> Relation (pa, pb) (a, Maybe b) #

relation' :: SimpleQuery p r -> Relation p r #

updateTarget' :: (Record Flat r -> Assign r (PlaceHolders p)) -> UpdateTarget p r #

restriction' :: (Record Flat r -> Restrict (PlaceHolders p)) -> Restriction p r #

union' :: Relation p a -> Relation q a -> Relation (p, q) a #

Record Mapping

Applicative style record mapping is supported, for Record, Pi and PlaceHolders. |$| operator can be used on ProductIsoFunctor context, and |*| operator can be used on ProductIsoApplicative context with ProductConstructor, like Foo |$| record1 |*| record2 |*| record3 , Foo |$| placeholders1 |*| placeholders2 |*| placeholders3, and so on.

>< operator constructs pair result. x >< y is the same as (,) |$| x |*| y.

class ProductConstructor c Source #

Define product isomorphic inference rule to specify record constructor

Minimal complete definition

productConstructor

class ProductIsoFunctor (f :: Type -> Type) where Source #

Restricted functor on products.

Methods

(|$|) :: ProductConstructor (a -> b) => (a -> b) -> f a -> f b infixl 4 Source #

Instances

Instances details
ProductIsoFunctor (ProductConst a) 
Instance details

Defined in Database.Record.Persistable

Methods

(|$|) :: ProductConstructor (a0 -> b) => (a0 -> b) -> ProductConst a a0 -> ProductConst a b Source #

Functor f => ProductIsoFunctor (WrappedFunctor f) 
Instance details

Defined in Data.Functor.ProductIsomorphic.Instances

Methods

(|$|) :: ProductConstructor (a -> b) => (a -> b) -> WrappedFunctor f a -> WrappedFunctor f b Source #

ProductIsoFunctor (Pi a) 
Instance details

Defined in Database.Relational.Pi.Unsafe

Methods

(|$|) :: ProductConstructor (a0 -> b) => (a0 -> b) -> Pi a a0 -> Pi a b Source #

ProductIsoFunctor (WrappedAlter f a) 
Instance details

Defined in Data.Functor.ProductIsomorphic.Instances

Methods

(|$|) :: ProductConstructor (a0 -> b) => (a0 -> b) -> WrappedAlter f a a0 -> WrappedAlter f a b Source #

class ProductIsoFunctor f => ProductIsoApplicative (f :: Type -> Type) where Source #

Restricted applicative functor on products.

Methods

pureP :: ProductConstructor a => a -> f a Source #

(|*|) :: f (a -> b) -> f a -> f b infixl 4 Source #

Instances

Instances details
Monoid a => ProductIsoApplicative (ProductConst a) 
Instance details

Defined in Database.Record.Persistable

Methods

pureP :: ProductConstructor a0 => a0 -> ProductConst a a0 Source #

(|*|) :: ProductConst a (a0 -> b) -> ProductConst a a0 -> ProductConst a b Source #

Applicative f => ProductIsoApplicative (WrappedFunctor f) 
Instance details

Defined in Data.Functor.ProductIsomorphic.Instances

ProductIsoApplicative (Pi a) 
Instance details

Defined in Database.Relational.Pi.Unsafe

Methods

pureP :: ProductConstructor a0 => a0 -> Pi a a0 Source #

(|*|) :: Pi a (a0 -> b) -> Pi a a0 -> Pi a b Source #

Alternative f => ProductIsoApplicative (WrappedAlter f a) 
Instance details

Defined in Data.Functor.ProductIsomorphic.Instances

Methods

pureP :: ProductConstructor a0 => a0 -> WrappedAlter f a a0 Source #

(|*|) :: WrappedAlter f a (a0 -> b) -> WrappedAlter f a a0 -> WrappedAlter f a b Source #

(><) :: ProductIsoApplicative p => p a -> p b -> p (a, b) #

Database Statements

Some functions are defined to expand query structure into flat SQL statements to be used by database operation.

relationalQuery function converts Relation type info flat SQL query like SELECT statement.

derivedInsert function converts Pi key type info flat SQL INSERT statement.

derivedInsertValue function converts InsertTarget into flat SQL INSERT statement.

derivedInsertQuery function converts Pi key type and Relation type info flat SQL INSERT ... SELECT ... statement.

derivedUpdate function converts UpdateTarget type into flat SQL UPDATE statement.

derivedDelete function converts Restriction into flat SQL DELETE statement.

derivedKeyUpdate function converts Pi key type info flat SQL UPDATE statement.

Some functions which requires to be specified table type, typedInsert, typedInsertQuery, typedUpdate and typedDelete. These functions are useful when table type is undecidable from its statement contexts.

relationalQuery :: Relation p r -> Query p r #

typedInsert :: PersistableWidth r => Table r -> Pi r r' -> Insert r' #

typedInsertQuery :: Table r -> Pi r r' -> Relation p r' -> InsertQuery p #

typedUpdate :: Table r -> (Record Flat r -> Assign r (PlaceHolders p)) -> Update p #

typedDelete :: Table r -> (Record Flat r -> Restrict (PlaceHolders p)) -> Delete p #

typedKeyUpdate :: Table a -> Pi a p -> KeyUpdate p a #

derivedInsert :: (PersistableWidth r, TableDerivable r) => Pi r r' -> Insert r' #

derivedInsertQuery :: TableDerivable r => Pi r r' -> Relation p r' -> InsertQuery p #

derivedUpdate :: TableDerivable r => (Record Flat r -> Assign r (PlaceHolders p)) -> Update p #

derivedDelete :: TableDerivable r => (Record Flat r -> Restrict (PlaceHolders p)) -> Delete p #

Database Operations

Some HDBC actions are defined for database side effects.

Conversion interfaces to communicate with database

Some record conversion interfaces are defined to communicate with database.

The conversions are implicitly specified by FromSql class and ToSql class. Generic programming with default signature is available to define instances of FromSql and ToSql.

The explicit definitions correnponsing those classes are RecordFromSql and RecordToSql.

class FromSql q a Source #

FromSql q a is implicit rule to derive RecordFromSql q a record parser function against type a.

Generic programming (https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#generic-programming) with default signature is available for FromSql class, so you can make instance like below:

  {-# LANGUAGE DeriveGeneric #-}
  import GHC.Generics (Generic)
  import Database.HDBC (SqlValue)
  --
  data Foo = Foo { ... } deriving Generic
  instance FromSql SqlValue Foo

Instances

Instances details
FromSql q ()

Implicit derivation rule of RecordFromSql parser function object which can convert from empty list of database value type [q] into Haskell unit () type.

Instance details

Defined in Database.Record.FromSql

(HasColumnConstraint NotNull a, FromSql q a, PersistableType q) => FromSql q (Maybe a)

Implicit derivation rule of RecordFromSql parser function object which can convert from list of database value type [q] into Haskell Maybe type.

Instance details

Defined in Database.Record.FromSql

Methods

recordFromSql :: RecordFromSql q (Maybe a) Source #

class PersistableWidth a => ToSql q a Source #

ToSql q a is implicit rule to derive RecordToSql q a record printer function for type a.

Generic programming (https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#generic-programming) with default signature is available for ToSql class, so you can make instance like below:

  {-# LANGUAGE DeriveGeneric #-}
  import GHC.Generics (Generic)
  import Database.HDBC (SqlValue)
  --
  data Foo = Foo { ... } deriving Generic
  instance ToSql SqlValue Foo

To make instances of ToSql manually, ToSql q a and RecordToSql 'q a are composable with monadic context. When, you have data constructor and objects like below.

  data MyRecord = MyRecord Foo Bar Baz
  instance ToSql SqlValue Foo where
    ...
  instance ToSql SqlValue Bar where
    ...
  instance ToSql SqlValue Baz where
    ...

You can get composed ToSql implicit rule like below.

  instance ToSql SqlValue MyRecord where
    recordToSql =
    recordToSql = wrapToSql $ \ (MyRecord x y z) -> do
      putRecord x
      putRecord y
      putRecord z

Instances

Instances details
ToSql q ()

Implicit derivation rule of RecordToSql printer function object which can convert from Haskell unit () type into empty list of database value type [q].

Instance details

Defined in Database.Record.ToSql

(PersistableType q, ToSql q a) => ToSql q (Maybe a)

Implicit derivation rule of RecordToSql printer function object which can convert from Haskell Maybe type into list of database value type [q].

Instance details

Defined in Database.Record.ToSql

Methods

recordToSql :: RecordToSql q (Maybe a) Source #

data RecordFromSql q a Source #

RecordFromSql q a is data-type wrapping function to convert from list of database value type (to receive from database) [q] into Haskell type a

This structure is similar to parser. While running RecordFromSql behavior is the same as non-fail-able parser which parse list of database value type [q] stream.

So, RecordFromSql q is Monad and Applicative instance like parser monad. When, you have data constructor and objects like below.

  data MyRecord = MyRecord Foo Bar Baz
  foo :: RecordFromSql SqlValue Foo
  foo =  ...
  bar :: RecordFromSql SqlValue Bar
  bar =  ...
  baz :: RecordFromSql SqlValue Baz
  baz =  ...

You can get composed RecordFromSql like below.

  myRecord :: RecordFromSql SqlValue MyRecord
  myRecord =  MyRecord <$> foo <*> bar <*> baz

Instances

Instances details
Monad (RecordFromSql q)

Monad instance like parser Monad.

Instance details

Defined in Database.Record.FromSql

Methods

(>>=) :: RecordFromSql q a -> (a -> RecordFromSql q b) -> RecordFromSql q b

(>>) :: RecordFromSql q a -> RecordFromSql q b -> RecordFromSql q b

return :: a -> RecordFromSql q a

Functor (RecordFromSql q)

Derived Functor instance from Monad instance

Instance details

Defined in Database.Record.FromSql

Methods

fmap :: (a -> b) -> RecordFromSql q a -> RecordFromSql q b

(<$) :: a -> RecordFromSql q b -> RecordFromSql q a

Applicative (RecordFromSql q)

Derived Applicative instance from Monad instance

Instance details

Defined in Database.Record.FromSql

Methods

pure :: a -> RecordFromSql q a

(<*>) :: RecordFromSql q (a -> b) -> RecordFromSql q a -> RecordFromSql q b

liftA2 :: (a -> b -> c) -> RecordFromSql q a -> RecordFromSql q b -> RecordFromSql q c

(*>) :: RecordFromSql q a -> RecordFromSql q b -> RecordFromSql q b

(<*) :: RecordFromSql q a -> RecordFromSql q b -> RecordFromSql q a

data RecordToSql q a Source #

RecordToSql q a is data-type wrapping function to convert from Haskell type a into list of database value type (to send to database) [q].

This structure is similar to printer. While running RecordToSql behavior is the same as list printer. which appends list of database value type [q] stream.

Generalized Statement

Actions to manage generalized SQL statements.

prepareNoFetch :: (UntypeableNoFetch s, IConnection conn) => conn -> s p -> IO (PreparedStatement p ()) #

bind :: ToSql SqlValue p => PreparedStatement p a -> p -> BoundStatement a #

execute :: ToSql SqlValue p => PreparedStatement p a -> p -> IO (ExecutedStatement a) #

executeNoFetch :: ToSql SqlValue a => PreparedStatement a () -> a -> IO Integer #

Select

Actions to manage SELECT statements.

runQuery function is lazy-read and runQuery' function is strict version, please use carefully.

prepareQuery :: IConnection conn => conn -> Query p a -> IO (PreparedQuery p a) #

fetch :: FromSql SqlValue a => ExecutedStatement a -> IO (Maybe a) #

runQuery :: (IConnection conn, ToSql SqlValue p, FromSql SqlValue a) => conn -> Query p a -> p -> IO [a] #

runQuery' :: (IConnection conn, ToSql SqlValue p, FromSql SqlValue a) => conn -> Query p a -> p -> IO [a] #

Insert Values

Actions to manage INSERT ... VALUES ... statements.

prepareInsert :: IConnection conn => conn -> Insert a -> IO (PreparedInsert a) #

runInsert :: (IConnection conn, ToSql SqlValue a) => conn -> Insert a -> a -> IO Integer #

Insert Select Results

Actions to manage INSERT ... SELECT ... statements.

prepareInsertQuery :: IConnection conn => conn -> InsertQuery p -> IO (PreparedInsertQuery p) #

runInsertQuery :: (IConnection conn, ToSql SqlValue p) => conn -> InsertQuery p -> p -> IO Integer #

Update

Actions to manage UPDATE statements.

prepareUpdate :: IConnection conn => conn -> Update p -> IO (PreparedUpdate p) #

runUpdate :: (IConnection conn, ToSql SqlValue p) => conn -> Update p -> p -> IO Integer #

Delete

Actions to manage DELETE statements.

prepareDelete :: IConnection conn => conn -> Delete p -> IO (PreparedDelete p) #

runDelete :: (IConnection conn, ToSql SqlValue p) => conn -> Delete p -> p -> IO Integer #

Update by Key

Actions to manage UPDATE statements which updates columns other than specified key of the records selected by specified key.

prepareKeyUpdate :: IConnection conn => conn -> KeyUpdate p a -> IO (PreparedKeyUpdate p a) #

bindKeyUpdate :: ToSql SqlValue a => PreparedKeyUpdate p a -> a -> BoundStatement () #

runKeyUpdate :: (IConnection conn, ToSql SqlValue a) => conn -> KeyUpdate p a -> a -> IO Integer #