src/Pure/General/sql.scala
changeset 65011 42bffd1637f0
parent 65010 a27e9908dcf7
child 65012 14641ca387f8
equal deleted inserted replaced
65010:a27e9908dcf7 65011:42bffd1637f0
    41 
    41 
    42   /* types */
    42   /* types */
    43 
    43 
    44   object Type extends Enumeration
    44   object Type extends Enumeration
    45   {
    45   {
       
    46     val Boolean = Value("BOOLEAN")
    46     val Int = Value("INTEGER")
    47     val Int = Value("INTEGER")
    47     val Long = Value("BIGINT")
    48     val Long = Value("BIGINT")
    48     val Double = Value("DOUBLE PRECISION")
    49     val Double = Value("DOUBLE PRECISION")
    49     val String = Value("TEXT")
    50     val String = Value("TEXT")
    50     val Bytes = Value("BLOB")
    51     val Bytes = Value("BLOB")
    56 
    57 
    57   /* columns */
    58   /* columns */
    58 
    59 
    59   object Column
    60   object Column
    60   {
    61   {
       
    62     def bool(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Boolean] =
       
    63       new Column_Boolean(name, strict, primary_key)
    61     def int(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Int] =
    64     def int(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Int] =
    62       new Column_Int(name, strict, primary_key)
    65       new Column_Int(name, strict, primary_key)
    63     def long(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Long] =
    66     def long(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Long] =
    64       new Column_Long(name, strict, primary_key)
    67       new Column_Long(name, strict, primary_key)
    65     def double(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Double] =
    68     def double(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Double] =
    95     }
    98     }
    96 
    99 
    97     override def toString: String = sql_decl(default_type_name)
   100     override def toString: String = sql_decl(default_type_name)
    98   }
   101   }
    99 
   102 
       
   103   class Column_Boolean private[SQL](name: String, strict: Boolean, primary_key: Boolean)
       
   104     extends Column[Boolean](name, strict, primary_key, Type.Boolean)
       
   105   {
       
   106     def apply(rs: ResultSet): Boolean = rs.getBoolean(name)
       
   107   }
       
   108 
   100   class Column_Int private[SQL](name: String, strict: Boolean, primary_key: Boolean)
   109   class Column_Int private[SQL](name: String, strict: Boolean, primary_key: Boolean)
   101     extends Column[Int](name, strict, primary_key, Type.Int)
   110     extends Column[Int](name, strict, primary_key, Type.Int)
   102   {
   111   {
   103     def apply(rs: ResultSet): Int = rs.getInt(name)
   112     def apply(rs: ResultSet): Int = rs.getInt(name)
   104   }
   113   }
   201 
   210 
   202   trait Database
   211   trait Database
   203   {
   212   {
   204     /* types */
   213     /* types */
   205 
   214 
   206     def type_name(t: Type.Value): String = default_type_name(t)
   215     def type_name(t: Type.Value): String
   207 
   216 
   208 
   217 
   209     /* connection */
   218     /* connection */
   210 
   219 
   211     def connection: Connection
   220     def connection: Connection
   275   }
   284   }
   276 
   285 
   277   class Database private[SQLite](name: String, val connection: Connection) extends SQL.Database
   286   class Database private[SQLite](name: String, val connection: Connection) extends SQL.Database
   278   {
   287   {
   279     override def toString: String = name
   288     override def toString: String = name
       
   289 
       
   290     def type_name(t: SQL.Type.Value): String =
       
   291       if (t == SQL.Type.Boolean) "INTEGER"
       
   292       else SQL.default_type_name(t)
   280 
   293 
   281     def rebuild { using(statement("VACUUM"))(_.execute()) }
   294     def rebuild { using(statement("VACUUM"))(_.execute()) }
   282   }
   295   }
   283 }
   296 }
   284 
   297 
   328       name: String, val connection: Connection, port_forwarding: Option[SSH.Port_Forwarding])
   341       name: String, val connection: Connection, port_forwarding: Option[SSH.Port_Forwarding])
   329     extends SQL.Database
   342     extends SQL.Database
   330   {
   343   {
   331     override def toString: String = name
   344     override def toString: String = name
   332 
   345 
   333     override def type_name(t: SQL.Type.Value): String =
   346     def type_name(t: SQL.Type.Value): String =
   334       if (t == SQL.Type.Bytes) "BYTEA"
   347       if (t == SQL.Type.Bytes) "BYTEA"
   335       else SQL.default_type_name(t)
   348       else SQL.default_type_name(t)
   336 
   349 
   337     override def close() { super.close; port_forwarding.foreach(_.close) }
   350     override def close() { super.close; port_forwarding.foreach(_.close) }
   338   }
   351   }