db2_query 0.3.1 → 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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +399 -147
  3. data/lib/db2_query.rb +36 -9
  4. data/lib/db2_query/base.rb +13 -0
  5. data/lib/db2_query/config.rb +14 -14
  6. data/lib/db2_query/core.rb +59 -118
  7. data/lib/db2_query/db_client.rb +56 -0
  8. data/lib/db2_query/db_connection.rb +67 -0
  9. data/lib/db2_query/db_statements.rb +87 -0
  10. data/lib/db2_query/definitions.rb +79 -0
  11. data/lib/db2_query/error.rb +71 -6
  12. data/lib/db2_query/field_type.rb +31 -0
  13. data/lib/db2_query/helper.rb +49 -0
  14. data/lib/db2_query/logger.rb +14 -4
  15. data/lib/db2_query/query.rb +117 -0
  16. data/lib/db2_query/quoting.rb +102 -0
  17. data/lib/db2_query/railtie.rb +5 -2
  18. data/lib/db2_query/result.rb +45 -33
  19. data/lib/db2_query/sql_statement.rb +34 -0
  20. data/lib/db2_query/tasks.rb +29 -0
  21. data/lib/db2_query/tasks/database.rake +2 -33
  22. data/lib/db2_query/tasks/init.rake +1 -1
  23. data/lib/db2_query/tasks/initializer.rake +2 -33
  24. data/lib/db2_query/tasks/templates/database.rb.tt +19 -0
  25. data/lib/db2_query/tasks/templates/initializer.rb.tt +8 -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 +1 -1
  37. data/lib/rails/generators/query/USAGE +15 -0
  38. data/lib/rails/generators/query/query_generator.rb +70 -0
  39. data/lib/rails/generators/query/templates/query.rb.tt +26 -0
  40. data/lib/rails/generators/query/templates/query_definitions.rb.tt +12 -0
  41. data/lib/rails/generators/query/templates/unit_test.rb.tt +9 -0
  42. metadata +49 -10
  43. data/lib/db2_query/connection.rb +0 -125
  44. data/lib/db2_query/formatter.rb +0 -27
@@ -1,125 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Db2Query
4
- class Bind < Struct.new(:name, :value, :index)
5
- end
6
-
7
- class Connection < ConnectionPool
8
- attr_reader :config
9
-
10
- include Logger
11
-
12
- def initialize(config, &block)
13
- @config = config
14
- super(pool_config, &block)
15
- @instrumenter = ActiveSupport::Notifications.instrumenter
16
- @lock = ActiveSupport::Concurrency::LoadInterlockAwareMonitor.new
17
- end
18
-
19
- alias pool with
20
-
21
- def pool_config
22
- { size: config[:pool], timeout: config[:timeout] }
23
- end
24
-
25
- def query(sql)
26
- pool do |odbc_conn|
27
- stmt = odbc_conn.run(sql)
28
- stmt.to_a
29
- ensure
30
- stmt.drop unless stmt.nil?
31
- end
32
- end
33
-
34
- def query_rows(sql)
35
- query(sql)
36
- end
37
-
38
- def query_value(sql)
39
- single_value_from_rows(query(sql))
40
- end
41
-
42
- def query_values(sql)
43
- query(sql).map(&:first)
44
- end
45
-
46
- def execute(sql, args = [])
47
- pool do |odbc_conn|
48
- odbc_conn.do(sql, *args)
49
- end
50
- end
51
-
52
- def exec_query(formatters, sql, args = [])
53
- binds, args = extract_binds_from_sql(sql, args)
54
- sql = db2_spec_sql(sql)
55
- log(sql, "SQL", binds, args) do
56
- run_query(formatters, sql, binds, args)
57
- end
58
- end
59
-
60
- def run_query(formatters, sql, binds, args = [])
61
- pool do |odbc_conn|
62
- begin
63
- if args.empty?
64
- stmt = odbc_conn.run(sql)
65
- else
66
- stmt = odbc_conn.run(sql, *args)
67
- end
68
- columns = stmt.columns.values.map { |col| col.name.downcase }
69
- rows = stmt.to_a
70
- ensure
71
- stmt.drop unless stmt.nil?
72
- end
73
- Db2Query::Result.new(columns, rows, formatters)
74
- end
75
- end
76
-
77
- private
78
- def single_value_from_rows(rows)
79
- row = rows.first
80
- row && row.first
81
- end
82
-
83
- def iud_sql?(sql)
84
- sql.match?(/insert into|update|delete/i)
85
- end
86
-
87
- def iud_ref_table(sql)
88
- sql.match?(/delete/i) ? "OLD TABLE" : "NEW TABLE"
89
- end
90
-
91
- def db2_spec_sql(sql)
92
- if iud_sql?(sql)
93
- "SELECT * FROM #{iud_ref_table(sql)} (#{sql})"
94
- else
95
- sql
96
- end.tr("$", "")
97
- end
98
-
99
- def extract_binds_from_sql(sql, args)
100
- keys = sql.scan(/\$\S+/).map { |key| key.gsub!(/[$=]/, "") }
101
- sql = sql.tr("$", "")
102
- args = args[0].is_a?(Hash) ? args[0] : args
103
- given, expected = args.length, sql.scan(/\?/i).length
104
-
105
- if given != expected
106
- raise Db2Query::Error, "wrong number of arguments (given #{given}, expected #{expected})"
107
- end
108
-
109
- if args.is_a?(Hash)
110
- binds = *args.map do |key, value|
111
- if args[key.to_sym].nil?
112
- raise Db2Query::Error, "Column name: `#{key}` not found inside sql statement."
113
- end
114
- Db2Query::Bind.new(key.to_s, value, nil)
115
- end
116
- else
117
- binds = keys.map.with_index do |key, index|
118
- Db2Query::Bind.new(key, args[index], nil)
119
- end
120
- end
121
-
122
- [binds.map { |bind| [bind, bind.value] }, binds.map { |bind| bind.value }]
123
- end
124
- end
125
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Db2Query
4
- module Formatter
5
- def self.register(name, klass)
6
- self.format_registry.store(name.to_sym, klass.new)
7
- end
8
-
9
- def self.format_registry
10
- @@format_registry ||= Hash.new
11
- end
12
-
13
- def self.lookup(name)
14
- @@format_registry.fetch(name)
15
- end
16
-
17
- def self.registration(&block)
18
- yield self if block_given?
19
- end
20
- end
21
-
22
- class AbstractFormatter
23
- def format(value)
24
- raise Db2Query::Error, "Implement format method in your subclass."
25
- end
26
- end
27
- end