sqlite3 2.0.0-x86_64-linux-musl
Sign up to get free protection for your applications and to get access to all the features.
- 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: x86_64-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: []
|