Beispiel #1
0
 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")
Beispiel #2
0
 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")
Beispiel #3
0
    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()
Beispiel #5
0
            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
Beispiel #6
0
    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)
Beispiel #7
0
    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()
Beispiel #8
0
    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)
Beispiel #9
0
 def __init__(self, file_path):
     self.file_path = file_path
     self.processor = Processor()
     self.database = Database()
Beispiel #10
0
    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)
Beispiel #11
0
 def __init__(self):
     self.database = Database()
     self.naam = 'onbekend'
     self.script_template = os.path.realpath(BAGConfig.config.bagextract_home + '/db/script/%s')
Beispiel #12
0
    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)
Beispiel #13
0
 def __init__(self):
     self.database = Database()
     self.naam = 'onbekend'
Beispiel #14
0
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()
Beispiel #15
0
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()
Beispiel #16
0
 def __init__(self):
     self.database = Database()
Beispiel #17
0
    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)