Philipp Hörist pushed to branch storage at gajim / gajim


Commits:
b466d4be by Philipp Hörist at 2024-04-07T15:07:10+02:00
imprv: Migration dont fail on duplicated error message

- - - - -
e1b43441 by Philipp Hörist at 2024-04-07T15:07:10+02:00
imprv: Remove unique index on message table

- - - - -


4 changed files:

- gajim/common/modules/message.py
- gajim/common/storage/archive/migration.py
- gajim/common/storage/archive/models.py
- gajim/common/storage/archive/storage.py


Changes:

=====================================
gajim/common/modules/message.py
=====================================
@@ -32,7 +32,6 @@
 from gajim.common.storage.archive.const import ChatDirection
 from gajim.common.storage.archive.const import MessageState
 from gajim.common.storage.archive.const import MessageType
-from gajim.common.storage.base import is_unique_constraint_error
 from gajim.common.storage.base import VALUE_MISSING
 from gajim.common.structs import OutgoingMessage
 
@@ -140,6 +139,13 @@ def _message_received(self,
 
         stanza_id = self._get_stanza_id(properties)
 
+        if (m_type != MessageType.GROUPCHAT and
+                direction == ChatDirection.OUTGOING):
+            if app.storage.archive.check_if_duplicate(
+                    self._account, remote_jid, message_id):
+                self._log.info('Duplicated message received: %s', message_id)
+                return
+
         occupant = None
         if m_type == MessageType.GROUPCHAT:
             if direction == ChatDirection.OUTGOING:
@@ -216,12 +222,7 @@ def _message_received(self,
         try:
             pk = app.storage.archive.insert_object(
                 message_data, ignore_on_conflict=False)
-        except sqlalchemy.exc.IntegrityError as error:
-            if is_unique_constraint_error(error):
-                self._log.warning('Duplicate found with message id: %s',
-                                  message_id)
-                return
-
+        except sqlalchemy.exc.IntegrityError:
             self._log.exception('Insertion Error')
             return
 


=====================================
gajim/common/storage/archive/migration.py
=====================================
@@ -32,6 +32,7 @@
 from gajim.common.storage.archive.const import MessageState
 from gajim.common.storage.archive.const import MessageType
 from gajim.common.storage.base import AlchemyStorage
+from gajim.common.storage.base import is_unique_constraint_error
 
 log = logging.getLogger('gajim.c.storage.archive.migration')
 
@@ -411,7 +412,11 @@ def _insert_error_data(
             'timestamp': timestamp + timedelta(seconds=1),
         }
 
-        conn.execute(sa.insert(mod.MessageError), [error_data])  # pyright: 
ignore
+        try:
+            conn.execute(sa.insert(mod.MessageError), [error_data])  # 
pyright: ignore
+        except IntegrityError as error:
+            if is_unique_constraint_error(error):
+                return
 
     def _insert_encryption_data(
         self, conn: sa.Connection, additional_data: dict[str, Any]


=====================================
gajim/common/storage/archive/models.py
=====================================
@@ -655,15 +655,7 @@ class Message(MappedAsDataclass, Base, UtilMixin, 
kw_only=True):
 
     __table_args__ = (
         Index(
-            'idx_message', 'fk_remote_pk', 'fk_account_pk', sa.text('timestamp 
DESC')
-        ),
-        Index(
-            'idx_message_id_outgoing_unique',
-            'id',
-            'fk_remote_pk',
-            'fk_account_pk',
-            unique=True,
-            sqlite_where=direction == 2,
+            'idx_message', 'id', 'fk_remote_pk', 'fk_account_pk', 
sa.text('timestamp DESC')
         ),
         Index(
             'idx_stanza_id_unique',


=====================================
gajim/common/storage/archive/storage.py
=====================================
@@ -311,6 +311,20 @@ def _delete_message(self, session: Session, message: 
Message) -> None:
 
         session.delete(message)
 
+    @with_session
+    def check_if_duplicate(self, session: Session, account: str, jid: JID, 
message_id: str) -> bool:
+        fk_account_pk = self._get_account_pk(session, account)
+        fk_remote_pk = self._get_jid_ek(session, jid)
+
+        stmt = (
+            select(Message.id)
+            .where(Message.id == message_id,
+                   Message.fk_remote_pk == fk_remote_pk,
+                   Message.fk_account_pk == fk_account_pk)
+        )
+        res = session.scalars(stmt).first()
+        return res is not None
+
     @with_session
     def get_conversation_jids(self, session: Session, account: str) -> 
Sequence[JID]:
         fk_account_pk = self._get_account_pk(session, account)



View it on GitLab: 
https://dev.gajim.org/gajim/gajim/-/compare/39136ed297665fc16b2e054d20deb9d9c29e657c...e1b434416dd685f0f098d69c18a63993e5d0a016

-- 
View it on GitLab: 
https://dev.gajim.org/gajim/gajim/-/compare/39136ed297665fc16b2e054d20deb9d9c29e657c...e1b434416dd685f0f098d69c18a63993e5d0a016
You're receiving this email because of your account on dev.gajim.org.


_______________________________________________
Commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to