-- | Postgres is a popular, open-source RDBMS. It is fairly standards compliant
-- and supports many advanced features and data types.
--
-- The @beam-postgres@ module is built atop of @postgresql-simple@, which is
-- used for connection management, transaction support, serialization, and
-- deserialization.
--
-- @beam-postgres@ supports most beam features as well as many postgres-specific
-- features. For example, @beam-postgres@ provides support for full-text search,
-- @DISTINCT ON@, JSON handling, postgres @ARRAY@s, @RANGE@s, and the @MONEY@ type.
--
-- The documentation for @beam-postgres@ functionality below indicates which
-- postgres function each function or type wraps. Postgres maintains its own
-- in-depth documentation. Please refer to that for more detailed information on
-- <https://www.postgresql.org/docs/current/static/index.html behavior>.
--
-- For examples on how to use @beam-postgres@ usage, see
-- <https://haskell-beam.github.io/beam/user-guide/backends/beam-postgres/ its manual>.

module Database.Beam.Postgres
  (  -- * Beam Postgres backend
    Postgres(..), Pg, liftIOWithHandle

    -- ** Postgres syntax
  , PgCommandSyntax, PgSyntax
  , PgSelectSyntax, PgInsertSyntax
  , PgUpdateSyntax, PgDeleteSyntax

    -- * Beam URI support
  , postgresUriSyntax

    -- * Postgres-specific features
    -- ** Postgres-specific data types

  , json, jsonb, uuid, money
  , tsquery, tsvector, text, bytea
  , unboundedArray

    -- *** @SERIAL@ support
  , smallserial, serial, bigserial

  , module Database.Beam.Postgres.PgSpecific

  , runBeamPostgres, runBeamPostgresDebug

    -- ** Postgres extension support
  , PgExtensionEntity, IsPgExtension(..)
  , pgCreateExtension, pgDropExtension
  , getPgExtension

    -- ** Utilities for defining custom instances
  , fromPgIntegral
  , fromPgScientificOrIntegral

    -- ** Debug support

  , PgDebugStmt
  , pgTraceStmtIO, pgTraceStmtIO'
  , pgTraceStmt

  -- * @postgresql-simple@ re-exports

  , Pg.ResultError(..), Pg.SqlError(..)

  , Pg.Connection, Pg.ConnectInfo(..)
  , Pg.defaultConnectInfo

  , Pg.connectPostgreSQL, Pg.connect
  , Pg.close

  ) where

import Database.Beam.Postgres.Connection
import Database.Beam.Postgres.Full () -- for BeamHasInsertOnConflict instance
import Database.Beam.Postgres.Syntax
import Database.Beam.Postgres.Types
import Database.Beam.Postgres.PgSpecific
import Database.Beam.Postgres.Migrate ( tsquery, tsvector, text, bytea, unboundedArray
                                      , json, jsonb, uuid, money, smallserial, serial
                                      , bigserial)
import Database.Beam.Postgres.Extensions ( PgExtensionEntity, IsPgExtension(..)
                                         , pgCreateExtension, pgDropExtension
                                         , getPgExtension )
import Database.Beam.Postgres.Debug

import qualified Database.PostgreSQL.Simple as Pg