Skip to content

Commit

Permalink
oracle support
Browse files Browse the repository at this point in the history
  • Loading branch information
deusaquilus committed Feb 13, 2019
1 parent bfd9151 commit 79f3c58
Show file tree
Hide file tree
Showing 24 changed files with 610 additions and 30 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@ jobs:
include:
stage: release
if: type != pull_request
script:
script:
- travis_retry ./build/release.sh
48 changes: 40 additions & 8 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -67,20 +67,52 @@ lazy val `quill-sql` =
lazy val `quill-sql-jvm` = `quill-sql`.jvm
lazy val `quill-sql-js` = `quill-sql`.js

val includeOracle =
sys.props.getOrElse("oracle", "false").toBoolean

def includeIfOracle[T](t:T):Seq[T] =
if (includeOracle) Seq(t) else Seq()

lazy val `quill-jdbc` =
(project in file("quill-jdbc"))
.settings(commonSettings: _*)
.settings(mimaSettings: _*)
.settings(
fork in Test := true,
libraryDependencies ++= Seq(
"com.zaxxer" % "HikariCP" % "3.3.1",
"mysql" % "mysql-connector-java" % "5.1.47" % Test,
"com.h2database" % "h2" % "1.4.197" % Test,
"org.postgresql" % "postgresql" % "42.2.5" % Test,
"org.xerial" % "sqlite-jdbc" % "3.25.2" % Test,
"com.microsoft.sqlserver" % "mssql-jdbc" % "7.1.1.jre8-preview" % Test
)
resolvers ++= includeIfOracle( // read ojdbc7 jar in case it is deployed
Resolver.mavenLocal
),
libraryDependencies ++= {
val deps =
Seq(
"com.zaxxer" % "HikariCP" % "3.3.1",
"mysql" % "mysql-connector-java" % "5.1.47" % Test,
"com.h2database" % "h2" % "1.4.197" % Test,
"org.postgresql" % "postgresql" % "42.2.5" % Test,
"org.xerial" % "sqlite-jdbc" % "3.25.2" % Test,
"com.microsoft.sqlserver" % "mssql-jdbc" % "7.1.1.jre8-preview" % Test
)

deps ++ includeIfOracle(
"com.oracle.jdbc" % "ojdbc7" % "12.1.0.2" % Test
)
},
excludeFilter in unmanagedSources := {
val oracleSourceDirs =
(unmanagedSourceDirectories in Test).value.map { dir =>
(dir / "io" / "getquill" / "context" / "jdbc" / "oracle").getCanonicalPath
}
val excludeThisPath =
(path: String) =>
oracleSourceDirs.exists { srcDir =>
!includeOracle && (path contains srcDir)
}
new SimpleFileFilter(file => {
if (excludeThisPath(file.getCanonicalPath))
println(s"Excluding: ${file.getCanonicalPath}")
excludeThisPath(file.getCanonicalPath)
})
}
)
.dependsOn(`quill-sql-jvm` % "compile->compile;test->test")

Expand Down
8 changes: 6 additions & 2 deletions build/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@ export MYSQL_PORT=3306
export SQL_SERVER_HOST=127.0.0.1
export SQL_SERVER_PORT=11433

export ORACLE_HOST=127.0.0.1
export ORACLE_PORT=11521

export CASSANDRA_HOST=127.0.0.1
export CASSANDRA_PORT=19042

export ORIENTDB_HOST=127.0.0.1
export ORIENTDB_PORT=12424

export SBT_ARGS="-Dquill.macro.log=false -Xms512m -Xmx1536m -Xss2m -XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC ++$TRAVIS_SCALA_VERSION"
export SBT_ARGS="-Doracle=true -Dquill.macro.log=false -Xms512m -Xmx1536m -Xss2m -XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC ++$TRAVIS_SCALA_VERSION"

if [[ $TRAVIS_SCALA_VERSION == 2.11* ]]; then
export SBT_ARGS="$SBT_ARGS coverage"
Expand Down Expand Up @@ -53,11 +56,12 @@ if [[ "$?" != "0" ]]; then
fi
show_mem

echo "Running tests"
time sbt $SBT_ARGS checkUnformattedFiles test tut doc

show_mem

echo "Tests completed. Shutting down"

time docker-compose down
# for 2.11 publish coverage
if [[ $TRAVIS_SCALA_VERSION == 2.11* ]]; then
Expand Down
3 changes: 3 additions & 0 deletions build/oracle_setup/create_quill_test.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
alter session set "_ORACLE_SCRIPT"=true;
CREATE USER quill_test IDENTIFIED BY "QuillRocks!" QUOTA 50M ON system;
GRANT DBA TO quill_test;
14 changes: 14 additions & 0 deletions build/oracle_setup/external_check_script.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/bin/bash

