Completed
Pull Request — master (#57)
by Dima
02:53
created

AuditDiffTable::compareCollationCharSetName()   C

Complexity

Conditions 8
Paths 4

Size

Total Lines 31
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 17
CRAP Score 8.216

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 31
ccs 17
cts 20
cp 0.85
rs 5.3846
cc 8
eloc 17
nc 4
nop 3
crap 8.216
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 $configAuditColumns;
30
31
  /**
32
   * Audit columns from config file
33
   *
34
   * @var array[]
35
   */
36
  private $configColumns;
37
38
  /**
39
   * Data database schema.
40
   *
41
   * @var string
42
   */
43
  private $dataSchema;
44
45
  /**
46
   * Difference between data and audit tables.
47
   *
48
   * @var DiffTableColumns
49
   */
50
  private $diffColumns;
51
52
  /**
53
   * Table name.
54
   *
55
   * @var string
56
   */
57
  private $tableName;
58
59
  //--------------------------------------------------------------------------------------------------------------------
60
  /**
61
   * Object constructor.
62
   *
63
   * @param string  $dataSchema         Data database schema.
64
   * @param string  $auditSchema        Audit database schema.
65
   * @param string  $tableName          Table name.
66
   * @param array[] $configAuditColumns Audit columns from config file.
67
   * @param array[] $configColumns      Data columns from config file.
68
   */
69 4
  public function __construct($dataSchema, $auditSchema, $tableName, $configAuditColumns, $configColumns)
70
  {
71 4
    $this->dataSchema         = $dataSchema;
72 4
    $this->auditSchema        = $auditSchema;
73 4
    $this->tableName          = $tableName;
74 4
    $this->configAuditColumns = $configAuditColumns;
75 4
    $this->configColumns      = array_merge($configAuditColumns, $configColumns);
76
77 4
    $dataColumns  = new TableColumnsMetadata(AuditDataLayer::getTableColumns($this->dataSchema, $this->tableName));
78 4
    $auditColumns = AuditDataLayer::getTableColumns($this->auditSchema, $this->tableName);
79 4
    $auditColumns = $this->addNotNull($auditColumns);
80 4
    $auditColumns = new TableColumnsMetadata($auditColumns);
81
82 4
    $this->createDiffArray($dataColumns, $auditColumns);
83 4
  }
84
85
  //--------------------------------------------------------------------------------------------------------------------
86
  /**
87
   * Return diff columns.
88
   *
89
   * @return TableColumnsMetadata
90
   */
91 4
  public function getDiffColumns()
92
  {
93 4
    return $this->diffColumns->getColumns();
94
  }
95
96
  //--------------------------------------------------------------------------------------------------------------------
97
  /**
98
   * Check full and return array without new or obsolete columns if full not set.
99
   *
100
   * @param bool $skipObsoleteNew Flag for skipping obsolete and new columns.
101
   *
102
   * @return TableColumnsMetadata
103
   */
104 4
  public function removeMatchingColumns($skipObsoleteNew)
105
  {
106 4
    $metadata = $this->diffColumns->getColumns();
107
    /** @var MultiSourceColumnMetadata $column */
108 4
    foreach ($metadata->getColumns() as $columnName => $column)
109
    {
110
      /** @var MultiSourceColumnMetadata $data */
111 4
      $data = $column->getProperty('data');
112
      /** @var MultiSourceColumnMetadata $audit */
113 4
      $audit = $column->getProperty('audit');
114
      /** @var MultiSourceColumnMetadata $config */
115 4
      $config = $column->getProperty('config');
116
117 4
      $auditColumn = StaticDataLayer::searchInRowSet('column_name', $columnName, $this->configAuditColumns);
118 4
      if (!isset($data))
119 4
      {
120 1
        if (isset($audit) && isset($config))
121 1
        {
122
          $check = $this->compareCollationCharSetName($audit, $config);
123
          if ($audit->getProperty('column_type')==$config->getProperty('column_type') && $check)
124
          {
125
            if (isset($auditColumn))
126
            {
127
              $metadata->removeColumn($columnName);
128
            }
129
          }
130
        }
131 1
        elseif ($skipObsoleteNew)
132
        {
133
          $metadata->removeColumn($columnName);
134
        }
135 1
      }
136
      else
137
      {
138 4
        if (isset($audit) && isset($config))
139 4
        {
140 4
          $check = $this->compareCollationCharSetName($data, $audit, $config);
141 4
          if ($audit->getProperty('column_type')==$data->getProperty('column_type') && $check)
142 4
          {
143 4
            $metadata->removeColumn($columnName);
144 4
          }
145 4
        }
146 1
        elseif ($skipObsoleteNew)
147
        {
148
          $metadata->removeColumn($columnName);
149
        }
150
      }
151 4
    }
152
153 4
    return $metadata;
154
  }
155
156
  //--------------------------------------------------------------------------------------------------------------------
157
  /**
158
   * Add not null to audit columns if it not nullable.
159
   *
160
   * @param array $theColumns Audit columns.
161
   *
162
   * @return array
163
   */
164 4
  private function addNotNull($theColumns)
165
  {
166 4
    $modifiedColumns = [];
167 4
    foreach ($theColumns as $column)
168
    {
169 4
      $modifiedColumn = $column;
170 4
      $auditColumn    = StaticDataLayer::searchInRowSet('column_name', $modifiedColumn['column_name'], $this->configColumns);
171 4
      if (isset($auditColumn))
172 4
      {
173 4
        if ($modifiedColumn['is_nullable']==='NO')
174 4
        {
175
          $modifiedColumn['column_type'] = sprintf('%s not null', $modifiedColumn['column_type']);
176
        }
177 4
      }
178 4
      $modifiedColumns[] = $modifiedColumn;
179 4
    }
180
181 4
    return $modifiedColumns;
182
  }
183
184
  //--------------------------------------------------------------------------------------------------------------------
185
  /**
186
   * Compare collations and character set names.
187
   *
188
   * @param MultiSourceColumnMetadata      $audit  Column information from audit schema.
189
   * @param MultiSourceColumnMetadata      $config Column information from config file.
190
   * @param MultiSourceColumnMetadata|null $data   Column information from data schema.
191
   *
192
   * @return array
0 ignored issues
show
Documentation introduced by
Should the return type not be boolean?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
193
   */
194 4
  private function compareCollationCharSetName($audit, $config, $data = null)
195
  {
196 4
    $config_character_set_name = $config->getProperty('character_set_name');
197 4
    $config_collation_name     = $config->getProperty('collation_name');
198 4
    $audit_character_set_name  = $audit->getProperty('character_set_name');
199 4
    $audit_collation_name      = $audit->getProperty('collation_name');
200
201 4
    if (isset($data))
202 4
    {
203 4
      $data_character_set_name = $data->getProperty('character_set_name');
204 4
      $data_collation_name     = $data->getProperty('collation_name');
205
206
      if ($audit_character_set_name==$data_character_set_name
207 4
        && $audit_character_set_name==$config_character_set_name
208 4
        && $audit_collation_name==$config_collation_name
209 4
        && $audit_collation_name==$data_collation_name
210 4
      )
211 4
      {
212 4
        return true;
213
      }
214 2
    }
215
    else
216
    {
217
      if ($audit_character_set_name==$config_character_set_name && $audit_collation_name==$config_collation_name)
218
      {
219
        return true;
220
      }
221
    }
222
223 2
    return false;
224
  }
225
226
  //--------------------------------------------------------------------------------------------------------------------
227
  /**
228
   * Get the difference between data and audit tables.
229
   *
230
   * @param TableColumnsMetadata $dataColumns  The table columns from data schema.
231
   * @param TableColumnsMetadata $auditColumns The table columns from audit schema.
232
   */
233 4
  private function createDiffArray($dataColumns, $auditColumns)
234
  {
235 4
    $configColumns     = new TableColumnsMetadata($this->configColumns);
0 ignored issues
show
Documentation introduced by
$this->configColumns is of type array<integer,array>, but the function expects a array<integer,object<array>>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
236 4
    $this->diffColumns = new DiffTableColumns($configColumns, $auditColumns, $dataColumns);
237 4
  }
238
239
  //--------------------------------------------------------------------------------------------------------------------
240
}
241
242
//----------------------------------------------------------------------------------------------------------------------
243