src/Pure/General/sql.scala
changeset 65748 1f4a80e80c88
parent 65741 cf42659364c9
child 65774 1001fb86d7f7
equal deleted inserted replaced
65747:5a3052b2095f 65748:1f4a80e80c88
   172 
   172 
   173   class Statement private[SQL](val db: Database, val rep: PreparedStatement)
   173   class Statement private[SQL](val db: Database, val rep: PreparedStatement)
   174   {
   174   {
   175     stmt =>
   175     stmt =>
   176 
   176 
   177     def set_bool(i: Int, x: Boolean) { rep.setBoolean(i, x) }
   177     object bool
   178     def set_bool(i: Int, x: Option[Boolean])
   178     {
   179     {
   179       def update(i: Int, x: Boolean) { rep.setBoolean(i, x) }
   180       if (x.isDefined) set_bool(i, x.get)
   180       def update(i: Int, x: Option[Boolean])
   181       else rep.setNull(i, java.sql.Types.BOOLEAN)
   181       {
   182     }
   182         if (x.isDefined) update(i, x.get)
   183 
   183         else rep.setNull(i, java.sql.Types.BOOLEAN)
   184     def set_int(i: Int, x: Int) { rep.setInt(i, x) }
   184       }
   185     def set_int(i: Int, x: Option[Int])
   185     }
   186     {
   186     object int
   187       if (x.isDefined) set_int(i, x.get)
   187     {
   188       else rep.setNull(i, java.sql.Types.INTEGER)
   188       def update(i: Int, x: Int) { rep.setInt(i, x) }
   189     }
   189       def update(i: Int, x: Option[Int])
   190 
   190       {
   191     def set_long(i: Int, x: Long) { rep.setLong(i, x) }
   191         if (x.isDefined) update(i, x.get)
   192     def set_long(i: Int, x: Option[Long])
   192         else rep.setNull(i, java.sql.Types.INTEGER)
   193     {
   193       }
   194       if (x.isDefined) set_long(i, x.get)
   194     }
   195       else rep.setNull(i, java.sql.Types.BIGINT)
   195     object long
   196     }
   196     {
   197 
   197       def update(i: Int, x: Long) { rep.setLong(i, x) }
   198     def set_double(i: Int, x: Double) { rep.setDouble(i, x) }
   198       def update(i: Int, x: Option[Long])
   199     def set_double(i: Int, x: Option[Double])
   199       {
   200     {
   200         if (x.isDefined) update(i, x.get)
   201       if (x.isDefined) set_double(i, x.get)
   201         else rep.setNull(i, java.sql.Types.BIGINT)
   202       else rep.setNull(i, java.sql.Types.DOUBLE)
   202       }
   203     }
   203     }
   204 
   204     object double
   205     def set_string(i: Int, x: String) { rep.setString(i, x) }
   205     {
   206     def set_string(i: Int, x: Option[String]): Unit = set_string(i, x.orNull)
   206       def update(i: Int, x: Double) { rep.setDouble(i, x) }
   207 
   207       def update(i: Int, x: Option[Double])
   208     def set_bytes(i: Int, bytes: Bytes)
   208       {
   209     {
   209         if (x.isDefined) update(i, x.get)
   210       if (bytes == null) rep.setBytes(i, null)
   210         else rep.setNull(i, java.sql.Types.DOUBLE)
   211       else rep.setBinaryStream(i, bytes.stream(), bytes.length)
   211       }
   212     }
   212     }
   213     def set_bytes(i: Int, bytes: Option[Bytes]): Unit = set_bytes(i, bytes.orNull)
   213     object string
   214 
   214     {
   215     def set_date(i: Int, date: Date): Unit = db.set_date(stmt, i, date)
   215       def update(i: Int, x: String) { rep.setString(i, x) }
   216     def set_date(i: Int, date: Option[Date]): Unit = set_date(i, date.orNull)
   216       def update(i: Int, x: Option[String]): Unit = update(i, x.orNull)
   217 
   217     }
       
   218     object bytes
       
   219     {
       
   220       def update(i: Int, bytes: Bytes)
       
   221       {
       
   222         if (bytes == null) rep.setBytes(i, null)
       
   223         else rep.setBinaryStream(i, bytes.stream(), bytes.length)
       
   224       }
       
   225       def update(i: Int, bytes: Option[Bytes]): Unit = update(i, bytes.orNull)
       
   226     }
       
   227     object date
       
   228     {
       
   229       def update(i: Int, date: Date): Unit = db.update_date(stmt, i, date)
       
   230       def update(i: Int, date: Option[Date]): Unit = update(i, date.orNull)
       
   231     }
   218 
   232 
   219     def execute(): Boolean = rep.execute()
   233     def execute(): Boolean = rep.execute()
   220     def execute_query(): Result = new Result(this, rep.executeQuery())
   234     def execute_query(): Result = new Result(this, rep.executeQuery())
   221 
   235 
   222     def close(): Unit = rep.close
   236     def close(): Unit = rep.close
   313       new Statement(db, connection.prepareStatement(sql))
   327       new Statement(db, connection.prepareStatement(sql))
   314 
   328 
   315     def using_statement[A](sql: Source)(f: Statement => A): A =
   329     def using_statement[A](sql: Source)(f: Statement => A): A =
   316       using(statement(sql))(f)
   330       using(statement(sql))(f)
   317 
   331 
   318     def set_date(stmt: Statement, i: Int, date: Date): Unit
   332     def update_date(stmt: Statement, i: Int, date: Date): Unit
   319     def date(res: Result, column: Column): Date
   333     def date(res: Result, column: Column): Date
   320 
   334 
   321     def insert_permissive(table: Table, sql: Source = ""): Source
   335     def insert_permissive(table: Table, sql: Source = ""): Source
   322 
   336 
   323 
   337 
   374   {
   388   {
   375     override def toString: String = name
   389     override def toString: String = name
   376 
   390 
   377     def sql_type(T: SQL.Type.Value): SQL.Source = SQL.sql_type_sqlite(T)
   391     def sql_type(T: SQL.Type.Value): SQL.Source = SQL.sql_type_sqlite(T)
   378 
   392 
   379     def set_date(stmt: SQL.Statement, i: Int, date: Date): Unit =
   393     def update_date(stmt: SQL.Statement, i: Int, date: Date): Unit =
   380       if (date == null) stmt.set_string(i, null: String)
   394       if (date == null) stmt.string(i) = (null: String)
   381       else stmt.set_string(i, date_format(date))
   395       else stmt.string(i) = date_format(date)
   382 
   396 
   383     def date(res: SQL.Result, column: SQL.Column): Date =
   397     def date(res: SQL.Result, column: SQL.Column): Date =
   384       date_format.parse(res.string(column))
   398       date_format.parse(res.string(column))
   385 
   399 
   386     def insert_permissive(table: SQL.Table, sql: SQL.Source = ""): SQL.Source =
   400     def insert_permissive(table: SQL.Table, sql: SQL.Source = ""): SQL.Source =
   447     override def toString: String = name
   461     override def toString: String = name
   448 
   462 
   449     def sql_type(T: SQL.Type.Value): SQL.Source = SQL.sql_type_postgresql(T)
   463     def sql_type(T: SQL.Type.Value): SQL.Source = SQL.sql_type_postgresql(T)
   450 
   464 
   451     // see https://jdbc.postgresql.org/documentation/head/8-date-time.html
   465     // see https://jdbc.postgresql.org/documentation/head/8-date-time.html
   452     def set_date(stmt: SQL.Statement, i: Int, date: Date): Unit =
   466     def update_date(stmt: SQL.Statement, i: Int, date: Date): Unit =
   453       if (date == null) stmt.rep.setObject(i, null)
   467       if (date == null) stmt.rep.setObject(i, null)
   454       else stmt.rep.setObject(i, OffsetDateTime.from(date.to_utc.rep))
   468       else stmt.rep.setObject(i, OffsetDateTime.from(date.to_utc.rep))
   455 
   469 
   456     def date(res: SQL.Result, column: SQL.Column): Date =
   470     def date(res: SQL.Result, column: SQL.Column): Date =
   457     {
   471     {