mini_sql 0.2.3 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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