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