db2_query 0.2.3 → 0.3.3

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 +472 -124
  4. data/Rakefile +3 -2
  5. data/lib/db2_query/base.rb +15 -5
  6. data/lib/db2_query/config.rb +20 -17
  7. data/lib/db2_query/core.rb +79 -60
  8. data/lib/db2_query/db_client.rb +56 -0
  9. data/lib/db2_query/db_connection.rb +68 -0
  10. data/lib/db2_query/db_statements.rb +87 -0
  11. data/lib/db2_query/definitions.rb +93 -0
  12. data/lib/db2_query/error.rb +72 -7
  13. data/lib/db2_query/field_type.rb +31 -0
  14. data/lib/db2_query/helper.rb +50 -0
  15. data/lib/db2_query/logger.rb +52 -0
  16. data/lib/db2_query/query.rb +128 -0
  17. data/lib/db2_query/railtie.rb +5 -10
  18. data/lib/db2_query/result.rb +51 -31
  19. data/lib/db2_query/sql_statement.rb +34 -0
  20. data/lib/db2_query/tasks/database.rake +2 -46
  21. data/lib/db2_query/tasks/init.rake +1 -1
  22. data/lib/db2_query/tasks/initializer.rake +2 -34
  23. data/lib/db2_query/tasks/templates/database.rb.tt +19 -0
  24. data/lib/db2_query/tasks/templates/initializer.rb.tt +8 -0
  25. data/lib/db2_query/tasks.rb +29 -0
  26. data/lib/db2_query/type/binary.rb +19 -0
  27. data/lib/db2_query/type/boolean.rb +41 -0
  28. data/lib/db2_query/type/date.rb +34 -0
  29. data/lib/db2_query/type/decimal.rb +15 -0
  30. data/lib/db2_query/type/integer.rb +15 -0
  31. data/lib/db2_query/type/string.rb +30 -0
  32. data/lib/db2_query/type/text.rb +11 -0
  33. data/lib/db2_query/type/time.rb +30 -0
  34. data/lib/db2_query/type/timestamp.rb +30 -0
  35. data/lib/db2_query/type/value.rb +29 -0
  36. data/lib/db2_query/version.rb +2 -2
  37. data/lib/db2_query.rb +42 -18
  38. data/lib/rails/generators/query/USAGE +15 -0
  39. data/lib/rails/generators/query/query_generator.rb +70 -0
  40. data/lib/rails/generators/query/templates/query.rb.tt +26 -0
  41. data/lib/rails/generators/query/templates/query_definitions.rb.tt +18 -0
  42. data/lib/rails/generators/query/templates/unit_test.rb.tt +9 -0
  43. metadata +74 -36
  44. data/lib/db2_query/bind.rb +0 -6
  45. data/lib/db2_query/connection.rb +0 -164
  46. data/lib/db2_query/connection_handling.rb +0 -112
  47. data/lib/db2_query/database_statements.rb +0 -89
  48. data/lib/db2_query/formatter.rb +0 -27
  49. data/lib/db2_query/odbc_connector.rb +0 -44
@@ -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.3"
3
+ module Db2Query
4
+ VERSION = "0.3.3"
5
5
  end
data/lib/db2_query.rb CHANGED
@@ -1,25 +1,49 @@
1
- # frozen_string_literal:true
1
+ # frozen_string_literal: true
2
2
 
3
- require "yaml"
4
- require "erb"
5
- require "active_record"
6
3
  require "active_support"
7
- require "db2_query/config"
4
+ require "active_support/concurrency/load_interlock_aware_monitor"
5
+ require "active_record"
6
+ require "active_model/type"
7
+ require "connection_pool"
8
+ require "odbc_utf8"
8
9
  require "db2_query/error"
9
- require "db2_query/connection_handling"
10
10
 
11
- module DB2Query
12
- extend ActiveSupport::Autoload
11
+ module Db2Query
12
+ autoload :Version, "db2_query/version"
13
+ autoload :Error, "db2_query/error"
14
+ autoload :Config, "db2_query/config"
15
+ autoload :Logger, "db2_query/logger"
16
+ autoload :DbClient, "db2_query/db_client"
17
+ autoload :DbStatements, "db2_query/db_statements"
18
+ autoload :Validations, "db2_query/validations"
19
+ autoload :Helper, "db2_query/helper"
20
+ autoload :Quoting, "db2_query/quoting"
21
+ autoload :FieldType, "db2_query/field_type"
13
22
 
14
- autoload :Version
15
- autoload :Base
16
- autoload :Bind
17
- autoload :Core
18
- autoload :DatabaseStatements
19
- autoload :Connection
20
- autoload :ODBCConnector
21
- autoload :Formatter
22
- autoload :Result
23
+ module Type
24
+ autoload :Value, "db2_query/type/value"
25
+ autoload :Binary, "db2_query/type/binary"
26
+ autoload :Boolean, "db2_query/type/boolean"
27
+ autoload :Decimal, "db2_query/type/decimal"
28
+ autoload :String, "db2_query/type/string"
29
+ autoload :Text, "db2_query/type/text"
30
+ autoload :Integer, "db2_query/type/integer"
31
+ autoload :Time, "db2_query/type/time"
32
+ autoload :Timestamp, "db2_query/type/timestamp"
33
+ autoload :Date, "db2_query/type/date"
34
+ end
23
35
 
