Passed
Push — master ( 952c0a...1807d7 )
by Marcel
07:54 queued 01:08
created

DataloadMapper::copy()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 24
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 20
nc 2
nop 1
dl 0
loc 24
rs 9.6
c 0
b 0
f 0
1
<?php
2
/**
3
 * Analytics
4
 *
5
 * This file is licensed under the Affero General Public License version 3 or
6
 * later. See the LICENSE.md file.
7
 *
8
 * @author Marcel Scherello <[email protected]>
9
 * @copyright 2019-2022 Marcel Scherello
10
 */
11
12
namespace OCA\Analytics\Db;
13
14
use OCP\DB\Exception;
0 ignored issues
show
Bug introduced by
The type OCP\DB\Exception was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
15
use OCP\IDBConnection;
0 ignored issues
show
Bug introduced by
The type OCP\IDBConnection was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
16
use Psr\Log\LoggerInterface;
0 ignored issues
show
Bug introduced by
The type Psr\Log\LoggerInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
17
18
class DataloadMapper
19
{
20
    private $userId;
21
    private $db;
22
    private $logger;
23
    const TABLE_NAME = 'analytics_dataload';
24
25
    public function __construct(
26
        $userId,
27
        IDBConnection $db,
28
        LoggerInterface $logger
29
    )
30
    {
31
        $this->userId = $userId;
32
        $this->db = $db;
33
        $this->logger = $logger;
34
        self::TABLE_NAME;
35
    }
36
37
    public function beginTransaction()
38
    {
39
        $this->db->beginTransaction();
40
    }
41
42
    public function commit()
43
    {
44
        $this->db->commit();
45
    }
46
47
    public function rollBack()
48
    {
49
        $this->db->rollBack();
50
    }
51
52
    /**
53
     * create a new dataload
54
     *
55
     * @NoAdminRequired
56
     * @param int $datasetId
57
     * @param int $datasourceId
58
     * @return integer
59
     * @throws \OCP\DB\Exception
60
     */
61
    public function create(int $datasetId, int $datasourceId)
62
    {
63
        $sql = $this->db->getQueryBuilder();
64
        $sql->insert(self::TABLE_NAME)
65
            ->values([
66
                'user_id' => $sql->createNamedParameter($this->userId),
67
                'name' => $sql->createNamedParameter('New'),
68
                'dataset' => $sql->createNamedParameter($datasetId),
69
                'datasource' => $sql->createNamedParameter($datasourceId),
70
                'option' => $sql->createNamedParameter('{}'),
71
            ]);
72
        $sql->executeStatement();
73
        return (int)$sql->getLastInsertId();
74
    }
75
76
    /**
77
     * get all data loads for a dataset
78
     *
79
     * @NoAdminRequired
80
     * @param int $datasetId
81
     * @return array
82
     */
83
    public function read(int $datasetId)
84
    {
85
        $sql = $this->db->getQueryBuilder();
86
        $sql->from(self::TABLE_NAME)
87
            ->select('*')
88
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
89
            ->andWhere($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId)));
90
        $statement = $sql->executeQuery();
91
        $result = $statement->fetchAll();
92
        $statement->closeCursor();
93
        return $result;
94
    }
95
96
    public function getAllDataloadMetadata()
97
    {
98
        $sql = $this->db->getQueryBuilder();
99
        $sql->from(self::TABLE_NAME)
100
            ->select('dataset')
101
            ->selectAlias($sql->func()->count('id'), 'dataloads')
102
            ->selectAlias($sql->func()->max('schedule'), 'schedules')
103
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
104
            ->addgroupBy('dataset');
105
        $statement = $sql->executeQuery();
106
        $result = $statement->fetchAll();
107
        $statement->closeCursor();
108
        return $result;
109
    }
110
111
    /**
112
     * get all data load & schedule metadata
113
     *
114
     * @NoAdminRequired
115
     * @param $schedule
116
     * @return array
117
     */
118
    public function getDataloadBySchedule($schedule)
