From bdec95155a6948f504710e32b983369f6db455d7 Mon Sep 17 00:00:00 2001 From: Naoki Takezoe Date: Thu, 8 Sep 2016 23:00:54 +0900 Subject: [PATCH] Add schema definition --- build.sbt | 2 + schema.json | 37 +++++++++++++++++++ .../github/takezoe/scala/jdbc/package.scala | 19 ++++++++++ .../scala/jdbc/validation/SchemaDef.scala | 7 ++++ .../{Models.scala => SqlModels.scala} | 0 5 files changed, 65 insertions(+) create mode 100644 schema.json create mode 100644 src/main/scala/com/github/takezoe/scala/jdbc/validation/SchemaDef.scala rename src/main/scala/com/github/takezoe/scala/jdbc/validation/{Models.scala => SqlModels.scala} (100%) diff --git a/build.sbt b/build.sbt index 51a5117..68c8960 100644 --- a/build.sbt +++ b/build.sbt @@ -9,6 +9,8 @@ scalaVersion := "2.11.8" libraryDependencies ++= Seq( "com.github.jsqlparser" % "jsqlparser" % "0.9.6", "org.scalamacros" %% "resetallattrs" % "1.0.0", + "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.7.2", + "com.github.pathikrit" %% "better-files" % "2.15.0", "org.scala-lang" % "scala-reflect" % scalaVersion.value, "org.scala-lang" % "scala-compiler" % scalaVersion.value % "provided", "org.scalatest" %% "scalatest" % "2.2.1" % "test" diff --git a/schema.json b/schema.json new file mode 100644 index 0000000..9511a9d --- /dev/null +++ b/schema.json @@ -0,0 +1,37 @@ +{ + "tables":[ + { + "name": "USER", + "columns": [ + { + "name": "USER_ID" + }, + { + "name": "USER_NAME" + } + ] + }, + { + "name": "COMPANY", + "columns": [ + { + "name": "COMPANY_ID" + }, + { + "name": "COMPANY_NAME" + } + ] + }, + { + "name": "DEPT", + "columns": [ + { + "name": "DEPT_ID" + }, + { + "name": "DEPT_NAME" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/scala/com/github/takezoe/scala/jdbc/package.scala b/src/main/scala/com/github/takezoe/scala/jdbc/package.scala index b6ec200..0a756e5 100644 --- a/src/main/scala/com/github/takezoe/scala/jdbc/package.scala +++ b/src/main/scala/com/github/takezoe/scala/jdbc/package.scala @@ -1,5 +1,7 @@ package com.github.takezoe.scala +import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper} +import com.fasterxml.jackson.module.scala.DefaultScalaModule import com.github.takezoe.scala.jdbc.SqlTemplate import net.sf.jsqlparser.JSQLParserException import net.sf.jsqlparser.parser.CCJSqlParserUtil @@ -9,6 +11,10 @@ import scala.language.experimental.macros import scala.reflect.macros.blackbox.Context import com.github.takezoe.scala.jdbc.validation._ +import scala.reflect.ClassTag +import better.files._ +import java.io.{File => JFile} + package object jdbc { /** @@ -34,6 +40,11 @@ package object jdbc { object Macros { + private val mapper = new ObjectMapper() + mapper.enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS) + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + mapper.registerModule(DefaultScalaModule) + def sqlMacro(c: Context)(sql: c.Expr[String]): c.Expr[com.github.takezoe.scala.jdbc.SqlTemplate] = { import c.universe._ sql.tree match { @@ -58,6 +69,14 @@ object Macros { } private def validateSql(sql: String, c: Context): Unit = { + val file = File("schema.json") + val schema = if(file.exists){ + val json = file.contentAsString + val schema = mapper.readValue(json, classOf[SchemaDef]) + schema.tables.map { t => t.name -> t }.toMap + } else { + Map.empty + } try { val parse = CCJSqlParserUtil.parse(sql) parse.accept(new StatementVisitorAdapter { diff --git a/src/main/scala/com/github/takezoe/scala/jdbc/validation/SchemaDef.scala b/src/main/scala/com/github/takezoe/scala/jdbc/validation/SchemaDef.scala new file mode 100644 index 0000000..9ea7ba8 --- /dev/null +++ b/src/main/scala/com/github/takezoe/scala/jdbc/validation/SchemaDef.scala @@ -0,0 +1,7 @@ +package com.github.takezoe.scala.jdbc.validation + +case class SchemaDef(tables: Seq[TableDef]) + +case class TableDef(name:String, columns: Seq[ColumnDef]) + +case class ColumnDef(name: String) diff --git a/src/main/scala/com/github/takezoe/scala/jdbc/validation/Models.scala b/src/main/scala/com/github/takezoe/scala/jdbc/validation/SqlModels.scala similarity index 100% rename from src/main/scala/com/github/takezoe/scala/jdbc/validation/Models.scala rename to src/main/scala/com/github/takezoe/scala/jdbc/validation/SqlModels.scala