src/Pure/Thy/export.scala
changeset 75786 ff6c1a82270f
parent 75784 d31193963e2d
child 75787 f9fcf06aa2eb
equal deleted inserted replaced
75785:16135603d9c7 75786:ff6c1a82270f
   239       errors.value.reverse ::: (if (progress.stopped) List("Export stopped") else Nil)
   239       errors.value.reverse ::: (if (progress.stopped) List("Export stopped") else Nil)
   240     }
   240     }
   241   }
   241   }
   242 
   242 
   243 
   243 
   244   /* context for retrieval */
   244   /* context for database access */
   245 
   245 
   246   def context(db_context: Sessions.Database_Context): Context = new Context(db_context)
   246   class Session_Database private[Export](val session: String, val db: SQL.Database) {
   247 
   247     def close(): Unit = ()
   248   def open_context(store: Sessions.Store): Context =
   248 
   249     new Context(store.open_database_context()) { override def close(): Unit = db_context.close() }
   249     lazy val theory_names: List[String] = read_theory_names(db, session)
       
   250     lazy val entry_names: List[Entry_Name] = read_entry_names(db, session)
       
   251   }
       
   252 
       
   253   def open_database_context(store: Sessions.Store): Database_Context = {
       
   254     val database_server = if (store.database_server) Some(store.open_database_server()) else None
       
   255     new Database_Context(store, database_server)
       
   256   }
   250 
   257 
   251   def open_session_context0(store: Sessions.Store, session: String): Session_Context =
   258   def open_session_context0(store: Sessions.Store, session: String): Session_Context =
   252     open_context(store).open_session0(session, close_context = true)
   259     open_database_context(store).open_session0(session, close_database_context = true)
   253 
   260 
   254   def open_session_context(
   261   def open_session_context(
   255     store: Sessions.Store,
   262     store: Sessions.Store,
   256     session_base_info: Sessions.Base_Info,
   263     session_base_info: Sessions.Base_Info,
   257     document_snapshot: Option[Document.Snapshot] = None
   264     document_snapshot: Option[Document.Snapshot] = None
   258   ): Session_Context = {
   265   ): Session_Context = {
   259     open_context(store).open_session(
   266     open_database_context(store).open_session(
   260       session_base_info, document_snapshot = document_snapshot, close_context = true)
   267       session_base_info, document_snapshot = document_snapshot, close_database_context = true)
   261   }
   268   }
   262 
   269 
   263   class Session_Database private[Export](val session: String, val db: SQL.Database) {
   270   class Database_Context private[Export](
   264     def close(): Unit = ()
   271     val store: Sessions.Store,
   265 
   272     val database_server: Option[SQL.Database]
   266     lazy val theory_names: List[String] = read_theory_names(db, session)
   273   ) extends AutoCloseable {
   267     lazy val entry_names: List[Entry_Name] = read_entry_names(db, session)
   274     database_context =>
   268   }
   275 
   269 
   276     override def toString: String = {
   270   class Context private[Export](protected val db_context: Sessions.Database_Context)
   277       val s =
   271   extends AutoCloseable {
   278         database_server match {
   272     context =>
   279           case Some(db) => db.toString
   273 
   280           case None => "input_dirs = " + store.input_dirs.map(_.absolute).mkString(", ")
   274     override def toString: String = db_context.toString
   281         }
   275 
   282       "Database_Context(" + s + ")"
   276     def cache: Term.Cache = db_context.cache
   283     }
   277 
   284 
   278     def close(): Unit = ()
   285     def cache: Term.Cache = store.cache
   279 
   286 
   280     def open_session0(session: String, close_context: Boolean = false): Session_Context =
   287     def close(): Unit = database_server.foreach(_.close())
   281       open_session(Sessions.base_info0(session), close_context = close_context)
   288 
       
   289     def database_output[A](session: String)(f: SQL.Database => A): A =
       
   290       database_server match {
       
   291         case Some(db) => f(db)
       
   292         case None => using(store.open_database(session, output = true))(f)
       
   293       }
       
   294 
       
   295     def open_session0(session: String, close_database_context: Boolean = false): Session_Context =
       
   296       open_session(Sessions.base_info0(session), close_database_context = close_database_context)
   282 
   297 
   283     def open_session(
   298     def open_session(
   284       session_base_info: Sessions.Base_Info,
   299       session_base_info: Sessions.Base_Info,
   285       document_snapshot: Option[Document.Snapshot] = None,
   300       document_snapshot: Option[Document.Snapshot] = None,
   286       close_context: Boolean = false
   301       close_database_context: Boolean = false
   287     ): Session_Context = {
   302     ): Session_Context = {
   288       val session_name = session_base_info.check.base.session_name
   303       val session_name = session_base_info.check.base.session_name
   289       val session_hierarchy = session_base_info.sessions_structure.build_hierarchy(session_name)
   304       val session_hierarchy = session_base_info.sessions_structure.build_hierarchy(session_name)
   290       val session_databases =
   305       val session_databases =
   291         db_context.database_server match {
   306         database_server match {
   292           case Some(db) => session_hierarchy.map(name => new Session_Database(name, db))
   307           case Some(db) => session_hierarchy.map(name => new Session_Database(name, db))
   293           case None =>
   308           case None =>
   294             val store = db_context.store
       
   295             val attempts =
   309             val attempts =
   296               session_hierarchy.map(name => name -> store.try_open_database(name, server = false))
   310               session_hierarchy.map(name => name -> store.try_open_database(name, server = false))
   297             attempts.collectFirst({ case (name, None) => name }) match {
   311             attempts.collectFirst({ case (name, None) => name }) match {
   298               case Some(bad) =>
   312               case Some(bad) =>
   299                 for ((_, Some(db)) <- attempts) db.close()
   313                 for ((_, Some(db)) <- attempts) db.close()
   302                 for ((name, Some(db)) <- attempts) yield {
   316                 for ((name, Some(db)) <- attempts) yield {
   303                   new Session_Database(name, db) { override def close(): Unit = this.db.close() }
   317                   new Session_Database(name, db) { override def close(): Unit = this.db.close() }
   304                 }
   318                 }
   305             }
   319             }
   306         }
   320         }
   307       new Session_Context(context, session_base_info, session_databases, document_snapshot) {
   321       new Session_Context(database_context, session_base_info, session_databases, document_snapshot) {
   308         override def close(): Unit = {
   322         override def close(): Unit = {
   309           session_databases.foreach(_.close())
   323           session_databases.foreach(_.close())
   310           if (close_context) context.close()
   324           if (close_database_context) database_context.close()
   311         }
   325         }
   312       }
   326       }
   313     }
   327     }
   314   }
   328   }
   315 
   329 
   316   class Session_Context private[Export](
   330   class Session_Context private[Export](
   317     val export_context: Context,
   331     val database_context: Database_Context,
   318     session_base_info: Sessions.Base_Info,
   332     session_base_info: Sessions.Base_Info,
   319     db_hierarchy: List[Session_Database],
   333     db_hierarchy: List[Session_Database],
   320     document_snapshot: Option[Document.Snapshot]
   334     document_snapshot: Option[Document.Snapshot]
   321   ) extends AutoCloseable {
   335   ) extends AutoCloseable {
   322     session_context =>
   336     session_context =>
   323 
   337 
   324     def close(): Unit = ()
   338     def close(): Unit = ()
   325 
   339 
   326     def cache: Term.Cache = export_context.cache
   340     def cache: Term.Cache = database_context.cache
   327 
   341 
   328     def sessions_structure: Sessions.Structure = session_base_info.sessions_structure
   342     def sessions_structure: Sessions.Structure = session_base_info.sessions_structure
   329 
   343 
   330     def session_base: Sessions.Base = session_base_info.base
   344     def session_base: Sessions.Base = session_base_info.base
   331 
   345