sqlite3 1.7.2 → 2.7.0
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 +4 -4
- data/CHANGELOG.md +323 -1
- data/CONTRIBUTING.md +33 -7
- data/FAQ.md +43 -77
- data/INSTALLATION.md +14 -6
- data/LICENSE +18 -22
- data/README.md +97 -9
- data/dependencies.yml +10 -11
- data/ext/sqlite3/aggregator.c +142 -145
- data/ext/sqlite3/aggregator.h +2 -4
- data/ext/sqlite3/backup.c +74 -65
- data/ext/sqlite3/backup.h +2 -2
- data/ext/sqlite3/database.c +623 -495
- data/ext/sqlite3/database.h +13 -4
- data/ext/sqlite3/exception.c +116 -92
- data/ext/sqlite3/exception.h +5 -1
- data/ext/sqlite3/extconf.rb +32 -24
- data/ext/sqlite3/sqlite3.c +176 -115
- data/ext/sqlite3/sqlite3_ruby.h +2 -2
- data/ext/sqlite3/statement.c +553 -300
- data/ext/sqlite3/statement.h +4 -3
- data/ext/sqlite3/timespec.h +20 -0
- data/lib/sqlite3/constants.rb +195 -47
- data/lib/sqlite3/database.rb +224 -187
- data/lib/sqlite3/errors.rb +54 -1
- data/lib/sqlite3/fork_safety.rb +66 -0
- data/lib/sqlite3/pragmas.rb +194 -141
- data/lib/sqlite3/resultset.rb +14 -97
- data/lib/sqlite3/statement.rb +58 -13
- data/lib/sqlite3/value.rb +17 -20
- data/lib/sqlite3/version.rb +2 -21
- data/lib/sqlite3/version_info.rb +17 -0
- data/lib/sqlite3.rb +8 -4
- data/ports/archives/sqlite-autoconf-3500100.tar.gz +0 -0
- metadata +9 -37
- data/API_CHANGES.md +0 -49
- data/ChangeLog.cvs +0 -88
- data/Gemfile +0 -10
- data/LICENSE-DEPENDENCIES +0 -20
- data/lib/sqlite3/translator.rb +0 -117
- data/ports/archives/sqlite-autoconf-3450100.tar.gz +0 -0
- data/test/helper.rb +0 -27
- data/test/test_backup.rb +0 -33
- data/test/test_collation.rb +0 -82
- data/test/test_database.rb +0 -668
- data/test/test_database_flags.rb +0 -95
- data/test/test_database_readonly.rb +0 -36
- data/test/test_database_readwrite.rb +0 -41
- data/test/test_deprecated.rb +0 -49
- data/test/test_encoding.rb +0 -165
- data/test/test_integration.rb +0 -507
- data/test/test_integration_aggregate.rb +0 -336
- data/test/test_integration_open_close.rb +0 -30
- data/test/test_integration_pending.rb +0 -115
- data/test/test_integration_resultset.rb +0 -142
- data/test/test_integration_statement.rb +0 -194
- data/test/test_pragmas.rb +0 -22
- data/test/test_result_set.rb +0 -47
- data/test/test_sqlite3.rb +0 -30
- data/test/test_statement.rb +0 -290
- data/test/test_statement_execute.rb +0 -39
data/lib/sqlite3/pragmas.rb
CHANGED
@@ -1,59 +1,57 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require "sqlite3/errors"
|
4
4
|
|
5
|
+
module SQLite3
|
5
6
|
# This module is intended for inclusion solely by the Database class. It
|
6
7
|
# defines convenience methods for the various pragmas supported by SQLite3.
|
7
8
|
#
|
8
9
|
# For a detailed description of these pragmas, see the SQLite3 documentation
|
9
10
|
# at http://sqlite.org/pragma.html.
|
10
11
|
module Pragmas
|
11
|
-
|
12
12
|
# Returns +true+ or +false+ depending on the value of the named pragma.
|
13
|
-
def get_boolean_pragma(
|
14
|
-
get_first_value(
|
13
|
+
def get_boolean_pragma(name)
|
14
|
+
get_first_value("PRAGMA #{name}") != 0
|
15
15
|
end
|
16
16
|
|
17
17
|
# Sets the given pragma to the given boolean value. The value itself
|
18
18
|
# may be +true+ or +false+, or any other commonly used string or
|
19
19
|
# integer that represents truth.
|
20
|
-
def set_boolean_pragma(
|
20
|
+
def set_boolean_pragma(name, mode)
|
21
21
|
case mode
|
22
22
|
when String
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
23
|
+
case mode.downcase
|
24
|
+
when "on", "yes", "true", "y", "t" then mode = "'ON'"
|
25
|
+
when "off", "no", "false", "n", "f" then mode = "'OFF'"
|
26
|
+
else
|
27
|
+
raise SQLite3::Exception, "unrecognized pragma parameter #{mode.inspect}"
|
28
|
+
end
|
30
29
|
when true, 1
|
31
|
-
|
30
|
+
mode = "ON"
|
32
31
|
when false, 0, nil
|
33
|
-
|
32
|
+
mode = "OFF"
|
34
33
|
else
|
35
|
-
|
36
|
-
"unrecognized pragma parameter #{mode.inspect}"
|
34
|
+
raise SQLite3::Exception, "unrecognized pragma parameter #{mode.inspect}"
|
37
35
|
end
|
38
36
|
|
39
|
-
execute(
|
37
|
+
execute("PRAGMA #{name}=#{mode}")
|
40
38
|
end
|
41
39
|
|
42
40
|
# Requests the given pragma (and parameters), and if the block is given,
|
43
41
|
# each row of the result set will be yielded to it. Otherwise, the results
|
44
42
|
# are returned as an array.
|
45
|
-
def get_query_pragma(
|
43
|
+
def get_query_pragma(name, *params, &block) # :yields: row
|
46
44
|
if params.empty?
|
47
|
-
execute(
|
45
|
+
execute("PRAGMA #{name}", &block)
|
48
46
|
else
|
49
47
|
args = "'" + params.join("','") + "'"
|
50
|
-
execute(
|
48
|
+
execute("PRAGMA #{name}( #{args} )", &block)
|
51
49
|
end
|
52
50
|
end
|
53
51
|
|
54
52
|
# Return the value of the given pragma.
|
55
|
-
def get_enum_pragma(
|
56
|
-
get_first_value(
|
53
|
+
def get_enum_pragma(name)
|
54
|
+
get_first_value("PRAGMA #{name}")
|
57
55
|
end
|
58
56
|
|
59
57
|
# Set the value of the given pragma to +mode+. The +mode+ parameter must
|
@@ -61,51 +59,92 @@ module SQLite3
|
|
61
59
|
# the array is another array comprised of elements in the enumeration that
|
62
60
|
# have duplicate values. See #synchronous, #default_synchronous,
|
63
61
|
# #temp_store, and #default_temp_store for usage examples.
|
64
|
-
def set_enum_pragma(
|
65
|
-
match = enums.
|
66
|
-
|
67
|
-
|
68
|
-
|
62
|
+
def set_enum_pragma(name, mode, enums)
|
63
|
+
match = if enums.is_a?(Array)
|
64
|
+
# maybe deprecate this?
|
65
|
+
enums.find { |p| p.find { |i| i.to_s.downcase == mode.to_s.downcase } }
|
66
|
+
elsif mode.is_a?(String)
|
67
|
+
enums.fetch(mode.downcase)
|
68
|
+
else
|
69
|
+
mode
|
70
|
+
end
|
71
|
+
|
72
|
+
unless match
|
73
|
+
raise SQLite3::Exception, "unrecognized #{name} #{mode.inspect}"
|
74
|
+
end
|
75
|
+
|
76
|
+
execute("PRAGMA #{name}='#{match}'")
|
69
77
|
end
|
70
78
|
|
71
79
|
# Returns the value of the given pragma as an integer.
|
72
|
-
def get_int_pragma(
|
73
|
-
get_first_value(
|
80
|
+
def get_int_pragma(name)
|
81
|
+
get_first_value("PRAGMA #{name}").to_i
|
74
82
|
end
|
75
83
|
|
76
84
|
# Set the value of the given pragma to the integer value of the +value+
|
77
85
|
# parameter.
|
78
|
-
def set_int_pragma(
|
79
|
-
execute(
|
86
|
+
def set_int_pragma(name, value)
|
87
|
+
execute("PRAGMA #{name}=#{value.to_i}")
|
80
88
|
end
|
81
89
|
|
82
90
|
# The enumeration of valid synchronous modes.
|
83
|
-
SYNCHRONOUS_MODES =
|
91
|
+
SYNCHRONOUS_MODES = {
|
92
|
+
"full" => 2,
|
93
|
+
"normal" => 1,
|
94
|
+
"off" => 0
|
95
|
+
}.freeze
|
84
96
|
|
85
97
|
# The enumeration of valid temp store modes.
|
86
|
-
TEMP_STORE_MODES
|
98
|
+
TEMP_STORE_MODES = {
|
99
|
+
"default" => 0,
|
100
|
+
"file" => 1,
|
101
|
+
"memory" => 2
|
102
|
+
}.freeze
|
87
103
|
|
88
104
|
# The enumeration of valid auto vacuum modes.
|
89
|
-
AUTO_VACUUM_MODES
|
105
|
+
AUTO_VACUUM_MODES = {
|
106
|
+
"none" => 0,
|
107
|
+
"full" => 1,
|
108
|
+
"incremental" => 2
|
109
|
+
}.freeze
|
90
110
|
|
91
111
|
# The list of valid journaling modes.
|
92
|
-
JOURNAL_MODES
|
93
|
-
|
112
|
+
JOURNAL_MODES = {
|
113
|
+
"delete" => "delete",
|
114
|
+
"truncate" => "truncate",
|
115
|
+
"persist" => "persist",
|
116
|
+
"memory" => "memory",
|
117
|
+
"wal" => "wal",
|
118
|
+
"off" => "off"
|
119
|
+
}.freeze
|
94
120
|
|
95
121
|
# The list of valid locking modes.
|
96
|
-
LOCKING_MODES
|
122
|
+
LOCKING_MODES = {
|
123
|
+
"normal" => "normal",
|
124
|
+
"exclusive" => "exclusive"
|
125
|
+
}.freeze
|
97
126
|
|
98
127
|
# The list of valid encodings.
|
99
|
-
ENCODINGS =
|
128
|
+
ENCODINGS = {
|
129
|
+
"utf-8" => "utf-8",
|
130
|
+
"utf-16" => "utf-16",
|
131
|
+
"utf-16le" => "utf-16le",
|
132
|
+
"utf-16be" => "utf-16be"
|
133
|
+
}.freeze
|
100
134
|
|
101
135
|
# The list of valid WAL checkpoints.
|
102
|
-
WAL_CHECKPOINTS =
|
136
|
+
WAL_CHECKPOINTS = {
|
137
|
+
"passive" => "passive",
|
138
|
+
"full" => "full",
|
139
|
+
"restart" => "restart",
|
140
|
+
"truncate" => "truncate"
|
141
|
+
}.freeze
|
103
142
|
|
104
143
|
def application_id
|
105
144
|
get_int_pragma "application_id"
|
106
145
|
end
|
107
146
|
|
108
|
-
def application_id=(
|
147
|
+
def application_id=(integer)
|
109
148
|
set_int_pragma "application_id", integer
|
110
149
|
end
|
111
150
|
|
@@ -113,7 +152,7 @@ module SQLite3
|
|
113
152
|
get_enum_pragma "auto_vacuum"
|
114
153
|
end
|
115
154
|
|
116
|
-
def auto_vacuum=(
|
155
|
+
def auto_vacuum=(mode)
|
117
156
|
set_enum_pragma "auto_vacuum", mode, AUTO_VACUUM_MODES
|
118
157
|
end
|
119
158
|
|
@@ -121,7 +160,7 @@ module SQLite3
|
|
121
160
|
get_boolean_pragma "automatic_index"
|
122
161
|
end
|
123
162
|
|
124
|
-
def automatic_index=(
|
163
|
+
def automatic_index=(mode)
|
125
164
|
set_boolean_pragma "automatic_index", mode
|
126
165
|
end
|
127
166
|
|
@@ -129,7 +168,7 @@ module SQLite3
|
|
129
168
|
get_int_pragma "busy_timeout"
|
130
169
|
end
|
131
170
|
|
132
|
-
def busy_timeout=(
|
171
|
+
def busy_timeout=(milliseconds)
|
133
172
|
set_int_pragma "busy_timeout", milliseconds
|
134
173
|
end
|
135
174
|
|
@@ -137,7 +176,7 @@ module SQLite3
|
|
137
176
|
get_int_pragma "cache_size"
|
138
177
|
end
|
139
178
|
|
140
|
-
def cache_size=(
|
179
|
+
def cache_size=(size)
|
141
180
|
set_int_pragma "cache_size", size
|
142
181
|
end
|
143
182
|
|
@@ -145,11 +184,11 @@ module SQLite3
|
|
145
184
|
get_boolean_pragma "cache_spill"
|
146
185
|
end
|
147
186
|
|
148
|
-
def cache_spill=(
|
187
|
+
def cache_spill=(mode)
|
149
188
|
set_boolean_pragma "cache_spill", mode
|
150
189
|
end
|
151
190
|
|
152
|
-
def case_sensitive_like=(
|
191
|
+
def case_sensitive_like=(mode)
|
153
192
|
set_boolean_pragma "case_sensitive_like", mode
|
154
193
|
end
|
155
194
|
|
@@ -157,7 +196,7 @@ module SQLite3
|
|
157
196
|
get_boolean_pragma "cell_size_check"
|
158
197
|
end
|
159
198
|
|
160
|
-
def cell_size_check=(
|
199
|
+
def cell_size_check=(mode)
|
161
200
|
set_boolean_pragma "cell_size_check", mode
|
162
201
|
end
|
163
202
|
|
@@ -165,15 +204,15 @@ module SQLite3
|
|
165
204
|
get_boolean_pragma "checkpoint_fullfsync"
|
166
205
|
end
|
167
206
|
|
168
|
-
def checkpoint_fullfsync=(
|
207
|
+
def checkpoint_fullfsync=(mode)
|
169
208
|
set_boolean_pragma "checkpoint_fullfsync", mode
|
170
209
|
end
|
171
210
|
|
172
|
-
def collation_list(
|
211
|
+
def collation_list(&block) # :yields: row
|
173
212
|
get_query_pragma "collation_list", &block
|
174
213
|
end
|
175
214
|
|
176
|
-
def compile_options(
|
215
|
+
def compile_options(&block) # :yields: row
|
177
216
|
get_query_pragma "compile_options", &block
|
178
217
|
end
|
179
218
|
|
@@ -181,7 +220,7 @@ module SQLite3
|
|
181
220
|
get_boolean_pragma "count_changes"
|
182
221
|
end
|
183
222
|
|
184
|
-
def count_changes=(
|
223
|
+
def count_changes=(mode)
|
185
224
|
set_boolean_pragma "count_changes", mode
|
186
225
|
end
|
187
226
|
|
@@ -189,7 +228,7 @@ module SQLite3
|
|
189
228
|
get_int_pragma "data_version"
|
190
229
|
end
|
191
230
|
|
192
|
-
def database_list(
|
231
|
+
def database_list(&block) # :yields: row
|
193
232
|
get_query_pragma "database_list", &block
|
194
233
|
end
|
195
234
|
|
@@ -197,7 +236,7 @@ module SQLite3
|
|
197
236
|
get_int_pragma "default_cache_size"
|
198
237
|
end
|
199
238
|
|
200
|
-
def default_cache_size=(
|
239
|
+
def default_cache_size=(size)
|
201
240
|
set_int_pragma "default_cache_size", size
|
202
241
|
end
|
203
242
|
|
@@ -205,7 +244,7 @@ module SQLite3
|
|
205
244
|
get_enum_pragma "default_synchronous"
|
206
245
|
end
|
207
246
|
|
208
|
-
def default_synchronous=(
|
247
|
+
def default_synchronous=(mode)
|
209
248
|
set_enum_pragma "default_synchronous", mode, SYNCHRONOUS_MODES
|
210
249
|
end
|
211
250
|
|
@@ -213,7 +252,7 @@ module SQLite3
|
|
213
252
|
get_enum_pragma "default_temp_store"
|
214
253
|
end
|
215
254
|
|
216
|
-
def default_temp_store=(
|
255
|
+
def default_temp_store=(mode)
|
217
256
|
set_enum_pragma "default_temp_store", mode, TEMP_STORE_MODES
|
218
257
|
end
|
219
258
|
|
@@ -221,7 +260,7 @@ module SQLite3
|
|
221
260
|
get_boolean_pragma "defer_foreign_keys"
|
222
261
|
end
|
223
262
|
|
224
|
-
def defer_foreign_keys=(
|
263
|
+
def defer_foreign_keys=(mode)
|
225
264
|
set_boolean_pragma "defer_foreign_keys", mode
|
226
265
|
end
|
227
266
|
|
@@ -229,15 +268,15 @@ module SQLite3
|
|
229
268
|
get_enum_pragma "encoding"
|
230
269
|
end
|
231
270
|
|
232
|
-
def encoding=(
|
233
|
-
|
271
|
+
def encoding=(mode)
|
272
|
+
set_string_pragma "encoding", mode, ENCODINGS
|
234
273
|
end
|
235
274
|
|
236
|
-
def foreign_key_check(
|
275
|
+
def foreign_key_check(*table, &block) # :yields: row
|
237
276
|
get_query_pragma "foreign_key_check", *table, &block
|
238
277
|
end
|
239
278
|
|
240
|
-
def foreign_key_list(
|
279
|
+
def foreign_key_list(table, &block) # :yields: row
|
241
280
|
get_query_pragma "foreign_key_list", table, &block
|
242
281
|
end
|
243
282
|
|
@@ -245,7 +284,7 @@ module SQLite3
|
|
245
284
|
get_boolean_pragma "foreign_keys"
|
246
285
|
end
|
247
286
|
|
248
|
-
def foreign_keys=(
|
287
|
+
def foreign_keys=(mode)
|
249
288
|
set_boolean_pragma "foreign_keys", mode
|
250
289
|
end
|
251
290
|
|
@@ -257,7 +296,7 @@ module SQLite3
|
|
257
296
|
get_boolean_pragma "full_column_names"
|
258
297
|
end
|
259
298
|
|
260
|
-
def full_column_names=(
|
299
|
+
def full_column_names=(mode)
|
261
300
|
set_boolean_pragma "full_column_names", mode
|
262
301
|
end
|
263
302
|
|
@@ -265,31 +304,31 @@ module SQLite3
|
|
265
304
|
get_boolean_pragma "fullfsync"
|
266
305
|
end
|
267
306
|
|
268
|
-
def fullfsync=(
|
307
|
+
def fullfsync=(mode)
|
269
308
|
set_boolean_pragma "fullfsync", mode
|
270
309
|
end
|
271
310
|
|
272
|
-
def ignore_check_constraints=(
|
311
|
+
def ignore_check_constraints=(mode)
|
273
312
|
set_boolean_pragma "ignore_check_constraints", mode
|
274
313
|
end
|
275
314
|
|
276
|
-
def incremental_vacuum(
|
315
|
+
def incremental_vacuum(pages, &block) # :yields: row
|
277
316
|
get_query_pragma "incremental_vacuum", pages, &block
|
278
317
|
end
|
279
318
|
|
280
|
-
def index_info(
|
319
|
+
def index_info(index, &block) # :yields: row
|
281
320
|
get_query_pragma "index_info", index, &block
|
282
321
|
end
|
283
322
|
|
284
|
-
def index_list(
|
323
|
+
def index_list(table, &block) # :yields: row
|
285
324
|
get_query_pragma "index_list", table, &block
|
286
325
|
end
|
287
326
|
|
288
|
-
def index_xinfo(
|
327
|
+
def index_xinfo(index, &block) # :yields: row
|
289
328
|
get_query_pragma "index_xinfo", index, &block
|
290
329
|
end
|
291
330
|
|
292
|
-
def integrity_check(
|
331
|
+
def integrity_check(*num_errors, &block) # :yields: row
|
293
332
|
get_query_pragma "integrity_check", *num_errors, &block
|
294
333
|
end
|
295
334
|
|
@@ -297,15 +336,15 @@ module SQLite3
|
|
297
336
|
get_enum_pragma "journal_mode"
|
298
337
|
end
|
299
338
|
|
300
|
-
def journal_mode=(
|
301
|
-
|
339
|
+
def journal_mode=(mode)
|
340
|
+
set_string_pragma "journal_mode", mode, JOURNAL_MODES
|
302
341
|
end
|
303
342
|
|
304
343
|
def journal_size_limit
|
305
344
|
get_int_pragma "journal_size_limit"
|
306
345
|
end
|
307
346
|
|
308
|
-
def journal_size_limit=(
|
347
|
+
def journal_size_limit=(size)
|
309
348
|
set_int_pragma "journal_size_limit", size
|
310
349
|
end
|
311
350
|
|
@@ -313,7 +352,7 @@ module SQLite3
|
|
313
352
|
get_boolean_pragma "legacy_file_format"
|
314
353
|
end
|
315
354
|
|
316
|
-
def legacy_file_format=(
|
355
|
+
def legacy_file_format=(mode)
|
317
356
|
set_boolean_pragma "legacy_file_format", mode
|
318
357
|
end
|
319
358
|
|
@@ -321,15 +360,15 @@ module SQLite3
|
|
321
360
|
get_enum_pragma "locking_mode"
|
322
361
|
end
|
323
362
|
|
324
|
-
def locking_mode=(
|
325
|
-
|
363
|
+
def locking_mode=(mode)
|
364
|
+
set_string_pragma "locking_mode", mode, LOCKING_MODES
|
326
365
|
end
|
327
366
|
|
328
367
|
def max_page_count
|
329
368
|
get_int_pragma "max_page_count"
|
330
369
|
end
|
331
370
|
|
332
|
-
def max_page_count=(
|
371
|
+
def max_page_count=(size)
|
333
372
|
set_int_pragma "max_page_count", size
|
334
373
|
end
|
335
374
|
|
@@ -337,10 +376,24 @@ module SQLite3
|
|
337
376
|
get_int_pragma "mmap_size"
|
338
377
|
end
|
339
378
|
|
340
|
-
def mmap_size=(
|
379
|
+
def mmap_size=(size)
|
341
380
|
set_int_pragma "mmap_size", size
|
342
381
|
end
|
343
382
|
|
383
|
+
# Attempt to optimize the database.
|
384
|
+
#
|
385
|
+
# To customize the optimization options, pass +bitmask+ with a combination
|
386
|
+
# of the Constants::Optimize masks.
|
387
|
+
#
|
388
|
+
# See https://www.sqlite.org/pragma.html#pragma_optimize for more information.
|
389
|
+
def optimize(bitmask = nil)
|
390
|
+
if bitmask
|
391
|
+
set_int_pragma "optimize", bitmask
|
392
|
+
else
|
393
|
+
execute("PRAGMA optimize")
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
344
397
|
def page_count
|
345
398
|
get_int_pragma "page_count"
|
346
399
|
end
|
@@ -349,11 +402,11 @@ module SQLite3
|
|
349
402
|
get_int_pragma "page_size"
|
350
403
|
end
|
351
404
|
|
352
|
-
def page_size=(
|
405
|
+
def page_size=(size)
|
353
406
|
set_int_pragma "page_size", size
|
354
407
|
end
|
355
408
|
|
356
|
-
def parser_trace=(
|
409
|
+
def parser_trace=(mode)
|
357
410
|
set_boolean_pragma "parser_trace", mode
|
358
411
|
end
|
359
412
|
|
@@ -361,11 +414,11 @@ module SQLite3
|
|
361
414
|
get_boolean_pragma "query_only"
|
362
415
|
end
|
363
416
|
|
364
|
-
def query_only=(
|
417
|
+
def query_only=(mode)
|
365
418
|
set_boolean_pragma "query_only", mode
|
366
419
|
end
|
367
420
|
|
368
|
-
def quick_check(
|
421
|
+
def quick_check(*num_errors, &block) # :yields: row
|
369
422
|
get_query_pragma "quick_check", *num_errors, &block
|
370
423
|
end
|
371
424
|
|
@@ -373,7 +426,7 @@ module SQLite3
|
|
373
426
|
get_boolean_pragma "read_uncommitted"
|
374
427
|
end
|
375
428
|
|
376
|
-
def read_uncommitted=(
|
429
|
+
def read_uncommitted=(mode)
|
377
430
|
set_boolean_pragma "read_uncommitted", mode
|
378
431
|
end
|
379
432
|
|
@@ -381,7 +434,7 @@ module SQLite3
|
|
381
434
|
get_boolean_pragma "recursive_triggers"
|
382
435
|
end
|
383
436
|
|
384
|
-
def recursive_triggers=(
|
437
|
+
def recursive_triggers=(mode)
|
385
438
|
set_boolean_pragma "recursive_triggers", mode
|
386
439
|
end
|
387
440
|
|
@@ -389,7 +442,7 @@ module SQLite3
|
|
389
442
|
get_boolean_pragma "reverse_unordered_selects"
|
390
443
|
end
|
391
444
|
|
392
|
-
def reverse_unordered_selects=(
|
445
|
+
def reverse_unordered_selects=(mode)
|
393
446
|
set_boolean_pragma "reverse_unordered_selects", mode
|
394
447
|
end
|
395
448
|
|
@@ -397,7 +450,7 @@ module SQLite3
|
|
397
450
|
get_int_pragma "schema_cookie"
|
398
451
|
end
|
399
452
|
|
400
|
-
def schema_cookie=(
|
453
|
+
def schema_cookie=(cookie)
|
401
454
|
set_int_pragma "schema_cookie", cookie
|
402
455
|
end
|
403
456
|
|
@@ -405,7 +458,7 @@ module SQLite3
|
|
405
458
|
get_int_pragma "schema_version"
|
406
459
|
end
|
407
460
|
|
408
|
-
def schema_version=(
|
461
|
+
def schema_version=(version)
|
409
462
|
set_int_pragma "schema_version", version
|
410
463
|
end
|
411
464
|
|
@@ -413,7 +466,7 @@ module SQLite3
|
|
413
466
|
get_boolean_pragma "secure_delete"
|
414
467
|
end
|
415
468
|
|
416
|
-
def secure_delete=(
|
469
|
+
def secure_delete=(mode)
|
417
470
|
set_boolean_pragma "secure_delete", mode
|
418
471
|
end
|
419
472
|
|
@@ -421,23 +474,23 @@ module SQLite3
|
|
421
474
|
get_boolean_pragma "short_column_names"
|
422
475
|
end
|
423
476
|
|
424
|
-
def short_column_names=(
|
477
|
+
def short_column_names=(mode)
|
425
478
|
set_boolean_pragma "short_column_names", mode
|
426
479
|
end
|
427
480
|
|
428
481
|
def shrink_memory
|
429
|
-
execute(
|
482
|
+
execute("PRAGMA shrink_memory")
|
430
483
|
end
|
431
484
|
|
432
485
|
def soft_heap_limit
|
433
486
|
get_int_pragma "soft_heap_limit"
|
434
487
|
end
|
435
488
|
|
436
|
-
def soft_heap_limit=(
|
489
|
+
def soft_heap_limit=(mode)
|
437
490
|
set_int_pragma "soft_heap_limit", mode
|
438
491
|
end
|
439
492
|
|
440
|
-
def stats(
|
493
|
+
def stats(&block) # :yields: row
|
441
494
|
get_query_pragma "stats", &block
|
442
495
|
end
|
443
496
|
|
@@ -445,7 +498,7 @@ module SQLite3
|
|
445
498
|
get_enum_pragma "synchronous"
|
446
499
|
end
|
447
500
|
|
448
|
-
def synchronous=(
|
501
|
+
def synchronous=(mode)
|
449
502
|
set_enum_pragma "synchronous", mode, SYNCHRONOUS_MODES
|
450
503
|
end
|
451
504
|
|
@@ -453,7 +506,7 @@ module SQLite3
|
|
453
506
|
get_enum_pragma "temp_store"
|
454
507
|
end
|
455
508
|
|
456
|
-
def temp_store=(
|
509
|
+
def temp_store=(mode)
|
457
510
|
set_enum_pragma "temp_store", mode, TEMP_STORE_MODES
|
458
511
|
end
|
459
512
|
|
@@ -461,7 +514,7 @@ module SQLite3
|
|
461
514
|
get_int_pragma "threads"
|
462
515
|
end
|
463
516
|
|
464
|
-
def threads=(
|
517
|
+
def threads=(count)
|
465
518
|
set_int_pragma "threads", count
|
466
519
|
end
|
467
520
|
|
@@ -469,7 +522,7 @@ module SQLite3
|
|
469
522
|
get_int_pragma "user_cookie"
|
470
523
|
end
|
471
524
|
|
472
|
-
def user_cookie=(
|
525
|
+
def user_cookie=(cookie)
|
473
526
|
set_int_pragma "user_cookie", cookie
|
474
527
|
end
|
475
528
|
|
@@ -477,19 +530,19 @@ module SQLite3
|
|
477
530
|
get_int_pragma "user_version"
|
478
531
|
end
|
479
532
|
|
480
|
-
def user_version=(
|
533
|
+
def user_version=(version)
|
481
534
|
set_int_pragma "user_version", version
|
482
535
|
end
|
483
536
|
|
484
|
-
def vdbe_addoptrace=(
|
537
|
+
def vdbe_addoptrace=(mode)
|
485
538
|
set_boolean_pragma "vdbe_addoptrace", mode
|
486
539
|
end
|
487
540
|
|
488
|
-
def vdbe_debug=(
|
541
|
+
def vdbe_debug=(mode)
|
489
542
|
set_boolean_pragma "vdbe_debug", mode
|
490
543
|
end
|
491
544
|
|
492
|
-
def vdbe_listing=(
|
545
|
+
def vdbe_listing=(mode)
|
493
546
|
set_boolean_pragma "vdbe_listing", mode
|
494
547
|
end
|
495
548
|
|
@@ -497,7 +550,7 @@ module SQLite3
|
|
497
550
|
get_boolean_pragma "vdbe_trace"
|
498
551
|
end
|
499
552
|
|
500
|
-
def vdbe_trace=(
|
553
|
+
def vdbe_trace=(mode)
|
501
554
|
set_boolean_pragma "vdbe_trace", mode
|
502
555
|
end
|
503
556
|
|
@@ -505,7 +558,7 @@ module SQLite3
|
|
505
558
|
get_int_pragma "wal_autocheckpoint"
|
506
559
|
end
|
507
560
|
|
508
|
-
def wal_autocheckpoint=(
|
561
|
+
def wal_autocheckpoint=(mode)
|
509
562
|
set_int_pragma "wal_autocheckpoint", mode
|
510
563
|
end
|
511
564
|
|
@@ -513,11 +566,11 @@ module SQLite3
|
|
513
566
|
get_enum_pragma "wal_checkpoint"
|
514
567
|
end
|
515
568
|
|
516
|
-
def wal_checkpoint=(
|
517
|
-
|
569
|
+
def wal_checkpoint=(mode)
|
570
|
+
set_string_pragma "wal_checkpoint", mode, WAL_CHECKPOINTS
|
518
571
|
end
|
519
572
|
|
520
|
-
def writable_schema=(
|
573
|
+
def writable_schema=(mode)
|
521
574
|
set_boolean_pragma "writable_schema", mode
|
522
575
|
end
|
523
576
|
|
@@ -525,7 +578,7 @@ module SQLite3
|
|
525
578
|
# Returns information about +table+. Yields each row of table information
|
526
579
|
# if a block is provided.
|
527
580
|
def table_info table
|
528
|
-
stmt
|
581
|
+
stmt = prepare "PRAGMA table_info(#{table})"
|
529
582
|
columns = stmt.columns
|
530
583
|
|
531
584
|
needs_tweak_default =
|
@@ -533,21 +586,15 @@ module SQLite3
|
|
533
586
|
|
534
587
|
result = [] unless block_given?
|
535
588
|
stmt.each do |row|
|
536
|
-
new_row =
|
537
|
-
|
538
|
-
# FIXME: This should be removed but is required for older versions
|
539
|
-
# of rails
|
540
|
-
if(Object.const_defined?(:ActiveRecord))
|
541
|
-
new_row['notnull'] = new_row['notnull'].to_s
|
542
|
-
end
|
589
|
+
new_row = columns.zip(row).to_h
|
543
590
|
|
544
591
|
tweak_default(new_row) if needs_tweak_default
|
545
592
|
|
546
593
|
# Ensure the type value is downcased. On Mac and Windows
|
547
594
|
# platforms this value is now being returned as all upper
|
548
595
|
# case.
|
549
|
-
if new_row[
|
550
|
-
new_row[
|
596
|
+
if new_row["type"]
|
597
|
+
new_row["type"] = new_row["type"].downcase
|
551
598
|
end
|
552
599
|
|
553
600
|
if block_given?
|
@@ -563,33 +610,39 @@ module SQLite3
|
|
563
610
|
|
564
611
|
private
|
565
612
|
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
613
|
+
def set_string_pragma(pragma_name, value, valid_values)
|
614
|
+
valid_values.fetch(value.to_s.downcase) {
|
615
|
+
raise SQLite3::Exception, "unrecognized #{pragma_name} #{value.inspect}"
|
616
|
+
}
|
617
|
+
set_enum_pragma(pragma_name, value, valid_values)
|
618
|
+
end
|
619
|
+
|
620
|
+
# Compares two version strings
|
621
|
+
def version_compare(v1, v2)
|
622
|
+
v1 = v1.split(".").map { |i| i.to_i }
|
623
|
+
v2 = v2.split(".").map { |i| i.to_i }
|
624
|
+
parts = [v1.length, v2.length].max
|
625
|
+
v1.push 0 while v1.length < parts
|
626
|
+
v2.push 0 while v2.length < parts
|
627
|
+
v1.zip(v2).each do |a, b|
|
628
|
+
return -1 if a < b
|
629
|
+
return 1 if a > b
|
578
630
|
end
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
631
|
+
0
|
632
|
+
end
|
633
|
+
|
634
|
+
# Since SQLite 3.3.8, the table_info pragma has returned the default
|
635
|
+
# value of the row as a quoted SQL value. This method essentially
|
636
|
+
# unquotes those values.
|
637
|
+
def tweak_default(hash)
|
638
|
+
case hash["dflt_value"]
|
639
|
+
when /^null$/i
|
640
|
+
hash["dflt_value"] = nil
|
641
|
+
when /^'(.*)'$/m
|
642
|
+
hash["dflt_value"] = $1.gsub("''", "'")
|
643
|
+
when /^"(.*)"$/m
|
644
|
+
hash["dflt_value"] = $1.gsub('""', '"')
|
592
645
|
end
|
646
|
+
end
|
593
647
|
end
|
594
|
-
|
595
648
|
end
|