set -e

source /root/.bashrc

echo "Setting up Oracle"

until source /root/.bashrc; sqlplus quill_test/QuillRocks! < /oracle_setup/external_match_script.sql; do
echo "Trying Again"
sleep 5;
done

echo "Oracle Setup Complete"
1 change: 1 addition & 0 deletions build/oracle_setup/external_match_script.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
select 'match_this_test_to_pass' from DUAL;
29 changes: 29 additions & 0 deletions build/oracle_setup/external_setup_script.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/bin/bash

echo "Running Global Oracle Init"

# Start the oracle database
nohup /entrypoint.sh &

# Save the pid which we need to wait for (otherwise container will exit)
pid=$!

echo "Waiting for Oracle Setup to Complete"

until source /root/.bashrc; sqlplus system/oracle@//localhost:1521/xe < /oracle_setup/external_match_script.sql | grep "match_this_test_to_pass"; do
echo "Trying Again"
sleep 5;
done

source /root/.bashrc

echo "Setting Up Test Database"
sqlplus system/oracle@//localhost:1521/xe < /oracle_setup/create_quill_test.sql

echo "Setting Up Test Database Schema"
sqlplus quill_test/QuillRocks! < /quill_setup/oracle-schema.sql

echo "Oracle Setup Complete"

# Wait until oracle DB externally closed
wait $pid
13 changes: 13 additions & 0 deletions build/oracle_setup/load_jdbc.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/bin/bash

# Copy the jdbc jar from the container to local
docker cp "$(docker-compose ps -q oracle)":/u01/app/oracle-product/12.1.0/xe/jdbc/lib/ojdbc7.jar ./

mvn install:install-file \
-Dfile=ojdbc7.jar \
-DgroupId='com.oracle.jdbc' \
-DartifactId=ojdbc7 \
-Dversion=12.1.0.2 \
-Dpackaging=jar

rm ojdbc7.jar
20 changes: 19 additions & 1 deletion build/setup_db_scripts.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export SQLITE_SCRIPT=quill-jdbc/src/test/resources/sql/sqlite-schema.sql
export MYSQL_SCRIPT=quill-sql/src/test/sql/mysql-schema.sql
export POSTGRES_SCRIPT=quill-sql/src/test/sql/postgres-schema.sql
export SQL_SERVER_SCRIPT=quill-sql/src/test/sql/sqlserver-schema.sql
export ORACLE_SCRIPT=quill-sql/src/test/sql/oracle-schema.sql
export CASSANDRA_SCRIPT=quill-cassandra/src/test/cql/cassandra-schema.cql


Expand Down Expand Up @@ -88,8 +89,25 @@ function setup_sqlserver() {
/opt/mssql-tools/bin/sqlcmd -S $2 -U SA -P "QuillRocks!" -d quill_test -i $1
}

# Do a simple necat poll to make sure the oracle database is ready.
# All internal database creation and schema setup scripts are handled
# by the container and docker-compose steps.

function setup_oracle() {

while ! nc -z $2 1521; do
echo "Waiting for Oracle"
sleep 5;
done;
sleep 5;

echo "Connected to Oracle"
sleep 5
}

export -f setup_sqlite
export -f setup_mysql
export -f setup_postgres
export -f setup_cassandra
export -f setup_sqlserver
export -f setup_sqlserver
export -f setup_oracle
1 change: 1 addition & 0 deletions build/setup_local.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ time setup_mysql $MYSQL_SCRIPT mysql
time setup_postgres $POSTGRES_SCRIPT postgres
time setup_cassandra $CASSANDRA_SCRIPT cassandra
time setup_sqlserver $SQL_SERVER_SCRIPT sqlserver
time setup_oracle $ORACLE_SCRIPT oracle

echo "Databases are ready!"
15 changes: 13 additions & 2 deletions build/setup_travis.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,21 @@

set -e

time docker-compose up -d cassandra sqlserver orientdb
time docker-compose up -d cassandra sqlserver oracle orientdb

# import setup functions
. build/setup_db_scripts.sh

# load sbt deps to local repo
. build/oracle_setup/load_jdbc.sh

# run setup scripts for local databases
time setup_sqlite $SQLITE_SCRIPT 127.0.0.1
time setup_mysql $MYSQL_SCRIPT 127.0.0.1
time setup_postgres $POSTGRES_SCRIPT 127.0.0.1


function send_script() {
echo "Send Script Args: 1: $1 - 2 $2 - 3: $3"
docker cp $2 "$(docker-compose ps -q $1)":/$3
}

