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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +323 -1
  3. data/CONTRIBUTING.md +33 -7
  4. data/FAQ.md +43 -77
  5. data/INSTALLATION.md +14 -6
  6. data/LICENSE +18 -22
  7. data/README.md +97 -9
  8. data/dependencies.yml +10 -11
  9. data/ext/sqlite3/aggregator.c +142 -145
  10. data/ext/sqlite3/aggregator.h +2 -4
  11. data/ext/sqlite3/backup.c +74 -65
  12. data/ext/sqlite3/backup.h +2 -2
  13. data/ext/sqlite3/database.c +623 -495
  14. data/ext/sqlite3/database.h +13 -4
  15. data/ext/sqlite3/exception.c +116 -92
  16. data/ext/sqlite3/exception.h +5 -1
  17. data/ext/sqlite3/extconf.rb +32 -24
  18. data/ext/sqlite3/sqlite3.c +176 -115
  19. data/ext/sqlite3/sqlite3_ruby.h +2 -2
  20. data/ext/sqlite3/statement.c +553 -300
  21. data/ext/sqlite3/statement.h +4 -3
  22. data/ext/sqlite3/timespec.h +20 -0
  23. data/lib/sqlite3/constants.rb +195 -47
  24. data/lib/sqlite3/database.rb +224 -187
  25. data/lib/sqlite3/errors.rb +54 -1
  26. data/lib/sqlite3/fork_safety.rb +66 -0
  27. data/lib/sqlite3/pragmas.rb +194 -141
  28. data/lib/sqlite3/resultset.rb +14 -97
  29. data/lib/sqlite3/statement.rb +58 -13
  30. data/lib/sqlite3/value.rb +17 -20
  31. data/lib/sqlite3/version.rb +2 -21
  32. data/lib/sqlite3/version_info.rb +17 -0
  33. data/lib/sqlite3.rb +8 -4
  34. data/ports/archives/sqlite-autoconf-3500100.tar.gz +0 -0
  35. metadata +9 -37
  36. data/API_CHANGES.md +0 -49
  37. data/ChangeLog.cvs +0 -88
  38. data/Gemfile +0 -10
  39. data/LICENSE-DEPENDENCIES +0 -20
  40. data/lib/sqlite3/translator.rb +0 -117
  41. data/ports/archives/sqlite-autoconf-3450100.tar.gz +0 -0
  42. data/test/helper.rb +0 -27
  43. data/test/test_backup.rb +0 -33
  44. data/test/test_collation.rb +0 -82
  45. data/test/test_database.rb +0 -668
  46. data/test/test_database_flags.rb +0 -95
  47. data/test/test_database_readonly.rb +0 -36
  48. data/test/test_database_readwrite.rb +0 -41
  49. data/test/test_deprecated.rb +0 -49
  50. data/test/test_encoding.rb +0 -165
  51. data/test/test_integration.rb +0 -507
  52. data/test/test_integration_aggregate.rb +0 -336
  53. data/test/test_integration_open_close.rb +0 -30
  54. data/test/test_integration_pending.rb +0 -115
  55. data/test/test_integration_resultset.rb +0 -142
  56. data/test/test_integration_statement.rb +0 -194
  57. data/test/test_pragmas.rb +0 -22
  58. data/test/test_result_set.rb +0 -47
  59. data/test/test_sqlite3.rb +0 -30
  60. data/test/test_statement.rb +0 -290
  61. data/test/test_statement_execute.rb +0 -39
@@ -1,59 +1,57 @@
1
- require 'sqlite3/errors'
1
+ # frozen_string_literal: true
2
2
 
3
- module SQLite3
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( name )
14
- get_first_value( "PRAGMA #{name}" ) != 0
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( name, mode )
20
+ def set_boolean_pragma(name, mode)
21
21
  case mode
22
22
  when String
23
- case mode.downcase
24
- when "on", "yes", "true", "y", "t"; mode = "'ON'"
25
- when "off", "no", "false", "n", "f"; mode = "'OFF'"
26
- else
27
- raise Exception,
28
- "unrecognized pragma parameter #{mode.inspect}"
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
- mode = "ON"
30
+ mode = "ON"
32
31
  when false, 0, nil
33
- mode = "OFF"
32
+ mode = "OFF"
34
33
  else
35
- raise Exception,
36
- "unrecognized pragma parameter #{mode.inspect}"
34
+ raise SQLite3::Exception, "unrecognized pragma parameter #{mode.inspect}"
37
35
  end
38
36
 
39
- execute( "PRAGMA #{name}=#{mode}" )
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( name, *params, &block ) # :yields: row
43
+ def get_query_pragma(name, *params, &block) # :yields: row
46
44
  if params.empty?
47
- execute( "PRAGMA #{name}", &block )
45
+ execute("PRAGMA #{name}", &block)
48
46
  else
49
47
  args = "'" + params.join("','") + "'"
50
- execute( "PRAGMA #{name}( #{args} )", &block )
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( name )
56
- get_first_value( "PRAGMA #{name}" )
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( name, mode, enums )
65
- match = enums.find { |p| p.find { |i| i.to_s.downcase == mode.to_s.downcase } }
66
- raise Exception,
67
- "unrecognized #{name} #{mode.inspect}" unless match
68
- execute( "PRAGMA #{name}='#{match.first.upcase}'" )
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( name )
73
- get_first_value( "PRAGMA #{name}" ).to_i
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( name, value )
79
- execute( "PRAGMA #{name}=#{value.to_i}" )
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 = [ [ 'full', 2 ], [ 'normal', 1 ], [ 'off', 0 ] ]
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 = [ [ 'default', 0 ], [ 'file', 1 ], [ 'memory', 2 ] ]
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 = [ [ 'none', 0 ], [ 'full', 1 ], [ 'incremental', 2 ] ]
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 = [ [ 'delete' ], [ 'truncate' ], [ 'persist' ], [ 'memory' ],
93
- [ 'wal' ], [ 'off' ] ]
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 = [ [ 'normal' ], [ 'exclusive' ] ]
122
+ LOCKING_MODES = {
123
+ "normal" => "normal",
124
+ "exclusive" => "exclusive"
125
+ }.freeze
97
126
 
