Skip to content

Commit

Permalink
Rename Action to DBIO:
Browse files Browse the repository at this point in the history
- Package `scala.slick.action` becomes `scala.slick.dbio`.

- The generic `EffectfulAction` type with effect tracking becomes
  `DBIOAction` with type aliases `DBIO` and `StreamingDBIO` without
  effect tracking.

- The effect type parameter is placed last instead of first in all
  types and methods. Effect types can be verbose and are usually
  irrelevant when looking at type error messages.

Fixes #1049.
  • Loading branch information
szeiger committed Jan 30, 2015
1 parent 2d71cd1 commit 2f64c79
Show file tree
Hide file tree
Showing 43 changed files with 313 additions and 360 deletions.
59 changes: 2 additions & 57 deletions scaladoc-root.txt
@@ -1,66 +1,11 @@
<a style="float:right" href="https://github.com/slick/slick/blob/master/scaladoc-root.txt">edit this text on github</a>
<img src="http://slick.typesafe.com/resources/images/slick-logo.png" alt="Slick logo" />
<h2>Scala Language-Integrated Connection Kit</h2>
This is the documentation for the <a href="http://slick.typesafe.com" target="_top">Slick</a> database library.
Slick is a joint effort by <a href="http://www.typesafe.com" target="_top">Typesafe</a> and
<a href="http://lamp.epfl.ch/" target="_top">LAMP, EPFL Lausanne</a>.
This is the API documentation for the <a href="http://slick.typesafe.com" target="_top">Slick</a> database library.
It should be used as an additional resource to the <a href="../index.html">user manual</a>.

Further documentation for Slick can be found on the
<a href="http://slick.typesafe.com/docs/" target="_top">documentation pages</a>.


<a href="scala/slick/package.html">To the slick package list...</a>

<h3>Important places</h3>

<h4>Type-safe query operators</h4>
<ul>
<li><a href="scala/slick/lifted/Query.html">Query</a></li>
<li><a href="scala/slick/lifted/Column.html">Column</a></li>
<li><a href="scala/slick/lifted/NumericColumnExtensionMethods.html">Numeric</a></li>
<li><a href="scala/slick/lifted/BooleanColumnExtensionMethods.html">Boolean</a></li>
<li><a href="scala/slick/lifted/StringColumnExtensionMethods.html">String</a></li>
<li><a href="scala/slick/lifted/PlainColumnExtensionMethods.html">AnyVal / non-nullable</a></li>
<li><a href="scala/slick/lifted/OptionColumnExtensionMethods.html">Option / nullable</a></li>
<li><a href="scala/slick/lifted/Compiled$.html">Pre-Compiled queries (aka Parameters)</a></li>
</ul>

</h4>Plain SQL queries</h4>
<ul>
<li><a href="scala/slick/jdbc/GetResult$.html">GetResult mapper</a></li>
<li><a href="scala/slick/jdbc/StaticQuery$.html">StaticQuery for raw strings</a></li>
<li><a href="scala/slick/jdbc/SQLInterpolation.html">String interpolation</a></li>
</ul>

<h4>Driver / Connection related</h4>
<ul>
<li><a href="scala/slick/jdbc/JdbcBackend$DatabaseDef.html">Database: withSession / withTransaction</a></li>
<li><a href="scala/slick/jdbc/JdbcBackend$SessionDef.html">Session</a></li>
<li><a href="scala/slick/driver/package.html">Drivers</a></li>
<li><a href="scala/slick/driver/JdbcProfile.html">JdbcProfile</a></li>
<li><a href="scala/slick/driver/JdbcExecutorComponent$QueryExecutorDef.html">QueryExecutor</a></li>
<li><a href="scala/slick/jdbc/Invoker.html">Invoker</a></li>
</ul>

<h4>Mapping related</h4>
<ul>
<li><a href="scala/slick/driver/JdbcTypesComponent$ImplicitColumnTypes.html">supported base types</a></li>
<li><a href="scala/slick/lifted/SimpleFunction$.html">SimpleFunction</a></li>
</ul>

<h4>Model / Table class related</h4>
<ul>
<li><a href="scala/slick/lifted/TableQuery$.html">TableQuery</a></li>
<li><a href="scala/slick/profile/RelationalTableComponent$Table.html">Table</a></li>
<li><a href="scala/slick/ast/ColumnOption.html">ColumnOptions</a></li>
<li><a href="scala/slick/model/ForeignKeyAction$.html">ForeignKeyAction</a></li>
<li><a href="scala/slick/model/codegen/SourceCodeGenerator.html">Code generator</a></li>
<li><a href="scala/slick/model/package.html">Slick model</a></li>
<li><a href="scala/slick/jdbc/meta/package.html">JDBC Metadata api (including Slick model converter)</a></li>
</ul>

