sqlite3 1.5.0 → 2.0.2

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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +390 -0
  3. data/CONTRIBUTING.md +34 -2
  4. data/{faq/faq.md → FAQ.md} +0 -43
  5. data/INSTALLATION.md +269 -0
  6. data/LICENSE +18 -22
  7. data/README.md +76 -128
  8. data/dependencies.yml +13 -0
  9. data/ext/sqlite3/aggregator.c +142 -146
  10. data/ext/sqlite3/aggregator.h +2 -4
  11. data/ext/sqlite3/backup.c +86 -64
  12. data/ext/sqlite3/backup.h +2 -2
  13. data/ext/sqlite3/database.c +543 -465
  14. data/ext/sqlite3/database.h +9 -4
  15. data/ext/sqlite3/exception.c +111 -92
  16. data/ext/sqlite3/exception.h +3 -1
  17. data/ext/sqlite3/extconf.rb +83 -51
  18. data/ext/sqlite3/sqlite3.c +160 -115
  19. data/ext/sqlite3/sqlite3_ruby.h +2 -2
  20. data/ext/sqlite3/statement.c +518 -293
  21. data/ext/sqlite3/statement.h +3 -3
  22. data/ext/sqlite3/timespec.h +20 -0
  23. data/lib/sqlite3/constants.rb +171 -47
  24. data/lib/sqlite3/database.rb +141 -181
  25. data/lib/sqlite3/errors.rb +26 -1
  26. data/lib/sqlite3/pragmas.rb +128 -138
  27. data/lib/sqlite3/resultset.rb +14 -105
  28. data/lib/sqlite3/statement.rb +58 -13
  29. data/lib/sqlite3/value.rb +17 -20
  30. data/lib/sqlite3/version.rb +1 -21
  31. data/lib/sqlite3.rb +6 -4
  32. data/ports/archives/sqlite-autoconf-3460000.tar.gz +0 -0
  33. metadata +19 -107
  34. data/API_CHANGES.md +0 -49
  35. data/ChangeLog.cvs +0 -88
  36. data/Gemfile +0 -3
  37. data/LICENSE-DEPENDENCIES +0 -20
  38. data/faq/faq.rb +0 -145
  39. data/faq/faq.yml +0 -426
  40. data/lib/sqlite3/translator.rb +0 -118
  41. data/ports/archives/sqlite-autoconf-3380500.tar.gz +0 -0
  42. data/test/helper.rb +0 -27
  43. data/test/test_backup.rb +0 -33
  44. data/test/test_collation.rb +0 -82
  45. data/test/test_database.rb +0 -545
  46. data/test/test_database_flags.rb +0 -95
  47. data/test/test_database_readonly.rb +0 -36
  48. data/test/test_database_readwrite.rb +0 -41
  49. data/test/test_deprecated.rb +0 -44
  50. data/test/test_encoding.rb +0 -155
  51. data/test/test_integration.rb +0 -507
  52. data/test/test_integration_aggregate.rb +0 -336
  53. data/test/test_integration_open_close.rb +0 -30
  54. data/test/test_integration_pending.rb +0 -115
  55. data/test/test_integration_resultset.rb +0 -142
  56. data/test/test_integration_statement.rb +0 -194
  57. data/test/test_result_set.rb +0 -37
  58. data/test/test_sqlite3.rb +0 -30
  59. data/test/test_statement.rb +0 -263
  60. data/test/test_statement_execute.rb +0 -35
@@ -1,8 +1,7 @@
1
- require 'sqlite3/constants'
2
- require 'sqlite3/errors'
1
+ require "sqlite3/constants"
2
+ require "sqlite3/errors"
3
3
 
4
4
  module SQLite3
5
-
6
5
  # The ResultSet object encapsulates the enumerability of a query's output.
7
6
  # It is a simple cursor over the data that the query returns. It will
8
7
  # very rarely (if ever) be instantiated directly. Instead, clients should
@@ -10,76 +9,18 @@ module SQLite3
10
9
  class ResultSet
11
10
  include Enumerable
