db2_query 0.1.0 → 0.3.0
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/MIT-LICENSE +1 -1
- data/README.md +209 -55
- data/Rakefile +1 -17
- data/lib/db2_query.rb +10 -17
- data/lib/db2_query/base.rb +2 -78
- data/lib/db2_query/config.rb +29 -0
- data/lib/db2_query/connection.rb +108 -30
- data/lib/db2_query/core.rb +140 -0
- data/lib/db2_query/error.rb +12 -1
- data/lib/db2_query/formatter.rb +5 -23
- data/lib/db2_query/logger.rb +42 -0
- data/lib/db2_query/railtie.rb +5 -12
- data/lib/db2_query/result.rb +47 -65
- data/lib/db2_query/tasks/database.rake +38 -0
- data/lib/{tasks → db2_query/tasks}/init.rake +0 -0
- data/lib/{tasks → db2_query/tasks}/initializer.rake +10 -4
- data/lib/db2_query/version.rb +1 -1
- metadata +45 -57
- data/lib/db2_query/column.rb +0 -42
- data/lib/db2_query/connection_handling.rb +0 -56
- data/lib/db2_query/database_configurations.rb +0 -50
- data/lib/db2_query/database_statements.rb +0 -32
- data/lib/db2_query/log_subscriber.rb +0 -50
- data/lib/db2_query/odbc_connector.rb +0 -38
- data/lib/db2_query/path.rb +0 -17
- data/lib/db2_query/schema.rb +0 -113
- data/lib/db2_query/sql_validator.rb +0 -26
- data/lib/tasks/database.rake +0 -56
data/lib/db2_query/result.rb
CHANGED
@@ -1,95 +1,77 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Db2Query
|
4
|
-
class Result
|
5
|
-
attr_reader :
|
4
|
+
class Result < ActiveRecord::Result
|
5
|
+
attr_reader :formatters
|
6
6
|
|
7
|
-
def initialize(
|
8
|
-
@
|
9
|
-
|
10
|
-
@rows = rows
|
11
|
-
@attr_format = attr_format
|
12
|
-
@columns = []
|
13
|
-
@column_metadatas = extract_metadatas(columns)
|
7
|
+
def initialize(columns, rows, formatters = {}, column_types = {})
|
8
|
+
@formatters = formatters
|
9
|
+
super(columns, rows, column_types)
|
14
10
|
end
|
15
11
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
rows.map do |row|
|
20
|
-
(core.const_get klass).new(row, column_metadatas)
|
21
|
-
end
|
12
|
+
def includes_column?(name)
|
13
|
+
@columns.include? name
|
22
14
|
end
|
23
15
|
|
24
|
-
def
|
25
|
-
rows
|
26
|
-
Hash[columns.zip(row)]
|
27
|
-
end
|
16
|
+
def record
|
17
|
+
@record ||= Record.new(rows[0], columns, formatters)
|
28
18
|
end
|
29
19
|
|
30
|
-
def
|
31
|
-
records.map do |
|
32
|
-
|
20
|
+
def records
|
21
|
+
@records ||= rows.map do |row|
|
22
|
+
Record.new(row, columns, formatters)
|
33
23
|
end
|
34
24
|
end
|
35
25
|
|
36
|
-
def
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
def last
|
41
|
-
records.last
|
42
|
-
end
|
43
|
-
|
44
|
-
def size
|
45
|
-
records.size
|
46
|
-
end
|
47
|
-
alias length size
|
48
|
-
|
49
|
-
def each(&block)
|
50
|
-
records.each(&block)
|
26
|
+
def to_h
|
27
|
+
rows.map do |row|
|
28
|
+
columns.zip(row).each_with_object({}) { |cr, h| h[cr[0].to_sym] = cr[1] }
|
29
|
+
end
|
51
30
|
end
|
52
31
|
|
53
32
|
def inspect
|
54
33
|
entries = records.take(11).map!(&:inspect)
|
34
|
+
|
55
35
|
entries[10] = "..." if entries.size == 11
|
56
|
-
|
36
|
+
|
37
|
+
"#<#{self.class.name} [#{entries.join(', ')}]>"
|
57
38
|
end
|
58
39
|
|
59
|
-
|
60
|
-
|
61
|
-
@records ||= to_a
|
62
|
-
end
|
40
|
+
class Record
|
41
|
+
attr_reader :formatters
|
63
42
|
|
64
|
-
def
|
65
|
-
|
66
|
-
|
67
|
-
|
43
|
+
def initialize(row, columns, formatters)
|
44
|
+
@formatters = formatters
|
45
|
+
columns.zip(row) do |col, val|
|
46
|
+
column, value = format(col, val)
|
47
|
+
singleton_class.class_eval { attr_accessor "#{column}" }
|
48
|
+
send("#{column}=", value)
|
68
49
|
end
|
69
50
|
end
|
70
51
|
|
71
|
-
def
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
52
|
+
def inspect
|
53
|
+
inspection = if defined?(instance_variables) && instance_variables
|
54
|
+
instance_variables.reject { |var| var == :@formatters }.map do |attr|
|
55
|
+
value = instance_variable_get(attr)
|
56
|
+
"#{attr[1..-1]}: #{(value.kind_of? String) ? %Q{"#{value}"} : value}"
|
57
|
+
end.compact.join(", ")
|
58
|
+
else
|
59
|
+
"not initialized"
|
60
|
+
end
|
79
61
|
|
80
|
-
|
81
|
-
|
82
|
-
instance_variables.collect do |attr|
|
83
|
-
value = instance_variable_get(attr)
|
84
|
-
"#{attr[1..-1]}: #{(value.kind_of? String) ? %Q{"#{value}"} : value}"
|
85
|
-
end.compact.join(", ")
|
86
|
-
else
|
87
|
-
"not initialized"
|
88
|
-
end
|
62
|
+
"#<Record #{inspection}>"
|
63
|
+
end
|
89
64
|
|
90
|
-
|
65
|
+
private
|
66
|
+
def format(col, val)
|
67
|
+
column = col.downcase
|
68
|
+
format_name = formatters[column.to_sym]
|
69
|
+
unless format_name.nil?
|
70
|
+
formatter = Db2Query::Formatter.lookup(format_name)
|
71
|
+
val = formatter.format(val)
|
91
72
|
end
|
73
|
+
[column, val]
|
92
74
|
end
|
93
|
-
|
75
|
+
end
|
94
76
|
end
|
95
77
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "db2_query"
|
4
|
+
|
5
|
+
DB2_QUERY_DATABASE_TEMPLATE ||= <<-EOF
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
8
|
+
development:
|
9
|
+
dsn: TODO
|
10
|
+
pool: 5
|
11
|
+
timeout: 5
|
12
|
+
|
13
|
+
test:
|
14
|
+
dsn: TODO
|
15
|
+
pool: 5
|
16
|
+
timeout: 5
|
17
|
+
|
18
|
+
production:
|
19
|
+
dsn: TODO
|
20
|
+
pool: 5
|
21
|
+
timeout: 5
|
22
|
+
EOF
|
23
|
+
|
24
|
+
namespace :db2query do
|
25
|
+
desc "Create Database configuration file"
|
26
|
+
task :database do
|
27
|
+
database_path = "#{Rails.root}/config/db2query.yml"
|
28
|
+
if File.exist?(database_path)
|
29
|
+
raise Db2Query::Error, "Db2Query database config file exists, please check first"
|
30
|
+
else
|
31
|
+
puts " Creating database config file ..."
|
32
|
+
File.open(database_path, "w") do |file|
|
33
|
+
file.puts DB2_QUERY_DATABASE_TEMPLATE
|
34
|
+
end
|
35
|
+
puts " File '#{database_path}' created."
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
File without changes
|
@@ -1,14 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "db2_query"
|
4
|
+
|
3
5
|
DB2_QUERY_INITIALIZER_TEMPLATE ||= <<-EOF
|
4
6
|
# frozen_string_literal: true
|
5
|
-
|
6
|
-
# Example
|
7
|
+
require "db2_query"
|
7
8
|
require "db2_query/formatter"
|
8
9
|
|
10
|
+
Db2Query::Base.initiation do |base|
|
11
|
+
base.establish_connection
|
12
|
+
end
|
13
|
+
|
14
|
+
# Example
|
9
15
|
class FirstNameFormatter < Db2Query::AbstractFormatter
|
10
16
|
def format(value)
|
11
|
-
"
|
17
|
+
"Dr." + value
|
12
18
|
end
|
13
19
|
end
|
14
20
|
|
@@ -23,7 +29,7 @@ namespace :db2query do
|
|
23
29
|
# Create initializer file
|
24
30
|
initializer_path = "#{Rails.root}/config/initializers/db2query.rb"
|
25
31
|
if File.exist?(initializer_path)
|
26
|
-
raise
|
32
|
+
raise Db2Query::Error, "Db2Query initializer file exists, please check first"
|
27
33
|
else
|
28
34
|
puts " Creating initializer file ..."
|
29
35
|
File.open(initializer_path, "w") do |file|
|
data/lib/db2_query/version.rb
CHANGED
metadata
CHANGED
@@ -1,51 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: db2_query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yohanes_l
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rubocop
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 6.0.3
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
23
|
-
type: :
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 6.0.3
|
30
24
|
- - ">="
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
33
|
-
- !ruby/object:Gem::Dependency
|
34
|
-
name: ruby-odbc
|
35
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
-
requirements:
|
37
|
-
- - "~>"
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '0.99999'
|
40
|
-
type: :runtime
|
41
|
-
prerelease: false
|
42
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - "~>"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '0.99999'
|
26
|
+
version: '0'
|
47
27
|
- !ruby/object:Gem::Dependency
|
48
|
-
name: rubocop
|
28
|
+
name: rubocop-performance
|
49
29
|
requirement: !ruby/object:Gem::Requirement
|
50
30
|
requirements:
|
51
31
|
- - ">="
|
@@ -59,7 +39,7 @@ dependencies:
|
|
59
39
|
- !ruby/object:Gem::Version
|
60
40
|
version: '0'
|
61
41
|
- !ruby/object:Gem::Dependency
|
62
|
-
name: rubocop-
|
42
|
+
name: rubocop-rails
|
63
43
|
requirement: !ruby/object:Gem::Requirement
|
64
44
|
requirements:
|
65
45
|
- - ">="
|
@@ -73,7 +53,7 @@ dependencies:
|
|
73
53
|
- !ruby/object:Gem::Version
|
74
54
|
version: '0'
|
75
55
|
- !ruby/object:Gem::Dependency
|
76
|
-
name:
|
56
|
+
name: faker
|
77
57
|
requirement: !ruby/object:Gem::Requirement
|
78
58
|
requirements:
|
79
59
|
- - ">="
|
@@ -87,7 +67,7 @@ dependencies:
|
|
87
67
|
- !ruby/object:Gem::Version
|
88
68
|
version: '0'
|
89
69
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
70
|
+
name: byebug
|
91
71
|
requirement: !ruby/object:Gem::Requirement
|
92
72
|
requirements:
|
93
73
|
- - ">="
|
@@ -101,50 +81,62 @@ dependencies:
|
|
101
81
|
- !ruby/object:Gem::Version
|
102
82
|
version: '0'
|
103
83
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
84
|
+
name: rails
|
105
85
|
requirement: !ruby/object:Gem::Requirement
|
106
86
|
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 6.1.3
|
107
90
|
- - ">="
|
108
91
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
92
|
+
version: 6.1.3.2
|
110
93
|
type: :development
|
111
94
|
prerelease: false
|
112
95
|
version_requirements: !ruby/object:Gem::Requirement
|
113
96
|
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 6.1.3
|
114
100
|
- - ">="
|
115
101
|
- !ruby/object:Gem::Version
|
116
|
-
version:
|
102
|
+
version: 6.1.3.2
|
117
103
|
- !ruby/object:Gem::Dependency
|
118
|
-
name:
|
104
|
+
name: connection_pool
|
119
105
|
requirement: !ruby/object:Gem::Requirement
|
120
106
|
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '2.2'
|
121
110
|
- - ">="
|
122
111
|
- !ruby/object:Gem::Version
|
123
|
-
version:
|
124
|
-
type: :
|
112
|
+
version: 2.2.5
|
113
|
+
type: :runtime
|
125
114
|
prerelease: false
|
126
115
|
version_requirements: !ruby/object:Gem::Requirement
|
127
116
|
requirements:
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '2.2'
|
128
120
|
- - ">="
|
129
121
|
- !ruby/object:Gem::Version
|
130
|
-
version:
|
122
|
+
version: 2.2.5
|
131
123
|
- !ruby/object:Gem::Dependency
|
132
|
-
name:
|
124
|
+
name: ruby-odbc
|
133
125
|
requirement: !ruby/object:Gem::Requirement
|
134
126
|
requirements:
|
135
127
|
- - ">="
|
136
128
|
- !ruby/object:Gem::Version
|
137
129
|
version: '0'
|
138
|
-
type: :
|
130
|
+
type: :runtime
|
139
131
|
prerelease: false
|
140
132
|
version_requirements: !ruby/object:Gem::Requirement
|
141
133
|
requirements:
|
142
134
|
- - ">="
|
143
135
|
- !ruby/object:Gem::Version
|
144
136
|
version: '0'
|
145
|
-
description: A Rails
|
137
|
+
description: A Rails Db2 ODBC adapter
|
146
138
|
email:
|
147
|
-
- yohanes.lumentut@
|
139
|
+
- yohanes.lumentut@gmail.com
|
148
140
|
executables: []
|
149
141
|
extensions: []
|
150
142
|
extra_rdoc_files: []
|
@@ -154,29 +146,25 @@ files:
|
|
154
146
|
- Rakefile
|
155
147
|
- lib/db2_query.rb
|
156
148
|
- lib/db2_query/base.rb
|
157
|
-
- lib/db2_query/
|
149
|
+
- lib/db2_query/config.rb
|
158
150
|
- lib/db2_query/connection.rb
|
159
|
-
- lib/db2_query/
|
160
|
-
- lib/db2_query/database_configurations.rb
|
161
|
-
- lib/db2_query/database_statements.rb
|
151
|
+
- lib/db2_query/core.rb
|
162
152
|
- lib/db2_query/error.rb
|
163
153
|
- lib/db2_query/formatter.rb
|
164
|
-
- lib/db2_query/
|
165
|
-
- lib/db2_query/odbc_connector.rb
|
166
|
-
- lib/db2_query/path.rb
|
154
|
+
- lib/db2_query/logger.rb
|
167
155
|
- lib/db2_query/railtie.rb
|
168
156
|
- lib/db2_query/result.rb
|
169
|
-
- lib/db2_query/
|
170
|
-
- lib/db2_query/
|
157
|
+
- lib/db2_query/tasks/database.rake
|
158
|
+
- lib/db2_query/tasks/init.rake
|
159
|
+
- lib/db2_query/tasks/initializer.rake
|
171
160
|
- lib/db2_query/version.rb
|
172
|
-
|
173
|
-
- lib/tasks/init.rake
|
174
|
-
- lib/tasks/initializer.rake
|
175
|
-
homepage: https://github.com/yohaneslumentut/db2_query
|
161
|
+
homepage: https://github.com/yohaneslumentut
|
176
162
|
licenses:
|
177
163
|
- MIT
|
178
164
|
metadata:
|
179
|
-
|
165
|
+
homepage_uri: https://github.com/yohaneslumentut
|
166
|
+
source_code_uri: https://github.com/yohaneslumentut/db2_query
|
167
|
+
changelog_uri: https://github.com/yohaneslumentut/db2_query
|
180
168
|
post_install_message:
|
181
169
|
rdoc_options: []
|
182
170
|
require_paths:
|
@@ -192,8 +180,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
180
|
- !ruby/object:Gem::Version
|
193
181
|
version: '0'
|
194
182
|
requirements: []
|
195
|
-
rubygems_version: 3.
|
183
|
+
rubygems_version: 3.0.3
|
196
184
|
signing_key:
|
197
185
|
specification_version: 4
|
198
|
-
summary:
|
186
|
+
summary: Db2 ODBC adapter
|
199
187
|
test_files: []
|
data/lib/db2_query/column.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Db2Query
|
4
|
-
class Column
|
5
|
-
attr_reader :name, :type, :formatter
|
6
|
-
|
7
|
-
FLOAT_TYPES = [ODBC::SQL_FLOAT, ODBC::SQL_DOUBLE, ODBC::SQL_DECIMAL, ODBC::SQL_REAL]
|
8
|
-
INTEGER_TYPES = [ODBC::SQL_TINYINT, ODBC::SQL_SMALLINT, ODBC::SQL_INTEGER, ODBC::SQL_BIGINT, ODBC::SQL_NUMERIC]
|
9
|
-
|
10
|
-
def initialize(name, type, format = nil)
|
11
|
-
@name = name
|
12
|
-
@type = type.to_i
|
13
|
-
|
14
|
-
@formatter = if custom_format?(format)
|
15
|
-
Formatter.lookup(format)
|
16
|
-
elsif float_type?
|
17
|
-
FloatFormatter.new
|
18
|
-
elsif integer_type?
|
19
|
-
IntegerFormatter.new
|
20
|
-
else
|
21
|
-
BareFormatter.new
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def format(value)
|
26
|
-
formatter.format(value)
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
def custom_format?(format)
|
31
|
-
Formatter.registry.key?(format)
|
32
|
-
end
|
33
|
-
|
34
|
-
def float_type?
|
35
|
-
FLOAT_TYPES.include?(type)
|
36
|
-
end
|
37
|
-
|
38
|
-
def integer_type?
|
39
|
-
INTEGER_TYPES.include?(type)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|