db2_query 0.3.2 → 0.3.6

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.
@@ -39,7 +39,7 @@ module Db2Query
39
39
  end
40
40
  end
41
41
 
42
- class ExtentionError < StandardError
42
+ class ExtensionError < StandardError
43
43
  end
44
44
 
45
45
  class ImplementationError < StandardError
@@ -78,4 +78,16 @@ module Db2Query
78
78
  "The query body needs to be callable or is a SQL statement string"
79
79
  end
80
80
  end
81
+
82
+ class QueryArgumentError < StandardError
83
+ def initialize(query_name, arg_key)
84
+ @query_name = query_name
85
+ @arg_key = arg_key
86
+ super(message)
87
+ end
88
+
89
+ def message
90
+ "Data type of `#{@arg_key}` not found at `:#{@query_name}` query definitions"
91
+ end
92
+ end
81
93
  end
@@ -16,12 +16,13 @@ module Db2Query
16
16
  sql.gsub("@list", "'#{list.join("', '")}'")
17
17
  end
18
18
 
19
- def sql_with_extention(sql, extention)
20
- if sql.scan(/\@extention+/).length == 0
21
- raise Db2Query::ExtentionError, "Missing @extention pointer at SQL"
19
+ def sql_with_extension(sql, extension)
20
+ if sql.scan(/\@extension+/).length == 0
21
+ raise Db2Query::ExtensionError, "Missing @extension pointer at SQL"
22
22
  end
23
- sql.gsub("@extention", extention.strip)
23
+ sql.gsub("@extension", extension.strip)
24
24
  end
25
+ alias sql_with_extention sql_with_extension
25
26
 
26
27
  private
27
28
  def sql_query_methods
@@ -42,7 +43,7 @@ module Db2Query
42
43
  end
43
44
 
44
45
  def fetch_error_message
45
- "`fetch`, `fetch_list` and `fetch_extention` methods applied for SQL `select` statement only."
46
+ "`fetch`, `fetch_list` and `fetch_extension` methods applied for SQL `select` statement only."
46
47
  end
47
48
  end
48
49
  end
@@ -22,7 +22,7 @@ module Db2Query
22
22
  statement_name: nil,
23
23
  connection_id: object_id,
24
24
  connection: self) do
25
- synchronize do
25
+ mutex.synchronize do
26
26
  yield
27
27
  end
28
28
  rescue => e
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Db2Query
4
4
  class Query
5
- attr_reader :columns, :keys, :query_name, :sql, :types
5
+ attr_reader :query_name, :sql, :columns, :keys, :types, :argument_types
6
6
 
7
7
  include SqlStatement
8
8
 
@@ -10,12 +10,16 @@ module Db2Query
10
10
  @columns = {}
11
11
  @query_name = query_name
12
12
  @sql_statement = nil
13
+ @argument_types = {}
13
14
  @types = {}
14
15
  end
15
16
 
16
- def define_sql(sql)
17
- @keys ||= new_keys(sql)
18
- @sql ||= sql.tr("$", "")
17
+ def define_sql(raw_sql)
18
+ @keys = []
19
+ @sql = raw_sql.gsub(/:\w+/) do |match|
20
+ @keys << match[1..]
21
+ '?'
22
+ end
19
23
  end
20
24
 
21
25
  def map_column(name, args)
@@ -33,6 +37,19 @@ module Db2Query
33
37
  raise Db2Query::Error, "No column #{column} found at query: #{query_name} definitions"
34
38
  end
35
39
 
40
+ def argument_type(key)
41
+ argument_types.fetch(key) || data_type(key)
42
+ rescue
43
+ raise Db2Query::Error, "No argument #{key} type found at query: #{query_name}"
44
+ end
45
+
46
+ def argument_keys
47
+ keys.map do |key|
48
+ arg_key = "#{key}".split(".").last
49
+ arg_key.to_sym unless arg_key.nil?
50
+ end
51
+ end
52
+
36
53
  def length
37
54
  columns.length
38
55
  end
@@ -52,7 +69,7 @@ module Db2Query
52
69
  end
