Skip to content

Commit 90937d3

Browse files
authored
Merge pull request #621 from sparklemotion/regression
Try to simplify pragma related constants
2 parents d7e98cd + fde8c22 commit 90937d3

File tree

3 files changed

+80
-15
lines changed

3 files changed

+80
-15
lines changed

lib/sqlite3/database.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ def initialize file, options = {}, zvfs = nil
196196
#
197197
# Fetch the encoding set on this database
198198
def encoding
199-
prepare("PRAGMA encoding") { |stmt| Encoding.find(stmt.first.first) }
199+
Encoding.find super
200200
end
201201

202202
# Installs (or removes) a block that will be invoked for every access

lib/sqlite3/pragmas.rb

+61-14
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,20 @@ def get_enum_pragma(name)
6060
# have duplicate values. See #synchronous, #default_synchronous,
6161
# #temp_store, and #default_temp_store for usage examples.
6262
def set_enum_pragma(name, mode, enums)
63-
match = enums.find { |p| p.find { |i| i.to_s.downcase == mode.to_s.downcase } }
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+
6472
unless match
6573
raise SQLite3::Exception, "unrecognized #{name} #{mode.inspect}"
6674
end
67-
execute("PRAGMA #{name}='#{match.first.upcase}'")
75+
76+
execute("PRAGMA #{name}='#{match}'")
6877
end
6978

7079
# Returns the value of the given pragma as an integer.
@@ -79,26 +88,57 @@ def set_int_pragma(name, value)
7988
end
8089

8190
# The enumeration of valid synchronous modes.
82-
SYNCHRONOUS_MODES = [["full", 2], ["normal", 1], ["off", 0]].map(&:freeze).freeze
91+
SYNCHRONOUS_MODES = {
92+
"full" => 2,
93+
"normal" => 1,
94+
"off" => 0
95+
}.freeze
8396

8497
# The enumeration of valid temp store modes.
85-
TEMP_STORE_MODES = [["default", 0], ["file", 1], ["memory", 2]].map(&:freeze).freeze
98+
TEMP_STORE_MODES = {
99+
"default" => 0,
100+
"file" => 1,
101+
"memory" => 2
102+
}.freeze
86103

87104
# The enumeration of valid auto vacuum modes.
88-
AUTO_VACUUM_MODES = [["none", 0], ["full", 1], ["incremental", 2]].map(&:freeze).freeze
105+
AUTO_VACUUM_MODES = {
106+
"none" => 0,
107+
"full" => 1,
108+
"incremental" => 2
109+
}.freeze
89110

90111
# The list of valid journaling modes.
91-
JOURNAL_MODES = [["delete"], ["truncate"], ["persist"], ["memory"],
92-
["wal"], ["off"]].map(&:freeze).freeze
112+
JOURNAL_MODES = {
113+
"delete" => "delete",
114+
"truncate" => "truncate",
115+
"persist" => "persist",
116+
"memory" => "memory",
117+
"wal" => "wal",
118+
"off" => "off"
119+
}.freeze
93120

94121
# The list of valid locking modes.
95-
LOCKING_MODES = [["normal"], ["exclusive"]].map(&:freeze).freeze
122+
LOCKING_MODES = {
123+
"normal" => "normal",
124+
"exclusive" => "exclusive"
125+
}.freeze
96126

97127
# The list of valid encodings.
98-
ENCODINGS = [["utf-8"], ["utf-16"], ["utf-16le"], ["utf-16be"]].map(&:freeze).freeze
128+
ENCODINGS = {
129+
"utf-8" => "utf-8",
130+
"utf-16" => "utf-16",
131+
"utf-16le" => "utf-16le",
132+
"utf-16be" => "utf-16be"
133+
}.freeze
99134

100135
# The list of valid WAL checkpoints.
101-
WAL_CHECKPOINTS = [["passive"], ["full"], ["restart"], ["truncate"]].map(&:freeze).freeze
136+
WAL_CHECKPOINTS = {
137+
"passive" => "passive",
138+
"full" => "full",
139+
"restart" => "restart",
140+
"truncate" => "truncate"
141+
}.freeze
102142

103143
def application_id
104144
get_int_pragma "application_id"
@@ -229,7 +269,7 @@ def encoding
229269
end
230270

231271
def encoding=(mode)
232-
set_enum_pragma "encoding", mode, ENCODINGS
272+
set_string_pragma "encoding", mode, ENCODINGS
233273
end
234274

235275
def foreign_key_check(*table, &block) # :yields: row
@@ -297,7 +337,7 @@ def journal_mode
297337
end
298338

299339
def journal_mode=(mode)
300-
set_enum_pragma "journal_mode", mode, JOURNAL_MODES
340+
set_string_pragma "journal_mode", mode, JOURNAL_MODES
301341
end
302342

303343
def journal_size_limit
@@ -321,7 +361,7 @@ def locking_mode
321361
end
322362

323363
def locking_mode=(mode)
324-
set_enum_pragma "locking_mode", mode, LOCKING_MODES
364+
set_string_pragma "locking_mode", mode, LOCKING_MODES
325365
end
326366

327367
def max_page_count
@@ -527,7 +567,7 @@ def wal_checkpoint
527567
end
528568

529569
def wal_checkpoint=(mode)
530-
set_enum_pragma "wal_checkpoint", mode, WAL_CHECKPOINTS
570+
set_string_pragma "wal_checkpoint", mode, WAL_CHECKPOINTS
531571
end
532572

533573
def writable_schema=(mode)
@@ -570,6 +610,13 @@ def table_info table
570610

571611
private
572612

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+
573620
# Compares two version strings
574621
def version_compare(v1, v2)
575622
v1 = v1.split(".").map { |i| i.to_i }

test/test_pragmas.rb

+18
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@ def teardown
2727
@db.close
2828
end
2929

30+
def test_temp_store_mode
31+
@db.temp_store = "memory"
32+
assert_equal 2, @db.temp_store
33+
@db.temp_store = 1
34+
assert_equal 1, @db.temp_store
35+
end
36+
37+
def test_encoding
38+
@db.encoding = "utf-16le"
39+
assert_equal Encoding.find("utf-16le"), @db.encoding
40+
end
41+
3042
def test_pragma_errors
3143
assert_raises(SQLite3::Exception) do
3244
@db.set_enum_pragma("foo", "bar", [])
@@ -41,6 +53,12 @@ def test_pragma_errors
4153
end
4254
end
4355

56+
def test_invalid_pragma
57+
assert_raises(SQLite3::Exception) do
58+
@db.journal_mode = 0
59+
end
60+
end
61+
4462
def test_get_boolean_pragma
4563
refute(@db.get_boolean_pragma("read_uncommitted"))
4664
end

0 commit comments

Comments
 (0)