# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

torque.applicationRoot = .
#pipeline.default.descriptor = src/test/conf/torque/turbine-classic-pipeline.xml
# torque.defaults.pool.defaultMaxActive=30
torque.defaults.pool.testOnBorrow=true
torque.defaults.pool.validationQuery=SELECT 1

torque.idbroker.cleverquantity=true
torque.idbroker.prefetch=true
torque.idbroker.usenewconnection=true

#torque.database.default=default
torque.database.schema =

# supported auto, hsqldb, mysql..
#torque.database.default.adapter=hsqldb

#torque.dsfactory.default.factory=org.apache.torque.dsfactory.SharedPoolDataSourceFactory

#torque.dsfactory.default.pool.testOnBorrow=true
#torque.dsfactory.default.pool.validationQuery=SELECT 1 from INFORMATION_SCHEMA.SYSTEM_USERS
#torque.dsfactory.default.connection.driver = org.hsqldb.jdbcDriver
#torque.dsfactory.default.connection.url = jdbc:hsqldb:.
#torque.dsfactory.default.connection.user = sa
#torque.dsfactory.default.connection.password =

##################
#
# For JNDI configuration please see: https://db.apache.org/torque/torque-4.0/documentation/orm-reference/initialisation-configuration.html
# 
#
#torque.dsfactory.${turbine_database_name}.factory=org.apache.torque.dsfactory.JndiDataSourceFactory
#torque.dsfactory.${turbine_database_name}.jndi.path=java:comp/env/${turbine_database_jndipath}
#torque.dsfactory.${turbine_database_name}.jndi.ttl=300000

# -------------------------------------------------------------------
#
# Shared Pool Data Source Factory
#
# -------------------------------------------------------------------
#torque.database.default=turbine
torque.database.${turbine_database_name}.adapter=${turbine_database_adapter}

#torque.database.${turbine_database_name}.user=${turbine_database_user}
#torque.database.${turbine_database_name}.password=${turbine_database_password}
#
#torque.defaults.pool.maxActive =       	30
#torque.defaults.pool.testOnBorrow =    	true
#torque.defaults.pool.validationQuery = 	SELECT 1
#
#torque.defaults.connection.driver =    	${turbine_database_driver}
#torque.defaults.connection.url =       	${turbine_database_url}${turbine_database_name}
#torque.defaults.connection.user =      	${turbine_database_user}
#torque.defaults.connection.password =  	${turbine_database_password}
#
torque.dsfactory.${turbine_database_name}.connection.driver =    	${turbine_database_driver}
torque.dsfactory.${turbine_database_name}.connection.url =       	${turbine_database_url}${turbine_database_name}
torque.dsfactory.${turbine_database_name}.connection.user =      	${turbine_database_user}
torque.dsfactory.${turbine_database_name}.connection.password =  	${turbine_database_password}
torque.dsfactory.${turbine_database_name}.factory=org.apache.torque.dsfactory.SharedPoolDataSourceFactory
# -------------------------------------------------------------------

# Comment if not using shared data source factory
torque.database.default=${turbine_database_name}



