sqlite3 2.0.0-aarch64-linux-musl
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 +7 -0
- data/.gemtest +0 -0
- data/CHANGELOG.md +800 -0
- data/CONTRIBUTING.md +56 -0
- data/FAQ.md +388 -0
- data/INSTALLATION.md +267 -0
- data/LICENSE +23 -0
- data/README.md +181 -0
- data/dependencies.yml +13 -0
- data/ext/sqlite3/aggregator.c +270 -0
- data/ext/sqlite3/aggregator.h +10 -0
- data/ext/sqlite3/backup.c +190 -0
- data/ext/sqlite3/backup.h +15 -0
- data/ext/sqlite3/database.c +931 -0
- data/ext/sqlite3/database.h +22 -0
- data/ext/sqlite3/exception.c +117 -0
- data/ext/sqlite3/exception.h +10 -0
- data/ext/sqlite3/extconf.rb +284 -0
- data/ext/sqlite3/sqlite3.c +208 -0
- data/ext/sqlite3/sqlite3_ruby.h +48 -0
- data/ext/sqlite3/statement.c +667 -0
- data/ext/sqlite3/statement.h +16 -0
- data/ext/sqlite3/timespec.h +20 -0
- data/lib/sqlite3/3.0/sqlite3_native.so +0 -0
- data/lib/sqlite3/3.1/sqlite3_native.so +0 -0
- data/lib/sqlite3/3.2/sqlite3_native.so +0 -0
- data/lib/sqlite3/3.3/sqlite3_native.so +0 -0
- data/lib/sqlite3/constants.rb +174 -0
- data/lib/sqlite3/database.rb +701 -0
- data/lib/sqlite3/errors.rb +60 -0
- data/lib/sqlite3/pragmas.rb +585 -0
- data/lib/sqlite3/resultset.rb +96 -0
- data/lib/sqlite3/statement.rb +190 -0
- data/lib/sqlite3/value.rb +54 -0
- data/lib/sqlite3/version.rb +3 -0
- data/lib/sqlite3.rb +17 -0
- metadata +101 -0
@@ -0,0 +1,96 @@
|
|
1
|
+
require "sqlite3/constants"
|
2
|
+
require "sqlite3/errors"
|
3
|
+
|
4
|
+
module SQLite3
|
5
|
+
# The ResultSet object encapsulates the enumerability of a query's output.
|
6
|
+
# It is a simple cursor over the data that the query returns. It will
|
7
|
+
# very rarely (if ever) be instantiated directly. Instead, clients should
|
8
|
+
# obtain a ResultSet instance via Statement#execute.
|
9
|
+
class ResultSet
|
10
|
+
include Enumerable
|
11
|
+
|
12
|
+
# Create a new ResultSet attached to the given database, using the
|
13
|
+
# given sql text.
|
14
|
+
def initialize db, stmt
|
15
|
+
@db = db
|
16
|
+
@stmt = stmt
|
17
|
+
end
|
18
|
+
|
19
|
+
# Reset the cursor, so that a result set which has reached end-of-file
|
20
|
+
# can be rewound and reiterated.
|
21
|
+
def reset(*bind_params)
|
22
|
+
@stmt.reset!
|
23
|
+
@stmt.bind_params(*bind_params)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Query whether the cursor has reached the end of the result set or not.
|
27
|
+
def eof?
|
28
|
+
@stmt.done?
|
29
|
+
end
|
30
|
+
|
31
|
+
# Obtain the next row from the cursor. If there are no more rows to be
|
32
|
+
# had, this will return +nil+.
|
33
|
+
#
|
34
|
+
# The returned value will be an array, unless Database#results_as_hash has
|
35
|
+
# been set to +true+, in which case the returned value will be a hash.
|
36
|
+
#
|
37
|
+
# For arrays, the column names are accessible via the +fields+ property,
|
38
|
+
# and the column types are accessible via the +types+ property.
|
39
|
+
#
|
40
|
+
# For hashes, the column names are the keys of the hash, and the column
|
41
|
+
# types are accessible via the +types+ property.
|
42
|
+
def next
|
43
|
+
@stmt.step
|
44
|
+
end
|
45
|
+
|
46
|
+
# Required by the Enumerable mixin. Provides an internal iterator over the
|
47
|
+
# rows of the result set.
|
48
|
+
def each
|
49
|
+
while (node = self.next)
|
50
|
+
yield node
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Provides an internal iterator over the rows of the result set where
|
55
|
+
# each row is yielded as a hash.
|
56
|
+
def each_hash
|
57
|
+
while (node = next_hash)
|
58
|
+
yield node
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Closes the statement that spawned this result set.
|
63
|
+
# <em>Use with caution!</em> Closing a result set will automatically
|
64
|
+
# close any other result sets that were spawned from the same statement.
|
65
|
+
def close
|
66
|
+
@stmt.close
|
67
|
+
end
|
68
|
+
|
69
|
+
# Queries whether the underlying statement has been closed or not.
|
70
|
+
def closed?
|
71
|
+
@stmt.closed?
|
72
|
+
end
|
73
|
+
|
74
|
+
# Returns the types of the columns returned by this result set.
|
75
|
+
def types
|
76
|
+
@stmt.types
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns the names of the columns returned by this result set.
|
80
|
+
def columns
|
81
|
+
@stmt.columns
|
82
|
+
end
|
83
|
+
|
84
|
+
# Return the next row as a hash
|
85
|
+
def next_hash
|
86
|
+
row = @stmt.step
|
87
|
+
return nil if @stmt.done?
|
88
|
+
|
89
|
+
@stmt.columns.zip(row).to_h
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class HashResultSet < ResultSet # :nodoc:
|
94
|
+
alias_method :next, :next_hash
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
require "sqlite3/errors"
|
2
|
+
require "sqlite3/resultset"
|
3
|
+
|
4
|
+
class String
|
5
|
+
def to_blob
|
6
|
+
SQLite3::Blob.new(self)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module SQLite3
|
11
|
+
# A statement represents a prepared-but-unexecuted SQL query. It will rarely
|
12
|
+
# (if ever) be instantiated directly by a client, and is most often obtained
|
13
|
+
# via the Database#prepare method.
|
14
|
+
class Statement
|
15
|
+
include Enumerable
|
16
|
+
|
17
|
+
# This is any text that followed the first valid SQL statement in the text
|
18
|
+
# with which the statement was initialized. If there was no trailing text,
|
19
|
+
# this will be the empty string.
|
20
|
+
attr_reader :remainder
|
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
|
+
|
39
|
+
# Binds the given variables to the corresponding placeholders in the SQL
|
40
|
+
# text.
|
41
|
+
#
|
42
|
+
# See Database#execute for a description of the valid placeholder
|
43
|
+
# syntaxes.
|
44
|
+
#
|
45
|
+
# Example:
|
46
|
+
#
|
47
|
+
# stmt = db.prepare( "select * from table where a=? and b=?" )
|
48
|
+
# stmt.bind_params( 15, "hello" )
|
49
|
+
#
|
50
|
+
# See also #execute, #bind_param, Statement#bind_param, and
|
51
|
+
# Statement#bind_params.
|
52
|
+
def bind_params(*bind_vars)
|
53
|
+
index = 1
|
54
|
+
bind_vars.flatten.each do |var|
|
55
|
+
if Hash === var
|
56
|
+
var.each { |key, val| bind_param key, val }
|
57
|
+
else
|
58
|
+
bind_param index, var
|
59
|
+
index += 1
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Execute the statement. This creates a new ResultSet object for the
|
65
|
+
# statement's virtual machine. If a block was given, the new ResultSet will
|
66
|
+
# be yielded to it; otherwise, the ResultSet will be returned.
|
67
|
+
#
|
68
|
+
# Any parameters will be bound to the statement using #bind_params.
|
69
|
+
#
|
70
|
+
# Example:
|
71
|
+
#
|
72
|
+
# stmt = db.prepare( "select * from table" )
|
73
|
+
# stmt.execute do |result|
|
74
|
+
# ...
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# See also #bind_params, #execute!.
|
78
|
+
def execute(*bind_vars)
|
79
|
+
reset! if active? || done?
|
80
|
+
|
81
|
+
bind_params(*bind_vars) unless bind_vars.empty?
|
82
|
+
results = @connection.build_result_set self
|
83
|
+
|
84
|
+
step if column_count == 0
|
85
|
+
|
86
|
+
yield results if block_given?
|
87
|
+
results
|
88
|
+
end
|
89
|
+
|
90
|
+
# Execute the statement. If no block was given, this returns an array of
|
91
|
+
# rows returned by executing the statement. Otherwise, each row will be
|
92
|
+
# yielded to the block.
|
93
|
+
#
|
94
|
+
# Any parameters will be bound to the statement using #bind_params.
|
95
|
+
#
|
96
|
+
# Example:
|
97
|
+
#
|
98
|
+
# stmt = db.prepare( "select * from table" )
|
99
|
+
# stmt.execute! do |row|
|
100
|
+
# ...
|
101
|
+
# end
|
102
|
+
#
|
103
|
+
# See also #bind_params, #execute.
|
104
|
+
def execute!(*bind_vars, &block)
|
105
|
+
execute(*bind_vars)
|
106
|
+
block ? each(&block) : to_a
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns true if the statement is currently active, meaning it has an
|
110
|
+
# open result set.
|
111
|
+
def active?
|
112
|
+
!done?
|
113
|
+
end
|
114
|
+
|
115
|
+
# Return an array of the column names for this statement. Note that this
|
116
|
+
# may execute the statement in order to obtain the metadata; this makes it
|
117
|
+
# a (potentially) expensive operation.
|
118
|
+
def columns
|
119
|
+
get_metadata unless @columns
|
120
|
+
@columns
|
121
|
+
end
|
122
|
+
|
123
|
+
def each
|
124
|
+
loop do
|
125
|
+
val = step
|
126
|
+
break self if done?
|
127
|
+
yield val
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
# Return an array of the data types for each column in this statement. Note
|
132
|
+
# that this may execute the statement in order to obtain the metadata; this
|
133
|
+
# makes it a (potentially) expensive operation.
|
134
|
+
def types
|
135
|
+
must_be_open!
|
136
|
+
get_metadata unless @types
|
137
|
+
@types
|
138
|
+
end
|
139
|
+
|
140
|
+
# Performs a sanity check to ensure that the statement is not
|
141
|
+
# closed. If it is, an exception is raised.
|
142
|
+
def must_be_open! # :nodoc:
|
143
|
+
if closed?
|
144
|
+
raise SQLite3::Exception, "cannot use a closed statement"
|
145
|
+
end
|
146
|
+
end
|
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
|
+
|
175
|
+
private
|
176
|
+
|
177
|
+
# A convenience method for obtaining the metadata about the query. Note
|
178
|
+
# that this will actually execute the SQL, which means it can be a
|
179
|
+
# (potentially) expensive operation.
|
180
|
+
def get_metadata
|
181
|
+
@columns = Array.new(column_count) do |column|
|
182
|
+
column_name column
|
183
|
+
end
|
184
|
+
@types = Array.new(column_count) do |column|
|
185
|
+
val = column_decltype(column)
|
186
|
+
val&.downcase
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "sqlite3/constants"
|
2
|
+
|
3
|
+
module SQLite3
|
4
|
+
class Value
|
5
|
+
attr_reader :handle
|
6
|
+
|
7
|
+
def initialize(db, handle)
|
8
|
+
@driver = db.driver
|
9
|
+
@handle = handle
|
10
|
+
end
|
11
|
+
|
12
|
+
def null?
|
13
|
+
type == :null
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_blob
|
17
|
+
@driver.value_blob(@handle)
|
18
|
+
end
|
19
|
+
|
20
|
+
def length(utf16 = false)
|
21
|
+
if utf16
|
22
|
+
@driver.value_bytes16(@handle)
|
23
|
+
else
|
24
|
+
@driver.value_bytes(@handle)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_f
|
29
|
+
@driver.value_double(@handle)
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_i
|
33
|
+
@driver.value_int(@handle)
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_int64
|
37
|
+
@driver.value_int64(@handle)
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s(utf16 = false)
|
41
|
+
@driver.value_text(@handle, utf16)
|
42
|
+
end
|
43
|
+
|
44
|
+
def type
|
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
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/sqlite3.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# support multiple ruby version (fat binaries under windows)
|
2
|
+
begin
|
3
|
+
RUBY_VERSION =~ /(\d+\.\d+)/
|
4
|
+
require "sqlite3/#{$1}/sqlite3_native"
|
5
|
+
rescue LoadError
|
6
|
+
require "sqlite3/sqlite3_native"
|
7
|
+
end
|
8
|
+
|
9
|
+
require "sqlite3/database"
|
10
|
+
require "sqlite3/version"
|
11
|
+
|
12
|
+
module SQLite3
|
13
|
+
# Was sqlite3 compiled with thread safety on?
|
14
|
+
def self.threadsafe?
|
15
|
+
threadsafe > 0
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sqlite3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
|
+
platform: aarch64-linux-musl
|
6
|
+
authors:
|
7
|
+
- Jamis Buck
|
8
|
+
- Luis Lavena
|
9
|
+
- Aaron Patterson
|
10
|
+
- Mike Dalessio
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2024-04-17 00:00:00.000000000 Z
|
15
|
+
dependencies: []
|
16
|
+
description: |
|
17
|
+
Ruby library to interface with the SQLite3 database engine (http://www.sqlite.org). Precompiled
|
18
|
+
binaries are available for common platforms for recent versions of Ruby.
|
19
|
+
email:
|
20
|
+
executables: []
|
21
|
+
extensions: []
|
22
|
+
extra_rdoc_files:
|
23
|
+
- CHANGELOG.md
|
24
|
+
- README.md
|
25
|
+
- ext/sqlite3/aggregator.c
|
26
|
+
- ext/sqlite3/backup.c
|
27
|
+
- ext/sqlite3/database.c
|
28
|
+
- ext/sqlite3/exception.c
|
29
|
+
- ext/sqlite3/sqlite3.c
|
30
|
+
- ext/sqlite3/statement.c
|
31
|
+
files:
|
32
|
+
- ".gemtest"
|
33
|
+
- CHANGELOG.md
|
34
|
+
- CONTRIBUTING.md
|
35
|
+
- FAQ.md
|
36
|
+
- INSTALLATION.md
|
37
|
+
- LICENSE
|
38
|
+
- README.md
|
39
|
+
- dependencies.yml
|
40
|
+
- ext/sqlite3/aggregator.c
|
41
|
+
- ext/sqlite3/aggregator.h
|
42
|
+
- ext/sqlite3/backup.c
|
43
|
+
- ext/sqlite3/backup.h
|
44
|
+
- ext/sqlite3/database.c
|
45
|
+
- ext/sqlite3/database.h
|
46
|
+
- ext/sqlite3/exception.c
|
47
|
+
- ext/sqlite3/exception.h
|
48
|
+
- ext/sqlite3/extconf.rb
|
49
|
+
- ext/sqlite3/sqlite3.c
|
50
|
+
- ext/sqlite3/sqlite3_ruby.h
|
51
|
+
- ext/sqlite3/statement.c
|
52
|
+
- ext/sqlite3/statement.h
|
53
|
+
- ext/sqlite3/timespec.h
|
54
|
+
- lib/sqlite3.rb
|
55
|
+
- lib/sqlite3/3.0/sqlite3_native.so
|
56
|
+
- lib/sqlite3/3.1/sqlite3_native.so
|
57
|
+
- lib/sqlite3/3.2/sqlite3_native.so
|
58
|
+
- lib/sqlite3/3.3/sqlite3_native.so
|
59
|
+
- lib/sqlite3/constants.rb
|
60
|
+
- lib/sqlite3/database.rb
|
61
|
+
- lib/sqlite3/errors.rb
|
62
|
+
- lib/sqlite3/pragmas.rb
|
63
|
+
- lib/sqlite3/resultset.rb
|
64
|
+
- lib/sqlite3/statement.rb
|
65
|
+
- lib/sqlite3/value.rb
|
66
|
+
- lib/sqlite3/version.rb
|
67
|
+
homepage: https://github.com/sparklemotion/sqlite3-ruby
|
68
|
+
licenses:
|
69
|
+
- BSD-3-Clause
|
70
|
+
metadata:
|
71
|
+
homepage_uri: https://github.com/sparklemotion/sqlite3-ruby
|
72
|
+
bug_tracker_uri: https://github.com/sparklemotion/sqlite3-ruby/issues
|
73
|
+
documentation_uri: https://www.rubydoc.info/gems/sqlite3
|
74
|
+
changelog_uri: https://github.com/sparklemotion/sqlite3-ruby/blob/master/CHANGELOG.md
|
75
|
+
source_code_uri: https://github.com/sparklemotion/sqlite3-ruby
|
76
|
+
rubygems_mfa_required: 'true'
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options:
|
79
|
+
- "--main"
|
80
|
+
- README.md
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '3.0'
|
88
|
+
- - "<"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 3.4.dev
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 3.3.22
|
96
|
+
requirements: []
|
97
|
+
rubygems_version: 3.3.26
|
98
|
+
signing_key:
|
99
|
+
specification_version: 4
|
100
|
+
summary: Ruby library to interface with the SQLite3 database engine (http://www.sqlite.org).
|
101
|
+
test_files: []
|