db2_query 0.3.2 → 0.3.6

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