From ad109408b5fd3d9da5851ef3081c4cf35ffc9436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Tue, 16 May 2017 13:27:46 +0300 Subject: [PATCH] MXS-1216: Add real_type and length to cdc_schema.py The schema generator program needs to add the real_type and length fields if the data types define them. Also fixed a bug where the real_type and length fields were checked for generated fields. --- .../modules/protocol/examples/cdc_schema.py | 10 +++- server/modules/routing/avro/avro_schema.c | 52 +++++++++++-------- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/server/modules/protocol/examples/cdc_schema.py b/server/modules/protocol/examples/cdc_schema.py index 8b22bfd20..1f4c1bd84 100755 --- a/server/modules/protocol/examples/cdc_schema.py +++ b/server/modules/protocol/examples/cdc_schema.py @@ -33,7 +33,15 @@ opts = parser.parse_args(sys.argv[1:]) def parse_field(row): res = dict() - name = row[1].lower().split('(')[0] + parts = row[1].lower().split('(') + name = parts[0] + + res["real_type"] = name + + if len(parts) > 1: + res["length"] = int(parts[1].split(')')[0]) + else: + res["length"] = -1 if name in ("date", "datetime", "time", "timestamp", "year", "tinytext", "text", "mediumtext", "longtext", "char", "varchar", "enum", "set"): diff --git a/server/modules/routing/avro/avro_schema.c b/server/modules/routing/avro/avro_schema.c index 444b571a4..836144718 100644 --- a/server/modules/routing/avro/avro_schema.c +++ b/server/modules/routing/avro/avro_schema.c @@ -190,35 +190,41 @@ bool json_extract_field_names(const char* filename, TABLE_CREATE *table) if (json_is_object(val)) { - json_t* value; - - if ((value = json_object_get(val, "real_type")) && json_is_string(value)) - { - table->column_types[columns] = strdup(json_string_value(value)); - } - else - { - table->column_types[columns] = strdup("unknown"); - MXS_WARNING("No \"real_type\" value defined. Treating as unknown type field."); - } - - if ((value = json_object_get(val, "length")) && json_is_integer(value)) - { - table->column_lengths[columns] = json_integer_value(value); - } - else - { - table->column_lengths[columns] = -1; - MXS_WARNING("No \"length\" value defined. Treating as default length field."); - } - json_t *name = json_object_get(val, "name"); + if (name && json_is_string(name)) { const char *name_str = json_string_value(name); + if (not_generated_field(name_str)) { - table->column_names[columns++] = strdup(name_str); + table->column_names[columns] = strdup(name_str); + + json_t* value; + + if ((value = json_object_get(val, "real_type")) && json_is_string(value)) + { + table->column_types[columns] = strdup(json_string_value(value)); + } + else + { + table->column_types[columns] = strdup("unknown"); + MXS_WARNING("No \"real_type\" value defined. " + "Treating as unknown type field."); + } + + if ((value = json_object_get(val, "length")) && json_is_integer(value)) + { + table->column_lengths[columns] = json_integer_value(value); + } + else + { + table->column_lengths[columns] = -1; + MXS_WARNING("No \"length\" value defined. " + "Treating as default length field."); + } + + columns++; } } else