def worker(): # Print start time Log.log.time("Start") # Extracts any data from any source files/dirs/zips/xml/csv etc Database().log_actie('start_extract', file_or_dir_path) reader = BAGFileReader(file_or_dir_path) reader.process() Database().log_actie('stop_extract', file_or_dir_path) # Print end time Log.log.time("End")
def worker(): # Print start time Log.log.time("Start") sql_script = 'adres-tabel.sql' # Extracts any data from any source files/dirs/zips/xml/csv etc Database().log_actie('start_maak_adressen', sql_script) processor = Processor() processor.processSQLScript(sql_script) Database().log_actie('stop_maak_adressen', sql_script) # Print end time Log.log.time("End")
def parseXML(self, file, naam): Log.log.startTimer("parseXML") xml = None try: xml = etree.parse(file) bericht = Log.log.endTimer("parseXML") Database().log_actie('xml_parse', naam, bericht) except (Exception), e: bericht = Log.log.error("fout %s in XML parsen, bestand=%s" % (str(e), str(naam))) Database().log_actie('xml_parse', naam, bericht, True)
def get_database(self): if self.soort == "postgres": from postgresdb import Database return Database() elif self.soort == "sqlite": from sqlitedb import Database return Database() else: #ga voorlopig uit van "postgres" from postgresdb import Database return Database()
def __init__(self, parent): wx.Dialog.__init__(self, parent, -1, 'Logging', size=(900, 600)) database = Database() rows = database.select('SELECT * FROM nlx_bag_log') table = wx.grid.Grid(self) table.CreateGrid(len(rows), 5) table.HideRowLabels() table.SetColLabelValue(0, "Tijd") table.SetColSize(0, 150) table.SetColLabelValue(1, "Actie") table.SetColSize(1, 140) table.SetColLabelValue(2, "Bestand") table.SetColSize(2, 340) table.SetColLabelValue(3, "Bericht") table.SetColSize(3, 160) table.SetColLabelValue(4, "Error") table.SetColSize(4, 80) index = 0 for log_rec in rows: # Skip overvloed logging if 'INFO' in log_rec[4]: continue table.SetCellValue(index, 0, str(log_rec[1]).split('.')[0]) table.SetCellValue(index, 1, str(log_rec[2])) table.SetCellValue(index, 2, str(log_rec[3])) table.SetCellValue(index, 3, str(log_rec[4])) table.SetCellValue(index, 4, str(log_rec[5])) index += 1
def processXML(self, naam, xml): if not xml: Database().log_actie('xml_processing', naam, 'geen xml document', True) return try: Log.log.info("processXML: " + naam) xmldoc = xml.getroot() # de processor bepaalt of het een extract of een mutatie is self.processor.processDOM(xmldoc) #Log.log.info(document) except (Exception), e: bericht = Log.log.error("fout %s in DOM processing, bestand=%s" % (str(e), str(naam))) Database().log_actie('xml_processing', naam, bericht, True)
def __init__(self, app): wx.Frame.__init__(self, None, -1, 'NLExtract-BAG', size=(1000, 500)) Log() self.app = app self.hoofdScherm() # Find homedir: we may have been started within .app or .exe!! bagextract_home = os.path.dirname(os.path.realpath(__file__)) if not os.path.isdir(os.path.join(bagextract_home, 'db')): bagextract_home = None # Init globale configuratie BAGConfig(None, home_path=bagextract_home) self.database = Database()
def processCSV(self, csvreader, naam='onbekend'): objecten = [] cols = csvreader.next() for record in csvreader: if record[0]: obj = BestuurlijkObjectFabriek(cols, record) if obj: objecten.append(obj) else: Log.log.warn("Geen object gevonden voor " + str(record)) # Verwerk het bestand, lees gemeente_woonplaatsen in de database bericht = "Insert objectCount=" + str(len(objecten)) Log.log.info(bericht) self.database.verbind() # We gaan er even vanuit dat de encoding van de CSVs UTF-8 is self.database.connection.set_client_encoding('UTF8') for obj in objecten: obj.insert() self.database.uitvoeren(obj.sql, obj.valuelist) self.database.commit() Database().log_actie('insert_database', naam, bericht)
def __init__(self, file_path): self.file_path = file_path self.processor = Processor() self.database = Database()
def processGemeentelijkeIndeling(self, node, naam='onbekend'): objecten = [] provincie_gemeente = defaultdict(dict) doc_tag = stripschema(node.tag) # XML schema: # <gemeentelijke_indeling # xmlns="http://nlextract.nl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" # xsi:schemaLocation="http://nlextract.nl gemeentelijke-indeling.xsd"> # ... # <indeling jaar="2016"> # ... # <provincie code="27" naam="Noord-Holland"> # <gemeente code="358" naam="Aalsmeer" begindatum="1970-01-01" /> # ... # <gemeente code="381" naam="Bussum" begindatum="1970-01-01" einddatum="2016-01-01" /> # ... # <gemeente code="1942" naam="Gooise Meren" begindatum="2016-01-01" /> # </provincie> # ... # </indeling> # ... # </gemeentelijke_indeling> if doc_tag == 'gemeentelijke_indeling': for indelingNode in node: if stripschema(indelingNode.tag) == 'indeling': # Ongebruikt: # jaar = indelingNode.get('jaar') for provincieNode in indelingNode: if stripschema(provincieNode.tag) == 'provincie': provinciecode = provincieNode.get('code') provincienaam = provincieNode.get('naam') for gemeenteNode in provincieNode: if stripschema(gemeenteNode.tag) == 'gemeente': gemeentecode = gemeenteNode.get('code') gemeentenaam = gemeenteNode.get('naam') begindatum = gemeenteNode.get('begindatum') einddatum = gemeenteNode.get('einddatum') provincie_gemeente[provinciecode][gemeentecode] = { 'provinciecode': provinciecode, 'provincienaam': provincienaam, 'gemeentecode': gemeentecode, 'gemeentenaam': gemeentenaam, 'begindatum': begindatum, 'einddatum': einddatum, } for provinciecode in sorted(provincie_gemeente.keys()): for gemeentecode in sorted(provincie_gemeente[provinciecode].keys()): obj = GemeentelijkeIndelingFabriek(provincie_gemeente[provinciecode][gemeentecode]) if obj: objecten.append(obj) else: Log.log.warn("Geen object gevonden voor provinciecode %s en gemeentecode %s" % (provinciecode, gemeentecode)) bericht = "Processed objectCount=" + str(len(objecten)) Log.log.info(bericht) self.database.verbind() updated = 0 inserted = 0 unchanged = 0 self.database.connection.set_client_encoding('UTF8') for obj in objecten: obj.exists() if self.database.uitvoeren(obj.sql, obj.valuelist): obj.unchanged() if self.database.uitvoeren(obj.sql, obj.valuelist): unchanged += 1 else: obj.update() self.database.uitvoeren(obj.sql, obj.valuelist) updated += 1 else: obj.insert() self.database.uitvoeren(obj.sql, obj.valuelist) inserted += 1 self.database.commit() log_bericht = "Objects inserted=" + str(inserted) + " updated=" + str(updated) + " unchanged=" + str(unchanged) Log.log.info(log_bericht) Database().log_actie('insert_database', naam, bericht + " " + log_bericht) else: bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag) Database().log_actie('n.v.t', self.naam, bericht)
def __init__(self): self.database = Database() self.naam = 'onbekend' self.script_template = os.path.realpath(BAGConfig.config.bagextract_home + '/db/script/%s')
def processDOM(self, node, naam='onbekend'): self.bagObjecten = [] self.naam = naam mode = "Onbekend" doc_tag = stripschema(node.tag) # 'BAG-Extract-Deelbestand-LVC': standaard BAG Element, VBO etc # 'BAG-GWR-Deelbestand-LVC': Koppeltabel Gemeente-Woonplaats-Relatie (alleen in BAG na plm aug 2012) if doc_tag == 'BAG-Extract-Deelbestand-LVC' or doc_tag == 'BAG-GWR-Deelbestand-LVC': mode = 'Nieuw' # firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "vraag": # TODO: Is het een idee om vraag als object ook af te # handelen en op te slaan vraag = child if doc_tag == 'BAG-GWR-Deelbestand-LVC': # Noteer ook de standdatum van de gemeente_woonplaats koppel tabel # zodat we weten welke datum/versie is gebruikt... # Probeer BAG extract datum uit XML te vinden vraag = stripNS(vraag) gwr_datum = vraag.xpath("StandTechnischeDatum/text()") if len(gwr_datum) > 0: # Gevonden ! gwr_datum = str(gwr_datum[0]) else: gwr_datum = "onbekend" # Opslaan (evt vervangen) als meta info self.database.log_meta("gem_woonplaats_rel_datum", gwr_datum) elif stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate") for productnode in producten: product_tag = stripschema(productnode.tag) if product_tag == 'LVC-product' or product_tag == 'GemeenteWoonplaatsRelatieProduct': self.bagObjecten = BAGObjectFabriek.bof.BAGObjectArrayBijXML(productnode) if product_tag == 'GemeenteWoonplaatsRelatieProduct': # Altijd de vorige weggooien self.database.log_actie('truncate_table', 'gemeente_woonplaats', 'altijd eerst leeg maken') self.database.tx_uitvoeren('truncate gemeente_woonplaats') bericht = Log.log.endTimer("objCreate - objs=" + str(len(self.bagObjecten))) self.database.log_actie('create_objects', self.naam, bericht) elif doc_tag == 'BAG-Mutaties-Deelbestand-LVC': mode = 'Mutatie' # firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate (mutaties)") for productnode in producten: if stripschema(productnode.tag) == 'Mutatie-product': origineelObj = None # Gebruik als sorteersleutel (datum+volgnr) tbv volgorde verwerking verwerkings_id = '' for mutatienode in productnode: if stripschema(mutatienode.tag) == 'Verwerking': # Verkijgen verwerkings_datum en volgnummer tbv sorteren mutatienode = stripNS(mutatienode) # Maak uniek vewerkings id string uit datum-tijd + volgnr verwerkings_tijdstip = str(mutatienode.xpath("TijdstipVerwerking/text()")[0]) verwerkings_volgnr = str(mutatienode.xpath("VolgnrVerwerking/text()")[0]) verwerkings_id = verwerkings_tijdstip + '.' + verwerkings_volgnr # print('verwerkings_id=%s' % verwerkings_id) elif stripschema(mutatienode.tag) == 'Nieuw': # Log.log.info("Nieuw Object") bag_objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode) for bag_obj in bag_objs: bag_obj.verwerkings_id = verwerkings_id self.bagObjecten.extend(bag_objs) elif stripschema(mutatienode.tag) == 'Origineel': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode) if len(objs) > 0: origineelObj = objs[0] elif stripschema(mutatienode.tag) == 'Wijziging': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode) if len(objs) > 0: nieuwObj = objs[0] if nieuwObj and origineelObj: nieuwObj.verwerkings_id = verwerkings_id nieuwObj.origineelObj = origineelObj self.bagObjecten.append(nieuwObj) # Log.log.info("Wijziging Object") origineelObj = None # Zie http://www.pythoncentral.io/how-to-sort-a-list-tuple-or-object-with-sorted-in-python # Tbv sorteren self.bagObjecten array op verwerkings volgorde def get_verwerkings_id(bag_obj): return bag_obj.verwerkings_id # Sorteer te muteren objecten op verwerkings_id self.bagObjecten = sorted(self.bagObjecten, key=get_verwerkings_id) bericht = Log.log.endTimer("objCreate (mutaties) - objs=" + str(len(self.bagObjecten))) Database().log_actie('create_objects', self.naam, bericht) elif doc_tag == 'BAG-Extract-Levering': # Meta data: info over levering # Sla hele file op self.database.log_meta("levering_xml", etree.tostring(node, pretty_print=True).decode()) # Extraheer BAG lever datum # <v202:LVC-Extract> # <v202:gegVarLevenscyclus>true</v202:gegVarLevenscyclus> # <v202:productcode>DNLDLXAE02</v202:productcode> # <v202:StandTechnischeDatum>20120308</v202:StandTechnischeDatum> # </v202:LVC-Extract> node = stripNS(node) # Probeer BAG extract datum uit XML te vinden extract_datum = node.xpath("//LVC-Extract/StandTechnischeDatum/text()") if len(extract_datum) > 0: # Gevonden ! extract_datum = str(extract_datum[0]) else: extract_datum = "onbekend" # Opslaan als meta info self.database.log_meta("extract_datum", extract_datum) Database().log_actie('verwerkt', self.naam, 'verwerken Leverings doc') else: bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag) Database().log_actie('n.v.t', self.naam, bericht) return Log.log.startTimer("dbStart mode = " + mode) # Experimenteel: dbStoreCopy() gebruikt COPY ipv INSERT # maar moet nog gefinetuned if mode == 'Mutatie': # Voor mutaties voorlopig nog even ouderwetse INSERT/UPDATE # Hier speelt performance ook niet zo'n rol als bij hele BAG inlezen... bericht = self.dbStoreInsert(mode) else: bericht = self.dbStoreCopy(mode) Database().log_actie('insert_database', self.naam, bericht)
def __init__(self): self.database = Database() self.naam = 'onbekend'
def main(): """ Voorbeelden: 1. Initialiseer een database: python bagextract.py -H localhost -d bag -U postgres -W postgres -c 2. Importeer een extract in de database: python bagextract.py -H localhost -d bag -U postgres -W postgres -e 9999STA01052011-000002.xml of python bagextract.py -H localhost -d bag -U postgres -W postgres -e 9999STA01052011.zip Importeer gemeente_woonplaats informatie van het kadaster http://www.kadaster.nl/bag/docs/BAG_Overzicht_aangesloten_gemeenten.zip python bagextract.py -H localhost -d bag -U postgres -W postgres -e BAG_Overzicht_aangesloten_gemeenten.zip Theoretisch is het mogelijk de hele bag in te lezen vanuit de "hoofd" zip, maar dit is nog niet getest op geheugen-problemen. """ parser = ArgParser( description= 'bag-extract, commandline tool voor het extraheren en inlezen van BAG bestanden', epilog= "Configureer de database in extract.conf of geef eigen versie van extract.conf via -f of geef parameters via commando regel expliciet op" ) parser.add_argument( '-c', '--dbinit', action='store_true', help= 'verwijdert (DROP TABLE) alle tabellen en maakt (CREATE TABLE) nieuwe tabellen aan' ) parser.add_argument('-d', '--database', metavar='<naam>', help='geef naam van de database') parser.add_argument('-s', '--schema', metavar='<naam>', help='geef naam van het database schema') parser.add_argument( '-f', '--config', metavar='<bestand>', help='gebruik dit configuratiebestand i.p.v. extract.conf') parser.add_argument( '-q', '--query', metavar='<bestand>', help='voer database bewerkingen uit met opgegeven SQL bestand') parser.add_argument( '-e', '--extract', metavar='<naam>', help= 'importeert of muteert de database met gegeven BAG-bestand of -directory' ) parser.add_argument('-H', '--host', metavar='<hostnaam of -adres>', help='verbind met de database op deze host') parser.add_argument('-U', '--username', metavar='<naam>', help='verbind met database met deze gebruikersnaam') parser.add_argument('-p', '--port', metavar='<poort>', help='verbind met database naar deze poort') parser.add_argument('-W', '--password', metavar='<paswoord>', help='gebruikt dit wachtwoord voor database gebruiker') parser.add_argument( '-w', '--no-password', action='store_true', help='gebruik geen wachtwoord voor de database verbinding') parser.add_argument( '-v', '--verbose', action='store_true', help='toon uitgebreide informatie tijdens het verwerken') parser.add_argument( '-D', '--dbinitcode', action='store_true', help='createert een lijst met statements om het DB script aan te passen' ) # Initialiseer args = parser.parse_args() # Initialize singleton Log object so we can use one global instance Log(args) # Init globale configuratie BAGConfig(args) # Database database = Database() if args.dbinit: if confirm( 'Waarschuwing! met dit commando worden database tabellen opnieuw aangemaakt. Doorgaan?', False): # Print start time Log.log.time("Start") # Dumps all tables and recreates them db_script = os.path.realpath(BAGConfig.config.bagextract_home + '/db/script/bag-db.sql') Log.log.info( "alle database tabellen weggooien en opnieuw aanmaken...") try: database.initialiseer(db_script) except Exception as e: Log.log.fatal("Kan geen verbinding maken met de database") sys.exit() Log.log.info( "Initieele data (bijv. gemeenten/provincies) inlezen...") from bagfilereader import BAGFileReader # from bagobject import VerblijfsObjectPand, AdresseerbaarObjectNevenAdres, VerblijfsObjectGebruiksdoel, Woonplaats, OpenbareRuimte, Nummeraanduiding, Ligplaats, Standplaats, Verblijfsobject, Pand myreader = BAGFileReader(BAGConfig.config.bagextract_home + '/db/data') myreader.process() Log.log.info("Views aanmaken...") db_script = os.path.realpath( BAGConfig.config.bagextract_home + '/db/script/bag-view-actueel-bestaand.sql') database.file_uitvoeren(db_script) # Print end time Log.log.time("End") else: exit() elif args.dbinitcode: # Print start time Log.log.time("Start") # Creates the insert statements from the code, and prints them bagObjecten = [] bagObjecten.append(VerblijfsObjectPand()) bagObjecten.append(AdresseerbaarObjectNevenAdres()) bagObjecten.append(VerblijfsObjectGebruiksdoel()) bagObjecten.append(Woonplaats()) bagObjecten.append(OpenbareRuimte()) bagObjecten.append(Nummeraanduiding()) bagObjecten.append(Ligplaats()) bagObjecten.append(Standplaats()) bagObjecten.append(Verblijfsobject()) bagObjecten.append(Pand()) for bagObject in bagObjecten: print(bagObject.maakTabel()) # Print end time Log.log.time("End") elif args.extract: from bagfilereader import BAGFileReader from bagobject import VerblijfsObjectPand, AdresseerbaarObjectNevenAdres, VerblijfsObjectGebruiksdoel, Woonplaats, OpenbareRuimte, Nummeraanduiding, Ligplaats, Standplaats, Verblijfsobject, Pand # Print start time Log.log.time("Start") # Extracts any data from any source files/dirs/zips/xml/csv etc Database().log_actie('start_extract', args.extract) myreader = BAGFileReader(args.extract) myreader.process() Database().log_actie('stop_extract', args.extract) # Print end time Log.log.time("End") elif args.query: # Print start time Log.log.time("Start") # Voer willekeurig SQL script uit uit Database().log_actie('start_query', args.query) database = Database() database.file_uitvoeren(args.query) Database().log_actie('stop_query', args.query) # Print end time Log.log.time("End") else: parser.error("Command line parameters niet herkend") sys.exit()
def main(): """ Voorbeelden: 1. Initialiseer een database: python bagextract.py -H localhost -d bag -U postgres -W postgres -c 2. Importeer een extract in de database: python bagextract.py -H localhost -d bag -U postgres -W postgres -e 9999STA01052011-000002.xml of python bagextract.py -H localhost -d bag -U postgres -W postgres -e 9999STA01052011.zip Importeer gemeente_woonplaats informatie van het kadaster http://www.kadaster.nl/bag/docs/BAG_Overzicht_aangesloten_gemeenten.zip python bagextract.py -H localhost -d bag -U postgres -W postgres -e BAG_Overzicht_aangesloten_gemeenten.zip Theoretisch is het mogelijk de hele bag in te lezen vanuit de "hoofd" zip, maar dit is nog niet getest op geheugen-problemen. """ parser = ArgParser( description= 'bag-extract, commandline tool voor het extraheren en inlezen van BAG bestanden', epilog= "Configureer de database in extract.conf of geef eigen versie van extract.conf via -f of geef parameters via commando regel expliciet op" ) parser.add_argument( '-c', '--dbinit', action='store_true', help= 'verwijdert (DROP TABLE) alle tabellen en maakt (CREATE TABLE) nieuwe tabellen aan' ) parser.add_argument('-d', '--database', metavar='<naam>', help='geef naam van de database') parser.add_argument('-s', '--schema', metavar='<naam>', help='geef naam van het database schema') parser.add_argument( '-f', '--config', metavar='<bestand>', help='gebruik dit configuratiebestand i.p.v. extract.conf') parser.add_argument( '-q', '--query', metavar='<bestand>', help='voer database bewerkingen uit met opgegeven SQL bestand') parser.add_argument( '-e', '--extract', metavar='<naam>', help= 'importeert of muteert de database met gegeven BAG-bestand of -directory' ) parser.add_argument('-H', '--host', metavar='<hostnaam of -adres>', help='verbind met de database op deze host') parser.add_argument('-U', '--username', metavar='<naam>', help='verbind met database met deze gebruikersnaam') parser.add_argument('-p', '--port', metavar='<poort>', help='verbind met database naar deze poort') parser.add_argument('-W', '--password', metavar='<paswoord>', help='gebruikt dit wachtwoord voor database gebruiker') parser.add_argument( '-w', '--no-password', action='store_true', help='gebruik geen wachtwoord voor de database verbinding') parser.add_argument( '-v', '--verbose', action='store_true', help='toon uitgebreide informatie tijdens het verwerken') # Initialiseer args = parser.parse_args() # Initialize singleton Log object so we can use one global instance Log(args) # Init globale configuratie BAGConfig(args) # Database database = Database() # Print start time Log.log.time("Start") if args.dbinit: # Dumps all tables and recreates them db_script = os.path.realpath(BAGConfig.config.bagextract_home + '/db/script/bag-db.sql') Log.log.info("alle database tabellen weggooien en opnieuw aanmaken...") database.initialiseer(db_script) Log.log.info("Initieele data (bijv. gemeenten/provincies) inlezen...") myreader = BAGFileReader(BAGConfig.config.bagextract_home + '/db/data') myreader.process() Log.log.info("Views aanmaken...") db_script = os.path.realpath( BAGConfig.config.bagextract_home + '/db/script/bag-view-actueel-bestaand.sql') database.file_uitvoeren(db_script) elif args.extract: # Extracts any data from any source files/dirs/zips/xml/csv etc myreader = BAGFileReader(args.extract) myreader.process() elif args.query: # Voer willekeurig SQL script uit uit database = Database() database.file_uitvoeren(args.query) else: Log.log.fatal( "je geeft een niet-ondersteunde optie. Tip: probeer -h optie") # Print end time Log.log.time("End") sys.exit()
def __init__(self): self.database = Database()
def processDOM(self, node): self.bagObjecten = [] mode = "Onbekend" doc_tag = stripschema(node.tag) # 'BAG-Extract-Deelbestand-LVC': standaard BAG Element, VBO etc # 'BAG-GWR-Deelbestand-LVC': Koppeltabel Gemeente-Woonplaats-Relatie (alleen in BAG na plm aug 2012) if doc_tag == 'BAG-Extract-Deelbestand-LVC' or doc_tag == 'BAG-GWR-Deelbestand-LVC': mode = 'Nieuw' #firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "vraag": # TODO: Is het een idee om vraag als object ook af te # handelen en op te slaan vraag = child if doc_tag == 'BAG-GWR-Deelbestand-LVC': # Noteer ook de standdatum van de gemeente_woonplaats koppel tabel # zodat we weten welke datum/versie is gebruikt... # Probeer BAG extract datum uit XML te vinden vraag = stripNS(vraag) gwr_datum = vraag.xpath( "StandTechnischeDatum/text()") if len(gwr_datum) > 0: # Gevonden ! gwr_datum = str(gwr_datum[0]) else: gwr_datum = "onbekend" # Opslaan (evt vervangen) als meta info self.database.log_meta( "gem_woonplaats_rel_datum", gwr_datum) elif stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate") for productnode in producten: product_tag = stripschema(productnode.tag) if product_tag == 'LVC-product' or product_tag == 'GemeenteWoonplaatsRelatieProduct': self.bagObjecten = BAGObjectFabriek.bof.BAGObjectArrayBijXML( productnode) if product_tag == 'GemeenteWoonplaatsRelatieProduct': # Altijd de vorige weggooien Database().log_actie( 'truncate_table', 'gemeente_woonplaats', 'altijd eerst leeg maken') Database().tx_uitvoeren( 'truncate gemeente_woonplaats') bericht = Log.log.endTimer( "objCreate - objs=" + str(len(self.bagObjecten))) Database().log_actie('create_objects', 'idem', bericht) elif doc_tag == 'BAG-Mutaties-Deelbestand-LVC': mode = 'Mutatie' #firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate (mutaties)") for productnode in producten: if stripschema( productnode.tag) == 'Mutatie-product': origineelObj = None nieuwObj = None for mutatienode in productnode: if stripschema( mutatienode.tag) == 'Nieuw': # Log.log.info("Nieuw Object") self.bagObjecten.extend( BAGObjectFabriek.bof. BAGObjectArrayBijXML( mutatienode)) elif stripschema(mutatienode.tag ) == 'Origineel': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML( mutatienode) if len(objs) > 0: origineelObj = objs[0] elif stripschema(mutatienode.tag ) == 'Wijziging': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML( mutatienode) if len(objs) > 0: nieuwObj = objs[0] if nieuwObj and origineelObj: nieuwObj.origineelObj = origineelObj self.bagObjecten.append( nieuwObj) # Log.log.info("Wijziging Object") origineelObj = None nieuwObj = None bericht = Log.log.endTimer( "objCreate (mutaties) - objs=" + str(len(self.bagObjecten))) Database().log_actie('create_objects', 'idem', bericht) elif doc_tag == 'BAG-Extract-Levering': # Meta data: info over levering # Sla hele file op self.database.log_meta("levering_xml", etree.tostring(node, pretty_print=True)) # Extraheer BAG lever datum # <v202:LVC-Extract> # <v202:gegVarLevenscyclus>true</v202:gegVarLevenscyclus> # <v202:productcode>DNLDLXAE02</v202:productcode> # <v202:StandTechnischeDatum>20120308</v202:StandTechnischeDatum> # </v202:LVC-Extract> node = stripNS(node) # Probeer BAG extract datum uit XML te vinden extract_datum = node.xpath( "//LVC-Extract/StandTechnischeDatum/text()") if len(extract_datum) > 0: # Gevonden ! extract_datum = str(extract_datum[0]) else: extract_datum = "onbekend" # Opslaan als meta info self.database.log_meta("extract_datum", extract_datum) else: bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag) Database().log_actie('n.v.t', 'n.v.t', bericht) return Log.log.startTimer("dbStart mode = " + mode) # Experimenteel: dbStoreCopy() gebruikt COPY ipv INSERT # maar moet nog gefinetuned if mode == 'Mutatie': # Voor mutaties voorlopig nog even ouderwetse INSERT/UPDATE # Hier speelt performance ook niet zo'n rol als bij hele BAG inlezen... bericht = self.dbStoreInsert(mode) else: bericht = self.dbStoreCopy(mode) Database().log_actie('insert_database', 'idem', bericht)