Skip to content

Commit d339838

Browse files
committed
Serial columns, insert returning across backends, generic URI support
1 parent f73b073 commit d339838

File tree

22 files changed

+574
-158
lines changed

22 files changed

+574
-158
lines changed

beam-core/Database/Beam.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ module Database.Beam
1313
, module Database.Beam.Schema
1414
, MonadBeam(withDatabase, withDatabaseDebug)
1515
, Auto(..)
16+
, FromBackendRow(..)
1617

1718
-- * Re-exports
1819
, MonadIO(..), Typeable

beam-core/Database/Beam/Backend/SQL/SQL2003.hs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module Database.Beam.Backend.SQL.SQL2003
77
, IsSql2003ExpressionSyntax(..)
88
, IsSql2003ExpressionElementaryOLAPOperationsSyntax(..)
99
, IsSql2003ExpressionAdvancedOLAPOperationsSyntax(..)
10+
, IsSql2003BinaryAndVarBinaryDataTypeSyntax(..)
1011
, IsSql2003WindowFrameSyntax(..)
1112
, IsSql2003WindowFrameBoundsSyntax(..)
1213
, IsSql2003WindowFrameBoundSyntax(..)
@@ -56,6 +57,12 @@ class IsSql2003ExpressionSyntax expr =>
5657
filterAggE :: expr -> expr -> expr
5758
rankAggE :: expr
5859

60+
-- | Optional SQL2003 "BINARY AND VARBINARY data type" T021 support
61+
class IsSql99DataTypeSyntax dataType =>
62+
IsSql2003BinaryAndVarBinaryDataTypeSyntax dataType where
63+
binaryType :: Maybe Word -> dataType
64+
varBinaryType :: Maybe Word -> dataType
65+
5966
class IsSql2003WindowFrameBoundsSyntax (Sql2003WindowFrameBoundsSyntax frame) =>
6067
IsSql2003WindowFrameSyntax frame where
6168
type Sql2003WindowFrameExpressionSyntax frame :: *

beam-core/Database/Beam/Backend/SQL/SQL92.hs

Lines changed: 8 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
-- | Finally tagless encoding of SQL92 syntax
44
module Database.Beam.Backend.SQL.SQL92 where
55

6-
import Database.Beam.Backend.Types
7-
import Database.Beam.Backend.SQL.Types
6+
import Database.Beam.Backend.Types
7+
import Database.Beam.Backend.SQL.Types
88

9-
import Data.Text (Text)
10-
import Data.Int
11-
import Data.Time (LocalTime)
9+
import Data.Int
10+
import Data.Text (Text)
11+
import Data.Time (LocalTime)
1212

