@@ -54,62 +54,77 @@ case class Codegen(options: CodegenOptions, namingStrategy: NamingStrategy) {
54
54
val excludedTables = options.excludedTables.toSet
55
55
val columnType2scalaType = options.typeMap.pairs.toMap
56
56
57
+ def results (resultSet : ResultSet ): Iterator [ResultSet ] = {
58
+ new Iterator [ResultSet ] {
59
+ def hasNext = resultSet.next()
60
+ def next () = resultSet
61
+ }
62
+ }
63
+
57
64
def getForeignKeys (db : Connection ): Set [ForeignKey ] = {
58
- val sb = Set .newBuilder[ForeignKey ]
59
65
val foreignKeys =
60
66
db.getMetaData.getExportedKeys(null , options.schema, null )
61
- while (foreignKeys.next()) {
62
- sb += ForeignKey (
67
+ results (foreignKeys).map { row =>
68
+ ForeignKey (
63
69
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 )
66
72
),
67
73
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 )
70
76
)
71
77
)
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" )
74
83
}
75
84
76
85
def getTables (db : Connection , foreignKeys : Set [ForeignKey ]): Seq [Table ] = {
77
- val sb = Seq .newBuilder[Table ]
78
86
val rs : ResultSet =
79
87
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 (
84
97
name,
85
- getColumns(db, name, foreignKeys)
86
- )
98
+ mappedColumns
99
+ ))
100
+ } else {
101
+ None
87
102
}
88
- }
89
- sb.result()
103
+ }.toVector
90
104
}
91
-
92
105
def getColumns (db : Connection ,
93
106
tableName : String ,
94
- foreignKeys : Set [ForeignKey ]): Seq [Column ] = {
107
+ foreignKeys : Set [ForeignKey ]): Seq [Either [ String , Column ] ] = {
95
108
val primaryKeys = getPrimaryKeys(db, tableName)
96
- val sb = Seq .newBuilder[Column ]
97
109
val cols =
98
110
db.getMetaData.getColumns(null , options.schema, tableName, null )
99
- while (cols.next()) {
111
+ results (cols).map { row =>
100
112
val colName = cols.getString(COLUMN_NAME )
101
113
val simpleColumn = SimpleColumn (tableName, colName)
102
114
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
113
128
}
114
129
115
130
def getPrimaryKeys (db : Connection , tableName : String ): Set [String ] = {
@@ -145,17 +160,10 @@ case class Codegen(options: CodegenOptions, namingStrategy: NamingStrategy) {
145
160
146
161
case class Column (tableName : String ,
147
162
columnName : String ,
148
- `type` : String ,
163
+ scalaType : String ,
149
164
nullable : Boolean ,
150
165
isPrimaryKey : Boolean ,
151
166
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
- })
159
167
def scalaOptionType = makeOption(scalaType)
160
168
161
169
def makeOption (typ : String ): String = {
0 commit comments