db2_query 0.3.1 → 0.3.2

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