Completed
Push — master ( c95337...5e0152 )
by P.R.
04:34
created

AuditDiffTable::createDiffArray()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 5
ccs 4
cts 4
cp 1
rs 9.4285
cc 1
eloc 3
nc 1
nop 2
crap 1
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
9
//----------------------------------------------------------------------------------------------------------------------
10
/**
11
 * Class for executing auditing actions for tables.
12
 */
13
class AuditDiffTable
14
{
15
  //--------------------------------------------------------------------------------------------------------------------
16
  /**
17
   * Audit database schema.
18
   *
19
   * @var string
20
   */
21
  private $auditSchema;
22
23
  /**
24
   * Audit columns from config file.
25
   *
26
   * @var \array[]
27
   */
28
  private $configAuditColumns;
29
30
  /**
31
   * Audit columns from config file
32
   *
33
   * @var \array[]
34
   */
35
  private $configColumns;
36
37
  /**
38
   * Data database schema.
39
   *
40
   * @var string
41
   */
42
  private $dataSchema;
43
44
  /**
45
   * Difference between data and audit tables.
46
   *
47
   * @var DiffTableColumns
48
   */
49
  private $diffColumns;
50
51
  /**
52
   * Table name.
53
   *
54
   * @var string
55
   */
56
  private $tableName;
57
58
  //--------------------------------------------------------------------------------------------------------------------
59
  /**
60
   * Object constructor.
61
   *
62
   * @param string   $dataSchema         Data database schema.
63
   * @param string   $auditSchema        Audit database schema.
64
   * @param string   $tableName          Table name.
65
   * @param \array[] $configAuditColumns Audit columns from config file.
66
   * @param \array[] $configColumns      Data columns from config file.
67
   */
68 4
  public function __construct($dataSchema, $auditSchema, $tableName, $configAuditColumns, $configColumns)
69
  {
70 4
    $this->dataSchema         = $dataSchema;
71 4
    $this->auditSchema        = $auditSchema;
72 4
    $this->tableName          = $tableName;
73 4
    $this->configAuditColumns = $configAuditColumns;
74 4
    $this->configColumns      = array_merge($configAuditColumns, $configColumns);
75
76 4
    $dataColumns  = new TableColumnsMetadata(AuditDataLayer::getTableColumns($this->dataSchema, $this->tableName));
77 4
    $auditColumns = AuditDataLayer::getTableColumns($this->auditSchema, $this->tableName);
78 4
    $auditColumns = $this->addNotNull($auditColumns);
79 4
    $auditColumns = new TableColumnsMetadata($auditColumns);
80
81 4
    $this->createDiffArray($dataColumns, $auditColumns);
82 4
  }
83
84
  //--------------------------------------------------------------------------------------------------------------------
85
  /**
86
   * Return diff columns.
87
   *
88
   * @return TableColumnsMetadata
89
   */
90 4
  public function getDiffColumns()
91
  {
92 4
    return $this->diffColumns->getColumns();
93
  }
94
95
  //--------------------------------------------------------------------------------------------------------------------
96
  /**
97
   * Check full and return array without new or obsolete columns if full not set.
98
   *
99
   * @param bool $skipObsoleteNew Flag for skipping obsolete and new columns.
100
   *
101
   * @return TableColumnsMetadata
102
   */
103 4
  public function removeMatchingColumns($skipObsoleteNew)
104
  {
105 4
    $metadata = $this->diffColumns->getColumns();
106
    /** @var MultiSourceColumnMetadata $column */
107 4
    foreach ($metadata->getColumns() as $columnName => $column)
108
    {
109
      /** @var MultiSourceColumnMetadata $data */
110 4
      $data = $column->getProperty('data');
111
      /** @var MultiSourceColumnMetadata $audit */
112 4
      $audit = $column->getProperty('audit');
113
      /** @var MultiSourceColumnMetadata $config */
114 4
      $config = $column->getProperty('config');
115
116 4
      $auditColumn = AuditDataLayer::searchInRowSet('column_name', $columnName, $this->configAuditColumns);
117 4
      if (!isset($data))
118
      {
119 1
        if (isset($audit) && isset($config))
120
        {
121
          $check = $this->compareCollationCharSetName($audit, $config);
122
          if ($audit->getProperty('column_type')==$config->getProperty('column_type') && $check)
123
          {
124
            if (isset($auditColumn))
125
            {
126
              $metadata->removeColumn($columnName);
127
            }
128
          }
129
        }
130 1
        elseif ($skipObsoleteNew)
131
        {
132 1
          $metadata->removeColumn($columnName);
133
        }
134
      }
135
      else
136
      {
137 4
        if (isset($audit) && isset($config))
138
        {
139 4
          $check = $this->compareCollationCharSetName($data, $audit, $config);
140 4
          if ($audit->getProperty('column_type')==$data->getProperty('column_type') && $check)
141
          {
142 4
            $metadata->removeColumn($columnName);
143
          }
144
        }
145 1
        elseif ($skipObsoleteNew)
146
        {
147 4
          $metadata->removeColumn($columnName);
148
        }
149
      }
150
    }
151
152 4
    return $metadata;
153
  }
154
155
  //--------------------------------------------------------------------------------------------------------------------
156
  /**
157
   * Add not null to audit columns if it not nullable.
158
   *
159
   * @param array $theColumns Audit columns.
160
   *
161
   * @return array
162
   */
163 4
  private function addNotNull($theColumns)
164
  {
165 4
    $modifiedColumns = [];
166 4
    foreach ($theColumns as $column)
167
    {
168 4
      $modifiedColumn = $column;
169 4
      $auditColumn    = AuditDataLayer::searchInRowSet('column_name', $modifiedColumn['column_name'], $this->configColumns);
170 4
      if (isset($auditColumn))
171
      {
172 4
        if ($modifiedColumn['is_nullable']==='NO')
173
        {
174
          $modifiedColumn['column_type'] = sprintf('%s not null', $modifiedColumn['column_type']);
175
        }
176
      }
177 4
      $modifiedColumns[] = $modifiedColumn;
178
    }
179
180 4
    return $modifiedColumns;
181
  }
182
183
  //--------------------------------------------------------------------------------------------------------------------
184
  /**
185
   * Compare collations and character set names.
186
   *
187
   * @param MultiSourceColumnMetadata      $audit  Column information from audit schema.
188
   * @param MultiSourceColumnMetadata      $config Column information from config file.
189
   * @param MultiSourceColumnMetadata|null $data   Column information from data schema.
190
   *
191
   * @return bool
192
   */
193 4
  private function compareCollationCharSetName($audit, $config, $data = null)
194
  {
195 4
    $config_character_set_name = $config->getProperty('character_set_name');
196 4
    $config_collation_name     = $config->getProperty('collation_name');
197 4
    $audit_character_set_name  = $audit->getProperty('character_set_name');
198 4
    $audit_collation_name      = $audit->getProperty('collation_name');
199
200 4
    if (isset($data))
201
    {
202 4
      $data_character_set_name = $data->getProperty('character_set_name');
203 4
      $data_collation_name     = $data->getProperty('collation_name');
204
205 4
      if ($audit_character_set_name==$data_character_set_name
206 4
        && $audit_character_set_name==$config_character_set_name
207 4
        && $audit_collation_name==$config_collation_name
208 4
        && $audit_collation_name==$data_collation_name
209
      )
210
      {
211 4
        return true;
212
      }
213
    }
214
    else
215
    {
216
      if ($audit_character_set_name==$config_character_set_name && $audit_collation_name==$config_collation_name)
217
      {
218
        return true;
219
      }
220
    }
221
222 2
    return false;
223
  }
224
225
  //--------------------------------------------------------------------------------------------------------------------
226
  /**
227
   * Get the difference between data and audit tables.
228
   *
229
   * @param TableColumnsMetadata $dataColumns  The table columns from data schema.
230
   * @param TableColumnsMetadata $auditColumns The table columns from audit schema.
231
   */
232 4
  private function createDiffArray($dataColumns, $auditColumns)
233
  {
234 4
    $configColumns     = new TableColumnsMetadata($this->configColumns);
235 4
    $this->diffColumns = new DiffTableColumns($configColumns, $auditColumns, $dataColumns);
236 4
  }
237
238
  //--------------------------------------------------------------------------------------------------------------------
239
}
240
241
//----------------------------------------------------------------------------------------------------------------------
242