spectre-mysql 1.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/spectre/mysql.rb +124 -102
- metadata +43 -19
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 06d437bc149a21da027b8388b21bb85462a2f4d04a4e3183c57447e6c2a5c756
|
|
4
|
+
data.tar.gz: 79588cac00639fc145c5f08064fc1444f00280ec94efd78f9687e179824ab7d1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: dae040d6f4fb8f9db79cdf62eafd6074694b1730d248bb00289aa9719277bab0f96eda6150219374da8f68b125979a4fea90642253425c1d64c630a58e9ee18c
|
|
7
|
+
data.tar.gz: 7c7c148a57c20fc03ce2e6421a524058ccd99d74f6d8975d3c5b55ac36149d62d0d73858ce4306e3c09718b3ec7c633e41409f672c5fcd0786054d80582dbcf2
|
data/lib/spectre/mysql.rb
CHANGED
|
@@ -1,102 +1,124 @@
|
|
|
1
|
-
require 'logger'
|
|
2
|
-
require 'mysql2'
|
|
3
|
-
require '
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
@__query['query']
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
1
|
+
require 'logger'
|
|
2
|
+
require 'mysql2'
|
|
3
|
+
require 'ostruct'
|
|
4
|
+
|
|
5
|
+
module Spectre
|
|
6
|
+
module MySQL
|
|
7
|
+
class MySqlQuery
|
|
8
|
+
include Spectre::Delegate if defined? Spectre::Delegate
|
|
9
|
+
|
|
10
|
+
def initialize query
|
|
11
|
+
@__query = query
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def host hostname
|
|
15
|
+
@__query['host'] = hostname
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def username user
|
|
19
|
+
@__query['username'] = user
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def password pass
|
|
23
|
+
@__query['password'] = pass
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def database name
|
|
27
|
+
@__query['database'] = name
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def query statement
|
|
31
|
+
@__query['query'] = [] unless @__query.key? 'query'
|
|
32
|
+
@__query['query'].append(statement)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class Client
|
|
37
|
+
include Spectre::Delegate if defined? Spectre::Delegate
|
|
38
|
+
|
|
39
|
+
def initialize config, logger
|
|
40
|
+
@config = config['mysql'] || {}
|
|
41
|
+
@logger = logger
|
|
42
|
+
|
|
43
|
+
@result = nil
|
|
44
|
+
@last_conn = nil
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def mysql(name = nil, &)
|
|
48
|
+
query = {}
|
|
49
|
+
|
|
50
|
+
if !name.nil? and @config.key? name
|
|
51
|
+
query.merge! @config[name]
|
|
52
|
+
|
|
53
|
+
unless query['host']
|
|
54
|
+
raise "No `host' set for MySQL client '#{name}'. Check your MySQL config in your environment."
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
elsif !name.nil?
|
|
58
|
+
query['host'] = name
|
|
59
|
+
elsif @last_conn.nil?
|
|
60
|
+
raise 'No name given and there was no previous MySQL connection to use'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
MySqlQuery.new(query).instance_eval(&) if block_given?
|
|
64
|
+
|
|
65
|
+
unless name.nil?
|
|
66
|
+
@last_conn = {
|
|
67
|
+
host: query['host'],
|
|
68
|
+
username: query['username'],
|
|
69
|
+
password: query['password'],
|
|
70
|
+
database: query['database'],
|
|
71
|
+
}
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
@logger.info "Connecting to database #{query['username']}@#{query['host']}:#{query['database']}"
|
|
75
|
+
|
|
76
|
+
client = ::Mysql2::Client.new(**@last_conn)
|
|
77
|
+
|
|
78
|
+
res = []
|
|
79
|
+
|
|
80
|
+
query['query']&.each do |statement|
|
|
81
|
+
@logger.info("Executing statement '#{statement}'")
|
|
82
|
+
|
|
83
|
+
# FIXED: Disable automatic casting to prevent BigDecimal errors
|
|
84
|
+
# This prevents mysql2 from trying to cast VARCHAR columns to BigDecimal
|
|
85
|
+
res = client.query(statement, cast: false, cast_booleans: false)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# FIXED: Safely convert rows to OpenStruct with error handling
|
|
89
|
+
# If casting is still problematic, we catch the error and retry with manual conversion
|
|
90
|
+
if res
|
|
91
|
+
begin
|
|
92
|
+
@result = res.map { |row| OpenStruct.new row }
|
|
93
|
+
rescue ArgumentError => e
|
|
94
|
+
raise unless e.message.include?('BigDecimal')
|
|
95
|
+
|
|
96
|
+
@logger.warn "BigDecimal casting error detected, falling back to safe conversion: #{e.message}"
|
|
97
|
+
# Manually convert each row, skipping problematic values
|
|
98
|
+
@result = res.map do |row|
|
|
99
|
+
safe_row = {}
|
|
100
|
+
row.each do |key, value|
|
|
101
|
+
safe_row[key] = begin
|
|
102
|
+
value.to_s
|
|
103
|
+
rescue StandardError
|
|
104
|
+
value
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
OpenStruct.new(safe_row)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
client.close
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def result
|
|
116
|
+
raise 'No MySQL query has been executed yet' unless @result
|
|
117
|
+
|
|
118
|
+
@result
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
Engine.register(MySQL::Client, :mysql, :result) if defined? Engine
|
|
124
|
+
end
|
metadata
CHANGED
|
@@ -1,60 +1,85 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: spectre-mysql
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 2.0.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Christian Neubauer
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: bigdecimal
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: logger
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '0'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '0'
|
|
13
40
|
- !ruby/object:Gem::Dependency
|
|
14
41
|
name: mysql2
|
|
15
42
|
requirement: !ruby/object:Gem::Requirement
|
|
16
43
|
requirements:
|
|
17
44
|
- - ">="
|
|
18
45
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0
|
|
46
|
+
version: '0'
|
|
20
47
|
type: :runtime
|
|
21
48
|
prerelease: false
|
|
22
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
50
|
requirements:
|
|
24
51
|
- - ">="
|
|
25
52
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 0
|
|
53
|
+
version: '0'
|
|
27
54
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
55
|
+
name: ostruct
|
|
29
56
|
requirement: !ruby/object:Gem::Requirement
|
|
30
57
|
requirements:
|
|
31
58
|
- - ">="
|
|
32
59
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
60
|
+
version: '0'
|
|
34
61
|
type: :runtime
|
|
35
62
|
prerelease: false
|
|
36
63
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
64
|
requirements:
|
|
38
65
|
- - ">="
|
|
39
66
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
67
|
+
version: '0'
|
|
41
68
|
description: Adds MySQL access functionality to the spectre framework
|
|
42
69
|
email:
|
|
43
|
-
-
|
|
70
|
+
- christian.neubauer@ionos.com
|
|
44
71
|
executables: []
|
|
45
72
|
extensions: []
|
|
46
73
|
extra_rdoc_files: []
|
|
47
74
|
files:
|
|
48
75
|
- lib/spectre/mysql.rb
|
|
49
|
-
homepage: https://
|
|
76
|
+
homepage: https://github.com/ionos-spectre/spectre-mysql
|
|
50
77
|
licenses:
|
|
51
|
-
-
|
|
78
|
+
- GPL-3.0-or-later
|
|
52
79
|
metadata:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
changelog_uri: https://bitbucket.org/cneubaur/spectre-mysql/src/master/CHANGELOG.md
|
|
57
|
-
post_install_message:
|
|
80
|
+
homepage_uri: https://github.com/ionos-spectre/spectre-mysql
|
|
81
|
+
source_code_uri: https://github.com/ionos-spectre/spectre-mysql
|
|
82
|
+
changelog_uri: https://github.com/ionos-spectre/spectre-mysql/blob/develop/CHANGELOG.md
|
|
58
83
|
rdoc_options: []
|
|
59
84
|
require_paths:
|
|
60
85
|
- lib
|
|
@@ -62,15 +87,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
62
87
|
requirements:
|
|
63
88
|
- - ">="
|
|
64
89
|
- !ruby/object:Gem::Version
|
|
65
|
-
version:
|
|
90
|
+
version: '3.4'
|
|
66
91
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
92
|
requirements:
|
|
68
93
|
- - ">="
|
|
69
94
|
- !ruby/object:Gem::Version
|
|
70
95
|
version: '0'
|
|
71
96
|
requirements: []
|
|
72
|
-
rubygems_version: 3.
|
|
73
|
-
signing_key:
|
|
97
|
+
rubygems_version: 3.6.9
|
|
74
98
|
specification_version: 4
|
|
75
99
|
summary: MySQL module for spectre
|
|
76
100
|
test_files: []
|