lib/trinidad_dbpool.rb in trinidad_dbpool-0.7.0 vs lib/trinidad_dbpool.rb in trinidad_dbpool-0.8.0

- old
+ new

@@ -1,7 +1,121 @@ require 'java' - -require 'trinidad' require 'trinidad/jars' load File.expand_path('../../trinidad-libs/tomcat-jdbc.jar', __FILE__) -require 'trinidad_dbpool/webapp_extension' +module Trinidad + module DBPool + class << self + + def create_resource(context, options, protocol = nil) + name = options.delete(:name) || options.delete(:jndi); url = options.delete(:url) + if ! url.start_with?('jdbc:') && protocol + url = "#{protocol}#{url}" unless url.start_with?(protocol) + end + + resource_factory = options.key?(:factory) ? options.delete(:factory) : + 'org.apache.tomcat.jdbc.pool.DataSourceFactory' + if ( pool = options.delete(:pool) ) && pool.to_s != 'jdbc' # pool: 'dbcp' + begin + load File.expand_path("../../trinidad-libs/tomcat-#{pool}.jar", __FILE__) + resource_factory = nil + rescue LoadError + context.logger.warn "The `pool: #{pool}` option is not supported, please remove it" + else + context.logger.info "Using deprecated `pool: #{pool}` configuration option, consider removing it" + end + end + + driver = options.delete(:driver) || options.delete(:driverName) || options.delete(:driver_name) + + context.logger.debug "Using JDBC URL: #{url.inspect} for #{name}" + + # <Resource name="jdbc/MyDB" + # auth="Container" + # type="javax.sql.DataSource" + # url="jdbc:mysql://localhost:3306/mydb" + # driverClassName="com.mysql.jdbc.Driver" + # maxActive="100" maxIdle="30" maxWait="10000" + # username="root" password="secret" /> + resource = Trinidad::Tomcat::ContextResource.new + resource.set_auth(options.delete(:auth)) if options.key?(:auth) + resource.set_description(options.delete(:description)) if options.key?(:description) + resource.set_name(name) + resource.set_type(options.delete(:type) || 'javax.sql.DataSource') + resource.set_property('factory', resource_factory) if resource_factory + resource.set_property('driverClassName', driver) + resource.set_property('url', url) + camelizer = supported_properties_camelizer + options.each do |key, value| + resource.set_property(camelizer[key.to_s], value.to_s) + end + + yield(resource) if block_given? + + context.naming_resources.add_resource(resource) + context.naming_resources = resource.naming_resources + + resource + end + + private + + def supported_properties_camelizer + hash = Hash.new { |hash, key| simple_camelize(key) } + + # Common Attributes : + + hash['username'] = 'username' + hash['password'] = 'password' + hash['driver_class_name'] = 'driverClassName' + + hash['default_auto_commit'] = 'defaultAutoCommit' + hash['default_read_only'] = 'defaultReadOnly' + hash['default_transaction_isolation'] = 'defaultTransactionIsolation' + hash['default_catalog'] = 'defaultCatalog' + + hash['max_active'] = 'maxActive' + hash['max_idle'] = 'maxIdle' + hash['min_idle'] = 'minIdle' + hash['initial_size'] = 'initialSize' + hash['max_wait'] = 'maxWait' + + hash['test_on_borrow'] = 'testOnBorrow' + hash['test_on_return'] = 'testOnReturn' + hash['test_while_idle'] = 'testWhileIdle' + + hash['validation_query'] = 'validationQuery' + hash['validation_query_timeout'] = 'validationQueryTimeout' + + # + + hash['log_abandoned'] = 'logAbandoned' + hash['remove_abandoned'] = 'removeAbandoned' + hash['remove_abandoned_timeout'] = 'removeAbandonedTimeout' + + hash['connection_properties'] = 'connectionProperties' + + # Tomcat JDBC pool only : + + hash['init_sql'] = 'initSQL' + hash['validation_interval'] = 'validationInterval' + hash['jmx_enabled'] = 'jmxEnabled' + hash['fair_queue'] = 'fairQueue' + hash['abandon_when_percentage_full'] = 'abandonWhenPercentageFull' + + hash['max_age'] = 'maxAge' + hash['suspect_timeout'] = 'suspectTimeout' + hash['rollback_on_return'] = 'rollbackOnReturn' + hash['commit_on_return'] = 'commitOnReturn' + hash['alternate_username_allowed'] = 'alternateUsernameAllowed' + + hash + end + + def simple_camelize(string) + return string unless string.index('_') + string.gsub(/_([a-z\d]*)/i) { $1.capitalize } + end + + end + end +end \ No newline at end of file