119
    {
120
        $sql = $this->db->getQueryBuilder();
121
        $sql->from(self::TABLE_NAME)
122
            ->select('*')
123
            ->where($sql->expr()->eq('schedule', $sql->createNamedParameter($schedule)));
124
        $statement = $sql->executeQuery();
125
        $result = $statement->fetchAll();
126
        $statement->closeCursor();
127
        return $result;
128
    }
129
130
    /**
131
     * update dataload
132
     *
133
     * @NoAdminRequired
134
     * @param int $dataloadId
135
     * @param $name
136
     * @param $option
137
     * @param $schedule
138
     * @return bool
139
     */
140
    public function update(int $dataloadId, $name, $option, $schedule)
141
    {
142
        $name = $this->truncate($name, 64);
143
        $sql = $this->db->getQueryBuilder();
144
        $sql->update(self::TABLE_NAME)
145
            ->set('name', $sql->createNamedParameter($name))
146
            ->set('option', $sql->createNamedParameter($option))
147
            ->set('schedule', $sql->createNamedParameter($schedule))
148
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
149
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($dataloadId)));
150
        $sql->executeStatement();
151
        return true;
152
    }
153
154
    /**
155
     * copy a data load
156
     *
157
     * @NoAdminRequired
158
     * @param int $dataloadId
159
     * @return bool
160
     * @throws Exception
161
     */
162
    public function copy(int $dataloadId)
163
    {
164
        $sql = $this->db->getQueryBuilder();
165
        $selectSql = $sql->select('*')
166
            ->from(self::TABLE_NAME)
167
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
168
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($dataloadId)));
169
        $statement = $sql->executeQuery($selectSql);
170
        $record = $statement->fetch();
171
172
        if ($record) {
173
            $insertSql = $this->db->getQueryBuilder();
174
            $insertSql->insert(self::TABLE_NAME)
175
                ->values([
176
                    'user_id' => $insertSql->createNamedParameter($this->userId),
177
                    'name' => $insertSql->createNamedParameter($record['name'] . ' (copy)'),
178
                    'dataset' => $insertSql->createNamedParameter($record['dataset']),
179
                    'datasource' => $insertSql->createNamedParameter($record['datasource']),
180
                    'option' => $insertSql->createNamedParameter($record['option']),
181
                ]);
182
            $insertSql->executeStatement();
183
            return true;
184
        } else {
185
            return false;
186
        }
187
    }
188
189
    /**
190
     * delete a dataload
191
     *
192
     * @NoAdminRequired
193
     * @param int $dataloadId
194
     * @return bool
195
     */
196
    public function delete(int $dataloadId)
197
    {
198
        $sql = $this->db->getQueryBuilder();
199
        $sql->delete(self::TABLE_NAME)
200
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
201
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($dataloadId)));
202
        $sql->executeStatement();
203
        return true;
204
    }
205
206
    /**
207
     * delete a dataload
208
     *
209
     * @NoAdminRequired
210
     * @param int $datasetId
211
     * @return bool
212
     */
213
    public function deleteByDataset(int $datasetId)
214
    {
215
        $sql = $this->db->getQueryBuilder();
216
        $sql->delete(self::TABLE_NAME)
217
            ->where($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId)));
218
        $sql->executeStatement();
219
        return true;
220
    }
221
222
    /**
223
     * get data load by id
224
     * @param int $dataloadId
225
     * @return array
226
     */
227
    public function getDataloadById(int $dataloadId)
228
    {
229
        $sql = $this->db->getQueryBuilder();
230
        $sql->from(self::TABLE_NAME)
231
            ->select('*')
232
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($dataloadId)));
233
        $statement = $sql->executeQuery();
234
        $result = $statement->fetch();
235
        $statement->closeCursor();
236
        return $result;
237
    }
238
239
    /**
240
     * truncates fiels do DB-field size
241
     *
242
     * @param $string
243
     * @param $length
244
     * @param $dots
245
     * @return string
246
     */
247
    private function truncate($string, $length, $dots = "...")
248
    {
249
        return (strlen($string) > $length) ? mb_strcut($string, 0, $length - strlen($dots)) . $dots : $string;
250
    }
251
}