View | Details | Raw Unified | Return to bug 21079
Collapse All | Expand All

(-)a/installer/data/mysql/atomicupdate/bug_21079_map_illrequestattributes.perl (-1 / +94 lines)
Line 0 Link Here
0
- 
1
use Try::Tiny;
2
$DBversion = 'XXX';  # will be replaced by the RM
3
if( CheckVersion( $DBversion ) ) {
4
5
    # All attributes we're potentially interested in
6
    my $ff_req = $dbh->selectall_arrayref(
7
        'SELECT a.illrequest_id, a.type, a.value '.
8
        'FROM illrequests_temp r, illrequestattributes_temp a '.
9
        'WHERE r.illrequest_id = a.illrequest_id '.
10
        'AND r.backend = "FreeForm"',
11
        { Slice => {} }
12
    );
13
14
    # Before we go any further, identify whether we've done
15
    # this before, we test for the presence of "container_title"
16
    # We stop as soon as we find one
17
    foreach my $req(@{$ff_req}) {
18
        if ($req->{type} eq 'container_title') {
19
            warn "Upgrade already carried out";
20
        }
21
    }
22
23
    # Transform into a hashref with the key of the request ID
24
    my $requests = {};
25
    foreach my $request(@{$ff_req}) {
26
        my $id = $request->{illrequest_id};
27
        if (!exists $requests->{$id}) {
28
            $requests->{$id} = {};
29
        }
30
        $requests->{$id}->{$request->{type}} = $request->{value};
31
    }
32
33
    # Transform any article requests
34
    my $transformed = {};
35
    foreach my $id(keys %{$requests}) {
36
        if (lc($requests->{$id}->{type}) eq 'article') {
37
            $transformed->{$id} = $requests->{$id};
38
            $transformed->{$id}->{type} = 'article';
39
            $transformed->{$id}->{container_title} = $transformed->{$id}->{title}
40
                if defined $transformed->{$id}->{title} &&
41
                    length $transformed->{$id}->{title} > 0;
42
            $transformed->{$id}->{title} = $transformed->{$id}->{article_title}
43
                if defined $transformed->{$id}->{article_title} &&
44
                    length $transformed->{$id}->{article_title} > 0;
45
            $transformed->{$id}->{author} = $transformed->{$id}->{article_author}
46
                if defined $transformed->{$id}->{article_author} &&
47
                    length $transformed->{$id}->{article_author} > 0;
48
            $transformed->{$id}->{pages} = $transformed->{$id}->{article_pages}
49
                if defined $transformed->{$id}->{article_pages} &&
50
                    length $transformed->{$id}->{article_pages} > 0;
51
        }
52
    }
53
54
    # Now write back the transformed data
55
    # Rather than selectively replace, we just remove all attributes we've
56
    # transformed and re-write them
57
    my @changed = keys %{$transformed};
58
    my $changed_str = join(',', @changed);
59
60
    if (scalar @changed > 0) {
61
        $dbh->{AutoCommit} = 0;
62
        $dbh->{RaiseError} = 1;
63
        try {
64
            my $del = $dbh->do(
65
                "DELETE FROM illrequestattributes_temp ".
66
                "WHERE illrequest_id IN ($changed_str)"
67
            );
68
            foreach my $reqid(keys %{$transformed}) {
69
                my $attr = $transformed->{$reqid};
70
                foreach my $key(keys %{$attr}) {
71
                    my $sth = $dbh->prepare(
72
                        'INSERT INTO illrequestattributes_temp '.
73
                        '(illrequest_id, type, value, readonly) '.
74
                        'VALUES '.
75
                        '(?, ?, ?, ?)'
76
                    );
77
                    $sth->execute(
78
                        $reqid,
79
                        $key,
80
                        $attr->{$key},
81
                        0
82
                    );
83
                }
84
            }
85
            $dbh->commit;
86
        } catch {
87
            warn "Upgrade to $DBversion failed: $_";
88
            eval { $dbh->rollback };
89
        };
90
    }
91
92
    SetVersion( $DBversion );
93
    print "Upgrade to $DBversion done (Bug 21079 - Unify metadata schema across backends)\n";
94
}

Return to bug 21079