src/Pure/General/sql.scala
changeset 63790 3d723062dc70
parent 63788 3160826b92f8
child 63791 c6cbdfaae19e
--- a/src/Pure/General/sql.scala	Mon Sep 05 11:43:37 2016 +0200
+++ b/src/Pure/General/sql.scala	Mon Sep 05 11:51:25 2016 +0200
@@ -55,7 +55,8 @@
   }
 
   abstract class Column[+A] private[SQL](
-    val name: String, val strict: Boolean, val primary_key: Boolean)
+      val name: String, val strict: Boolean, val primary_key: Boolean)
+    extends Function[ResultSet, A]
   {
     def sql_name: String = quote_ident(name)
     def sql_type: String
@@ -129,6 +130,9 @@
 
   class Table private[SQL](name: String, columns: List[Column[Any]])
   {
+    private val columns_index: Map[String, Int] =
+      columns.iterator.map(_.name).zipWithIndex.toMap
+
     Library.duplicates(columns.map(_.name)) match {
       case Nil =>
       case bad => error("Duplicate column names " + commas_quote(bad) + " for table " + quote(name))
@@ -148,7 +152,21 @@
     def sql_drop(strict: Boolean): String =
       "DROP TABLE " + (if (strict) "" else "IF EXISTS ") + quote_ident(name)
 
+    def sql_insert: String =
+      "INSERT INTO " + quote_ident(name) +
+      " VALUES " + columns.map(_ => "?").mkString("(", ", ", ")")
+
     override def toString: String =
       "TABLE " + quote_ident(name) + " " + columns.map(_.toString).mkString("(", ", ", ")")
   }
+
+
+  /* results */
+
+  def iterator[A](rs: ResultSet)(get: ResultSet => A): Iterator[A] = new Iterator[A]
+  {
+    private var _next: Boolean = rs.next()
+    def hasNext: Boolean = _next
+    def next: A = { val x = get(rs); _next = rs.next(); x }
+  }
 }