12
11
 
13
- class ArrayWithTypes < Array # :nodoc:
14
- attr_accessor :types
15
- end
16
-
17
- class ArrayWithTypesAndFields < Array # :nodoc:
18
- attr_writer :types
19
- attr_writer :fields
20
-
21
- def types
22
- warn(<<-eowarn) if $VERBOSE
23
- #{caller[0]} is calling #{self.class}#types. This method will be removed in
24
- sqlite3 version 2.0.0, please call the `types` method on the SQLite3::ResultSet
25
- object that created this object
26
- eowarn
27
- @types
28
- end
29
-
30
- def fields
31
- warn(<<-eowarn) if $VERBOSE
32
- #{caller[0]} is calling #{self.class}#fields. This method will be removed in
33
- sqlite3 version 2.0.0, please call the `columns` method on the SQLite3::ResultSet
34
- object that created this object
35
- eowarn
36
- @fields
37
- end
38
- end
39
-
40
- # The class of which we return an object in case we want a Hash as
41
- # result.
42
- class HashWithTypesAndFields < Hash # :nodoc:
43
- attr_writer :types
44
- attr_writer :fields
45
-
46
- def types
47
- warn(<<-eowarn) if $VERBOSE
48
- #{caller[0]} is calling #{self.class}#types. This method will be removed in
49
- sqlite3 version 2.0.0, please call the `types` method on the SQLite3::ResultSet
50
- object that created this object
51
- eowarn
52
- @types
53
- end
54
-
55
- def fields
56
- warn(<<-eowarn) if $VERBOSE
57
- #{caller[0]} is calling #{self.class}#fields. This method will be removed in
58
- sqlite3 version 2.0.0, please call the `columns` method on the SQLite3::ResultSet
59
- object that created this object
60
- eowarn
61
- @fields
62
- end
63
-
64
- def [] key
65
- key = fields[key] if key.is_a? Numeric
66
- super key
67
- end
68
- end
69
-
70
12
  # Create a new ResultSet attached to the given database, using the
71
13
  # given sql text.
72
14
  def initialize db, stmt
73
- @db = db
15
+ @db = db
74
16
  @stmt = stmt
75
17
  end
76
18
 
77
19
  # Reset the cursor, so that a result set which has reached end-of-file
78
20
  # can be rewound and reiterated.
79
- def reset( *bind_params )
21
+ def reset(*bind_params)
80
22
  @stmt.reset!
81
- @stmt.bind_params( *bind_params )
82
- @eof = false
23
+ @stmt.bind_params(*bind_params)
83
24
  end
84
25
 
85
26
  # Query whether the cursor has reached the end of the result set or not.
@@ -88,9 +29,7 @@ object that created this object
88
29
  end
89
30
 
90
31
  # Obtain the next row from the cursor. If there are no more rows to be
91
- # had, this will return +nil+. If type translation is active on the
92
- # corresponding database, the values in the row will be translated
93
- # according to their types.
32
+ # had, this will return +nil+.
94
33
  #
95
34
  # The returned value will be an array, unless Database#results_as_hash has
96
35
  # been set to +true+, in which case the returned value will be a hash.
@@ -101,36 +40,13 @@ object that created this object
101
40
  # For hashes, the column names are the keys of the hash, and the column
102
41
  # types are accessible via the +types+ property.
103
42
  def next
104
- if @db.results_as_hash
105
- return next_hash
106
- end
107
-
108
- row = @stmt.step
109
- return nil if @stmt.done?
110
-
111
- row = @db.translate_from_db @stmt.types, row
112
-
113
- if row.respond_to?(:fields)
114
- # FIXME: this can only happen if the translator returns something
115
- # that responds to `fields`. Since we're removing the translator
116
- # in 2.0, we can remove this branch in 2.0.
117
- row = ArrayWithTypes.new(row)
118
- else
119
- # FIXME: the `fields` and `types` methods are deprecated on this
120
- # object for version 2.0, so we can safely remove this branch
121
- # as well.
122
- row = ArrayWithTypesAndFields.new(row)
123
- end
124
-
125
- row.fields = @stmt.columns
126
- row.types = @stmt.types
127
- row
43
+ @stmt.step
128
44
  end
