quote-sql 0.0.3 → 0.0.5
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 +15 -3
- data/lib/quote_sql/error.rb +47 -0
- data/lib/quote_sql/formater.rb +7 -5
- data/lib/quote_sql/quoter.rb +173 -124
- data/lib/quote_sql/test.rb +193 -142
- data/lib/quote_sql/version.rb +3 -0
- data/lib/quote_sql.rb +58 -137
- metadata +20 -5
- data/lib/quote_sql/deprecated.rb +0 -162
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quote-sql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Kufner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
12
|
-
dependencies:
|
11
|
+
date: 2024-02-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: niceql
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
description: 'QuoteSql helps you creating SQL queries and proper quoting especially
|
14
28
|
with advanced queries.
|
15
29
|
|
@@ -23,12 +37,13 @@ files:
|
|
23
37
|
- lib/quote_sql.rb
|
24
38
|
- lib/quote_sql/connector.rb
|
25
39
|
- lib/quote_sql/connector/active_record_base.rb
|
26
|
-
- lib/quote_sql/
|
40
|
+
- lib/quote_sql/error.rb
|
27
41
|
- lib/quote_sql/extension.rb
|
28
42
|
- lib/quote_sql/formater.rb
|
29
43
|
- lib/quote_sql/quoter.rb
|
30
44
|
- lib/quote_sql/quoting.rb
|
31
45
|
- lib/quote_sql/test.rb
|
46
|
+
- lib/quote_sql/version.rb
|
32
47
|
homepage: https://github.com/martin-kufner/quote-sql
|
33
48
|
licenses:
|
34
49
|
- MIT
|
@@ -48,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
48
63
|
- !ruby/object:Gem::Version
|
49
64
|
version: '0'
|
50
65
|
requirements: []
|
51
|
-
rubygems_version: 3.
|
66
|
+
rubygems_version: 3.5.6
|
52
67
|
signing_key:
|
53
68
|
specification_version: 4
|
54
69
|
summary: Tool to build and run SQL queries easier
|
data/lib/quote_sql/deprecated.rb
DELETED
@@ -1,162 +0,0 @@
|
|
1
|
-
class QuoteSql
|
2
|
-
module Deprecated
|
3
|
-
private def conn
|
4
|
-
ApplicationRecord.connection
|
5
|
-
end
|
6
|
-
|
7
|
-
private def quote_sql_values(sub, casts)
|
8
|
-
sub.map do |s|
|
9
|
-
casts.map do |k, column|
|
10
|
-
column.transform_keys(&:to_sym) => { sql_type:, default:, array: }
|
11
|
-
value = s.key?(k) ? s[k] : s[k.to_sym]
|
12
|
-
if value.nil?
|
13
|
-
value = default
|
14
|
-
else
|
15
|
-
value = value.to_json if sql_type[/^json/]
|
16
|
-
end
|
17
|
-
"#{conn.quote(value)}::#{sql_type}"
|
18
|
-
end.join(",")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def quote_sql(**options)
|
23
|
-
loop do
|
24
|
-
# keys = []
|
25
|
-
break unless gsub!(%r{(?<=^|\W)[:$](#{options.keys.join("|")})(?=\W|$)}) do |m|
|
26
|
-
key = m[1..].to_sym
|
27
|
-
# keys << key
|
28
|
-
next m unless options.key? key
|
29
|
-
sub = options[key]
|
30
|
-
case sub
|
31
|
-
when Arel::Nodes::SqlLiteral
|
32
|
-
next sub
|
33
|
-
when NilClass
|
34
|
-
next "NULL"
|
35
|
-
when TrueClass, FalseClass
|
36
|
-
next sub.to_s.upcase
|
37
|
-
when Time
|
38
|
-
sub = sub.strftime("%Y-%m-%d %H:%M:%S.%3N%z")
|
39
|
-
end
|
40
|
-
if sub.respond_to? :to_sql
|
41
|
-
next sub.to_sql
|
42
|
-
end
|
43
|
-
case m
|
44
|
-
when /^:(.+)_(FROM_CLAUSE)$/ # prefix (column,...) AS ( VALUES (data::CAST, ...), ...)
|
45
|
-
name = conn.quote_column_name($1)
|
46
|
-
casts = sub.shift.transform_keys(&:to_s)
|
47
|
-
rv = quote_sql_values(sub, casts)
|
48
|
-
column_names = casts.map { conn.quote_column_name(_2.key?(:as) ? _2[:as] : _1) }
|
49
|
-
next "(VALUES \n(#{rv.join("),\n(")})\n ) #{name} (#{column_names.join(",") })"
|
50
|
-
|
51
|
-
when /^:(.+)_(as_select)$/i # prefix (column,...) AS ( VALUES (data::CAST, ...), ...)
|
52
|
-
name = conn.quote_column_name($1)
|
53
|
-
casts = sub.shift.transform_keys(&:to_s)
|
54
|
-
rv = quote_sql_values(sub, casts)
|
55
|
-
next "SELECT * FROM (VALUES \n(#{rv.join("),\n(")})\n ) #{name} (#{casts.keys.map { conn.quote_column_name(_1) }.join(",") })"
|
56
|
-
when /^:(.+)_(as_values)$/i # prefix (column,...) AS ( VALUES (data::CAST, ...), ...)
|
57
|
-
name = conn.quote_column_name($1)
|
58
|
-
casts = sub.shift.transform_keys(&:to_s)
|
59
|
-
rv = quote_sql_values(sub, casts)
|
60
|
-
next "#{name} (#{casts.keys.map { conn.quote_column_name(_1) }.join(",") }) AS ( VALUES \n(#{rv.join("),\n(")})\n )"
|
61
|
-
when /^:(.+)_(values)$/i
|
62
|
-
casts = sub.shift.transform_keys(&:to_sym)
|
63
|
-
rv = quote_sql_values(sub, casts)
|
64
|
-
next "VALUES \n(#{rv.join("),\n(")})\n"
|
65
|
-
when /_(LIST)$/i
|
66
|
-
next sub.map { conn.quote _1 }.join(",")
|
67
|
-
when /_(args)$/i
|
68
|
-
next sub.join(',')
|
69
|
-
when /_(raw|sql)$/i
|
70
|
-
next sub
|
71
|
-
when /_(ident|column)$/i, /table_name$/, /_?columns?$/, /column_names$/
|
72
|
-
if sub.is_a? Array
|
73
|
-
next sub.map do
|
74
|
-
_1[/^"[^"]+"\."[^"]+"$/] ? _1 : conn.quote_column_name(_1)
|
75
|
-
end.join(',')
|
76
|
-
else
|
77
|
-
next conn.quote_column_name(sub)
|
78
|
-
end
|
79
|
-
when /(?<=_)jsonb?$/i
|
80
|
-
next conn.quote(sub.to_json) + "::#{$MATCH}"
|
81
|
-
when /(?<=_)(uuid|int|text)$/i
|
82
|
-
cast = "::#{$MATCH}"
|
83
|
-
end
|
84
|
-
case sub
|
85
|
-
when Regexp
|
86
|
-
sub.to_postgres
|
87
|
-
when Array
|
88
|
-
dims = 1 # todo more dimensional Arrays
|
89
|
-
dive = ->(ary) do
|
90
|
-
ary.map { |s| conn.quote s }.join(',')
|
91
|
-
end
|
92
|
-
sub = "[#{dive.call sub}]"
|
93
|
-
cast += "[]" * dims if cast.present?
|
94
|
-
"ARRAY#{sub}#{cast}"
|
95
|
-
else
|
96
|
-
"#{conn.quote(sub)}#{cast}"
|
97
|
-
end
|
98
|
-
end
|
99
|
-
# break if options.except!(*keys).blank?
|
100
|
-
end
|
101
|
-
Arel.sql self
|
102
|
-
end
|
103
|
-
|
104
|
-
def exec
|
105
|
-
result = conn.exec_query(self)
|
106
|
-
columns = result.columns.map(&:to_sym)
|
107
|
-
result.cast_values.map do |row|
|
108
|
-
row = [row] unless row.is_a? Array
|
109
|
-
[columns, row].transpose.to_h
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def quote_exec(**)
|
114
|
-
quote_sql(**).exec
|
115
|
-
end
|
116
|
-
|
117
|
-
module Dsql
|
118
|
-
|
119
|
-
def dsql
|
120
|
-
IO.popen(PG_FORMAT_BIN, "r+", err: "/dev/null") do |f|
|
121
|
-
f.write self
|
122
|
-
f.close_write
|
123
|
-
puts f.read
|
124
|
-
end
|
125
|
-
self
|
126
|
-
rescue
|
127
|
-
self
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
include Dsql
|
132
|
-
|
133
|
-
module String
|
134
|
-
def self.included(other)
|
135
|
-
other.include Dsql
|
136
|
-
end
|
137
|
-
|
138
|
-
def quote_sql(**)
|
139
|
-
Arel.sql(self).quote_sql(**)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
module Relation
|
144
|
-
def quote_sql(**)
|
145
|
-
Arel.sql(to_sql).quote_sql(**)
|
146
|
-
end
|
147
|
-
|
148
|
-
def dsql
|
149
|
-
to_sql.dsql
|
150
|
-
self
|
151
|
-
end
|
152
|
-
|
153
|
-
def result
|
154
|
-
result = ApplicationRecord.connection.exec_query(to_sql)
|
155
|
-
columns = result.columns.map(&:to_sym)
|
156
|
-
result.cast_values.map do |row|
|
157
|
-
[columns, Array(row)].transpose.to_h
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|