<h5>Other</h5>
<ul>
<li><a href="scala/slick/collection/heterogenous/package.html">HLists</a></li>
<li><a href="scala/slick/memory/DistributedBackend.html">DistributedBackend</a></li>
</ul>
Expand Up @@ -2,7 +2,7 @@ package scala.slick.blocking

import scala.language.implicitConversions

import scala.slick.action._
import scala.slick.dbio._
import scala.slick.backend.DatabaseComponent
import scala.slick.util.{CloseableIterator, ignoreFollowOnError}

Expand All @@ -14,12 +14,12 @@ object Blocking {
/** Run an Action and block the current thread until the result is ready. If the Database uses
* synchronous, blocking excution, it is performed on the current thread in order to avoid any
* context switching, otherwise execution happens asynchronously. */
def run[R](db: DatabaseComponent#DatabaseDef, a: Action[R]): R = db.runInternal(a, true).value.get.get
def run[R](db: DatabaseComponent#DatabaseDef, a: DBIO[R]): R = db.runInternal(a, true).value.get.get

/** Run a streaming Action and return an `Iterator` which performs blocking I/O on the current
* thread (if supported by the Database) or blocks the current thread while waiting for the
* next result. */
def iterator[S](db: DatabaseComponent#DatabaseDef, a: StreamingAction[Any, S]): CloseableIterator[S] = new CloseableIterator[S] {
def iterator[S](db: DatabaseComponent#DatabaseDef, a: StreamingDBIO[Any, S]): CloseableIterator[S] = new CloseableIterator[S] {
val p = db.streamInternal(a, true)
var error: Throwable = null
var sub: Subscription = null
Expand Down
Expand Up @@ -3,7 +3,7 @@ package scala.slick.direct
import language.existentials
import scala.slick.SlickException
import scala.language.implicitConversions
import scala.slick.action.{Streaming, Effect, EffectfulAction, NoStream, ActionContext}
import scala.slick.dbio.{Streaming, Effect, NoStream, ActionContext}
import scala.slick.driver._
import scala.slick.profile.{SqlProfile, SqlStreamingAction, SqlAction}
import scala.slick.relational.CompiledMapping
Expand Down
6 changes: 3 additions & 3 deletions slick-testkit/src/codegen/scala/CodeGeneratorTest.scala
Expand Up @@ -3,7 +3,7 @@ package scala.slick.test.codegen
import scala.concurrent.{Future, Await}
import scala.concurrent.duration.Duration
import scala.concurrent.ExecutionContext.Implicits.global
import scala.slick.action.Action
import scala.slick.dbio.DBIO
import scala.slick.codegen.SourceCodeGenerator
import scala.slick.driver._
import scala.slick.jdbc.JdbcBackend
Expand Down Expand Up @@ -157,12 +157,12 @@ lazy val database = Database.forURL(url=""\"$url""\",driver="$jdbcDriver",user="
slickDriverObject: JdbcDriver,
slickDriver: String,
jdbcDriver: String,
generator: Config => Action[SourceCodeGenerator]
generator: Config => DBIO[SourceCodeGenerator]
)
class H2Config(
objectName: String,
inits: Seq[String],
generator: Config => Action[SourceCodeGenerator]
generator: Config => DBIO[SourceCodeGenerator]
= config => H2Driver.createModel(ignoreInvalidDefaults=false).map(m => new MySourceCodeGenerator(m, config))
) extends Config(
objectName,
Expand Down
Expand Up @@ -54,8 +54,8 @@ class JdbcMiscTest extends AsyncTest[JdbcTestDB] {
Action.successful(()).flatMap { _ => TableQuery[Foo].schema.create }.failed.map(_.shouldBeA[SlickException])
}

def testSimpleAction = {
val getAutoCommit = SimpleAction[Boolean](_.session.conn.getAutoCommit)
def testSimpleDBIO = {
val getAutoCommit = SimpleDBIO[Boolean](_.connection.getAutoCommit)
getAutoCommit.map(_ shouldBe true)
}

Expand Down
Expand Up @@ -14,7 +14,7 @@ class TransactionTest extends AsyncTest[JdbcTestDB] {
}
val ts = TableQuery[T]

val getTI = SimpleAction(_.session.conn.getTransactionIsolation)
val getTI = SimpleDBIO(_.connection.getTransactionIsolation)

class ExpectedException extends RuntimeException

Expand Down
Expand Up @@ -4,7 +4,7 @@ import java.io.File
import java.util.logging.{Level, Logger}
import java.sql.SQLException
import scala.concurrent.ExecutionContext
import scala.slick.action._
import scala.slick.dbio._
import scala.slick.driver._
import scala.slick.memory.MemoryDriver
import scala.slick.jdbc.{StaticQuery => Q, ResultSetAction, ResultSetInvoker}
Expand Down Expand Up @@ -85,7 +85,7 @@ object StandardTestDBs {

lazy val Postgres = new ExternalJdbcTestDB("postgres") {
val driver = PostgresDriver
override def localTables(implicit ec: ExecutionContext): Action[Vector[String]] =
override def localTables(implicit ec: ExecutionContext): DBIO[Vector[String]] =
ResultSetAction[(String,String,String, String)](_.conn.getMetaData().getTables("", "public", null, null)).map { ts =>
ts.filter(_._4.toUpperCase == "TABLE").map(_._3).sorted
}
Expand Down Expand Up @@ -142,7 +142,7 @@ class SQLiteTestDB(dburl: String, confName: String) extends InternalJdbcTestDB(c
val driver = SQLiteDriver
val url = dburl
val jdbcDriver = "org.sqlite.JDBC"
override def localTables(implicit ec: ExecutionContext): Action[Vector[String]] =
override def localTables(implicit ec: ExecutionContext): DBIO[Vector[String]] =
super.localTables.map(_.filter(s => !s.toLowerCase.contains("sqlite_")))
override def dropUserArtifacts(implicit session: profile.Backend#Session) = {
for(t <- getLocalTables)
Expand Down Expand Up @@ -171,7 +171,7 @@ class AccessDB(confName: String) extends ExternalJdbcTestDB(confName) {
}
/* Works in some situations but fails with "Optional feature not implemented" in others */
override def canGetLocalTables = false
override def localTables(implicit ec: ExecutionContext): Action[Vector[String]] =
override def localTables(implicit ec: ExecutionContext): DBIO[Vector[String]] =
MTable.getTables.map(_.map(_.name.name).sorted)
override def capabilities = super.capabilities - TestDB.capabilities.jdbcMeta
}
Expand All @@ -180,7 +180,7 @@ abstract class DerbyDB(confName: String) extends InternalJdbcTestDB(confName) {
val driver = DerbyDriver
System.setProperty("derby.stream.error.method", classOf[DerbyDB].getName + ".DEV_NULL")
val jdbcDriver = "org.apache.derby.jdbc.EmbeddedDriver"
override def localTables(implicit ec: ExecutionContext): Action[Vector[String]] =
override def localTables(implicit ec: ExecutionContext): DBIO[Vector[String]] =
ResultSetAction[(String,String,String, String)](_.conn.getMetaData().getTables(null, "APP", null, null)).map { ts =>
ts.map(_._3).sorted
}
Expand Down Expand Up @@ -215,7 +215,7 @@ object DerbyDB {
abstract class HsqlDB(confName: String) extends InternalJdbcTestDB(confName) {
val driver = HsqldbDriver
val jdbcDriver = "org.hsqldb.jdbcDriver"
override def localTables(implicit ec: ExecutionContext): Action[Vector[String]] =
override def localTables(implicit ec: ExecutionContext): DBIO[Vector[String]] =
ResultSetAction[(String,String,String, String)](_.conn.getMetaData().getTables(null, "PUBLIC", null, null)).map { ts =>
ts.map(_._3).sorted
}
Expand Down
Expand Up @@ -8,7 +8,7 @@ import java.util.zip.GZIPInputStream
import scala.collection.mutable
import scala.concurrent.ExecutionContext
import scala.slick.SlickException
import scala.slick.action.{NoStream, EffectfulAction, Action}
import scala.slick.dbio.{NoStream, DBIOAction, DBIO}
import scala.slick.jdbc.{StaticQuery => Q, ResultSetAction, JdbcDataSource, SimpleJdbcAction, ResultSetInvoker}
import scala.slick.jdbc.GetResult._
import scala.slick.driver._
Expand Down Expand Up @@ -149,7 +149,7 @@ abstract class JdbcTestDB(val confName: String) extends SqlTestDB {
final def getLocalTables(implicit session: profile.Backend#Session) =
blockingRunOnSession(ec => localTables(ec))
def canGetLocalTables = true
def localTables(implicit ec: ExecutionContext): Action[Vector[String]] =
def localTables(implicit ec: ExecutionContext): DBIO[Vector[String]] =
ResultSetAction[(String,String,String, String)](_.conn.getMetaData().getTables("", "", null, null)).map { ts =>
ts.filter(_._4.toUpperCase == "TABLE").map(_._3).sorted
}
Expand Down Expand Up @@ -187,7 +187,7 @@ abstract class JdbcTestDB(val confName: String) extends SqlTestDB {
def close(): Unit = ()
}, executor)
}
final def blockingRunOnSession[R](f: ExecutionContext => EffectfulAction[Nothing, R, NoStream])(implicit session: profile.Backend#Session): R = {
final def blockingRunOnSession[R](f: ExecutionContext => DBIOAction[R, NoStream, Nothing])(implicit session: profile.Backend#Session): R = {
val ec = new ExecutionContext {
def execute(runnable: Runnable): Unit = runnable.run()
def reportFailure(t: Throwable): Unit = throw t
Expand Down
Expand Up @@ -12,7 +12,7 @@ import java.lang.reflect.Method
import java.util.concurrent.{LinkedBlockingQueue, ThreadPoolExecutor, ExecutionException, TimeUnit}
import java.util.concurrent.atomic.AtomicInteger

import scala.slick.action._
import scala.slick.dbio._
import scala.slick.jdbc.JdbcBackend
import scala.slick.util.DumpInfo
import scala.slick.profile.{RelationalProfile, SqlProfile, Capability}
Expand Down Expand Up @@ -94,7 +94,7 @@ case class TestMethod(name: String, desc: Description, method: Method, cl: Class

case testObject: AsyncTest[_] =>
if(r == classOf[Future[_]]) await(method.invoke(testObject).asInstanceOf[Future[Any]])
else if(r == classOf[EffectfulAction[_, _, _]]) await(testObject.db.run(method.invoke(testObject).asInstanceOf[Action[Any]]))
else if(r == classOf[DBIOAction[_, _, _]]) await(testObject.db.run(method.invoke(testObject).asInstanceOf[DBIO[Any]]))
else throw new RuntimeException(s"Illegal return type: '${r.getName}' in test method '$name' -- AsyncTest methods must return Future or Action")
}
}
Expand Down Expand Up @@ -212,23 +212,23 @@ abstract class AsyncTest[TDB >: Null <: TestDB](implicit TdbClass: ClassTag[TDB]
def getDumpInfo = DumpInfo(name = "<GetStatementParameters>")
}

def ifCap[E <: Effect, R](caps: Capability*)(f: => EffectfulAction[E, R, NoStream]): EffectfulAction[E, Unit, NoStream] =
if(caps.forall(c => tdb.capabilities.contains(c))) f.andThen(Action.successful(())) else Action.successful(())
def ifNotCap[E <: Effect, R](caps: Capability*)(f: => EffectfulAction[E, R, NoStream]): EffectfulAction[E, Unit, NoStream] =
if(!caps.forall(c => tdb.capabilities.contains(c))) f.andThen(Action.successful(())) else Action.successful(())
def ifCap[E <: Effect, R](caps: Capability*)(f: => DBIOAction[R, NoStream, E]): DBIOAction[Unit, NoStream, E] =
if(caps.forall(c => tdb.capabilities.contains(c))) f.andThen(DBIO.successful(())) else DBIO.successful(())
def ifNotCap[E <: Effect, R](caps: Capability*)(f: => DBIOAction[R, NoStream, E]): DBIOAction[Unit, NoStream, E] =
if(!caps.forall(c => tdb.capabilities.contains(c))) f.andThen(DBIO.successful(())) else DBIO.successful(())

def ifCapF[R](caps: Capability*)(f: => Future[R]): Future[Unit] =
if(caps.forall(c => tdb.capabilities.contains(c))) f.map(_ => ()) else Future.successful(())
def ifNotCapF[R](caps: Capability*)(f: => Future[R]): Future[Unit] =
if(!caps.forall(c => tdb.capabilities.contains(c))) f.map(_ => ()) else Future.successful(())

def asAction[R](f: tdb.profile.Backend#Session => R): EffectfulAction[Effect, R, NoStream] =
def asAction[R](f: tdb.profile.Backend#Session => R): DBIOAction[R, NoStream, Effect] =
new SynchronousDatabaseAction[tdb.profile.Backend, Effect, R, NoStream] {
def run(context: tdb.profile.Backend#Context): R = f(context.session)
def getDumpInfo = DumpInfo(name = "<asAction>")
}

def seq[E <: Effect](actions: EffectfulAction[E, _, NoStream]*): EffectfulAction[E, Unit, NoStream] = Action.seq[E](actions: _*)
def seq[E <: Effect](actions: DBIOAction[_, NoStream, E]*): DBIOAction[Unit, NoStream, E] = DBIO.seq[E](actions: _*)

/** Synchronously consume a Reactive Stream and materialize it as a Vector. */
def materialize[T](p: Publisher[T]): Future[Vector[T]] = {
Expand Down
7 changes: 0 additions & 7 deletions src/main/scala/scala/slick/action/package.scala

This file was deleted.

0 comments on commit 2f64c79

Please sign in to comment.