From c05ab2fc0b489322587a1378fb2793ddda1f216e Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 18 Oct 2018 17:54:50 +0200 Subject: [PATCH] reuse older id for open item fields (fixes #25982) --- wcs_olap/feeder.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/wcs_olap/feeder.py b/wcs_olap/feeder.py index 2ef0008..c3c61f5 100644 --- a/wcs_olap/feeder.py +++ b/wcs_olap/feeder.py @@ -611,7 +611,28 @@ class WcsFormdefFeeder(object): vars=(u'evolution des demandes %s' % self.formdef.schema.name,)) def insert_item_value(self, field, value): + '''Generate a new id for the value of an open item field, or user the + older one from an existing table in the previous schema.''' table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname) + + try: + self.ex('SELECT label FROM {schema}.{item_table} WHERE label = %s', vars=[value], + ctx={'item_table': table_name}) + except psycopg2.Error: + pass + else: + # value found in an existing table + try: + old_id = self.cur.fetchone()[0] + self.ex('INSERT INTO {item_table} (id, label) VALUES (%s, %s)', vars=[old_id, value], + ctx={'item_table': table_name}) + sequence_name = table_name[:63 - len('_id_seq')] + '_id_seq' + selx.ex('SELECT SETVAL(%s, (SELECT MAX(id) from {item_table}))', vars=[sequence_name], + ctx={'item_table': table_name}) + return old_id + except IndexError: + pass + # value is unknown, regular case self.ex('INSERT INTO {item_table} (label) VALUES (%s) RETURNING (id)', vars=[value], ctx={'item_table': table_name}) return self.cur.fetchone()[0] -- 2.18.0