53
70
 
54
71
  def sorted_args(args)
55
- keys.map.with_index do |key, index|
72
+ argument_keys.map.with_index do |key, index|
56
73
  serialized_arg(args.is_a?(Hash) ? args[key] : args[index], key)
57
74
  end
58
75
  end
@@ -82,12 +99,12 @@ module Db2Query
82
99
  end
83
100
 
84
101
  private
85
- def new_keys(raw_sql)
86
- raw_sql.scan(/\$\S+/).map { |key| key.gsub!(/[$=,)]/, "").to_sym }
87
- end
102
+ # def sql_arguments(raw_sql)
103
+ # raw_sql.scan(/\$\S+/).map { |arg| arg.gsub!(/[$=,)]/, "").to_sym }
104
+ # end
88
105
 
89
106
  def serialized_arg(arg, key)
90
- query_name.nil? ? arg : data_type(key).serialize(arg)
107
+ query_name.nil? ? arg : argument_type(key).serialize(arg)
91
108
  end
92
109
 
93
110
  def column_from_key(key)
@@ -104,14 +121,11 @@ module Db2Query
104
121
  end
105
122
  end
106
123
 
107
- def validate_arguments(given, expected)
108
- raise Db2Query::ArgumentError.new(given, expected) unless given == expected
109
- end
110
-
111
124
  def validated_args(args)
112
- args = args.first.is_a?(Hash) ? args.first : args
113
- validate_arguments(args.length, keys.length)
114
- sorted_args(args)
125
+ arguments = args.first.is_a?(Hash) ? args.first : args
126
+ given, expected = [arguments.length, keys.length]
127
+ raise Db2Query::ArgumentError.new(given, expected) unless given == expected
128
+ sorted_args(arguments)
115
129
  end
116
130
  end
117
131
  end
@@ -1,18 +1,4 @@
1
- # frozen_string_literal: true
2
-
3
- require "db2_query"
4
- require "rails"
5
-
6
1
  module Db2Query
7
2
  class Railtie < ::Rails::Railtie
8
- railtie_name :db2_query
9
-
10
- rake_tasks do
11
- Dir.glob("#{Db2Query.root}/db2_query/tasks/*.rake").each { |f| load f }
12
- end
13
-
14
- config.app_generators do
15
- require "#{Db2Query.root}/rails/generators/query/query_generator.rb"
16
- end
17
3
  end
18
4
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Db2Query
4
- VERSION = "0.3.2"
2
+ VERSION = "0.3.6"
5
3
  end
data/lib/db2_query.rb CHANGED
@@ -1,14 +1,11 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_record"
4
- require "active_support"
5
- require "active_support/concurrency/load_interlock_aware_monitor"
6
- require "active_model/type"
1
+ require "db2_query/version"
2
+ require "db2_query/railtie"
7
3
  require "connection_pool"
8
4
  require "odbc_utf8"
9
5
  require "db2_query/error"
10
6
 
11
7
  module Db2Query
8
+ # Your code goes here...
12
9
  autoload :Version, "db2_query/version"
13
10
  autoload :Error, "db2_query/error"
14
11
  autoload :Config, "db2_query/config"
@@ -44,6 +41,4 @@ module Db2Query
44
41
  def self.root
45
42
  __dir__
46
43
  end
47
-
48
- require "db2_query/railtie" if defined?(Rails)
49
44
  end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :db2_query do
3
+ # # Task goes here
4
+ # end
metadata CHANGED
@@ -1,125 +1,75 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: db2_query
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
- - yohanes_l
7
+ - Yohanes Lumentut
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-01 00:00:00.000000000 Z
11
+ date: 2024-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: tty-progressbar
14
+ name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
19
+ version: '7.1'
24
20
  - - ">="
25
21
  - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: rubocop
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
22
+ version: 7.1.2
23
+ type: :runtime
35
24
  prerelease: false
36
25
  version_requirements: !ruby/object:Gem::Requirement
37
26
  requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: rubocop-performance
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
27
+ - - "~>"
46
28
  - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
