293 def open_database( |
293 def open_database( |
294 user: String, |
294 user: String, |
295 password: String, |
295 password: String, |
296 database: String = "", |
296 database: String = "", |
297 host: String = "", |
297 host: String = "", |
298 port: Int = default_port): Database = |
298 port: Int = default_port, |
|
299 ssh: Option[SSH.Session] = None): Database = |
299 { |
300 { |
300 require(user != "") |
301 require(user != "") |
301 val spec = |
302 |
302 (if (host != "") host else "localhost") + |
303 val db_host = if (host != "") host else "localhost" |
303 (if (port != default_port) ":" + port else "") + "/" + |
304 val db_port = if (port != default_port) ":" + port else "" |
304 (if (database != "") database else user) |
305 val db_name = "/" + (if (database != "") database else user) |
305 val connection = DriverManager.getConnection("jdbc:postgresql://" + spec, user, password) |
306 |
306 new Database(user + "@" + spec, connection) |
307 val (spec, port_forwarding) = |
307 } |
308 ssh match { |
308 |
309 case None => (db_host + db_port + db_name, None) |
309 class Database private[PostgreSQL](name: String, val connection: Connection) extends SQL.Database |
310 case Some(ssh) => |
310 { |
311 val fw = ssh.port_forwarding(remote_host = db_host, remote_port = port) |
311 override def toString: String = name |
312 ("localhost:" + fw.port + db_name, Some(fw)) |
|
313 } |
|
314 try { |
|
315 val connection = DriverManager.getConnection("jdbc:postgresql://" + spec, user, password) |
|
316 new Database(user + "@" + spec, connection, port_forwarding) |
|
317 } |
|
318 catch { case exn: Throwable => port_forwarding.foreach(_.close); throw exn } |
|
319 } |
|
320 |
|
321 class Database private[PostgreSQL]( |
|
322 name: String, val connection: Connection, port_forwarding: Option[SSH.Port_Forwarding]) |
|
323 extends SQL.Database |
|
324 { |
|
325 override def toString: String = |
|
326 port_forwarding match { |
|
327 case None => name |
|
328 case Some(fw) => name + " via ssh " + fw.ssh |
|
329 } |
312 |
330 |
313 override def type_name(t: SQL.Type.Value): String = |
331 override def type_name(t: SQL.Type.Value): String = |
314 if (t == SQL.Type.Bytes) "BYTEA" |
332 if (t == SQL.Type.Bytes) "BYTEA" |
315 else SQL.default_type_name(t) |
333 else SQL.default_type_name(t) |
|
334 |
|
335 override def close() { super.close; port_forwarding.foreach(_.close) } |
316 } |
336 } |
317 } |
337 } |