Expand All @@ -22,6 +25,14 @@ send_script sqlserver $SQL_SERVER_SCRIPT sqlserver-schema.sql
send_script sqlserver ./build/setup_db_scripts.sh setup_db_scripts.sh
time docker-compose exec -T sqlserver bash -c ". setup_db_scripts.sh && setup_sqlserver sqlserver-schema.sql 127.0.0.1"

until docker-compose exec -T oracle "/oracle_setup_local/external_check_script.sh" | grep "match_this_test_to_pass"; do
docker-compose exec -T oracle "/oracle_setup_local/external_check_script.sh"
echo "Waiting for Oracle"
sleep 5;
done
sleep 5;
echo "Oracle Setup Complete"

# setup cassandra in docker
send_script cassandra $CASSANDRA_SCRIPT cassandra-schema.cql
send_script cassandra ./build/setup_db_scripts.sh setup_db_scripts.sh
Expand Down
16 changes: 15 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,23 +39,34 @@ services:
- ACCEPT_EULA=Y
- SA_PASSWORD=QuillRocks!

# These 2 are only kept for local development
oracle:
image: medgetablelevvel/oracle-12c-base
ports:
- "11521:1521"
volumes:
- ./build/oracle_setup:/oracle_setup
- ./quill-sql/src/test/sql/:/quill_setup
command: bash -c "mkdir /oracle_setup_local; cp /oracle_setup/* /oracle_setup_local && cd /oracle_setup_local && ./external_setup_script.sh"

setup:
build:
context: .
dockerfile: ./build/Dockerfile-setup
depends_on:
- oracle
links:
- postgres:postgres
- mysql:mysql
- cassandra:cassandra
- orientdb:orientdb
- sqlserver:sqlserver
- oracle:oracle
volumes:
- ./:/app
command:
- ./build/setup_local.sh


sbt:
build:
context: .
Expand All @@ -69,6 +80,7 @@ services:
- cassandra:cassandra
- orientdb:orientdb
- sqlserver:sqlserver
- oracle:oracle
volumes:
- ./:/app
- ~/.ivy2:/root/.ivy2
Expand All @@ -82,6 +94,8 @@ services:
- MYSQL_PORT=3306
- SQL_SERVER_HOST=sqlserver
- SQL_SERVER_PORT=1433
- ORACLE_HOST=oracle
- ORACLE_PORT=1521
- CASSANDRA_HOST=cassandra
- CASSANDRA_PORT=9042
- ORIENTDB_HOST=orientdb
Expand Down
17 changes: 17 additions & 0 deletions quill-jdbc/src/main/scala/io/getquill/OracleJdbcContext.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.getquill

import java.io.Closeable

import com.typesafe.config.Config
import io.getquill.context.jdbc.{ JdbcContext, OracleJdbcContextBase }
import io.getquill.util.LoadConfig
import javax.sql.DataSource

class OracleJdbcContext[N <: NamingStrategy](val naming: N, val dataSource: DataSource with Closeable)
extends JdbcContext[OracleDialect, N]
with OracleJdbcContextBase[N] {

def this(naming: N, config: JdbcContextConfig) = this(naming, config.dataSource)
def this(naming: N, config: Config) = this(naming, JdbcContextConfig(config))
def this(naming: N, configPrefix: String) = this(naming, LoadConfig(configPrefix))
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,9 @@ trait SqlServerJdbcContextBase[N <: NamingStrategy] extends JdbcContextBase[SQLS

val idiom = SQLServerDialect
}

trait OracleJdbcContextBase[N <: NamingStrategy] extends JdbcContextBase[OracleDialect, N]
with UUIDStringEncoding {

val idiom = OracleDialect
}
10 changes: 9 additions & 1 deletion quill-jdbc/src/test/resources/application.conf
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,12 @@ testSqlServerDB.dataSource.user=sa
testSqlServerDB.dataSource.password="QuillRocks!"
testSqlServerDB.dataSource.databaseName=quill_test
testSqlServerDB.dataSource.portNumber=${?SQL_SERVER_PORT}
testSqlServerDB.dataSource.serverName=${?SQL_SERVER_HOST}
testSqlServerDB.dataSource.serverName=${?SQL_SERVER_HOST}

testOracleDB.dataSourceClassName=oracle.jdbc.xa.client.OracleXADataSource
testOracleDB.dataSource.databaseName=xe
testOracleDB.dataSource.user=quill_test
testOracleDB.dataSource.password="QuillRocks!"
testOracleDB.dataSource.driverType=thin
testOracleDB.dataSource.portNumber=${?ORACLE_PORT}
testOracleDB.dataSource.serverName=${?ORACLE_HOST}
Loading

0 comments on commit 79f3c58

Please sign in to comment.