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.
- checksums.yaml +4 -4
- data/README.md +399 -147
- data/lib/db2_query.rb +36 -9
- data/lib/db2_query/base.rb +13 -0
- data/lib/db2_query/config.rb +14 -14
- data/lib/db2_query/core.rb +59 -118
- data/lib/db2_query/db_client.rb +56 -0
- data/lib/db2_query/db_connection.rb +67 -0
- data/lib/db2_query/db_statements.rb +87 -0
- data/lib/db2_query/definitions.rb +79 -0
- data/lib/db2_query/error.rb +71 -6
- data/lib/db2_query/field_type.rb +31 -0
- data/lib/db2_query/helper.rb +49 -0
- data/lib/db2_query/logger.rb +14 -4
- data/lib/db2_query/query.rb +117 -0
- data/lib/db2_query/quoting.rb +102 -0
- data/lib/db2_query/railtie.rb +5 -2
- data/lib/db2_query/result.rb +45 -33
- data/lib/db2_query/sql_statement.rb +34 -0
- data/lib/db2_query/tasks.rb +29 -0
- data/lib/db2_query/tasks/database.rake +2 -33
- data/lib/db2_query/tasks/init.rake +1 -1
- data/lib/db2_query/tasks/initializer.rake +2 -33
- data/lib/db2_query/tasks/templates/database.rb.tt +19 -0
- data/lib/db2_query/tasks/templates/initializer.rb.tt +8 -0
- data/lib/db2_query/type/binary.rb +19 -0
- data/lib/db2_query/type/boolean.rb +41 -0
- data/lib/db2_query/type/date.rb +34 -0
- data/lib/db2_query/type/decimal.rb +15 -0
- data/lib/db2_query/type/integer.rb +15 -0
- data/lib/db2_query/type/string.rb +30 -0
- data/lib/db2_query/type/text.rb +11 -0
- data/lib/db2_query/type/time.rb +30 -0
- data/lib/db2_query/type/timestamp.rb +30 -0
- data/lib/db2_query/type/value.rb +29 -0
- data/lib/db2_query/version.rb +1 -1
- data/lib/rails/generators/query/USAGE +15 -0
- data/lib/rails/generators/query/query_generator.rb +70 -0
- data/lib/rails/generators/query/templates/query.rb.tt +26 -0
- data/lib/rails/generators/query/templates/query_definitions.rb.tt +12 -0
- data/lib/rails/generators/query/templates/unit_test.rb.tt +9 -0
- metadata +49 -10
- data/lib/db2_query/connection.rb +0 -125
- data/lib/db2_query/formatter.rb +0 -27
data/lib/db2_query/connection.rb
DELETED
@@ -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
|
data/lib/db2_query/formatter.rb
DELETED
@@ -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
|