Skip to content

Commit b6d3820

Browse files
committed
Fix multi line comments and comments on unique indexes.
1 parent 549446e commit b6d3820

File tree

11 files changed

+243
-69
lines changed

11 files changed

+243
-69
lines changed

src/MySqlFix.php

Lines changed: 78 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?php
2-
//----------------------------------------------------------------------------------------------------------------------
2+
declare(strict_types=1);
3+
34
namespace SetBased\ErdConcepts;
45

56
/**
@@ -13,6 +14,16 @@ class MySqlFix
1314
*/
1415
const MAX_COLUMN_COMMENT_LENGTH = 1024;
1516

17+
/**
18+
* Maximum length of table comments in MySQL.
19+
*/
20+
const MAX_TABLE_COMMENT_LENGTH = 2048;
21+
22+
/**
23+
* Maximum length of index comments in MySQL.
24+
*/
25+
const MAX_INDEX_COMMENT_LENGTH = 1024;
26+
1627
//--------------------------------------------------------------------------------------------------------------------
1728
/**
1829
* Add comments to column definitions based on commented column comments.
@@ -29,34 +40,38 @@ public static function fixColumnComments(string $source): string
2940
$map = [];
3041

3142
// Scan the source for column definitions.
32-
$table_name = null;
43+
$tableName = null;
3344
foreach ($lines as $i => $line)
3445
{
35-
if (isset($table_name))
46+
if (isset($tableName))
3647
{
37-
if (preg_match('/^ {2}(`?\w+`?)/', $line, $matches))
48+
if (preg_match('/^ {2}(?<column>`?\w+`?)/', $line, $matches))
3849
{
39-
$map[$table_name][$matches[1]] = $i;
50+
$map[$tableName][$matches['column']] = $i;
4051
}
4152
else
4253
{
43-
$table_name = null;
54+
$tableName = null;
4455
}
4556
}
4657

47-
if ($table_name===null && preg_match('/^CREATE TABLE (`?\w+`?)/', $line, $matches))
58+
if ($tableName===null && preg_match('/^CREATE TABLE (?<table>`?\w+`?)/', $line, $matches))
4859
{
49-
$table_name = $matches[1];
60+
$tableName = $matches['table'];
5061
}
5162
}
5263

5364
// Scan the source for comments.
5465
$comments = [];
5566
foreach ($lines as $i => $line)
5667
{
57-
if (preg_match('/^COMMENT ON COLUMN (`?\w+`?).(`?\w+`?)/', $line, $matches))
68+
if (preg_match('/^COMMENT ON COLUMN (?<table>`?\w+`?).(?<column>`?\w+`?)/', $line, $matches))
5869
{
59-
$comments[$matches[1]][$matches[2]] = trim($lines[$i + 1]);
70+
$comment = self::extractComment($lines, $i, self::MAX_COLUMN_COMMENT_LENGTH);
71+
if ($comment!=='')
72+
{
73+
$comments[$matches['table']][$matches['column']] = $comment;
74+
}
6075
}
6176
}
6277

@@ -123,19 +138,23 @@ public static function fixIndexComments(string $source): string
123138
$index_name = null;
124139
foreach ($lines as $i => $line)
125140
{
126-
if (preg_match('/^CREATE INDEX (`?\w+`?)(\s*\()?/', $line, $matches))
141+
if (preg_match('/^CREATE (UNIQUE )?INDEX (?<index>`?\w+`?)(\s*\()?/', $line, $matches))
127142
{
128-
$map[$matches[1]] = $i;
143+
$map[$matches['index']] = $i;
129144
}
130145
}
131146

132147
// Scan the source for comments.
133148
$comments = [];
134149
foreach ($lines as $i => $line)
135150
{
136-
if (preg_match('/^COMMENT ON INDEX (`?\w+`?)/', $line, $matches))
151+
if (preg_match('/^COMMENT ON INDEX (?<index>`?\w+`?)/', $line, $matches))
137152
{
138-
$comments[$matches[1]] = trim($lines[$i + 1]);
153+
$comment = self::extractComment($lines, $i, self::MAX_INDEX_COMMENT_LENGTH);
154+
if ($comment!=='')
155+
{
156+
$comments[$matches['index']] = $comment;
157+
}
139158
}
140159
}
141160

@@ -144,7 +163,7 @@ public static function fixIndexComments(string $source): string
144163
{
145164
if (!isset($map[$indexName]))
146165
{
147-
throw new \RuntimeException(sprintf("Table '%s' is not defined.", $indexName));
166+
throw new \RuntimeException(sprintf("Index '%s' is not defined.", $indexName));
148167
}
149168

150169
$lineNumber = $map[$indexName];
@@ -204,10 +223,10 @@ public static function fixTableComments(string $source): string
204223
}
205224
}
206225

207-
if ($table_name===null && preg_match('/^CREATE TABLE (`?\w+`?)(\s*\()?/', $line, $matches))
226+
if ($table_name===null && preg_match('/^CREATE TABLE (?<table>`?\w+`?)(\s*\()?/', $line, $matches))
208227
{
209228
$table_name = $matches[1];
210-
if ($matches[2])
229+
if ($matches['table'])
211230
{
212231
$level = 1;
213232
}
@@ -218,9 +237,13 @@ public static function fixTableComments(string $source): string
218237
$comments = [];
219238
foreach ($lines as $i => $line)
220239
{
221-
if (preg_match('/^COMMENT ON TABLE (`?\w+`?)/', $line, $matches))
240+
if (preg_match('/^COMMENT ON TABLE (?<table>`?\w+`?)/', $line, $matches))
222241
{
223-
$comments[$matches[1]] = trim($lines[$i + 1]);
242+
$comment = self::extractComment($lines, $i, self::MAX_TABLE_COMMENT_LENGTH);
243+
if ($comment!=='')
244+
{
245+
$comments[$matches['table']] = $comment;
246+
}
224247
}
225248
}
226249

@@ -234,7 +257,7 @@ public static function fixTableComments(string $source): string
234257

235258
$line_number = $map[$table_name];
236259

237-
// Truncate comments longer than 60 characters.
260+
// Truncate comments longer than 1024 characters.
238261
if (strlen($comment)>self::MAX_COLUMN_COMMENT_LENGTH)
239262
{
240263
$comment = trim(mb_substr($comment, 0, self::MAX_COLUMN_COMMENT_LENGTH - 3)).'...';
@@ -263,6 +286,41 @@ protected static function escapeMysqlString(string $string): string
263286
return addslashes($string);
264287
}
265288

289+
//--------------------------------------------------------------------------------------------------------------------
290+
/**
291+
* Extracts a commented comment.
292+
*
293+
* @param array $lines The SQL code generated by ERD concepts as an array of lines.
294+
* @param int $index The line number of the comment statement.
295+
* @param int $maxLength The max length of the comment.
296+
*
297+
* @return string
298+
*/
299+
private static function extractComment(array $lines, int $index, int $maxLength): string
300+
{
301+
$comment = '';
302+
303+
if ($index>=1 && $lines[$index - 1]==='/*')
304+
{
305+
$j = $index + 1;
306+
while ($j<sizeof($lines) && $lines[$j]!=='*/')
307+
{
308+
$comment .= $lines[$j];
309+
$comment .= PHP_EOL;
310+
311+
$j++;
312+
}
313+
}
314+
315+
$comment = trim($comment);
316+
if (mb_strlen($comment)>$maxLength)
317+
{
318+
$comment = trim(mb_substr($comment, 0, $maxLength - 3)).'...';
319+
}
320+
321+
return $comment;
322+
}
323+
266324
//--------------------------------------------------------------------------------------------------------------------
267325
}
268326

