Class: GoodData::CloudResources::MysqlClient
- Inherits:
-
CloudResourceClient
- Object
- CloudResourceClient
- GoodData::CloudResources::MysqlClient
- Defined in:
- lib/gooddata/cloud_resources/mysql/mysql_client.rb
Constant Summary collapse
- JDBC_MYSQL_PATTERN =
%r{jdbc:mysql:\/\/([^:^\/]+)(:([0-9]+))?(\/)?}
- MYSQL_DEFAULT_PORT =
3306
- JDBC_MYSQL_PROTOCOL =
'jdbc:mysql://'
- VERIFY_FULL =
'VERIFY_IDENTITY'
- PREFER =
'PREFERRED'
- REQUIRE =
'REQUIRED'
- MYSQL_FETCH_SIZE =
1000
Class Method Summary collapse
Instance Method Summary collapse
- #build_url(url) ⇒ Object
- #connect ⇒ Object
- #get_ssl_mode(ssl_mode) ⇒ Object
-
#initialize(options = {}) ⇒ MysqlClient
constructor
A new instance of MysqlClient.
- #realize_query(query, _params) ⇒ Object
Methods inherited from CloudResourceClient
Constructor Details
#initialize(options = {}) ⇒ MysqlClient
Returns a new instance of MysqlClient.
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/gooddata/cloud_resources/mysql/mysql_client.rb', line 35 def initialize( = {}) raise("Data Source needs a client to Mysql to be able to query the storage but 'mysql_client' is empty.") unless ['mysql_client'] if ['mysql_client']['connection'].is_a?(Hash) @database = ['mysql_client']['connection']['database'] @authentication = ['mysql_client']['connection']['authentication'] @ssl_mode = ['mysql_client']['connection']['sslMode'] raise "SSL Mode should be prefer, require and verify-full" unless @ssl_mode == 'prefer' || @ssl_mode == 'require' || @ssl_mode == 'verify-full' @url = build_url(['mysql_client']['connection']['url']) else raise('Missing connection info for Mysql client') end Java.com.mysql.cj.jdbc.Driver end |
Class Method Details
.accept?(type) ⇒ Boolean
30 31 32 |
# File 'lib/gooddata/cloud_resources/mysql/mysql_client.rb', line 30 def accept?(type) type == 'mysql' end |
Instance Method Details
#build_url(url) ⇒ Object
89 90 91 92 93 94 95 96 97 |
# File 'lib/gooddata/cloud_resources/mysql/mysql_client.rb', line 89 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}?sslmode=#{get_ssl_mode(@ssl_mode)}&useCursorFetch=true&enabledTLSProtocols=TLSv1.2" end |
#connect ⇒ Object
78 79 80 81 82 83 84 85 86 87 |
# File 'lib/gooddata/cloud_resources/mysql/mysql_client.rb', line 78 def connect GoodData.logger.info "Setting up connection to Mysql #{@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 |
#get_ssl_mode(ssl_mode) ⇒ Object
99 100 101 102 103 104 105 106 107 108 |
# File 'lib/gooddata/cloud_resources/mysql/mysql_client.rb', line 99 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) ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/gooddata/cloud_resources/mysql/mysql_client.rb', line 52 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(MYSQL_FETCH_SIZE) has_result = statement.execute(query) if has_result result = statement.get_result_set = result. col_count = .column_count CSV.open(filename, 'wb') do |csv| csv << Array(1..col_count).map { |i| .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 |