litedb 0.2.0 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8e1097139b537cf11185aff048fe8a748c5310a39035a064592c7ee2f6630d3b
4
- data.tar.gz: 7ff2fac632767ed67aa3ab838d8b731f4af5b5a870e087e8eeae42976823b7cd
3
+ metadata.gz: '03940873fc6d049cf80790e80b04325ad29d0b51af711ad5dc4442df01396cb5'
4
+ data.tar.gz: ce364a86c99bc2ad9211163f606a850b9f943838579ec3d53225de7fb7fcd41d
5
5
  SHA512:
6
- metadata.gz: 46abb2fff25ef4498fff3700204d4dc72364c670e6a5b59d7ca0e419e154be0e016e8c88b4ec0a08d08ea548317823238f8b6398a448c9431bf74fe9c6dd80c7
7
- data.tar.gz: 736164fddc5851d19cf256b0a58640e4610e4231114bf46c5d8803380d050444dfc14ccd017698c2982ddba9947e146f3b0a44fa74905f9b5fda09b8d8414715
6
+ metadata.gz: 2392eabd26b22e60b87559d984481c7b1d029df091a22994cbabedd42bc8fc5700423c840c749eee0e72d1b8a5c5658d91df262bfdd7124601014cff0cb128db
7
+ data.tar.gz: 104675e33444e702ffaba66e1908464800f5432ee00bbc717bb0514ad8f983b308ed9355650193f4ef790d5f36a6a7cc5bf5372ac6add652f85a4c95b0f00306
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.1] - 2023-08-11
4
+
5
+ - Move the `SQLite3::Database` wrapper to `Litedb::Connection` class. This both makes it easier to extend the gem to wrap other SQLite3 classes (like `Statement`) and also makes dealing with the VERSION reasonable (and possible). Keeping VERSION in a separate file proved impossible when having Litedb be a class that inherited from SQLite3::Database, because the gemspec needed the version before sqlite3 was required.
6
+
3
7
  ## [0.2.0] - 2023-08-10
4
8
 
5
9
  - Initial release of usable code
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- litedb (0.2.0)
4
+ litedb (0.2.1)
5
5
  litescheduler (>= 0.2.0)
6
6
  sqlite3 (>= 1.5.0)
7
7
 
@@ -9,6 +9,7 @@ GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
11
  ast (2.4.2)
12
+ docile (1.4.0)
12
13
  json (2.6.3)
13
14
  language_server-protocol (3.17.0.3)
14
15
  lint_roller (1.1.0)
@@ -39,6 +40,12 @@ GEM
39
40
  rubocop (>= 1.7.0, < 2.0)
40
41
  rubocop-ast (>= 0.4.0)
41
42
  ruby-progressbar (1.13.0)
43
+ simplecov (0.22.0)
44
+ docile (~> 1.1)
45
+ simplecov-html (~> 0.11)
46
+ simplecov_json_formatter (~> 0.1)
47
+ simplecov-html (0.12.3)
48
+ simplecov_json_formatter (0.1.4)
42
49
  sqlite3 (1.6.3-arm64-darwin)
43
50
  sqlite3 (1.6.3-x86_64-linux)
44
51
  standard (1.30.1)
@@ -63,6 +70,7 @@ DEPENDENCIES
63
70
  litedb!
64
71
  minitest (~> 5.0)
65
72
  rake (~> 13.0)
73
+ simplecov
66
74
  standard (~> 1.3)
67
75
 
