equal
deleted
inserted
replaced
75 if (T == Type.Bytes) "BYTEA" |
75 if (T == Type.Bytes) "BYTEA" |
76 else sql_type_default(T) |
76 else sql_type_default(T) |
77 |
77 |
78 |
78 |
79 /* columns */ |
79 /* columns */ |
|
80 |
|
81 trait Qualifier |
|
82 { |
|
83 def name: String |
|
84 } |
80 |
85 |
81 object Column |
86 object Column |
82 { |
87 { |
83 def bool(name: String, strict: Boolean = false, primary_key: Boolean = false): Column = |
88 def bool(name: String, strict: Boolean = false, primary_key: Boolean = false): Column = |
84 Column(name, Type.Boolean, strict, primary_key) |
89 Column(name, Type.Boolean, strict, primary_key) |
97 } |
102 } |
98 |
103 |
99 sealed case class Column( |
104 sealed case class Column( |
100 name: String, T: Type.Value, strict: Boolean = false, primary_key: Boolean = false) |
105 name: String, T: Type.Value, strict: Boolean = false, primary_key: Boolean = false) |
101 { |
106 { |
102 def apply(table: Table): Column = |
107 def apply(qual: Qualifier): Column = |
103 Column(Long_Name.qualify(table.name, name), T, strict = strict, primary_key = primary_key) |
108 Column(Long_Name.qualify(qual.name, name), T, strict = strict, primary_key = primary_key) |
104 |
109 |
105 def sql: String = ident(name) |
110 def sql: String = ident(name) |
106 def sql_decl(sql_type: Type.Value => String): String = |
111 def sql_decl(sql_type: Type.Value => String): String = |
107 sql + " " + sql_type(T) + (if (strict || primary_key) " NOT NULL" else "") |
112 sql + " " + sql_type(T) + (if (strict || primary_key) " NOT NULL" else "") |
108 |
113 |
113 } |
118 } |
114 |
119 |
115 |
120 |
116 /* tables */ |
121 /* tables */ |
117 |
122 |
118 sealed case class Table(name: String, columns: List[Column]) |
123 sealed case class Table(name: String, columns: List[Column]) extends Qualifier |
119 { |
124 { |
120 private val columns_index: Map[String, Int] = |
125 private val columns_index: Map[String, Int] = |
121 columns.iterator.map(_.name).zipWithIndex.toMap |
126 columns.iterator.map(_.name).zipWithIndex.toMap |
122 |
127 |
123 Library.duplicates(columns.map(_.name)) match { |
128 Library.duplicates(columns.map(_.name)) match { |
165 |
170 |
166 override def toString: String = |
171 override def toString: String = |
167 "TABLE " + ident(name) + " " + sql_columns(sql_type_default) |
172 "TABLE " + ident(name) + " " + sql_columns(sql_type_default) |
168 } |
173 } |
169 |
174 |
|
175 |
|
176 /* views */ |
|
177 |
|
178 sealed case class View(name: String, columns: List[Column]) extends Qualifier |
|
179 { |
|
180 def sql: String = ident(name) |
|
181 def sql_create(query: String): String = "CREATE VIEW " + ident(name) + " AS " + query |
|
182 override def toString: String = |
|
183 "VIEW " + ident(name) + " " + enclosure(columns.map(_.sql_decl(sql_type_default))) |
|
184 } |
170 |
185 |
171 |
186 |
172 /** SQL database operations **/ |
187 /** SQL database operations **/ |
173 |
188 |
174 /* results */ |
189 /* results */ |
294 val x = f(rs, column) |
309 val x = f(rs, column) |
295 if (rs.wasNull) None else Some(x) |
310 if (rs.wasNull) None else Some(x) |
296 } |
311 } |
297 |
312 |
298 |
313 |
299 /* tables */ |
314 /* tables and views */ |
300 |
315 |
301 def tables: List[String] = |
316 def tables: List[String] = |
302 iterator(connection.getMetaData.getTables(null, null, "%", null))(_.getString(3)).toList |
317 iterator(connection.getMetaData.getTables(null, null, "%", null))(_.getString(3)).toList |
303 |
318 |
304 def create_table(table: Table, strict: Boolean = false, sql: String = ""): Unit = |
319 def create_table(table: Table, strict: Boolean = false, sql: String = ""): Unit = |
312 strict: Boolean = false, unique: Boolean = false): Unit = |
327 strict: Boolean = false, unique: Boolean = false): Unit = |
313 using(statement(table.sql_create_index(name, columns, strict, unique)))(_.execute()) |
328 using(statement(table.sql_create_index(name, columns, strict, unique)))(_.execute()) |
314 |
329 |
315 def drop_index(table: Table, name: String, strict: Boolean = false): Unit = |
330 def drop_index(table: Table, name: String, strict: Boolean = false): Unit = |
316 using(statement(table.sql_drop_index(name, strict)))(_.execute()) |
331 using(statement(table.sql_drop_index(name, strict)))(_.execute()) |
|
332 |
|
333 def create_view(view: View, query: String): Unit = |
|
334 using(statement(view.sql_create(query)))(_.execute()) |
317 } |
335 } |
318 } |
336 } |
319 |
337 |
320 |
338 |
321 |
339 |