mini_sql 0.2.2-java

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.
@@ -0,0 +1,67 @@
1
+ module MiniSql
2
+ module Postgres
3
+ class DeserializerCache
4
+
5
+ DEFAULT_MAX_SIZE = 500
6
+
7
+ def initialize(max_size = nil)
8
+ @cache = {}
9
+ @max_size = max_size || DEFAULT_MAX_SIZE
10
+ end
11
+
12
+ def materialize(result)
13
+
14
+ return [] if result.ntuples == 0
15
+
16
+ key = result.fields
17
+
18
+ # trivial fast LRU implementation
19
+ materializer = @cache.delete(key)
20
+ if materializer
21
+ @cache[key] = materializer
22
+ else
23
+ materializer = @cache[key] = new_row_matrializer(result)
24
+ @cache.shift if @cache.length > @max_size
25
+ end
26
+
27
+ i = 0
28
+ r = []
29
+ # quicker loop
30
+ while i < result.ntuples
31
+ r << materializer.materialize(result, i)
32
+ i += 1
33
+ end
34
+ r
35
+ end
36
+
37
+ private
38
+
39
+ def new_row_matrializer(result)
40
+ fields = result.fields
41
+
42
+ Class.new do
43
+ attr_accessor(*fields)
44
+
45
+ # AM serializer support
46
+ alias :read_attribute_for_serialization :send
47
+
48
+ def to_h
49
+ r = {}
50
+ instance_variables.each do |f|
51
+ r[f.to_s.sub('@','').to_sym] = instance_variable_get(f)
52
+ end
53
+ r
54
+ end
55
+
56
+ instance_eval <<~RUBY
57
+ def materialize(pg_result, index)
58
+ r = self.new
59
+ #{col=-1; fields.map{|f| "r.#{f} = pg_result.getvalue(index, #{col+=1})"}.join("; ")}
60
+ r
61
+ end
62
+ RUBY
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MiniSql
4
+ module Sqlite
5
+ class Connection < MiniSql::Connection
6
+ attr_reader :param_encoder, :raw_connection, :deserializer_cache
7
+
8
+ def initialize(raw_connection, args = nil)
9
+ @raw_connection = raw_connection
10
+ @param_encoder = (args && args[:param_encoder]) || InlineParamEncoder.new(self)
11
+ @deserializer_cache = (args && args[:deserializer_cache]) || DeserializerCache.new
12
+ end
13
+
14
+ def query_single(sql, *params)
15
+ # a bit lazy can be optimized
16
+ run(sql, *params).flatten!
17
+ end
18
+
19
+ def query_hash(sql, *params)
20
+ r = []
21
+ run(sql, *params) do |set|
22
+ set.each_hash do |h|
23
+ r << h
24
+ end
25
+ end
26
+ r
27
+ end
28
+
29
+ def exec(sql, *params)
30
+
31
+ start = raw_connection.total_changes
32
+
33
+ r = run(sql, *params)
34
+ # this is not safe for multithreading, also for DELETE from TABLE will return
35
+ # incorrect data
36
+ if r.length > 0
37
+ r.length
38
+ else
39
+ raw_connection.total_changes - start
40
+ end
41
+ end
42
+
43
+ def query(sql, *params)
44
+ run(sql, *params) do |set|
45
+ deserializer_cache.materialize(set)
46
+ end
47
+ end
48
+
49
+ def escape_string(str)
50
+ str.gsub("'","''")
51
+ end
52
+
53
+ private
54
+
55
+ def run(sql, *params)
56
+ if params && params.length > 0
57
+ sql = param_encoder.encode(sql, *params)
58
+ end
59
+ if block_given?
60
+ stmt = SQLite3::Statement.new(raw_connection, sql)
61
+ yield stmt.execute
62
+ else
63
+ raw_connection.execute(sql)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,66 @@
1
+ module MiniSql
2
+ module Sqlite
3
+ class DeserializerCache
4
+
5
+ DEFAULT_MAX_SIZE = 500
6
+
7
+ def initialize(max_size = nil)
8
+ @cache = {}
9
+ @max_size = max_size || DEFAULT_MAX_SIZE
10
+ end
11
+
12
+ def materialize(result)
13
+
14
+ key = result.columns
15
+
16
+ # trivial fast LRU implementation
17
+ materializer = @cache.delete(key)
18
+ if materializer
19
+ @cache[key] = materializer
20
+ else
21
+ materializer = @cache[key] = new_row_matrializer(result)
22
+ @cache.shift if @cache.length > @max_size
23
+ end
24
+
25
+ r = []
26
+ # quicker loop
27
+ while !result.eof?
28
+ data = result.next
29
+ if data
30
+ r << materializer.materialize(data)
31
+ end
32
+ end
33
+ r
34
+ end
35
+
36
+ private
37
+
38
+ def new_row_matrializer(result)
39
+ fields = result.columns
40
+
41
+ Class.new do
42
+ attr_accessor(*fields)
43
+
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
54
+
55
+ instance_eval <<~RUBY
56
+ def materialize(data)
57
+ r = self.new
58
+ #{col=-1; fields.map{|f| "r.#{f} = data[#{col+=1}]"}.join("; ")}
59
+ r
60
+ end
61
+ RUBY
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,3 @@
1
+ module MiniSql
2
+ VERSION = "0.2.2"
3
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require "mini_sql/version"
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "mini_sql"
9
+ spec.version = MiniSql::VERSION
10
+ spec.authors = ["Sam Saffron"]
11
+ spec.email = ["sam.saffron@gmail.com"]
12
+
13
+ spec.summary = %q{A fast, safe, simple direct SQL executor}
14
+ spec.description = %q{A fast, safe, simple direct SQL executor for PG}
15
+ spec.homepage = "https://discourse.org"
16
+ spec.license = "MIT"
17
+
18
+ spec.platform = 'java' if RUBY_ENGINE == 'jruby'
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # 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
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.require_paths = ["lib"]
26
+
27
+ spec.add_development_dependency "bundler", "> 1.16"
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "minitest", "~> 5.0"
30
+ spec.add_development_dependency "guard", "~> 2.14"
31
+ spec.add_development_dependency "guard-minitest", "~> 2.4"
32
+ spec.add_development_dependency "activesupport", "~> 5.2"
33
+
34
+ if RUBY_ENGINE == 'jruby'
35
+ spec.add_development_dependency "activerecord-jdbcpostgresql-adapter", "~> 52.2"
36
+ else
37
+ spec.add_development_dependency "pg", "> 1"
38
+ spec.add_development_dependency "sqlite3", "~> 1.3"
39
+ end
40
+ end
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mini_sql
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.2
5
+ platform: java
6
+ authors:
7
+ - Sam Saffron
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-12-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.16'
19
+ name: bundler
20
+ prerelease: false
21
+ type: :development
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '10.0'
33
+ name: rake
34
+ prerelease: false
35
+ type: :development
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '5.0'
47
+ name: minitest
48
+ prerelease: false
49
+ type: :development
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.14'
61
+ name: guard
62
+ prerelease: false
63
+ type: :development
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.14'
69
+ - !ruby/object:Gem::Dependency
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.4'
75
+ name: guard-minitest
76
+ prerelease: false
77
+ type: :development
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.4'
83
+ - !ruby/object:Gem::Dependency
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '5.2'
89
+ name: activesupport
90
+ prerelease: false
91
+ type: :development
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '5.2'
97
+ - !ruby/object:Gem::Dependency
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '52.2'
103
+ name: activerecord-jdbcpostgresql-adapter
104
+ prerelease: false
105
+ type: :development
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '52.2'
111
+ description: A fast, safe, simple direct SQL executor for PG
112
+ email:
113
+ - sam.saffron@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".travis.yml"
120
+ - CHANGELOG
121
+ - CODE_OF_CONDUCT.md
122
+ - Gemfile
123
+ - Guardfile
124
+ - LICENSE.txt
125
+ - README.md
126
+ - Rakefile
127
+ - bench/timestamp_perf.rb
128
+ - bench/topic_perf.rb
129
+ - bin/console
130
+ - bin/setup
131
+ - lib/mini_sql.rb
132
+ - lib/mini_sql/builder.rb
133
+ - lib/mini_sql/connection.rb
134
+ - lib/mini_sql/deserializer_cache.rb
135
+ - lib/mini_sql/inline_param_encoder.rb
136
+ - lib/mini_sql/postgres/coders.rb
137
+ - lib/mini_sql/postgres/connection.rb
138
+ - lib/mini_sql/postgres/deserializer_cache.rb
139
+ - lib/mini_sql/postgres_jdbc/connection.rb
140
+ - lib/mini_sql/postgres_jdbc/deserializer_cache.rb
141
+ - lib/mini_sql/sqlite/connection.rb
142
+ - lib/mini_sql/sqlite/deserializer_cache.rb
143
+ - lib/mini_sql/version.rb
144
+ - mini_sql.gemspec
145
+ homepage: https://discourse.org
146
+ licenses:
147
+ - MIT
148
+ metadata: {}
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ requirements: []
164
+ rubyforge_project:
165
+ rubygems_version: 2.7.10
166
+ signing_key:
167
+ specification_version: 4
168
+ summary: A fast, safe, simple direct SQL executor
169
+ test_files: []