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 }) |