sqlite3 2.3.1-arm64-darwin → 2.4.0-arm64-darwin

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: d9eb528872e144563b0bb7f5ba39010e4f6ae0fef233d821e4c420342ae795e5
4
- data.tar.gz: 98515b581869745f6e4f8ff4892c0287a89321a1574dedd04870f044e50e625b
3
+ metadata.gz: 7baa8a3d7d884c8202449cb12e19c8fe48a1f10b8150a14e49876c1eb3d0d723
4
+ data.tar.gz: c20b0f7a43bf527b409e9dd9c2d3669ad1c1f9c95cc4b0b5cf29e5b8fd95c13f
5
5
  SHA512:
6
- metadata.gz: 364f8cbdfcd7477b6efd93c6e1d146637cb078879261a11d7201f9c1f496c35aec02d5881d4dc3d6fe1af52016ac8f6208205b07d2dd917ccb36d6173baaacb0
7
- data.tar.gz: dc224afa72f940efde777aebbf06c0644ec14187bf1d2bd2dc6522720867b4a88b4e44fefdbc5d84a9b55e14395b0d7c620d12024634a5a60adcbb0c3441694f
6
+ metadata.gz: e8d5cdfb7a02897ceff14799cb81c46ce8b55c86a4a02226426cf1bae49c500d906f2fc42719ec1409d5d771057d436fbc8088158df54d62a90007ff4a6febe1
7
+ data.tar.gz: 0efecb17342890831c6e371ed3f162f923dc4081d3fe3d784d3e0396c3ec1b063daa7e9fcca45da593df14b1b705466740f81702b065ba5ff8bd1d6f98fb4cbb
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # sqlite3-ruby Changelog
2
2
 
