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.
- 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
|