mini_sql 0.2.2-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []