Better foreign keys handling, slightly change SQL clues syntax
authorBenjamin Auder <benjamin.auder@somewhere>
Sat, 3 Feb 2018 00:00:51 +0000 (01:00 +0100)
committerBenjamin Auder <benjamin.auder@somewhere>
Sat, 3 Feb 2018 00:00:51 +0000 (01:00 +0100)
example.html
parser.js

index 4094835..3ab2458 100644 (file)
        let er =
                new ErDiags(`
                        [Musician]
-                       +id (integer)
+                       +id integer
                        name
                        band
-                       role (varchar not null)
+                       role varchar not null
 
                        [Instrument]
                        +name
-                       family (varchar not null default "Brass")
+                       family varchar not null default "Brass"
 
                        [Piano]
                        type
index 6d43d4f..2b75709 100644 (file)
--- a/parser.js
+++ b/parser.js
@@ -100,13 +100,12 @@ class ErDiags
                                field.isKey = true;
                                line = line.slice(1);
                        }
-                       field.name = line.match(/[^()"\s]+/)[0];
-                       let parenthesis = line.match(/\((.+)\)/);
-                       if (parenthesis !== null)
+                       field.name = line.match(/[^"\s]+/)[0];
+                       let sqlClues = line.substring(field.name.length).trim();
+                       if (sqlClues.length > 0)
                        {
-                               let sqlClues = parenthesis[1];
                                field.type = sqlClues.match(/[^\s]+/)[0]; //type is always the first indication (mandatory)
-                               field.qualifiers = sqlClues.substring(field.type.length).trim();
+                               field.qualifiers = sqlClues.substring(field.type.length);
                        }
                        attributes.push(field);
                }
@@ -167,12 +166,15 @@ class ErDiags
                Object.keys(this.entities).forEach( name => {
                        let newTable = [ ]; //array of fields
                        this.entities[name].attributes.forEach( attr => {
-                               newTable.push({
+                               let newField = {
                                        name: attr.name,
                                        type: attr.type,
                                        isKey: attr.isKey,
                                        qualifiers: attr.qualifiers,
-                               });
+                               };
+                               if (!!attr.qualifiers && !!attr.qualifiers.match(/foreign/i))
+                                       Object.assign(newField, {ref: attr.qualifiers.match(/references ([^\s]+)/i)[1]});
+                               newTable.push(newField);
                        });
                        this.tables[name] = newTable;
                });
@@ -439,7 +441,7 @@ class ErDiags
                        mldDot += '"' + name + '" [label=<<table BORDER="1" ALIGN="LEFT" CELLPADDING="5" CELLSPACING="0">\n';
                        mldDot += '<tr><td BGCOLOR="#ae7d4e" BORDER="0"><font COLOR="#FFFFFF">' + name + '</font></td></tr>\n';
                        this.tables[name].forEach( f => {
-                               let label = (f.isKey ? '<u>' : '') + (!!f.qualifiers && f.qualifiers.indexOf("foreign")>=0 ? '#' : '') + f.name + (f.isKey ? '</u>' : '');
+                               let label = (f.isKey ? '<u>' : '') + (!!f.ref ? '#' : '') + f.name + (f.isKey ? '</u>' : '');
                                mldDot += '<tr><td port="' + f.name + '"' + ' BGCOLOR="#FFFFFF" BORDER="0" ALIGN="LEFT"><font COLOR="#000000" >' + label + '</font></td></tr>\n';
                                if (!!f.ref)
                                {
@@ -484,7 +486,8 @@ class ErDiags
                        sqlText += "CREATE TABLE " + name + " (\n";
                        let key = "";
                        this.tables[name].forEach( f => {
-                               sqlText += "\t" + f.name + " " + (f.type || "TEXT") + " " + (f.qualifiers || "") + ",\n";
+                               let type = f.type || (f.isKey ? "INTEGER" : "TEXT");
+                               sqlText += "\t" + f.name + " " + type + " " + (f.qualifiers || "") + ",\n";
                                if (f.isKey)
                                        key += (key.length>0 ? "," : "") + f.name;
                        });