src/Pure/General/sql.scala
changeset 65004 fd4d1395fa17
parent 65003 4b4ccf86755c
child 65006 632bdf7b8bab
equal deleted inserted replaced
65003:4b4ccf86755c 65004:fd4d1395fa17
    48     def double(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Double] =
    48     def double(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Double] =
    49       new Column_Double(name, strict, primary_key)
    49       new Column_Double(name, strict, primary_key)
    50     def string(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[String] =
    50     def string(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[String] =
    51       new Column_String(name, strict, primary_key)
    51       new Column_String(name, strict, primary_key)
    52     def bytes(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Bytes] =
    52     def bytes(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Bytes] =
    53       new Column_Bytes(name, strict, primary_key)
    53       new Column_Bytes(name, strict, primary_key, "BLOB")  // SQL standard
       
    54     def bytea(name: String, strict: Boolean = true, primary_key: Boolean = false): Column[Bytes] =
       
    55       new Column_Bytes(name, strict, primary_key, "BYTEA")  // PostgreSQL
    54   }
    56   }
    55 
    57 
    56   abstract class Column[+A] private[SQL](
    58   abstract class Column[+A] private[SQL](
    57       val name: String, val strict: Boolean, val primary_key: Boolean)
    59       val name: String, val strict: Boolean, val primary_key: Boolean)
    58     extends Function[ResultSet, A]
    60     extends Function[ResultSet, A]
    87   }
    89   }
    88 
    90 
    89   class Column_Long private[SQL](name: String, strict: Boolean, primary_key: Boolean)
    91   class Column_Long private[SQL](name: String, strict: Boolean, primary_key: Boolean)
    90     extends Column[Long](name, strict, primary_key)
    92     extends Column[Long](name, strict, primary_key)
    91   {
    93   {
    92     def sql_type: String = "INTEGER"
    94     def sql_type: String = "BIGINT"
    93     def apply(rs: ResultSet): Long = rs.getLong(name)
    95     def apply(rs: ResultSet): Long = rs.getLong(name)
    94   }
    96   }
    95 
    97 
    96   class Column_Double private[SQL](name: String, strict: Boolean, primary_key: Boolean)
    98   class Column_Double private[SQL](name: String, strict: Boolean, primary_key: Boolean)
    97     extends Column[Double](name, strict, primary_key)
    99     extends Column[Double](name, strict, primary_key)
    98   {
   100   {
    99     def sql_type: String = "REAL"
   101     def sql_type: String = "DOUBLE PRECISION"
   100     def apply(rs: ResultSet): Double = rs.getDouble(name)
   102     def apply(rs: ResultSet): Double = rs.getDouble(name)
   101   }
   103   }
   102 
   104 
   103   class Column_String private[SQL](name: String, strict: Boolean, primary_key: Boolean)
   105   class Column_String private[SQL](name: String, strict: Boolean, primary_key: Boolean)
   104     extends Column[String](name, strict, primary_key)
   106     extends Column[String](name, strict, primary_key)
   109       val s = rs.getString(name)
   111       val s = rs.getString(name)
   110       if (s == null) "" else s
   112       if (s == null) "" else s
   111     }
   113     }
   112   }
   114   }
   113 
   115 
   114   class Column_Bytes private[SQL](name: String, strict: Boolean, primary_key: Boolean)
   116   class Column_Bytes private[SQL](
       
   117     name: String, strict: Boolean, primary_key: Boolean, val sql_type: String)
   115     extends Column[Bytes](name, strict, primary_key)
   118     extends Column[Bytes](name, strict, primary_key)
   116   {
   119   {
   117     def sql_type: String = "BLOB"
       
   118     def apply(rs: ResultSet): Bytes =
   120     def apply(rs: ResultSet): Bytes =
   119     {
   121     {
   120       val bs = rs.getBytes(name)
   122       val bs = rs.getBytes(name)
   121       if (bs == null) Bytes.empty else Bytes(bs)
   123       if (bs == null) Bytes.empty else Bytes(bs)
   122     }
   124     }