File: maint.py

package info (click to toggle)
0ad 0.0.23.1-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 78,292 kB
  • sloc: cpp: 245,166; ansic: 200,249; python: 13,754; sh: 6,104; perl: 4,620; makefile: 977; xml: 810; java: 533; ruby: 229; erlang: 46; pascal: 30; sql: 21; tcl: 4
file content (84 lines) | stat: -rw-r--r-- 3,471 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from userreport.models import UserReport_hwdetect, GraphicsDevice, GraphicsExtension, GraphicsLimit
from django.db import connection, transaction

def collect_graphics():
    reports = UserReport_hwdetect.objects.filter(data_type = 'hwdetect', data_version__gte = 3)

    print "Gathering data"
    count = 0

    devices = {}
    for report in reports:
        device = report.gl_device_identifier()
        vendor = report.gl_vendor()
        renderer = report.gl_renderer()
        os = report.os()
        driver = report.gl_driver()
        exts = report.gl_extensions()
        limits = report.gl_limits()
        report.clear_cache()

        devices.setdefault(
            (device, vendor, renderer, os, driver, exts, tuple(sorted(limits.items()))),
            set()
        ).add(report.user_id_hash)

        count += 1
        if count % 100 == 0:
            print "%d / %d..." % (count, len(reports))

    print "Saving data"
    count = 0

    cursor = connection.cursor()

    # To get atomic behaviour, construct new tables and then rename them into place at the end
    try:
        cursor.execute('DROP TABLE IF EXISTS userreport_graphicsdevice_temp, userreport_graphicsextension_temp, userreport_graphicslimit_temp')
    except Warning:
        pass # ignore harmless warnings when tables don't exist
    cursor.execute('CREATE TABLE userreport_graphicsdevice_temp LIKE userreport_graphicsdevice')
    cursor.execute('CREATE TABLE userreport_graphicsextension_temp LIKE userreport_graphicsextension')
    cursor.execute('CREATE TABLE userreport_graphicslimit_temp LIKE userreport_graphicslimit')

    for (device, vendor, renderer, os, driver, exts, limits), users in devices.items():
        cursor.execute('''
            INSERT INTO userreport_graphicsdevice_temp (id, device_name, vendor, renderer, os, driver, usercount)
            VALUES (NULL, %s, %s, %s, %s, %s, %s)
        ''', (device, vendor, renderer, os, driver, len(users)))

        device_id = cursor.lastrowid

        if len(exts):
            ext_placeholders = ','.join('(NULL, %s, %s)' for ext in exts)
            ext_values = sum(([device_id, ext] for ext in exts), [])
            cursor.execute('INSERT INTO userreport_graphicsextension_temp (id, device_id, name) VALUES %s' % ext_placeholders, ext_values)

        if len(limits):
            limit_placeholders = ','.join('(NULL, %s, %s, %s)' for limit in limits)
            limit_values = sum(([device_id, name, str(value)] for name,value in limits), [])
            cursor.execute('INSERT INTO userreport_graphicslimit_temp (id, device_id, name, value) VALUES %s' % limit_placeholders, limit_values)

        count += 1
        if count % 100 == 0:
            print "%d / %d..." % (count, len(devices))

    cursor.execute('''
        RENAME TABLE
        userreport_graphicsdevice TO userreport_graphicsdevice_old,
        userreport_graphicsextension TO userreport_graphicsextension_old,
        userreport_graphicslimit TO userreport_graphicslimit_old,
        userreport_graphicsdevice_temp TO userreport_graphicsdevice,
        userreport_graphicsextension_temp TO userreport_graphicsextension,
        userreport_graphicslimit_temp TO userreport_graphicslimit
    ''')
    cursor.execute('''
        DROP TABLE IF EXISTS
        userreport_graphicsdevice_old,
        userreport_graphicsextension_old,
        userreport_graphicslimit_old
    ''')

    transaction.commit_unless_managed()

    print "Finished"