Advertisement
Guest User

Untitled

a guest
Mar 2nd, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.58 KB | None | 0 0
  1. diff --git a/src/main/scala/com/ansvia/slick/AnsviaSlickSourceCodeGenerator.scala b/src/main/scala/com/ansvia/slick/AnsviaSlickSourceCodeGenerator.scala
  2. index 9c4050b..d984489 100644
  3. --- a/src/main/scala/com/ansvia/slick/AnsviaSlickSourceCodeGenerator.scala
  4. +++ b/src/main/scala/com/ansvia/slick/AnsviaSlickSourceCodeGenerator.scala
  5. @@ -5,7 +5,8 @@ import java.net.URI
  6. import slick.backend.DatabaseConfig
  7. import slick.codegen.{SourceCodeGenerator, OutputHelpers, AbstractSourceCodeGenerator}
  8. import slick.driver.JdbcProfile
  9. -import slick.{model => m}
  10. +import slick.model.Model
  11. +import slick.{model => m, SlickException}
  12.  
  13. import scala.concurrent.duration.Duration
  14. import scala.concurrent.{ExecutionContext, Await}
  15. @@ -21,29 +22,25 @@ import scala.concurrent.{ExecutionContext, Await}
  16. * @param model Slick data model for which code should be generated.
  17. */
  18. class AnsviaSlickSourceCodeGenerator(model: m.Model)
  19. - extends AbstractSourceCodeGenerator(model) with OutputHelpers{
  20. + extends AbstractSourceCodeGenerator(model) with OutputHelpers {
  21.  
  22.  
  23. // "Tying the knot": making virtual classes concrete
  24. type Table = TableDef
  25. def Table = new TableDef(_)
  26.  
  27. -// override def code = {
  28. -// "import scala.slick.model.ForeignKeyAction\n" +
  29. -// ( if(tables.exists(_.hlistEnabled)){
  30. -// "import scala.slick.collection.heterogenous._\n"+
  31. -// "import scala.slick.collection.heterogenous.syntax._\n"
  32. -// } else ""
  33. -// ) +
  34. -// ( if(tables.exists(_.PlainSqlMapper.enabled)){
  35. -// "// NOTE: GetResult mappers for plain SQL are only generated for tables where Slick knows how to map the types of all columns.\n"+
  36. -// "import scala.slick.jdbc.{GetResult => GR}\n"
  37. -// } else ""
  38. -// ) +
  39. -// "\n/** DDL for all tables. Call .create to execute. */\nlazy val ddl = " + tables.map(t => (jamak(t.TableValue.name.toString)) + ".ddl").mkString(" ++ ") +
  40. -// "\n\n" +
  41. -// tables.map(_.code.mkString("\n")).mkString("\n\n")
  42. -// }
  43. + protected def customHeadCode = {
  44. + s"""
  45. + |
  46. + |abstract class BaseTable[T](tag: Tag, name: String) extends Table[T](tag, name) {
  47. + | val id: Rep[Long] = column[Long]("id", O.PrimaryKey, O.AutoInc)
  48. + |}
  49. + |
  50. + |class BaseTableQuery[E <: BaseTable[_]](cons : scala.Function1[slick.lifted.Tag, E]) extends TableQuery(cons) {
  51. + | lazy val findById = new profile.TableQueryExtensionMethods(this).findBy(t => t.id)
  52. + |}
  53. + """.stripMargin
  54. + }
  55.  
  56. override def code = {
  57. "import slick.model.ForeignKeyAction\n" +
  58. @@ -56,7 +53,7 @@ class AnsviaSlickSourceCodeGenerator(model: m.Model)
  59. "// NOTE: GetResult mappers for plain SQL are only generated for tables where Slick knows how to map the types of all columns.\n"+
  60. "import slick.jdbc.{GetResult => GR}\n"
  61. } else ""
  62. - ) +
  63. + ) + customHeadCode +
  64. (if(ddlEnabled){
  65. "\n/** DDL for all tables. Call .create to execute. */" +
  66. (
  67. @@ -93,7 +90,7 @@ class AnsviaSlickSourceCodeGenerator(model: m.Model)
  68. val prns = parents.map(" with " + _).mkString("")
  69. val args = model.name.schema.map(n => s"""Some("$n")""") ++ Seq("\""+model.name.table+"\"")
  70. s"""
  71. -class ${name}Row(_tableTag: Tag) extends Table[$elementType](_tableTag, ${args.mkString(", ")})$prns {
  72. +class ${name}Row(_tableTag: Tag) extends BaseTable[$elementType](_tableTag, ${args.mkString(", ")})$prns {
  73. ${indent(body.map(_.mkString("\n")).mkString("\n\n"))}
  74. }
  75. """.trim()
  76. @@ -101,10 +98,37 @@ class ${name}Row(_tableTag: Tag) extends Table[$elementType](_tableTag, ${args.m
  77. }
  78. type TableValue = TableValueDef
  79. def TableValue = new TableValue{
  80. - override def code: String = s"lazy val ${jamak(name.toString)} = new TableQuery(tag => new ${TableClass.name}Row(tag))"
  81. + override def code: String = s"lazy val ${jamak(name.toString)} = new BaseTableQuery(tag => new ${TableClass.name}Row(tag))"
  82. +
  83. +// override def code: String = s"lazy val ${jamak(name.toString)} = new TableQuery(tag => new ${TableClass.name}Row(tag)){\n" +
  84. +// " lazy val findById = this.findBy(t => t.id)\n" +
  85. +// "}\n"
  86. }
  87. type Column = ColumnDef
  88. - def Column = new Column(_)
  89. +// def Column = new Column(_)
  90. + def Column = new ColumnDef(_){
  91. +// def defaultCode = {
  92. +// case Some(v) => s"Some(${defaultCode(v)})"
  93. +// case s:String => "\""+s+"\""
  94. +// case None => s"None"
  95. +// case v:Byte => s"$v"
  96. +// case v:Int => s"$v"
  97. +// case v:Long => s"${v}L"
  98. +// case v:Float => s"${v}F"
  99. +// case v:Double => s"$v"
  100. +// case v:Boolean => s"$v"
  101. +// case v:Short => s"$v"
  102. +// case v:Char => s"'$v'"
  103. +// case v:BigDecimal => s"new scala.math.BigDecimal(new java.math.BigDecimal($v))"
  104. +// case v => throw new SlickException( s"Dont' know how to generate code for default value $v of ${v.getClass}. Override def defaultCode to render the value." )
  105. +// }
  106. + // Explicit type to allow overloading existing Slick method names.
  107. + // Explicit type argument for better error message when implicit type mapper not found.
  108. + override def code = {
  109. + (if (name == "id") "override " else "") +
  110. + s"""val $name: Rep[$actualType] = column[$actualType]("${model.name}"${options.map(", "+_).mkString("")})"""
  111. + }
  112. + }
  113. type PrimaryKey = PrimaryKeyDef
  114. def PrimaryKey = new PrimaryKey(_)
  115. type ForeignKey = MyForeignKeyDef
  116. @@ -152,7 +176,7 @@ object AnsviaSlickSourceCodeGenerator {
  117. val db = dbFactory.forURL(url, driver = jdbcDriver,
  118. user = user.getOrElse(null), password = password.getOrElse(null), keepAliveConnection = true)
  119. try {
  120. - val m = Await.result(db.run(driver.createModel(None, true)(ExecutionContext.global).withPinnedSession), Duration.Inf)
  121. + val m: Model = Await.result(db.run(driver.createModel(None, true)(ExecutionContext.global).withPinnedSession), Duration.Inf)
  122. new AnsviaSlickSourceCodeGenerator(m).writeToFile(slickDriver,outputDir,pkg)
  123. } finally db.close
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement