aim-sqlite3 2.9.6.1.rc1-arm64-darwin

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 (43) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.md +1062 -0
  4. data/CONTRIBUTING.md +130 -0
  5. data/FAQ.md +399 -0
  6. data/INSTALLATION.md +267 -0
  7. data/LICENSE +23 -0
  8. data/README.md +218 -0
  9. data/dependencies.yml +13 -0
  10. data/ext/sqlite3/aggregator.c +314 -0
  11. data/ext/sqlite3/aggregator.h +14 -0
  12. data/ext/sqlite3/backup.c +190 -0
  13. data/ext/sqlite3/backup.h +15 -0
  14. data/ext/sqlite3/database.c +1263 -0
  15. data/ext/sqlite3/database.h +36 -0
  16. data/ext/sqlite3/exception.c +122 -0
  17. data/ext/sqlite3/exception.h +12 -0
  18. data/ext/sqlite3/extconf.rb +299 -0
  19. data/ext/sqlite3/gvl.c +88 -0
  20. data/ext/sqlite3/gvl.h +15 -0
  21. data/ext/sqlite3/sqlite3.c +225 -0
  22. data/ext/sqlite3/sqlite3_ruby.h +49 -0
  23. data/ext/sqlite3/statement.c +755 -0
  24. data/ext/sqlite3/statement.h +17 -0
  25. data/ext/sqlite3/timespec.h +20 -0
  26. data/lib/sqlite3/3.2/sqlite3_native.bundle +0 -0
  27. data/lib/sqlite3/3.3/sqlite3_native.bundle +0 -0
  28. data/lib/sqlite3/3.4/sqlite3_native.bundle +0 -0
  29. data/lib/sqlite3/4.0/sqlite3_native.bundle +0 -0
  30. data/lib/sqlite3/cli.rb +8 -0
  31. data/lib/sqlite3/constants.rb +198 -0
  32. data/lib/sqlite3/database.rb +798 -0
  33. data/lib/sqlite3/errors.rb +88 -0
  34. data/lib/sqlite3/fork_safety.rb +66 -0
  35. data/lib/sqlite3/pragmas.rb +648 -0
  36. data/lib/sqlite3/resultset.rb +96 -0
  37. data/lib/sqlite3/statement.rb +208 -0
  38. data/lib/sqlite3/value.rb +54 -0
  39. data/lib/sqlite3/version.rb +4 -0
  40. data/lib/sqlite3/version_info.rb +17 -0
  41. data/lib/sqlite3.rb +20 -0
  42. data/ports/aarch64-apple-darwin20.2/sqlite3/3.53.2/bin/sqlite3 +0 -0
  43. metadata +105 -0
