db2_query 0.2.2 → 0.3.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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +453 -110
  4. data/Rakefile +3 -2
  5. data/lib/db2_query.rb +41 -15
  6. data/lib/db2_query/base.rb +16 -5
  7. data/lib/db2_query/config.rb +20 -17
  8. data/lib/db2_query/core.rb +68 -55
  9. data/lib/db2_query/db_client.rb +56 -0
  10. data/lib/db2_query/db_connection.rb +67 -0
  11. data/lib/db2_query/db_statements.rb +87 -0
  12. data/lib/db2_query/definitions.rb +79 -0
  13. data/lib/db2_query/error.rb +81 -0
  14. data/lib/db2_query/field_type.rb +31 -0
  15. data/lib/db2_query/helper.rb +49 -0
  16. data/lib/db2_query/logger.rb +52 -0
  17. data/lib/db2_query/query.rb +117 -0
  18. data/lib/db2_query/quoting.rb +102 -0
  19. data/lib/db2_query/railtie.rb +5 -7
  20. data/lib/db2_query/result.rb +51 -31
  21. data/lib/db2_query/sql_statement.rb +34 -0
  22. data/lib/db2_query/tasks.rb +29 -0
  23. data/lib/db2_query/tasks/database.rake +2 -50
  24. data/lib/db2_query/tasks/init.rake +1 -1
  25. data/lib/db2_query/tasks/initializer.rake +2 -34
  26. data/lib/db2_query/tasks/templates/database.rb.tt +19 -0
  27. data/lib/db2_query/tasks/templates/initializer.rb.tt +8 -0
  28. data/lib/db2_query/type/binary.rb +19 -0
  29. data/lib/db2_query/type/boolean.rb +41 -0
  30. data/lib/db2_query/type/date.rb +34 -0
  31. data/lib/db2_query/type/decimal.rb +15 -0
  32. data/lib/db2_query/type/integer.rb +15 -0
  33. data/lib/db2_query/type/string.rb +30 -0
  34. data/lib/db2_query/type/text.rb +11 -0
  35. data/lib/db2_query/type/time.rb +30 -0
  36. data/lib/db2_query/type/timestamp.rb +30 -0
  37. data/lib/db2_query/type/value.rb +29 -0
  38. data/lib/db2_query/version.rb +2 -2
  39. data/lib/rails/generators/query/USAGE +15 -0
  40. data/lib/rails/generators/query/query_generator.rb +70 -0
  41. data/lib/rails/generators/query/templates/query.rb.tt +26 -0
  42. data/lib/rails/generators/query/templates/query_definitions.rb.tt +12 -0
  43. data/lib/rails/generators/query/templates/unit_test.rb.tt +9 -0
  44. metadata +62 -49
  45. data/lib/db2_query/connection.rb +0 -163
  46. data/lib/db2_query/connection_handling.rb +0 -112
  47. data/lib/db2_query/database_statements.rb +0 -93
  48. data/lib/db2_query/formatter.rb +0 -27
  49. data/lib/db2_query/odbc_connector.rb +0 -40
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Decimal < Value
6
+ def type
7
+ :decimal
8
+ end
9
+
10
+ def deserialize(value)
11
+ value.to_f
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Integer < Value
6
+ def type
7
+ :integer
8
+ end
9
+
10
+ def deserialize(value)
11
+ value.to_i
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class String < Value
6
+ DEFAULT = { trim: false }
7
+
8
+ def initialize(options = DEFAULT)
9
+ super(options)
10
+ end
11
+
12
+ def type
13
+ :string
14
+ end
15
+
16
+ def deserialize(value)
17
+ value.strip! if options[:trim]
18
+ case value
19
+ when ::String then
20
+ if value == "null"
21
+ nil
22
+ else
23
+ ::String.new(value)
24
+ end
25
+ else value.to_s
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Text < String
6
+ def type
7
+ :text
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Time < Value
6
+ def type
7
+ :time
8
+ end
9
+
10
+ def serialize(value)
11
+ if value.is_a?(::String)
12
+ case value
13
+ when /\A(\d\d)[:,.](\d\d)[:,.](\d\d)\z/
14
+ quote(value)
15
+ else
16
+ nil
17
+ end
18
+ elsif value.is_a?(::Time)
19
+ quote(value.strftime("%T"))
20
+ else
21
+ nil
22
+ end
23
+ end
24
+
25
+ def deserialize(value)
26
+ value.strftime("%H:%M:%S")
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Timestamp < Value
6
+ def type
7
+ :time
8
+ end
9
+
10
+ def serialize(value)
11
+ if value.is_a?(::String)
12
+ case value
13
+ when /\A(\d{4})-(\d\d)-(\d\d)-(\d\d).(\d\d).(\d\d).(\d{1,6})\z/
14
+ quote(value)
15
+ else
16
+ nil
17
+ end
18
+ elsif value.is_a?(::DateTime) || value.is_a?(::Time)
19
+ quote(value.strftime("%F-%H.%M.%S.%6N"))
20
+ else
21
+ nil
22
+ end
23
+ end
24
+
25
+ def deserialize(value)
26
+ value
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Value
6
+ attr_reader :options
7
+
8
+ def initialize(options = {})
9
+ @options = options
10
+ end
11
+
12
+ def type_name
13
+ :value
14
+ end
15
+
16
+ def serialize(value)
17
+ value
18
+ end
19
+
20
+ def deserialize(value)
21
+ value
22
+ end
23
+
24
+ def quote(value)
25
+ "'#{value}'"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module DB2Query
4
- VERSION = "0.2.2"
3
+ module Db2Query
4
+ VERSION = "0.3.2"
5
5
  end
