X-Git-Url: http://gitweb.pimeys.fr/?a=blobdiff_plain;f=bde%2Fintegrite%2Ffix_integrity.py;fp=bde%2Fintegrite%2Ffix_integrity.py;h=932460000dcc77d036ce91cd8bc687bd3cb08575;hb=918f150099bd27adbae3dab6a208e6a188cdb514;hp=0000000000000000000000000000000000000000;hpb=249c4ceb0ec65b63ae0e7292066e2d88517d9e62;p=scripts-20-100.git diff --git a/bde/integrite/fix_integrity.py b/bde/integrite/fix_integrity.py new file mode 100755 index 0000000..9324600 --- /dev/null +++ b/bde/integrite/fix_integrity.py @@ -0,0 +1,51 @@ +#!/usr/bin/python +# -*- coding:utf8 -*- + +""" Codé pour rétablir l'intégrité de la BDD. + + Pour générer des transactions dans le passé + pour les gens qui n'avaient pas commencé avec un solde nul. +""" + +import psycopg2, psycopg2.extras + +con = psycopg2.connect(database="bde", connection_factory=psycopg2.extras.DictConnection) +cur = con.cursor() + +from commands import getstatusoutput as ex +import os +import sys + +req="""SELECT numcbde,pseudo,gagne-perdu as calcul,effectif,effectif-(gagne-perdu) as a_enlever +FROM + (SELECT numcbde,pseudo, + (SELECT COALESCE(sum(montant*quantite), 0) + FROM transactions + WHERE destinataire=main.numcbde AND valide='t') as gagne, + (SELECT COALESCE(sum(montant*quantite), 0) + FROM transactions + WHERE emetteur=main.numcbde AND valide='t') as perdu, + (SELECT solde + FROM adherents WHERE numcbde=main.numcbde) as effectif + FROM adherents as main) +AS calculs +WHERE gagne-perdu!=effectif AND numcbde>0 ORDER BY numcbde;""" + +cur.execute(req) + +l = cur.fetchall() + +f=open("request_fixing.sql", "w") +f.write("ALTER TABLE transactions DISABLE TRIGGER ALL;\n") +for bug in l: + to_credit = bug["effectif"] - bug["calcul"] + if to_credit > 0: + emet, dest = 0, bug["numcbde"] + elif to_credit < 0: + emet, dest = bug["numcbde"], 0 + f.write("INSERT INTO transactions (conso, emetteur, destinataire, montant, quantite, remarque) VALUES (1, %s, %s, %s, 1, 'Solde initial');\n" % (emet, dest, abs(to_credit))) + # En fait à cause des solde négatifs, il faut DISABLE les triggers, donc on n'a pas besoin d'update après + #f.write("UPDATE adherents SET solde=solde - (%s) WHERE numcbde=%s;\n" % (to_credit, bug["numcbde"])) + +f.write("ALTER TABLE transactions ENABLE TRIGGER ALL;\n") +f.close()