129
45
 
130
46
  # Required by the Enumerable mixin. Provides an internal iterator over the
131
47
  # rows of the result set.
132
48
  def each
133
- while node = self.next
49
+ while (node = self.next)
134
50
  yield node
135
51
  end
136
52
  end
@@ -138,7 +54,7 @@ object that created this object
138
54
  # Provides an internal iterator over the rows of the result set where
139
55
  # each row is yielded as a hash.
140
56
  def each_hash
141
- while node = next_hash
57
+ while (node = next_hash)
142
58
  yield node
143
59
  end
144
60
  end
@@ -170,18 +86,11 @@ object that created this object
170
86
  row = @stmt.step
171
87
  return nil if @stmt.done?
172
88
 
173
- # FIXME: type translation is deprecated, so this can be removed
174
- # in 2.0
175
- row = @db.translate_from_db @stmt.types, row
176
-
177
- # FIXME: this can be switched to a regular hash in 2.0
178
- row = HashWithTypesAndFields[*@stmt.columns.zip(row).flatten]
179
-
180
- # FIXME: these methods are deprecated for version 2.0, so we can remove
181
- # this code in 2.0
182
- row.fields = @stmt.columns
183
- row.types = @stmt.types
184
- row
89
+ @stmt.columns.zip(row).to_h
185
90
  end
186
91
  end
92
+
93
+ class HashResultSet < ResultSet # :nodoc:
94
+ alias_method :next, :next_hash
95
+ end
187
96
  end
@@ -1,9 +1,9 @@
1
- require 'sqlite3/errors'
2
- require 'sqlite3/resultset'
1
+ require "sqlite3/errors"
2
+ require "sqlite3/resultset"
3
3
 
4
4
  class String
5
5
  def to_blob
6
- SQLite3::Blob.new( self )
6
+ SQLite3::Blob.new(self)
7
7
  end
8
8
  end
9
9
 
@@ -19,6 +19,23 @@ module SQLite3
19
19
  # this will be the empty string.
20
20
  attr_reader :remainder
21
21
 
22
+ # call-seq: SQLite3::Statement.new(db, sql)
23
+ #
24
+ # Create a new statement attached to the given Database instance, and which
25
+ # encapsulates the given SQL text. If the text contains more than one
26
+ # statement (i.e., separated by semicolons), then the #remainder property
27
+ # will be set to the trailing text.
28
+ def initialize(db, sql)
29
+ raise ArgumentError, "prepare called on a closed database" if db.closed?
30
+
31
+ sql = sql.encode(Encoding::UTF_8) if sql && sql.encoding != Encoding::UTF_8
32
+
33
+ @connection = db
34
+ @columns = nil
35
+ @types = nil
36
+ @remainder = prepare db, sql
37
+ end
38
+
22
39
  # Binds the given variables to the corresponding placeholders in the SQL
23
40
  # text.
24
41
  #
@@ -32,7 +49,7 @@ module SQLite3
32
49
  #
33
50
  # See also #execute, #bind_param, Statement#bind_param, and
34
51
  # Statement#bind_params.
35
- def bind_params( *bind_vars )
52
+ def bind_params(*bind_vars)
36
53
  index = 1
37
54
  bind_vars.flatten.each do |var|
38
55
  if Hash === var
@@ -58,16 +75,16 @@ module SQLite3
58
75
  # end
59
76
  #
60
77
  # See also #bind_params, #execute!.
61
- def execute( *bind_vars )
78
+ def execute(*bind_vars)
62
79
  reset! if active? || done?
63
80
 
64
81
  bind_params(*bind_vars) unless bind_vars.empty?
65
- @results = ResultSet.new(@connection, self)
82
+ results = @connection.build_result_set self
66
83
 
67
- step if 0 == column_count
84
+ step if column_count == 0
68
85
 
