Skip to content

Commit 230b5da

Browse files
committed
Fix new audit column order.
1 parent 2229d28 commit 230b5da

File tree

9 files changed

+211
-31
lines changed

9 files changed

+211
-31
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77
/custom.type.properties
88
/docs/_build/
99
/test/MySql/AlterAuditTableCommand/config/alter.sql
10+
/test/MySql/AuditCommand/AddAuditColumn/config/audit.json
1011
/test/MySql/AuditCommand/DroppedTable/config/audit.json
1112
/test/MySql/AuditCommand/NewTable/config/audit.json
1213
/test/MySql/AuditCommand/ObsoleteTable/config/audit.json
1314
/test/MySql/DiffCommand/ObsoleteAuditTable/config/audit.json
1415
/test/coverage.xml
1516
/test/report/
16-
/vendor/
17+
/vendor/

src/AuditTable.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,7 @@ private function alterNewColumns(TableColumnsMetadata $newColumns): TableColumns
230230
$alterNewColumns = new TableColumnsMetadata();
231231
foreach ($newColumns->getColumns() as $newColumn)
232232
{
233-
$properties = $newColumn->getProperties();
234-
$properties['after'] = $this->dataTableColumnsDatabase->getPreviousColumn($properties['column_name']);
235-
233+
$properties = $newColumn->getProperties();
236234
$alterNewColumns->appendTableColumn(new AlterColumnMetadata($properties));
237235
}
238236

@@ -289,6 +287,7 @@ private function getTableColumnInfo(): array
289287
{
290288
$actual = new TableColumnsMetadata(AuditDataLayer::$dl->getTableColumns($this->auditSchemaName, $this->tableName));
291289
$target = TableColumnsMetadata::combine($this->additionalAuditColumns, $this->dataTableColumnsDatabase);
290+
$target->enhanceAfter();
292291

293292
$new = TableColumnsMetadata::notInOtherSet($target, $actual);
294293
$obsolete = TableColumnsMetadata::notInOtherSet($actual, $target);

src/Metadata/ColumnMetadata.php

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ abstract class ColumnMetadata
2828
private $properties = [];
2929

3030
//--------------------------------------------------------------------------------------------------------------------
31+
3132
/**
3233
* Object constructor.
3334
*
@@ -120,12 +121,7 @@ public function getProperties(): array
120121
*/
121122
public function getProperty(string $name): ?string
122123
{
123-
if (isset($this->properties[$name]))
124-
{
125-
return $this->properties[$name];
126-
}
127-
128-
return null;
124+
return $this->properties[$name] ?? null;
129125
}
130126

131127
//--------------------------------------------------------------------------------------------------------------------
@@ -153,6 +149,17 @@ public function makeNullable(): void
153149
$this->properties['is_nullable'] = 'YES';
154150
}
155151

