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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +1 -1
- data/CHANGELOG +20 -0
- data/README.md +36 -0
- data/bench/builder_perf.rb +138 -0
- data/bench/decorator_perf.rb +143 -0
- data/bench/mini_sql_methods_perf.rb +80 -0
- data/bench/prepared_perf.rb +59 -0
- data/bench/shared/generate_data.rb +133 -0
- data/bench/topic_perf.rb +21 -327
- data/bench/topic_wide_perf.rb +92 -0
- data/lib/mini_sql.rb +17 -8
- data/lib/mini_sql/abstract/prepared_binds.rb +74 -0
- data/lib/mini_sql/abstract/prepared_cache.rb +45 -0
- data/lib/mini_sql/builder.rb +63 -30
- data/lib/mini_sql/inline_param_encoder.rb +4 -5
- data/lib/mini_sql/mysql/connection.rb +13 -3
- data/lib/mini_sql/mysql/deserializer_cache.rb +3 -3
- data/lib/mini_sql/mysql/prepared_binds.rb +15 -0
- data/lib/mini_sql/mysql/prepared_cache.rb +21 -0
- data/lib/mini_sql/mysql/prepared_connection.rb +47 -0
- data/lib/mini_sql/postgres/connection.rb +21 -7
- data/lib/mini_sql/postgres/deserializer_cache.rb +5 -5
- data/lib/mini_sql/postgres/prepared_binds.rb +15 -0
- data/lib/mini_sql/postgres/prepared_cache.rb +25 -0
- data/lib/mini_sql/postgres/prepared_connection.rb +39 -0
- data/lib/mini_sql/postgres_jdbc/connection.rb +3 -1
- data/lib/mini_sql/postgres_jdbc/deserializer_cache.rb +3 -3
- data/lib/mini_sql/result.rb +10 -0
- data/lib/mini_sql/serializer.rb +29 -15
- data/lib/mini_sql/sqlite/connection.rb +14 -2
- data/lib/mini_sql/sqlite/deserializer_cache.rb +3 -3
- data/lib/mini_sql/sqlite/prepared_binds.rb +15 -0
- data/lib/mini_sql/sqlite/prepared_cache.rb +21 -0
- data/lib/mini_sql/sqlite/prepared_connection.rb +43 -0
- data/lib/mini_sql/version.rb +1 -1
- 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] =
|
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
|
44
|
+
def new_row_materializer(result)
|
45
45
|
fields = result.columns
|
46
46
|
|
47
47
|
Class.new do
|
@@ -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
|
data/lib/mini_sql/version.rb
CHANGED
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:
|
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:
|
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.
|
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
|