mini_sql 0.2.3 → 1.0.1
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/.github/workflows/ci.yml +66 -0
- data/.rubocop-https---raw-githubusercontent-com-discourse-discourse-master--rubocop-yml +355 -0
- data/.rubocop.yml +8 -0
- data/CHANGELOG +22 -0
- data/Gemfile +3 -1
- data/Guardfile +2 -0
- data/README.md +89 -1
- data/Rakefile +3 -1
- data/bench/timestamp_perf.rb +22 -21
- data/bench/topic_mysql_perf.rb +1 -7
- data/bench/topic_perf.rb +174 -10
- data/bin/console +1 -0
- data/lib/mini_sql.rb +3 -0
- data/lib/mini_sql/builder.rb +10 -1
- data/lib/mini_sql/connection.rb +15 -3
- data/lib/mini_sql/decoratable.rb +22 -0
- data/lib/mini_sql/deserializer_cache.rb +2 -0
- data/lib/mini_sql/inline_param_encoder.rb +9 -11
- data/lib/mini_sql/mysql/connection.rb +12 -3
- data/lib/mini_sql/mysql/deserializer_cache.rb +11 -13
- data/lib/mini_sql/postgres/coders.rb +2 -0
- data/lib/mini_sql/postgres/connection.rb +83 -0
- data/lib/mini_sql/postgres/deserializer_cache.rb +33 -13
- data/lib/mini_sql/postgres_jdbc/connection.rb +8 -1
- data/lib/mini_sql/postgres_jdbc/deserializer_cache.rb +43 -43
- data/lib/mini_sql/result.rb +20 -0
- data/lib/mini_sql/serializer.rb +70 -0
- data/lib/mini_sql/sqlite/connection.rb +11 -1
- data/lib/mini_sql/sqlite/deserializer_cache.rb +11 -13
- data/lib/mini_sql/version.rb +1 -1
- data/mini_sql.gemspec +14 -3
- metadata +63 -13
- data/.travis.yml +0 -26
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MiniSql
|
4
|
+
module Result
|
5
|
+
# AM serializer support
|
6
|
+
alias :read_attribute_for_serialization :send
|
7
|
+
|
8
|
+
def to_h
|
9
|
+
r = {}
|
10
|
+
instance_variables.each do |f|
|
11
|
+
r[f.to_s.delete_prefix('@').to_sym] = instance_variable_get(f)
|
12
|
+
end
|
13
|
+
r
|
14
|
+
end
|
15
|
+
|
16
|
+
def values
|
17
|
+
instance_variables.map { |f| instance_variable_get(f) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MiniSql
|
4
|
+
module Serializer
|
5
|
+
MAX_CACHE_SIZE = 500
|
6
|
+
|
7
|
+
def self.to_json(result)
|
8
|
+
wrapper =
|
9
|
+
if result.length == 0
|
10
|
+
{}
|
11
|
+
else
|
12
|
+
{
|
13
|
+
"decorator" => result[0].class.decorator.to_s,
|
14
|
+
"fields" => result[0].to_h.keys,
|
15
|
+
"data" => result.map(&:values),
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
JSON.generate(wrapper)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.from_json(json)
|
23
|
+
wrapper = JSON.parse(json)
|
24
|
+
if !wrapper["data"]
|
25
|
+
[]
|
26
|
+
else
|
27
|
+
materializer = cached_materializer(wrapper['fields'], wrapper['decorator'])
|
28
|
+
wrapper["data"].map do |row|
|
29
|
+
materializer.materialize(row)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.cached_materializer(fields, decorator_module = nil)
|
35
|
+
@cache ||= {}
|
36
|
+
key = fields
|
37
|
+
m = @cache.delete(key)
|
38
|
+
if m
|
39
|
+
@cache[key] = m
|
40
|
+
else
|
41
|
+
m = @cache[key] = materializer(fields)
|
42
|
+
@cache.shift if @cache.length > MAX_CACHE_SIZE
|
43
|
+
end
|
44
|
+
|
45
|
+
if decorator_module && decorator_module.length > 0
|
46
|
+
decorator = Kernel.const_get(decorator_module)
|
47
|
+
m = m.decorated(decorator)
|
48
|
+
end
|
49
|
+
|
50
|
+
m
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.materializer(fields)
|
54
|
+
Class.new do
|
55
|
+
extend MiniSql::Decoratable
|
56
|
+
include MiniSql::Result
|
57
|
+
|
58
|
+
attr_accessor(*fields)
|
59
|
+
|
60
|
+
instance_eval <<~RUBY
|
61
|
+
def materialize(values)
|
62
|
+
r = self.new
|
63
|
+
#{col = -1; fields.map { |f| "r.#{f} = values[#{col += 1}]" }.join("; ")}
|
64
|
+
r
|
65
|
+
end
|
66
|
+
RUBY
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -26,6 +26,10 @@ module MiniSql
|
|
26
26
|
r
|
27
27
|
end
|
28
28
|
|
29
|
+
def query_array(sql, *params)
|
30
|
+
run(sql, *params)
|
31
|
+
end
|
32
|
+
|
29
33
|
def exec(sql, *params)
|
30
34
|
|
31
35
|
start = raw_connection.total_changes
|
@@ -46,8 +50,14 @@ module MiniSql
|
|
46
50
|
end
|
47
51
|
end
|
48
52
|
|
53
|
+
def query_decorator(decorator, sql, *params)
|
54
|
+
run(sql, *params) do |set|
|
55
|
+
deserializer_cache.materialize(set, decorator)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
49
59
|
def escape_string(str)
|
50
|
-
str.gsub("'","''")
|
60
|
+
str.gsub("'", "''")
|
51
61
|
end
|
52
62
|
|
53
63
|
private
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module MiniSql
|
2
4
|
module Sqlite
|
3
5
|
class DeserializerCache
|
@@ -9,7 +11,7 @@ module MiniSql
|
|
9
11
|
@max_size = max_size || DEFAULT_MAX_SIZE
|
10
12
|
end
|
11
13
|
|
12
|
-
def materialize(result)
|
14
|
+
def materialize(result, decorator_module = nil)
|
13
15
|
|
14
16
|
key = result.columns
|
15
17
|
|
@@ -22,6 +24,10 @@ module MiniSql
|
|
22
24
|
@cache.shift if @cache.length > @max_size
|
23
25
|
end
|
24
26
|
|
27
|
+
if decorator_module
|
28
|
+
materializer = materializer.decorated(decorator_module)
|
29
|
+
end
|
30
|
+
|
25
31
|
r = []
|
26
32
|
# quicker loop
|
27
33
|
while !result.eof?
|
@@ -39,23 +45,15 @@ module MiniSql
|
|
39
45
|
fields = result.columns
|
40
46
|
|
41
47
|
Class.new do
|
42
|
-
|
48
|
+
extend MiniSql::Decoratable
|
49
|
+
include MiniSql::Result
|
43
50
|
|
44
|
-
|
45
|
-
alias :read_attribute_for_serialization :send
|
46
|
-
|
47
|
-
def to_h
|
48
|
-
r = {}
|
49
|
-
instance_variables.each do |f|
|
50
|
-
r[f.to_s.sub('@','').to_sym] = instance_variable_get(f)
|
51
|
-
end
|
52
|
-
r
|
53
|
-
end
|
51
|
+
attr_accessor(*fields)
|
54
52
|
|
55
53
|
instance_eval <<~RUBY
|
56
54
|
def materialize(data)
|
57
55
|
r = self.new
|
58
|
-
#{col
|
56
|
+
#{col = -1; fields.map { |f| "r.#{f} = data[#{col += 1}]" }.join("; ")}
|
59
57
|
r
|
60
58
|
end
|
61
59
|
RUBY
|
data/lib/mini_sql/version.rb
CHANGED
data/mini_sql.gemspec
CHANGED
@@ -12,24 +12,35 @@ Gem::Specification.new do |spec|
|
|
12
12
|
|
13
13
|
spec.summary = %q{A fast, safe, simple direct SQL executor}
|
14
14
|
spec.description = %q{A fast, safe, simple direct SQL executor for PG}
|
15
|
-
spec.homepage = "https://discourse
|
15
|
+
spec.homepage = "https://github.com/discourse/mini_sql"
|
16
16
|
spec.license = "MIT"
|
17
17
|
|
18
|
+
spec.metadata = {
|
19
|
+
"bug_tracker_uri" => "https://github.com/discourse/mini_sql/issues",
|
20
|
+
"source_code_uri" => "https://github.com/discourse/mini_sql",
|
21
|
+
"changelog_uri" => "https://github.com/discourse/mini_sql/blob/master/CHANGELOG"
|
22
|
+
}
|
23
|
+
|
18
24
|
spec.platform = 'java' if RUBY_ENGINE == 'jruby'
|
19
25
|
|
20
26
|
# Specify which files should be added to the gem when it is released.
|
21
27
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
22
|
-
|
28
|
+
# rubocop:disable Discourse/NoChdir
|
29
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
23
30
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
24
31
|
end
|
32
|
+
# rubocop:enable Discourse/NoChdir
|
25
33
|
spec.require_paths = ["lib"]
|
26
34
|
|
27
35
|
spec.add_development_dependency "bundler", "> 1.16"
|
28
|
-
spec.add_development_dependency "rake", "
|
36
|
+
spec.add_development_dependency "rake", "> 10"
|
29
37
|
spec.add_development_dependency "minitest", "~> 5.0"
|
30
38
|
spec.add_development_dependency "guard", "~> 2.14"
|
31
39
|
spec.add_development_dependency "guard-minitest", "~> 2.4"
|
32
40
|
spec.add_development_dependency "activesupport", "~> 5.2"
|
41
|
+
spec.add_development_dependency 'rubocop', '~> 1.4.0'
|
42
|
+
spec.add_development_dependency 'rubocop-discourse', '~> 2.4.1'
|
43
|
+
spec.add_development_dependency 'm', '~> 1.5.1'
|
33
44
|
|
34
45
|
if RUBY_ENGINE == 'jruby'
|
35
46
|
spec.add_development_dependency "activerecord-jdbcpostgresql-adapter", "~> 52.2"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_sql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '10
|
33
|
+
version: '10'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '10
|
40
|
+
version: '10'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +94,48 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '5.2'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.4.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.4.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-discourse
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.4.1
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 2.4.1
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: m
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 1.5.1
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 1.5.1
|
97
139
|
- !ruby/object:Gem::Dependency
|
98
140
|
name: pg
|
99
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,8 +185,10 @@ executables: []
|
|
143
185
|
extensions: []
|
144
186
|
extra_rdoc_files: []
|
145
187
|
files:
|
188
|
+
- ".github/workflows/ci.yml"
|
146
189
|
- ".gitignore"
|
147
|
-
- ".
|
190
|
+
- ".rubocop-https---raw-githubusercontent-com-discourse-discourse-master--rubocop-yml"
|
191
|
+
- ".rubocop.yml"
|
148
192
|
- CHANGELOG
|
149
193
|
- CODE_OF_CONDUCT.md
|
150
194
|
- Gemfile
|
@@ -160,6 +204,7 @@ files:
|
|
160
204
|
- lib/mini_sql.rb
|
161
205
|
- lib/mini_sql/builder.rb
|
162
206
|
- lib/mini_sql/connection.rb
|
207
|
+
- lib/mini_sql/decoratable.rb
|
163
208
|
- lib/mini_sql/deserializer_cache.rb
|
164
209
|
- lib/mini_sql/inline_param_encoder.rb
|
165
210
|
- lib/mini_sql/mysql/connection.rb
|
@@ -169,15 +214,20 @@ files:
|
|
169
214
|
- lib/mini_sql/postgres/deserializer_cache.rb
|
170
215
|
- lib/mini_sql/postgres_jdbc/connection.rb
|
171
216
|
- lib/mini_sql/postgres_jdbc/deserializer_cache.rb
|
217
|
+
- lib/mini_sql/result.rb
|
218
|
+
- lib/mini_sql/serializer.rb
|
172
219
|
- lib/mini_sql/sqlite/connection.rb
|
173
220
|
- lib/mini_sql/sqlite/deserializer_cache.rb
|
174
221
|
- lib/mini_sql/version.rb
|
175
222
|
- mini_sql.gemspec
|
176
|
-
homepage: https://discourse
|
223
|
+
homepage: https://github.com/discourse/mini_sql
|
177
224
|
licenses:
|
178
225
|
- MIT
|
179
|
-
metadata:
|
180
|
-
|
226
|
+
metadata:
|
227
|
+
bug_tracker_uri: https://github.com/discourse/mini_sql/issues
|
228
|
+
source_code_uri: https://github.com/discourse/mini_sql
|
229
|
+
changelog_uri: https://github.com/discourse/mini_sql/blob/master/CHANGELOG
|
230
|
+
post_install_message:
|
181
231
|
rdoc_options: []
|
182
232
|
require_paths:
|
183
233
|
- lib
|
@@ -192,8 +242,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
242
|
- !ruby/object:Gem::Version
|
193
243
|
version: '0'
|
194
244
|
requirements: []
|
195
|
-
rubygems_version: 3.
|
196
|
-
signing_key:
|
245
|
+
rubygems_version: 3.2.2
|
246
|
+
signing_key:
|
197
247
|
specification_version: 4
|
198
248
|
summary: A fast, safe, simple direct SQL executor
|
199
249
|
test_files: []
|
data/.travis.yml
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
rvm:
|
3
|
-
- 2.5.1
|
4
|
-
- ruby-head
|
5
|
-
|
6
|
-
before_install:
|
7
|
-
- gem install bundler
|
8
|
-
|
9
|
-
cache: bundler
|
10
|
-
sudo: false
|
11
|
-
|
12
|
-
services:
|
13
|
-
- mysql
|
14
|
-
|
15
|
-
addons:
|
16
|
-
postgresql: 9.6
|
17
|
-
mysql: 5.7
|
18
|
-
|
19
|
-
install:
|
20
|
-
- createdb test_mini_sql
|
21
|
-
- mysql -e 'CREATE DATABASE test_mini_sql;'
|
22
|
-
- bundle install
|
23
|
-
|
24
|
-
matrix:
|
25
|
-
allow_failures:
|
26
|
-
- rvm: ruby-head
|