1- # from collections import OrderedDict
2-
31from sqlalchemy import ( # create_engine,; insert,
42 ARRAY , CheckConstraint , Column , ForeignKey , Integer , Table , Text ,
53 UniqueConstraint ,
1816 ObjectReferenceProperty , Property , ReferenceProperty , StringProperty ,
1917 TimestampProperty , TypeProperty ,
2018)
21- from stix2 .v21 .base import _Extension
19+ from stix2 .v21 .base import _Extension , _Observable
2220from stix2 .v21 .common import KillChainPhase
2321
2422
@@ -61,13 +59,14 @@ def derive_column_name(prop):
6159
6260
6361def create_object_markings_refs_table (metadata , db_backend , sco_or_sdo ):
62+ schema_name = db_backend .schema_for_core ()
6463 return create_ref_table (
6564 metadata ,
6665 db_backend ,
6766 {"marking-definition" },
6867 "object_marking_refs_" + sco_or_sdo ,
69- "common. core_" + sco_or_sdo + ".id" ,
70- "common" ,
68+ canonicalize_table_name ( " core_" + sco_or_sdo , schema_name ) + ".id" ,
69+ schema_name ,
7170 0 ,
7271 )
7372
@@ -174,7 +173,7 @@ def create_granular_markings_table(metadata, db_backend, sco_or_sdo):
174173 Column (
175174 "marking_ref" ,
176175 db_backend .determine_sql_type_for_reference_property (),
177- CheckConstraint ( db_backend .create_regex_constraint_expression ("marking_ref" , reg_ex ) ),
176+ db_backend .create_regex_constraint_expression ("marking_ref" , reg_ex ),
178177 ),
179178 ]
180179 if db_backend .array_allowed ():
@@ -229,12 +228,13 @@ def create_granular_markings_table(metadata, db_backend, sco_or_sdo):
229228
230229def create_external_references_tables (metadata , db_backend ):
231230 reg_ex = "'^[a-z][a-z0-9-]+[a-z0-9]--[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$'" # noqa: E131
231+ schema_name = db_backend .schema_for_core ()
232232 columns = [
233233 Column (
234234 "id" ,
235235 db_backend .determine_sql_type_for_key_as_id (),
236- ForeignKey ("common. core_sdo" + ".id" , ondelete = "CASCADE" ),
237- CheckConstraint ( db_backend .create_regex_constraint_expression ("id" , reg_ex ) )),
236+ ForeignKey (canonicalize_table_name ( " core_sdo", schema_name ) + ".id" , ondelete = "CASCADE" ),
237+ db_backend .create_regex_constraint_expression ("id" , reg_ex )),
238238 Column ("source_name" , db_backend .determine_sql_type_for_string_property ()),
239239 Column ("description" , db_backend .determine_sql_type_for_string_property ()),
240240 Column ("url" , db_backend .determine_sql_type_for_string_property ()),
@@ -243,8 +243,8 @@ def create_external_references_tables(metadata, db_backend):
243243 Column ("hash_ref_id" , db_backend .determine_sql_type_for_key_as_int (), autoincrement = False ),
244244 ]
245245 return [
246- Table ("external_references" , metadata , * columns , schema = "common" ),
247- create_hashes_table ("hashes" , metadata , db_backend , "common" , "external_references" , Integer ),
246+ Table ("external_references" , metadata , * columns , schema = schema_name ),
247+ create_hashes_table ("hashes" , metadata , db_backend , schema_name , "external_references" , Integer ),
248248 ]
249249
250250
@@ -256,7 +256,7 @@ def create_core_table(metadata, db_backend, stix_type_name):
256256 Column (
257257 "id" ,
258258 db_backend .determine_sql_type_for_key_as_id (),
259- CheckConstraint ( db_backend .create_regex_constraint_expression ("id" , reg_ex ) ),
259+ db_backend .create_regex_constraint_expression ("id" , reg_ex ),
260260 primary_key = True ,
261261 ),
262262 Column ("spec_version" , db_backend .determine_sql_type_for_string_property (), default = "2.1" ),
@@ -267,7 +267,7 @@ def create_core_table(metadata, db_backend, stix_type_name):
267267 Column (
268268 "created_by_ref" ,
269269 db_backend .determine_sql_type_for_reference_property (),
270- CheckConstraint ( db_backend .create_regex_constraint_expression ("created_by_ref" , reg_ex ) )),
270+ db_backend .create_regex_constraint_expression ("created_by_ref" , reg_ex )),
271271 Column ("created" , db_backend .determine_sql_type_for_timestamp_property ()),
272272 Column ("modified" , db_backend .determine_sql_type_for_timestamp_property ()),
273273 Column ("revoked" , db_backend .determine_sql_type_for_boolean_property ()),
@@ -399,8 +399,7 @@ def generate_table_information(self, name, db_backend, **kwargs): # noqa: F811
399399 name ,
400400 self .determine_sql_type (db_backend ),
401401 # this regular expression might accept or reject some legal base64 strings
402- CheckConstraint (db_backend .create_regex_constraint_expression (name , "'^[-A-Za-z0-9+/]*={0,3}$'" )
403- ),
402+ db_backend .create_regex_constraint_expression (name , "'^[-A-Za-z0-9+/]*={0,3}$'" ),
404403 nullable = not self .required ,
405404 )
406405
@@ -527,7 +526,7 @@ def generate_table_information(self, name, db_backend, **kwargs): # noqa: F811
527526 return Column (
528527 name ,
529528 self .determine_sql_type (db_backend ),
530- CheckConstraint ( db_backend .create_regex_constraint_expression (name , f"'^{ enum_re } $'" ) ),
529+ db_backend .create_regex_constraint_expression (name , f"'^{ enum_re } $'" ),
531530 nullable = not self .required ,
532531 )
533532
@@ -609,9 +608,7 @@ def generate_table_information(self, name, db_backend, **kwargs): # noqa: F811
609608 name ,
610609 db_backend .determine_sql_type_for_key_as_id (),
611610 ForeignKey (foreign_key_column , ondelete = "CASCADE" ),
612- CheckConstraint (
613- db_backend .create_regex_constraint_expression (name , id_req_exp )
614- ),
611+ db_backend .create_regex_constraint_expression (name , id_req_exp ),
615612 primary_key = True ,
616613 nullable = not (self .required ),
617614 )
@@ -723,14 +720,13 @@ def ref_column(name, specifics, db_backend, auth_type=0):
723720 types = "|" .join (specifics )
724721 if auth_type == 0 :
725722 reg_ex = f"'^({ types } )" + "--[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$'" # noqa: F811
726- constraint = \
727- CheckConstraint (db_backend .create_regex_constraint_expression (name , reg_ex ))
723+ constraint = db_backend .create_regex_constraint_expression (name , reg_ex )
728724 else :
729725 reg_ex = "'--[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$')"
730- constraint = \
731- CheckConstraint (db_backend .create_regex_constraint_expression (f"NOT({ name } " , f"'^({ types } )'" ) + " AND " +
732- db_backend .create_regex_constraint_expression (name , reg_ex ))
733- return Column (name , db_backend .determine_sql_type_for_reference_property (), constraint )
726+ # constraint = \
727+ # CheckConstraint(db_backend.create_regex_constraint_expression(f"NOT({name}", f"'^({types})'") + " AND " +
728+ # db_backend.create_regex_constraint_expression(name, reg_ex))
729+ return Column (name , db_backend .determine_sql_type_for_reference_property ()) # , constraint)
734730 else :
735731 return Column (
736732 name ,
@@ -805,7 +801,7 @@ def generate_object_table(
805801 core_properties = list ()
806802 columns = list ()
807803 tables = list ()
808- if schema_name == "sco" :
804+ if issubclass ( stix_object_class , _Observable ) :
809805 core_table = "sco"
810806 else :
811807 # sro, smo common properties are the same as sdo's
0 commit comments