@@ -0,0 +1,15 @@
1
+ Description:
2
+ Stubs out a new query. Pass the query name, either
3
+ CamelCased or under_scored, and an optional list of its methods as arguments.
4
+
5
+ To create a query within a module, just use namespace pattern as the other rails generators do.
6
+
7
+ To create query class methods, you can use 3 options:
8
+ 1. Plain SQL methods --defines
9
+ 2. Query Methods with SQL string, --queries
10
+ 3. Query Methods with lambda, --lambdas
11
+
12
+ Example:
13
+ $ rails g query NameSpace::Name --queries query_1 --defines query_2 --lambdas query_3
14
+ create app/queries/name_space/name_query.rb
15
+ create test/queries/name_space/name_query_test.rb
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+ require "fileutils"
5
+
6
+ module Rails
7
+ module Generators
8
+ class QueryGenerator < Rails::Generators::NamedBase
9
+ source_root File.expand_path("../templates", __FILE__)
10
+
11
+ class_option :skip_unit_test, type: :boolean, default: false, desc: "Skip unit test file creation"
12
+ class_option :defines, type: :array, default: [], desc: "Plain query method options"
13
+ class_option :queries, type: :array, default: [], desc: "Query method SQL options"
14
+ class_option :lambdas, type: :array, default: [], desc: "Query method with callable args"
15
+
16
+ def create_query_file
17
+ template "query.rb", File.join("app/queries", class_path, "#{file_name}_query.rb")
18
+ end
19
+
20
+ def create_query_definitions_file
21
+ template "query_definitions.rb", File.join("app/queries/definitions", class_path, "#{file_name}_query_definitions.rb")
22
+ end
23
+
24
+ def create_query_test_file
25
+ unless options[:skip_unit_test]
26
+ template "unit_test.rb", File.join("test/queries", class_path, "#{file_name}_query_test.rb")
27
+ end
28
+ end
29
+
30
+ private
31
+ def assign_names!(name)
32
+ super(name)
33
+ @method_options = options.slice("defines", "queries", "lambdas")
34
+ @query_methods = @method_options.map { |key, val| val }.flatten
35
+ end
36
+
37
+ def query_class_name
38
+ "#{file_name.camelize}Query"
39
+ end
40
+
41
+ def namespaced_query?
42
+ !class_path.empty?
43
+ end
44
+
45
+ def namespaced_names
46
+ class_path
47
+ end
48
+
49
+ def namespaced_content(content)
50
+ namespaced_names.reverse_each do |namespace_name|
51
+ content = "module #{namespace_name.camelize}\n#{indent(content)}\nend"
52
+ end
53
+ content
54
+ end
55
+
56
+ def module_namespacing(&block)
57
+ content = capture(&block)
58
+ content = namespaced_content(content) if namespaced_query?
59
+ concat(content)
60
+ end
61
+
62
+ def module_definitions_namespacing(&block)
63
+ content = capture(&block)
64
+ content = namespaced_content(content) if namespaced_query?
65
+ definitions_namespace_content = "module Definitions\n#{indent(content)}\nend"
66
+ concat(definitions_namespace_content)
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= query_class_name %> < <%= "Db2Query::Base" -%>
5
+ <% if @query_methods.empty? %>
6
+ <%= indent("query :to_do, <<-SQL\n") %>
7
+ <%= indent("SQL\n") %>
8
+ <%= indent("def to_do_sql\n") %>
9
+ <%= indent("end") %>
10
+ <% end -%>
11
+ <% @method_options.each do |key, val| -%>
12
+ <% val.each_with_index do |option, index| -%>
13
+ <% case key when 'defines' -%>
14
+ <%= indent("def #{option}_sql\n") %>
15
+ <%= indent("end") %>
16
+ <% when 'queries' %>
17
+ <%= indent("query :#{option}, <<-SQL\n") %>
18
+ <%= indent("SQL") %>
19
+ <% when 'lambdas' %>
20
+ <%= indent("query :#{option}, -> args {\n") %>
21
+ <%= indent("}") %>
22
+ <% end -%>
23
+ <% end -%>
24
+ <% end -%>
25
+ <%= 'end' -%>
26
+ <% end %>
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_definitions_namespacing do -%>
4
+ class <%= query_class_name %>Definitions < <%= "Db2Query::Definitions" %>
5
+ <%= indent("def describe") -%>
6
+ <% @query_methods.each do |method| %>
7
+ <%= indent("query_definition :#{method} do |c|\n") %>
8
+ <%= indent("end") %>
9
+ <% end -%>
10
+ <%= indent("end") %>
11
+ <%= 'end' -%>
12
+ <% end %>
@@ -0,0 +1,9 @@
1
+ require "test_helper"
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= query_class_name %>Test < ActiveSupport::TestCase
5
+ # test "the truth" do
6
+ # assert true
7
+ # end
8
+ <%= 'end' -%>
9
+ <% end %>
metadata CHANGED
@@ -1,57 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: db2_query
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - yohanes_l
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-10 00:00:00.000000000 Z
11
+ date: 2021-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: ruby-odbc
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '0.99999'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '0.99999'
27
- - !ruby/object:Gem::Dependency
28
- name: activesupport
14
+ name: tty-progressbar
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: 6.0.3
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: 6.0.3
41
- - !ruby/object:Gem::Dependency
42
- name: activerecord
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
17
+ - - ">="
46
18
  - !ruby/object:Gem::Version
