misc tuning and clarification: more uniform use of optional "sql" in SQL.Table.delete/select;
authorwenzelm
Sun, 26 Feb 2023 20:19:01 +0100
changeset 77381 a86e346b20d8
parent 77380 b9d9658131b0
child 77382 f4f9f987e7f2
misc tuning and clarification: more uniform use of optional "sql" in SQL.Table.delete/select;
src/Pure/Admin/build_log.scala
src/Pure/Admin/build_status.scala
src/Pure/General/sql.scala
src/Pure/Thy/document_build.scala
src/Pure/Thy/export.scala
src/Pure/Thy/sessions.scala
src/Pure/Tools/build_process.scala
src/Pure/Tools/server.scala
--- a/src/Pure/Admin/build_log.scala	Sun Feb 26 19:18:24 2023 +0100
+++ b/src/Pure/Admin/build_log.scala	Sun Feb 26 20:19:01 2023 +0100
@@ -723,7 +723,7 @@
       val eq_rev2 = if_proper(rev2, Prop.afp_version(table).equal(rev2))
 
       SQL.Table("recent_pull_date", table.columns,
-        table.select(table.columns,
+        table.select(table.columns, sql =
           SQL.where(
             SQL.or(pull_date(afp)(table).ident + " > " + recent_time(days),
               SQL.and(eq_rev, eq_rev2)))))
@@ -732,8 +732,9 @@
     def select_recent_log_names(days: Int): PostgreSQL.Source = {
       val table1 = meta_info_table
       val table2 = recent_pull_date_table(days)
-      table1.select(List(log_name), distinct = true) + SQL.join_inner + table2.query_named +
-        " ON " + Prop.isabelle_version(table1) + " = " + Prop.isabelle_version(table2)
+      table1.select(List(log_name), distinct = true, sql =
+        SQL.join_inner + table2.query_named +
+        " ON " + Prop.isabelle_version(table1) + " = " + Prop.isabelle_version(table2))
     }
 
     def select_recent_versions(
@@ -1035,7 +1036,7 @@
     def read_meta_info(db: SQL.Database, log_name: String): Option[Meta_Info] = {
       val table = Data.meta_info_table
       val columns = table.columns.tail
-      db.using_statement(table.select(columns, Data.log_name.where_equal(log_name))) { stmt =>
+      db.using_statement(table.select(columns, sql = Data.log_name.where_equal(log_name))) { stmt =>
         val res = stmt.execute_query()
         if (!res.next()) None
         else {
--- a/src/Pure/Admin/build_status.scala	Sun Feb 26 19:18:24 2023 +0100
+++ b/src/Pure/Admin/build_status.scala	Sun Feb 26 20:19:01 2023 +0100
@@ -36,8 +36,8 @@
       columns: List[SQL.Column],
       only_sessions: Set[String]
     ): PostgreSQL.Source = {
-      Build_Log.Data.universal_table.select(columns, distinct = true,
-        sql = "WHERE " +
+      Build_Log.Data.universal_table.select(columns, distinct = true, sql =
+        "WHERE " +
           Build_Log.Data.pull_date(afp) + " > " + Build_Log.Data.recent_time(days(options)) +
           " AND " +
           Build_Log.Data.status.member(
--- a/src/Pure/General/sql.scala	Sun Feb 26 19:18:24 2023 +0100
+++ b/src/Pure/General/sql.scala	Sun Feb 26 20:19:01 2023 +0100
@@ -47,6 +47,9 @@
   def enclose(s: Source): Source = "(" + s + ")"
   def enclosure(ss: Iterable[Source]): Source = ss.mkString("(", ", ", ")")
 
+  def separate(sql: Source): Source =
+    (if (sql.isEmpty || sql.startsWith(" ")) "" else " ") + sql
+
   def select(columns: List[Column] = Nil, distinct: Boolean = false): Source =
     "SELECT " + (if (distinct) "DISTINCT " else "") +
     (if (columns.isEmpty) "*" else commas(columns.map(_.ident))) + " FROM "
@@ -77,9 +80,6 @@
 
   def where(sql: Source): Source = if_proper(sql, " WHERE " + sql)
 
-  def separate(sql: Source): Source =
-    (if (sql.isEmpty || sql.startsWith(" ")) "" else " ") + sql
-
 
   /* types */
 
@@ -200,8 +200,10 @@
       "DELETE FROM " + ident + SQL.separate(sql)
 
     def select(
-        select_columns: List[Column] = Nil, sql: Source = "", distinct: Boolean = false): Source =
-      SQL.select(select_columns, distinct = distinct) + ident + SQL.separate(sql)
+      select_columns: List[Column] = Nil,
+      distinct: Boolean = false,
+      sql: Source = ""
+    ): Source = SQL.select(select_columns, distinct = distinct) + ident + SQL.separate(sql)
 
     override def toString: Source = ident
   }
--- a/src/Pure/Thy/document_build.scala	Sun Feb 26 19:18:24 2023 +0100
+++ b/src/Pure/Thy/document_build.scala	Sun Feb 26 20:19:01 2023 +0100
@@ -70,23 +70,23 @@
           if_proper(name, Data.name.equal(name))))
   }
 
-  def read_documents(db: SQL.Database, session_name: String): List[Document_Input] = {
-    val select = Data.table.select(List(Data.name, Data.sources), Data.where_equal(session_name))
-    db.using_statement(select)(stmt =>
-      stmt.execute_query().iterator({ res =>
-        val name = res.string(Data.name)
-        val sources = res.string(Data.sources)
-        Document_Input(name, SHA1.fake_shasum(sources))
-      }).toList)
-  }
+  def read_documents(db: SQL.Database, session_name: String): List[Document_Input] =
+    db.using_statement(
+      Data.table.select(List(Data.name, Data.sources), sql = Data.where_equal(session_name))
+    ) { stmt =>
+        (stmt.execute_query().iterator { res =>
+          val name = res.string(Data.name)
+          val sources = res.string(Data.sources)
+          Document_Input(name, SHA1.fake_shasum(sources))
+        }).toList
+      }
 
   def read_document(
     db: SQL.Database,
     session_name: String,
     name: String
   ): Option[Document_Output] = {
-    val select = Data.table.select(sql = Data.where_equal(session_name, name))
-    db.using_statement(select)({ stmt =>
+    db.using_statement(Data.table.select(sql = Data.where_equal(session_name, name))) { stmt =>
       val res = stmt.execute_query()
       if (res.next()) {
         val name = res.string(Data.name)
@@ -96,7 +96,7 @@
         Some(Document_Output(name, SHA1.fake_shasum(sources), log_xz, pdf))
       }
       else None
-    })
+    }
   }
 
   def write_document(db: SQL.Database, session_name: String, doc: Document_Output): Unit = {
--- a/src/Pure/Thy/export.scala	Sun Feb 26 19:18:24 2023 +0100
+++ b/src/Pure/Thy/export.scala	Sun Feb 26 20:19:01 2023 +0100
@@ -64,15 +64,15 @@
     }
 
     def readable(db: SQL.Database): Boolean = {
-      val select = Data.table.select(List(Data.name), Data.where_equal(session, theory, name))
-      db.using_statement(select)(stmt => stmt.execute_query().next())
+      db.using_statement(
+        Data.table.select(List(Data.name),
+          sql = Data.where_equal(session, theory, name)))(_.execute_query().next())
     }
 
-    def read(db: SQL.Database, cache: XML.Cache): Option[Entry] = {
-      val select =
+    def read(db: SQL.Database, cache: XML.Cache): Option[Entry] =
+      db.using_statement(
         Data.table.select(List(Data.executable, Data.compressed, Data.body),
-          Data.where_equal(session, theory, name))
-      db.using_statement(select) { stmt =>
+          sql = Data.where_equal(session, theory, name))) { stmt =>
         val res = stmt.execute_query()
         if (res.next()) {
           val executable = res.bool(Data.executable)
@@ -83,27 +83,24 @@
         }
         else None
       }
-    }
-  }
-
-  def read_theory_names(db: SQL.Database, session_name: String): List[String] = {
-    val select =
-      Data.table.select(List(Data.theory_name), Data.where_equal(session_name), distinct = true) +
-      SQL.order_by(List(Data.theory_name))
-    db.using_statement(select)(stmt =>
-      stmt.execute_query().iterator(_.string(Data.theory_name)).toList)
   }
 
-  def read_entry_names(db: SQL.Database, session_name: String): List[Entry_Name] = {
-    val select =
-      Data.table.select(List(Data.theory_name, Data.name), Data.where_equal(session_name)) +
-      SQL.order_by(List(Data.theory_name, Data.name))
-    db.using_statement(select)(stmt =>
-      stmt.execute_query().iterator(res =>
-        Entry_Name(session = session_name,
-          theory = res.string(Data.theory_name),
-          name = res.string(Data.name))).toList)
-  }
+  def read_theory_names(db: SQL.Database, session_name: String): List[String] =
+    db.using_statement(
+      Data.table.select(List(Data.theory_name), distinct = true,
+        sql = Data.where_equal(session_name) + SQL.order_by(List(Data.theory_name)))
+    ) { stmt => stmt.execute_query().iterator(_.string(Data.theory_name)).toList }
+
+  def read_entry_names(db: SQL.Database, session_name: String): List[Entry_Name] =
+    db.using_statement(
+      Data.table.select(List(Data.theory_name, Data.name),
+        sql = Data.where_equal(session_name)) + SQL.order_by(List(Data.theory_name, Data.name))
+    ) { stmt =>
+        stmt.execute_query().iterator(res =>
+          Entry_Name(session = session_name,
+            theory = res.string(Data.theory_name),
+            name = res.string(Data.name))).toList
+      }
 
   def message(msg: String, theory_name: String, name: String): String =
     msg + " " + quote(name) + " for theory " + quote(theory_name)
--- a/src/Pure/Thy/sessions.scala	Sun Feb 26 19:18:24 2023 +0100
+++ b/src/Pure/Thy/sessions.scala	Sun Feb 26 20:19:01 2023 +0100
@@ -1512,8 +1512,9 @@
     /* SQL database content */
 
     def read_bytes(db: SQL.Database, name: String, column: SQL.Column): Bytes =
-      db.using_statement(Session_Info.table.select(List(column),
-        Session_Info.session_name.where_equal(name))) { stmt =>
+      db.using_statement(
+        Session_Info.table.select(List(column),
+          sql = Session_Info.session_name.where_equal(name))) { stmt =>
         val res = stmt.execute_query()
         if (!res.next()) Bytes.empty else res.bytes(column)
       }
@@ -1528,22 +1529,22 @@
       db.transaction {
         db.create_table(Session_Info.table)
         db.using_statement(
-          Session_Info.table.delete(Session_Info.session_name.where_equal(name)))(_.execute())
+          Session_Info.table.delete(sql = Session_Info.session_name.where_equal(name)))(_.execute())
         if (db.isInstanceOf[PostgreSQL.Database]) {
           db.using_statement(Session_Info.augment_table)(_.execute())
         }
 
         db.create_table(Sources.table)
-        db.using_statement(Sources.table.delete(Sources.where_equal(name)))(_.execute())
+        db.using_statement(Sources.table.delete(sql = Sources.where_equal(name)))(_.execute())
 
         db.create_table(Export.Data.table)
         db.using_statement(
-          Export.Data.table.delete(Export.Data.session_name.where_equal(name)))(_.execute())
+          Export.Data.table.delete(sql = Export.Data.session_name.where_equal(name)))(_.execute())
 
         db.create_table(Document_Build.Data.table)
         db.using_statement(
           Document_Build.Data.table.delete(
-            Document_Build.Data.session_name.where_equal(name)))(_.execute())
+            sql = Document_Build.Data.session_name.where_equal(name)))(_.execute())
       }
     }
 