test/bootstrap.php

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,9 @@
11
<?php
2-
//----------------------------------------------------------------------------------------------------------------------
3-
/**
4-
* phpStratum
5-
*
6-
* @copyright 2005-2015 Paul Water / Set Based IT Consultancy (https://www.setbased.nl)
7-
* @license http://www.opensource.org/licenses/mit-license.php MIT
8-
* @link
9-
*/
10-
//----------------------------------------------------------------------------------------------------------------------
2+
declare(strict_types=1);
3+
114
error_reporting(E_ALL);
125
date_default_timezone_set( 'Europe/Amsterdam' );
136

147
ini_set('memory_limit', '10000M');
158

169
require_once( __DIR__.'/../vendor/autoload.php' );
17-
18-
//----------------------------------------------------------------------------------------------------------------------

test/erd/MySql/php-erd-concepts.ecm renamed to test/erd/php-erd-concepts.ecm

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<COPYRIGHT></COPYRIGHT>
99
<VERSION>Concept</VERSION>
1010
<CREATED>2015-01-03</CREATED>
11-
<MODIFIED>2023-03-19</MODIFIED>
11+
<MODIFIED>2023-05-18</MODIFIED>
1212
<COMMENTS></COMMENTS>
1313
<DEFAULTPAGEID>0</DEFAULTPAGEID>
1414
<DEFAULT_SCHEMA></DEFAULT_SCHEMA>
@@ -1439,7 +1439,9 @@
14391439
<DATA>
14401440
<ID>{C8ACA941-3953-4662-B775-071A49D6B4D7}</ID>
14411441
<NAME>BAR1</NAME>
1442-
<COMMENT>This table is table BAR1.</COMMENT>
1442+
<COMMENT>This table is table BAR1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Sed enim ut sem viverra. Proin libero nunc consequat interdum. Donec et odio pellentesque diam volutpat commodo sed. Dictum non consectetur a erat nam. Tempus quam pellentesque nec nam aliquam sem et tortor consequat. Fringilla ut morbi tincidunt augue interdum velit. Purus ut faucibus pulvinar elementum integer. Sit amet volutpat consequat mauris nunc congue. Arcu odio ut sem nulla pharetra diam sit amet nisl.
1443+
1444+
Dui ut ornare lectus sit. At quis risus sed vulputate odio ut enim. Est ante in nibh mauris cursus mattis. Id volutpat lacus laoreet non. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare massa. Netus et malesuada fames ac turpis. Pulvinar mattis nunc sed blandit libero volutpat. Aliquam faucibus purus in massa. Tempor id eu nisl nunc mi ipsum faucibus vitae aliquet. Pellentesque habitant morbi tristique senectus. Tempor nec feugiat nisl pretium fusce id velit ut tortor. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Varius vel pharetra vel turpis nunc. Elit eget gravida cum sociis natoque penatibus. Arcu bibendum at varius vel pharetra. Volutpat odio facilisis mauris sit. Risus quis varius quam quisque id. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Arcu ac tortor dignissim convallis aenean et tortor at. Amet venenatis urna cursus eget nunc scelerisque viverra.</COMMENT>
14431445
<COLUMNS>
14441446
<COLUMN>
14451447
<OID>{B5CFAE34-AE46-437F-9190-4FC282BE400C}</OID>
@@ -1561,7 +1563,7 @@
15611563
<USING></USING>
15621564
</PROPERTIES>
15631565
<STORAGE></STORAGE>
1564-
<COMMENTS>Indexes can have comments to.</COMMENTS>
1566+
<COMMENTS>Indexes can have comments too.</COMMENTS>
15651567
<RELID></RELID>
15661568
</INDEXKEY>
15671569
<INDEXKEY>
@@ -1579,7 +1581,27 @@
15791581
<USING></USING>
15801582
</PROPERTIES>
15811583
<STORAGE></STORAGE>
1582-
<COMMENTS>This is a multi column index.</COMMENTS>
1584+
<COMMENTS>This is a multi column index.
1585+
1586+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</COMMENTS>
1587+
<RELID></RELID>
1588+
</INDEXKEY>
1589+
<INDEXKEY>
1590+
<OID>{46FCEDB3-847A-47E3-99B2-EAC1737E6026}</OID>
1591+
<NAME>IX_BAR13</NAME>
1592+
<NAMEMASK>IX_%TABLE_NP%3</NAMEMASK>
1593+
<PRIMARY>0</PRIMARY>
1594+
<UNIQUE>1</UNIQUE>
1595+
<CONSTRAINT>0</CONSTRAINT>
1596+
<INDEXTYPE></INDEXTYPE>
1597+
<COLUMNS>c5</COLUMNS>
1598+
<KEYORDER>ASC</KEYORDER>
1599+
<KEYLENGTH>&quot;&quot;</KEYLENGTH>
1600+
<PROPERTIES>
1601+
<USING></USING>
1602+
</PROPERTIES>
1603+
<STORAGE></STORAGE>
1604+
<COMMENTS>A unique index.</COMMENTS>
15831605
<RELID></RELID>
15841606
</INDEXKEY>
15851607
</INDEXKEYS>
@@ -1605,7 +1627,8 @@
16051627
<DEFAULT></DEFAULT>
16061628
<LENGTH>40</LENGTH>
16071629
</PROPERTIES>
1608-
<DESCRIPTION>Column 1.</DESCRIPTION>
1630+
<DESCRIPTION>Column 1.
1631+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</DESCRIPTION>
16091632
<PRIMARYKEY>0</PRIMARYKEY>
16101633
<REQUIRED>0</REQUIRED>
16111634
<AUTOINCREMENT>0</AUTOINCREMENT>
@@ -1694,7 +1717,7 @@
16941717
<X>380</X>
16951718
<Y>460</Y>
16961719
<WIDTH>222</WIDTH>
1697-
<HEIGHT>208</HEIGHT>
1720+
<HEIGHT>230</HEIGHT>
16981721
<GEN_DDL>1</GEN_DDL>
16991722
<FONTDATA></FONTDATA>
17001723
<BACKCOLOR>255,255,255</BACKCOLOR>