1313
class ( BeamSqlBackend be ) =>
1414
BeamSql92Backend be where
@@ -226,6 +226,9 @@ class ( HasSqlValueSyntax (Sql92ExpressionValueSyntax expr) Int
226226

227227
defaultE :: expr
228228

229+
instance HasSqlValueSyntax syntax x => HasSqlValueSyntax syntax (SqlSerial x) where
230+
sqlValueSyntax (SqlSerial x) = sqlValueSyntax x
231+
229232
class IsSql92AggregationSetQuantifierSyntax (Sql92AggregationSetQuantifierSyntax expr) =>
230233
IsSql92AggregationExpressionSyntax expr where
231234

@@ -279,85 +282,3 @@ class IsSql92FromSyntax from =>
279282

280283
outerJoin :: from -> from -> Maybe (Sql92FromExpressionSyntax from) -> from
281284

282-
-- class Sql92Syntax cmd where
283-
284-
-- -- data Sql92ValueSyntax cmd :: *
285-
-- -- data Sql92FieldNameSyntax cmd :: *
286-
287-
-- selectCmd :: Sql92SelectSyntax cmd -> cmd
288-
289-
290-
-- -- data Sql92TableSourceSyntax cmd :: *
291-
292-
-- -- data Sql92InsertValuesSyntax cmd :: *
293-
294-
-- -- data Sql92AliasingSyntax cmd :: * -> *
295-
296-
-- insertSqlExpressions :: [ [ Sql92ExpressionSyntax cmd ] ]
297-
-- -> Sql92InsertValuesSyntax cmd
298-
-- insertFromSql :: Sql92SelectSyntax cmd
299-
-- -> Sql92InsertValuesSyntax cmd
300-
301-
-- -- nullV :: Sql92ValueSyntax cmd
302-
-- -- trueV :: Sql92ValueSyntax cmd
303-
-- -- falseV :: Sql92ValueSyntax cmd
304-
-- -- stringV :: String -> Sql92ValueSyntax cmd
305-
-- -- numericV :: Integer -> Sql92ValueSyntax cmd
306-
-- -- rationalV :: Rational -> Sql92ValueSyntax cmd
307-
308-
-- -- aliasExpr :: Sql92ExpressionSyntax cmd
309-
-- -- -> Maybe Text
310-
-- -- -> Sql92AliasingSyntax cmd (Sql92ExpressionSyntax cmd)
311-
312-
-- -- projExprs :: [Sql92AliasingSyntax cmd (Sql92ExpressionSyntax cmd)]
313-
-- -- -> Sql92ProjectionSyntax cmd
314-
315-
-- -- ascOrdering, descOrdering
316-
-- -- :: Sql92ExpressionSyntax cmd -> Sql92OrderingSyntax cmd
317-
318-
-- tableNamed :: Text -> Sql92TableSourceSyntax cmd
319-
320-
-- -- fromTable
321-
-- -- :: Sql92TableSourceSyntax cmd
322-
-- -- -> Maybe Text
323-
-- -- -> Sql92FromSyntax cmd
324-
325-
-- innerJoin, leftJoin, rightJoin
326-
-- :: Sql92FromSyntax cmd
327-
-- -> Sql92FromSyntax cmd
328-
-- -> Maybe (Sql92ExpressionSyntax cmd)
329-
-- -> Sql92FromSyntax cmd
330-
331-
-- instance HasSqlValueSyntax Sql92SyntaxBuilder Int32 where
332-
-- sqlValueSyntax = numericV . fromIntegral
333-
334-
-- -- | Build a query using ANSI SQL92 syntax. This is likely to work out-of-the-box
335-
-- -- in many databases, but its use is a security risk, as different databases have
336-
-- -- different means of escaping values. It is best to customize this class per-backend
337-
-- instance Sql92Syntax Sql92SyntaxBuilder where
338-
339-
-- trueV = Sql92ValueSyntaxBuilder (Sql92SyntaxBuilder (byteString "TRUE"))
340-
-- falseV = Sql92ValueSyntaxBuilder (Sql92SyntaxBuilder (byteString "FALSE"))
341-
-- stringV x = Sql92ValueSyntaxBuilder . Sql92SyntaxBuilder $
342-
-- byteString "\'" <>
343-
-- stringUtf8 (foldMap escapeChar x) <>
344-
-- byteString "\'"
345-
-- where escapeChar '\'' = "''"
346-
-- escapeChar x = [x]
347-
-- numericV x = Sql92ValueSyntaxBuilder (Sql92SyntaxBuilder (stringUtf8 (show x)))
348-
-- rationalV x = let Sql92ExpressionSyntaxBuilder e =
349-
-- divE (valueE (numericV (numerator x)))
350-
-- (valueE (numericV (denominator x)))
351-
-- in Sql92ValueSyntaxBuilder e
352-
-- nullV = Sql92ValueSyntaxBuilder (Sql92SyntaxBuilder (byteString "NULL"))
353-
354-
-- fromTable tableSrc Nothing = coerce tableSrc
355-
-- fromTable tableSrc (Just nm) =
356-
-- Sql92FromSyntaxBuilder . Sql92SyntaxBuilder $
357-
-- buildSql92 (coerce tableSrc) <> byteString " AS " <> stringUtf8 (T.unpack nm)
358-
359-
-- innerJoin = join "INNER JOIN"
360-
-- leftJoin = join "LEFT JOIN"
361-
-- rightJoin = join "RIGHT JOIN"
362-
363-
-- tableNamed nm = Sql92TableSourceSyntaxBuilder (Sql92SyntaxBuilder (stringUtf8 (T.unpack nm)))

beam-core/Database/Beam/Backend/SQL/Types.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,8 @@ data SqlNull = SqlNull
1212
deriving (Show, Eq, Ord, Bounded, Enum)
1313
newtype SqlBitString = SqlBitString Integer
1414
deriving (Show, Eq, Ord, Enum, Bits)
15+
16+
newtype SqlSerial a = SqlSerial { unSerial :: a }
17+
deriving (Show, Read, Eq, Ord)
18+
instance FromBackendRow be x => FromBackendRow be (SqlSerial x) where
19+
fromBackendRow = SqlSerial <$> fromBackendRow
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
-- | Convenience methods for constructing backend-agnostic applications
2+
3+
module Database.Beam.Backend.URI where
4+
5+
import Database.Beam.Backend.SQL
6+
7+
import Control.Exception
8+
9+
import qualified Data.Map as M
10+
11+
import Network.URI
12+
13+
data BeamResourceNotFound = BeamResourceNotFound deriving Show
14+
instance Exception BeamResourceNotFound
15+
16+
data BeamOpenURIInvalid = BeamOpenURIInvalid deriving Show
17+
instance Exception BeamOpenURIInvalid
18+
19+
data BeamOpenURIUnsupportedScheme = BeamOpenURIUnsupportedScheme String deriving Show
20+
instance Exception BeamOpenURIUnsupportedScheme
21+
22+
data BeamURIOpener c where
23+
BeamURIOpener :: MonadBeam syntax be hdl m => c syntax be hdl m -> (forall a. URI -> m a -> IO a) -> BeamURIOpener c
24+
newtype BeamURIOpeners c where
25+
BeamURIOpeners :: M.Map String (BeamURIOpener c) -> BeamURIOpeners c
26+
27+
instance Monoid (BeamURIOpeners c) where
28+
mempty = BeamURIOpeners mempty
29+
mappend (BeamURIOpeners a) (BeamURIOpeners b) =
30+
BeamURIOpeners (mappend a b)
31+
32+
mkUriOpener :: MonadBeam syntax be hdl m
33+
=> String -> (forall a. URI -> m a -> IO a)
34+
-> c syntax be hdl m
35+
-> BeamURIOpeners c
36+
mkUriOpener schemeNm opener c = BeamURIOpeners (M.singleton schemeNm (BeamURIOpener c opener))
37+
38+
withDbConnection :: forall c a
39+
. BeamURIOpeners c
40+
-> String
41+
-> (forall syntax be hdl m. MonadBeam syntax be hdl m => c syntax be hdl m -> m a)
42+
-> IO a
43+
withDbConnection (BeamURIOpeners protos) uri actionWithDb =
44+
case parseURI uri of
45+
Nothing -> throwIO BeamOpenURIInvalid
46+
Just parsedUri ->
47+
case M.lookup (uriScheme parsedUri) protos of
48+
Nothing -> throwIO (BeamOpenURIUnsupportedScheme (uriScheme parsedUri))
49+
Just (BeamURIOpener c withURI) ->
50+
withURI parsedUri (actionWithDb c)

beam-core/beam-core.cabal

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ library
2929
Database.Beam.Schema.Tables
3030

3131
Database.Beam.Backend.Types
32+
Database.Beam.Backend.URI
3233
Database.Beam.Backend.SQL
3334
Database.Beam.Backend.SQL.Types
35+
Database.Beam.Backend.SQL.BeamExtensions
3436
Database.Beam.Backend.SQL.SQL92
3537
Database.Beam.Backend.SQL.SQL99
3638
Database.Beam.Backend.SQL.SQL2003
@@ -52,7 +54,9 @@ library
5254
free >=4.12 && <4.13,
5355
dlist >=0.8 && <0.9,
5456
time >=1.6 && <1.10,
55-
hashable >=1.1 && <1.3
57+
hashable >=1.1 && <1.3,
58+
network-uri >=2.6 && <2.7,
59+
containers >=0.5 && <0.6
5660
Default-language: Haskell2010
5761
default-extensions: ScopedTypeVariables, OverloadedStrings, GADTs, RecursiveDo, FlexibleInstances, FlexibleContexts, TypeFamilies,
5862
GeneralizedNewtypeDeriving, RankNTypes, TupleSections, ConstraintKinds, StandaloneDeriving, TypeOperators,

beam-migrate/Database/Beam/Migrate/Generics/Tables.hs

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
{-# LANGUAGE ConstraintKinds #-}
2+
13
module Database.Beam.Migrate.Generics.Tables where
24

35
import Database.Beam
6+
import Database.Beam.Backend.SQL.Types
47
import Database.Beam.Backend.SQL.SQL92
8+
import Database.Beam.Backend.SQL.SQL2003
59
import Database.Beam.Schema.Tables
610

711
import Database.Beam.Migrate.Types.Predicates
@@ -16,37 +20,39 @@ import Data.Int
1620
import GHC.Generics
1721

1822
class IsSql92DdlCommandSyntax syntax => GMigratableTableSettings syntax s (i :: * -> *) where
19-
gDefaultTblSettingsChecks :: Proxy syntax -> Proxy i -> s () -> [TableCheck]
23+
gDefaultTblSettingsChecks :: Proxy syntax -> Proxy i -> Bool -> s () -> [TableCheck]
2024

2125
instance (IsSql92DdlCommandSyntax syntax, GMigratableTableSettings syntax xStgs xId) =>
2226
GMigratableTableSettings syntax (M1 t s xStgs) (M1 t s xId) where
23-
gDefaultTblSettingsChecks syntax Proxy (M1 x) =
24-
gDefaultTblSettingsChecks syntax (Proxy @xId) x
27+
gDefaultTblSettingsChecks syntax Proxy embedded (M1 x) =
28+
gDefaultTblSettingsChecks syntax (Proxy @xId) embedded x
2529

2630
instance ( IsSql92DdlCommandSyntax syntax
2731
, GMigratableTableSettings syntax aStgs aId
2832
, GMigratableTableSettings syntax bStgs bId ) =>
2933
GMigratableTableSettings syntax (aStgs :*: bStgs) (aId :*: bId) where
30-
gDefaultTblSettingsChecks syntax Proxy (a :*: b) =
31-
gDefaultTblSettingsChecks syntax (Proxy @aId) a ++
32-
gDefaultTblSettingsChecks syntax (Proxy @bId) b
34+
gDefaultTblSettingsChecks syntax Proxy embedded (a :*: b) =
35+
gDefaultTblSettingsChecks syntax (Proxy @aId) embedded a ++
36+
gDefaultTblSettingsChecks syntax (Proxy @bId) embedded b
3337

3438
instance ( HasDefaultSqlDataType (Sql92DdlCommandDataTypeSyntax syntax) haskTy
39+
, HasDefaultSqlDataTypeConstraints (Sql92DdlCommandColumnSchemaSyntax syntax) haskTy
3540
, HasNullableConstraint (NullableStatus haskTy) (Sql92DdlCommandColumnSchemaSyntax syntax)
3641
, IsSql92DdlCommandSyntax syntax ) =>
3742
GMigratableTableSettings syntax (Rec0 (TableField tbl x)) (Rec0 haskTy) where
3843

39-
gDefaultTblSettingsChecks _ _ (K1 (TableField nm)) =
44+
gDefaultTblSettingsChecks _ _ embedded (K1 (TableField nm)) =
4045
nullableConstraint nm (Proxy @(NullableStatus haskTy)) (Proxy @(Sql92DdlCommandColumnSchemaSyntax syntax)) ++
41-
[ TableCheck (\tblNm -> p (TableHasColumn tblNm nm (defaultSqlDataType (Proxy @haskTy)) :: TableHasColumn (Sql92DdlCommandColumnSchemaSyntax syntax))) ]
46+
defaultSqlDataTypeConstraints (Proxy @haskTy) (Proxy @(Sql92DdlCommandColumnSchemaSyntax syntax)) nm embedded ++
47+
[ TableCheck (\tblNm -> p (TableHasColumn tblNm nm (defaultSqlDataType (Proxy @haskTy) embedded) :: TableHasColumn (Sql92DdlCommandColumnSchemaSyntax syntax))) ]
4248

4349
instance ( Generic (embeddedTbl (TableField tbl))
4450
, IsSql92DdlCommandSyntax syntax
4551
, GMigratableTableSettings syntax (Rep (embeddedTbl (TableField tbl))) (Rep (embeddedTbl Identity)) ) =>
4652
GMigratableTableSettings syntax (Rec0 (embeddedTbl (TableField tbl))) (Rec0 (embeddedTbl Identity)) where
4753

48-
gDefaultTblSettingsChecks syntax _ (K1 embeddedTbl) =
49-
gDefaultTblSettingsChecks syntax (Proxy :: Proxy (Rep (embeddedTbl Identity))) (from embeddedTbl)
54+
gDefaultTblSettingsChecks syntax _ _ (K1 embeddedTbl) =
55+
gDefaultTblSettingsChecks syntax (Proxy :: Proxy (Rep (embeddedTbl Identity))) True (from embeddedTbl)
5056

5157
-- * Nullability check
5258

@@ -67,30 +73,53 @@ instance IsSql92ColumnSchemaSyntax syntax =>
6773

6874
-- * Default data types
6975

76+
class IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax ty where
77+
defaultSqlDataTypeConstraints :: Proxy ty -> Proxy columnSchemaSyntax -> Text -> Bool {-^ Embedded -} -> [ TableCheck ]
78+
defaultSqlDataTypeConstraints _ _ _ _ = []
79+
7080
class IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax ty where
71-
defaultSqlDataType :: Proxy ty -> dataTypeSyntax
81+
defaultSqlDataType :: Proxy ty -> Bool {-^ Embedded -} -> dataTypeSyntax
7282

7383
instance (IsSql92DataTypeSyntax dataTypeSyntax, HasDefaultSqlDataType dataTypeSyntax ty) =>
7484
HasDefaultSqlDataType dataTypeSyntax (Auto ty) where
7585
defaultSqlDataType _ = defaultSqlDataType (Proxy @ty)
86+
instance (IsSql92ColumnSchemaSyntax columnSchemaSyntax, HasDefaultSqlDataTypeConstraints columnSchemaSyntax ty) =>
87+
HasDefaultSqlDataTypeConstraints columnSchemaSyntax (Auto ty) where
88+
defaultSqlDataTypeConstraints _ = defaultSqlDataTypeConstraints (Proxy @ty)
7689

7790
instance (IsSql92DataTypeSyntax dataTypeSyntax, HasDefaultSqlDataType dataTypeSyntax ty) =>
7891
HasDefaultSqlDataType dataTypeSyntax (Maybe ty) where
7992
defaultSqlDataType _ = defaultSqlDataType (Proxy @ty)
93+
instance (IsSql92ColumnSchemaSyntax columnSchemaSyntax, HasDefaultSqlDataTypeConstraints columnSchemaSyntax ty) =>
94+
HasDefaultSqlDataTypeConstraints columnSchemaSyntax (Maybe ty) where
95+
defaultSqlDataTypeConstraints _ = defaultSqlDataTypeConstraints (Proxy @ty)
8096

8197
-- TODO Not sure if individual databases will want to customize these types
8298

8399
instance IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax Int where
84-
defaultSqlDataType _ = intType
100+
defaultSqlDataType _ _ = intType
101+
instance IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax Int
85102
instance IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax Int32 where
86-
defaultSqlDataType _ = intType
103+
defaultSqlDataType _ _ = intType
104+
instance IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax Int32
87105
instance IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax Int16 where
88-
defaultSqlDataType _ = intType
106+
defaultSqlDataType _ _ = intType
107+
instance IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax Int16
89108

90109
instance IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax Text where
91-
defaultSqlDataType _ = varCharType Nothing Nothing
110+
defaultSqlDataType _ _ = varCharType Nothing Nothing
111+
instance IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax Text
112+
instance IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax SqlBitString where
113+
defaultSqlDataType _ _ = varBitType Nothing
114+
instance IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax SqlBitString
92115

93116
instance IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax Double where
94-
defaultSqlDataType _ = realType
117+
defaultSqlDataType _ _ = realType
118+
instance IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax Double
95119
instance IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax Scientific where
96-
defaultSqlDataType _ = numericType (Just (20, Just 10))
120+
defaultSqlDataType _ _ = numericType (Just (20, Just 10))
121+
instance IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax Scientific
122+
123+
type Sql92HasDefaultDataType syntax ty =
124+
( HasDefaultSqlDataType (Sql92DdlCommandDataTypeSyntax syntax) ty
125+
, HasDefaultSqlDataTypeConstraints (Sql92DdlCommandColumnSchemaSyntax syntax) ty )
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module Database.Beam.Migrate.SQL.BeamExtensions where
2+
3+
import Database.Beam.Backend.Types
4+
import Database.Beam.Backend.SQL
5+
import Database.Beam.Migrate.SQL.SQL92
6+
import Database.Beam.Migrate.SQL.Types
7+
8+
import Data.Text (Text)
9+
10+
11+
class IsSql92ColumnSchemaSyntax syntax =>
12+
IsBeamSerialColumnSchemaSyntax syntax where
13+
genericSerial :: FieldReturnType 'False 'False syntax (SqlSerial Int) a => Text -> a

beam-migrate/Database/Beam/Migrate/SQL/SQL92.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import Data.Typeable
1010
type Sql92DdlCommandDataTypeSyntax syntax =
1111
Sql92ColumnSchemaColumnTypeSyntax (Sql92DdlCommandColumnSchemaSyntax syntax)
1212
type Sql92DdlCommandColumnSchemaSyntax syntax = Sql92CreateTableColumnSchemaSyntax (Sql92DdlCommandCreateTableSyntax syntax)
13+
type Sql92DdlColumnSchemaConstraintSyntax syntax =
14+
Sql92ColumnConstraintDefinitionConstraintSyntax (Sql92ColumnSchemaColumnConstraintDefinitionSyntax syntax)
15+
type Sql92DdlCommandColumnConstraintSyntax syntax =
16+
Sql92DdlColumnSchemaConstraintSyntax (Sql92DdlCommandColumnSchemaSyntax syntax)
1317

1418
type Sql92SaneDdlCommandSyntax cmd =
1519
( IsSql92DdlCommandSyntax cmd

beam-migrate/Database/Beam/Migrate/Simple.hs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
module Database.Beam.Migrate.Simple where
1+
module Database.Beam.Migrate.Simple
2+
( simpleSchema
3+
, module Database.Beam.Migrate.Actions ) where
24

35
import Database.Beam
46
import Database.Beam.Migrate.Types
@@ -16,3 +18,4 @@ simpleSchema providers settings =
1618
in case finalSolution solver of
1719
Solved cmds -> Just cmds
1820
Candidates {} -> Nothing
21+

0 commit comments

Comments
 (0)