24
- require "db2_query/railtie" if defined?(Rails)
36
+ autoload :SqlStatement, "db2_query/sql_statement"
37
+ autoload :Query, "db2_query/query"
38
+ autoload :Definitions, "db2_query/definitions"
39
+ autoload :DbConnection, "db2_query/db_connection"
40
+ autoload :Result, "db2_query/result"
41
+ autoload :Core, "db2_query/core"
42
+ autoload :Base, "db2_query/base"
43
+
44
+ def self.root
45
+ __dir__
46
+ end
25
47
  end
48
+
49
+ require "db2_query/railtie" if defined?(Rails)
@@ -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,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_definitions_namespacing do -%>
4
+ class <%= query_class_name %>Definitions < <%= "Db2Query::Definitions" %>
5
+ <% if @query_methods.empty? %>
6
+ <%= indent("def describe\n") -%>
7
+ <%= indent("") %>
8
+ <%= indent("end") %>
9
+ <% else %>
10
+ <%= indent("def describe") -%>
11
+ <% @query_methods.each do |method| %>
12
+ <%= indent("query_definition :#{method} do |c|\n") %>
13
+ <%= indent("end") %>
14
+ <% end -%>
15
+ <%= indent("end") %>
16
+ <% end %>
17
+ <%= 'end' -%>
18
+ <% 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,59 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: db2_query
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.3
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-13 00:00:00.000000000 Z
11
+ date: 2021-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: ruby-odbc
14
+ name: tty-progressbar
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0.99999'
20
- type: :runtime
19
+ version: '0'
20
+ type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0.99999'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: activesupport
28
+ name: rubocop
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 6.0.3
34
- type: :runtime
33
+ version: '0'
34
+ type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 6.0.3
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: activerecord
42
+ name: rubocop-performance
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 6.0.3
48
- type: :runtime
47
+ version: '0'
48
+ type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 6.0.3
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rubocop
56
+ name: rubocop-rails
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rubocop-performance
70
+ name: faker
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rubocop-rails
84
+ name: byebug
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: faker
98
+ name: rails
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,22 +109,37 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: byebug
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
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - ">="
116
130
  - !ruby/object:Gem::Version
117
131
  version: '0'
118
- type: :development
132
+ type: :runtime
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
136
  - - ">="
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
- 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.
126
141
  email:
127
- - yohanes.lumentut@yahoo.com
142
+ - yohanes.lumentut@gmail.com
128
143
  executables: []
129
144
  extensions: []
130
145
  extra_rdoc_files: []
@@ -134,26 +149,49 @@ files:
134
149
  - Rakefile
135
150
  - lib/db2_query.rb
136
151
  - lib/db2_query/base.rb
137
- - lib/db2_query/bind.rb
138
152
  - lib/db2_query/config.rb
139
- - lib/db2_query/connection.rb
140
- - lib/db2_query/connection_handling.rb
141
153
  - lib/db2_query/core.rb
142
- - lib/db2_query/database_statements.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
143
158
  - lib/db2_query/error.rb
144
- - lib/db2_query/formatter.rb
145
- - lib/db2_query/odbc_connector.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
146
163
  - lib/db2_query/railtie.rb
147
164
  - lib/db2_query/result.rb
165
+ - lib/db2_query/sql_statement.rb
166
+ - lib/db2_query/tasks.rb
148
167
  - lib/db2_query/tasks/database.rake
149
168
  - lib/db2_query/tasks/init.rake
150
169
  - lib/db2_query/tasks/initializer.rake
170
+ - lib/db2_query/tasks/templates/database.rb.tt
171
+ - lib/db2_query/tasks/templates/initializer.rb.tt
172
+ - lib/db2_query/type/binary.rb
173
+ - lib/db2_query/type/boolean.rb
174
+ - lib/db2_query/type/date.rb
175
+ - lib/db2_query/type/decimal.rb
176
+ - lib/db2_query/type/integer.rb
177
+ - lib/db2_query/type/string.rb
178
+ - lib/db2_query/type/text.rb
179
+ - lib/db2_query/type/time.rb
180
+ - lib/db2_query/type/timestamp.rb
181
+ - lib/db2_query/type/value.rb
151
182
  - lib/db2_query/version.rb
183
+ - lib/rails/generators/query/USAGE
184
+ - lib/rails/generators/query/query_generator.rb
185
+ - lib/rails/generators/query/templates/query.rb.tt
186
+ - lib/rails/generators/query/templates/query_definitions.rb.tt
187
+ - lib/rails/generators/query/templates/unit_test.rb.tt
152
188
  homepage: https://github.com/yohaneslumentut/db2_query
153
189
  licenses:
154
190
  - MIT
155
191
  metadata:
156
- allowed_push_host: https://rubygems.org
192
+ homepage_uri: https://github.com/yohaneslumentut/db2_query
193
+ source_code_uri: https://github.com/yohaneslumentut/db2_query
194
+ changelog_uri: https://github.com/yohaneslumentut/db2_query
157
195
  post_install_message:
158
196
  rdoc_options: []
159
197
  require_paths:
@@ -172,5 +210,5 @@ requirements: []
172
210
  rubygems_version: 3.1.3
173
211
  signing_key:
174
212
  specification_version: 4
175
- summary: DB2Query
213
+ summary: Rails Db2 ODBC plugin
176
214
  test_files: []
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module DB2Query
4
- class Bind < Struct.new(:name, :value, :index)
5
- end
6
- end