class GoodData::CloudResources::MysqlClient
Constants
- JDBC_MYSQL_PATTERN
- JDBC_MYSQL_PROTOCOL
- MONGO_BI_FETCH_SIZE
- MONGO_BI_TYPE
- MYSQL_DEFAULT_PORT
- MYSQL_FETCH_SIZE
- PREFER
- REQUIRE
- VERIFY_FULL
Public Class Methods
accept?(type)
click to toggle source
# File lib/gooddata/cloud_resources/mysql/mysql_client.rb, line 32 def accept?(type) type == 'mysql' end
new(options = {})
click to toggle source
# File lib/gooddata/cloud_resources/mysql/mysql_client.rb, line 37 def initialize(options = {}) raise("Data Source needs a client to Mysql to be able to query the storage but 'mysql_client' is empty.") unless options['mysql_client'] if options['mysql_client']['connection'].is_a?(Hash) @database = options['mysql_client']['connection']['database'] @authentication = options['mysql_client']['connection']['authentication'] @ssl_mode = options['mysql_client']['connection']['sslMode'] @database_type = options['mysql_client']['connection']['databaseType'] raise "SSL Mode should be prefer, require and verify-full" unless @ssl_mode == 'prefer' || @ssl_mode == 'require' || @ssl_mode == 'verify-full' @url = build_url(options['mysql_client']['connection']['url']) else raise('Missing connection info for Mysql client') end Java.com.mysql.jdbc.Driver end
Public Instance Methods
add_extended()
click to toggle source
# File lib/gooddata/cloud_resources/mysql/mysql_client.rb, line 116 def add_extended @database_type == MONGO_BI_TYPE ? '&authenticationPlugins=org.mongodb.mongosql.auth.plugin.MongoSqlAuthenticationPlugin&useLocalTransactionState=true' : '' end
build_url(url)
click to toggle source
# File lib/gooddata/cloud_resources/mysql/mysql_client.rb, line 91 def build_url(url) matches = url.scan(JDBC_MYSQL_PATTERN) raise 'Cannot reach the url' unless matches host = matches[0][0] port = matches[0][2]&.to_i || MYSQL_DEFAULT_PORT "#{JDBC_MYSQL_PROTOCOL}#{host}:#{port}/#{@database}?#{get_ssl_mode(@ssl_mode)}#{add_extended}&useCursorFetch=true&enabledTLSProtocols=TLSv1.2" end
connect()
click to toggle source
# File lib/gooddata/cloud_resources/mysql/mysql_client.rb, line 81 def connect GoodData.logger.info "Setting up connection to Mysql #{@database_type} #{@url} " prop = java.util.Properties.new prop.setProperty('user', @authentication['basic']['userName']) prop.setProperty('password', @authentication['basic']['password']) @connection = java.sql.DriverManager.getConnection(@url, prop) @connection.set_auto_commit(false) end
fetch_size()
click to toggle source
# File lib/gooddata/cloud_resources/mysql/mysql_client.rb, line 101 def fetch_size @database_type == MONGO_BI_TYPE ? MONGO_BI_FETCH_SIZE : MYSQL_FETCH_SIZE end
get_ssl_mode(ssl_mode)
click to toggle source
# File lib/gooddata/cloud_resources/mysql/mysql_client.rb, line 105 def get_ssl_mode(ssl_mode) mode = PREFER if ssl_mode == 'verify-full' mode = VERIFY_FULL elsif ssl_mode == 'require' mode = REQUIRE end mode end
realize_query(query, _params)
click to toggle source
# File lib/gooddata/cloud_resources/mysql/mysql_client.rb, line 55 def realize_query(query, _params) GoodData.gd_logger.info("Realize SQL query: type=mysql status=started") connect filename = "#{SecureRandom.urlsafe_base64(6)}_#{Time.now.to_i}.csv" measure = Benchmark.measure do statement = @connection.create_statement statement.set_fetch_size(fetch_size) has_result = statement.execute(query) if has_result result = statement.get_result_set metadata = result.get_meta_data col_count = metadata.column_count CSV.open(filename, 'wb') do |csv| csv << Array(1..col_count).map { |i| metadata.get_column_name(i) } # build the header csv << Array(1..col_count).map { |i| result.get_string(i)&.to_s } while result.next end end end GoodData.gd_logger.info("Realize SQL query: type=mysql status=finished duration=#{measure.real}") filename ensure @connection&.close @connection = nil end