mini_sql 1.0 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +1 -1
  3. data/CHANGELOG +20 -0
  4. data/README.md +36 -0
  5. data/bench/builder_perf.rb +138 -0
  6. data/bench/decorator_perf.rb +143 -0
  7. data/bench/mini_sql_methods_perf.rb +80 -0
  8. data/bench/prepared_perf.rb +59 -0
  9. data/bench/shared/generate_data.rb +133 -0
  10. data/bench/topic_perf.rb +21 -327
  11. data/bench/topic_wide_perf.rb +92 -0
  12. data/lib/mini_sql.rb +17 -8
  13. data/lib/mini_sql/abstract/prepared_binds.rb +74 -0
  14. data/lib/mini_sql/abstract/prepared_cache.rb +45 -0
  15. data/lib/mini_sql/builder.rb +63 -30
  16. data/lib/mini_sql/inline_param_encoder.rb +4 -5
  17. data/lib/mini_sql/mysql/connection.rb +13 -3
  18. data/lib/mini_sql/mysql/deserializer_cache.rb +3 -3
  19. data/lib/mini_sql/mysql/prepared_binds.rb +15 -0
  20. data/lib/mini_sql/mysql/prepared_cache.rb +21 -0
  21. data/lib/mini_sql/mysql/prepared_connection.rb +47 -0
  22. data/lib/mini_sql/postgres/connection.rb +21 -7
  23. data/lib/mini_sql/postgres/deserializer_cache.rb +5 -5
  24. data/lib/mini_sql/postgres/prepared_binds.rb +15 -0
  25. data/lib/mini_sql/postgres/prepared_cache.rb +25 -0
  26. data/lib/mini_sql/postgres/prepared_connection.rb +39 -0
  27. data/lib/mini_sql/postgres_jdbc/connection.rb +3 -1
  28. data/lib/mini_sql/postgres_jdbc/deserializer_cache.rb +3 -3
  29. data/lib/mini_sql/result.rb +10 -0
  30. data/lib/mini_sql/serializer.rb +29 -15
  31. data/lib/mini_sql/sqlite/connection.rb +14 -2
  32. data/lib/mini_sql/sqlite/deserializer_cache.rb +3 -3
  33. data/lib/mini_sql/sqlite/prepared_binds.rb +15 -0
  34. data/lib/mini_sql/sqlite/prepared_cache.rb +21 -0
  35. data/lib/mini_sql/sqlite/prepared_connection.rb +43 -0
  36. data/lib/mini_sql/version.rb +1 -1
  37. metadata +20 -3
@@ -13,14 +13,14 @@ module MiniSql
13
13
 
14
14
  def materialize(result, decorator_module = nil)
15
15
 
16
- key = result.columns
16
+ key = result.columns.join(',')
17
17
 
18
18
  # trivial fast LRU implementation
19
19
  materializer = @cache.delete(key)
20
20
  if materializer
21
21
  @cache[key] = materializer
22
22
  else
23
- materializer = @cache[key] = new_row_matrializer(result)
23
+ materializer = @cache[key] = new_row_materializer(result)
24
24
  @cache.shift if @cache.length > @max_size
25
25
  end
26
26
 
@@ -41,7 +41,7 @@ module MiniSql
41
41
 
42
42
  private
43
43
 
44
- def new_row_matrializer(result)
44
+ def new_row_materializer(result)
45
45
  fields = result.columns
46
46
 
