diff --git a/src/main/scala/plugin/JavaScriptPlugin.scala b/src/main/scala/plugin/JavaScriptPlugin.scala index fe7701d..adaca5e 100644 --- a/src/main/scala/plugin/JavaScriptPlugin.scala +++ b/src/main/scala/plugin/JavaScriptPlugin.scala @@ -4,6 +4,11 @@ import org.mozilla.javascript.{Function => JsFunction} import scala.collection.mutable.ListBuffer import plugin.PluginSystem._ +import util.ControlUtil._ +import plugin.PluginSystem.GlobalMenu +import plugin.PluginSystem.RepositoryAction +import plugin.PluginSystem.Action +import plugin.PluginSystem.RepositoryMenu class JavaScriptPlugin(val id: String, val version: String, val author: String, val url: String, val description: String) extends Plugin { @@ -62,6 +67,30 @@ }) } + object db { + // TODO Use JavaScript Map instead of java.util.Map + def select(sql: String): Array[java.util.Map[String, String]] = { + defining(PluginConnectionHolder.threadLocal.get){ conn => + using(conn.prepareStatement(sql)){ stmt => + using(stmt.executeQuery()){ rs => + val list = new java.util.ArrayList[java.util.Map[String, String]]() + while(rs.next){ + defining(rs.getMetaData){ meta => + val map = new java.util.HashMap[String, String]() + Range(1, meta.getColumnCount).map { i => + val name = meta.getColumnName(i) + map.put(name, rs.getString(name)) + } + list.add(map) + } + } + list.toArray(new Array[java.util.Map[String, String]](list.size)) + } + } + } + } + } + } object JavaScriptPlugin { diff --git a/src/main/scala/plugin/Plugin.scala b/src/main/scala/plugin/Plugin.scala index 677083f..43ce373 100644 --- a/src/main/scala/plugin/Plugin.scala +++ b/src/main/scala/plugin/Plugin.scala @@ -1,6 +1,7 @@ package plugin import plugin.PluginSystem._ +import java.sql.Connection trait Plugin { val id: String @@ -14,3 +15,7 @@ def repositoryActions : List[RepositoryAction] def globalActions : List[Action] } + +object PluginConnectionHolder { + val threadLocal = new ThreadLocal[Connection] +} \ No newline at end of file diff --git a/src/main/scala/servlet/PluginActionInvokeFilter.scala b/src/main/scala/servlet/PluginActionInvokeFilter.scala index 20e1db5..ef25204 100644 --- a/src/main/scala/servlet/PluginActionInvokeFilter.scala +++ b/src/main/scala/servlet/PluginActionInvokeFilter.scala @@ -7,6 +7,7 @@ import service.{AccountService, RepositoryService, SystemSettingsService} import model.Account import util.{JGitUtil, Keys} +import plugin.PluginConnectionHolder class PluginActionInvokeFilter extends Filter with SystemSettingsService with RepositoryService with AccountService { @@ -58,7 +59,12 @@ val systemSettings = loadSystemSettings() getRepository(owner, name, systemSettings.baseUrl(request)).flatMap { repository => plugin.PluginSystem.repositoryActions.find(_.path == remain).map { action => - val result = action.function(request, response, repository) + val result = try { + PluginConnectionHolder.threadLocal.set(session.conn) + action.function(request, response, repository) + } finally { + PluginConnectionHolder.threadLocal.remove() + } result match { case x: String => { response.setContentType("text/html; charset=UTF-8")