Completed
Push — master ( ee0b9d...cf3a28 )
by P.R.
02:54
created

Columns::getColumnTypeWithCharSetCollation()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 16
rs 9.2
cc 4
eloc 9
nc 5
nop 1
1
<?php
2
//----------------------------------------------------------------------------------------------------------------------
3
namespace SetBased\Audit;
4
5
//----------------------------------------------------------------------------------------------------------------------
6
/**
7
 * Class for metadata of (table) columns.
8
 */
9
class Columns
10
{
11
  //--------------------------------------------------------------------------------------------------------------------
12
  /**
13
   * The metadata of the columns.
14
   *
15
   * @var array[]
16
   */
17
  private $columns = [];
18
19
  //--------------------------------------------------------------------------------------------------------------------
20
  /**
21
   * Object constructor.
22
   *
23
   * @param array[] $columns The metadata of the columns.
24
   */
25
  public function __construct($columns)
26
  {
27
    foreach ($columns as $column)
28
    {
29
      $this->columns[$column['column_name']] = [
30
        'column_name'        => $column['column_name'],
31
        'column_type'        => $column['column_type'],
32
        'character_set_name' => isset($column['character_set_name']) ? $column['character_set_name'] : null,
33
        'collation_name'     => isset($column['collation_name']) ? $column['collation_name'] : null,
34
        'audit_expression'   => isset($column['expression']) ? $column['expression'] : null,
35
        'audit_value_type'   => isset($column['value_type']) ? $column['value_type'] : null
36
      ];
37
    }
38
  }
39
40
  //--------------------------------------------------------------------------------------------------------------------
41
  /**
42
   * Generate array with audit columns and columns from data table.
43
   *
44
   * @param Columns $auditColumnsMetadata   AuditApplication columns for adding to exist columns
45
   * @param Columns $currentColumnsMetadata Exist table columns
46
   *
47
   * @return Columns
48
   */
49
  public static function combine($auditColumnsMetadata, $currentColumnsMetadata)
50
  {
51
    $columns = [];
52
53
    foreach ($auditColumnsMetadata->columns as $column)
54
    {
55
      $columns[] = ['column_name' => $column['column_name'],
56
                    'column_type' => $column['column_type']];
57
    }
58
59
    foreach ($currentColumnsMetadata->columns as $column)
60
    {
61
      if ($column['column_type']!='timestamp')
62
      {
63
        $columns[] = ['column_name' => $column['column_name'],
64
                      'column_type' => $column['column_type']];
65
      }
66
      else
67
      {
68
        $columns[] = ['column_name' => $column['column_name'],
69
                      'column_type' => $column['column_type'].' NULL'];
70
      }
71
    }
72
73
    return new Columns($columns);
74
  }
75
76
  //--------------------------------------------------------------------------------------------------------------------
77
  /**
78
   * Compares two Columns objects and returns an array with columns that are in the first columns object and in the
79
   * second Columns object but have different types.
80
   *
81
   * @param Columns $columns1 The first Columns object.
82
   * @param Columns $columns2 The second Columns object.
83
   *
84
   * @return Columns
85
   */
86
  public static function differentColumnTypes($columns1, $columns2)
87
  {
88
    $diff = [];
89
    foreach ($columns2->columns as $column2)
90
    {
91
      if (isset($columns1->columns[$column2['column_name']]))
92
      {
93
        $column1 = $columns1->columns[$column2['column_name']];
94
        if ($column2['column_type']!=$column1['column_type'])
95
        {
96
          $diff[] = $column1;
97
        }
98
      }
99
    }
100
101
    return new Columns($diff);
102
  }
103
104
  //--------------------------------------------------------------------------------------------------------------------
105
  /**
106
   * Compares two Columns objects and returns an array with columns that are in the first columns object but not in the
107
   * second Columns object.
108
   *
109
   * @param Columns $columns1 The first Columns object.
110
   * @param Columns $columns2 The second Columns object.
111
   *
112
   * @return Columns
113
   */
114
  public static function notInOtherSet($columns1, $columns2)
115
  {
116
    $diff = [];
117
    if (isset($columns1))
118
    {
119
      foreach ($columns1->columns as $column1)
120
      {
121
        if (!isset($columns2->columns[$column1['column_name']]))
122
        {
123
          $diff[] = ['column_name' => $column1['column_name'],
124
                     'column_type' => $column1['column_type']];
125
        }
126
      }
127
    }
128
129
    return new Columns($diff);
130
  }
131
132
  //--------------------------------------------------------------------------------------------------------------------
133
  /**
134
   * Returns the underlying array with metadata of the columns.
135
   *
136
   * @return array[]
137
   */
138
  public function getColumns()
139
  {
140
    return $this->columns;
141
  }
142
143
  //--------------------------------------------------------------------------------------------------------------------
144
  /**
145
   * Return column type with character set and collation.
146
   *
147
   * @param string $columnName The column name.
148
   *
149
   * @return null|string
150
   */
151
  public function getColumnTypeWithCharSetCollation($columnName)
152
  {
153
    $columns = array_keys($this->columns);
154
    $key     = array_search($columnName, $columns);
155
156
    if ($key!==false)
157
    {
158
      $column                       = $this->columns[$columns[$key]];
159
      $column['character_set_name'] = isset($column['character_set_name']) ? ' '.$column['character_set_name'] : '';
160
      $column['collation_name']     = isset($column['collation_name']) ? ' '.$column['collation_name'] : '';
161
162
      return sprintf('%s%s%s', $column['column_type'], $column['character_set_name'], $column['collation_name']);
163
    }
164
165
    return null;
166
  }
167
168
  //--------------------------------------------------------------------------------------------------------------------
169
}
170
171
//----------------------------------------------------------------------------------------------------------------------
172