69
- yield @results if block_given?
70
- @results
86
+ yield results if block_given?
87
+ results
71
88
  end
72
89
 
73
90
  # Execute the statement. If no block was given, this returns an array of
@@ -84,9 +101,9 @@ module SQLite3
84
101
  # end
85
102
  #
86
103
  # See also #bind_params, #execute.
87
- def execute!( *bind_vars, &block )
104
+ def execute!(*bind_vars, &block)
88
105
  execute(*bind_vars)
89
- block_given? ? each(&block) : to_a
106
+ block ? each(&block) : to_a
90
107
  end
91
108
 
92
109
  # Returns true if the statement is currently active, meaning it has an
@@ -100,7 +117,7 @@ module SQLite3
100
117
  # a (potentially) expensive operation.
101
118
  def columns
102
119
  get_metadata unless @columns
103
- return @columns
120
+ @columns
104
121
  end
105
122
 
106
123
  def each
@@ -128,7 +145,35 @@ module SQLite3
128
145
  end
129
146
  end
130
147
 
148
+ # Returns a Hash containing information about the statement.
149
+ # The contents of the hash are implementation specific and may change in
150
+ # the future without notice. The hash includes information about internal
151
+ # statistics about the statement such as:
152
+ # - +fullscan_steps+: the number of times that SQLite has stepped forward
153
+ # in a table as part of a full table scan
154
+ # - +sorts+: the number of sort operations that have occurred
155
+ # - +autoindexes+: the number of rows inserted into transient indices
156
+ # that were created automatically in order to help joins run faster
157
+ # - +vm_steps+: the number of virtual machine operations executed by the
158
+ # prepared statement
159
+ # - +reprepares+: the number of times that the prepare statement has been
160
+ # automatically regenerated due to schema changes or changes to bound
161
+ # parameters that might affect the query plan
162
+ # - +runs+: the number of times that the prepared statement has been run
163
+ # - +filter_misses+: the number of times that the Bloom filter returned
164
+ # a find, and thus the join step had to be processed as normal
165
+ # - +filter_hits+: the number of times that a join step was bypassed
166
+ # because a Bloom filter returned not-found
167
+ def stat key = nil
168
+ if key
169
+ stat_for(key)
170
+ else
171
+ stats_as_hash
172
+ end
173
+ end
174
+
131
175
  private
176
+
132
177
  # A convenience method for obtaining the metadata about the query. Note
133
178
  # that this will actually execute the SQL, which means it can be a
134
179
  # (potentially) expensive operation.
@@ -138,7 +183,7 @@ module SQLite3
138
183
  end
139
184
  @types = Array.new(column_count) do |column|
140
185
  val = column_decltype(column)
141
- val.nil? ? nil : val.downcase
186
+ val&.downcase
142
187
  end
143
188
  end
144
189
  end
data/lib/sqlite3/value.rb CHANGED
@@ -1,11 +1,10 @@
1
- require 'sqlite3/constants'
1
+ require "sqlite3/constants"
2
2
 
3
3
  module SQLite3
4
-
5
4
  class Value
6
5
  attr_reader :handle
7
6
 
8
- def initialize( db, handle )
7
+ def initialize(db, handle)
9
8
  @driver = db.driver
10
9
  @handle = handle
11
10
  end
@@ -15,43 +14,41 @@ module SQLite3
15
14
  end
16
15
 
17
16
  def to_blob
18
- @driver.value_blob( @handle )
17
+ @driver.value_blob(@handle)
19
18
  end
20
19
 
21
- def length( utf16=false )
20
+ def length(utf16 = false)
22
21
  if utf16
23
- @driver.value_bytes16( @handle )
22
+ @driver.value_bytes16(@handle)
24
23
  else
25
- @driver.value_bytes( @handle )
24
+ @driver.value_bytes(@handle)
26
25
  end
27
26
  end
28
27
 
29
28
  def to_f
30
- @driver.value_double( @handle )
29
+ @driver.value_double(@handle)
31
30
  end
32
31
 
33
32
  def to_i
