persistable-record 0.2.0.0 → 0.3.0.0
raw patch · 2 files changed
+67/−53 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Database.Record.TH: defineHasNotNullKeyInstanceDefault :: String -> Int -> Q [Dec]
- Database.Record.TH: defineHasPrimaryKeyInstanceDefault :: String -> [Int] -> Q [Dec]
- Database.Record.TH: defineRecordDefault :: TypeQ -> String -> [(String, TypeQ)] -> [Name] -> Q [Dec]
- Database.Record.TH: defineRecordTypeDefault :: String -> [(String, TypeQ)] -> [Name] -> Q [Dec]
- Database.Record.TH: recordTypeDefault :: String -> TypeQ
- Database.Record.TH: recordTypeNameDefault :: String -> ConName
+ Database.Record.TH: data NameConfig
+ Database.Record.TH: defaultNameConfig :: NameConfig
+ Database.Record.TH: defineRecordTypeWithConfig :: NameConfig -> String -> String -> [(String, TypeQ)] -> [Name] -> Q [Dec]
+ Database.Record.TH: defineRecordWithConfig :: TypeQ -> NameConfig -> String -> String -> [(String, TypeQ)] -> [Name] -> Q [Dec]
+ Database.Record.TH: instance GHC.Show.Show Database.Record.TH.NameConfig
+ Database.Record.TH: makeRecordPersistableWithSqlTypeWithConfig :: TypeQ -> NameConfig -> String -> String -> Int -> Q [Dec]
+ Database.Record.TH: recordType :: NameConfig -> String -> String -> TypeQ
+ Database.Record.TH: recordTypeName :: NameConfig -> String -> String -> ConName
- Database.Record.TH: makeRecordPersistableWithSqlTypeDefault :: TypeQ -> String -> Int -> Q [Dec]
+ Database.Record.TH: makeRecordPersistableWithSqlTypeDefault :: TypeQ -> String -> String -> Int -> Q [Dec]
Files
- persistable-record.cabal +1/−1
- src/Database/Record/TH.hs +66/−52
persistable-record.cabal view
@@ -1,5 +1,5 @@ name: persistable-record-version: 0.2.0.0+version: 0.3.0.0 synopsis: Binding between SQL database values and haskell records. description: This package contiains types to represent table constraints and interfaces to bind between SQL database values and Haskell records.
src/Database/Record/TH.hs view
@@ -16,7 +16,7 @@ module Database.Record.TH ( -- * Generate all templates about record defineRecord,- defineRecordDefault,+ defineRecordWithConfig, -- * Deriving class symbols derivingEq, derivingShow, derivingRead, derivingData, derivingTypeable,@@ -24,16 +24,16 @@ -- * Table constraint specified by key defineHasColumnConstraintInstance, defineHasPrimaryConstraintInstanceDerived,- defineHasNotNullKeyInstance, defineHasPrimaryKeyInstance,- defineHasPrimaryKeyInstanceDefault,- defineHasNotNullKeyInstanceDefault,+ defineHasNotNullKeyInstance, -- * Record type- defineRecordType, defineRecordTypeDefault,+ defineRecordType,+ defineRecordTypeWithConfig, -- * Function declarations depending on SQL type makeRecordPersistableWithSqlType,+ makeRecordPersistableWithSqlTypeWithConfig, makeRecordPersistableWithSqlTypeDefault, -- * Function declarations against defined record types@@ -52,8 +52,10 @@ reifyRecordType, -- * Templates about record type name- recordTypeNameDefault, recordTypeDefault,+ NameConfig, defaultNameConfig, + recordTypeName, recordType,+ columnOffsetsVarNameDefault, persistableFunctionNamesDefault,@@ -93,16 +95,33 @@ import qualified Database.Record.Persistable as Persistable --- | Generate default name of record type constructor from SQL table name 'String'-recordTypeNameDefault :: String -- ^ Table name in SQL- -> ConName -- ^ Result name-recordTypeNameDefault = conCamelcaseName+-- | 'NameConfig' type to customize names of expanded record templates.+data NameConfig =+ NameConfig+ { recordTypeName :: String -> String -> ConName+ -- ^ Make record type symbol name from schema name and table name in SQL+ , columnName :: String -> String -> VarName+ -- ^ Make column variable symbol name from table name and column name in SQL+ } +-- | Dummy show instance. Handy to define show instance recursively.+instance Show NameConfig where+ show = const "<nameConfig>"++-- | Default implementation of 'NameConfig' type+defaultNameConfig :: NameConfig+defaultNameConfig =+ NameConfig+ { recordTypeName = const conCamelcaseName+ , columnName = const varCamelcaseName+ }+ -- | Record type constructor template from SQL table name 'String'.--- Type name is generated by 'recordTypeNameDefault'.-recordTypeDefault :: String -- ^ Table name in SQL- -> TypeQ -- ^ Result type template-recordTypeDefault = toTypeCon . recordTypeNameDefault+recordType :: NameConfig -- ^ name rule config+ -> String -- ^ Schema name string in SQL+ -> String -- ^ Table name string in SQL+ -> TypeQ -- ^ Record type constructor+recordType config scm = toTypeCon . recordTypeName config scm -- | Variable expression of record column offset array. columnOffsetsVarNameDefault :: Name -- ^ Table type name@@ -148,22 +167,6 @@ defineHasNotNullKeyInstance = defineHasColumnConstraintInstance [t| NotNull |] --- | Template of 'HasColumnConstraint' 'Primary' instance--- from SQL table name 'String' and key index.-defineHasPrimaryKeyInstanceDefault :: String -- ^ Table name- -> [Int] -- ^ Key index which specifies this constraint- -> Q [Dec] -- ^ Declaration of primary key constraint instance-defineHasPrimaryKeyInstanceDefault =- defineHasPrimaryKeyInstance . recordTypeDefault---- | Template of 'HasColumnConstraint' 'NotNull' instance--- from SQL table name 'String' and key index.-defineHasNotNullKeyInstanceDefault :: String -- ^ Table name- -> Int -- ^ Key index which specifies this constraint- -> Q [Dec] -- ^ Declaration of not null key constraint instance-defineHasNotNullKeyInstanceDefault =- defineHasNotNullKeyInstance . recordTypeDefault- {-# DEPRECATED derivingEq "Use TH quasi-quotation like ''Eq instead of this." #-} -- | Name to specify deriving 'Eq' derivingEq :: Name@@ -228,13 +231,11 @@ columnDefault :: String -> TypeQ -> (VarName, TypeQ) columnDefault n t = (varCamelcaseName n, t) --- | Record type declaration template from SQL table name 'String'--- and column name 'String' - type pairs, derivings.-defineRecordTypeDefault :: String -> [(String, TypeQ)] -> [Name] -> Q [Dec]-defineRecordTypeDefault table columns =+defineRecordTypeWithConfig :: NameConfig -> String -> String -> [(String, TypeQ)] -> [Name] -> Q [Dec]+defineRecordTypeWithConfig config schema table columns = defineRecordType- (recordTypeNameDefault table)- [ columnDefault n t | (n, t) <- columns ]+ (recordTypeName config schema table)+ [ (columnName config schema n, t) | (n, t) <- columns ] -- | Record parser template.@@ -318,18 +319,29 @@ toSqlNameDefault :: String -> VarName toSqlNameDefault = (`varNameWithPrefix` "toSqlOf") --- | All templates depending on SQL value type with default names.-makeRecordPersistableWithSqlTypeDefault :: TypeQ -- ^ SQL value type- -> String -- ^ Table name of database- -> Int -- ^ Count of record columns- -> Q [Dec] -- ^ Result declarations-makeRecordPersistableWithSqlTypeDefault sqlValueType table width = do+-- | All templates depending on SQL value type with configured names.+makeRecordPersistableWithSqlTypeWithConfig :: TypeQ -- ^ SQL value type+ -> NameConfig -- ^ name rule config+ -> String -- ^ Schema name of database+ -> String -- ^ Table name of database+ -> Int -- ^ Count of record columns+ -> Q [Dec] -- ^ Result declarations+makeRecordPersistableWithSqlTypeWithConfig sqlValueType config schema table width = makeRecordPersistableWithSqlType sqlValueType (persistableFunctionNamesDefault . conName . conCamelcaseName $ table)- (recordTypeDefault table, toDataCon . recordTypeNameDefault $ table)+ (recordType config schema table, toDataCon . recordTypeName config schema $ table) width +-- | All templates depending on SQL value type with default names.+makeRecordPersistableWithSqlTypeDefault :: TypeQ -- ^ SQL value type+ -> String -- ^ Schema name+ -> String -- ^ Table name+ -> Int -- ^ Count of record columns+ -> Q [Dec] -- ^ Result declarations+makeRecordPersistableWithSqlTypeDefault sqlValueType =+ makeRecordPersistableWithSqlTypeWithConfig sqlValueType defaultNameConfig+ recordInfo' :: Info -> Maybe ((TypeQ, ExpQ), (Maybe [Name], [TypeQ])) recordInfo' = d where d (TyConI (DataD _cxt tcn _bs [r] _ds)) = case r of@@ -385,15 +397,17 @@ withSql <- makeRecordPersistableWithSqlType sqlValueType fnames (toTypeCon tyC, toDataCon tyC) $ length columns return $ typ ++ withSql --- | All templates for record type with default names.-defineRecordDefault :: TypeQ -- ^ SQL value type- -> String -- ^ Table name- -> [(String, TypeQ)] -- ^ Column names and types- -> [Name] -- ^ Record derivings- -> Q [Dec] -- ^ Result declarations-defineRecordDefault sqlValueType table columns derives = do- typ <- defineRecordTypeDefault table columns derives- withSql <- makeRecordPersistableWithSqlTypeDefault sqlValueType table $ length columns+-- | All templates for record type with configured names.+defineRecordWithConfig :: TypeQ -- ^ SQL value type+ -> NameConfig -- ^ name rule config+ -> String -- ^ Schema name+ -> String -- ^ Table name+ -> [(String, TypeQ)] -- ^ Column names and types+ -> [Name] -- ^ Record derivings+ -> Q [Dec] -- ^ Result declarations+defineRecordWithConfig sqlValueType config schema table columns derives = do+ typ <- defineRecordTypeWithConfig config schema table columns derives+ withSql <- makeRecordPersistableWithSqlTypeWithConfig sqlValueType config schema table $ length columns return $ typ ++ withSql