sqlite3 2.3.1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 44f18cd0e1a516835e098651813a16650ee150cbca072d7b79cf01985a46cb17
4
- data.tar.gz: 354f8cc6b3fdbc3fdcb94b7f5c059af5a546c7b27e97a37ba83054eca96845c0
3
+ metadata.gz: d7072ef601e918956fb58ac179ce3f2a0c15c902f351a4c481aa96de1d914737
4
+ data.tar.gz: ef4ebff5ce7115c648328b15d4fef3815ef87d758a88f75efa312bd02f2a0985
5
5
  SHA512:
6
- metadata.gz: 45ac5eeb5c17f32b36e3e28ad07ed322466ead714a246e3a26714e7439c564b09ba22907b12b85d2b8fe1f5a40b4e064fb5e1d47f86b02477eb6cb14c16507f1
7
- data.tar.gz: ff61bacb08bd6ef512fa160aabd0f0b47be0c3889801c17ec0c86764dc271e4b112e6ced95f9b504cf225247f885afddec1d6f3ea433323e00366fd9ce254a45
6
+ metadata.gz: ee54dbf7fa2f6c323e7d98203f2e60ea41b1369ba758a0e58334d75e867b232e77fdedd3e9348d35a53716f996c1ce3cabe6dd776d468ab971ee24ee94f30714
7
+ data.tar.gz: 98389cc2e59650e1963ee24bdaaf5d13f1bfb10da4b333a2dbba4beb55f219ffbe65fa512086f206b9ed29471f5ab1e646c5e4e34dc9882aff682378d73274ed
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
@@ -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: ruby
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
  - !ruby/object:Gem::Dependency
17
17
  name: mini_portile2