test/source/quoted/php-erd-concepts-create.ddl

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/* FileName : php-erd-concepts.ecm */
66
/* Platform : MySQL 5 */
77
/* Version : Concept */
8-
/* Date : Sunday, March 19, 2023 */
8+
/* Date : Thursday, May 18, 2023 */
99
/*================================================================================*/
1010
/*================================================================================*/
1111
/* CREATE TABLES */
@@ -22,7 +22,9 @@ CREATE TABLE `BAR1` (
2222

2323
/*
2424
COMMENT ON TABLE `BAR1`
25-
This table is table BAR1.
25+
This table is table BAR1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Sed enim ut sem viverra. Proin libero nunc consequat interdum. Donec et odio pellentesque diam volutpat commodo sed. Dictum non consectetur a erat nam. Tempus quam pellentesque nec nam aliquam sem et tortor consequat. Fringilla ut morbi tincidunt augue interdum velit. Purus ut faucibus pulvinar elementum integer. Sit amet volutpat consequat mauris nunc congue. Arcu odio ut sem nulla pharetra diam sit amet nisl.
26+
27+
Dui ut ornare lectus sit. At quis risus sed vulputate odio ut enim. Est ante in nibh mauris cursus mattis. Id volutpat lacus laoreet non. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare massa. Netus et malesuada fames ac turpis. Pulvinar mattis nunc sed blandit libero volutpat. Aliquam faucibus purus in massa. Tempor id eu nisl nunc mi ipsum faucibus vitae aliquet. Pellentesque habitant morbi tristique senectus. Tempor nec feugiat nisl pretium fusce id velit ut tortor. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Varius vel pharetra vel turpis nunc. Elit eget gravida cum sociis natoque penatibus. Arcu bibendum at varius vel pharetra. Volutpat odio facilisis mauris sit. Risus quis varius quam quisque id. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Arcu ac tortor dignissim convallis aenean et tortor at. Amet venenatis urna cursus eget nunc scelerisque viverra.
2628
*/
2729

2830
/*
@@ -76,6 +78,7 @@ This is table FOO2. Same as FOO1, but without a primary key.
7678
/*
7779
COMMENT ON COLUMN `FOO2`.`c1`
7880
Column 1.
81+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
7982
*/
8083

8184
/*
@@ -96,12 +99,21 @@ CREATE INDEX `IX_BAR11` ON `BAR1` (`c2`);
9699

97100
/*
98101
COMMENT ON INDEX `IX_BAR11`
99-
Indexes can have comments to.
102+
Indexes can have comments too.
100103
*/
101104

102105
CREATE INDEX `IX_BAR12` ON `BAR1` (`c3`, `c4`, `c5`);
103106

104107
/*
105108
COMMENT ON INDEX `IX_BAR12`
106109
This is a multi column index.
110+
111+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
112+
*/
113+
114+
CREATE UNIQUE INDEX `IX_BAR13` ON `BAR1` (`c5`);
115+
116+
/*
117+
COMMENT ON INDEX `IX_BAR13`
118+
A unique index.
107119
*/

test/source/unquoted/php-erd-concepts-create.ddl

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/* FileName : php-erd-concepts.ecm */
66
/* Platform : MySQL 5 */
77
/* Version : Concept */
8-
/* Date : Sunday, March 19, 2023 */
8+
/* Date : Thursday, May 18, 2023 */
99
/*================================================================================*/
1010
/*================================================================================*/
1111
/* CREATE TABLES */
@@ -22,7 +22,9 @@ CREATE TABLE BAR1 (
2222

2323
/*
2424
COMMENT ON TABLE BAR1
25-
This table is table BAR1.
25+
This table is table BAR1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Sed enim ut sem viverra. Proin libero nunc consequat interdum. Donec et odio pellentesque diam volutpat commodo sed. Dictum non consectetur a erat nam. Tempus quam pellentesque nec nam aliquam sem et tortor consequat. Fringilla ut morbi tincidunt augue interdum velit. Purus ut faucibus pulvinar elementum integer. Sit amet volutpat consequat mauris nunc congue. Arcu odio ut sem nulla pharetra diam sit amet nisl.
26+
27+
Dui ut ornare lectus sit. At quis risus sed vulputate odio ut enim. Est ante in nibh mauris cursus mattis. Id volutpat lacus laoreet non. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare massa. Netus et malesuada fames ac turpis. Pulvinar mattis nunc sed blandit libero volutpat. Aliquam faucibus purus in massa. Tempor id eu nisl nunc mi ipsum faucibus vitae aliquet. Pellentesque habitant morbi tristique senectus. Tempor nec feugiat nisl pretium fusce id velit ut tortor. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Varius vel pharetra vel turpis nunc. Elit eget gravida cum sociis natoque penatibus. Arcu bibendum at varius vel pharetra. Volutpat odio facilisis mauris sit. Risus quis varius quam quisque id. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Arcu ac tortor dignissim convallis aenean et tortor at. Amet venenatis urna cursus eget nunc scelerisque viverra.
2628
*/
2729

2830
/*
@@ -76,6 +78,7 @@ This is table FOO2. Same as FOO1, but without a primary key.
7678
/*
7779
COMMENT ON COLUMN FOO2.c1
7880
Column 1.
81+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
7982
*/
8083

8184
/*
@@ -96,13 +99,21 @@ CREATE INDEX IX_BAR11 ON BAR1 (c2);
9699

97100
/*
98101
COMMENT ON INDEX IX_BAR11
99-
Indexes can have comments to.
102+
Indexes can have comments too.
100103
*/
101104

102105
CREATE INDEX IX_BAR12 ON BAR1 (c3, c4, c5);
103106

104107
/*
105108
COMMENT ON INDEX IX_BAR12
106109
This is a multi column index.
110+
111+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
107112
*/
108113

114+
CREATE UNIQUE INDEX IX_BAR13 ON BAR1 (c5);
115+
116+
/*
117+
COMMENT ON INDEX IX_BAR13
118+
A unique index.
119+
*/

0 commit comments

Comments
 (0)