Completed
Pull Request — master (#48)
by Dima
02:50
created

AuditDiffTable::removeMatchingColumns()   C

Complexity

Conditions 9
Paths 5

Size

Total Lines 46
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 90

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 46
ccs 0
cts 30
cp 0
rs 5.0942
cc 9
eloc 24
nc 5
nop 0
crap 90
1
<?php
2
//----------------------------------------------------------------------------------------------------------------------
3
namespace SetBased\Audit\MySql;
4
5
use SetBased\Audit\MySql\Helper\DiffTableColumns;
6
use SetBased\Audit\MySql\Metadata\MultiSourceColumnMetadata;
7
use SetBased\Audit\MySql\Metadata\TableColumnsMetadata;
8
use SetBased\Stratum\MySql\StaticDataLayer;
9
10
//----------------------------------------------------------------------------------------------------------------------
11
/**
12
 * Class for executing auditing actions for tables.
13
 */
14
class AuditDiffTable
15
{
16
  //--------------------------------------------------------------------------------------------------------------------
17
  /**
18
   * Audit database schema.
19
   *
20
   * @var string
21
   */
22
  private $auditSchema;
23
24
  /**
25
   * Audit columns from config file
26
   *
27
   * @var \array[]
28
   */
29
  private $configColumns;
30
31
  /**
32
   * Data database schema.
33
   *
34
   * @var string
35
   */
36
  private $dataSchema;
37
38
  /**
39
   * Difference between data and audit tables.
40
   *
41
   * @var DiffTableColumns
42
   */
43
  private $diffColumns;
44
45
  /**
46
   * Table name.
47
   *
48
   * @var string
49
   */
50
  private $tableName;
51
52
  //--------------------------------------------------------------------------------------------------------------------
53
  /**
54
   * Object constructor.
55
   *
56
   * @param string  $dataSchema         Data database schema.
57
   * @param string  $auditSchema        Audit database schema.
58
   * @param string  $tableName          Table name.
59
   * @param array[] $configAuditColumns Audit columns from config file.
60
   * @param array[] $configColumns      Data columns from config file.
61
   */
62
  public function __construct($dataSchema, $auditSchema, $tableName, $configAuditColumns, $configColumns)
63
  {
64
    $this->dataSchema    = $dataSchema;
65
    $this->auditSchema   = $auditSchema;
66
    $this->tableName     = $tableName;
67
    $this->configColumns = array_merge($configAuditColumns, $configColumns);
0 ignored issues
show
Documentation Bug introduced by
It seems like array_merge($configAuditColumns, $configColumns) of type array<integer,array> is incompatible with the declared type array<integer,object<array>> of property $configColumns.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
68
69
    $dataColumns  = new TableColumnsMetadata(AuditDataLayer::getTableColumns($this->dataSchema, $this->tableName));
70
    $auditColumns = AuditDataLayer::getTableColumns($this->auditSchema, $this->tableName);
71
    $auditColumns = $this->addNotNull($auditColumns);
72
    $auditColumns = new TableColumnsMetadata($auditColumns);
73
74
    $this->createDiffArray($dataColumns, $auditColumns);
75
  }
76
77
  //--------------------------------------------------------------------------------------------------------------------
78
  /**
79
   * Return diff columns.
80
   *
81
   * @return TableColumnsMetadata
82
   */
83
  public function getDiffColumns()
84
  {
85
    return $this->diffColumns->getColumns();
86
  }
87
88
  //--------------------------------------------------------------------------------------------------------------------
89
  /**
90
   * Check full and return array without new or obsolete columns if full not set.
91
   *
92
   * @return TableColumnsMetadata
93
   */
94
  public function removeMatchingColumns()
95
  {
96
    $metadata = $this->diffColumns->getColumns();
97
    /** @var MultiSourceColumnMetadata $column */
98
    foreach ($metadata->getColumns() as $columnName => $column)
99
    {
100
      /** @var MultiSourceColumnMetadata $data */
101
      $data = $column->getProperty('data');
102
      /** @var MultiSourceColumnMetadata $audit */
103
      $audit = $column->getProperty('audit');
104
      /** @var MultiSourceColumnMetadata $config */
105
      $config = $column->getProperty('config');
106
107
      if (!isset($data))
108
      {
109
        if ($audit->getProperty('column_type')==$config->getProperty('column_type'))
110
        {
111
          $metadata->removeColumn($columnName);
112
        }
113
      }
114
      else
115
      {
116
        $audit_character_set_name = $audit->getProperty('character_set_name');
117
        $audit_collation_name     = $audit->getProperty('collation_name');
118
119
        $data_character_set_name = $data->getProperty('character_set_name');
120
        $data_collation_name     = $data->getProperty('collation_name');
121
122
        $config_character_set_name = $config->getProperty('character_set_name');
123
        $config_collation_name     = $config->getProperty('collation_name');
124
125
        if (
126
          $audit->getProperty('column_type')==$data->getProperty('column_type')
127
          && $audit_character_set_name==$data_character_set_name
128
          && $audit_character_set_name==$config_character_set_name
129
          && $audit_collation_name==$config_collation_name
130
          && $audit_collation_name==$data_collation_name
131
        )
132
        {
133
          $metadata->removeColumn($columnName);
134
        }
135
      }
136
    }
137
138
    return $metadata;
139
  }
140
141
  //--------------------------------------------------------------------------------------------------------------------
142
  /**
143
   * Add not null to audit columns if it not nullable.
144
   *
145
   * @param array $theColumns Audit columns.
146
   *
147
   * @return array
148
   */
149
  private function addNotNull($theColumns)
150
  {
151
    $modifiedColumns = [];
152
    foreach ($theColumns as $column)
153
    {
154
      $modifiedColumn = $column;
155
      $auditColumn    = StaticDataLayer::searchInRowSet('column_name', $modifiedColumn['column_name'], $this->configColumns);
156
      if (isset($auditColumn))
157
      {
158
        if ($modifiedColumn['is_nullable']==='NO')
159
        {
160
          $modifiedColumn['column_type'] = sprintf('%s not null', $modifiedColumn['column_type']);
161
        }
162
      }
163
      $modifiedColumns[] = $modifiedColumn;
164
    }
165
166
    return $modifiedColumns;
167
  }
168
169
  //--------------------------------------------------------------------------------------------------------------------
170
  /**
171
   * Get the difference between data and audit tables.
172
   *
173
   * @param TableColumnsMetadata $dataColumns  The table columns from data schema.
174
   * @param TableColumnsMetadata $auditColumns The table columns from audit schema.
175
   */
176
  private function createDiffArray($dataColumns, $auditColumns)
177
  {
178
    $configColumns     = new TableColumnsMetadata($this->configColumns);
179
    $this->diffColumns = new DiffTableColumns($configColumns, $auditColumns, $dataColumns);
180
  }
181
182
  //--------------------------------------------------------------------------------------------------------------------
183
}
184
185
//----------------------------------------------------------------------------------------------------------------------
186