47
47
  Class.new do
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mini_sql/abstract/prepared_binds"
4
+
5
+ module MiniSql
6
+ module Sqlite
7
+ class PreparedBinds < ::MiniSql::Abstract::PreparedBinds
8
+
9
+ def bind_output(i)
10
+ '?'
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mini_sql/abstract/prepared_cache"
4
+
5
+ module MiniSql
6
+ module Sqlite
7
+ class PreparedCache < MiniSql::Abstract::PreparedCache
8
+
9
+ private
10
+
11
+ def alloc(sql)
12
+ @connection.prepare(sql)
13
+ end
14
+
15
+ def dealloc(statement)
16
+ statement.close unless statement.closed?
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MiniSql
4
+ module Sqlite
5
+ class PreparedConnection < Connection
6
+
7
+ attr_reader :unprepared
8
+
9
+ def initialize(unprepared_connection)
10
+ @unprepared = unprepared_connection
11
+ @raw_connection = unprepared_connection.raw_connection
12
+ @param_encoder = unprepared_connection.param_encoder
13
+
14
+ @prepared_cache = PreparedCache.new(@raw_connection)
15
+ @param_binder = PreparedBinds.new
16
+ end
17
+
18
+ def build(_)
19
+ raise 'Builder can not be called on prepared connections, instead of `::MINI_SQL.prepared.build(sql).query` use `::MINI_SQL.build(sql).prepared.query`'
20
+ end
21
+
22
+ def prepared(condition = true)
23
+ condition ? self : @unprepared
24
+ end
25
+
26
+ def deserializer_cache
27
+ @unprepared.deserializer_cache
28
+ end
29
+
30
+ private def run(sql, params)
31
+ prepared_sql, binds, _bind_names = @param_binder.bind(sql, params)
32
+ statement = @prepared_cache.prepare_statement(prepared_sql)
33
+ statement.bind_params(binds)
34
+ if block_given?
35
+ yield statement.execute
36
+ else
37
+ statement.execute.to_a
38
+ end
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module MiniSql
3
- VERSION = "1.0"
3
+ VERSION = "1.1.3"
4
4
  end
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: '1.0'
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-29 00:00:00.000000000 Z
11
+ date: 2021-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -196,12 +196,20 @@ files:
196
196
  - LICENSE.txt
197
197
  - README.md
198
198
  - Rakefile
199
+ - bench/builder_perf.rb
200
+ - bench/decorator_perf.rb
201
+ - bench/mini_sql_methods_perf.rb
202
+ - bench/prepared_perf.rb
203
+ - bench/shared/generate_data.rb
199
204
  - bench/timestamp_perf.rb
200
205
  - bench/topic_mysql_perf.rb
201
206
  - bench/topic_perf.rb
207
+ - bench/topic_wide_perf.rb
202
208
  - bin/console
203
209
  - bin/setup
204
210
  - lib/mini_sql.rb
211
+ - lib/mini_sql/abstract/prepared_binds.rb
212
+ - lib/mini_sql/abstract/prepared_cache.rb
205
213
  - lib/mini_sql/builder.rb
206
214
  - lib/mini_sql/connection.rb
207
215
  - lib/mini_sql/decoratable.rb
@@ -209,15 +217,24 @@ files:
209
217
  - lib/mini_sql/inline_param_encoder.rb
210
218
  - lib/mini_sql/mysql/connection.rb
211
219
  - lib/mini_sql/mysql/deserializer_cache.rb
220
+ - lib/mini_sql/mysql/prepared_binds.rb
221
+ - lib/mini_sql/mysql/prepared_cache.rb
222
+ - lib/mini_sql/mysql/prepared_connection.rb
212
223
  - lib/mini_sql/postgres/coders.rb
213
224
  - lib/mini_sql/postgres/connection.rb
214
225
  - lib/mini_sql/postgres/deserializer_cache.rb
226
+ - lib/mini_sql/postgres/prepared_binds.rb
227
+ - lib/mini_sql/postgres/prepared_cache.rb
228
+ - lib/mini_sql/postgres/prepared_connection.rb
215
229
  - lib/mini_sql/postgres_jdbc/connection.rb
216
230
  - lib/mini_sql/postgres_jdbc/deserializer_cache.rb
217
231
  - lib/mini_sql/result.rb
218
232
  - lib/mini_sql/serializer.rb
219
233
  - lib/mini_sql/sqlite/connection.rb
220
234
  - lib/mini_sql/sqlite/deserializer_cache.rb
235
+ - lib/mini_sql/sqlite/prepared_binds.rb
236
+ - lib/mini_sql/sqlite/prepared_cache.rb
237
+ - lib/mini_sql/sqlite/prepared_connection.rb
221
238
  - lib/mini_sql/version.rb
222
239
  - mini_sql.gemspec
223
240
  homepage: https://github.com/discourse/mini_sql
@@ -242,7 +259,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
242
259
  - !ruby/object:Gem::Version
243
260
  version: '0'
244
261
  requirements: []
245
- rubygems_version: 3.2.3
262
+ rubygems_version: 3.2.2
246
263
  signing_key:
247
264
  specification_version: 4
248
265
  summary: A fast, safe, simple direct SQL executor