mini_sql 1.0 → 1.1.3

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.
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