|
@@ -533,15 +533,14 @@ class DatabasePool:
|
|
|
if isinstance(self.engine, Sqlite3Engine):
|
|
|
self._unsafe_to_upsert_tables.add("user_directory_search")
|
|
|
|
|
|
- if self.engine.can_native_upsert:
|
|
|
- # Check ASAP (and then later, every 1s) to see if we have finished
|
|
|
- # background updates of tables that aren't safe to update.
|
|
|
- self._clock.call_later(
|
|
|
- 0.0,
|
|
|
- run_as_background_process,
|
|
|
- "upsert_safety_check",
|
|
|
- self._check_safe_to_upsert,
|
|
|
- )
|
|
|
+ # Check ASAP (and then later, every 1s) to see if we have finished
|
|
|
+ # background updates of tables that aren't safe to update.
|
|
|
+ self._clock.call_later(
|
|
|
+ 0.0,
|
|
|
+ run_as_background_process,
|
|
|
+ "upsert_safety_check",
|
|
|
+ self._check_safe_to_upsert,
|
|
|
+ )
|
|
|
|
|
|
def name(self) -> str:
|
|
|
"Return the name of this database"
|
|
@@ -1160,11 +1159,8 @@ class DatabasePool:
|
|
|
attempts = 0
|
|
|
while True:
|
|
|
try:
|
|
|
- # We can autocommit if we are going to use native upserts
|
|
|
- autocommit = (
|
|
|
- self.engine.can_native_upsert
|
|
|
- and table not in self._unsafe_to_upsert_tables
|
|
|
- )
|
|
|
+ # We can autocommit if it is safe to upsert
|
|
|
+ autocommit = table not in self._unsafe_to_upsert_tables
|
|
|
|
|
|
return await self.runInteraction(
|
|
|
desc,
|
|
@@ -1199,7 +1195,7 @@ class DatabasePool:
|
|
|
) -> bool:
|
|
|
"""
|
|
|
Pick the UPSERT method which works best on the platform. Either the
|
|
|
- native one (Pg9.5+, recent SQLites), or fall back to an emulated method.
|
|
|
+ native one (Pg9.5+, SQLite >= 3.24), or fall back to an emulated method.
|
|
|
|
|
|
Args:
|
|
|
txn: The transaction to use.
|
|
@@ -1207,14 +1203,15 @@ class DatabasePool:
|
|
|
keyvalues: The unique key tables and their new values
|
|
|
values: The nonunique columns and their new values
|
|
|
insertion_values: additional key/values to use only when inserting
|
|
|
- lock: True to lock the table when doing the upsert.
|
|
|
+ lock: True to lock the table when doing the upsert. Unused when performing
|
|
|
+ a native upsert.
|
|
|
Returns:
|
|
|
Returns True if a row was inserted or updated (i.e. if `values` is
|
|
|
not empty then this always returns True)
|
|
|
"""
|
|
|
insertion_values = insertion_values or {}
|
|
|
|
|
|
- if self.engine.can_native_upsert and table not in self._unsafe_to_upsert_tables:
|
|
|
+ if table not in self._unsafe_to_upsert_tables:
|
|
|
return self.simple_upsert_txn_native_upsert(
|
|
|
txn, table, keyvalues, values, insertion_values=insertion_values
|
|
|
)
|
|
@@ -1365,14 +1362,12 @@ class DatabasePool:
|
|
|
value_names: The value column names
|
|
|
value_values: A list of each row's value column values.
|
|
|
Ignored if value_names is empty.
|
|
|
- lock: True to lock the table when doing the upsert. Unused if the database engine
|
|
|
- supports native upserts.
|
|
|
+ lock: True to lock the table when doing the upsert. Unused when performing
|
|
|
+ a native upsert.
|
|
|
"""
|
|
|
|
|
|
- # We can autocommit if we are going to use native upserts
|
|
|
- autocommit = (
|
|
|
- self.engine.can_native_upsert and table not in self._unsafe_to_upsert_tables
|
|
|
- )
|
|
|
+ # We can autocommit if it safe to upsert
|
|
|
+ autocommit = table not in self._unsafe_to_upsert_tables
|
|
|
|
|
|
await self.runInteraction(
|
|
|
desc,
|
|
@@ -1406,10 +1401,10 @@ class DatabasePool:
|
|
|
value_names: The value column names
|
|
|
value_values: A list of each row's value column values.
|
|
|
Ignored if value_names is empty.
|
|
|
- lock: True to lock the table when doing the upsert. Unused if the database engine
|
|
|
- supports native upserts.
|
|
|
+ lock: True to lock the table when doing the upsert. Unused when performing
|
|
|
+ a native upsert.
|
|
|
"""
|
|
|
- if self.engine.can_native_upsert and table not in self._unsafe_to_upsert_tables:
|
|
|
+ if table not in self._unsafe_to_upsert_tables:
|
|
|
return self.simple_upsert_many_txn_native_upsert(
|
|
|
txn, table, key_names, key_values, value_names, value_values
|
|
|
)
|