Project

General

Profile

Development #57299

stocker un "diff" dans l'historisation, plutôt que l'objet complet

Added by Frédéric Péters 20 days ago. Updated 1 day ago.

Status:
Solution proposée
Priority:
Normal
Target version:
-
Start date:
27 Sep 2021
Due date:
% Done:

0%

Estimated time:
Patch proposed:
Yes
Planning:
No

Description

Dans l'historisation on enregistre l'export XML de l'objet, sauf si ça fait plus d'un Mo, parce que d'expérience ça correspond à des workflows avec des modèles de document intégrés et tout enregistrer systématiquement consomme trop vite l'espace disque de la base de données.

Mais on pourrait imaginer conserver un diff, entre la version en cours et la dernière version "complète", et uniquement de temps en temps (genre quand le diff devient plus gros que la sérialisation intégrale) enregistrer la version intégrale.


Files

History

#1

Updated by Lauréline Guerin 13 days ago

  • Assignee set to Lauréline Guerin
#2

Updated by Lauréline Guerin 12 days ago

proposition

difflib permet de générer un diff avec ndiff, mais qui contient tout (les lignes non modifiées, les modifs), donc forcément plus volumineux que la serialization d'origine, mais à partir duquel en appliquant difflib.restore on peut builder la version qu'on veut.

Mais c'est volumineux

difflib permet aussi de générer un diff plus au format patch (avec juste les modifs) avec , plus intéressant ici. Mais rien pour appliquer ce patch. J'ai fouillé un peu partout et je suis tombée sur https://gist.github.com/noporpoise/16e731849eb1231e86d78f9dfeca3abc que j'ai copié/collé (avec 2/3 adaptations de style)
Ca marchouille.

#3

Updated by Frédéric Péters 1 day ago

        # should we store a snapshot ?
        store_snapshot = False

Comme c'est désormais il devient difficile de capter le moment où ça resterait à False; je pense que le code serait plus clair en inversant,

        store_snapshot = True
        if label is None:
            # compare with patch of latest snapshot
            latest = cls.get_latest(obj.object_type, obj.object_id)
            if latest.patch and patch == latest.patch:
                # the patch is the same as in the previous snapshot
                store_snapshot = False

(il me semble que c'est la situation)

Also available in: Atom PDF