29
+ version: '7.1'
52
30
  - - ">="
53
31
  - !ruby/object:Gem::Version
54
- version: '0'
32
+ version: 7.1.2
55
33
  - !ruby/object:Gem::Dependency
56
- name: rubocop-rails
34
+ name: tty-progressbar
57
35
  requirement: !ruby/object:Gem::Requirement
58
36
  requirements:
59
- - - ">="
37
+ - - "~>"
60
38
  - !ruby/object:Gem::Version
61
- version: '0'
39
+ version: '0.18'
62
40
  type: :development
63
41
  prerelease: false
64
42
  version_requirements: !ruby/object:Gem::Requirement
65
43
  requirements:
66
- - - ">="
44
+ - - "~>"
67
45
  - !ruby/object:Gem::Version
68
- version: '0'
46
+ version: '0.18'
69
47
  - !ruby/object:Gem::Dependency
70
48
  name: faker
71
49
  requirement: !ruby/object:Gem::Requirement
72
50
  requirements:
73
- - - ">="
51
+ - - "~>"
74
52
  - !ruby/object:Gem::Version
75
- version: '0'
53
+ version: '3.2'
76
54
  type: :development
77
55
  prerelease: false
78
56
  version_requirements: !ruby/object:Gem::Requirement
79
57
  requirements:
80
- - - ">="
58
+ - - "~>"
81
59
  - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: byebug
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rails
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
60
+ version: '3.2'
111
61
  - !ruby/object:Gem::Dependency
112
62
  name: connection_pool
113
63
  requirement: !ruby/object:Gem::Requirement
114
64
  requirements:
115
- - - '='
65
+ - - "~>"
116
66
  - !ruby/object:Gem::Version
117
67
  version: 2.2.5
118
68
  type: :runtime
119
69
  prerelease: false
120
70
  version_requirements: !ruby/object:Gem::Requirement
121
71
  requirements:
122
- - - '='
72
+ - - "~>"
123
73
  - !ruby/object:Gem::Version
124
74
  version: 2.2.5
125
75
  - !ruby/object:Gem::Dependency
@@ -136,8 +86,8 @@ dependencies:
136
86
  - - ">="
137
87
  - !ruby/object:Gem::Version
138
88
  version: '0'
139
- description: A Rails 5 & Rails 6 plugin for handling Db2 SQL SIUD statement (SELECT,
140
- INSERT, UPDATE, DELETE) by using ODBC connection.
89
+ description: A Rails 7 (Ruby v3.1.0) plugin for connecting Db2 with Rails appplication
90
+ by using ODBC connection.
141
91
  email:
142
92
  - yohanes.lumentut@gmail.com
143
93
  executables: []
@@ -160,16 +110,10 @@ files:
160
110
  - lib/db2_query/helper.rb
161
111
  - lib/db2_query/logger.rb
162
112
  - lib/db2_query/query.rb
163
- - lib/db2_query/quoting.rb
164
113
  - lib/db2_query/railtie.rb
165
114
  - lib/db2_query/result.rb
166
115
  - lib/db2_query/sql_statement.rb
167
116
  - lib/db2_query/tasks.rb
168
- - lib/db2_query/tasks/database.rake
169
- - lib/db2_query/tasks/init.rake
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
117
  - lib/db2_query/type/binary.rb
174
118
  - lib/db2_query/type/boolean.rb
175
119
  - lib/db2_query/type/date.rb
@@ -181,11 +125,7 @@ files:
181
125
  - lib/db2_query/type/timestamp.rb
182
126
  - lib/db2_query/type/value.rb
183
127
  - 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
128
+ - lib/tasks/db2_query_tasks.rake
189
129
  homepage: https://github.com/yohaneslumentut/db2_query
190
130
  licenses:
191
131
  - MIT
@@ -208,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
208
148
  - !ruby/object:Gem::Version
209
149
  version: '0'
210
150
  requirements: []
211
- rubygems_version: 3.0.3
151
+ rubygems_version: 3.3.3
212
152
  signing_key:
213
153
  specification_version: 4
