Skip to content
This repository was archived by the owner on Oct 14, 2018. It is now read-only.

Commit 1292d80

Browse files
authored
Merge pull request #3 from nightscape/dont_abort_on_missing_type_mappings
Don't abort on missing type mappings
2 parents f97a604 + 1404e27 commit 1292d80

File tree

2 files changed

+49
-40
lines changed

2 files changed

+49
-40
lines changed

src/main/scala/com/geirsson/codegen/Codegen.scala

Lines changed: 48 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -54,62 +54,77 @@ case class Codegen(options: CodegenOptions, namingStrategy: NamingStrategy) {
5454
val excludedTables = options.excludedTables.toSet
5555
val columnType2scalaType = options.typeMap.pairs.toMap
5656

57+
def results(resultSet: ResultSet): Iterator[ResultSet] = {
58+
new Iterator[ResultSet] {
59+
def hasNext = resultSet.next()
60+
def next() = resultSet
61+
}
62+
}
63+
5764
def getForeignKeys(db: Connection): Set[ForeignKey] = {
58-
val sb = Set.newBuilder[ForeignKey]
5965
val foreignKeys =
6066
db.getMetaData.getExportedKeys(null, options.schema, null)
61-
while (foreignKeys.next()) {
62-
sb += ForeignKey(
67+
results(foreignKeys).map { row =>
68+
ForeignKey(
6369
from = SimpleColumn(
64-
tableName = foreignKeys.getString(FK_TABLE_NAME),
65-
columnName = foreignKeys.getString(FK_COLUMN_NAME)
70+
tableName = row.getString(FK_TABLE_NAME),
71+
columnName = row.getString(FK_COLUMN_NAME)
6672
),
6773
to = SimpleColumn(
68-
tableName = foreignKeys.getString(PK_TABLE_NAME),
69-
columnName = foreignKeys.getString(PK_COLUMN_NAME)
74+
tableName = row.getString(PK_TABLE_NAME),
75+
columnName = row.getString(PK_COLUMN_NAME)
7076
)
7177
)
72-
}
73-
sb.result()
78+
}.toSet
79+
}
80+
81+
def warn(msg: String): Unit = {
82+
System.err.println(s"[${Console.YELLOW}warn${Console.RESET}] $msg")
7483
}
7584

7685
def getTables(db: Connection, foreignKeys: Set[ForeignKey]): Seq[Table] = {
77-
val sb = Seq.newBuilder[Table]
7886
val rs: ResultSet =
7987
db.getMetaData.getTables(null, options.schema, "%", Array("TABLE"))
80-
while (rs.next()) {
81-
if (!excludedTables.contains(rs.getString(TABLE_NAME))) {
82-
val name = rs.getString(TABLE_NAME)
83-
sb += Table(
88+
results(rs).flatMap { row =>
89+
val name = row.getString(TABLE_NAME)
90+
if (!excludedTables.contains(name)) {
91+
val columns = getColumns(db, name, foreignKeys)
92+
val mappedColumns = columns.filter(_.isRight).map(_.right.get)
93+
val unmappedColumns = columns.filter(_.isLeft).map(_.left.get)
94+
if (!unmappedColumns.isEmpty)
95+
warn(s"The following columns from table $name need a mapping: $unmappedColumns")
96+
Some(Table(
8497
name,
85-
getColumns(db, name, foreignKeys)
86-
)
98+
mappedColumns
99+
))
100+
} else {
101+
None
87102
}
88-
}
89-
sb.result()
103+
}.toVector
90104
}
91-
92105
def getColumns(db: Connection,
93106
tableName: String,
94-
foreignKeys: Set[ForeignKey]): Seq[Column] = {
107+
foreignKeys: Set[ForeignKey]): Seq[Either[String, Column]] = {
95108
val primaryKeys = getPrimaryKeys(db, tableName)
96-
val sb = Seq.newBuilder[Column]
97109
val cols =
98110
db.getMetaData.getColumns(null, options.schema, tableName, null)
99-
while (cols.next()) {
111+
results(cols).map { row =>
100112
val colName = cols.getString(COLUMN_NAME)
101113
val simpleColumn = SimpleColumn(tableName, colName)
102114
val ref = foreignKeys.find(_.from == simpleColumn).map(_.to)
103-
sb += Column(
104-
tableName,
105-
colName,
106-
cols.getString(TYPE_NAME),
107-
cols.getBoolean(NULLABLE),
108-
primaryKeys contains cols.getString(COLUMN_NAME),
109-
ref
110-
)
111-
}
112-
sb.result()
115+
116+
val typ = cols.getString(TYPE_NAME)
117+
columnType2scalaType.get(typ).map { scalaType =>
118+
Right(Column(
119+
tableName,
120+
colName,
121+
scalaType,
122+
cols.getBoolean(NULLABLE),
123+
primaryKeys contains cols.getString(COLUMN_NAME),
124+
ref
125+
))
126+
}.getOrElse(Left(typ))
127+
}.toVector
113128
}
114129

115130
def getPrimaryKeys(db: Connection, tableName: String): Set[String] = {
@@ -145,17 +160,10 @@ case class Codegen(options: CodegenOptions, namingStrategy: NamingStrategy) {
145160

146161
case class Column(tableName: String,
147162
columnName: String,
148-
`type`: String,
163+
scalaType: String,
149164
nullable: Boolean,
150165
isPrimaryKey: Boolean,
151166
references: Option[SimpleColumn]) {
152-
if (!columnType2scalaType.contains(`type`)) {
153-
logger.warn(s"unknown type '${`type`}")
154-
}
155-
def scalaType =
156-
columnType2scalaType.getOrElse(`type`, {
157-
throw Error(s"ERROR: missing --type-map for type '${`type`}'")
158-
})
159167
def scalaOptionType = makeOption(scalaType)
160168

161169
def makeOption(typ: String): String = {

src/test/scala/com/geirsson/codegen/CodegenTest.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class CodegenTest extends FunSuite {
5353
|
5454
|create table article(
5555
| id integer not null,
56+
| article_unique_id uuid,
5657
| author_id integer,
5758
| is_published boolean
5859
|);

0 commit comments

Comments
 (0)