Completed
Branch master (0ecb66)
by P.R.
04:50
created

AuditDiffTable::addNotNull()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 19
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4.016

Importance

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