Skip to content

Commit ad5a5a9

Browse files
committed
Match sqlite initialization to default AR settings
1 parent dd88207 commit ad5a5a9

File tree

2 files changed

+45
-8
lines changed

2 files changed

+45
-8
lines changed

lib/arjdbc/abstract/database_statements.rb

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,7 @@ def execute(sql, name = nil, async: false, allow_retry: false, materialize_trans
8787

8888
mark_transaction_written_if_write(sql)
8989

90-
log(sql, name, async: async) do
91-
with_raw_connection(allow_retry: allow_retry, materialize_transactions: materialize_transactions) do |conn|
92-
conn.execute(sql)
93-
end
94-
end
90+
raw_execute(sql, name, async: async, allow_retry: allow_retry, materialize_transactions: materialize_transactions)
9591
end
9692

9793
# overridden to support legacy binds
@@ -108,6 +104,16 @@ def convert_legacy_binds_to_attributes(binds)
108104
end
109105
end
110106

107+
def raw_execute(sql, name, async: false, allow_retry: false, materialize_transactions: false)
108+
log(sql, name, async: async) do
109+
with_raw_connection(allow_retry: allow_retry, materialize_transactions: materialize_transactions) do |conn|
110+
# We sometimes return an ActiveRecord::Result and sometimes a raw, so force to raw
111+
result = conn.execute(sql)
112+
result.is_a?(ActiveRecord::Result) ? result.to_a : result
113+
end
114+
end
115+
end
116+
111117
end
112118
end
113119
end

lib/arjdbc/sqlite3/adapter.rb

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -693,10 +693,41 @@ def connect
693693
end
694694

695695
def configure_connection
696-
# FIXME: missing from adapter
697-
# @connection.busy_timeout(self.class.type_cast_config_to_integer(@config[:timeout])) if @config[:timeout]
696+
if @config[:timeout] && @config[:retries]
697+
raise ArgumentError, "Cannot specify both timeout and retries arguments"
698+
elsif @config[:timeout]
699+
# FIXME: missing from adapter
700+
# @raw_connection.busy_timeout(self.class.type_cast_config_to_integer(@config[:timeout]))
701+
elsif @config[:retries]
702+
retries = self.class.type_cast_config_to_integer(@config[:retries])
703+
raw_connection.busy_handler do |count|
704+
count <= retries
705+
end
706+
end
698707

699-
execute("PRAGMA foreign_keys = ON", "SCHEMA")
708+
# Enforce foreign key constraints
709+
# https://www.sqlite.org/pragma.html#pragma_foreign_keys
710+
# https://www.sqlite.org/foreignkeys.html
711+
raw_execute("PRAGMA foreign_keys = ON", "SCHEMA")
712+
unless @memory_database
713+
# Journal mode WAL allows for greater concurrency (many readers + one writer)
714+
# https://www.sqlite.org/pragma.html#pragma_journal_mode
715+
raw_execute("PRAGMA journal_mode = WAL", "SCHEMA")
716+
# Set more relaxed level of database durability
717+
# 2 = "FULL" (sync on every write), 1 = "NORMAL" (sync every 1000 written pages) and 0 = "NONE"
718+
# https://www.sqlite.org/pragma.html#pragma_synchronous
719+
raw_execute("PRAGMA synchronous = NORMAL", "SCHEMA")
720+
# Set the global memory map so all processes can share some data
721+
# https://www.sqlite.org/pragma.html#pragma_mmap_size
722+
# https://www.sqlite.org/mmap.html
723+
raw_execute("PRAGMA mmap_size = #{128.megabytes}", "SCHEMA")
724+
end
725+
# Impose a limit on the WAL file to prevent unlimited growth
726+
# https://www.sqlite.org/pragma.html#pragma_journal_size_limit
727+
raw_execute("PRAGMA journal_size_limit = #{64.megabytes}", "SCHEMA")
728+
# Set the local connection cache to 2000 pages
729+
# https://www.sqlite.org/pragma.html#pragma_cache_size
730+
raw_execute("PRAGMA cache_size = 2000", "SCHEMA")
700731
end
701732

702733
end

0 commit comments

Comments
 (0)