@@ -1557,7 +1558,7 @@
       session_info_exists(db) && {
         db.using_statement(
           Session_Info.table.select(List(Session_Info.session_name),
-            Session_Info.session_name.where_equal(name)))(stmt => stmt.execute_query().next())
+            sql = Session_Info.session_name.where_equal(name)))(_.execute_query().next())
       }
 
     def write_session_info(
@@ -1610,8 +1611,8 @@
 
     def read_build(db: SQL.Database, name: String): Option[Build_Info] = {
       if (db.tables.contains(Session_Info.table.name)) {
-        db.using_statement(Session_Info.table.select(Nil,
-          Session_Info.session_name.where_equal(name))) { stmt =>
+        db.using_statement(
+          Session_Info.table.select(sql = Session_Info.session_name.where_equal(name))) { stmt =>
           val res = stmt.execute_query()
           if (!res.next()) None
           else {
@@ -1652,18 +1653,18 @@
       session_name: String,
       name: String = ""
     ): List[Source_File] = {
-      val select =
-        Sources.table.select(Nil,
+      db.using_statement(
+        Sources.table.select(sql =
           Sources.where_equal(session_name, name = name) + SQL.order_by(List(Sources.name)))
-      db.using_statement(select) { stmt =>
-        (stmt.execute_query().iterator { res =>
-          val res_name = res.string(Sources.name)
-          val digest = SHA1.fake_digest(res.string(Sources.digest))
-          val compressed = res.bool(Sources.compressed)
-          val body = res.bytes(Sources.body)
-          Source_File(res_name, digest, compressed, body, cache.compress)
-        }).toList
-      }
+      ) { stmt =>
+          (stmt.execute_query().iterator { res =>
+            val res_name = res.string(Sources.name)
+            val digest = SHA1.fake_digest(res.string(Sources.digest))
+            val compressed = res.bool(Sources.compressed)
+            val body = res.bytes(Sources.body)
+            Source_File(res_name, digest, compressed, body, cache.compress)
+          }).toList
+        }
     }
   }
 }
--- a/src/Pure/Tools/build_process.scala	Sun Feb 26 19:18:24 2023 +0100
+++ b/src/Pure/Tools/build_process.scala	Sun Feb 26 20:19:01 2023 +0100
@@ -302,7 +302,7 @@
     }
 
     def read_pending(db: SQL.Database): List[Entry] =
-      db.using_statement(Pending.table.select() + SQL.order_by(List(Pending.name))) { stmt =>
+      db.using_statement(Pending.table.select(sql = SQL.order_by(List(Pending.name)))) { stmt =>
         List.from(
           stmt.execute_query().iterator { res =>
             val name = res.string(Pending.name)
@@ -318,8 +318,8 @@
 
       if (delete.nonEmpty) {
         db.using_statement(
-          Pending.table.delete() + SQL.where(Generic.sql_member(names = delete.map(_.name)))
-        )(_.execute())
+          Pending.table.delete(
+            sql = SQL.where(Generic.sql_member(names = delete.map(_.name)))))(_.execute())
       }
 
       for (entry <- insert) {
@@ -335,7 +335,7 @@
     }
 
     def read_running(db: SQL.Database): List[Build_Job.Abstract] =
-      db.using_statement(Running.table.select() + SQL.order_by(List(Running.name))) { stmt =>
+      db.using_statement(Running.table.select(sql = SQL.order_by(List(Running.name)))) { stmt =>
         List.from(
           stmt.execute_query().iterator { res =>
             val name = res.string(Running.name)
@@ -353,8 +353,8 @@
 
       if (delete.nonEmpty) {
         db.using_statement(
-          Running.table.delete() + SQL.where(Generic.sql_member(names = delete.map(_.job_name)))
-        )(_.execute())
+          Running.table.delete(
+            sql = SQL.where(Generic.sql_member(names = delete.map(_.job_name)))))(_.execute())
       }
 
       for (job <- insert) {
@@ -371,8 +371,7 @@
 
     def read_results(db: SQL.Database, names: List[String] = Nil): Map[String, Build_Job.Result] =
       db.using_statement(
-        Results.table.select() + if_proper(names, Results.name.where_member(names))
-      ) { stmt =>
+        Results.table.select(sql = if_proper(names, Results.name.where_member(names)))) { stmt =>
         Map.from(
           stmt.execute_query().iterator { res =>
             val name = res.string(Results.name)
@@ -395,9 +394,8 @@
       }
 
     def read_results_name(db: SQL.Database): Set[String] =
-      db.using_statement(Results.table.select(List(Results.name))) { stmt =>
-        Set.from(stmt.execute_query().iterator(_.string(Results.name)))
-      }
+      db.using_statement(Results.table.select(List(Results.name)))(stmt =>
+        Set.from(stmt.execute_query().iterator(_.string(Results.name))))
 
     def update_results(db: SQL.Database, results: Map[String, Build_Process.Result]): Boolean = {
       val old_results = read_results_name(db)
@@ -433,27 +431,26 @@
 
     def read_state(db: SQL.Database, instance: String): (Long, Int) =
       db.using_statement(
-        State.table.select() + SQL.where(Generic.sql_equal(instance = instance))
+        State.table.select(sql = SQL.where(Generic.sql_equal(instance = instance)))
       ) { stmt =>
-        (stmt.execute_query().iterator { res =>
-          val serial = res.long(State.serial)
-          val numa_index = res.int(State.numa_index)
-          (serial, numa_index)
-        }).nextOption.getOrElse(error("No build state instance " + instance + " in database " + db))
-      }
+          (stmt.execute_query().iterator { res =>
+            val serial = res.long(State.serial)
+            val numa_index = res.int(State.numa_index)
+            (serial, numa_index)
+          }).nextOption.getOrElse(error("No build state instance " + instance + " in database " + db))
+        }
 
-    def write_state(db: SQL.Database, instance: String, serial: Long, numa_index: Int): Unit = {
+    def write_state(db: SQL.Database, instance: String, serial: Long, numa_index: Int): Unit =
       db.using_statement(State.table.insert()) { stmt =>
         stmt.string(1) = instance
         stmt.long(2) = serial
         stmt.int(3) = numa_index
         stmt.execute()
       }
-    }
 
     def reset_state(db: SQL.Database, instance: String): Unit =
       db.using_statement(
-        State.table.delete() + SQL.where(Generic.sql_equal(instance = instance)))(_.execute())
+        State.table.delete(sql = SQL.where(Generic.sql_equal(instance = instance))))(_.execute())
 
     def init_database(db: SQL.Database, build_context: Build_Process.Context): Unit = {
       val tables =
--- a/src/Pure/Tools/server.scala	Sun Feb 26 19:18:24 2023 +0100
+++ b/src/Pure/Tools/server.scala	Sun Feb 26 20:19:01 2023 +0100
@@ -367,12 +367,13 @@
 
   def list(db: SQLite.Database): List[Info] =
     if (db.tables.contains(Data.table.name)) {
-      db.using_statement(Data.table.select())(stmt =>
+      db.using_statement(Data.table.select()) { stmt =>
         stmt.execute_query().iterator(res =>
           Info(
             res.string(Data.name),
             res.int(Data.port),
-            res.string(Data.password))).toList.sortBy(_.name))
+            res.string(Data.password))).toList.sortBy(_.name)
+      }
     }
     else Nil
 
@@ -390,8 +391,8 @@
         Isabelle_System.chmod("600", Data.database)
         db.create_table(Data.table)
         list(db).filterNot(_.active).foreach(server_info =>
-          db.using_statement(Data.table.delete(Data.name.where_equal(server_info.name)))(
-            _.execute()))
+          db.using_statement(
+            Data.table.delete(sql = Data.name.where_equal(server_info.name)))(_.execute()))
       }
       db.transaction {
         find(db, name) match {
@@ -402,7 +403,7 @@
             val server = new Server(port, log)
             val server_info = Info(name, server.port, server.password)
 
-            db.using_statement(Data.table.delete(Data.name.where_equal(name)))(_.execute())
+            db.using_statement(Data.table.delete(sql = Data.name.where_equal(name)))(_.execute())
             db.using_statement(Data.table.insert()) { stmt =>
               stmt.string(1) = server_info.name
               stmt.int(2) = server_info.port