    -----------------------------------------------------------
    -- |
    -- Module      :  Database.HaskellDB.Sql.Generate
    -- Copyright   :  Daan Leijen (c) 1999, daan@cs.uu.nl
    --                HWT Group (c) 2003, haskelldb-users@lists.sourceforge.net
    -- License     :  BSD-style
    --
    -- Maintainer  :  haskelldb-users@lists.sourceforge.net
    -- Stability   :  experimental
    -- Portability :  non-portable
    --
    -- The type of SQL generators.
    --
    -----------------------------------------------------------
    module Database.HaskellDB.Sql.Generate (SqlGenerator(..)) where

    import Database.HaskellDB.PrimQuery
    import Database.HaskellDB.FieldType
    import Database.HaskellDB.Sql

    data SqlGenerator = SqlGenerator
        {
         sqlQuery       :: PrimQuery -> SqlSelect,
         sqlUpdate      :: TableName -> [PrimExpr] -> Assoc -> SqlUpdate,
         sqlDelete      :: TableName -> [PrimExpr] -> SqlDelete,
         sqlInsert      :: TableName -> Assoc -> SqlInsert,
         sqlInsertQuery :: TableName -> PrimQuery -> SqlInsert,
         sqlCreateDB    :: String -> SqlCreate,
         sqlCreateTable :: TableName -> [(Attribute,FieldDesc)] -> SqlCreate,
         sqlDropDB      :: String -> SqlDrop,
         sqlDropTable   :: TableName -> SqlDrop,

         sqlEmpty       :: SqlSelect,
         sqlTable       :: TableName -> Scheme -> SqlSelect,
         sqlProject     :: Assoc -> SqlSelect -> SqlSelect,
         -- | Ensures non-aggregate expressions in the select are included in
         -- group by clause.
         sqlGroup       :: Assoc -> SqlSelect -> SqlSelect,
         sqlRestrict    :: PrimExpr -> SqlSelect -> SqlSelect,
         sqlBinary      :: RelOp -> SqlSelect -> SqlSelect -> SqlSelect,
         sqlSpecial     :: SpecialOp -> SqlSelect -> SqlSelect,

         sqlExpr        :: PrimExpr -> SqlExpr,
         sqlLiteral     :: Literal -> String,
         sqlType        :: FieldType -> SqlType,
         -- | Turn a string into a quoted string. Quote characters
         -- and any escaping are handled by this function.
         sqlQuote       :: String -> String
        }