diff --git a/pytools/persistent_dict.py b/pytools/persistent_dict.py index 27860dd5587de225550931cbf9e80c3df854d875..7af3e2841250b833e038f8fdc6aa1302ad7308e8 100644 --- a/pytools/persistent_dict.py +++ b/pytools/persistent_dict.py @@ -643,12 +643,22 @@ class WriteOncePersistentDict(_PersistentDictBase[K, V]): keyhash = self.key_builder(key) v = pickle.dumps((key, value)) - try: - self.conn.execute("INSERT INTO dict VALUES (?, ?)", (keyhash, v)) - except sqlite3.IntegrityError: - if not _skip_if_present: - raise ReadOnlyEntryError("WriteOncePersistentDict, " - "tried overwriting key") + if _skip_if_present: + self.conn.execute("INSERT OR IGNORE INTO dict VALUES (?, ?)", + (keyhash, v)) + else: + try: + self.conn.execute("INSERT INTO dict VALUES (?, ?)", (keyhash, v)) + except sqlite3.IntegrityError as e: + if hasattr(e, "sqlite_errorcode"): + if e.sqlite_errorcode == sqlite3.SQLITE_CONSTRAINT_PRIMARYKEY: + raise ReadOnlyEntryError("WriteOncePersistentDict, " + "tried overwriting key") + else: + raise + else: + raise ReadOnlyEntryError("WriteOncePersistentDict, " + "tried overwriting key") def _fetch(self, keyhash: str) -> Tuple[K, V]: # pylint:disable=method-hidden # This method is separate from fetch() to allow for LRU caching