34
- @driver.value_int( @handle )
33
+ @driver.value_int(@handle)
35
34
  end
36
35
 
37
36
  def to_int64
38
- @driver.value_int64( @handle )
37
+ @driver.value_int64(@handle)
39
38
  end
40
39
 
41
- def to_s( utf16=false )
42
- @driver.value_text( @handle, utf16 )
40
+ def to_s(utf16 = false)
41
+ @driver.value_text(@handle, utf16)
43
42
  end
44
43
 
45
44
  def type
46
- case @driver.value_type( @handle )
47
- when Constants::ColumnType::INTEGER then :int
48
- when Constants::ColumnType::FLOAT then :float
49
- when Constants::ColumnType::TEXT then :text
50
- when Constants::ColumnType::BLOB then :blob
51
- when Constants::ColumnType::NULL then :null
45
+ case @driver.value_type(@handle)
46
+ when Constants::ColumnType::INTEGER then :int
47
+ when Constants::ColumnType::FLOAT then :float
48
+ when Constants::ColumnType::TEXT then :text
49
+ when Constants::ColumnType::BLOB then :blob
50
+ when Constants::ColumnType::NULL then :null
52
51
  end
53
52
  end
54
-
55
53
  end
56
-
57
54
  end
@@ -1,23 +1,3 @@
1
1
  module SQLite3
2
-
3
- VERSION = "1.5.0"
4
-
5
- module VersionProxy
6
- MAJOR = 1
7
- MINOR = 5
8
- TINY = 0
9
- BUILD = nil
10
-
11
- STRING = [ MAJOR, MINOR, TINY, BUILD ].compact.join( "." )
12
-
13
- VERSION = ::SQLite3::VERSION
14
- end
15
-
16
- def self.const_missing(name)
17
- return super unless name == :Version
18
- warn(<<-eowarn) if $VERBOSE
19
- #{caller[0]}: SQLite::Version will be removed in sqlite3-ruby version 2.0.0
20
- eowarn
21
- VersionProxy
22
- end
2
+ VERSION = "2.0.2"
23
3
  end
data/lib/sqlite3.rb CHANGED
@@ -3,13 +3,15 @@ begin
3
3
  RUBY_VERSION =~ /(\d+\.\d+)/
4
4
  require "sqlite3/#{$1}/sqlite3_native"
5
5
  rescue LoadError
6
- require 'sqlite3/sqlite3_native'
6
+ require "sqlite3/sqlite3_native"
7
7
  end
8
8
 
9
- require 'sqlite3/database'
10
- require 'sqlite3/version'
9
+ require "sqlite3/database"
10
+ require "sqlite3/version"
11
11
 
12
12
  module SQLite3
13
13
  # Was sqlite3 compiled with thread safety on?
14
- def self.threadsafe?; threadsafe > 0; end
14
+ def self.threadsafe?
15
+ threadsafe > 0
16
+ end
15
17
  end
metadata CHANGED
@@ -1,16 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqlite3
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamis Buck
8
8
  - Luis Lavena
9
9
  - Aaron Patterson
10
- autorequire:
10
+ - Mike Dalessio
11
+ autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2022-09-08 00:00:00.000000000 Z
14
+ date: 2024-05-23 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: mini_portile2
@@ -26,80 +27,15 @@ dependencies:
26
27
  - - "~>"
27
28
  - !ruby/object:Gem::Version
28
29
  version: 2.8.0
