def getNodes(node): as_nums = [] # AS numbers as_nodes = [] # Corresponding AS nodes ann_nodes = [] # announced nodes ann_id_list = [] # announced node IDs pref_nodes = getNodesRecursive(node, as_nums, ann_nodes, ann_id_list) # Create asnodes for all as numbers for AS in as_nums: as_nodes.append(asnode(AS)) #as_nodes = as_nums return pref_nodes, as_nodes, ann_nodes, ann_id_list
def addFileToNeo(filename): #Create Database db = DB() ########## Create binary tree in memory######### # Set global lists of modified nodes print "building tree from file" tree = make_tree(filename) pref_nodes, as_nodes, announced_nodes, announced_id = getNodes(tree) #print "Nr of announced nodes:", len(announced_nodes) #Delete tree to save memory, not needed any more tree = None print "Reading existing prefixes from database" db_pref_dict = db.getNodes('prefix') print "Redaing announced prefixes from database" db_announced_pref = db.getAnnouncedNodes() print "Reading existing AS nodes from database" db_as_dict = db.getNodes('as_number') ##### Compare db and dump prefix nodes########## new_nodes = [] updated_nodes = [] #print pref_nodes[0] for n in pref_nodes: # Check all nodes if n.id_hash in db_pref_dict: # Exists in DB if n.hashval != db_pref_dict[n.id_hash]: # Modified updated_nodes.append(n) # Update node else: # New node new_nodes.append(n) # List of new nodes # Create new nodes created_nodes = [] for n in new_nodes: res = db.createIndexed(n) created_nodes.append(res) print "Writing new prefixes to database..." db.finnish('node') ####Update modified nodes # Get references to originals print "Reading obsolete nodes..." for n in updated_nodes: db.getIndexed('prefix',n.id_hash) refs = db.finnish('read') # Add changes for i in range(0, len(updated_nodes)): db.update(updated_nodes[i], refs[i][0]) # Write changes to DB print "Writing updated nodes to database..." db.finnish('node') unannounced_node_id = [] #print db_announced_pref for n in db_announced_pref: if not n in announced_id: db.getIndexed('prefix', n) unannounced_node_id.append(n) print "Reading unannounced node references..." refs = db.finnish('read') for i in range(len(refs) -1): db.updateUnannounced(unannounced_node_id[i], refs[i][0]) # Write changes to DB print "Writing unannounced node updates to database..." db.finnish('node') # Create child relations for i in range(0, len(new_nodes)): if new_nodes[i].mask != 0: db.getIndexed('prefix', new_nodes[i].id_hash) db.getIndexed('prefix', new_nodes[i].getParentID()) print "Reading relation referenes for created nodes..." refs = db.finnish('read') # Write relations to database for i in range(0,len(new_nodes) - 1): db.createRel(refs[2*i + 1][0], "child", refs[2*i][0]) print "Writing relations for created nodes..." db.finnish('rel') ##### Create AS nodes and relations############################## new_nodes = [] # REUSED, pref nodes no longer needed #updated_nodes = [] # REUSED, pref nodes no longer needed # Classify nodes for n in as_nodes: if not n.id_hash in db_as_dict: # Exists in DB new_nodes.append(n) # List of new nodes # Create new nodes created_nodes = [] for n in new_nodes: res = db.createIndexed(n) created_nodes.append(res) print "Writing new AS nodes to database..." db.finnish('node') ##### Update modified nodes # AS NODES DO NOT GET MODIFIED, no update required # Delete all old announce relations # Consider optimizing this to just removing unused announcements db.delAllRels('announce') ###### Create announced relations #rel_hashes = db.getRelations('announce') #print "RELATION HASHES",rel_hashes ctr = 1 for i in range(len(announced_nodes)): for AS in announced_nodes[i].origin: db.getIndexed('prefix', announced_nodes[i].id_hash) db.getIndexed('as_number', asnode(AS).id_hash) ctr += 1 print "Reading relation referenes for announced nodes..." refs = db.finnish('read') #local_announce_rels = [] # Write relations to database for i in range(0,len(announced_nodes) - 1): if db.relHash(refs[2*i + 1][0], "announce", refs[2*i][0]) not in rel_hashes: db.createRel(refs[2*i + 1][0], "announce", refs[2*i][0]) print "Writing relations for created nodes..." db.finnish('rel') db.setMOAS() #h = db.relHash(refs[2*i + 1][0], "announce", refs[2*i][0]) #if h not in rel_hashes: #db.createRel(refs[2*i + 1][0], "announce", refs[2*i][0]) #else: # local_announce_rels.append(h) print "Writing announce relations..." db.finnish('rel') db.setMOAS() print "...exiting..."