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