170 lines
4.2 KiB
TypeScript
170 lines
4.2 KiB
TypeScript
|
|
const output_mysql : type_output = {
|
||
|
|
"render": function (input_data) {
|
||
|
|
return (
|
||
|
|
input_data["domains"]
|
||
|
|
.map(
|
||
|
|
(domain) => lib_plankton.string.coin(
|
||
|
|
"CREATE TABLE\n\t`{{name}}`(\n{{entries}}\n\t){{comment}}\n;",
|
||
|
|
{
|
||
|
|
"name": domain["name"],
|
||
|
|
"comment": (
|
||
|
|
(
|
||
|
|
! domain.hasOwnProperty("description")
|
||
|
|
||
|
||
|
|
(domain["description"] === null)
|
||
|
|
)
|
||
|
|
? ""
|
||
|
|
: lib_plankton.string.coin(
|
||
|
|
" COMMENT '{{comment}}'",
|
||
|
|
{
|
||
|
|
"comment": domain["description"],
|
||
|
|
}
|
||
|
|
)
|
||
|
|
),
|
||
|
|
"entries": (
|
||
|
|
(
|
||
|
|
[]
|
||
|
|
// key field
|
||
|
|
.concat(
|
||
|
|
(domain["key_field"] === null)
|
||
|
|
? []
|
||
|
|
: lib_plankton.string.coin(
|
||
|
|
"`{{name}}` {{parameters}}",
|
||
|
|
{
|
||
|
|
"name": domain["key_field"]["name"],
|
||
|
|
"parameters": (
|
||
|
|
[
|
||
|
|
"INTEGER",
|
||
|
|
"PRIMARY KEY",
|
||
|
|
"AUTO INCREMENT",
|
||
|
|
]
|
||
|
|
.concat(
|
||
|
|
(
|
||
|
|
! domain["key_field"].hasOwnProperty("description")
|
||
|
|
||
|
||
|
|
(domain["key_field"]["description"] === null)
|
||
|
|
)
|
||
|
|
? []
|
||
|
|
: [
|
||
|
|
lib_plankton.string.coin(
|
||
|
|
"COMMENT '{{comment}}'",
|
||
|
|
{
|
||
|
|
"comment": domain["key_field"]["description"],
|
||
|
|
}
|
||
|
|
),
|
||
|
|
]
|
||
|
|
)
|
||
|
|
.join(" ")
|
||
|
|
),
|
||
|
|
}
|
||
|
|
)
|
||
|
|
)
|
||
|
|
// data fields
|
||
|
|
.concat(
|
||
|
|
domain["data_fields"]
|
||
|
|
.map(
|
||
|
|
(data_field) => lib_plankton.string.coin(
|
||
|
|
"`{{name}}` {{parameters}}",
|
||
|
|
{
|
||
|
|
"name": data_field["name"],
|
||
|
|
"parameters": (
|
||
|
|
(
|
||
|
|
// type
|
||
|
|
[
|
||
|
|
{
|
||
|
|
"boolean": "BOOLEAN",
|
||
|
|
"integer": "INTEGER",
|
||
|
|
"string_short": "VARCHAR(63)",
|
||
|
|
"string_medium": "VARCHAR(255)",
|
||
|
|
"string_long": "TEXT",
|
||
|
|
}[data_field["type"]],
|
||
|
|
]
|
||
|
|
// nullability
|
||
|
|
.concat(
|
||
|
|
data_field["nullable"]
|
||
|
|
? ["NULL"]
|
||
|
|
: []
|
||
|
|
)
|
||
|
|
// comment
|
||
|
|
.concat(
|
||
|
|
(
|
||
|
|
! data_field.hasOwnProperty("description")
|
||
|
|
||
|
||
|
|
(data_field["description"] === null)
|
||
|
|
)
|
||
|
|
? []
|
||
|
|
: [
|
||
|
|
lib_plankton.string.coin(
|
||
|
|
"COMMENT '{{comment}}'",
|
||
|
|
{
|
||
|
|
"comment": data_field["description"],
|
||
|
|
}
|
||
|
|
),
|
||
|
|
]
|
||
|
|
)
|
||
|
|
)
|
||
|
|
.join(" ")
|
||
|
|
)
|
||
|
|
}
|
||
|
|
)
|
||
|
|
)
|
||
|
|
)
|
||
|
|
// constraints
|
||
|
|
.concat(
|
||
|
|
domain["constraints"]
|
||
|
|
.map(
|
||
|
|
(constraint) => {
|
||
|
|
switch (constraint["kind"]) {
|
||
|
|
default: {
|
||
|
|
throw (new Error("unhandled constraint kind: " + constraint["kind"]));
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case "foreign_key": {
|
||
|
|
return lib_plankton.string.coin(
|
||
|
|
"FOREIGN KEY ({{fields}}) REFERENCES `{{reference_name}}`({{reference_fields}})",
|
||
|
|
{
|
||
|
|
"fields": (
|
||
|
|
constraint["parameters"]["fields"]
|
||
|
|
.map(x => ('`' + x + '`'))
|
||
|
|
.join(",")
|
||
|
|
),
|
||
|
|
"reference_name": constraint["parameters"]["reference"]["name"],
|
||
|
|
"reference_fields": (
|
||
|
|
constraint["parameters"]["reference"]["fields"]
|
||
|
|
.map(x => ('`' + x + '`'))
|
||
|
|
.join(",")
|
||
|
|
),
|
||
|
|
}
|
||
|
|
);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case "unique": {
|
||
|
|
return lib_plankton.string.coin(
|
||
|
|
"UNIQUE ({{fields}})",
|
||
|
|
{
|
||
|
|
"fields": (
|
||
|
|
constraint["parameters"]["fields"]
|
||
|
|
.map(x => ('`' + x + '`'))
|
||
|
|
.join(",")
|
||
|
|
),
|
||
|
|
}
|
||
|
|
);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
)
|
||
|
|
)
|
||
|
|
)
|
||
|
|
.map(x => ("\t\t" + x))
|
||
|
|
.join(",\n")
|
||
|
|
),
|
||
|
|
}
|
||
|
|
)
|
||
|
|
)
|
||
|
|
.map(x => (x + "\n"))
|
||
|
|
.join("\n")
|
||
|
|
);
|
||
|
|
},
|
||
|
|
};
|