src/Pure/Thy/sessions.scala
changeset 72634 5cea0993ee4f
parent 72627 8d83acc5062e
child 72647 fd6dc1a4b9ca
equal deleted inserted replaced
72628:5e616a454b23 72634:5cea0993ee4f
  1169 
  1169 
  1170   def store(options: Options): Store = new Store(options)
  1170   def store(options: Options): Store = new Store(options)
  1171 
  1171 
  1172   class Store private[Sessions](val options: Options)
  1172   class Store private[Sessions](val options: Options)
  1173   {
  1173   {
  1174     override def toString: String = "Store(output_dir = " + output_dir.expand + ")"
  1174     store =>
       
  1175 
       
  1176     override def toString: String = "Store(output_dir = " + output_dir.absolute + ")"
  1175 
  1177 
  1176     val xml_cache: XML.Cache = XML.make_cache()
  1178     val xml_cache: XML.Cache = XML.make_cache()
  1177     val xz_cache: XZ.Cache = XZ.make_cache()
  1179     val xz_cache: XZ.Cache = XZ.make_cache()
  1178 
  1180 
  1179 
  1181 
  1225           cat_lines(input_dirs.map(dir => "  " + dir.expand.implode)))
  1227           cat_lines(input_dirs.map(dir => "  " + dir.expand.implode)))
  1226 
  1228 
  1227 
  1229 
  1228     /* database */
  1230     /* database */
  1229 
  1231 
  1230     private def database_server: Boolean = options.bool("build_database_server")
  1232     def database_server: Boolean = options.bool("build_database_server")
  1231 
  1233 
  1232     def access_database(name: String, output: Boolean = false): Option[SQL.Database] =
  1234     def open_database_server(): SQL.Database =
  1233     {
  1235       PostgreSQL.open_database(
  1234       if (database_server) {
  1236         user = options.string("build_database_user"),
  1235         val db =
  1237         password = options.string("build_database_password"),
  1236           PostgreSQL.open_database(
  1238         database = options.string("build_database_name"),
  1237             user = options.string("build_database_user"),
  1239         host = options.string("build_database_host"),
  1238             password = options.string("build_database_password"),
  1240         port = options.int("build_database_port"),
  1239             database = options.string("build_database_name"),
  1241         ssh =
  1240             host = options.string("build_database_host"),
  1242           options.proper_string("build_database_ssh_host").map(ssh_host =>
  1241             port = options.int("build_database_port"),
  1243             SSH.open_session(options,
  1242             ssh =
  1244               host = ssh_host,
  1243               options.proper_string("build_database_ssh_host").map(ssh_host =>
  1245               user = options.string("build_database_ssh_user"),
  1244                 SSH.open_session(options,
  1246               port = options.int("build_database_ssh_port"))),
  1245                   host = ssh_host,
  1247         ssh_close = true)
  1246                   user = options.string("build_database_ssh_user"),
  1248 
  1247                   port = options.int("build_database_ssh_port"))),
  1249     def try_open_database(name: String, output: Boolean = false): Option[SQL.Database] =
  1248             ssh_close = true)
  1250     {
  1249         if (output || has_session_info(db, name)) Some(db) else { db.close; None }
  1251       def check(db: SQL.Database): Option[SQL.Database] =
  1250       }
  1252         if (output || session_info_exists(db)) Some(db) else { db.close; None }
       
  1253 
       
  1254       if (database_server) check(open_database_server())
  1251       else if (output) Some(SQLite.open_database(output_database(name)))
  1255       else if (output) Some(SQLite.open_database(output_database(name)))
  1252       else input_dirs.map(_ + database(name)).find(_.is_file).map(SQLite.open_database)
  1256       else {
       
  1257         (for {
       
  1258           dir <- input_dirs.view
       
  1259           path = dir + database(name) if path.is_file
       
  1260           db <- check(SQLite.open_database(path))
       
  1261         } yield db).headOption
       
  1262       }
  1253     }
  1263     }
  1254 
  1264 
  1255     def open_database(name: String, output: Boolean = false): SQL.Database =
  1265     def open_database(name: String, output: Boolean = false): SQL.Database =
  1256       access_database(name, output = output) getOrElse
  1266       try_open_database(name, output = output) getOrElse
  1257         error("Missing build database for session " + quote(name))
  1267         error("Missing build database for session " + quote(name))
  1258 
  1268 
  1259     def clean_output(name: String): (Boolean, Boolean) =
  1269     def clean_output(name: String): (Boolean, Boolean) =
  1260     {
  1270     {
  1261       val relevant_db =
  1271       val relevant_db =
  1262         database_server &&
  1272         database_server &&
  1263         {
  1273         {
  1264           access_database(name) match {
  1274           try_open_database(name) match {
  1265             case Some(db) =>
  1275             case Some(db) =>
  1266               try {
  1276               try {
  1267                 db.transaction {
  1277                 db.transaction {
  1268                   val relevant_db = has_session_info(db, name)
  1278                   val relevant_db = session_info_defined(db, name)
  1269                   init_session_info(db, name)
  1279                   init_session_info(db, name)
  1270                   relevant_db
  1280                   relevant_db
  1271                 }
  1281                 }
  1272               } finally { db.close }
  1282               } finally { db.close }
  1273             case None => false
  1283             case None => false
  1316         db.using_statement(
  1326         db.using_statement(
  1317           Export.Data.table.delete(Export.Data.session_name.where_equal(name)))(_.execute)
  1327           Export.Data.table.delete(Export.Data.session_name.where_equal(name)))(_.execute)
  1318       }
  1328       }
  1319     }
  1329     }
  1320 
  1330 
  1321     def has_session_info(db: SQL.Database, name: String): Boolean =
  1331     def session_info_exists(db: SQL.Database): Boolean =
  1322     {
  1332     {
       
  1333       val tables = db.tables
       
  1334       tables.contains(Session_Info.table.name) &&
       
  1335       tables.contains(Export.Data.table.name)
       
  1336     }
       
  1337 
       
  1338     def session_info_defined(db: SQL.Database, name: String): Boolean =
  1323       db.transaction {
  1339       db.transaction {
  1324         db.tables.contains(Session_Info.table.name) &&
  1340         session_info_exists(db) &&
  1325         {
  1341         {
  1326           db.using_statement(
  1342           db.using_statement(
  1327             Session_Info.table.select(List(Session_Info.session_name),
  1343             Session_Info.table.select(List(Session_Info.session_name),
  1328               Session_Info.session_name.where_equal(name)))(stmt => stmt.execute_query().next())
  1344               Session_Info.session_name.where_equal(name)))(stmt => stmt.execute_query().next())
  1329         }
  1345         }
  1330       }
  1346       }
  1331     }
       
  1332 
  1347 
  1333     def write_session_info(
  1348     def write_session_info(
  1334       db: SQL.Database,
  1349       db: SQL.Database,
  1335       name: String,
  1350       name: String,
  1336       build_log: Build_Log.Session_Info,
  1351       build_log: Build_Log.Session_Info,