47
- version: 6.0.3
48
- type: :runtime
19
+ version: '0'
20
+ type: :development
49
21
  prerelease: false
50
22
  version_requirements: !ruby/object:Gem::Requirement
51
23
  requirements:
52
- - - "~>"
24
+ - - ">="
53
25
  - !ruby/object:Gem::Version
54
- version: 6.0.3
26
+ version: '0'
55
27
  - !ruby/object:Gem::Dependency
56
28
  name: rubocop
57
29
  requirement: !ruby/object:Gem::Requirement
@@ -109,7 +81,7 @@ dependencies:
109
81
  - !ruby/object:Gem::Version
110
82
  version: '0'
111
83
  - !ruby/object:Gem::Dependency
112
- name: dotenv
84
+ name: byebug
113
85
  requirement: !ruby/object:Gem::Requirement
114
86
  requirements:
115
87
  - - ">="
@@ -123,7 +95,7 @@ dependencies:
123
95
  - !ruby/object:Gem::Version
124
96
  version: '0'
125
97
  - !ruby/object:Gem::Dependency
126
- name: byebug
98
+ name: rails
127
99
  requirement: !ruby/object:Gem::Requirement
128
100
  requirements:
129
101
  - - ">="
@@ -137,22 +109,37 @@ dependencies:
137
109
  - !ruby/object:Gem::Version
138
110
  version: '0'
139
111
  - !ruby/object:Gem::Dependency
140
- name: sqlite3
112
+ name: connection_pool
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 2.2.5
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 2.2.5
125
+ - !ruby/object:Gem::Dependency
126
+ name: ruby-odbc
141
127
  requirement: !ruby/object:Gem::Requirement
