11package com .albertprz .logograph
22
3- import java .sql .{Connection , ResultSet , PreparedStatement , Statement , Date , Time }
3+ import java .sql .{
4+ Connection ,
5+ Date ,
6+ PreparedStatement ,
7+ ResultSet ,
8+ Statement ,
9+ Time
10+ }
411import java .math .BigDecimal
5- import scala .util .{Try , Success , Failure }
12+ import scala .util .{Failure , Success , Try }
613import scala .collection .mutable .ListBuffer
714import cats .Monad
815import cats .syntax .all .*
9- import cats .effect .{Sync , Resource }
16+ import cats .effect .{Resource , Sync }
1017
1118import com .albertprz .logograph .config .LogographConfig
1219import utils .TypeInfo
1320import utils .StringUtils .*
1421import utils .Error .{InvalidParameterType , InvalidQueryResultType }
1522import java .lang .reflect .Method
1623
17-
18- class LogographContext [F [_] : Sync : Monad ] (conn : Connection ):
24+ class LogographContext [F [_]: Sync : Monad ](conn : Connection ):
1925
2026 import LogographContext .*
2127
2228 conn.setAutoCommit(false )
2329
24- def run [T <: DbDataSet ] (query : SelectStatement [T ]): F [List [T ]] =
25- runQuery (query)
26-
27- def run (stmts : SQLStatefulStatement * ): F [Unit ] =
28- runStatefulStatement (stmts)
30+ def run [T <: DbDataSet ](query : SelectStatement [T ]): F [List [T ]] =
31+ runQuery(query)
2932
33+ def run (stmts : SQLStatefulStatement * ): F [Unit ] = runStatefulStatement(stmts)
3034
31- private def runQuery [T <: DbDataSet ] (query : SelectStatement [T ]): F [List [T ]] =
35+ private def runQuery [T <: DbDataSet ](query : SelectStatement [T ]): F [List [T ]] =
3236 prepareStatement(query.sql, query.paramList).use { stmt =>
33-
34- for resultSet <- Sync [F ].blocking { stmt.executeQuery() }
35- yield extractResults(resultSet, query.typeInfo)
37+ for resultSet <-
38+ Sync [F ].blocking {
39+ stmt.executeQuery()
40+ }
41+ yield extractResults(resultSet, query.typeInfo)
3642 }
3743
38- private def runStatefulStatement (stmts : Seq [SQLStatefulStatement ]) =
44+ private def runStatefulStatement (stmts : Seq [SQLStatefulStatement ]) =
3945
40- val preparedStmts = for (sql, paramList) <- stmts.map(x => (x.sql, x.paramList))
41- yield prepareStatement(sql, paramList)
42- .use { stmt => Sync [F ].blocking { stmt.executeUpdate() } }
46+ val preparedStmts =
47+ for (sql, paramList) <- stmts.map(x => (x.sql, x.paramList))
48+ yield prepareStatement(sql, paramList)
49+ .use(stmt => Sync [F ].blocking(stmt.executeUpdate()))
4350
44- preparedStmts.fold (Sync [F ].pure(0 )) { (acc, curr) => acc *> curr } *>
45- Sync [F ].blocking { conn.commit() }
46-
47- private def prepareStatement (querySql : String , paramList : List [? ]) =
48- Resource .make { Sync [F ].blocking { conn.prepareStatement(querySql) } }
49- { stmt => Sync [F ].blocking { stmt.close() } }
50- .map { stmt => parameteriseStatement(stmt, paramList) }
51+ preparedStmts.fold(Sync [F ].pure(0 ))((acc, curr) => acc *> curr) *>
52+ Sync [F ].blocking(conn.commit())
5153
54+ private def prepareStatement (querySql : String , paramList : List [? ]) =
55+ Resource
56+ .make(Sync [F ].blocking(conn.prepareStatement(querySql))) { stmt =>
57+ Sync [F ].blocking(stmt.close())
58+ }
59+ .map(stmt => parameteriseStatement(stmt, paramList))
5260
5361private object LogographContext :
5462
55- def extractResults [T <: DbDataSet ] (resultSet : ResultSet , typeInfo : TypeInfo ) =
63+ def extractResults [T <: DbDataSet ](resultSet : ResultSet , typeInfo : TypeInfo ) =
5664
5765 val results = ListBuffer [T ]()
5866
59- val constructor = Class .forName(typeInfo.fullClassName)
60- .getConstructors()
61- .head
62-
67+ val constructor =
68+ Class
69+ .forName(typeInfo.fullClassName)
70+ .getConstructors()
71+ .head
6372
6473 while resultSet.next() do
6574 val ctorArgs = getCtorArgs(resultSet, typeInfo.elemTypes)
66- results += constructor.newInstance(ctorArgs : _ * ).asInstanceOf [T ]
75+ results += constructor.newInstance(ctorArgs* ).asInstanceOf [T ]
6776
6877 results.toList
6978
70- def parameteriseStatement (stmt : PreparedStatement , params : List [? ]) =
79+ def parameteriseStatement (stmt : PreparedStatement , params : List [? ]) =
7180
7281 for i <- 0 to params.size - 1 do
7382 params(i) match
@@ -83,17 +92,17 @@ private object LogographContext:
8392 case other @ _ => throw InvalidParameterType (other)
8493 stmt
8594
86- def getCtorArgs (resultSet : ResultSet , paramTypes : List [String ]) =
95+ def getCtorArgs (resultSet : ResultSet , paramTypes : List [String ]) =
8796
8897 for i <- 0 to paramTypes.size - 1
89- yield paramTypes(i) match
90- case " Int" => resultSet.getInt(i + 1 )
91- case " Long" => resultSet.getLong(i + 1 )
92- case " Float" => resultSet.getFloat(i + 1 )
93- case " Double" => resultSet.getDouble(i + 1 )
94- case " Boolean" => resultSet.getBoolean(i + 1 )
95- case " String" => resultSet.getString(i + 1 )
96- case " BigDecimal" => resultSet.getBigDecimal(i + 1 )
97- case " date" => resultSet.getDate(i + 1 )
98- case " time" => resultSet.getTime(i + 1 )
99- case other @ _ => throw InvalidQueryResultType (other)
98+ yield paramTypes(i) match
99+ case " Int" => resultSet.getInt(i + 1 )
100+ case " Long" => resultSet.getLong(i + 1 )
101+ case " Float" => resultSet.getFloat(i + 1 )
102+ case " Double" => resultSet.getDouble(i + 1 )
103+ case " Boolean" => resultSet.getBoolean(i + 1 )
104+ case " String" => resultSet.getString(i + 1 )
105+ case " BigDecimal" => resultSet.getBigDecimal(i + 1 )
106+ case " date" => resultSet.getDate(i + 1 )
107+ case " time" => resultSet.getTime(i + 1 )
108+ case other @ _ => throw InvalidQueryResultType (other)
0 commit comments