src/Pure/Tools/server.scala
changeset 66349 66b843e4cff5
parent 66348 a426e826e84c
child 66350 66331026a2fc
equal deleted inserted replaced
66348:a426e826e84c 66349:66b843e4cff5
    15 {
    15 {
    16   /* per-user servers */
    16   /* per-user servers */
    17 
    17 
    18   object Data
    18   object Data
    19   {
    19   {
    20     val database = Path.explode("$ISABELLE_HOME_USER/server.db")
    20     val database = Path.explode("$ISABELLE_HOME_USER/servers.db")
    21 
    21 
    22     val server_name = SQL.Column.string("server_name", primary_key = true)
    22     val name = SQL.Column.string("name", primary_key = true)
    23     val server_port = SQL.Column.int("server_port")
    23     val port = SQL.Column.int("port")
    24     val password = SQL.Column.string("password")
    24     val password = SQL.Column.string("password")
    25     val table = SQL.Table("isabelle_servers", List(server_name, server_port, password))
    25     val table = SQL.Table("isabelle_servers", List(name, port, password))
    26 
    26 
    27     sealed case class Entry(server_name: String, server_port: Int, password: String)
    27     sealed case class Entry(name: String, port: Int, password: String)
    28     {
    28     {
    29       def print: String =
    29       def print: String =
    30         "server " + quote(server_name) + " = 127.0.0.1:" + server_port +
    30         "server " + quote(name) + " = 127.0.0.1:" + port + " (password " + quote(password) + ")"
    31         " (password " + quote(password) + ")"
       
    32     }
    31     }
    33   }
    32   }
    34 
    33 
    35   def list(): List[Data.Entry] =
    34   def list(): List[Data.Entry] =
    36     using(SQLite.open_database(Data.database))(list(_))
    35     using(SQLite.open_database(Data.database))(list(_))
    38   def list(db: SQLite.Database): List[Data.Entry] =
    37   def list(db: SQLite.Database): List[Data.Entry] =
    39     if (db.tables.contains(Data.table.name)) {
    38     if (db.tables.contains(Data.table.name)) {
    40       db.using_statement(Data.table.select())(stmt =>
    39       db.using_statement(Data.table.select())(stmt =>
    41         stmt.execute_query().iterator(res =>
    40         stmt.execute_query().iterator(res =>
    42           Data.Entry(
    41           Data.Entry(
    43             res.string(Data.server_name),
    42             res.string(Data.name),
    44             res.int(Data.server_port),
    43             res.int(Data.port),
    45             res.string(Data.password))).toList.sortBy(_.server_name))
    44             res.string(Data.password))).toList.sortBy(_.name))
    46     }
    45     }
    47     else Nil
    46     else Nil
    48 
    47 
    49   def find(db: SQLite.Database, name: String): Option[Data.Entry] =
    48   def find(db: SQLite.Database, name: String): Option[Data.Entry] =
    50     list(db).find(entry => entry.server_name == name)
    49     list(db).find(entry => entry.name == name)
    51 
    50 
    52   def start(name: String = "", port: Int = 0, password: String = ""): (Data.Entry, Option[Thread]) =
    51   def start(name: String = "", port: Int = 0, password: String = ""): (Data.Entry, Option[Thread]) =
    53   {
    52   {
    54     using(SQLite.open_database(Data.database))(db =>
    53     using(SQLite.open_database(Data.database))(db =>
    55       db.transaction {
    54       db.transaction {
    61 
    60 
    62             Isabelle_System.bash("chmod 600 " + File.bash_path(Data.database)).check
    61             Isabelle_System.bash("chmod 600 " + File.bash_path(Data.database)).check
    63             db.create_table(Data.table)
    62             db.create_table(Data.table)
    64             db.using_statement(Data.table.insert())(stmt =>
    63             db.using_statement(Data.table.insert())(stmt =>
    65             {
    64             {
    66               stmt.string(1) = entry.server_name
    65               stmt.string(1) = entry.name
    67               stmt.int(2) = entry.server_port
    66               stmt.int(2) = entry.port
    68               stmt.string(3) = entry.password
    67               stmt.string(3) = entry.password
    69               stmt.execute()
    68               stmt.execute()
    70             })
    69             })
    71 
    70 
    72             (entry, Some(server.thread))
    71             (entry, Some(server.thread))
    79     using(SQLite.open_database(Data.database))(db =>
    78     using(SQLite.open_database(Data.database))(db =>
    80       db.transaction {
    79       db.transaction {
    81         find(db, name) match {
    80         find(db, name) match {
    82           case Some(entry) =>
    81           case Some(entry) =>
    83             // FIXME shutdown server
    82             // FIXME shutdown server
    84             db.using_statement(Data.table.delete(Data.server_name.where_equal(name)))(_.execute)
    83             db.using_statement(Data.table.delete(Data.name.where_equal(name)))(_.execute)
    85             true
    84             true
    86           case None =>
    85           case None =>
    87             false
    86             false
    88         }
    87         }
    89       })
    88       })