98
127
  # The list of valid encodings.
99
- ENCODINGS = [ [ 'utf-8' ], [ 'utf-16' ], [ 'utf-16le' ], [ 'utf-16be ' ] ]
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 = [ [ 'passive' ], [ 'full' ], [ 'restart' ], [ 'truncate' ] ]
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=( integer )
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=( mode )
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=( mode )
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=( milliseconds )
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=( 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=( mode )
187
+ def cache_spill=(mode)
149
188
  set_boolean_pragma "cache_spill", mode
150
189
  end
151
190
 
152
- def case_sensitive_like=( mode )
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=( mode )
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=( mode )
207
+ def checkpoint_fullfsync=(mode)
169
208
  set_boolean_pragma "checkpoint_fullfsync", mode
170
209
  end
171
210
 
172
- def collation_list( &block ) # :yields: row
211
+ def collation_list(&block) # :yields: row
173
212
  get_query_pragma "collation_list", &block
174
213
  end
175
214
 
176
- def compile_options( &block ) # :yields: row
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=( mode )
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( &block ) # :yields: row
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=( 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=( mode )
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=( mode )
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=( mode )
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=( mode )
233
- set_enum_pragma "encoding", mode, ENCODINGS
271
+ def encoding=(mode)
272
+ set_string_pragma "encoding", mode, ENCODINGS
234
273
  end
235
274
 
236
- def foreign_key_check( *table, &block ) # :yields: row
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( table, &block ) # :yields: row
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=( mode )
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=( mode )
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=( mode )
307
+ def fullfsync=(mode)
269
308
  set_boolean_pragma "fullfsync", mode
270
309
  end
271
310
 
272
- def ignore_check_constraints=( mode )
311
+ def ignore_check_constraints=(mode)
273
312
  set_boolean_pragma "ignore_check_constraints", mode
274
313
  end
275
314
 
276
- def incremental_vacuum( pages, &block ) # :yields: row
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( index, &block ) # :yields: row
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( table, &block ) # :yields: row
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( index, &block ) # :yields: row
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( *num_errors, &block ) # :yields: row
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=( mode )
301
- set_enum_pragma "journal_mode", mode, JOURNAL_MODES
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=( size )
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=( mode )
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=( mode )
325
- set_enum_pragma "locking_mode", mode, LOCKING_MODES
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=( size )
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=( 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=( size )
405
+ def page_size=(size)
353
406
  set_int_pragma "page_size", size
354
407
  end
355
408
 
356
- def parser_trace=( mode )
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=( mode )
417
+ def query_only=(mode)
365
418
  set_boolean_pragma "query_only", mode
366
419
  end
367
420
 
368
- def quick_check( *num_errors, &block ) # :yields: row
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=( mode )
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=( mode )
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=( mode )
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=( 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=( 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=( mode )
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=( mode )
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( "PRAGMA shrink_memory" )
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=( mode )
489
+ def soft_heap_limit=(mode)
437
490
  set_int_pragma "soft_heap_limit", mode
438
491
  end
439
492
 
440
- def stats( &block ) # :yields: row
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=( mode )
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=( mode )
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=( count )
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=( 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=( version )
533
+ def user_version=(version)
481
534
  set_int_pragma "user_version", version
482
535
  end
483
536
 
484
- def vdbe_addoptrace=( mode )
537
+ def vdbe_addoptrace=(mode)
485
538
  set_boolean_pragma "vdbe_addoptrace", mode
486
539
  end
487
540
 
488
- def vdbe_debug=( mode )
541
+ def vdbe_debug=(mode)
489
542
  set_boolean_pragma "vdbe_debug", mode
490
543
  end
491
544
 
492
- def vdbe_listing=( mode )
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=( mode )
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=( mode )
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=( mode )
517
- set_enum_pragma "wal_checkpoint", mode, WAL_CHECKPOINTS
569
+ def wal_checkpoint=(mode)
570
+ set_string_pragma "wal_checkpoint", mode, WAL_CHECKPOINTS
518
571
  end
519
572
 
520
- def writable_schema=( mode )
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 = prepare "PRAGMA table_info(#{table})"
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 = Hash[columns.zip(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['type']
550
- new_row['type'] = new_row['type'].downcase
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
- # Compares two version strings
567
- def version_compare(v1, v2)
568
- v1 = v1.split(".").map { |i| i.to_i }
569
- v2 = v2.split(".").map { |i| i.to_i }
570
- parts = [v1.length, v2.length].max
571
- v1.push 0 while v1.length < parts
572
- v2.push 0 while v2.length < parts
573
- v1.zip(v2).each do |a,b|
574
- return -1 if a < b
575
- return 1 if a > b
576
- end
577
- return 0
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
- # Since SQLite 3.3.8, the table_info pragma has returned the default
581
- # value of the row as a quoted SQL value. This method essentially
582
- # unquotes those values.
583
- def tweak_default(hash)
584
- case hash["dflt_value"]
585
- when /^null$/i
586
- hash["dflt_value"] = nil
587
- when /^'(.*)'$/m
588
- hash["dflt_value"] = $1.gsub(/''/, "'")
589
- when /^"(.*)"$/m
590
- hash["dflt_value"] = $1.gsub(/""/, '"')
591
- end
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