src/Pure/Tools/sqlite.scala
author wenzelm
Sat, 03 Sep 2016 22:56:57 +0200
changeset 63776 f1968429e339
child 63777 fc030773ec90
permissions -rw-r--r--
minimal support for SQLite databases;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
63776
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/sqlite.scala
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
     3
    Options:    :folding=explicit:
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
     4
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
     5
Support for SQLite databases.
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
     6
*/
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
     7
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
     8
package isabelle
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
     9
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    10
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    11
import java.sql.{Connection, DriverManager}
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    12
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    13
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    14
object SQLite
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    15
{
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    16
  /* database connection */
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    17
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    18
  def open_connection(path: Path): Connection =
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    19
  {
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    20
    val s0 = File.platform_path(path.expand)
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    21
    val s1 = if (Platform.is_windows) s0.replace('\\', '/') else s0
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    22
    DriverManager.getConnection("jdbc:sqlite:" + s1)
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    23
  }
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    24
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    25
  def with_connection[A](path: Path)(body: Connection => A): A =
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    26
  {
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    27
    val connection = open_connection(path)
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    28
    try { body(connection) } finally { connection.close }
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    29
  }
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    30
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    31
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    32
  /* SQL syntax */
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    33
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    34
  def quote_char(c: Char): String =
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    35
    c match {
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    36
      case '\u0000' => "\\0"
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    37
      case '\'' => "\\'"
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    38
      case '\"' => "\\\""
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    39
      case '\b' => "\\b"
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    40
      case '\n' => "\\n"
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    41
      case '\r' => "\\r"
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    42
      case '\t' => "\\t"
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    43
      case '\u001a' => "\\Z"
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    44
      case '\\' => "\\\\"
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    45
      case _ => c.toString
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    46
    }
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    47
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    48
  def quote_string(s: String): String =
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    49
    quote(s.map(quote_char(_)).mkString)
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    50
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    51
  def quote_ident(s: String): String = "`" + s + "`"
f1968429e339 minimal support for SQLite databases;
wenzelm
parents:
diff changeset
    52
}