29
- - !ruby/object:Gem::Dependency
30
- name: minitest
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - "~>"
34
- - !ruby/object:Gem::Version
35
- version: '5.15'
36
- type: :development
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - "~>"
41
- - !ruby/object:Gem::Version
42
- version: '5.15'
43
- - !ruby/object:Gem::Dependency
44
- name: rake-compiler
45
- requirement: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - "~>"
48
- - !ruby/object:Gem::Version
49
- version: 1.2.0
50
- type: :development
51
- prerelease: false
52
- version_requirements: !ruby/object:Gem::Requirement
53
- requirements:
54
- - - "~>"
55
- - !ruby/object:Gem::Version
56
- version: 1.2.0
57
- - !ruby/object:Gem::Dependency
58
- name: rake-compiler-dock
59
- requirement: !ruby/object:Gem::Requirement
60
- requirements:
61
- - - "~>"
62
- - !ruby/object:Gem::Version
63
- version: 1.2.1
64
- type: :development
65
- prerelease: false
66
- version_requirements: !ruby/object:Gem::Requirement
67
- requirements:
68
- - - "~>"
69
- - !ruby/object:Gem::Version
70
- version: 1.2.1
71
- - !ruby/object:Gem::Dependency
72
- name: rdoc
73
- requirement: !ruby/object:Gem::Requirement
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- version: '4.0'
78
- - - "<"
79
- - !ruby/object:Gem::Version
80
- version: '7'
81
- type: :development
82
- prerelease: false
83
- version_requirements: !ruby/object:Gem::Requirement
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- version: '4.0'
88
- - - "<"
89
- - !ruby/object:Gem::Version
90
- version: '7'
91
- description: |-
92
- This module allows Ruby programs to interface with the SQLite3
93
- database engine (http://www.sqlite.org). You must have the
94
- SQLite engine installed in order to build this module.
95
-
96
- Note that this module is only compatible with SQLite 3.6.16 or newer.
97
- email:
30
+ force_ruby_platform: false
31
+ description: |
32
+ Ruby library to interface with the SQLite3 database engine (http://www.sqlite.org). Precompiled
33
+ binaries are available for common platforms for recent versions of Ruby.
34
+ email:
98
35
  executables: []
99
36
  extensions:
100
37
  - ext/sqlite3/extconf.rb
101
38
  extra_rdoc_files:
102
- - API_CHANGES.md
103
39
  - CHANGELOG.md
104
40
  - README.md
105
41
  - ext/sqlite3/aggregator.c
@@ -110,14 +46,13 @@ extra_rdoc_files:
110
46
  - ext/sqlite3/statement.c
111
47
  files:
112
48
  - ".gemtest"
113
- - API_CHANGES.md
114
49
  - CHANGELOG.md
115
50
  - CONTRIBUTING.md
116
- - ChangeLog.cvs
117
- - Gemfile
51
+ - FAQ.md
52
+ - INSTALLATION.md
118
53
  - LICENSE
119
- - LICENSE-DEPENDENCIES
120
54
  - README.md
55
+ - dependencies.yml
121
56
  - ext/sqlite3/aggregator.c
122
57
  - ext/sqlite3/aggregator.h
123
58
  - ext/sqlite3/backup.c
@@ -131,9 +66,7 @@ files:
131
66
  - ext/sqlite3/sqlite3_ruby.h
132
67
  - ext/sqlite3/statement.c
133
68
  - ext/sqlite3/statement.h
134
- - faq/faq.md
135
- - faq/faq.rb
136
- - faq/faq.yml
69
+ - ext/sqlite3/timespec.h
137
70
  - lib/sqlite3.rb
138
71
  - lib/sqlite3/constants.rb
139
72
  - lib/sqlite3/database.rb
@@ -141,29 +74,9 @@ files:
141
74
  - lib/sqlite3/pragmas.rb
142
75
  - lib/sqlite3/resultset.rb
143
76
  - lib/sqlite3/statement.rb
144
- - lib/sqlite3/translator.rb
145
77
  - lib/sqlite3/value.rb
146
78
  - lib/sqlite3/version.rb
147
- - ports/archives/sqlite-autoconf-3380500.tar.gz
148
- - test/helper.rb
149
- - test/test_backup.rb
150
- - test/test_collation.rb
151
- - test/test_database.rb
152
- - test/test_database_flags.rb
153
- - test/test_database_readonly.rb
154
- - test/test_database_readwrite.rb
155
- - test/test_deprecated.rb
156
- - test/test_encoding.rb
157
- - test/test_integration.rb
158
- - test/test_integration_aggregate.rb
159
- - test/test_integration_open_close.rb
160
- - test/test_integration_pending.rb
161
- - test/test_integration_resultset.rb
162
- - test/test_integration_statement.rb
163
- - test/test_result_set.rb
164
- - test/test_sqlite3.rb
165
- - test/test_statement.rb
166
- - test/test_statement_execute.rb
79
+ - ports/archives/sqlite-autoconf-3460000.tar.gz
167
80
  homepage: https://github.com/sparklemotion/sqlite3-ruby
168
81
  licenses:
169
82
  - BSD-3-Clause
@@ -175,7 +88,7 @@ metadata:
175
88
  source_code_uri: https://github.com/sparklemotion/sqlite3-ruby
176
89
  msys2_mingw_dependencies: sqlite3
177
90
  rubygems_mfa_required: 'true'
178
- post_install_message:
91
+ post_install_message:
179
92
  rdoc_options:
180
93
  - "--main"
181
94
  - README.md
@@ -185,16 +98,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
185
98
  requirements:
186
99
  - - ">="
187
100
  - !ruby/object:Gem::Version
188
- version: 1.9.2
101
+ version: '3.0'
189
102
  required_rubygems_version: !ruby/object:Gem::Requirement
190
103
  requirements:
191
104
  - - ">="
192
105
  - !ruby/object:Gem::Version
193
106
  version: '0'
194
107
  requirements: []
195
- rubygems_version: 3.3.7
196
- signing_key:
108
+ rubygems_version: 3.5.10
109
+ signing_key:
197
110
  specification_version: 4
198
- summary: This module allows Ruby programs to interface with the SQLite3 database engine
199
- (http://www.sqlite.org)
111
+ summary: Ruby library to interface with the SQLite3 database engine (http://www.sqlite.org).
200
112
  test_files: []
data/API_CHANGES.md DELETED
@@ -1,49 +0,0 @@
1
- # API Changes
2
-
3
- * SQLite3::Database#execute only accepts an array for bind parameters.
4
-
5
- * SQLite3::ResultSet used to query the database for the first row, regardless
6
- of whether the user asked for it or not. I have removed that so that rows
7
- will not be returned until the user asks for them. This is a subtle but
8
- sometimes important change in behavior.
9
-
10
- 83882d2208ed189361617d5ab8532a325aaf729d
11
-
12
- * SQLite3::Database#trace now takes either a block or an object that responds
13
- to "call". The previous implementation passed around a VALUE that was cast
14
- to a void *. This is dangerous because the value could get garbage collected
15
- before the proc was called. If the user wants data passed around with the
16
- block, they should use variables available to the closure or create an
17
- object.
18
-
19
- * SQLite3::Statement#step automatically converts to ruby types, where before
20
- all values were automatically yielded as strings. This will only be a
21
- problem for people who were accessing information about the database that
22
- wasn't previously passed through the pure ruby conversion code.
23
-
24
- * SQLite3::Database#errmsg no longer takes a parameter to return error
25
- messages as UTF-16. Do people even use that? I opt for staying UTF-8 when
26
- possible. See test_integration.rb test_errmsg_utf16
27
-
28
- * SQLite3::Database#authorize same changes as trace
29
-
30
- * test/test_tc_database.rb was removed because we no longer use the Driver
31
- design pattern.
32
-
33
- # Garbage Collection Strategy
34
-
35
- All statements keep pointers back to their respective database connections.
36
- The @connection instance variable on the Statement handle keeps the database
37
- connection alive. Memory allocated for a statement handler will be freed in
38
- two cases:
39
-
40
- * close is called on the statement
41
- * The SQLite3::Database object gets garbage collected
42
-
43
- We can't free the memory for the statement in the garbage collection function
44
- for the statement handler. The reason is because there exists a race
45
- condition. We cannot guarantee the order in which objects will be garbage
46
- collected. So, it is possible that a connection and a statement are up for
47
- garbage collection. If the database connection were to be free'd before the
48
- statement, then boom. Instead we'll be conservative and free unclosed
49
- statements when the connection is terminated.