Projet

Général

Profil

0001-sql-use-a-for-loop-to-iterate-on-cursors.patch

Benjamin Dauvergne, 06 octobre 2021 09:51

Télécharger (3,38 ko)

Voir les différences:

Subject: [PATCH 1/3] sql: use a for loop to iterate on cursors

cursor.fetchone() disable prefetching by named cursors. It forces one
row at a time iterations and using a while loop is a bizarre idiom for
psycopg2 since cursor are perfectly iterable.
 wcs/sql.py | 36 ++++++++----------------------------
 1 file changed, 8 insertions(+), 28 deletions(-)
wcs/sql.py
1227 1227
            ('wcs\\_view\\_%',),
1228 1228
        )
1229 1229
    view_names = []
1230
    while True:
1231
        row = cur.fetchone()
1232
        if row is None:
1233
            break
1230
    for row in cur:
1234 1231
        view_names.append(row[0])
1235 1232

  
1236 1233
    for view_name in view_names:
......
1357 1354
        ('wcs\\_category\\_%',),
1358 1355
    )
1359 1356
    view_names = []
1360
    while True:
1361
        row = cur.fetchone()
1362
        if row is None:
1363
            break
1357
    for row in cur:
1364 1358
        view_names.append(row[0])
1365 1359

  
1366 1360
    for view_name in view_names:
......
1382 1376
        ('wcs\\_view\\_%',),
1383 1377
    )
1384 1378
    existing_views = set()
1385
    while True:
1386
        row = cur.fetchone()
1387
        if row is None:
1388
            break
1379
    for row in cur:
1389 1380
        existing_views.add(row[0])
1390 1381

  
1391 1382
    view_names = existing_views.intersection(view_names)
......
1482 1473
            parameters['offset'] = offset
1483 1474
        cur.execute(sql_statement, parameters)
1484 1475
        try:
1485
            while True:
1486
                row = cur.fetchone()
1487
                if row is None:
1488
                    break
1476
            for row in cur:
1489 1477
                ob = cls._row2ob(row)
1490 1478
                if ignore_errors and ob is None:
1491 1479
                    continue
......
1611 1599

  
1612 1600
    @classmethod
1613 1601
    def get_objects_iterator(cls, cur, ignore_errors=False, extra_fields=None):
1614
        while True:
1615
            row = cur.fetchone()
1616
            if row is None:
1617
                break
1602
        for row in cur:
1618 1603
            yield cls._row2ob(row, extra_fields=extra_fields)
1619 1604

  
1620 1605
    @classmethod
......
1672 1657
        if cls._iterate_on_server:
1673 1658
            conn = get_connection(isolate=True)
1674 1659
            cur = conn.cursor(name='select_iterator_%s' % uuid.uuid4())
1660
            cur.itersize = 1
1675 1661
        else:
1676 1662
            conn, cur = get_connection_and_cursor()
1677 1663
        cur.execute(sql_statement, parameters)
......
1922 1908
        )
1923 1909
        cur.execute(sql_statement, {'id': self.id})
1924 1910
        self._evolution = []
1925
        while True:
1926
            row = cur.fetchone()
1927
            if row is None:
1928
                break
1911
        for row in cur:
1929 1912
            self._evolution.append(self._row2evo(row, formdata=self))
1930 1913
        conn.commit()
1931 1914
        cur.close()
......
1973 1956
        for value in values:
1974 1957
            value._evolution = []
1975 1958

  
1976
        while True:
1977
            row = cur.fetchone()
1978
            if row is None:
1979
                break
1959
        for row in cur:
1980 1960
            formdata_id = tuple(row[:8])[7]
1981 1961
            formdata = object_dict.get(formdata_id)
1982 1962
            if not formdata:
1983
-