in sources/cg_json_schema.c [993:1114]
static void cg_json_col_key_list(charbuf *output, ast_node *list) {
Contract(is_ast_col_key_list(list));
CHARBUF_OPEN(col_pk);
CHARBUF_OPEN(col_uk);
CHARBUF_OPEN(col_fk);
col_info info;
info.col_pk = &col_pk;
info.col_uk = &col_uk;
info.col_fk = &col_fk;
{
bprintf(output, "\"columns\" : [\n");
BEGIN_INDENT(cols, 2);
BEGIN_LIST;
for (ast_node *item = list; item; item = item->right) {
EXTRACT_ANY_NOTNULL(def, item->left);
if (is_ast_col_def(def)) {
COMMA;
info.def = def;
info.attrs = NULL;
cg_json_col_def(output, &info);
}
}
END_LIST;
END_INDENT(cols);
bprintf(output, "],\n");
}
ast_node *pk_def = NULL;
{
if (col_pk.used > 1) {
bprintf(output, "\"primaryKey\" : [ %s ],\n", col_pk.ptr);
bprintf(output, "\"primaryKeySortOrders\" : [ \"\" ],\n");
}
else {
for (ast_node *item = list; item; item = item->right) {
EXTRACT_ANY_NOTNULL(def, item->left);
if (is_ast_pk_def(def)) {
cg_json_pk_def(output, def);
pk_def = def;
}
}
if (!pk_def) {
bprintf(output, "\"primaryKey\" : [ ],\n");
bprintf(output, "\"primaryKeySortOrders\" : [ ],\n");
}
}
}
if (pk_def && pk_def->left) {
EXTRACT_STRING(pk_name, pk_def->left);
bprintf(output, "\"primaryKeyName\" : \"%s\",\n", pk_name);
}
{
bprintf(output, "\"foreignKeys\" : [\n");
BEGIN_INDENT(fks, 2);
BEGIN_LIST;
if (col_fk.used > 1) {
COMMA;
bprintf(output, "%s", col_fk.ptr);
}
for (ast_node *item = list; item; item = item->right) {
EXTRACT_ANY_NOTNULL(def, item->left);
if (is_ast_fk_def(def)) {
COMMA;
bprintf(output, "{\n");
BEGIN_INDENT(fk, 2);
cg_json_fk_def(output, def);
END_INDENT(fk);
bprintf(output, "\n}");
}
}
END_LIST;
END_INDENT(fks);
bprintf(output, "],\n");
}
{
bprintf(output, "\"uniqueKeys\" : [\n");
BEGIN_INDENT(uk, 2);
BEGIN_LIST;
if (col_uk.used > 1) {
COMMA;
bprintf(output, "%s", col_uk.ptr);
}
for (ast_node *item = list; item; item = item->right) {
EXTRACT_ANY_NOTNULL(def, item->left);
if (is_ast_unq_def(def)) {
COMMA;
cg_json_unq_def(output, def);
}
}
END_LIST;
END_INDENT(uk);
bprintf(output, "],\n");
}
{
bprintf(output, "\"checkExpressions\" : [\n");
BEGIN_INDENT(chk, 2);
BEGIN_LIST;
for (ast_node *item = list; item; item = item->right) {
EXTRACT_ANY_NOTNULL(def, item->left);
if (is_ast_check_def(def)) {
COMMA;
cg_json_check_def(output, def);
}
}
END_LIST;
END_INDENT(chk);
bprintf(output, "]");
}
CHARBUF_CLOSE(col_fk);
CHARBUF_CLOSE(col_uk);
CHARBUF_CLOSE(col_pk);
}