1+ {-# LANGUAGE ConstraintKinds #-}
2+
13module Database.Beam.Migrate.Generics.Tables where
24
35import Database.Beam
6+ import Database.Beam.Backend.SQL.Types
47import Database.Beam.Backend.SQL.SQL92
8+ import Database.Beam.Backend.SQL.SQL2003
59import Database.Beam.Schema.Tables
610
711import Database.Beam.Migrate.Types.Predicates
@@ -16,37 +20,39 @@ import Data.Int
1620import GHC.Generics
1721
1822class 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
2125instance (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
2630instance ( 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
3438instance ( 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
4349instance ( 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+
7080class IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax ty where
71- defaultSqlDataType :: Proxy ty -> dataTypeSyntax
81+ defaultSqlDataType :: Proxy ty -> Bool {-^ Embedded -} -> dataTypeSyntax
7282
7383instance (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
7790instance (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
8399instance IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax Int where
84- defaultSqlDataType _ = intType
100+ defaultSqlDataType _ _ = intType
101+ instance IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax Int
85102instance IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax Int32 where
86- defaultSqlDataType _ = intType
103+ defaultSqlDataType _ _ = intType
104+ instance IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax Int32
87105instance IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax Int16 where
88- defaultSqlDataType _ = intType
106+ defaultSqlDataType _ _ = intType
107+ instance IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax Int16
89108
90109instance 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
93116instance IsSql92DataTypeSyntax dataTypeSyntax => HasDefaultSqlDataType dataTypeSyntax Double where
94- defaultSqlDataType _ = realType
117+ defaultSqlDataType _ _ = realType
118+ instance IsSql92ColumnSchemaSyntax columnSchemaSyntax => HasDefaultSqlDataTypeConstraints columnSchemaSyntax Double
95119instance 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 )
0 commit comments