diff --git a/stix2/datastore/relational_db/input_creation.py b/stix2/datastore/relational_db/input_creation.py index 12dcb966..407b195c 100644 --- a/stix2/datastore/relational_db/input_creation.py +++ b/stix2/datastore/relational_db/input_creation.py @@ -2,7 +2,7 @@ from stix2.datastore.relational_db.add_method import add_method from stix2.datastore.relational_db.utils import ( - SCO_COMMON_PROPERTIES, SDO_COMMON_PROPERTIES, canonicalize_table_name, + SCO_COMMON_PROPERTIES, SDO_COMMON_PROPERTIES, canonicalize_table_name, shorten_extension_definition_id ) from stix2.properties import ( BinaryProperty, BooleanProperty, DictionaryProperty, @@ -153,9 +153,10 @@ def generate_insert_information(self, name, stix_object, data_sink=None, table_n for ex_name, ex in stix_object["extensions"].items(): # ignore new extensions - they have no properties if ex.extension_type is None or not ex.extension_type.startswith("new"): - if ex_name.startswith("extension-definition"): - ex_name = ex_name[0:30] - ex_name = ex_name.replace("extension-definition-", "ext_def") + if ex_name.startswith("extension-definition--"): + # ex_name = ex_name[0:30] + # ex_name = ex_name.replace("extension-definition-", "ext_def") + ex_name = shorten_extension_definition_id(ex_name) bindings = { "id": stix_object["id"], "ext_table_name": canonicalize_table_name(ex_name, schema_name), @@ -510,9 +511,10 @@ def generate_insert_for_sub_object( bindings["id"] = foreign_key_value if parent_table_name and (not is_extension or level > 0): type_name = parent_table_name + "_" + type_name - if type_name.startswith("extension-definition"): - type_name = type_name[0:30] - type_name = type_name.replace("extension-definition-", "ext_def") + if type_name.startswith("extension-definition--"): + # type_name = type_name[0:30] + # type_name = type_name.replace("extension-definition-", "ext_def") + type_name = shorten_extension_definition_id(type_name) sub_insert_statements = list() for name, prop in stix_object._properties.items(): if name in stix_object: diff --git a/stix2/datastore/relational_db/table_creation.py b/stix2/datastore/relational_db/table_creation.py index b9ca5641..14ffe663 100644 --- a/stix2/datastore/relational_db/table_creation.py +++ b/stix2/datastore/relational_db/table_creation.py @@ -7,7 +7,7 @@ from stix2.datastore.relational_db.utils import ( SCO_COMMON_PROPERTIES, SDO_COMMON_PROPERTIES, canonicalize_table_name, determine_column_name, determine_sql_type_from_stix, flat_classes, - get_stix_object_classes, + get_stix_object_classes, shorten_extension_definition_id ) from stix2.properties import ( BinaryProperty, BooleanProperty, DictionaryProperty, @@ -800,9 +800,10 @@ def generate_object_table( else: table_name = stix_object_class.__name__ # avoid long table names - if table_name.startswith("extension-definition"): - table_name = table_name[0:30] - table_name = table_name.replace("extension-definition-", "ext_def") + if table_name.startswith("extension-definition--"): + # table_name = table_name[0:30] + # table_name = table_name.replace("extension-definition-", "ext_def") + table_name = shorten_extension_definition_id(table_name) if parent_table_name: table_name = parent_table_name + "_" + table_name if is_embedded_object: diff --git a/stix2/datastore/relational_db/utils.py b/stix2/datastore/relational_db/utils.py index 65257426..43ca4dc4 100644 --- a/stix2/datastore/relational_db/utils.py +++ b/stix2/datastore/relational_db/utils.py @@ -109,10 +109,10 @@ def table_name_for(stix_type_or_class): # Applies to registered extension-definition style extensions only. # Their "_type" attribute is actually set to the extension definition ID, # rather than a STIX type. - if table_name.startswith("extension-definition"): - table_name = table_name[0:30] - table_name = table_name.replace("extension-definition-", "ext_def") - + if table_name.startswith("extension-definition--"): + # table_name = table_name[0:30] + # table_name = table_name.replace("extension-definition-", "ext_def") + table_name = shorten_extension_definition_id(table_name) table_name = canonicalize_table_name(table_name) return table_name @@ -169,3 +169,12 @@ def determine_column_name(cls_or_inst): # noqa: F811 return "string_value" elif is_class_or_instance(cls_or_inst, TimestampProperty): return "timestamp_value" + + +def shorten_extension_definition_id(id): + id_parts = id.split("--") + uuid_parts = id_parts[1].split("-") + shortened_part = "" + for p in uuid_parts: + shortened_part = shortened_part + p[0] + p[-1] + return "ext_def_" + shortened_part \ No newline at end of file