db2_query 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +53 -22
- data/lib/db2_query/base.rb +0 -1
- data/lib/db2_query/core.rb +33 -20
- data/lib/db2_query/db_connection.rb +1 -0
- data/lib/db2_query/definitions.rb +16 -2
- data/lib/db2_query/error.rb +1 -1
- data/lib/db2_query/helper.rb +6 -5
- data/lib/db2_query/query.rb +24 -13
- data/lib/db2_query/railtie.rb +0 -3
- data/lib/db2_query/version.rb +1 -1
- data/lib/db2_query.rb +3 -3
- data/lib/rails/generators/query/templates/query_definitions.rb.tt +6 -0
- metadata +3 -4
- data/lib/db2_query/quoting.rb +0 -102
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3dd6ee9200ac62f38f2a81e202c0df39eb374778398b31ee41021749957d20bf
|
4
|
+
data.tar.gz: 71a6155efe5dded92661e02435c60f7f9b5f47c85353fd662836988ec3a217db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c70095fb9df32696b8b30bd9a589767af759f2ea341724e3e9891d4850c5379c22de27082186d14b131da1c5dc96a48d7d4552a4c0382c66427bcaec64080f28
|
7
|
+
data.tar.gz: c5237f837262f80453f6dbf426769e50ae72cb9907306d70f6fc915ae4e281a15d0f0de94d3a116beadf98ce2a1ce98bc892801b28bd05dd2497acbc16cdadad
|
data/README.md
CHANGED
@@ -36,17 +36,17 @@ Complete the configurations by editing the files according to your application r
|
|
36
36
|
File **config/db2query.yml** consist of DSN/database name and connection pool config:
|
37
37
|
```yml
|
38
38
|
development:
|
39
|
-
dsn:
|
39
|
+
dsn: LIBDEV
|
40
40
|
idle: 5
|
41
41
|
pool: 5
|
42
42
|
timeout: 5
|
43
43
|
test:
|
44
|
-
dsn:
|
44
|
+
dsn: LIBTEST
|
45
45
|
idle: 5
|
46
46
|
pool: 5
|
47
47
|
timeout: 5
|
48
48
|
production:
|
49
|
-
dsn:
|
49
|
+
dsn: LIBPROD
|
50
50
|
idle: 5
|
51
51
|
pool: 5
|
52
52
|
timeout: 5
|
@@ -70,7 +70,9 @@ end
|
|
70
70
|
```
|
71
71
|
|
72
72
|
### Custom Field Type
|
73
|
-
**FieldTypes** are classes that used by **Db2Query** to format the data before sending it to the database by using `serialize` method and converting the **query result** before consumed by your **Rails application
|
73
|
+
**FieldTypes** are classes that are used by **Db2Query** to format the data before sending it to the database by using `serialize` method and `deserialize` the returned query result data by converting the **query result** before consumed by your **Rails application**. Both `serialize` and `deserialize` operations are only applied when you provide **QueryDefinitions** on your query.
|
74
|
+
|
75
|
+
By default, there are ten field types that can be used in your [query definitions](#32-querydefinitions) :
|
74
76
|
|
75
77
|
```ruby
|
76
78
|
DEFAULT_FIELD_TYPES = {
|
@@ -100,7 +102,7 @@ You can use your own Field type class by extending **Db2Query::Type::Value** cla
|
|
100
102
|
end
|
101
103
|
end
|
102
104
|
```
|
103
|
-
Then
|
105
|
+
Then put the classes into a field types hash constant and load it into the **Db2Query::Base** by using **set_field_types** method in the initializer file.
|
104
106
|
```ruby
|
105
107
|
# app_root/config/initializers/db2query.rb
|
106
108
|
|
@@ -122,17 +124,10 @@ end
|
|
122
124
|
|
123
125
|
## 3. Usage
|
124
126
|
|
125
|
-
Once you completely do [**Installation**](#1-installation) & [**Initialization**](#2-initialization), basically you has been ready to use **Db2Query::Base
|
127
|
+
Once you completely do the [**Installation**](#1-installation) & [**Initialization**](#2-initialization) steps, basically you has been ready to use **Db2Query::Base**. There are three additional rules that help **Db2Query** run properly: **SQL Convention**, **Field Type Convention**, and **Argument Key Convention**.
|
126
128
|
|
127
129
|
**SQL Convention**:
|
128
|
-
>
|
129
|
-
|
130
|
-
**Field Type Convention**:
|
131
|
-
> **"** **field_name** written in **query_definition** block must be in downcased format.**"**
|
132
|
-
|
133
|
-
**Argument Key Convention**:
|
134
|
-
> **"** **Argument Key** passed into query have to follow its parameter written in the SQL. It is case-sensitive. If the parameter in your SQL is written in downcase format, then your argument key has to be in downcase format too.**"**
|
135
|
-
|
130
|
+
> Dollar symbol **$** is used as the prefix of all column names **in the WHERE clause** of provided **Parameterized Query** SQL string. It is used as a pointer in the query arguments key and value binding process. We have to provide it manually in the SQL string of each **Parameterized Query**. Here, **Parameterized Query** is used to minimize SQL injection risks.
|
136
131
|
|
137
132
|
```ruby
|
138
133
|
# SQL Convention Examples
|
@@ -143,7 +138,12 @@ Db2Query::Base.query("SELECT * FROM USERS WHERE $email = ?", "my_account@email.c
|
|
143
138
|
# Example of Normal SQL usage
|
144
139
|
|
145
140
|
Db2Query::Base.query("SELECT * FROM USERS WHERE email = 'my_account@email.com'")
|
141
|
+
```
|
142
|
+
|
143
|
+
**Field Type Convention**:
|
144
|
+
> Query definition's **field_name** written in **query_definition** block must be in downcased format.
|
146
145
|
|
146
|
+
```ruby
|
147
147
|
# Field Type Convention Example
|
148
148
|
|
149
149
|
module Definitions
|
@@ -158,9 +158,22 @@ module Definitions
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
end
|
161
|
+
```
|
162
|
+
|
163
|
+
**Argument Key Convention**:
|
164
|
+
> The letter case of a **Named Argument** key that passed into a query, has to follow its parameter letter case format that is written in the SQL. The argument key is case-sensitive. If the parameter in your SQL is written in downcase format, then your argument key has to be in downcase format too, and vice versa.
|
161
165
|
|
166
|
+
```ruby
|
162
167
|
# Argument Key Convention Example
|
163
168
|
|
169
|
+
class MyQuery < Db2Query::Base
|
170
|
+
...
|
171
|
+
query :find_by, <<-SQL
|
172
|
+
SELECT * FROM USERS WHERE $id = ?
|
173
|
+
SQL
|
174
|
+
...
|
175
|
+
end
|
176
|
+
|
164
177
|
MyQuery.find_user_by_id id: 10000
|
165
178
|
|
166
179
|
```
|
@@ -207,11 +220,13 @@ Db2Query::Base.execute("DELETE FROM users WHERE $id = ?", 10000)
|
|
207
220
|
|
208
221
|
### 3.2 QueryDefinitions
|
209
222
|
|
223
|
+
#### 3.2.1 Query Field Definitions
|
224
|
+
|
210
225
|
QueryDefinitions is helpful when you need formatter methods that **serialize** the data before it being sent to the database and **deserialize** database output data before being consumed by **Rails application**. The real examples are **Binary** and **Boolean** field types.
|
211
226
|
At **Db2Query::Type::Binary**, the data `unpacked` by `serialize` method before sending to the database and do `deserialize` operation to `pack` the database returned data.
|
212
227
|
QueryDefinition can be used as **Query Schema** where the **field types** of a query are outlined. The field-type written in QueryDefinition has to follow the **Field Type Convention**.
|
213
228
|
|
214
|
-
A QueryDefinitions reside in `app_root/app/queries/definitions` directory. It is automatically created when you create your query by
|
229
|
+
A QueryDefinitions reside in `app_root/app/queries/definitions` directory. It is automatically created when you create your query by running `rails g query query_name` [**generator**](#33-generator) command. The QueryDefinitions class can be defined as follow:
|
215
230
|
```ruby
|
216
231
|
# app_root/app/queries/definitions/your_query_definitions.rb
|
217
232
|
module Definitions
|
@@ -256,7 +271,21 @@ module Definitions
|
|
256
271
|
end
|
257
272
|
|
258
273
|
```
|
274
|
+
#### 3.2.2 Query Argument Types
|
259
275
|
|
276
|
+
Sometimes, the `query arguments` do not exist in query definitions fields. In such a case, we have to provide `query argument types` at the Query class.
|
277
|
+
|
278
|
+
```ruby
|
279
|
+
module NameSpace
|
280
|
+
class QueryName < Db2Query::Base
|
281
|
+
arguments :user_by_email, { email: :string, trim: true }
|
282
|
+
|
283
|
+
def user_by_email_sql
|
284
|
+
"SELECT id, first_name, last_name FROM USERS WHERE $email = ?"
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
```
|
260
289
|
|
261
290
|
### 3.3 Generator
|
262
291
|
|
@@ -265,7 +294,7 @@ Create query class by using `rails g query NAME` commands. For example:
|
|
265
294
|
```bash
|
266
295
|
$ rails g query NameSpace::Name --defines=first_query --queries=next_query --lambdas=last_query
|
267
296
|
create app/queries/name_space/name_query.rb
|
268
|
-
create
|
297
|
+
create app/queries/definitions/name_space/name_query_definitions.rb
|
269
298
|
create test/queries/name_space/name_query_test.rb
|
270
299
|
```
|
271
300
|
This will create `app/queries/name_space/name_query.rb` file in `app/queries` directory.
|
@@ -366,7 +395,7 @@ class MyQuery < Db2Query::Base
|
|
366
395
|
|
367
396
|
query :find_user_by_id, <<-SQL
|
368
397
|
SELECT * FROM USERS WHERE $id = ?
|
369
|
-
|
398
|
+
SQL
|
370
399
|
end
|
371
400
|
```
|
372
401
|
|
@@ -425,13 +454,14 @@ user.last_name # => "Lumentut"
|
|
425
454
|
user.email # => "yohanes@github.com"
|
426
455
|
```
|
427
456
|
|
428
|
-
### 3.5 SQL
|
429
|
-
For
|
457
|
+
### 3.5 SQL extension (`@extension`)
|
458
|
+
For the sake of reusable SQL string, we can reuse the most commonly used SQL part by implementing `sql_with_extension` methods with an SQL string argument contain `@extension` pointer at SQL statement.
|
459
|
+
|
430
460
|
```ruby
|
431
461
|
class MyQuery < Db2Query::Base
|
432
462
|
# reusable SQL
|
433
|
-
_SQL = ->
|
434
|
-
|
463
|
+
_SQL = -> extension {
|
464
|
+
sql_with_extension("SELECT * FROM USERS WHERE @extension", extension)
|
435
465
|
}
|
436
466
|
|
437
467
|
# implementation
|
@@ -439,7 +469,7 @@ class MyQuery < Db2Query::Base
|
|
439
469
|
end
|
440
470
|
```
|
441
471
|
```bash
|
442
|
-
irb(main):001:0> MyQuery.user_by_email
|
472
|
+
irb(main):001:0> MyQuery.user_by_email email: "yohanes@github.com"
|
443
473
|
SQL (2.7ms) SELECT * FROM USERS email = ? [["email", "yohanes@github.com"]]
|
444
474
|
=> #<Db2Query::Result [#<Record id: 10000, first_name: Yohanes, ...]>
|
445
475
|
```
|
@@ -535,6 +565,7 @@ SQL Load (3.28ms) SELECT * FROM USERS WHERE age > 500
|
|
535
565
|
## 6. Examples
|
536
566
|
|
537
567
|
For complete examples please see the basic examples [here](https://github.com/yohaneslumentut/db2_query/blob/master/test/dummy/app/queries/user_query.rb).
|
568
|
+
Please see [**Db2Session**](https://github.com/yohaneslumentut/db2_session) for **REST** and **GraphQL** implementation of multi-user on the remote server.
|
538
569
|
|
539
570
|
## 7. License
|
540
571
|
The gem is available as open-source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/lib/db2_query/base.rb
CHANGED
data/lib/db2_query/core.rb
CHANGED
@@ -25,27 +25,44 @@ module Db2Query
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def query(*query_args)
|
28
|
-
if query_args
|
28
|
+
if query_args.first.is_a?(Symbol)
|
29
29
|
query_name, body = query_args
|
30
|
-
|
31
|
-
|
30
|
+
|
31
|
+
body_lambda = if body.is_a?(Proc)
|
32
|
+
-> args { body.call(args << { query_name: query_name }) }
|
33
|
+
elsif body.is_a?(String)
|
34
|
+
definition = definitions.lookup_query(query_name, body.strip)
|
35
|
+
-> args { exec_query_result(definition, args) }
|
36
|
+
else
|
37
|
+
raise Db2Query::QueryMethodError.new
|
32
38
|
end
|
33
|
-
|
34
|
-
sql, query_args = [query_args.first.strip, query_args.drop(1)]
|
35
|
-
query = raw_query(sql, query_args)
|
36
|
-
connection.raw_query(query.db2_spec_sql, query.args)
|
37
|
-
elsif query_args[1].is_a?(String) && query_args[1].strip.length > 0
|
38
|
-
query_name, sql = query_args
|
39
|
-
query = definitions.lookup_query(query_name, sql.strip)
|
39
|
+
|
40
40
|
singleton_class.define_method(query_name) do |*args|
|
41
|
-
|
41
|
+
body_lambda.call(args)
|
42
|
+
end
|
43
|
+
elsif query_args.first.is_a?(String)
|
44
|
+
sql, args = [query_args.first.strip, query_args.drop(1)]
|
45
|
+
|
46
|
+
definition = Query.new.tap do |d|
|
47
|
+
d.define_sql(sql)
|
48
|
+
d.define_args(args)
|
42
49
|
end
|
50
|
+
|
51
|
+
connection.raw_query(definition.db2_spec_sql, definition.args)
|
43
52
|
else
|
44
|
-
raise Db2Query::
|
53
|
+
raise Db2Query::Error, "Wrong query implementation"
|
45
54
|
end
|
46
55
|
end
|
47
56
|
alias define query
|
48
57
|
|
58
|
+
def query_arguments_map
|
59
|
+
@query_arguments_map ||= {}
|
60
|
+
end
|
61
|
+
|
62
|
+
def query_arguments(query_name, argument_types)
|
63
|
+
query_arguments_map[query_name] = argument_types
|
64
|
+
end
|
65
|
+
|
49
66
|
def fetch(sql, args = [])
|
50
67
|
query = definitions.lookup_query(args, sql)
|
51
68
|
query.validate_select_query
|
@@ -60,7 +77,10 @@ module Db2Query
|
|
60
77
|
private
|
61
78
|
def new_definitions
|
62
79
|
definition_class = "Definitions::#{name}Definitions"
|
63
|
-
Object.const_get(definition_class).new(
|
80
|
+
Object.const_get(definition_class).new(
|
81
|
+
query_arguments_map,
|
82
|
+
field_types_map
|
83
|
+
)
|
64
84
|
rescue Exception => e
|
65
85
|
raise Db2Query::Error, e.message
|
66
86
|
end
|
@@ -71,13 +91,6 @@ module Db2Query
|
|
71
91
|
end
|
72
92
|
end
|
73
93
|
|
74
|
-
def raw_query(sql, args)
|
75
|
-
Query.new.tap do |query|
|
76
|
-
query.define_sql(sql)
|
77
|
-
query.define_args(args)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
94
|
def define_sql_query(method_name)
|
82
95
|
sql_query_name = sql_query_symbol(method_name)
|
83
96
|
sql_statement = allocate.method(sql_query_name).call
|
@@ -3,9 +3,11 @@
|
|
3
3
|
module Db2Query
|
4
4
|
class Definitions
|
5
5
|
attr_accessor :types, :types_map
|
6
|
+
attr_reader :arguments_map
|
6
7
|
|
7
|
-
def initialize(
|
8
|
-
@
|
8
|
+
def initialize(query_arguments_map, field_types_map)
|
9
|
+
@arguments_map = query_arguments_map
|
10
|
+
@types_map = field_types_map
|
9
11
|
describe
|
10
12
|
initialize_types
|
11
13
|
end
|
@@ -34,6 +36,10 @@ module Db2Query
|
|
34
36
|
query_name, sql = query_definitions(args)
|
35
37
|
lookup(query_name).tap do |query|
|
36
38
|
query.define_sql(sql)
|
39
|
+
query.argument_keys.each do |key|
|
40
|
+
key, key_def = query_arg_key(query, key)
|
41
|
+
query.argument_types.store(key, data_type_instance(key_def))
|
42
|
+
end
|
37
43
|
end
|
38
44
|
end
|
39
45
|
|
@@ -75,5 +81,13 @@ module Db2Query
|
|
75
81
|
else args
|
76
82
|
end
|
77
83
|
end
|
84
|
+
|
85
|
+
def query_arg_key(query, key)
|
86
|
+
[key, unless arguments_map[query.query_name].nil?
|
87
|
+
arguments_map[query.query_name][key]
|
88
|
+
else
|
89
|
+
query.columns[key]
|
90
|
+
end]
|
91
|
+
end
|
78
92
|
end
|
79
93
|
end
|
data/lib/db2_query/error.rb
CHANGED
data/lib/db2_query/helper.rb
CHANGED
@@ -16,12 +16,13 @@ module Db2Query
|
|
16
16
|
sql.gsub("@list", "'#{list.join("', '")}'")
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
if sql.scan(/\@
|
21
|
-
raise Db2Query::
|
19
|
+
def sql_with_extension(sql, extension)
|
20
|
+
if sql.scan(/\@extension+/).length == 0
|
21
|
+
raise Db2Query::ExtensionError, "Missing @extension pointer at SQL"
|
22
22
|
end
|
23
|
-
sql.gsub("@
|
23
|
+
sql.gsub("@extension", extension.strip)
|
24
24
|
end
|
25
|
+
alias sql_with_extention sql_with_extension
|
25
26
|
|
26
27
|
private
|
27
28
|
def sql_query_methods
|
@@ -42,7 +43,7 @@ module Db2Query
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def fetch_error_message
|
45
|
-
"`fetch`, `fetch_list` and `
|
46
|
+
"`fetch`, `fetch_list` and `fetch_extension` methods applied for SQL `select` statement only."
|
46
47
|
end
|
47
48
|
end
|
48
49
|
end
|
data/lib/db2_query/query.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Db2Query
|
4
4
|
class Query
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :query_name, :sql, :columns, :keys, :types, :argument_types
|
6
6
|
|
7
7
|
include SqlStatement
|
8
8
|
|
@@ -10,11 +10,12 @@ module Db2Query
|
|
10
10
|
@columns = {}
|
11
11
|
@query_name = query_name
|
12
12
|
@sql_statement = nil
|
13
|
+
@argument_types = {}
|
13
14
|
@types = {}
|
14
15
|
end
|
15
16
|
|
16
17
|
def define_sql(sql)
|
17
|
-
@keys ||=
|
18
|
+
@keys ||= sql_arguments(sql)
|
18
19
|
@sql ||= sql.tr("$", "")
|
19
20
|
end
|
20
21
|
|
@@ -33,6 +34,19 @@ module Db2Query
|
|
33
34
|
raise Db2Query::Error, "No column #{column} found at query: #{query_name} definitions"
|
34
35
|
end
|
35
36
|
|
37
|
+
def argument_type(key)
|
38
|
+
argument_types.fetch(key) || data_type(key)
|
39
|
+
rescue
|
40
|
+
raise Db2Query::Error, "No argument #{key} type found at query: #{query_name}"
|
41
|
+
end
|
42
|
+
|
43
|
+
def argument_keys
|
44
|
+
keys.map do |key|
|
45
|
+
arg_key = "#{key}".split(".").last
|
46
|
+
arg_key.to_sym unless arg_key.nil?
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
36
50
|
def length
|
37
51
|
columns.length
|
38
52
|
end
|
@@ -52,7 +66,7 @@ module Db2Query
|
|
52
66
|
end
|
53
67
|
|
54
68
|
def sorted_args(args)
|
55
|
-
|
69
|
+
argument_keys.map.with_index do |key, index|
|
56
70
|
serialized_arg(args.is_a?(Hash) ? args[key] : args[index], key)
|
57
71
|
end
|
58
72
|
end
|
@@ -82,12 +96,12 @@ module Db2Query
|
|
82
96
|
end
|
83
97
|
|
84
98
|
private
|
85
|
-
def
|
86
|
-
raw_sql.scan(/\$\S+/).map { |
|
99
|
+
def sql_arguments(raw_sql)
|
100
|
+
raw_sql.scan(/\$\S+/).map { |arg| arg.gsub!(/[$=,)]/, "").to_sym }
|
87
101
|
end
|
88
102
|
|
89
103
|
def serialized_arg(arg, key)
|
90
|
-
query_name.nil? ? arg :
|
104
|
+
query_name.nil? ? arg : argument_type(key).serialize(arg)
|
91
105
|
end
|
92
106
|
|
93
107
|
def column_from_key(key)
|
@@ -104,14 +118,11 @@ module Db2Query
|
|
104
118
|
end
|
105
119
|
end
|
106
120
|
|
107
|
-
def validate_arguments(given, expected)
|
108
|
-
raise Db2Query::ArgumentError.new(given, expected) unless given == expected
|
109
|
-
end
|
110
|
-
|
111
121
|
def validated_args(args)
|
112
|
-
|
113
|
-
|
114
|
-
|
122
|
+
arguments = args.first.is_a?(Hash) ? args.first : args
|
123
|
+
given, expected = [arguments.length, keys.length]
|
124
|
+
raise Db2Query::ArgumentError.new(given, expected) unless given == expected
|
125
|
+
sorted_args(arguments)
|
115
126
|
end
|
116
127
|
end
|
117
128
|
end
|
data/lib/db2_query/railtie.rb
CHANGED
data/lib/db2_query/version.rb
CHANGED
data/lib/db2_query.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "active_record"
|
4
3
|
require "active_support"
|
5
4
|
require "active_support/concurrency/load_interlock_aware_monitor"
|
5
|
+
require "active_record"
|
6
6
|
require "active_model/type"
|
7
7
|
require "connection_pool"
|
8
8
|
require "odbc_utf8"
|
@@ -44,6 +44,6 @@ module Db2Query
|
|
44
44
|
def self.root
|
45
45
|
__dir__
|
46
46
|
end
|
47
|
-
|
48
|
-
require "db2_query/railtie" if defined?(Rails)
|
49
47
|
end
|
48
|
+
|
49
|
+
require "db2_query/railtie" if defined?(Rails)
|
@@ -2,11 +2,17 @@
|
|
2
2
|
|
3
3
|
<% module_definitions_namespacing do -%>
|
4
4
|
class <%= query_class_name %>Definitions < <%= "Db2Query::Definitions" %>
|
5
|
+
<% if @query_methods.empty? %>
|
6
|
+
<%= indent("def describe\n") -%>
|
7
|
+
<%= indent("") %>
|
8
|
+
<%= indent("end") %>
|
9
|
+
<% else %>
|
5
10
|
<%= indent("def describe") -%>
|
6
11
|
<% @query_methods.each do |method| %>
|
7
12
|
<%= indent("query_definition :#{method} do |c|\n") %>
|
8
13
|
<%= indent("end") %>
|
9
14
|
<% end -%>
|
10
15
|
<%= indent("end") %>
|
16
|
+
<% end %>
|
11
17
|
<%= 'end' -%>
|
12
18
|
<% end %>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: db2_query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yohanes_l
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tty-progressbar
|
@@ -160,7 +160,6 @@ files:
|
|
160
160
|
- lib/db2_query/helper.rb
|
161
161
|
- lib/db2_query/logger.rb
|
162
162
|
- lib/db2_query/query.rb
|
163
|
-
- lib/db2_query/quoting.rb
|
164
163
|
- lib/db2_query/railtie.rb
|
165
164
|
- lib/db2_query/result.rb
|
166
165
|
- lib/db2_query/sql_statement.rb
|
@@ -208,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
208
207
|
- !ruby/object:Gem::Version
|
209
208
|
version: '0'
|
210
209
|
requirements: []
|
211
|
-
rubygems_version: 3.
|
210
|
+
rubygems_version: 3.1.3
|
212
211
|
signing_key:
|
213
212
|
specification_version: 4
|
214
213
|
summary: Rails Db2 ODBC plugin
|
data/lib/db2_query/quoting.rb
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Db2Query
|
4
|
-
module Quoting
|
5
|
-
def self.included(base)
|
6
|
-
base.send(:extend, ClassMethods)
|
7
|
-
end
|
8
|
-
|
9
|
-
module ClassMethods
|
10
|
-
def quoted_true
|
11
|
-
"TRUE"
|
12
|
-
end
|
13
|
-
|
14
|
-
def unquoted_true
|
15
|
-
1
|
16
|
-
end
|
17
|
-
|
18
|
-
def quoted_false
|
19
|
-
"FALSE"
|
20
|
-
end
|
21
|
-
|
22
|
-
def unquoted_false
|
23
|
-
0
|
24
|
-
end
|
25
|
-
|
26
|
-
def quoted_binary(value)
|
27
|
-
"x'#{value.hex}'"
|
28
|
-
end
|
29
|
-
|
30
|
-
def quoted_time(value)
|
31
|
-
value = value.change(year: 2000, month: 1, day: 1)
|
32
|
-
quoted_date(value).sub(/\A\d\d\d\d-\d\d-\d\d /, "")
|
33
|
-
end
|
34
|
-
|
35
|
-
def quoted_date(value)
|
36
|
-
if value.acts_like?(:time)
|
37
|
-
if ActiveRecord::Base.default_timezone == :utc
|
38
|
-
value = value.getutc if !value.utc?
|
39
|
-
else
|
40
|
-
value = value.getlocal
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
result = value.to_s(:db)
|
45
|
-
if value.respond_to?(:usec) && value.usec > 0
|
46
|
-
result << "." << sprintf("%06d", value.usec)
|
47
|
-
else
|
48
|
-
result
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
def _quote(value)
|
54
|
-
case value
|
55
|
-
when String, Symbol, ActiveSupport::Multibyte::Chars
|
56
|
-
"'#{quote_string(value.to_s)}'"
|
57
|
-
when true
|
58
|
-
quoted_true
|
59
|
-
when false
|
60
|
-
quoted_false
|
61
|
-
when nil
|
62
|
-
"NULL"
|
63
|
-
when BigDecimal
|
64
|
-
value.to_s("F")
|
65
|
-
when Numeric, ActiveSupport::Duration
|
66
|
-
value.to_s
|
67
|
-
when Db2Query::Type::Binary::Data
|
68
|
-
quoted_binary(value)
|
69
|
-
when ActiveRecord::Type::Time::Value
|
70
|
-
"'#{quoted_time(value)}'"
|
71
|
-
when Date, Time
|
72
|
-
"'#{quoted_date(value)}'"
|
73
|
-
when Class
|
74
|
-
"'#{value}'"
|
75
|
-
else raise TypeError, "can't quote #{value.class.name}"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def _type_cast(value)
|
80
|
-
case value
|
81
|
-
when Symbol, ActiveSupport::Multibyte::Chars
|
82
|
-
value.to_s
|
83
|
-
when Db2Query::Type::Binary::Data
|
84
|
-
value.hex
|
85
|
-
when true
|
86
|
-
unquoted_true
|
87
|
-
when false
|
88
|
-
unquoted_false
|
89
|
-
when BigDecimal
|
90
|
-
value.to_s("F")
|
91
|
-
when nil, Numeric, String
|
92
|
-
value
|
93
|
-
when ActiveRecord::Type::Time::Value
|
94
|
-
quoted_time(value)
|
95
|
-
when Date, Time
|
96
|
-
quoted_date(value)
|
97
|
-
else raise TypeError, "can't cast #{value.class.name}"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|