Passed
Push — master ( f938a7...b22424 )
by Webnet
01:39
created

Anonymizer   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 39
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 18
dl 0
loc 39
rs 10
c 0
b 0
f 0
wmc 6

1 Method

Rating   Name   Duplication   Size   Complexity  
A anonymize() 0 31 6
1
<?php
2
3
namespace WebnetFr\DatabaseAnonymizer;
4
5
use Doctrine\DBAL\Connection;
6
use WebnetFr\DatabaseAnonymizer\Exception\InvalidAnonymousValueException;
7
8
/**
9
 * Database anonymizer.
10
 *
11
 * @author Vlad Riabchenko <[email protected]>
12
 */
13
class Anonymizer
14
{
15
    /**
16
     * Anonymize entire database based on target tables.
17
     *
18
     * @param Connection $connection
19
     * @param TargetTable[] $targets
20
     */
21
    public function anonymize(Connection $connection, array $targets)
22
    {
23
        foreach ($targets as $targetTable) {
24
            $allFieldNames = $targetTable->getAllFieldNames();
25
            $pk = $targetTable->getPrimaryKey();
26
27
            // Select all rows form current table:
28
            // SELECT <all target fields> FROM <target table>
29
            $fetchRowsSQL = $connection->createQueryBuilder()
30
                ->select(join(',', $allFieldNames))
31
                ->from($targetTable->getName())
32
                ->getSQL();
33
            $fetchRowsStmt = $connection->prepare($fetchRowsSQL);
34
            $fetchRowsStmt->execute();
35
36
            // Anonymize all rows in current target table.
37
            while ($row = $fetchRowsStmt->fetch()) {
38
                $values = [];
39
                // Anonymize all target fields in current row.
40
                foreach ($targetTable->getTargetFields() as $targetField) {
41
                    $anonValue = $targetField->generate();
42
43
                    if (!is_null($anonValue) && !is_string($anonValue)) {
44
                        throw new InvalidAnonymousValueException('Generated value must be null or string');
45
                    }
46
47
                    // Set anonymized value.
48
                    $values[$targetField->getName()] =  $anonValue;
49
                }
50
51
                $connection->update($targetTable->getName(), $values, [$pk => $row[$pk]]);
52
            }
53
        }
54
    }
55
}
56