142
128
  requirements:
143
129
  - - ">="
144
130
  - !ruby/object:Gem::Version
145
131
  version: '0'
146
- type: :development
132
+ type: :runtime
147
133
  prerelease: false
148
134
  version_requirements: !ruby/object:Gem::Requirement
149
135
  requirements:
150
136
  - - ">="
151
137
  - !ruby/object:Gem::Version
152
138
  version: '0'
153
- description: A Rails query plugin to fetch data from Db2 database by using ODBC connection.
139
+ description: A Rails 5 & Rails 6 plugin for handling Db2 SQL SIUD statement (SELECT,
140
+ INSERT, UPDATE, DELETE) by using ODBC connection.
154
141
  email:
155
- - yohanes.lumentut@yahoo.com
142
+ - yohanes.lumentut@gmail.com
156
143
  executables: []
157
144
  extensions: []
158
145
  extra_rdoc_files: []
@@ -163,23 +150,49 @@ files:
163
150
  - lib/db2_query.rb
164
151
  - lib/db2_query/base.rb
165
152
  - lib/db2_query/config.rb
166
- - lib/db2_query/connection.rb
167
- - lib/db2_query/connection_handling.rb
168
153
  - lib/db2_query/core.rb
169
- - lib/db2_query/database_statements.rb
170
- - lib/db2_query/formatter.rb
171
- - lib/db2_query/odbc_connector.rb
154
+ - lib/db2_query/db_client.rb
155
+ - lib/db2_query/db_connection.rb
156
+ - lib/db2_query/db_statements.rb
157
+ - lib/db2_query/definitions.rb
158
+ - lib/db2_query/error.rb
159
+ - lib/db2_query/field_type.rb
160
+ - lib/db2_query/helper.rb
161
+ - lib/db2_query/logger.rb
162
+ - lib/db2_query/query.rb
163
+ - lib/db2_query/quoting.rb
172
164
  - lib/db2_query/railtie.rb
173
165
  - lib/db2_query/result.rb
166
+ - lib/db2_query/sql_statement.rb
167
+ - lib/db2_query/tasks.rb
174
168
  - lib/db2_query/tasks/database.rake
175
169
  - lib/db2_query/tasks/init.rake
176
170
  - lib/db2_query/tasks/initializer.rake
171
+ - lib/db2_query/tasks/templates/database.rb.tt
172
+ - lib/db2_query/tasks/templates/initializer.rb.tt
173
+ - lib/db2_query/type/binary.rb
174
+ - lib/db2_query/type/boolean.rb
175
+ - lib/db2_query/type/date.rb
176
+ - lib/db2_query/type/decimal.rb
177
+ - lib/db2_query/type/integer.rb
178
+ - lib/db2_query/type/string.rb
179
+ - lib/db2_query/type/text.rb
180
+ - lib/db2_query/type/time.rb
181
+ - lib/db2_query/type/timestamp.rb
182
+ - lib/db2_query/type/value.rb
177
183
  - lib/db2_query/version.rb
184
+ - lib/rails/generators/query/USAGE
185
+ - lib/rails/generators/query/query_generator.rb
186
+ - lib/rails/generators/query/templates/query.rb.tt
187
+ - lib/rails/generators/query/templates/query_definitions.rb.tt
188
+ - lib/rails/generators/query/templates/unit_test.rb.tt
178
189
  homepage: https://github.com/yohaneslumentut/db2_query
179
190
  licenses:
180
191
  - MIT
181
192
  metadata:
182
- allowed_push_host: https://rubygems.org
193
+ homepage_uri: https://github.com/yohaneslumentut/db2_query
194
+ source_code_uri: https://github.com/yohaneslumentut/db2_query
195
+ changelog_uri: https://github.com/yohaneslumentut/db2_query
183
196
  post_install_message:
184
197
  rdoc_options: []
185
198
  require_paths:
@@ -198,5 +211,5 @@ requirements: []
198
211
  rubygems_version: 3.0.3
199
212
  signing_key:
200
213
  specification_version: 4
201
- summary: DB2Query
214
+ summary: Rails Db2 ODBC plugin
202
215
  test_files: []