214
154
  summary: Rails Db2 ODBC plugin
@@ -1,102 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Db2Query
4
- module Quoting
5
- def self.included(base)
6
- base.send(:extend, ClassMethods)
7
- end
8
-
9
- module ClassMethods
10
- def quoted_true
11
- "TRUE"
12
- end
13
-
14
- def unquoted_true
15
- 1
16
- end
17
-
18
- def quoted_false
19
- "FALSE"
20
- end
21
-
22
- def unquoted_false
23
- 0
24
- end
25
-
26
- def quoted_binary(value)
27
- "x'#{value.hex}'"
28
- end
29
-
30
- def quoted_time(value)
31
- value = value.change(year: 2000, month: 1, day: 1)
32
- quoted_date(value).sub(/\A\d\d\d\d-\d\d-\d\d /, "")
33
- end
34
-
35
- def quoted_date(value)
36
- if value.acts_like?(:time)
37
- if ActiveRecord::Base.default_timezone == :utc
38
- value = value.getutc if !value.utc?
39
- else
40
- value = value.getlocal
41
- end
42
- end
43
-
44
- result = value.to_s(:db)
45
- if value.respond_to?(:usec) && value.usec > 0
46
- result << "." << sprintf("%06d", value.usec)
47
- else
48
- result
49
- end
50
- end
51
-
52
- private
53
- def _quote(value)
54
- case value
55
- when String, Symbol, ActiveSupport::Multibyte::Chars
56
- "'#{quote_string(value.to_s)}'"
57
- when true
58
- quoted_true
59
- when false
60
- quoted_false
61
- when nil
62
- "NULL"
63
- when BigDecimal
64
- value.to_s("F")
65
- when Numeric, ActiveSupport::Duration
66
- value.to_s
67
- when Db2Query::Type::Binary::Data
68
- quoted_binary(value)
69
- when ActiveRecord::Type::Time::Value
70
- "'#{quoted_time(value)}'"
71
- when Date, Time
72
- "'#{quoted_date(value)}'"
73
- when Class
74
- "'#{value}'"
75
- else raise TypeError, "can't quote #{value.class.name}"
76
- end
77
- end
78
-
79
- def _type_cast(value)
80
- case value
81
- when Symbol, ActiveSupport::Multibyte::Chars
82
- value.to_s
83
- when Db2Query::Type::Binary::Data
84
- value.hex
85
- when true
86
- unquoted_true
87
- when false
88
- unquoted_false
89
- when BigDecimal
90
- value.to_s("F")
91
- when nil, Numeric, String
92
- value
93
- when ActiveRecord::Type::Time::Value
94
- quoted_time(value)
95
- when Date, Time
96
- quoted_date(value)
97
- else raise TypeError, "can't cast #{value.class.name}"
98
- end
99
- end
100
- end
101
- end
102
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "db2_query/tasks"
4
-
5
- namespace :db2query do
6
- desc "Create Database configuration file"
7
- task :database do
8
- Db2Query::DatabaseTask.generate_file
9
- end
10
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :db2query do
4
- desc "Create Initializer and Database configuration file"
5
- task :init do
6
- Rake::Task["db2query:database"].invoke
7
- Rake::Task["db2query:initializer"].invoke
8
- end
9
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "db2_query/tasks"
4
-
5
- namespace :db2query do
6
- desc "Create Initializer file"
7
- task :initializer do
8
- Db2Query::InitializerTask.generate_file
9
- end
10
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- development:
4
- dsn: TODO
5
- idle: 5
6
- pool: 5
7
- timeout: 5
8
-
9
- test:
10
- dsn: TODO
11
- idle: 5
12
- pool: 5
13
- timeout: 5
14
-
15
- production:
16
- dsn: TODO
17
- idle: 5
18
- pool: 5
19
- timeout: 5
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "db2_query"
4
-
5
- Db2Query::Base.initiation do |base|
6
- base.set_field_types
7
- base.establish_connection
8
- end
@@ -1,15 +0,0 @@
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
@@ -1,70 +0,0 @@
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