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.
@@ -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
- attr_accessor(*fields)
48
+ extend MiniSql::Decoratable
49
+ include MiniSql::Result
43
50
 
44
- # AM serializer support
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=-1; fields.map{|f| "r.#{f} = data[#{col+=1}]"}.join("; ")}
56
+ #{col = -1; fields.map { |f| "r.#{f} = data[#{col += 1}]" }.join("; ")}
59
57
  r
60
58
  end
61
59
  RUBY
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module MiniSql
3
- VERSION = "0.2.3"
3
+ VERSION = "1.0.1"
4
4
  end
@@ -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.org"
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
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
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", "~> 10.0"
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.2.3
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: 2019-12-20 00:00:00.000000000 Z
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.0'
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.0'
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
- - ".travis.yml"
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.org
223
+ homepage: https://github.com/discourse/mini_sql
177
224
  licenses:
178
225
  - MIT
179
- metadata: {}
180
- post_install_message:
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.0.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: []
@@ -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