sindri/source/outputs/sqlite.ts
Christian Fraß e1d2344e69 [ini]
2023-02-20 14:46:28 +01:00

123 lines
3 KiB
TypeScript

const output_sqlite : 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)\n;",
{
"name": domain["name"],
"entries": (
(
[]
// key field
.concat(
(domain["key_field"] === null)
? []
: lib_plankton.string.coin(
"`{{name}}` {{parameters}}",
{
"name": domain["key_field"]["name"],
"parameters": (
[
"INTEGER",
"PRIMARY KEY",
"AUTOINCREMENT",
]
.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"]
: []
)
)
.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")
);
},
};