packages feed

sqlc-hs-0.4.0.0: templates/query.hs.jinja

{- This file was auto-generated from {{sourceFile}} by sqlc-hs. -}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeFamilies #-}
module {{moduleName}} where

{% if generatePostgresql %}
import {{ internalModuleName }} (Query(..), Enum, Params, Result)
import qualified Database.PostgreSQL.Simple
import qualified Database.PostgreSQL.Simple.FromRow
import qualified Database.PostgreSQL.Simple.ToField
import qualified Database.PostgreSQL.Simple.ToRow
{% endif %}
{% if generateHasql %}
import {{ internalModuleName }} (Query(..), Enum, Params)
{# The row type is named `Result`, and so is IsStatement's associated type. GHC
   rejects a qualified name on the left of an associated type instance
   (GHC-28329), so it is the row family that gets qualified instead. Kept as a
   template comment: it explains this template, not the code it emits. #}
import qualified {{ internalModuleName }}
import qualified Data.Int
import qualified Data.Vector
import qualified Hasql.Decoders
import qualified Hasql.Encoders
import qualified Hasql.Mapping.IsScalar
import qualified Hasql.Mapping.IsStatement
import qualified Hasql.Statement
{% endif %}
{% if generateSqlite %}
import {{ internalModuleName }} (Query(..), Enum, Params, Result)
import qualified Database.SQLite.Simple.FromRow
import qualified Database.SQLite.Simple.ToField
import qualified Database.SQLite.Simple.ToRow
{% endif %}
{% if generateMysql %}
import {{ internalModuleName }} (Query(..), Enum, Params, Result)
import qualified Database.MySQL.Simple.Param
import qualified Database.MySQL.Simple.QueryParams
import qualified Database.MySQL.Simple.QueryResults
import qualified Database.MySQL.Simple.Result
{% endif %}

{% for import in moduleImports  %}
import qualified {{ import.value }}
{% endfor %}

{{ haskellQueryName }} :: Query {{ escapedQueryName }} {{ escapedCommand }}
{{ haskellQueryName }} = Query {{ escapedSql }}

data instance Params {{ escapedQueryName }} = {{ haskellParamsName }}
  {
  {% for param in parameterColumns %}
    {{ param.value.name }} :: {{ param.value.type }}{% if !param.last %},{% endif %}
  {% endfor %}
  }

{% if generateHasql %}
data instance {{ internalModuleName }}.Result {{ escapedQueryName }} = {{ haskellResultName }}
{% else %}
data instance Result {{ escapedQueryName }} = {{ haskellResultName }}
{% endif %}
  {
  {% for column in resultColumns  %}
    {{ column.value.name }} :: !({{ column.value.type }}){% if !column.last %},{% endif %}
  {% endfor %}
  }

{% if generatePostgresql %}
instance Database.PostgreSQL.Simple.ToRow.ToRow (Params {{ escapedQueryName }}) where
  toRow {{ haskellParamsName }}{% if parameterColumns | empty %}{}{% else %}{..}{% endif%} =
    [ {% for param in queryColumns %}
      {% if param.value.slice %}
      {% if param.value.notNull %}
      Database.PostgreSQL.Simple.ToField.toField (Database.PostgreSQL.Simple.In (Data.Foldable.toList {{ param.value.name }})){% if !param.last %}, {% endif %}
      {% else %}
      Database.PostgreSQL.Simple.ToField.toField (fmap (Database.PostgreSQL.Simple.In . Data.Foldable.toList) {{ param.value.name }}){% if !param.last %}, {% endif %}
      {% endif %}
      {% else %}
      Database.PostgreSQL.Simple.ToField.toField {{ param.value.name }}{% if !param.last %}, {% endif %}
      {% endif %}
      {% endfor %}
    ]

instance Database.PostgreSQL.Simple.FromRow.FromRow (Result {{ escapedQueryName }}) where
  fromRow =
    pure {{ haskellResultName }}
    {% for column in resultColumns %}
      <*> Database.PostgreSQL.Simple.FromRow.field
    {% endfor %}
{% endif %}
{% if generateHasql %}
instance Hasql.Mapping.IsStatement.IsStatement (Params {{ escapedQueryName }}) where
  type Result (Params {{ escapedQueryName }}) = {{ hasqlResultType }}
  statement =
    Hasql.Statement.preparable sql paramsEncoder ({{ hasqlResultDecoder }})
    where
      Query sql = {{ haskellQueryName }}

      paramsEncoder :: Hasql.Encoders.Params (Params {{ escapedQueryName }})
      paramsEncoder =
        mconcat
          [ {% for param in encoderColumns %}
          Data.Functor.Contravariant.contramap (\{{ haskellParamsName }}{..} -> {{ param.value.name }}) (Hasql.Encoders.param ({{ param.value.encoder }})){% if !param.last %}, {% endif %}
          {% endfor %}
          ]
      {-# INLINE paramsEncoder #-}
{% if hasqlDecodesRows %}
      rowDecoder :: Hasql.Decoders.Row ({{ internalModuleName }}.Result {{ escapedQueryName }})
      rowDecoder =
        pure {{ haskellResultName }}
        {% for column in resultColumns %}
          <*> Hasql.Decoders.column ({{ column.value.decoder }})
        {% endfor %}
      {-# INLINE rowDecoder #-}
{% endif %}
{% endif %}

{% if generateSqlite %}
instance Database.SQLite.Simple.ToRow.ToRow (Params {{ escapedQueryName }}) where
  toRow {{ haskellParamsName }}{% if parameterColumns | empty %}{}{% else %}{..}{% endif%} =
    [ {% for param in queryColumns %}
      Database.SQLite.Simple.ToField.toField {{ param.value.name }}{% if !param.last %}, {% endif %}
      {% endfor %}
    ]

instance Database.SQLite.Simple.FromRow.FromRow (Result {{ escapedQueryName }}) where
  fromRow =
    pure {{ haskellResultName }}
    {% for column in resultColumns %}
      <*> Database.SQLite.Simple.FromRow.field
    {% endfor %}
{% endif %}

{% if generateMysql %}
instance Database.MySQL.Simple.QueryParams.QueryParams (Params {{ escapedQueryName }}) where
  renderParams {{ haskellParamsName }}{% if parameterColumns | empty %}{}{% else %}{..}{% endif%} =
    [ {% for param in queryColumns %}
      Database.MySQL.Simple.Param.render {{ param.value.name }}{% if !param.last %}, {% endif %}
      {% endfor %}
    ]

instance Database.MySQL.Simple.QueryResults.QueryResults (Result {{ escapedQueryName }}) where
  convertResults [{% for column in resultColumns %}a_{{ column.index }}{% if !column.last %}, {% endif %}{% endfor%}] [{% for column in resultColumns %}b_{{ column.index }}{% if !column.last %}, {% endif %}{% endfor%}] = {{ haskellResultName }}{% if resultColumns | empty %}{}{% else %}{..}{% endif%}
    {% if resultColumns %}
    where
      {% for column in resultColumns %}
      !{{ column.value.name }} = Database.MySQL.Simple.Result.convert a_{{ column.index }} b_{{ column.index }}
      {% endfor %}
    {% endif %}
  convertResults a b =
    Database.MySQL.Simple.QueryResults.convertError a b {{ resultColumns | length }}
{% endif %}