9 import org
.jdom
.{Document
=> JDocument
}
10 import java
.util
.{Iterator
=> JIterator
}
11 import org
.jdom
.input
._
13 import scala
.dbc
.Syntax
._
14 import scala
.dbc
.statement
._
15 import scala
.dbc
.statement
.expression
._
16 import scala
.dbc
.value
._
17 import scala
.dbc
.syntax
._
18 import syntax
.Statement
._
19 import scala
.dbc
.statement
.{Select
=> DBCSelect
}
20 import java
.sql
.{DriverManager
, Connection
, ResultSet
, PreparedStatement
, Statement
, Date
}
21 import DriverManager
.{getConnection
=> connect
};
25 //------------------------------------------------
27 // From http://scala.sygneca.com/code/simplifying-jdbc
28 //------------------------------------------------
32 implicit def query
[X
](s
: String
, f
: RichResultSet
=> X
)(implicit stat
: Statement
) = {
33 def strm(rs
: ResultSet
): Stream
[X
] =
34 if (rs
.next
) Stream
.cons(f(new RichResultSet(rs
)), strm(rs
)) else { rs
.close(); Stream
.empty
};
35 strm(stat
.executeQuery(s
));
38 implicit def conn2Statement(conn
: Connection
): Statement
= conn
.createStatement
;
40 implicit def rrs2Byte(rs
: RichResultSet
) = rs
.nextByte
;
41 implicit def rrs2Int(rs
: RichResultSet
) = rs
.nextInt
;
42 implicit def rrs2Long(rs
: RichResultSet
) = rs
.nextLong
;
43 implicit def rrs2Float(rs
: RichResultSet
) = rs
.nextFloat
;
44 implicit def rrs2Double(rs
: RichResultSet
) = rs
.nextDouble
;
45 implicit def rrs2String(rs
: RichResultSet
) = rs
.nextString
;
47 implicit def resultSet2Rich(rs
: ResultSet
) = new RichResultSet(rs
);
48 implicit def rich2ResultSet(r
: RichResultSet
) = r
.rs
;
50 class RichResultSet(val rs
: ResultSet
) {
53 def apply(i
: Int
) = { pos
= i
; this }
55 def nextInt
: Int
= { val ret
= rs
.getInt(pos
); pos
= pos
+ 1; ret
}
56 def nextString
: String
= { val ret
= rs
.getString(pos
); pos
= pos
+ 1; ret
}
57 def nextLong
: Long
= { val ret
= rs
.getLong(pos
); pos
= pos
+ 1; ret
}
58 def nextFloat
: Float
= { val ret
= rs
.getFloat(pos
); pos
= pos
+ 1; ret
}
59 def nextDouble
: Double
= { val ret
= rs
.getDouble(pos
); pos
= pos
+ 1; ret
}
60 def nextByte
: Byte
= { val ret
= rs
.getByte(pos
); pos
= pos
+ 1; ret
}
62 def foldLeft
[X
](init
: X
)(f
: (ResultSet
, X
) => X
): X
= rs
.next
match {
64 case true => foldLeft(f(rs
, init
))(f
)
66 def map
[X
](f
: ResultSet
=> X
) = {
74 implicit def str2RichPrepared(s
: String
)(implicit conn
: Connection
): RichPreparedStatement
= conn
prepareStatement(s
);
76 implicit def ps2Rich(ps
: PreparedStatement
) = new RichPreparedStatement(ps
);
77 implicit def rich2PS(r
: RichPreparedStatement
) = r
.ps
;
78 class RichPreparedStatement(val ps
: PreparedStatement
) {
80 private def inc
= { pos
= pos
+ 1; this }
81 def execute
= { pos
= 1; ps
.execute
}
83 def <<(o
: String
) = { ps
.setString(pos
, o
); inc
}
84 def <<(x
: Date
) = { ps
.setDate(pos
, x
); inc
}
85 def <<(x
: Byte
) = { ps
.setByte(pos
, x
); inc
}
86 def <<(x
: Long
) = { ps
.setLong(pos
, x
); inc
}
87 def <<(b
: Boolean
) = { ps
.setBoolean(pos
, b
); inc
}
88 def <<(i
: Int
) = { ps
.setInt(pos
, i
); inc
}
89 def <<(f
: Float
) = { ps
.setFloat(pos
, f
); inc
}
90 def <<(d
: Double
) = { ps
.setDouble(pos
, d
); inc
}
93 implicit def conn2Rich(conn
: Connection
) = new RichConnection(conn
);
95 class RichConnection(val conn
: Connection
) {
96 def <<(sql
: String
) = new RichStatement(conn
.createStatement
) << sql
;
97 def <<(sql
: Seq
[String
]) = new RichStatement(conn
.createStatement
) << sql
;
98 def << = new RichStatement(conn
.createStatement
);
101 implicit def st2Rich(s
: Statement
) = new RichStatement(s
);
102 implicit def rich2St(rs
: RichStatement
) = rs
.s
;
104 class RichStatement(val s
: Statement
) {
105 def <<(sql
: String
) = { s
.execute(sql
); this }
106 def <<(sql
: Seq
[String
]) = { for (val x
<- sql
) s
.execute(x
); this }
111 //------------------------------------------------
112 // End of Rich Scala JDBC
113 //------------------------------------------------