Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 134
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
Version010403Date20211112141106
0.00% covered (danger)
0.00%
0 / 134
0.00% covered (danger)
0.00%
0 / 4
210
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 preSchemaChange
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 changeSchema
0.00% covered (danger)
0.00%
0 / 71
0.00% covered (danger)
0.00%
0 / 1
30
 postSchemaChange
0.00% covered (danger)
0.00%
0 / 59
0.00% covered (danger)
0.00%
0 / 1
56
1<?php
2
3declare(strict_types=1);
4
5namespace OCA\Cospend\Migration;
6
7use Closure;
8use OCP\DB\ISchemaWrapper;
9use OCP\DB\QueryBuilder\IQueryBuilder;
10use OCP\DB\Types;
11use OCP\IDBConnection;
12use OCP\Migration\SimpleMigrationStep;
13use OCP\Migration\IOutput;
14
15class Version010403Date20211112141106 extends SimpleMigrationStep {
16
17    /**
18     * @var boolean
19     */
20    private $shouldCopyCategoryData;
21    /**
22     * @var IDBConnection
23     */
24    private $connection;
25    /**
26     * @var boolean
27     */
28    private $shouldCopyPaymentmodesData;
29
30    public function __construct(IDBConnection $connection) {
31        $this->shouldCopyCategoryData = false;
32        $this->shouldCopyPaymentmodesData = false;
33        $this->connection = $connection;
34    }
35
36    /**
37     * @param IOutput $output
38     * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
39     * @param array $options
40     */
41    public function preSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
42    }
43
44    /**
45     * @param IOutput $output
46     * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
47     * @param array $options
48     * @return null|ISchemaWrapper
49     */
50    public function changeSchema(IOutput $output, Closure $schemaClosure, array $options) {
51        /** @var ISchemaWrapper $schema */
52        $schema = $schemaClosure();
53        // this happens if we upgrade from 1.4.2 or lower
54        if (!$schema->hasTable('cospend_categories')) {
55            if ($schema->hasTable('cospend_project_categories')) {
56                $this->shouldCopyCategoryData = true;
57            }
58            $table = $schema->createTable('cospend_categories');
59            $table->addColumn('id', Types::INTEGER, [
60                'autoincrement' => true,
61                'notnull' => true,
62            ]);
63            $table->addColumn('projectid', Types::STRING, [
64                'notnull' => true,
65                'length' => 64,
66            ]);
67            $table->addColumn('name', Types::STRING, [
68                'notnull' => false,
69                'length' => 300,
70                'default' => null,
71            ]);
72            $table->addColumn('color', Types::STRING, [
73                'notnull' => false,
74                'length' => 10,
75                'default' => null,
76            ]);
77            $table->addColumn('encoded_icon', Types::STRING, [
78                'notnull' => false,
79                'length' => 64,
80                'default' => null,
81            ]);
82            $table->addColumn('order', Types::INTEGER, [
83                'notnull' => true,
84                'default' => 0,
85            ]);
86            $table->setPrimaryKey(['id']);
87        }
88        if (!$schema->hasTable('cospend_paymentmodes')) {
89            if ($schema->hasTable('cospend_project_paymentmodes')) {
90                $this->shouldCopyPaymentmodesData = true;
91            }
92            $table = $schema->createTable('cospend_paymentmodes');
93            $table->addColumn('id', Types::INTEGER, [
94                'autoincrement' => true,
95                'notnull' => true,
96            ]);
97            $table->addColumn('old_id', Types::STRING, [
98                'notnull' => false,
99                'length' => 1,
100                'default' => null,
101            ]);
102            $table->addColumn('projectid', Types::STRING, [
103                'notnull' => true,
104                'length' => 64,
105            ]);
106            $table->addColumn('name', Types::STRING, [
107                'notnull' => false,
108                'length' => 300,
109                'default' => null,
110            ]);
111            $table->addColumn('color', Types::STRING, [
112                'notnull' => false,
113                'length' => 10,
114                'default' => null,
115            ]);
116            $table->addColumn('encoded_icon', Types::STRING, [
117                'notnull' => false,
118                'length' => 64,
119                'default' => null,
120            ]);
121            $table->addColumn('order', Types::INTEGER, [
122                'notnull' => true,
123                'default' => 0,
124            ]);
125            $table->setPrimaryKey(['id']);
126        }
127        return $schema;
128    }
129
130    /**
131     * @param IOutput $output
132     * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
133     * @param array $options
134     */
135    public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
136        $qb = $this->connection->getQueryBuilder();
137
138        if ($this->shouldCopyCategoryData) {
139            $categories = [];
140            $qb->select('id', 'name', 'projectid', 'encoded_icon', 'color', 'order')
141                ->from('cospend_project_categories');
142            $req = $qb->executeQuery();
143
144            while ($row = $req->fetch()) {
145                $categories[] = [
146                    'id' => $row['id'],
147                    'name' => $row['name'],
148                    'projectid' => $row['projectid'],
149                    'encoded_icon' => $row['encoded_icon'],
150                    'color' => $row['color'],
151                    'order' => $row['order'],
152                ];
153            }
154            $req->closeCursor();
155            $qb = $qb->resetQueryParts();
156
157            foreach ($categories as $cat) {
158                $qb->insert('cospend_categories')
159                    ->values([
160                        'id' => $qb->createNamedParameter($cat['id'], IQueryBuilder::PARAM_INT),
161                        'projectid' => $qb->createNamedParameter($cat['projectid'], IQueryBuilder::PARAM_STR),
162                        'encoded_icon' => $qb->createNamedParameter($cat['encoded_icon'], IQueryBuilder::PARAM_STR),
163                        'color' => $qb->createNamedParameter($cat['color'], IQueryBuilder::PARAM_STR),
164                        'name' => $qb->createNamedParameter($cat['name'], IQueryBuilder::PARAM_STR),
165                        'order' => $qb->createNamedParameter($cat['order'], IQueryBuilder::PARAM_INT),
166                    ]);
167                $qb->executeStatement();
168                $qb->resetQueryParts();
169            }
170        }
171
172        if ($this->shouldCopyPaymentmodesData) {
173            $pms = [];
174            $qb->select('id', 'old_id', 'name', 'projectid', 'encoded_icon', 'color', 'order')
175                ->from('cospend_project_paymentmodes');
176            $req = $qb->executeQuery();
177
178            while ($row = $req->fetch()) {
179                $pms[] = [
180                    'id' => $row['id'],
181                    'old_id' => $row['old_id'],
182                    'name' => $row['name'],
183                    'projectid' => $row['projectid'],
184                    'encoded_icon' => $row['encoded_icon'],
185                    'color' => $row['color'],
186                    'order' => $row['order'],
187                ];
188            }
189            $req->closeCursor();
190            $qb = $qb->resetQueryParts();
191
192            foreach ($pms as $pm) {
193                $qb->insert('cospend_paymentmodes')
194                    ->values([
195                        'id' => $qb->createNamedParameter($pm['id'], IQueryBuilder::PARAM_INT),
196                        'old_id' => $qb->createNamedParameter($pm['old_id'], IQueryBuilder::PARAM_STR),
197                        'projectid' => $qb->createNamedParameter($pm['projectid'], IQueryBuilder::PARAM_STR),
198                        'encoded_icon' => $qb->createNamedParameter($pm['encoded_icon'], IQueryBuilder::PARAM_STR),
199                        'color' => $qb->createNamedParameter($pm['color'], IQueryBuilder::PARAM_STR),
200                        'name' => $qb->createNamedParameter($pm['name'], IQueryBuilder::PARAM_STR),
201                        'order' => $qb->createNamedParameter($pm['order'], IQueryBuilder::PARAM_INT),
202                    ]);
203                $qb->executeStatement();
204                $qb->resetQueryParts();
205            }
206        }
207    }
208}