db2_query 0.2.3 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
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