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