@@ -184,10 +184,10 @@ def generate_insert_information(self, name, stix_object, **kwargs): # noqa: F81
184184
185185@add_method (ListProperty )
186186def generate_insert_information ( # noqa: F811
187- self , name , stix_object , level = 0 , is_extension = False ,
187+ self , name , stix_object , data_sink = None , level = 0 , is_extension = False ,
188188 foreign_key_value = None , schema_name = None , ** kwargs ,
189189):
190- data_sink = kwargs . get ( " data_sink" )
190+ db_backend = data_sink . db_backend
191191 table_name = kwargs .get ("table_name" )
192192 if isinstance (self .contained , ReferenceProperty ):
193193 insert_statements = list ()
@@ -226,7 +226,7 @@ def generate_insert_information( # noqa: F811
226226 elif isinstance (self .contained , EmbeddedObjectProperty ):
227227 insert_statements = list ()
228228 for value in stix_object [name ]:
229- with data_sink .database_connection .begin () as trans :
229+ with db_backend .database_connection .begin () as trans :
230230 next_id = trans .execute (data_sink .sequence )
231231 table = data_sink .tables_dictionary [canonicalize_table_name (table_name + "_" + name , schema_name )]
232232 bindings = {
@@ -248,7 +248,22 @@ def generate_insert_information( # noqa: F811
248248 )
249249 return insert_statements
250250 else :
251- return {name : stix_object [name ]}
251+ if db_backend .array_allowed ():
252+ return {name : stix_object [name ]}
253+ else :
254+ insert_statements = list ()
255+ table = data_sink .tables_dictionary [
256+ canonicalize_table_name (
257+ table_name + "_" + name ,
258+ schema_name ,
259+ )
260+ ]
261+ for elem in stix_object [name ]:
262+ bindings = {"id" : stix_object ["id" ], name : elem }
263+ insert_statements .append (insert (table ).values (bindings ))
264+ return insert_statements
265+
266+
252267
253268
254269@add_method (ReferenceProperty )
@@ -286,6 +301,7 @@ def generate_insert_for_array_in_table(table, values, foreign_key_value):
286301
287302
288303def generate_insert_for_external_references (data_sink , stix_object ):
304+ db_backend = data_sink .db_backend
289305 insert_statements = list ()
290306 next_id = None
291307 object_table = data_sink .tables_dictionary ["common.external_references" ]
@@ -295,7 +311,7 @@ def generate_insert_for_external_references(data_sink, stix_object):
295311 if prop in er :
296312 bindings [prop ] = er [prop ]
297313 if "hashes" in er :
298- with data_sink .database_connection .begin () as trans :
314+ with db_backend .database_connection .begin () as trans :
299315 next_id = trans .execute (data_sink .sequence )
300316 bindings ["hash_ref_id" ] = next_id
301317 else :
@@ -326,17 +342,22 @@ def generate_insert_for_granular_markings(data_sink, granular_markings_table, st
326342 bindings ["marking_ref" ] = marking_ref_value
327343 if db_backend .array_allowed ():
328344 bindings ["selectors" ] = granular_marking .get ("selectors" )
345+ insert_statements .append (insert (granular_markings_table ).values (bindings ))
329346 else :
347+ with db_backend .database_connection .begin () as trans :
348+ next_id = trans .execute (data_sink .sequence )
349+ bindings ["selectors" ] = next_id
350+ insert_statements .append (insert (granular_markings_table ).values (bindings ))
330351 table = data_sink .tables_dictionary [
331352 canonicalize_table_name (
332- granular_markings_table + "_selector" ,
353+ granular_markings_table . name + "_selector" ,
333354 db_backend .schema_for_core (),
334355 )
335356 ]
336357 for sel in granular_marking .get ("selectors" ):
337- selector_bindings = {"id" : stix_object [ "id" ] , "selector" : sel }
358+ selector_bindings = {"id" : next_id , "selector" : sel }
338359 insert_statements .append (insert (table ).values (selector_bindings ))
339- insert_statements . append ( insert ( granular_markings_table ). values ( bindings ))
360+
340361 return insert_statements
341362
342363
0 commit comments