3
+ ## 2.4.0 / 2024-12-03
4
+
5
+ ### Added
6
+
7
+ - `Database#load_extension` now accepts any object that responds to `#to_path`, in addition to String filesystem paths. [#586] @flavorjones
8
+ - `Database.new` now accepts an `extensions:` parameter, which is an array of SQLite extensions that will be loaded during initialization. The array may contain String filesystem paths and objects that respond to `#to_path`. [#586] @flavorjones
9
+
10
+
3
11
  ## 2.3.1 / 2024-11-25
4
12
 
5
13
  ### Dependencies
@@ -771,14 +771,8 @@ collation(VALUE self, VALUE name, VALUE comparator)
771
771
  }
772
772
 
773
773
  #ifdef HAVE_SQLITE3_LOAD_EXTENSION
774
- /* call-seq: db.load_extension(file)
775
- *
776
- * Loads an SQLite extension library from the named file. Extension
777
- * loading must be enabled using db.enable_load_extension(true) prior
778
- * to calling this API.
779
- */
780
774
  static VALUE
781
- load_extension(VALUE self, VALUE file)
775
+ load_extension_internal(VALUE self, VALUE file)
782
776
  {
783
777
  sqlite3RubyPtr ctx;
784
778
  int status;
@@ -997,7 +991,7 @@ init_sqlite3_database(void)
997
991
  rb_define_private_method(cSqlite3Database, "db_filename", db_filename, 1);
998
992
 
999
993
  #ifdef HAVE_SQLITE3_LOAD_EXTENSION
1000
- rb_define_method(cSqlite3Database, "load_extension", load_extension, 1);
994
+ rb_define_private_method(cSqlite3Database, "load_extension_internal", load_extension_internal, 1);
1001
995
  #endif
1002
996
 
1003
997
  #ifdef HAVE_SQLITE3_ENABLE_LOAD_EXTENSION
Binary file
Binary file
Binary file
@@ -8,8 +8,10 @@ require "sqlite3/value"
8
8
  require "sqlite3/fork_safety"
9
9
 
10
10
  module SQLite3
11
- # The Database class encapsulates a single connection to a SQLite3 database.
12
- # Its usage is very straightforward:
11
+ # == Overview
12
+ #
13
+ # The Database class encapsulates a single connection to a SQLite3 database. Here's a
14
+ # straightforward example of usage:
13
15
  #
14
16
  # require 'sqlite3'
15
17
  #
@@ -19,28 +21,59 @@ module SQLite3
19
21
  # end
20
22
  # end
21
23
  #
22
- # It wraps the lower-level methods provided by the selected driver, and
23
- # includes the Pragmas module for access to various pragma convenience
24
- # methods.
24
+ # It wraps the lower-level methods provided by the selected driver, and includes the Pragmas
25
+ # module for access to various pragma convenience methods.
25
26
  #
26
- # The Database class provides type translation services as well, by which
27
- # the SQLite3 data types (which are all represented as strings) may be
28
- # converted into their corresponding types (as defined in the schemas
29
- # for their tables). This translation only occurs when querying data from
27
+ # The Database class provides type translation services as well, by which the SQLite3 data types
28
+ # (which are all represented as strings) may be converted into their corresponding types (as
29
+ # defined in the schemas for their tables). This translation only occurs when querying data from
30
30
  # the database--insertions and updates are all still typeless.
31
31
  #
32
- # Furthermore, the Database class has been designed to work well with the
33
- # ArrayFields module from Ara Howard. If you require the ArrayFields
34
- # module before performing a query, and if you have not enabled results as
35
- # hashes, then the results will all be indexible by field name.
32
+ # Furthermore, the Database class has been designed to work well with the ArrayFields module from
33
+ # Ara Howard. If you require the ArrayFields module before performing a query, and if you have not
34
+ # enabled results as hashes, then the results will all be indexible by field name.
35
+ #
36
+ # == Thread safety
37
+ #
38
+ # When SQLite3.threadsafe? returns true, it is safe to share instances of the database class
39
+ # among threads without adding specific locking. Other object instances may require applications
40
+ # to provide their own locks if they are to be shared among threads. Please see the README.md for
41
+ # more information.
42
+ #
43
+ # == SQLite Extensions
44
+ #
45
+ # SQLite3::Database supports the universe of {sqlite
46
+ # extensions}[https://www.sqlite.org/loadext.html]. It's possible to load an extension into an
47
+ # existing Database object using the #load_extension method and passing a filesystem path:
48
+ #
49
+ # db = SQLite3::Database.new(":memory:")
50
+ # db.enable_load_extension(true)
51
+ # db.load_extension("/path/to/extension")
52
+ #
53
+ # As of v2.4.0, it's also possible to pass an object that responds to +#to_path+. This
54
+ # documentation will refer to the supported interface as +_ExtensionSpecifier+, which can be
55
+ # expressed in RBS syntax as:
56
+ #
57
+ # interface _ExtensionSpecifier
58
+ # def to_path: () → String
59
+ # end
36
60
  #
37
- # Thread safety:
61
+ # So, for example, if you are using the {sqlean gem}[https://github.com/flavorjones/sqlean-ruby]
62
+ # which provides modules that implement this interface, you can pass the module directly:
63
+ #
64
+ # db = SQLite3::Database.new(":memory:")
65
+ # db.enable_load_extension(true)
66
+ # db.load_extension(SQLean::Crypto)
67
+ #
68
+ # It's also possible in v2.4.0+ to load extensions via the SQLite3::Database constructor by using
69
+ # the +extensions:+ keyword argument to pass an array of String paths or extension specifiers:
70
+ #
71
+ # db = SQLite3::Database.new(":memory:", extensions: ["/path/to/extension", SQLean::Crypto])
72
+ #
73
+ # Note that when loading extensions via the constructor, there is no need to call
74
+ # #enable_load_extension; however it is still necessary to call #enable_load_extensions before any
75
+ # subsequently invocations of #load_extension on the initialized Database object.
38
76
  #
39
- # When `SQLite3.threadsafe?` returns true, it is safe to share instances of
40
- # the database class among threads without adding specific locking. Other
41
- # object instances may require applications to provide their own locks if
42
- # they are to be shared among threads. Please see the README.md for more
43
- # information.
44
77
  class Database
45
78
  attr_reader :collations
46
79
 
@@ -76,23 +109,25 @@ module SQLite3
76
109
  # as hashes or not. By default, rows are returned as arrays.
77
110
  attr_accessor :results_as_hash
78
111
 
79
- # call-seq: SQLite3::Database.new(file, options = {})
112
+ # call-seq:
113
+ # SQLite3::Database.new(file, options = {})
80
114
  #
81
115
  # Create a new Database object that opens the given file.
82
116
  #
83
117
  # Supported permissions +options+:
84
118
  # - the default mode is <tt>READWRITE | CREATE</tt>
85
- # - +:readonly+: boolean (default false), true to set the mode to +READONLY+
86
- # - +:readwrite+: boolean (default false), true to set the mode to +READWRITE+
87
- # - +:flags+: set the mode to a combination of SQLite3::Constants::Open flags.
119
+ # - +readonly:+ boolean (default false), true to set the mode to +READONLY+
120
+ # - +readwrite:+ boolean (default false), true to set the mode to +READWRITE+
121
+ # - +flags:+ set the mode to a combination of SQLite3::Constants::Open flags.
88
122
  #
89
123
  # Supported encoding +options+:
90
- # - +:utf16+: boolean (default false), is the filename's encoding UTF-16 (only needed if the filename encoding is not UTF_16LE or BE)
124
+ # - +utf16:+ +boolish+ (default false), is the filename's encoding UTF-16 (only needed if the filename encoding is not UTF_16LE or BE)
91
125
  #
92
126
  # Other supported +options+:
93
- # - +:strict+: boolean (default false), disallow the use of double-quoted string literals (see https://www.sqlite.org/quirks.html#double_quoted_string_literals_are_accepted)
94
- # - +:results_as_hash+: boolean (default false), return rows as hashes instead of arrays
95
- # - +:default_transaction_mode+: one of +:deferred+ (default), +:immediate+, or +:exclusive+. If a mode is not specified in a call to #transaction, this will be the default transaction mode.
127
+ # - +strict:+ +boolish+ (default false), disallow the use of double-quoted string literals (see https://www.sqlite.org/quirks.html#double_quoted_string_literals_are_accepted)
128
+ # - +results_as_hash:+ +boolish+ (default false), return rows as hashes instead of arrays
129
+ # - +default_transaction_mode:+ one of +:deferred+ (default), +:immediate+, or +:exclusive+. If a mode is not specified in a call to #transaction, this will be the default transaction mode.
130
+ # - +extensions:+ <tt>Array[String | _ExtensionSpecifier]</tt> SQLite extensions to load into the database. See Database@SQLite+Extensions for more information.
96
131
  #
97
132
  def initialize file, options = {}, zvfs = nil
98
133
  mode = Constants::Open::READWRITE | Constants::Open::CREATE
@@ -135,6 +170,8 @@ module SQLite3
135
170
  @readonly = mode & Constants::Open::READONLY != 0
136
171
  @default_transaction_mode = options[:default_transaction_mode] || :deferred
137
172
 
173
+ initialize_extensions(options[:extensions])
174
+
138
175
  ForkSafety.track(self)
139
176
 
140
177
  if block_given?
@@ -658,6 +695,52 @@ module SQLite3
658
695
  end
659
696
  end
660
697
 
698
+ # call-seq:
699
+ # load_extension(extension_specifier) -> self
700
+ #
701
+ # Loads an SQLite extension library from the named file. Extension loading must be enabled using
702
+ # #enable_load_extension prior to using this method.
703
+ #
704
+ # See also: Database@SQLite+Extensions
705
+ #
706
+ # [Parameters]
707
+ # - +extension_specifier+: (String | +_ExtensionSpecifier+) If a String, it is the filesystem path
708
+ # to the sqlite extension file. If an object that responds to #to_path, the
709
+ # return value of that method is used as the filesystem path to the sqlite extension file.
710
+ #
711
+ # [Example] Using a filesystem path:
712
+ #
713
+ # db.load_extension("/path/to/my_extension.so")
714
+ #
715
+ # [Example] Using the {sqlean gem}[https://github.com/flavorjones/sqlean-ruby]:
716
+ #
717
+ # db.load_extension(SQLean::VSV)
718
+ #
719
+ def load_extension(extension_specifier)
720
+ if extension_specifier.respond_to?(:to_path)
721
+ extension_specifier = extension_specifier.to_path
722
+ elsif !extension_specifier.is_a?(String)
723
+ raise TypeError, "extension_specifier #{extension_specifier.inspect} is not a String or a valid extension specifier object"
724
+ end
725
+ load_extension_internal(extension_specifier)
726
+ end
727
+
728
+ def initialize_extensions(extensions) # :nodoc:
729
+ return if extensions.nil?
730
+ raise TypeError, "extensions must be an Array" unless extensions.is_a?(Array)
731
+ return if extensions.empty?
732
+
733
+ begin
734
+ enable_load_extension(true)
735
+
736
+ extensions.each do |extension|
737
+ load_extension(extension)
738
+ end
739
+ ensure
740
+ enable_load_extension(false)
741
+ end
742
+ end
743
+
661
744
  # A helper class for dealing with custom functions (see #create_function,
662
745
  # #create_aggregate, and #create_aggregate_handler). It encapsulates the
663
746
  # opaque function object that represents the current invocation. It also
@@ -1,4 +1,4 @@
1
1
  module SQLite3
2
2
  # (String) the version of the sqlite3 gem, e.g. "2.1.1"
3
- VERSION = "2.3.1"
3
+ VERSION = "2.4.0"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqlite3
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 2.4.0
5
5
  platform: arm64-darwin
6
6
  authors:
7
7
  - Jamis Buck
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2024-11-25 00:00:00.000000000 Z
14
+ date: 2024-12-03 00:00:00.000000000 Z
15
15
  dependencies: []
16
16
  description: |
17
17
  Ruby library to interface with the SQLite3 database engine (http://www.sqlite.org). Precompiled