152+
//--------------------------------------------------------------------------------------------------------------------
153+
/**
154+
* Sets property 'after'.
155+
*
156+
* @param string|null $after
157+
*/
158+
public function setAfter(?string $after): void
159+
{
160+
$this->properties['after'] = $after;
161+
}
162+
156163
//--------------------------------------------------------------------------------------------------------------------
157164
/**
158165
* Removes the default value.

src/Metadata/TableColumnsMetadata.php

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class TableColumnsMetadata
2222
private $columns = [];
2323

2424
//--------------------------------------------------------------------------------------------------------------------
25+
2526
/**
2627
* Object constructor.
2728
*
@@ -162,6 +163,20 @@ public function appendTableColumns(TableColumnsMetadata $columns): void
162163
}
163164
}
164165

166+
//--------------------------------------------------------------------------------------------------------------------
167+
/**
168+
* Enhances all columns with field 'after'.
169+
*/
170+
public function enhanceAfter(): void
171+
{
172+
$previous = null;
173+
foreach ($this->columns as $column)
174+
{
175+
$column->setAfter($previous);
176+
$previous = $column->getName();
177+
}
178+
}
179+
165180
//--------------------------------------------------------------------------------------------------------------------
166181
/**
167182
* Returns a column given the column name.
@@ -225,27 +240,6 @@ public function getNumberOfColumns(): int
225240
return count($this->columns);
226241
}
227242

228-
//--------------------------------------------------------------------------------------------------------------------
229-
/**
230-
* Returns previous column of a columns. Returns null if the column name is not found in this TableColumnsMetadata.
231-
*
232-
* @param string $columnName The column name.
233-
*
234-
* @return string|null
235-
*/
236-
public function getPreviousColumn(string $columnName): ?string
237-
{
238-
$columns = array_keys($this->columns);
239-
$key = array_search($columnName, $columns);
240-
241-
if ($key>=1)
242-
{
243-
return $columns[$key - 1];
244-
}
245-
246-
return null;
247-
}
248-
249243
//--------------------------------------------------------------------------------------------------------------------
250244
/**
251245
* Makes all columns nullable.
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace SetBased\Audit\Test\MySql\AuditCommand\AddAuditColumn;
5+
6+
use SetBased\Audit\MySql\AuditDataLayer;
7+
use SetBased\Audit\Test\MySql\AuditCommand\AuditCommandTestCase;
8+
use SetBased\Stratum\Middle\Helper\RowSetHelper;
9+
10+
/**
11+
* Tests for running audit with a new audit table column.
12+
*/
13+
class AddAuditColumnTest extends AuditCommandTestCase
14+
{
15+
//--------------------------------------------------------------------------------------------------------------------
16+
/**
17+
* @inheritdoc
18+
*/
19+
public static function setUpBeforeClass(): void
20+
{
21+
self::$dir = __DIR__;
22+
23+
parent::setUpBeforeClass();
24+
}
25+
26+
//--------------------------------------------------------------------------------------------------------------------
27+
public function test01(): void
28+
{
29+
// Run audit.
30+
copy(__DIR__.'/config/audit1.json', __DIR__.'/config/audit.json');
31+
$this->runAudit();
32+
33+
// TABLE1 MUST exist.
34+
$tables = AuditDataLayer::$dl->getTablesNames(self::$auditSchema);
35+
self::assertNotNull(RowSetHelper::searchInRowSet($tables, 'table_name', 'TABLE1'));
36+
37+
// TABLE1 MUST have triggers.
38+
$triggers = AuditDataLayer::$dl->getTableTriggers(self::$dataSchema, 'TABLE1');
39+
self::assertNotNull(RowSetHelper::searchInRowSet($triggers, 'trigger_name', 'trg_audit_t1_insert'));
40+
self::assertNotNull(RowSetHelper::searchInRowSet($triggers, 'trigger_name', 'trg_audit_t1_update'));
41+
self::assertNotNull(RowSetHelper::searchInRowSet($triggers, 'trigger_name', 'trg_audit_t1_delete'));
42+
43+
$actual = AuditDataLayer::$dl->getTableColumns(self::$auditSchema, 'TABLE1');
44+
45+
$expected = [];
46+
$expected[] = ['column_name' => 'audit_column1',
47+
'column_type' => 'varchar(21)',
48+
'column_default' => 'NULL',
49+
'is_nullable' => 'YES',
50+
'character_set_name' => 'utf8',
51+
'collation_name' => 'utf8_general_ci'];
52+
$expected[] = ['column_name' => 'audit_column3',
53+
'column_type' => 'varchar(23)',
54+
'column_default' => 'NULL',
55+
'is_nullable' => 'YES',
56+
'character_set_name' => 'utf8',
57+
'collation_name' => 'utf8_general_ci'];
58+
$expected[] = ['column_name' => 'c1',
59+
'column_type' => 'tinyint(4)',
60+
'column_default' => 'NULL',
61+
'is_nullable' => 'YES',
62+
'character_set_name' => null,
63+
'collation_name' => null];
64+
65+
self::assertSame($expected, $actual);
66+
67+
copy(__DIR__.'/config/audit2.json', __DIR__.'/config/audit.json');
68+
$this->runAudit();
69+
70+
// TABLE1 MUST exist.
71+
$tables = AuditDataLayer::$dl->getTablesNames(self::$auditSchema);
72+
self::assertNotNull(RowSetHelper::searchInRowSet($tables, 'table_name', 'TABLE1'));
73+
74+
// TABLE1 MUST have triggers.
75+
$triggers = AuditDataLayer::$dl->getTableTriggers(self::$dataSchema, 'TABLE1');
76+
self::assertNotNull(RowSetHelper::searchInRowSet($triggers, 'trigger_name', 'trg_audit_t1_insert'));
77+
self::assertNotNull(RowSetHelper::searchInRowSet($triggers, 'trigger_name', 'trg_audit_t1_update'));
78+
self::assertNotNull(RowSetHelper::searchInRowSet($triggers, 'trigger_name', 'trg_audit_t1_delete'));
79+
80+
// TABLE1 must have column audit_column2 between audit_column1 and audit_column3.
81+
$actual = AuditDataLayer::$dl->getTableColumns(self::$auditSchema, 'TABLE1');
82+
83+
$expected = [];
84+
$expected[] = ['column_name' => 'audit_column1',
85+
'column_type' => 'varchar(21)',
86+
'column_default' => 'NULL',
87+
'is_nullable' => 'YES',
88+
'character_set_name' => 'utf8',
89+
'collation_name' => 'utf8_general_ci'];
90+
$expected[] = ['column_name' => 'audit_column2',
91+
'column_type' => 'varchar(22)',
92+
'column_default' => 'NULL',
93+
'is_nullable' => 'YES',
94+
'character_set_name' => 'utf8',
95+
'collation_name' => 'utf8_general_ci'];
96+
$expected[] = ['column_name' => 'audit_column3',
97+
'column_type' => 'varchar(23)',
98+
'column_default' => 'NULL',
99+
'is_nullable' => 'YES',
100+
'character_set_name' => 'utf8',
101+
'collation_name' => 'utf8_general_ci'];
102+
$expected[] = ['column_name' => 'c1',
103+
'column_type' => 'tinyint(4)',
104+
'column_default' => 'NULL',
105+
'is_nullable' => 'YES',
106+
'character_set_name' => null,
107+
'collation_name' => null];
108+
109+
self::assertSame($expected, $actual);
110+
}
111+
112+
//--------------------------------------------------------------------------------------------------------------------
113+
}
114+
115+
//----------------------------------------------------------------------------------------------------------------------
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"database": {
3+
"credentials": "credentials.ini"
4+
},
5+
"audit_columns": [
6+
{
7+
"column_name": "audit_column1",
8+
"column_type": "varchar(21)",
9+
"expression": "'col1'"
10+
},
11+
{
12+
"column_name": "audit_column3",
13+
"column_type": "varchar(23)",
14+
"expression": "'col3'"
15+
}
16+
],
17+
"tables": {
18+
"TABLE1": {
19+
"audit": true,
20+
"skip": null,
21+
"alias": "t1"
22+
}
23+
}
24+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"database": {
3+
"credentials": "credentials.ini"
4+
},
5+
"audit_columns": [
6+
{
7+
"column_name": "audit_column1",
8+
"column_type": "varchar(21)",
9+
"expression": "'col1'"
10+
},
11+
{
12+
"column_name": "audit_column2",
13+
"column_type": "varchar(22)",
14+
"expression": "'col2'"
15+
},
16+
{
17+
"column_name": "audit_column3",
18+
"column_type": "varchar(23)",
19+
"expression": "'col3'"
20+
}
21+
],
22+
"tables": {
23+
"TABLE1": {
24+
"audit": true,
25+
"skip": null,
26+
"alias": "t1"
27+
}
28+
}
29+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[database]
2+
host = localhost
3+
user = test
4+
password = test
5+
data_schema = test_data
6+
audit_schema = test_audit
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
create table `TABLE1`
2+
(
3+
c1 tinyint
4+
);
5+

0 commit comments

Comments
 (0)