generic-persistence-0.6.0: Database persistence using generics
Safe HaskellSafe-Inferred
LanguageGHC2021

Database.GP.Entity

Synopsis

Documentation

class (Generic a, HasConstructor (Rep a), HasSelectors (Rep a)) => Entity a where Source #

This is the Entity class. It is a type class that is used to define the mapping between a Haskell product type in record notation and a database table. The class has a default implementation for all methods. The default implementation uses the type information to determine a simple 1:1 mapping.

That means that - the type name is used as the table name and the - field names are used as the column names. - A field named 'typeNameID' is used as the primary key field.

The default implementation can be overridden by defining a custom instance for a type.

Please note the following constraints, which apply to all valid Entity type, but that are not explicitely encoded in the type class definition:

  • The type must be a product type in record notation.
  • The type must have exactly one constructor.
  • There must be single primary key field, compund primary keys are not supported.

Minimal complete definition

Nothing

Methods

fromRow :: Conn -> [SqlValue] -> IO a Source #

Converts a database row to a value of type a.

default fromRow :: GFromRow (Rep a) => Conn -> [SqlValue] -> IO a Source #

toRow :: Conn -> a -> IO [SqlValue] Source #

Converts a value of type a to a database row.

default toRow :: GToRow (Rep a) => Conn -> a -> IO [SqlValue] Source #

idField :: String Source #

Returns the name of the primary key field for a type a.

default idField :: String Source #

fieldsToColumns :: [(String, String)] Source #

Returns a list of tuples that map field names to column names for a type a.

tableName :: String Source #

Returns the name of the table for a type a.

autoIncrement :: Bool Source #

Returns True if the primary key field for a type a is autoincremented by the database.

columnNameFor :: forall a. Entity a => String -> String Source #

A convenience function: returns the name of the column for a field of a type a.

gtoRow :: GToRow f => f a -> [SqlValue] Source #

class GToRow f Source #

Minimal complete definition

gtoRow

Instances

Instances details
(GToRow a, GToRow b) => GToRow (a :*: b :: k -> Type) Source # 
Instance details

Defined in Database.GP.Entity

Methods

gtoRow :: forall (a0 :: k0). (a :*: b) a0 -> [SqlValue] Source #

Convertible a SqlValue => GToRow (K1 i a :: k -> Type) Source # 
Instance details

Defined in Database.GP.Entity

Methods

gtoRow :: forall (a0 :: k0). K1 i a a0 -> [SqlValue] Source #

GToRow a => GToRow (M1 i c a :: k -> Type) Source # 
Instance details

Defined in Database.GP.Entity

Methods

gtoRow :: forall (a0 :: k0). M1 i c a a0 -> [SqlValue] Source #

class GFromRow f Source #

Minimal complete definition

gfromRow

Instances

Instances details
(KnownNat (NumFields f), GFromRow f, GFromRow g) => GFromRow (f :*: g :: Type -> Type) Source #

This instance is the most interesting one. It splits the list of SqlValues into two parts, one for the first field and one for the rest. Then it uses the GFromRow instance for the first field to convert the first part of the list and the GFromRow instance for the rest of the fields to convert the second part of the list. Finally, it combines the two results using the :*: constructor. https://stackoverflow.com/questions/75485429/how-to-use-ghc-generics-to-convert-from-product-data-types-to-a-list-of-sqlvalue/75485650#75485650

Instance details

Defined in Database.GP.Entity

Methods

gfromRow :: forall (a :: k). [SqlValue] -> (f :*: g) a

Convertible SqlValue a => GFromRow (K1 i a :: k -> Type) Source # 
Instance details

Defined in Database.GP.Entity

Methods

gfromRow :: forall (a0 :: k0). [SqlValue] -> K1 i a a0

GFromRow a => GFromRow (M1 i c a :: k -> Type) Source # 
Instance details

Defined in Database.GP.Entity

Methods

gfromRow :: forall (a0 :: k0). [SqlValue] -> M1 i c a a0

data Conn Source #

This module defines a wrapper around an HDBC IConnection. Using this wrapper Conn simplifies the signature of the functions in the GP module. It allows to use any HDBC connection without having to define a new function for each connection type. It also provides additional attributes to the connection, like the database type and the implicit commit flag. These attributes can be used to implement database specific functionality, modify transaction behaviour, etc.

This code has been inspired by the HDBC ConnectionWrapper and some parts have been copied verbatim from the HDBC Database.HDBC.Types module.

This module also defines a ConnectionPool type, which provides basic connection pooling functionality.

A wrapper around an HDBC IConnection.

Constructors

forall conn.IConnection conn => Conn 

Fields

  • implicitCommit :: Bool

    If True, the GenericPersistence functions will commit the transaction after each operation.

  • connection :: conn

    The wrapped connection

Instances

Instances details
IConnection Conn Source #

manually implement the IConnection type class for the Conn type.

Instance details

Defined in Database.GP.Conn

maybeIdFieldIndex :: forall a. Entity a => Maybe Int Source #

Returns Just index of the primary key field for a type a. if the type has no primary key field, Nothing is returned.

fieldIndex :: forall a. Entity a => String -> Int Source #

returns the index of a field of an entity. The index is the position of the field in the list of fields of the entity. If no such field exists, an error is thrown. The function takes an field name as parameters, the type of the entity is determined by the context.