68
76
  BUNDLED WITH
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sqlite3"
4
+ require "litescheduler"
5
+
6
+ module Litedb
7
+ class Connection < SQLite3::Database
8
+ DEFAULT_FILE = ":memory:"
9
+ DEFAULT_OPTIONS = {
10
+ synchronous: :NORMAL,
11
+ mmap_size: 32 * 1024, # 32 kilobytes
12
+ journal_size_limit: 64 * 1024 * 1024 # 64 megabytes
13
+ }.freeze
14
+
15
+ attr_reader :config
16
+
17
+ def initialize(file = nil, options = {}, zvfs = nil)
18
+ @scheduler = Litescheduler.instance
19
+ file ||= DEFAULT_FILE
20
+ options = options.transform_keys { |key|
21
+ begin
22
+ key.to_sym
23
+ rescue
24
+ key
25
+ end
26
+ }
27
+ @config = DEFAULT_OPTIONS.merge(options)
28
+
29
+ super(file, @config, zvfs)
30
+
31
+ set_pragmas
32
+ run_migrations
33
+ prepare_statements
34
+ end
35
+
36
+ def run_statement(statement, *args)
37
+ statements[statement].execute!(*args)
38
+ end
39
+
40
+ private
41
+
42
+ def set_pragmas
43
+ # set a custom busy handler to override the `busy_timeout`
44
+ # this ensures we either switch to another execution context or try again to connect
45
+ # https://www.sqlite.org/pragma.html#pragma_busy_timeout
46
+ busy_handler { @scheduler.switch || sleep(rand * 0.001) }
47
+ # Journal mode WAL allows for greater concurrency (many readers + one writer)
48
+ # https://www.sqlite.org/pragma.html#pragma_journal_mode
49
+ self.journal_mode = :WAL
50
+ # level of database durability
51
+ # 2 = "FULL" (sync on every write)
52
+ # 1 = "NORMAL" (sync every 1000 written pages)
53
+ # 0 = "OFF" (don't sync)
54
+ # https://www.sqlite.org/pragma.html#pragma_synchronous
55
+ self.synchronous = @config[:synchronous]
56
+ # set the global memory map so all processes can share data
57
+ # https://www.sqlite.org/pragma.html#pragma_mmap_size
58
+ # https://www.sqlite.org/mmap.html
59
+ self.mmap_size = @config[:mmap_size]
60
+ # impose a limit on the WAL file to prevent unlimited growth (with a negative impact on read performance as well)
61
+ # https://www.sqlite.org/pragma.html#pragma_journal_size_limit
62
+ self.journal_size_limit = @config[:journal_size_limit]
63
+ end
64
+
65
+ def run_migrations
66
+ return if @config[:migrations].nil?
67
+
68
+ migrations = if @config[:migrations].is_a?(Hash)
69
+ @config[:migrations].values
70
+ elsif @config[:migrations].is_a?(Array)
71
+ @config[:migrations]
72
+ else
73
+ raise Error.new("`migrations` option must be either a Hash or an Array")
74
+ end
75
+
76
+ transaction(:immediate) do
77
+ migrations.each do |sql|
78
+ execute(clean_sql(sql))
79
+ end
80
+ end
81
+ end
82
+
83
+ def prepare_statements
84
+ instance_variable_set(:@statements, {})
85
+ self.class.attr_reader(:statements) unless respond_to?(:statements)
86
+
87
+ return if @config[:statements].nil?
88
+
89
+ @config[:statements].each do |key, sql|
90
+ statements[key.to_sym] = prepare(clean_sql(sql))
91
+ end
92
+ end
93
+
94
+ def clean_sql(sql)
95
+ sql.gsub(/[[:space:]]+/, " ").strip
96
+ end
97
+ end
98
+ end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "sqlite3"
4
-
5
- class Litedb < SQLite3::Database
6
- VERSION = "0.2.0"
3
+ module Litedb
4
+ VERSION = "0.2.1"
7
5
  end
data/lib/litedb.rb CHANGED
@@ -1,100 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "litedb/version"
4
+ require_relative "litedb/connection"
4
5
 
5
6
  require "sqlite3"
6
7
  require "litescheduler"
7
8
 
8
- class Litedb < SQLite3::Database
9
+ module Litedb
9
10
  class Error < StandardError; end
