All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.scalaquery.meta.CodeGen.scala Maven / Gradle / Ivy

package org.scalaquery.meta

import java.io.PrintWriter
import org.scalaquery.session.Session

/**
 * Generate Scala code from database meta-data.
 */
object CodeGen {

  def output(table: MTable, out: PrintWriter)(implicit session: Session) {
    val columns = table.getColumns.list
    val pkeys = table.getPrimaryKeys.mapResult(k => (k.column, k)).list.toMap
    if(!columns.isEmpty) {
      out.print("object "+mkScalaName(table.name.name)+" extends Table[")
      if(columns.tail.isEmpty) out.print(scalaTypeFor(columns.head))
      else out.print("(" + columns.map(c => scalaTypeFor(c)).mkString(", ") + ")")
      out.println("](\""+table.name.name+"\") {")
      for(c <- columns) output(c, pkeys.get(c.column), out)
      out.println("  def * = " + columns.map(c => mkScalaName(c.column, false)).mkString(" ~ "))
      out.println("}")
    }
  }

  def output(c: MColumn, pkey: Option[MPrimaryKey], out: PrintWriter)(implicit session: Session) {
    out.print("  def "+mkScalaName(c.column, false)+" = column["+scalaTypeFor(c)+"](\""+c.column+"\"")
    for(n <- c.sqlTypeName) {
      out.print(", O DBType \""+n+"")
      for(i <- c.columnSize ) out.print("("+i+")")
      out.print("\"")
    }
    if(c.isAutoInc.getOrElse(false)) out.print(", O AutoInc")
    for(k <- pkey) out.print(", O PrimaryKey")
    out.println(")")
  }

  def mkScalaName(s: String, capFirst:Boolean = true) = {
    val b = new StringBuilder
    var cap = capFirst
    for(c <- s) {
      if(c == '_') cap = true
      else {
        val allowed = if(b.isEmpty) c.isUnicodeIdentifierStart else c.isUnicodeIdentifierPart
        if(allowed) b append (if(cap) c.toUpper else c.toLower)
        cap = false
      }
    }
    b.toString
  }

  def scalaTypeFor(c: MColumn): String =
    if(c.nullable.getOrElse(true)) "Option[" + scalaTypeFor(c.sqlType) + "]" else scalaTypeFor(c.sqlType)

  def scalaTypeFor(sqlType: Int): String = {
    import java.sql.Types._
    sqlType match {
      case BIT | BOOLEAN => "Boolean"
      case TINYINT => "Byte"
      case SMALLINT => "Short"
      case INTEGER => "Int"
      case BIGINT => "BigInteger"
      case FLOAT => "Float"
      case REAL | DOUBLE => "Double"
      case NUMERIC | DECIMAL => "BigDecimal"
      case CHAR | VARCHAR | LONGVARCHAR => "String"
      case DATE => "java.sql.Date"
      case TIME => "java.sql.Time"
      case TIMESTAMP => "java.sql.Timestamp"
      case BINARY | VARBINARY | LONGVARBINARY | BLOB => "java.sql.Blob"
      case NULL => "Null"
      case CLOB => "java.sql.Clob"
      case _ => "AnyRef"
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy