hasql-1.3.0.5: An efficient PostgreSQL driver and a flexible mapping API

Safe HaskellNone
LanguageHaskell2010

Hasql.Encoders

Contents

Description

A DSL for declaration of query parameter encoders.

Synopsis

Params

data Params a Source #

Encoder of some representation of the parameters product.

Has instances of Contravariant, Divisible and Monoid, which you can use to compose multiple parameters together. E.g.,

someParamsEncoder :: Params (Int64, Maybe Text)
someParamsEncoder =
  contramap fst (param int8) <>
  contramap snd (nullableParam text)

As a general solution for tuples of any arity, instead of fst and snd, consider the functions of the contrazip family from the "contravariant-extras" package. E.g., here's how you can achieve the same as the above:

someParamsEncoder :: Params (Int64, Maybe Text)
someParamsEncoder =
  contrazip2 (param int8) (nullableParam text)

Here's how you can implement encoders for custom composite types:

data Person =
  Person { name :: Text, gender :: Gender, age :: Int }

data Gender =
  Male | Female

personParams :: Params Person
personParams =
  contramap name (param text) <>
  contramap gender (param genderValue) <>
  contramap (fromIntegral . age) (param int8)

genderValue :: Value Gender
genderValue =
  contramap genderText text
  where
    genderText gender =
      case gender of
        Male -> "male"
        Female -> "female"
Instances
Contravariant Params Source # 
Instance details

Defined in Hasql.Encoders

Methods

contramap :: (a -> b) -> Params b -> Params a #

(>$) :: b -> Params b -> Params a #

Divisible Params Source # 
Instance details

Defined in Hasql.Encoders

Methods

divide :: (a -> (b, c)) -> Params b -> Params c -> Params a #

conquer :: Params a #

Decidable Params Source # 
Instance details

Defined in Hasql.Encoders

Methods

lose :: (a -> Void) -> Params a #

choose :: (a -> Either b c) -> Params b -> Params c -> Params a #

Semigroup (Params a) Source # 
Instance details

Defined in Hasql.Encoders

Methods

(<>) :: Params a -> Params a -> Params a #

sconcat :: NonEmpty (Params a) -> Params a #

stimes :: Integral b => b -> Params a -> Params a #

Monoid (Params a) Source # 
Instance details

Defined in Hasql.Encoders

Methods

mempty :: Params a #

mappend :: Params a -> Params a -> Params a #

mconcat :: [Params a] -> Params a #

Default (Params ()) Source #

Maps to unit.

Instance details

Defined in Hasql.Encoders

Methods

def :: Params () #

(Default (Value a1), Default (Value a2)) => Default (Params (a1, a2)) Source # 
Instance details

Defined in Hasql.Encoders

Methods

def :: Params (a1, a2) #

(Default (Value a1), Default (Value a2), Default (Value a3)) => Default (Params (a1, a2, a3)) Source # 
Instance details

Defined in Hasql.Encoders

Methods

def :: Params (a1, a2, a3) #

(Default (Value a1), Default (Value a2), Default (Value a3), Default (Value a4)) => Default (Params (a1, a2, a3, a4)) Source # 
Instance details

Defined in Hasql.Encoders

Methods

def :: Params (a1, a2, a3, a4) #

(Default (Value a1), Default (Value a2), Default (Value a3), Default (Value a4), Default (Value a5)) => Default (Params (a1, a2, a3, a4, a5)) Source # 
Instance details

Defined in Hasql.Encoders

Methods

def :: Params (a1, a2, a3, a4, a5) #

Default (Value a) => Default (Params (Identity a)) Source # 
Instance details

Defined in Hasql.Encoders

Methods

def :: Params (Identity a) #

unit :: Params () Source #

Encode no parameters.

param :: Value a -> Params a Source #

Lift an individual value encoder to a parameters encoder.

nullableParam :: Value a -> Params (Maybe a) Source #

Lift an individual nullable value encoder to a parameters encoder.

Value

data Value a Source #

An individual value encoder. Will be mapped to a single placeholder in the query.

Instances
Contravariant Value Source # 
Instance details

Defined in Hasql.Encoders

Methods

contramap :: (a -> b) -> Value b -> Value a #

(>$) :: b -> Value b -> Value a #

Default (Value Bool) Source #

Maps to bool.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value Bool #

Default (Value Char) Source #

Maps to char.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value Char #

Default (Value Double) Source #

Maps to float8.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value Double #

Default (Value Float) Source #

Maps to float4.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value Float #

Default (Value Int16) Source #

Maps to int2.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value Int16 #

Default (Value Int32) Source #

Maps to int4.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value Int32 #

Default (Value Int64) Source #

Maps to int8.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value Int64 #

Default (Value (TimeOfDay, TimeZone)) Source #

Maps to timetz.

Instance details

Defined in Hasql.Encoders

Default (Value ByteString) Source #

Maps to bytea.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value ByteString #

Default (Value Scientific) Source #

Maps to numeric.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value Scientific #

Default (Value Text) Source #

Maps to text.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value Text #

Default (Value UTCTime) Source #

Maps to timestamptz.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value UTCTime #

Default (Value Value) Source #

Maps to json.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value Value0 #

Default (Value UUID) Source #

Maps to uuid.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value UUID #

Default (Value Day) Source #

Maps to date.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value Day #

Default (Value DiffTime) Source #

Maps to interval.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value DiffTime #

Default (Value TimeOfDay) Source #

Maps to time.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value TimeOfDay #

Default (Value LocalTime) Source #

Maps to timestamp.

Instance details

Defined in Hasql.Encoders

Methods

def :: Value LocalTime #

bool :: Value Bool Source #

Encoder of BOOL values.

int2 :: Value Int16 Source #

Encoder of INT2 values.

int4 :: Value Int32 Source #

Encoder of INT4 values.

int8 :: Value Int64 Source #

Encoder of INT8 values.

float4 :: Value Float Source #

Encoder of FLOAT4 values.

float8 :: Value Double Source #

Encoder of FLOAT8 values.

numeric :: Value Scientific Source #

Encoder of NUMERIC values.

char :: Value Char Source #

Encoder of CHAR values. Note that it supports UTF-8 values and identifies itself under the TEXT OID because of that.

text :: Value Text Source #

Encoder of TEXT values.

bytea :: Value ByteString Source #

Encoder of BYTEA values.

date :: Value Day Source #

Encoder of DATE values.

timestamp :: Value LocalTime Source #

Encoder of TIMESTAMP values.

timestamptz :: Value UTCTime Source #

Encoder of TIMESTAMPTZ values.

time :: Value TimeOfDay Source #

Encoder of TIME values.

timetz :: Value (TimeOfDay, TimeZone) Source #

Encoder of TIMETZ values.

interval :: Value DiffTime Source #

Encoder of INTERVAL values.

uuid :: Value UUID Source #

Encoder of UUID values.

inet :: Value (NetAddr IP) Source #

Encoder of INET values.

json :: Value Value Source #

Encoder of JSON values from JSON AST.

jsonBytes :: Value ByteString Source #

Encoder of JSON values from raw JSON.

jsonb :: Value Value Source #

Encoder of JSONB values from JSON AST.

jsonbBytes :: Value ByteString Source #

Encoder of JSONB values from raw JSON.

array :: Array a -> Value a Source #

Unlifts the Array encoder to the plain Value encoder.

enum :: (a -> Text) -> Value a Source #

Given a function, which maps the value into the textual enum label from the DB side, produces a encoder of that value.

unknown :: Value ByteString Source #

Identifies the value with the PostgreSQL's "unknown" type, thus leaving it up to Postgres to infer the actual type of the value.

The value transimitted is any value encoded in the Postgres' Text data format. For reference, see the Formats and Format Codes section of the Postgres' documentation.

Array

data Array a Source #

A generic array encoder.

Here's an example of its usage:

x :: Value [[Int64]]
x =
  array (dimension foldl' (dimension foldl' (element int8)))

Please note that the PostgreSQL IN keyword does not "accept" an array, but rather a syntactical list of values, thus this encoder is not suited for that. Use a **field** = ANY($1) query instead.

element :: Value a -> Array a Source #

Lifts the Value encoder into the Array encoder of a non-nullable value.

nullableElement :: Value a -> Array (Maybe a) Source #

Lifts the Value encoder into the Array encoder of a nullable value.

dimension :: (forall a. (a -> b -> a) -> a -> c -> a) -> Array b -> Array c Source #

An encoder of an array dimension, which thus provides support for multidimensional arrays.

Accepts:

  • An implementation of the left-fold operation, such as Data.Foldable.foldl', which determines the input value.
  • A component encoder, which can be either another dimension, element or nullableElement.

Insert Many

It is not currently possible to pass in an array of encodable values to use in an 'insert many' statement using Hasql. Instead, PostgreSQL's (9.4 or later) unnest function can be used to in an analogous way to haskell's zip function by passing in multiple arrays of values to be zipped into the rows we want to insert:

  insertMultipleLocations :: Statement (Vector (UUID, Double, Double)) ()
  insertMultipleLocations =
    statement sql encoder decoder True
    where
      sql =
        "insert into location (id, x, y) select * from unnest ($1, $2, $3)"
      encoder =
        contramap Vector.unzip3 $
        contrazip3 (vector Encoders.uuid) (vector Encoders.float8) (vector Encoders.float8)
        where
          vector value =
            Encoders.param (Encoders.array (Encoders.dimension foldl' (Encoders.element value)))
      decoder =
        Decoders.unit