src/Pure/General/sql.scala
changeset 65010 a27e9908dcf7
parent 65009 eda9366bbfac
child 65011 42bffd1637f0
equal deleted inserted replaced
65009:eda9366bbfac 65010:a27e9908dcf7
   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