@@ -0,0 +1,648 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sqlite3/errors"
4
+
5
+ module SQLite3
6
+ # This module is intended for inclusion solely by the Database class. It
7
+ # defines convenience methods for the various pragmas supported by SQLite3.
8
+ #
9
+ # For a detailed description of these pragmas, see the SQLite3 documentation
10
+ # at http://sqlite.org/pragma.html.
11
+ module Pragmas
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
15
+ end
16
+
17
+ # Sets the given pragma to the given boolean value. The value itself
18
+ # may be +true+ or +false+, or any other commonly used string or
19
+ # integer that represents truth.
20
+ def set_boolean_pragma(name, mode)
21
+ case mode
22
+ when String
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
29
+ when true, 1
30
+ mode = "ON"
31
+ when false, 0, nil
32
+ mode = "OFF"
33
+ else
34
+ raise SQLite3::Exception, "unrecognized pragma parameter #{mode.inspect}"
35
+ end
36
+
37
+ execute("PRAGMA #{name}=#{mode}")
38
+ end
39
+
40
+ # Requests the given pragma (and parameters), and if the block is given,
41
+ # each row of the result set will be yielded to it. Otherwise, the results
42
+ # are returned as an array.
43
+ def get_query_pragma(name, *params, &block) # :yields: row
44
+ if params.empty?
45
+ execute("PRAGMA #{name}", &block)
46
+ else
47
+ args = "'" + params.join("','") + "'"
48
+ execute("PRAGMA #{name}( #{args} )", &block)
49
+ end
50
+ end
51
+
52
+ # Return the value of the given pragma.
53
+ def get_enum_pragma(name)
54
+ get_first_value("PRAGMA #{name}")
55
+ end
56
+
57
+ # Set the value of the given pragma to +mode+. The +mode+ parameter must
58
+ # conform to one of the values in the given +enum+ array. Each entry in
59
+ # the array is another array comprised of elements in the enumeration that
60
+ # have duplicate values. See #synchronous, #default_synchronous,
61
+ # #temp_store, and #default_temp_store for usage examples.
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}'")
77
+ end
78
+
79
+ # Returns the value of the given pragma as an integer.
80
+ def get_int_pragma(name)
81
+ get_first_value("PRAGMA #{name}").to_i
82
+ end
83
+
84
+ # Set the value of the given pragma to the integer value of the +value+
85
+ # parameter.
86
+ def set_int_pragma(name, value)
87
+ execute("PRAGMA #{name}=#{value.to_i}")
88
+ end
89
+
90
+ # The enumeration of valid synchronous modes.
91
+ SYNCHRONOUS_MODES = {
92
+ "full" => 2,
93
+ "normal" => 1,
94
+ "off" => 0
95
+ }.freeze
96
+
97
+ # The enumeration of valid temp store modes.
98
+ TEMP_STORE_MODES = {
99
+ "default" => 0,
100
+ "file" => 1,
101
+ "memory" => 2
102
+ }.freeze
103
+
104
+ # The enumeration of valid auto vacuum modes.
105
+ AUTO_VACUUM_MODES = {
106
+ "none" => 0,
107
+ "full" => 1,
108
+ "incremental" => 2
109
+ }.freeze
110
+
111
+ # The list of valid journaling modes.
112
+ JOURNAL_MODES = {
113
+ "delete" => "delete",
114
+ "truncate" => "truncate",
115
+ "persist" => "persist",
116
+ "memory" => "memory",
117
+ "wal" => "wal",
118
+ "off" => "off"
119
+ }.freeze
120
+
121
+ # The list of valid locking modes.
122
+ LOCKING_MODES = {
123
+ "normal" => "normal",
124
+ "exclusive" => "exclusive"
125
+ }.freeze
126
+
127
+ # The list of valid 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
134
+
135
+ # The list of valid WAL checkpoints.
136
+ WAL_CHECKPOINTS = {
137
+ "passive" => "passive",
138
+ "full" => "full",
139
+ "restart" => "restart",
140
+ "truncate" => "truncate"
141
+ }.freeze
142
+
143
+ def application_id
144
+ get_int_pragma "application_id"
145
+ end
146
+
147
+ def application_id=(integer)
148
+ set_int_pragma "application_id", integer
149
+ end
150
+
151
+ def auto_vacuum
152
+ get_enum_pragma "auto_vacuum"
153
+ end
154
+
155
+ def auto_vacuum=(mode)
156
+ set_enum_pragma "auto_vacuum", mode, AUTO_VACUUM_MODES
157
+ end
158
+
159
+ def automatic_index
160
+ get_boolean_pragma "automatic_index"
161
+ end
162
+
163
+ def automatic_index=(mode)
164
+ set_boolean_pragma "automatic_index", mode
165
+ end
166
+
167
+ def busy_timeout
168
+ get_int_pragma "busy_timeout"
169
+ end
170
+
171
+ def busy_timeout=(milliseconds)
172
+ set_int_pragma "busy_timeout", milliseconds
173
+ end
174
+
175
+ def cache_size
176
+ get_int_pragma "cache_size"
177
+ end
178
+
179
+ def cache_size=(size)
180
+ set_int_pragma "cache_size", size
181
+ end
182
+
183
+ def cache_spill
184
+ get_boolean_pragma "cache_spill"
185
+ end
186
+
187
+ def cache_spill=(mode)
188
+ set_boolean_pragma "cache_spill", mode
189
+ end
190
+
191
+ def case_sensitive_like=(mode)
192
+ set_boolean_pragma "case_sensitive_like", mode
193
+ end
194
+
195
+ def cell_size_check
196
+ get_boolean_pragma "cell_size_check"
197
+ end
198
+
199
+ def cell_size_check=(mode)
200
+ set_boolean_pragma "cell_size_check", mode
201
+ end
202
+
203
+ def checkpoint_fullfsync
204
+ get_boolean_pragma "checkpoint_fullfsync"
205
+ end
206
+
207
+ def checkpoint_fullfsync=(mode)
208
+ set_boolean_pragma "checkpoint_fullfsync", mode
209
+ end
210
+
211
+ def collation_list(&block) # :yields: row
212
+ get_query_pragma "collation_list", &block
213
+ end
214
+
215
+ def compile_options(&block) # :yields: row
216
+ get_query_pragma "compile_options", &block
217
+ end
218
+
219
+ def count_changes
220
+ get_boolean_pragma "count_changes"
221
+ end
222
+
223
+ def count_changes=(mode)
224
+ set_boolean_pragma "count_changes", mode
225
+ end
226
+
227
+ def data_version
228
+ get_int_pragma "data_version"
229
+ end
230
+
231
+ def database_list(&block) # :yields: row
232
+ get_query_pragma "database_list", &block
233
+ end
234
+
235
+ def default_cache_size
236
+ get_int_pragma "default_cache_size"
237
+ end
238
+
239
+ def default_cache_size=(size)
240
+ set_int_pragma "default_cache_size", size
241
+ end
242
+
243
+ def default_synchronous
244
+ get_enum_pragma "default_synchronous"
245
+ end
246
+
247
+ def default_synchronous=(mode)
248
+ set_enum_pragma "default_synchronous", mode, SYNCHRONOUS_MODES
249
+ end
250
+
251
+ def default_temp_store
252
+ get_enum_pragma "default_temp_store"
253
+ end
254
+
255
+ def default_temp_store=(mode)
256
+ set_enum_pragma "default_temp_store", mode, TEMP_STORE_MODES
257
+ end
258
+
259
+ def defer_foreign_keys
260
+ get_boolean_pragma "defer_foreign_keys"
261
+ end
262
+
263
+ def defer_foreign_keys=(mode)
264
+ set_boolean_pragma "defer_foreign_keys", mode
265
+ end
266
+
267
+ def encoding
268
+ get_enum_pragma "encoding"
269
+ end
270
+
271
+ def encoding=(mode)
272
+ set_string_pragma "encoding", mode, ENCODINGS
273
+ end
274
+
275
+ def foreign_key_check(*table, &block) # :yields: row
276
+ get_query_pragma "foreign_key_check", *table, &block
277
+ end
278
+
279
+ def foreign_key_list(table, &block) # :yields: row
280
+ get_query_pragma "foreign_key_list", table, &block
281
+ end
282
+
283
+ def foreign_keys
284
+ get_boolean_pragma "foreign_keys"
285
+ end
286
+
287
+ def foreign_keys=(mode)
288
+ set_boolean_pragma "foreign_keys", mode
289
+ end
290
+
291
+ def freelist_count
292
+ get_int_pragma "freelist_count"
293
+ end
294
+
295
+ def full_column_names
296
+ get_boolean_pragma "full_column_names"
297
+ end
298
+
299
+ def full_column_names=(mode)
300
+ set_boolean_pragma "full_column_names", mode
301
+ end
302
+
303
+ def fullfsync
304
+ get_boolean_pragma "fullfsync"
305
+ end
306
+
307
+ def fullfsync=(mode)
308
+ set_boolean_pragma "fullfsync", mode
309
+ end
310
+
311
+ def ignore_check_constraints=(mode)
312
+ set_boolean_pragma "ignore_check_constraints", mode
313
+ end
314
+
315
+ def incremental_vacuum(pages, &block) # :yields: row
316
+ get_query_pragma "incremental_vacuum", pages, &block
317
+ end
318
+
319
+ def index_info(index, &block) # :yields: row
320
+ get_query_pragma "index_info", index, &block
321
+ end
322
+
323
+ def index_list(table, &block) # :yields: row
324
+ get_query_pragma "index_list", table, &block
325
+ end
326
+
327
+ def index_xinfo(index, &block) # :yields: row
328
+ get_query_pragma "index_xinfo", index, &block
329
+ end
330
+
331
+ def integrity_check(*num_errors, &block) # :yields: row
332
+ get_query_pragma "integrity_check", *num_errors, &block
333
+ end
334
+
335
+ def journal_mode
336
+ get_enum_pragma "journal_mode"
337
+ end
338
+
339
+ def journal_mode=(mode)
340
+ set_string_pragma "journal_mode", mode, JOURNAL_MODES
341
+ end
342
+
343
+ def journal_size_limit
344
+ get_int_pragma "journal_size_limit"
345
+ end
346
+
347
+ def journal_size_limit=(size)
348
+ set_int_pragma "journal_size_limit", size
349
+ end
350
+
351
+ def legacy_file_format
352
+ get_boolean_pragma "legacy_file_format"
353
+ end
354
+
355
+ def legacy_file_format=(mode)
356
+ set_boolean_pragma "legacy_file_format", mode
357
+ end
358
+
359
+ def locking_mode
360
+ get_enum_pragma "locking_mode"
361
+ end
362
+
363
+ def locking_mode=(mode)
364
+ set_string_pragma "locking_mode", mode, LOCKING_MODES
365
+ end
366
+
367
+ def max_page_count
368
+ get_int_pragma "max_page_count"
369
+ end
370
+
371
+ def max_page_count=(size)
372
+ set_int_pragma "max_page_count", size
373
+ end
374
+
375
+ def mmap_size
376
+ get_int_pragma "mmap_size"
377
+ end
378
+
379
+ def mmap_size=(size)
380
+ set_int_pragma "mmap_size", size
381
+ end
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
+
397
+ def page_count
398
+ get_int_pragma "page_count"
399
+ end
400
+
401
+ def page_size
402
+ get_int_pragma "page_size"
403
+ end
404
+
405
+ def page_size=(size)
406
+ set_int_pragma "page_size", size
407
+ end
408
+
409
+ def parser_trace=(mode)
410
+ set_boolean_pragma "parser_trace", mode
411
+ end
412
+
413
+ def query_only
414
+ get_boolean_pragma "query_only"
415
+ end
416
+
417
+ def query_only=(mode)
418
+ set_boolean_pragma "query_only", mode
419
+ end
420
+
421
+ def quick_check(*num_errors, &block) # :yields: row
422
+ get_query_pragma "quick_check", *num_errors, &block
423
+ end
424
+
425
+ def read_uncommitted
426
+ get_boolean_pragma "read_uncommitted"
427
+ end
428
+
429
+ def read_uncommitted=(mode)
430
+ set_boolean_pragma "read_uncommitted", mode
431
+ end
432
+
433
+ def recursive_triggers
434
+ get_boolean_pragma "recursive_triggers"
435
+ end
436
+
437
+ def recursive_triggers=(mode)
438
+ set_boolean_pragma "recursive_triggers", mode
439
+ end
440
+
441
+ def reverse_unordered_selects
442
+ get_boolean_pragma "reverse_unordered_selects"
443
+ end
444
+
445
+ def reverse_unordered_selects=(mode)
446
+ set_boolean_pragma "reverse_unordered_selects", mode
447
+ end
448
+
449
+ def schema_cookie
450
+ get_int_pragma "schema_cookie"
451
+ end
452
+
453
+ def schema_cookie=(cookie)
454
+ set_int_pragma "schema_cookie", cookie
455
+ end
456
+
457
+ def schema_version
458
+ get_int_pragma "schema_version"
459
+ end
460
+
461
+ def schema_version=(version)
462
+ set_int_pragma "schema_version", version
463
+ end
464
+
465
+ def secure_delete
466
+ get_boolean_pragma "secure_delete"
467
+ end
468
+
469
+ def secure_delete=(mode)
470
+ set_boolean_pragma "secure_delete", mode
471
+ end
472
+
473
+ def short_column_names
474
+ get_boolean_pragma "short_column_names"
475
+ end
476
+
477
+ def short_column_names=(mode)
478
+ set_boolean_pragma "short_column_names", mode
479
+ end
480
+
481
+ def shrink_memory
482
+ execute("PRAGMA shrink_memory")
483
+ end
484
+
485
+ def soft_heap_limit
486
+ get_int_pragma "soft_heap_limit"
487
+ end
488
+
489
+ def soft_heap_limit=(mode)
490
+ set_int_pragma "soft_heap_limit", mode
491
+ end
492
+
493
+ def stats(&block) # :yields: row
494
+ get_query_pragma "stats", &block
495
+ end
496
+
497
+ def synchronous
498
+ get_enum_pragma "synchronous"
499
+ end
500
+
501
+ def synchronous=(mode)
502
+ set_enum_pragma "synchronous", mode, SYNCHRONOUS_MODES
503
+ end
504
+
505
+ def temp_store
506
+ get_enum_pragma "temp_store"
507
+ end
508
+
509
+ def temp_store=(mode)
510
+ set_enum_pragma "temp_store", mode, TEMP_STORE_MODES
511
+ end
512
+
513
+ def threads
514
+ get_int_pragma "threads"
515
+ end
516
+
517
+ def threads=(count)
518
+ set_int_pragma "threads", count
519
+ end
520
+
521
+ def user_cookie
522
+ get_int_pragma "user_cookie"
523
+ end
524
+
525
+ def user_cookie=(cookie)
526
+ set_int_pragma "user_cookie", cookie
527
+ end
528
+
529
+ def user_version
530
+ get_int_pragma "user_version"
531
+ end
532
+
533
+ def user_version=(version)
534
+ set_int_pragma "user_version", version
535
+ end
536
+
537
+ def vdbe_addoptrace=(mode)
538
+ set_boolean_pragma "vdbe_addoptrace", mode
539
+ end
540
+
541
+ def vdbe_debug=(mode)
542
+ set_boolean_pragma "vdbe_debug", mode
543
+ end
544
+
545
+ def vdbe_listing=(mode)
546
+ set_boolean_pragma "vdbe_listing", mode
547
+ end
548
+
549
+ def vdbe_trace
550
+ get_boolean_pragma "vdbe_trace"
551
+ end
552
+
553
+ def vdbe_trace=(mode)
554
+ set_boolean_pragma "vdbe_trace", mode
555
+ end
556
+
557
+ def wal_autocheckpoint
558
+ get_int_pragma "wal_autocheckpoint"
559
+ end
560
+
561
+ def wal_autocheckpoint=(mode)
562
+ set_int_pragma "wal_autocheckpoint", mode
563
+ end
564
+
565
+ def wal_checkpoint
566
+ get_enum_pragma "wal_checkpoint"
567
+ end
568
+
569
+ def wal_checkpoint=(mode)
570
+ set_string_pragma "wal_checkpoint", mode, WAL_CHECKPOINTS
571
+ end
572
+
573
+ def writable_schema=(mode)
574
+ set_boolean_pragma "writable_schema", mode
575
+ end
576
+
577
+ ###
578
+ # Returns information about +table+. Yields each row of table information
579
+ # if a block is provided.
580
+ def table_info table
581
+ stmt = prepare "PRAGMA table_info(#{table})"
582
+ columns = stmt.columns
583
+
584
+ needs_tweak_default =
585
+ version_compare(SQLite3.libversion.to_s, "3.3.7") > 0
586
+
587
+ result = [] unless block_given?
588
+ stmt.each do |row|
589
+ new_row = columns.zip(row).to_h
590
+
591
+ tweak_default(new_row) if needs_tweak_default
592
+
593
+ # Ensure the type value is downcased. On Mac and Windows
594
+ # platforms this value is now being returned as all upper
595
+ # case.
596
+ if new_row["type"]
597
+ new_row["type"] = new_row["type"].downcase
598
+ end
599
+
600
+ if block_given?
601
+ yield new_row
602
+ else
603
+ result << new_row
604
+ end
605
+ end
606
+ stmt.close
607
+
608
+ result
609
+ end
610
+
611
+ private
612
+
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
630
+ 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('""', '"')
645
+ end
646
+ end
647
+ end
648
+ end