10
-
11
- DEFAULT_FILE = ":memory:"
12
- DEFAULT_OPTIONS = {
13
- synchronous: :NORMAL,
14
- mmap_size: 32 * 1024, # 32 kilobytes
15
- journal_size_limit: 64 * 1024 * 1024 # 64 megabytes
16
- }.freeze
17
-
18
- attr_reader :config
19
-
20
- def initialize(file = nil, options = {}, zvfs = nil)
21
- @scheduler = Litescheduler.instance
22
- file ||= DEFAULT_FILE
23
- options = options.transform_keys { |key|
24
- begin
25
- key.to_sym
26
- rescue
27
- key
28
- end
29
- }
30
- @config = DEFAULT_OPTIONS.merge(options)
31
-
32
- super(file, @config, zvfs)
33
-
34
- set_pragmas
35
- run_migrations
36
- prepare_statements
37
- end
38
-
39
- def run_statement(statement, *args)
40
- statements[statement].execute!(*args)
41
- end
42
-
43
- private
44
-
45
- def set_pragmas
46
- # set a custom busy handler to override the `busy_timeout`
47
- # this ensures we either switch to another execution context or try again to connect
48
- # https://www.sqlite.org/pragma.html#pragma_busy_timeout
49
- busy_handler { @scheduler.switch || sleep(rand * 0.001) }
50
- # Journal mode WAL allows for greater concurrency (many readers + one writer)
51
- # https://www.sqlite.org/pragma.html#pragma_journal_mode
52
- self.journal_mode = :WAL
53
- # level of database durability
54
- # 2 = "FULL" (sync on every write)
55
- # 1 = "NORMAL" (sync every 1000 written pages)
56
- # 0 = "OFF" (don't sync)
57
- # https://www.sqlite.org/pragma.html#pragma_synchronous
58
- self.synchronous = @config[:synchronous]
59
- # set the global memory map so all processes can share data
60
- # https://www.sqlite.org/pragma.html#pragma_mmap_size
61
- # https://www.sqlite.org/mmap.html
62
- self.mmap_size = @config[:mmap_size]
63
- # impose a limit on the WAL file to prevent unlimited growth (with a negative impact on read performance as well)
64
- # https://www.sqlite.org/pragma.html#pragma_journal_size_limit
65
- self.journal_size_limit = @config[:journal_size_limit]
66
- end
67
-
68
- def run_migrations
69
- return if @config[:migrations].nil?
70
-
71
- migrations = if @config[:migrations].is_a?(Hash)
72
- @config[:migrations].values
73
- elsif @config[:migrations].is_a?(Array)
74
- @config[:migrations]
75
- else
76
- raise Error.new("`migrations` option must be either a Hash or an Array")
77
- end
78
-
79
- transaction(:immediate) do
80
- migrations.each do |sql|
81
- execute(clean_sql(sql))
82
- end
83
- end
84
- end
85
-
86
- def prepare_statements
87
- instance_variable_set(:@statements, {})
88
- self.class.attr_reader(:statements) unless respond_to?(:statements)
89
-
90
- return if @config[:statements].nil?
91
-
92
- @config[:statements].each do |key, sql|
93
- statements[key.to_sym] = prepare(clean_sql(sql))
94
- end
95
- end
96
-
97
- def clean_sql(sql)
98
- sql.gsub(/[[:space:]]+/, " ").strip
99
- end
100
11
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: litedb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mohamed Hassan
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-08-10 00:00:00.000000000 Z
12
+ date: 2023-08-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sqlite3
@@ -39,6 +39,20 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: 0.2.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: simplecov
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
42
56
  description:
43
57
  email:
44
58
  - oldmoe@gmail.com
@@ -56,6 +70,7 @@ files:
56
70
  - README.md
57
71
  - Rakefile
58
72
  - lib/litedb.rb
73
+ - lib/litedb/connection.rb
59
74
  - lib/litedb/version.rb
60
75
  - sig/litedb.rbs
61
76
  homepage: https://github.com/litestack-ruby/litedb