Ejemplo n.º 1
0
def importuj(swde_file, tableListString, srid, pyproj4strFrom, pyproj4strTo,
             rodz_importu, pgserver, pgbase, pguser, pguserpswd, txtcodec,
             id_zd):

    global id_jed_rej
    global ilosc_linii
    global pzgdic

    tableList = []  #tabela nazw tabel w bazie
    tableList = tableListString.split(',')

    import_testowy = False
    if rodz_importu == 'testowyJEW' or rodz_importu == 'testowyOBR' or rodz_importu == 'testowyDZE':
        import_testowy = True

    for tabName in tableList:
        if tabName <> 'NONE':
            print tabName
    print srid
    print pyproj4strFrom
    print pyproj4strTo
    print "identyfikator jednostki rejestrowej:", id_jed_rej
    print "ilość linii", ilosc_linii
    print "rodzaj importu", rodz_importu
    print pgserver, pgbase, pguser, pguserpswd

    uni = lambda s: s if type(s) == unicode else unicode(s, 'utf-8', 'replace')

    try:
        f = open(swde_file, "r")
        if f == 0 or f.closed:
            print u"Przed rozpoczęciem importu musisz wczytać plik"
        else:
            if id_zd == 'NONE':  #parametr wybierany przez uzytkownika, jesli jest inny niz NONE
                id_jed_rej = str(id_jed_rej).rstrip(
                )  #zostanie uzyty jako wymuszenie nazwy zbioru danych
            else:  #w innym przypadku uzyta zostanie nazwa jednostki rej wyłuskana przez program
                id_jed_rej = id_zd

            #lista column tablicowych - do innej obróbki niż pozostałe
            arrayCols = [
                'G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RSKD', 'G5RDOK',
                'G5RDZE', 'G5ROBJ'
            ]
            #słownik kolumn do zmiany nazwy - zmieniamy polskie znaki w nazwie kolumn bo trochę to broi przy pytaniach SQL
            plcharCols = {
                u'G5RŻONA': 'G5RZONA',
                u'G5RMĄŻ': 'G5RMAZ',
                u'G5RPWŁ': 'G5RPWL',
                u'G5RWŁ': 'G5RWL',
                u'G5RWŁS': 'G5RWLS',
                u'G5RWŁD': 'G5RWLD'
            }
            g5Cols = {
            }  #słownik zbudowany: {'nazwa_tabeli':Tablica_Column[]} - posluzy do inicjacji tabel - obiektow robdbtable
            #inicjalizacja  bazy danych
            rdbase = RobDBBase(pgserver, pgbase, pguser, pguserpswd, 1)
            rdg5Table = {
            }  #słownik zawiera następującą strukturę: {'nazwa_tabeli': Obiekt_rdbtable}

            #okreslenie rodzaju importu

            if rodz_importu == 'zwykly' or rodz_importu == 'aktualizacja':
                Cols = ['G5IDJ', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU',
                        'G5RKRG']  #g5jew
                g5Cols['G5JEW'] = Cols
                Cols = [
                    'G5IDD', 'GEOM', 'NR', 'G5IDR', 'G5NOS', 'G5WRT', 'G5DWR',
                    'G5PEW', 'G5RZN', 'G5DWW', 'G5RADR', 'G5RPWL', 'G5RPWD',
                    'G5RKRG', 'G5RJDR', 'G5DTW', 'G5DTU'
                ]  #g5dze
                g5Cols['G5DZE'] = Cols
                Cols = [
                    'G5NRO', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU', 'G5RKRG',
                    'G5RJEW', 'IDJEW'
                ]  #g5obr
                g5Cols['G5OBR'] = Cols
                Cols = [
                    'G5PLC', 'G5PSL', 'G5NIP', 'G5NZW', 'G5PIM', 'G5DIM',
                    'G5OIM', 'G5MIM', 'G5OBL', 'G5DOS', 'G5RADR', 'G5STI',
                    'G5DTW', 'G5DTU'
                ]  #g5osf
                g5Cols['G5OSF'] = Cols
                Cols = [
                    'G5STI', 'G5NPE', 'G5NSK', 'G5RGN', 'G5NIP', 'G5NZR',
                    'G5NRR', 'G5NSR', 'G5RADR', 'G5DTW', 'G5DTU'
                ]  #g5ins
                g5Cols['G5INS'] = Cols
                Cols = ['G5RZONA', 'G5RMAZ', 'G5DTW', 'G5DTU']  #g5mlz
                g5Cols['G5MLZ'] = Cols
                Cols = [
                    'G5STI', 'G5NPE', 'G5NSK', 'G5RGN', 'G5NIP', 'G5RSKD',
                    'G5RADR', 'G5DTW', 'G5DTU'
                ]  #g5osz
                g5Cols['G5OSZ'] = Cols
                Cols = [
                    'G5TJR', 'G5IJR', 'G5RGN', 'G5RWL', 'G5RWLS', 'G5RWLD',
                    'G5ROBR', 'G5DTW', 'G5DTU'
                ]  #g5jdr
                g5Cols['G5JDR'] = Cols
                Cols = ['G5UD', 'G5RWLS', 'G5RPOD', 'G5DTW', 'G5DTU']  #g5udz
                g5Cols['G5UDZ'] = Cols
                Cols = ['G5RWD', 'G5UD', 'G5RWLD', 'G5RPOD', 'G5DTW',
                        'G5DTU']  #g5udw
                g5Cols['G5UDW'] = Cols
                Cols = [
                    'G5OFU', 'G5OZU', 'G5OZK', 'G5PEW', 'G5RDZE', 'G5DTW',
                    'G5DTU'
                ]  #g5klu
                g5Cols['G5KLU'] = Cols
                Cols = [
                    'G5IDT', 'G5OZU', 'G5OFU', 'G5PEW', 'G5RKRG', 'G5ROBR',
                    'G5DTW', 'G5DTU'
                ]  #g5uzg
                g5Cols['G5UZG'] = Cols
                Cols = [
                    'G5KDK', 'G5DTD', 'G5DTP', 'G5SYG', 'G5NSR', 'G5OPD',
                    'G5RDOK', 'G5DTW', 'G5DTU'
                ]  #g5dok
                g5Cols['G5DOK'] = Cols
                Cols = [
                    'G5TAR', 'G5NAZ', 'G5KRJ', 'G5WJD', 'G5PWJ', 'G5GMN',
                    'G5ULC', 'G5NRA', 'G5NRL', 'G5MSC', 'G5KOD', 'G5PCZ',
                    'G5DTW', 'G5DTU'
                ]  #g5adr
                g5Cols['G5ADR'] = Cols
                Cols = [
                    'G5IDB', 'G5FUZ', 'G5WRT', 'G5DWR', 'G5RBB', 'G5PEW',
                    'G5PEU', 'G5RZN', 'G5SCN', 'G5RADR', 'G5RPWL', 'G5RPWD',
                    'G5RKRG', 'G5RJDR', 'G5RDZE', 'G5DTU', 'G5DTW'
                ]  #g5bud
                g5Cols['G5BUD'] = Cols
                Cols = [
                    'G5IDK', 'G5OZU', 'G5OZK', 'G5PEW', 'G5RKRG', 'G5ROBR',
                    'G5DTW', 'G5DTU'
                ]
                g5Cols['G5KKL'] = Cols
                Cols = [
                    'G5IDL', 'G5TLOK', 'G5PEW', 'G5PPP', 'G5LIZ', 'G5WRT',
                    'G5DWR', 'G5RJDR', 'G5RADR', 'G5RDOK', 'G5RBUD', 'G5DTW',
                    'G5DTU'
                ]
                g5Cols['G5LKL'] = Cols
                Cols = [
                    'G5NRZ', 'G5STZ', 'G5DZZ', 'G5DTA', 'G5DTZ', 'G5NAZ',
                    'G5ROBJ', 'G5RDOK', 'G5DTW', 'G5DTU'
                ]
                g5Cols['G5ZMN'] = Cols

            elif rodz_importu == 'testowyJEW' or rodz_importu == 'testowyOBR' or rodz_importu == 'testowyDZE':
                #teoretycznie powinno wystarczyć zwykle elif bez parametrow, ale na wszelki dorzuce te ory
                #w przypadku importu testowego importować będziemy tylko jedną z trzech tabel (dze, obr, lub jew)
                # przy okazji opróżnimy zawartość dotychczasowych tabel testowych
                delSQLstr = "delete from "
                if rodz_importu == 'testowyJEW':
                    tableList.append('G5JEW')
                    g5Cols['G5JEW'] = [
                        'G5IDJ', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU', 'G5RKRG'
                    ]  #g5jew
                    delSQLstr += "g5jew_test;"
                elif rodz_importu == 'testowyOBR':
                    tableList.append('G5OBR')
                    g5Cols['G5OBR'] = [
                        'G5NRO', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU', 'G5RKRG',
                        'G5RJEW', 'IDJEW'
                    ]
                    delSQLstr += "g5obr_test;"
                elif rodz_importu == 'testowyDZE':
                    tableList.append('G5DZE')
                    g5Cols['G5DZE'] = [
                        'G5IDD', 'GEOM', 'NR', 'G5IDR', 'G5NOS', 'G5WRT',
                        'G5DWR', 'G5PEW', 'G5RZN', 'G5DWW', 'G5RADR', 'G5RPWL',
                        'G5RPWD', 'G5RKRG', 'G5RJDR', 'G5DTW', 'G5DTU'
                    ]
                    delSQLstr += "g5dze_test;"

                rdbase.executeSQL(delSQLstr)

            #nazwy kolumn muszą zostać podane dokładnie jak w bazie - czyli małymi literami
            #na przyszłość można to rozwiązać w samej RobDBTable
            #za zamianę liter na małe w tablicy odpowiada ta fikuśna konstrukcja: [x.lower() ....]
            for tableName in tableList:
                if import_testowy:
                    appendix = '_TEST'
                else:
                    appendix = ''
                rdg5Table[tableName] = RobDBTable(
                    rdbase, tableName + appendix,
                    [x.lower() for x in g5Cols[tableName]], 1, 1)

            G5Table = ""

            collist = []
            valuelist = []
            insertdic = {}  # forma [nazwa_tabeli:ilosc_insertow]
            arraylist = [
            ]  #wykorzystywana do przechowywania kolumn typu tablicaowego w formie [[col2, wart..], [col1, wart..], [col2, wart..]]
            arrayvalue = [
            ]  # wykorzystywane do przechowywania danych 1+ takich jak g5rkrg
            arrayname = ''  # nazwa tablicy tożsama z nazwą kolumny w bazie
            pointslist = []
            point = []
            Kznak = ""  #znacznik + albo -, oznaczajacy czy okreslane sa punkty tworzace polygon czy
            #wycinajace w nim dziure
            oldKznak = "0"  #posluzy do sprawdzenia czy nastapila zmiana Kznak
            newPoly = 0
            polycount = 0

            linianr = 0  #przyda sie w momencie gdy sie program wywali - okresli ktora linia pliku swde nabroiła
            obieg = 0  #bedzie wykorzystywane przy commit do bazy, ktore bedzie realizowane co np 100 pytań SQL

            transform = False
            if import_testowy == False:  #tylko jesli nie jest to import testowy
                if pyproj4strFrom != pyproj4strTo:
                    transform = True
            print "transform:", transform

            print "Krok 2. Start programu: ", strftime("%Y-%m-%d %H:%M:%S")

            if rodz_importu == 'aktualizacja':
                #usuniecie wszystkich rekordow o id_zd
                print u"Usuwanie rekordów ze zbioru danych o id =  ", id_jed_rej
                #naprawde dziwna sprawa, ale bez tego dwukrotnie powtorzonego slepp-applicationevent

                print u"Rozpoczęcie usuwania aktualizowanych rekordów: ", strftime(
                    "%Y-%m-%d %H:%M:%S")
                rdbase.executeSQL("SELECT g5sp_delfromtables('" + id_jed_rej +
                                  "');")
                print u"Zakończono usuwanie aktualizowanych rekordów: ", strftime(
                    "%Y-%m-%d %H:%M:%S")
            #import_file = str(self.swde_file.toUtf8()).decode('utf-8')

            try:
                #self.f = open(self.swde_file "r")
                f.seek(0.0)
                tekstline = ""
                try:
                    print u"Krok 3. Rozpoczynam import pliku: ", f.name, " ", strftime(
                        "%Y-%m-%d %H:%M:%S")
                    i = 0
                    procent_wykonania = 0
                    #do monitorowania postepu
                    linianr = 0
                    step = ilosc_linii / 100

                    print u'ilość linii:', ilosc_linii, "step", step

                    for line in f.readlines():
                        tekstline = line  #zmienna tekstline bedzie wykorzystywana poza petla w celu lokalizacji bledu - w exception
                        if i == step:
                            i = 0
                            procent_wykonania += 1
                            sys.stdout.write("\r wykonano: %d%s" %
                                             (procent_wykonania, "%"))
                            sys.stdout.flush()
                            sleep(0.01)
                            #print u"postęp:", procent_wykonania, u"%"

                        line = unicode(line, txtcodec)
                        #print "unikod zadzialal"
                        i = i + 1
                        linianr += 1  #przyda sie jak sie program wypierniczy

                        pocz = StringBetweenChar(line, ',', 0)

                        if pocz == "RO" or pocz == "RD" or pocz == "RC":
                            #line = unicode(line, txtcodec)
                            G5Table = StringBetweenChar(line, ',', 2)
                            g5id1_value = StringBetweenChar(line, ',', 3)
                            g5id2_value = StringBetweenChar(line, ',', 4)
                        if line[0:3] == "P,P":
                            #self.dlg.peditOutput.appendPlainText(u"znaleziono ciąg line 0:3 = P,P")
                            str1 = StringBetweenChar(line, ',', 2)
                            #self.dlg.peditOutput.appendPlainText(u"str1 = " + str1 + u" o długości " + str(len(str1)) )
                            if str1 == u"G5PZG":
                                #self.dlg.peditOutput.appendPlainText(u"wlazło")
                                nr = StringBetweenChar(line, ',', 3)
                                #self.dlg.peditOutput.appendPlainText(u"nr = " + nr)
                                #strnr = nr.rstrip(';\r')# trzeba usuwac pojedynczo czyli tak jak poniżej
                                strnr = nr.rstrip(
                                )  # czyli jakiekolwiek białe znaki niezaleznie czy \n \r itp
                                strnr = strnr.rstrip(';')
                                #self.dlg.peditOutput.appendPlainText(u"strnr = " + strnr)
                                #oldline = line
                                #self.dlg.peditOutput.appendPlainText(u"oldline = " + oldline)
                                line = "P,G," + pzgdic[strnr] + ",;\n"
                                #self.dlg.peditOutput.appendPlainText(u"line = " + line)
                                #self.dlg.peditOutput.appendPlainText(u"Zastąpiono ciąg P,P >>" + oldline + "<< na >>" + line + "<< " + strftime("%Y-%m-%d %H:%M:%S"))

                        if G5Table in tableList:
                            colname = ""
                            colvalue = ""
                            znacznik = StringBetweenChar(line, ',', 0)
                            if znacznik == "D" or znacznik == "WG":
                                line = line.rstrip()
                                line = line.rstrip(
                                    ';'
                                )  # szczególnie linie ze znacznikami WG zakończone są średnikiem
                                line = line.strip("'")
                                line = line.strip('"')
                                line = line.replace("'", '')
                                line = line.replace('"', "")
                                colname = StringBetweenChar(line, ',', 1)
                                #zamiana nazw kolumn z polskimi znakami
                                if colname in plcharCols:
                                    colname = plcharCols[colname]
                                colvalue = StringBetweenChar(line, ',', 3)
                                #dzialania wspolne dla wszystkich tablic
                                if colname in g5Cols[G5Table]:
                                    #G5RDZE w G5KLU nie jest typu tablicowego, natomiast w g5BUD
                                    #jest. Na szczescie w g5klu nie ma żadnego pola tablicowego
                                    #to samo dotyczy g5radr - w g5osf i g5ins - nie jest array w przeciwienstwie do g5bud
                                    if colname in arrayCols and G5Table != 'G5KLU' and G5Table != 'G5INS' and G5Table != 'G5OSF':
                                        arraylist.append([colname, colvalue])

                                    else:
                                        collist.append(colname)
                                        valuelist.append(colvalue)

                                    #dzialania nietypowe
                                    #TODO przewidziec dla g5obr wyluskanie numeru obrebu do osobnego pola
                                    if colname == 'G5IDD' and G5Table == "G5DZE":  #trzeba wyluskac numer dzialki i zapisac do oddzielnej kolumny
                                        #nr_dzialki = StringBetweenChar(colvalue, '.', 2)
                                        collist.append(u'nr')
                                        valuelist.append(
                                            StringBetweenChar(
                                                colvalue, '.', 2))
                                        #nr obrębu też się przyda
                                        collist.append(u'nrobr')
                                        valuelist.append(
                                            StringBetweenChar(
                                                colvalue, '.', 1))

                                    if colname == 'G5RPOD':  #dla tabel g5udz i g5udw - wyglada to nastepujaco: "WG,G5RPOD,G5OSF,5465;"
                                        #a więc najpierw mamy określenie do jakiej tabeli jest dowiązanie (osf, ins, mlz czy osz)
                                        #a potem wartość wiązania w danej tabeli. Należy więc jeszcze wyciągnąć wartość po drugim ','
                                        collist.append(u'rpod_rodzaj')
                                        pod_rodzaj = StringBetweenChar(
                                            line, ',', 2)
                                        valuelist.append(pod_rodzaj)
                                        #kolumna zawierajaca polaczone ze soba wartosci
                                        collist.append(u'id_podmiot')
                                        valuelist.append(colvalue + pod_rodzaj)

                            elif znacznik == "K":
                                Kznak = StringBetweenChar(
                                    line, ',', 1)  #czyli albo '+;' albo '-;'
                                Kznak = Kznak[0]  #pozostawienie tylko + albo -
                                newPoly = 1
                                polycount += 1

                            elif znacznik == "P":
                                yvalue = StringBetweenChar(line, ',', 2)
                                xvalue = StringBetweenChar(line, ',', 3)
                                #print "xv:", xvalue, "yv:", yvalue
                                if transform:
                                    #print "transformacja"
                                    #p1 = pyproj.Proj(pyproj4strFrom)
                                    #p2 = pyproj.Proj(pyproj4strTo)
                                    p1 = pyproj.Proj(str(pyproj4strFrom))
                                    p2 = pyproj.Proj(str(pyproj4strTo))
                                    x92, y92 = pyproj.transform(
                                        p1, p2, xvalue, yvalue)
                                    value = str(x92) + " " + str(y92)
                                else:
                                    value = xvalue + " " + yvalue
                                point.append(polycount)
                                point.append(newPoly)
                                point.append(Kznak)
                                point.append(value)
                                pointslist.append(point)
                                #print point
                                point = []
                                newPoly = 0

                            elif znacznik[
                                    0] == "X":  #czyli koniec definicji recordu
                                #print "2 line", line
                                #print "2 znacznik = ", znacznik, collist, valuelist
                                p = ""
                                p1 = ""
                                if len(pointslist) > 0:
                                    for points in pointslist:
                                        if points[1] == 1:  #newPoly
                                            #p1 = points[3]
                                            if points[
                                                    0] == 1:  #czyli pierwszy i byc moze jedyny polygon
                                                if srid == -1:  #niezdefiniowany układ
                                                    p = "POLYGON(("
                                                else:
                                                    p = "@ST_GeomFromText(\'POLYGON(("
                                            else:  #czyli ewentualne kolejne polygony
                                                p = p + p1 + "),("
                                            p1 = points[3]
                                        p = p + points[3] + ','
                                    if srid == -1:
                                        p = p + p1 + "))"
                                    else:
                                        p = p + p1 + "))\'," + srid + ")"
                                    collist.append("geom")
                                    valuelist.append(p)

                                #dodanie kolumn tablicowych
                                if len(arraylist) > 0:
                                    old_col = ''
                                    arraystr = "ARRAY["
                                    arraylist.sort()
                                    for col, val in arraylist:
                                        if old_col == '':  #startujemy
                                            old_col = col
                                        if col == old_col:
                                            arraystr += "\'" + val + "\',"
                                        else:  #nastąpiła zmiana columny
                                            arraystr = arraystr.rstrip(",")
                                            arraystr += "]"
                                            collist.append(old_col)
                                            valuelist.append(arraystr)
                                            old_col = col
                                            arraystr = "ARRAY[\'" + val + "\',"
                                    collist.append(old_col)
                                    arraystr = arraystr.rstrip(",")
                                    arraystr += ']'
                                    valuelist.append(arraystr)
                                    arraylist = []

                                #dodatnie id_jed_rej do kazdej tabeli
                                collist.append("id_zd")
                                valuelist.append(id_jed_rej)
                                #dodanie id1 i id2 do kazdej z tabel
                                collist.append("g5id1")
                                valuelist.append(g5id1_value)
                                collist.append("g5id2")
                                valuelist.append(g5id2_value)
                                #dodanie unikatowej kolumny - będzie stanowiła klucz główny w całej bazie
                                collist.append('tab_uid')
                                valuelist.append(id_jed_rej + g5id1_value)

                                #sprawdzenie czy jest jeszcze jakas tablica, ktora nie zostala dodana do valuelist
                                if len(arrayvalue) > 0:
                                    collist.append(arrayname)
                                    values = ""
                                    for value in arrayvalue:
                                        values += "\'" + value.strip(
                                            '[]') + "\',"
                                    values = values.rstrip(
                                        ",")  #usuniecie ostatniego przecinka
                                    valuelist.append(u"ARRAY[" + values + "]")
                                    arrayname = ''
                                    arrayvalue = []

                                rdg5Table[G5Table].insert(
                                    0, collist, valuelist)
                                if G5Table in insertdic:
                                    insertdic[G5Table] += 1
                                else:
                                    insertdic[G5Table] = 1

                                #obieg+=1
                                #if obieg == 1000:
                                #    rdbase.commit()
                                #    obieg = 0
                                obieg += 1
                                collist = []
                                valuelist = []
                                pointslist = []
                                Kznak = ""
                                polycount = 0
                                G5Table = ""

                                if rodz_importu == 'testowyJEW':
                                    #w tym przypadku nie ma co dalej ciągnąć pętli
                                    break
                        #i = i+1
                except Exception, ex:
                    cols = "["
                    values = "["
                    for col in collist:
                        cols += col + ", "
                    for value in valuelist:
                        values += value + ", "
                    cols += "]"
                    values += "]"
                    print u"błąd: ", uni(G5Table), uni(cols), uni(
                        values), "rekord nr: ", uni(str(
                            obieg)), "line = ", uni(tekstline), "error: ", uni(
                                str(ex))
                    #przerwanie = 1

                finally:

                    rdbase.commit()
                    print "wykonano commita"
                    insstr = ""
                    for tab, ilosc in insertdic.items():
                        insstr += tab + ':' + str(ilosc) + '; '
                        print "tab:", tab
                    print "zapisano do bazy: ", str(
                        obieg), u" rekordów: ", insstr

                    f.close()

            except IOError:
                print "IOError: ", strftime("%Y-%m-%d %H:%M:%S")

            print "przerobiono lini: ", str(linianr)
            print "Koniec programu: ", strftime("%Y-%m-%d %H:%M:%S")
Ejemplo n.º 2
0
    def pbtnImportujClicked(self):

        uni = lambda s: s if type(s) == unicode else unicode(s,'utf-8','replace')
        srid = str(self.dlg.ui.leditSRIDImport.text())
        if self.f == 0 or self.f.closed:
           QMessageBox.warning(self.dlg, 'Uwaga!!!',
                        u"Przed rozpoczęciem importu musisz wczytać plik oraz dokonać jego analizy")
        else:
            id_jed_rej =  self.dlg.ui.leditIDZD.text() #TODO sprawdzenie czy nie jest puste oraz sprawdzenie czy w bazie juz takiego nie ma (mozna to sprawdzenie wykonac podczas analizy) - rstrip na wszelki wypadek
            id_jed_rej  = str(id_jed_rej).rstrip()

            pyproj4strFrom = self.cmb_pyproj4_items[unicode(self.dlg.ui.cmbPyprojFrom.currentText(),'utf-8')]
            pyproj4strTo = self.cmb_pyproj4_items[unicode(self.dlg.ui.cmbPyprojTo.currentText(),'utf-8')]

            #lista column tablicowych - do innej obróbki niż pozostałe
            arrayCols = ['G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RSKD', 'G5RDOK', 'G5RDZE', 'G5ROBJ']
            #słownik kolumn do zmiany nazwy - zmieniamy polskie znaki w nazwie kolumn bo trochę to broi przy pytaniach SQL
            plcharCols =  {u'G5RŻONA':'G5RZONA', u'G5RMĄŻ':'G5RMAZ', u'G5RPWŁ':'G5RPWL', u'G5RWŁ':'G5RWL', u'G5RWŁS':'G5RWLS', u'G5RWŁD':'G5RWLD'}
            g5Cols = {} #słownik zbudowany: {'nazwa_tabeli':Tablica_Column[]} - posluzy do inicjacji tabel - obiektow robdbtable 
            #inicjalizacja  bazy danych
            rdbase = RobDBBase(str(self.pgserver), str(self.pgbase), str(self.pguser), str(self.pguserpswd), 1)
            rdg5Table = {}  #słownik zawiera następującą strukturę: {'nazwa_tabeli': Obiekt_rdbtable}
            tableList = []  #tabela nazw tabel - wykorzystywane w roznych miejscach - miedzy innymi przy sprawdzeniu czy dana tabela została wybrana do importu
                            #jest to lista tabel, ktore beda brane pod uwage - glowny cel - kontrola nad danymi w trakcie pisania tego skryptu
            #okreslenie rodzaju importu
            if self.dlg.ui.rdbtnZwyklyImport.isChecked() or self.dlg.ui.rdbtnAktualizacja.isChecked():
                #sprawdzenie ktore z tabel mają być importowane - nie brane pod uwagę  wprzypadku importu testowego
                if self.dlg.ui.chckG5dze.isChecked():
                    tableList.append('G5DZE')
                if self.dlg.ui.chckG5obr.isChecked():
                    tableList.append('G5OBR')
                if self.dlg.ui.chckG5jew.isChecked():
                    tableList.append('G5JEW')
                if self.dlg.ui.chckG5jdr.isChecked():
                    tableList.append('G5JDR')
                if self.dlg.ui.chckG5adr.isChecked():
                    tableList.append('G5ADR')
                if self.dlg.ui.chckG5dze.isChecked():
                    tableList.append('G5DZE')
                if self.dlg.ui.chckG5udz.isChecked():
                    tableList.append('G5UDZ')
                if self.dlg.ui.chckG5udw.isChecked():
                    tableList.append('G5UDW')
                if self.dlg.ui.chckG5osf.isChecked():
                    tableList.append('G5OSF')
                if self.dlg.ui.chckG5ins.isChecked():
                    tableList.append('G5INS')
                if self.dlg.ui.chckG5mlz.isChecked():
                    tableList.append('G5MLZ')
                if self.dlg.ui.chckG5osz.isChecked():
                    tableList.append('G5OSZ')
                if self.dlg.ui.chckG5klu.isChecked():
                    tableList.append('G5KLU')
                if self.dlg.ui.chckG5uzg.isChecked():
                    tableList.append('G5UZG')
                if self.dlg.ui.chckG5dok.isChecked():
                    tableList.append('G5DOK')
                if self.dlg.ui.chckG5bud.isChecked():
                    tableList.append('G5BUD')
                if self.dlg.ui.chckG5lkl.isChecked():
                    tableList.append('G5LKL')
                if self.dlg.ui.chckG5zmn.isChecked():
                    tableList.append('G5ZMN')
                if self.dlg.ui.chckG5kkl.isChecked():
                    tableList.append('G5KKL')
                if self.dlg.ui.chckG5zmn.isChecked():
                    tableList.append('G5ZMN')


                Cols = ['G5IDJ', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU','G5RKRG']#g5jew
                g5Cols['G5JEW'] = Cols
                Cols = [ 'G5IDD',  'GEOM',    'NR', 'G5IDR', 'G5NOS', 'G5WRT', 'G5DWR', 'G5PEW', 'G5RZN', 'G5DWW', 'G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RJDR', 'G5DTW', 'G5DTU'] #g5dze
                g5Cols['G5DZE'] = Cols
                Cols = [ 'G5NRO', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU', 'G5RKRG', 'G5RJEW', 'IDJEW'] #g5obr
                g5Cols['G5OBR'] = Cols
                Cols = ['G5PLC', 'G5PSL', 'G5NIP', 'G5NZW', 'G5PIM', 'G5DIM', 'G5OIM', 'G5MIM', 'G5OBL', 'G5DOS', 'G5RADR', 'G5STI', 'G5DTW', 'G5DTU'] #g5osf
                g5Cols['G5OSF'] = Cols
                Cols = [ 'G5STI', 'G5NPE', 'G5NSK', 'G5RGN', 'G5NIP', 'G5NZR', 'G5NRR', 'G5NSR', 'G5RADR', 'G5DTW', 'G5DTU'] #g5ins
                g5Cols['G5INS'] = Cols
                Cols = ['G5RZONA',  'G5RMAZ', 'G5DTW', 'G5DTU'] #g5mlz
                g5Cols['G5MLZ'] = Cols
                Cols = [ 'G5STI', 'G5NPE', 'G5NSK', 'G5RGN', 'G5NIP', 'G5RSKD', 'G5RADR', 'G5DTW', 'G5DTU'] #g5osz
                g5Cols['G5OSZ'] = Cols
                Cols = ['G5TJR', 'G5IJR', 'G5RGN', 'G5RWL', 'G5RWLS', 'G5RWLD', 'G5ROBR', 'G5DTW', 'G5DTU' ] #g5jdr
                g5Cols['G5JDR'] = Cols
                Cols = [ 'G5UD', 'G5RWLS', 'G5RPOD', 'G5DTW', 'G5DTU'] #g5udz
                g5Cols['G5UDZ'] = Cols
                Cols = [ 'G5RWD', 'G5UD', 'G5RWLD', 'G5RPOD', 'G5DTW', 'G5DTU'] #g5udw
                g5Cols['G5UDW'] = Cols
                Cols = [ 'G5OFU', 'G5OZU', 'G5OZK', 'G5PEW', 'G5RDZE', 'G5DTW', 'G5DTU'] #g5klu
                g5Cols['G5KLU'] = Cols
                Cols = [ 'G5IDT', 'G5OZU','G5OFU', 'G5PEW', 'G5RKRG', 'G5ROBR', 'G5DTW', 'G5DTU'] #g5uzg
                g5Cols['G5UZG'] = Cols
                Cols = ['G5KDK', 'G5DTD', 'G5DTP', 'G5SYG', 'G5NSR', 'G5OPD', 'G5RDOK', 'G5DTW', 'G5DTU'] #g5dok
                g5Cols['G5DOK'] = Cols
                Cols = ['G5TAR', 'G5NAZ', 'G5KRJ', 'G5WJD', 'G5PWJ', 'G5GMN', 'G5ULC', 'G5NRA', 'G5NRL', 'G5MSC', 'G5KOD', 'G5PCZ', 'G5DTW', 'G5DTU']#g5adr
                g5Cols['G5ADR'] = Cols
                Cols = ['G5IDB', 'G5FUZ', 'G5WRT', 'G5DWR', 'G5RBB', 'G5PEW', 'G5PEU', 'G5RZN', 'G5SCN', 'G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RJDR','G5RDZE', 'G5DTU', 'G5DTW']#g5bud
                g5Cols['G5BUD'] = Cols
                Cols = ['G5IDK', 'G5OZU', 'G5OZK', 'G5PEW', 'G5RKRG', 'G5ROBR', 'G5DTW', 'G5DTU']
                g5Cols['G5KKL'] = Cols
                Cols = ['G5IDL', 'G5TLOK', 'G5PEW', 'G5PPP', 'G5LIZ', 'G5WRT', 'G5DWR', 'G5RJDR', 'G5RADR', 'G5RDOK', 'G5RBUD', 'G5DTW', 'G5DTU']
                g5Cols['G5LKL'] = Cols
                Cols = ['G5NRZ', 'G5STZ', 'G5DZZ', 'G5DTA', 'G5DTZ', 'G5NAZ', 'G5ROBJ', 'G5RDOK', 'G5DTW', 'G5DTU']
                g5Cols['G5ZMN'] = Cols



            elif self.dlg.ui.rdbtnImportTestowy.isChecked():
                #w przypadku importu testowego importować będziemy tylko jedną z trzech tabel (dze, obr, lub jew)
                # przy okazji opróżnimy zawartość dotychczasowych tabel testowych
                delSQLstr = "delete from "
                if self.dlg.ui.rdbtnTestowyJEW.isChecked():
                    tableList.append('G5JEW')
                    g5Cols['G5JEW'] = ['G5IDJ', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU','G5RKRG']#g5jew
                    delSQLstr += "g5jew_test;"
                elif self.dlg.ui.rdbtnTestowyOBR.isChecked():
                    tableList.append('G5OBR')
                    g5Cols['G5OBR'] = [ 'G5NRO', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU', 'G5RKRG', 'G5RJEW', 'IDJEW']
                    delSQLstr += "g5obr_test;"
                elif self.dlg.ui.rdbtnTestowyDZE.isChecked():
                    tableList.append('G5DZE')
                    g5Cols['G5DZE'] = [ 'G5IDD',  'GEOM',    'NR', 'G5IDR', 'G5NOS', 'G5WRT', 'G5DWR', 'G5PEW', 'G5RZN', 'G5DWW', 'G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RJDR', 'G5DTW', 'G5DTU']
                    delSQLstr += "g5dze_test;"

                rdbase.executeSQL(delSQLstr)


            #nazwy kolumn muszą zostać podane dokładnie jak w bazie - czyli małymi literami
            #na przyszłość można to rozwiązać w samej RobDBTable
            #za zamianę liter na małe w tablicy odpowiada ta fikuśna konstrukcja: [x.lower() ....]
            for tableName in tableList:
                if self.dlg.ui.rdbtnImportTestowy.isChecked():
                    appendix = '_TEST'
                else:
                    appendix = ''
                rdg5Table[tableName] = RobDBTable(rdbase, tableName + appendix, [x.lower() for x in g5Cols[tableName]], 1, 1)

            G5Table = ""

            collist = []
            valuelist = []
            insertdic = {} # forma [nazwa_tabeli:ilosc_insertow] 
            arraylist = [] #wykorzystywana do przechowywania kolumn typu tablicaowego w formie [[col2, wart..], [col1, wart..], [col2, wart..]]
            arrayvalue = [] # wykorzystywane do przechowywania danych 1+ takich jak g5rkrg
            arrayname = '' # nazwa tablicy tożsama z nazwą kolumny w bazie
            pointslist = []
            point = []
            Kznak = ""  #znacznik + albo -, oznaczajacy czy okreslane sa punkty tworzace polygon czy
                        #wycinajace w nim dziure
            oldKznak = "0" #posluzy do sprawdzenia czy nastapila zmiana Kznak
            newPoly = 0
            polycount = 0

            ilosc_linii = self.ilosc_linii
            linianr = 0     #przyda sie w momencie gdy sie program wywali - okresli ktora linia pliku swde nabroiła
            obieg = 0       #bedzie wykorzystywane przy commit do bazy, ktore bedzie realizowane co np 100 pytań SQL
            txtcodec = self.txtCodec()
            transform = 0
            if self.dlg.ui.rdbtnImportTestowy.isChecked() == 0: #tylko jesli nie jest to import testowy
                transform = self.dlg.ui.chckTransform.isChecked()


            self.dlg.ui.peditOutput.appendPlainText("Krok 1. Start programu: " +  time.strftime("%Y-%m-%d %H:%M:%S"))

            pgdlg = QProgressDialog(u"Postęp", "Przerwij...", 0, 0)

            if self.dlg.ui.rdbtnAktualizacja.isChecked():
                #usuniecie wszystkich rekordow o id_zd
                pgdlg.setLabelText(u"Usuwanie rekordów ze zbioru danych o id =  " + id_jed_rej)
                pgdlg.show()
                #naprawde dziwna sprawa, ale bez tego dwukrotnie powtorzonego slepp-applicationevent 
                #dialog się nie odświerza
                time.sleep(0.1)
                QApplication.processEvents()
                time.sleep(0.1)
                QApplication.processEvents()
                self.dlg.ui.peditOutput.appendPlainText(u"Rozpoczęcie usuwania aktualizowanych rekordów: " +  time.strftime("%Y-%m-%d %H:%M:%S"))
                rdbase.executeSQL("SELECT g5sp_delfromtables('" + id_jed_rej + "');")
                self.dlg.ui.peditOutput.appendPlainText(u"Zakończono usuwanie aktualizowanych rekordów: " +  time.strftime("%Y-%m-%d %H:%M:%S"))
            #import_file = str(self.swde_file.toUtf8()).decode('utf-8')

            try:
                #self.f = open(self.swde_file "r")
                self.f.seek(0.0)
                try:
                    self.dlg.ui.peditOutput.appendPlainText(u"Krok 2. Rozpoczynam import pliku: " + self.f.name + " " +  time.strftime("%Y-%m-%d %H:%M:%S"))
                    i = 0;
                    pgval = 0; #value progress bara
                    linianr = 0
                    step = ilosc_linii/100
                    pgdlg.setRange(0,100)
                    pgdlg.setLabelText(u"Trwa aktualizacja bazy .... ")
                    #pgdlg.setMinimumDuration(1000)
                    pgdlg.show()
                    QApplication.processEvents()
                    przerwanie = 0 # wartość 1 będzie świadczyć o tym, że albo zostało przerwane przez użytkownika albo z powodu błędu
                                    #w takim przypadku  nie zostanie wykonany commit do bazy
                    for line in self.f.readlines():
                        if i == step:
                            pgval = pgval + 1
                            pgdlg.setValue(pgval)
                            #QApplication.processEvents()
                            i = 0
                        if  pgdlg.wasCanceled():
                            przerwanie = 1
                            break
                        line = unicode(line, txtcodec)
                        i= i + 1
                        linianr+=1 #przyda sie jak sie program wypierniczy

                        pocz = StringBetweenChar(line, ',',0)

                        if pocz == "RO" or pocz == "RD" or pocz == "RC":
                            #line = unicode(line, txtcodec)
                            G5Table =  StringBetweenChar(line, ',',2)
                            g5id1_value = StringBetweenChar(line,',',3)
                            g5id2_value = StringBetweenChar(line,',',4)
                        if line[0:3] == "P,P":
                            #self.dlg.ui.peditOutput.appendPlainText(u"znaleziono ciąg line 0:3 = P,P")
                            str1 =  StringBetweenChar(line, ',', 2)
                            #self.dlg.ui.peditOutput.appendPlainText(u"str1 = " + str1 + u" o długości " + str(len(str1)) )
                            if str1 == u"G5PZG":
                                #self.dlg.ui.peditOutput.appendPlainText(u"wlazło")
                                nr =  StringBetweenChar(line, ',', 3)
                                #self.dlg.ui.peditOutput.appendPlainText(u"nr = " + nr)
                                #strnr = nr.rstrip(';\r')# trzeba usuwac pojedynczo czyli tak jak poniżej
                                strnr = nr.rstrip()# czyli jakiekolwiek białe znaki niezaleznie czy \n \r itp
                                strnr = strnr.rstrip(';')
                                #self.dlg.ui.peditOutput.appendPlainText(u"strnr = " + strnr)
                                #oldline = line
                                #self.dlg.ui.peditOutput.appendPlainText(u"oldline = " + oldline)
                                line = "P,G," + self.pzgdic[strnr] + ",;\n"
                                #self.dlg.ui.peditOutput.appendPlainText(u"line = " + line)
                                #self.dlg.ui.peditOutput.appendPlainText(u"Zastąpiono ciąg P,P >>" + oldline + "<< na >>" + line + "<< " + time.strftime("%Y-%m-%d %H:%M:%S"))


                        if G5Table in tableList:
                            #line = unicode(line, txtcodec)
                            colname = ""
                            colvalue = ""
                            znacznik = StringBetweenChar(line, ',',0)
                            if znacznik == "D" or znacznik == "WG":
                                line = line.rstrip()
                                line = line.rstrip(';') # szczególnie linie ze znacznikami WG zakończone są średnikiem 
                                line = line.strip("'")
                                line = line.strip('"')
                                line = line.replace("'", '')
                                line = line.replace('"', "")
                                colname = StringBetweenChar(line,',',1)
                                #zamiana nazw kolumn z polskimi znakami
                                if colname in plcharCols:
                                    colname = plcharCols[colname] 
                                colvalue = StringBetweenChar(line,',',3)
                                #dzialania wspolne dla wszystkich tablic
                                if colname in g5Cols[G5Table]:
                                    #G5RDZE w G5KLU nie jest typu tablicowego, natomiast w g5BUD
                                    #jest. Na szczescie w g5klu nie ma żadnego pola tablicowego
                                    if colname in arrayCols and G5Table != 'G5KLU':
                                        arraylist.append([colname,colvalue])

                                    else:
                                        collist.append(colname)
                                        valuelist.append(colvalue)

                                    #dzialania nietypowe
                                    #TODO przewidziec dla g5obr wyluskanie numeru obrebu do osobnego pola
                                    if colname == 'G5IDD' and G5Table == "G5DZE": #trzeba wyluskac numer dzialki i zapisac do oddzielnej kolumny
                                        #nr_dzialki = StringBetweenChar(colvalue, '.', 2)
                                        collist.append(u'nr')
                                        valuelist.append(StringBetweenChar(colvalue, '.', 2))
                                        #nr obrębu też się przyda
                                        collist.append(u'nrobr')
                                        valuelist.append(StringBetweenChar(colvalue, '.', 1))


                                    if colname == 'G5RPOD': #dla tabel g5udz i g5udw - wyglada to nastepujaco: "WG,G5RPOD,G5OSF,5465;"
                                                            #a więc najpierw mamy określenie do jakiej tabeli jest dowiązanie (osf, ins, mlz czy osz)
                                                            #a potem wartość wiązania w danej tabeli. Należy więc jeszcze wyciągnąć wartość po drugim ','
                                        collist.append(u'rpod_rodzaj')
                                        pod_rodzaj = StringBetweenChar(line, ',', 2)
                                        valuelist.append(pod_rodzaj)
                                        #kolumna zawierajaca polaczone ze soba wartosci 
                                        collist.append(u'id_podmiot')
                                        valuelist.append(colvalue + pod_rodzaj)
                                

                            elif znacznik == "K":
                                Kznak = StringBetweenChar(line, ',',1)#czyli albo '+;' albo '-;'
                                Kznak = Kznak[0]#pozostawienie tylko + albo -
                                newPoly = 1
                                polycount+=1
                               
                            elif znacznik == "P":
                                yvalue = StringBetweenChar(line, ',',2)
                                xvalue = StringBetweenChar(line, ',',3)
                                #print "xv:", xvalue, "yv:", yvalue
                                if transform == 1 :
                                    p1 = pyproj.Proj(pyproj4strFrom)
                                    p2 = pyproj.Proj(pyproj4strTo)
                                    x92, y92 = pyproj.transform(p1,p2,xvalue,yvalue)
                                    value = str(x92) + " " + str(y92)
                                else:
                                    value = xvalue + " " + yvalue
                                point.append( polycount)
                                point.append(newPoly)
                                point.append(Kznak)
                                point.append(value) 
                                pointslist.append(point)
                                #print point
                                point = []
                                newPoly = 0

                            elif znacznik[0] == "X": #czyli koniec definicji recordu
                                #print "2 line", line
                                #print "2 znacznik = ", znacznik, collist, valuelist
                                p = ""
                                p1 = ""
                                if len(pointslist)>0:
                                    for points in pointslist:
                                        if points[1] == 1:#newPoly
                                            #p1 = points[3]
                                            if points[0] == 1:#czyli pierwszy i byc moze jedyny polygon
                                                if srid == -1: #niezdefiniowany układ
                                                    p = "POLYGON(("
                                                else:
                                                    p = "@ST_GeomFromText(\'POLYGON(("
                                            else: #czyli ewentualne kolejne polygony
                                                p = p + p1 + "),("
                                            p1 = points[3]
                                        p = p + points[3] + ','
                                    if srid == -1:
                                        p = p + p1 + "))"
                                    else:
                                        p = p + p1 + "))\'," + srid + ")"
                                    collist.append("geom")
                                    valuelist.append(p)

                                #dodanie kolumn tablicowych
                                if len(arraylist) > 0:
                                    old_col = ''
                                    arraystr = "ARRAY["
                                    arraylist.sort()
                                    for col, val in arraylist:
                                        if old_col == '': #startujemy
                                            old_col = col
                                        if  col == old_col:
                                            arraystr += "\'"+ val + "\',"
                                        else: #nastąpiła zmiana columny
                                            arraystr = arraystr.rstrip(",")
                                            arraystr += "]"
                                            collist.append(old_col)
                                            valuelist.append(arraystr)
                                            old_col = col
                                            arraystr = "ARRAY[\'" + val + "\',"
                                    collist.append(old_col)
                                    arraystr = arraystr.rstrip(",")
                                    arraystr += ']'
                                    valuelist.append(arraystr)
                                    arraylist = []

                                #dodatnie id_jed_rej do kazdej tabeli
                                collist.append("id_zd")
                                valuelist.append(id_jed_rej)
                                #dodanie id1 i id2 do kazdej z tabel
                                collist.append("g5id1")
                                valuelist.append(g5id1_value)
                                collist.append("g5id2")
                                valuelist.append(g5id2_value)
                                #dodanie unikatowej kolumny - będzie stanowiła klucz główny w całej bazie
                                collist.append('tab_uid')
                                valuelist.append(id_jed_rej+g5id1_value)


                                #sprawdzenie czy jest jeszcze jakas tablica, ktora nie zostala dodana do valuelist
                                if len(arrayvalue)>0:
                                    collist.append(arrayname)
                                    values = ""
                                    for value in arrayvalue:
                                        values += "\'" + value.strip('[]') + "\',"
                                    values = values.rstrip(",")#usuniecie ostatniego przecinka
                                    valuelist.append(u"ARRAY[" + values + "]")
                                    arrayname = ''
                                    arrayvalue = []

                                rdg5Table[G5Table].insert(0, collist, valuelist)
                                if G5Table in insertdic:
                                    insertdic[G5Table] += 1
                                else:
                                    insertdic[G5Table] = 1

                                QApplication.processEvents() 
                                #obieg+=1
                                #if obieg == 1000:
                                #    rdbase.commit()
                                #    obieg = 0
                                obieg+=1
                                collist = []
                                valuelist = []
                                pointslist = []
                                Kznak = ""
                                polycount = 0
                                G5Table = ""

                                if self.dlg.ui.rdbtnImportTestowy.isChecked() and self.dlg.ui.rdbtnTestowyJEW.isChecked():
                                    #w tym przypadku nie ma co dalej ciągnąć pętli
                                    break
                        #i = i+1
                except Exception, ex:
                    cols = "["
                    values = "["
                    for col in collist:
                        cols +=  col + ", "
                    for value in valuelist:
                        values += value + ", "
                    cols += "]"
                    values += "]"
                    self.dlg.ui.peditOutput.appendPlainText(u"błąd: " + uni(G5Table) + " " +  uni(cols) + " " + uni(values) + "rekord nr: " + uni(str(obieg)) + "line = " + uni(line)+ " error: " + uni(str(ex)) )
                    przerwanie = 1

                finally:
                    if przerwanie == 1:
                        rdbase.rollback()
                        self.dlg.ui.peditOutput.appendPlainText("anulowano zapis do bazy: " + str(obieg) + u" rekordów: " + str(insertdic))
                    else:
                        rdbase.commit()
                        insstr = ""
                        for tab, ilosc in insertdic.items():
                            insstr += tab + ':' + str(ilosc) + '; '
                        self.dlg.ui.peditOutput.appendPlainText("zapisano do bazy: " + str(obieg) + u" rekordów: " + insstr)
                    #self.dlg.ui.peditOutput.appendPlainText("przerobiono lini: " + str(linianr))
                    #self.dlg.ui.peditOutput.appendPlainText(u"Plik zamknięty: " +  time.strftime("%Y-%m-%d %H:%M:%S"))
                    self.f.close()
            
            except IOError:
                self.dlg.ui.peditOutput.appendPlainText("IOError: " +  time.strftime("%Y-%m-%d %H:%M:%S"))
Ejemplo n.º 3
0
 def importuj(self):
     
     #ponizsze troche z lenistwa - pozostalosc po starym kodzie, nie chce mi sie szukac zmiennych i dopisywac
     #self przed kazda
     swde_file = self.swde_file
     tableListString = self.tableListString
     srid = self.srid
     pyproj4strFrom = self.pyproj4strFrom
     pyproj4strTo = self.pyproj4strTo
     rodz_importu = self.rodz_importu
     pgserver = self.pgserver
     pgbase = self.pgbase
     pguser = self.pguser
     pguserpswd = self.pguserpswd
     txtcodec = self.txtcodec
     id_zd = self.id_zd
     
     crs_source = QgsCoordinateReferenceSystem()
     crs_source.createFromProj4(str(pyproj4strFrom))
     crs_dest = QgsCoordinateReferenceSystem()
     crs_dest.createFromProj4(str(pyproj4strTo))
     xform = QgsCoordinateTransform(crs_source, crs_dest)
     
     
     tableList = [] #tabela nazw tabel w bazie
     tableList = tableListString.split(',')
     
     import_testowy = False
     if rodz_importu == 'testowyJEW' or rodz_importu == 'testowyOBR' or rodz_importu == 'testowyDZE':
         import_testowy = True
     
     for tabName in tableList:
         if tabName <> 'NONE':
             print tabName
     print srid
     print pyproj4strFrom
     print pyproj4strTo
     print "identyfikator jednostki rejestrowej:", self.id_jed_rej
     print "ilość linii", self.ilosc_linii
     print "rodzaj importu", rodz_importu
     print pgserver, pgbase, pguser, pguserpswd
     
     
     uni = lambda s: s if type(s) == unicode else unicode(s,'utf-8','replace')
     
     try:
         f = open(swde_file, "r")
         if f == 0 or f.closed:
             print u"Przed rozpoczęciem importu musisz wczytać plik"
         else:
             if id_zd == 'NONE': #parametr wybierany przez uzytkownika, jesli jest inny niz NONE
                 self.id_jed_rej  = str(self.id_jed_rej).rstrip() #zostanie uzyty jako wymuszenie nazwy zbioru danych
             else:                       #w innym przypadku uzyta zostanie nazwa jednostki rej wyłuskana przez program
                 self.id_jed_rej = id_zd
             
                 
                 
      
             
             #lista column tablicowych - do innej obróbki niż pozostałe
             arrayCols = ['G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RSKD', 'G5RDOK', 'G5RDZE', 'G5ROBJ']
             #słownik kolumn do zmiany nazwy - zmieniamy polskie znaki w nazwie kolumn bo trochę to broi przy pytaniach SQL
             plcharCols =  {u'G5RŻONA':'G5RZONA', u'G5RMĄŻ':'G5RMAZ', u'G5RPWŁ':'G5RPWL', u'G5RWŁ':'G5RWL', u'G5RWŁS':'G5RWLS', u'G5RWŁD':'G5RWLD'}
             g5Cols = {} #słownik zbudowany: {'nazwa_tabeli':Tablica_Column[]} - posluzy do inicjacji tabel - obiektow robdbtable 
             #inicjalizacja  bazy danych
             rdbase = RobDBBase(pgserver, pgbase, pguser, pguserpswd,1)
             rdg5Table = {}  #słownik zawiera następującą strukturę: {'nazwa_tabeli': Obiekt_rdbtable}
             
             #okreslenie rodzaju importu
             
             if rodz_importu == 'zwykly' or rodz_importu == 'aktualizacja':
                 Cols = ['G5IDJ', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU','G5RKRG']#g5jew
                 g5Cols['G5JEW'] = Cols
                 Cols = [ 'G5IDD',  'GEOM',    'NR', 'G5IDR', 'G5NOS', 'G5WRT', 'G5DWR', 'G5PEW', 'G5RZN', 'G5DWW', 'G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RJDR', 'G5DTW', 'G5DTU'] #g5dze
                 g5Cols['G5DZE'] = Cols
                 Cols = [ 'G5NRO', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU', 'G5RKRG', 'G5RJEW', 'IDJEW'] #g5obr
                 g5Cols['G5OBR'] = Cols
                 Cols = ['G5PLC', 'G5PSL', 'G5NIP', 'G5NZW', 'G5PIM', 'G5DIM', 'G5OIM', 'G5MIM', 'G5OBL', 'G5DOS', 'G5RADR', 'G5STI', 'G5DTW', 'G5DTU'] #g5osf
                 g5Cols['G5OSF'] = Cols
                 Cols = [ 'G5STI', 'G5NPE', 'G5NSK', 'G5RGN', 'G5NIP', 'G5NZR', 'G5NRR', 'G5NSR', 'G5RADR', 'G5DTW', 'G5DTU'] #g5ins
                 g5Cols['G5INS'] = Cols
                 Cols = ['G5RZONA',  'G5RMAZ', 'G5DTW', 'G5DTU'] #g5mlz
                 g5Cols['G5MLZ'] = Cols
                 Cols = [ 'G5STI', 'G5NPE', 'G5NSK', 'G5RGN', 'G5NIP', 'G5RSKD', 'G5RADR', 'G5DTW', 'G5DTU'] #g5osz
                 g5Cols['G5OSZ'] = Cols
                 Cols = ['G5TJR', 'G5IJR', 'G5RGN', 'G5RWL', 'G5RWLS', 'G5RWLD', 'G5ROBR', 'G5DTW', 'G5DTU' ] #g5jdr
                 g5Cols['G5JDR'] = Cols
                 Cols = [ 'G5UD', 'G5RWLS', 'G5RPOD', 'G5DTW', 'G5DTU'] #g5udz
                 g5Cols['G5UDZ'] = Cols
                 Cols = [ 'G5RWD', 'G5UD', 'G5RWLD', 'G5RPOD', 'G5DTW', 'G5DTU'] #g5udw
                 g5Cols['G5UDW'] = Cols
                 Cols = [ 'G5OFU', 'G5OZU', 'G5OZK', 'G5PEW', 'G5RDZE', 'G5DTW', 'G5DTU'] #g5klu
                 g5Cols['G5KLU'] = Cols
                 Cols = [ 'G5IDT', 'G5OZU','G5OFU', 'G5PEW', 'G5RKRG', 'G5ROBR', 'G5DTW', 'G5DTU'] #g5uzg
                 g5Cols['G5UZG'] = Cols
                 Cols = ['G5KDK', 'G5DTD', 'G5DTP', 'G5SYG', 'G5NSR', 'G5OPD', 'G5RDOK', 'G5DTW', 'G5DTU'] #g5dok
                 g5Cols['G5DOK'] = Cols
                 Cols = ['G5TAR', 'G5NAZ', 'G5KRJ', 'G5WJD', 'G5PWJ', 'G5GMN', 'G5ULC', 'G5NRA', 'G5NRL', 'G5MSC', 'G5KOD', 'G5PCZ', 'G5DTW', 'G5DTU']#g5adr
                 g5Cols['G5ADR'] = Cols
                 Cols = ['G5IDB', 'G5FUZ', 'G5WRT', 'G5DWR', 'G5RBB', 'G5PEW', 'G5PEU', 'G5RZN', 'G5SCN', 'G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RJDR','G5RDZE', 'G5DTU', 'G5DTW']#g5bud
                 g5Cols['G5BUD'] = Cols
                 Cols = ['G5IDK', 'G5OZU', 'G5OZK', 'G5PEW', 'G5RKRG', 'G5ROBR', 'G5DTW', 'G5DTU']
                 g5Cols['G5KKL'] = Cols
                 Cols = ['G5IDL', 'G5TLOK', 'G5PEW', 'G5PPP', 'G5LIZ', 'G5WRT', 'G5DWR', 'G5RJDR', 'G5RADR', 'G5RDOK', 'G5RBUD', 'G5DTW', 'G5DTU']
                 g5Cols['G5LKL'] = Cols
                 Cols = ['G5NRZ', 'G5STZ', 'G5DZZ', 'G5DTA', 'G5DTZ', 'G5NAZ', 'G5ROBJ', 'G5RDOK', 'G5DTW', 'G5DTU']
                 g5Cols['G5ZMN'] = Cols
      
      
      
             elif rodz_importu == 'testowyJEW' or rodz_importu == 'testowyOBR' or rodz_importu == 'testowyDZE':
                 #teoretycznie powinno wystarczyć zwykle elif bez parametrow, ale na wszelki dorzuce te ory
                 #w przypadku importu testowego importować będziemy tylko jedną z trzech tabel (dze, obr, lub jew)
                 # przy okazji opróżnimy zawartość dotychczasowych tabel testowych
                 delSQLstr = "delete from "
                 if rodz_importu == 'testowyJEW':
                     tableList.append('G5JEW')
                     g5Cols['G5JEW'] = ['G5IDJ', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU','G5RKRG']#g5jew
                     delSQLstr += "g5jew_test;"
                 elif rodz_importu == 'testowyOBR':
                     tableList.append('G5OBR')
                     g5Cols['G5OBR'] = [ 'G5NRO', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU', 'G5RKRG', 'G5RJEW', 'IDJEW']
                     delSQLstr += "g5obr_test;"
                 elif rodz_importu == 'testowyDZE':
                     tableList.append('G5DZE')
                     g5Cols['G5DZE'] = [ 'G5IDD',  'GEOM',    'NR', 'G5IDR', 'G5NOS', 'G5WRT', 'G5DWR', 'G5PEW', 'G5RZN', 'G5DWW', 'G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RJDR', 'G5DTW', 'G5DTU']
                     delSQLstr += "g5dze_test;"
      
                 rdbase.executeSQL(delSQLstr)
      
      
             #nazwy kolumn muszą zostać podane dokładnie jak w bazie - czyli małymi literami
             #na przyszłość można to rozwiązać w samej RobDBTable
             #za zamianę liter na małe w tablicy odpowiada ta fikuśna konstrukcja: [x.lower() ....]
             for tableName in tableList:
                 if import_testowy:
                     appendix = '_TEST'
                 else:
                     appendix = ''
                 rdg5Table[tableName] = RobDBTable(rdbase, tableName + appendix, [x.lower() for x in g5Cols[tableName]], 1, 1)
      
             G5Table = ""
      
             collist = []
             valuelist = []
             insertdic = {} # forma [nazwa_tabeli:ilosc_insertow] 
             arraylist = [] #wykorzystywana do przechowywania kolumn typu tablicaowego w formie [[col2, wart..], [col1, wart..], [col2, wart..]]
             arrayvalue = [] # wykorzystywane do przechowywania danych 1+ takich jak g5rkrg
             arrayname = '' # nazwa tablicy tożsama z nazwą kolumny w bazie
             pointslist = []
             point = []
             Kznak = ""  #znacznik + albo -, oznaczajacy czy okreslane sa punkty tworzace polygon czy
                         #wycinajace w nim dziure
             oldKznak = "0" #posluzy do sprawdzenia czy nastapila zmiana Kznak
             newPoly = 0
             polycount = 0
      
         
             linianr = 0     #przyda sie w momencie gdy sie program wywali - okresli ktora linia pliku swde nabroiła
             obieg = 0       #bedzie wykorzystywane przy commit do bazy, ktore bedzie realizowane co np 100 pytań SQL
             
             transform = False
             if import_testowy == False: #tylko jesli nie jest to import testowy
                 if pyproj4strFrom != pyproj4strTo:
                     transform = True
             print "transform:", transform
        
      
             print "Krok 2. Start programu: ", strftime("%Y-%m-%d %H:%M:%S")
      
      
             if rodz_importu == 'aktualizacja':
                 #usuniecie wszystkich rekordow o id_zd
                 print u"Usuwanie rekordów ze zbioru danych o id =  ", self.id_jed_rej
                 #naprawde dziwna sprawa, ale bez tego dwukrotnie powtorzonego slepp-applicationevent 
                 
                 print u"Rozpoczęcie usuwania aktualizowanych rekordów: ",  strftime("%Y-%m-%d %H:%M:%S")
                 rdbase.executeSQL("SELECT g5sp_delfromtables('" + self.id_jed_rej + "');")
                 print u"Zakończono usuwanie aktualizowanych rekordów: ",  strftime("%Y-%m-%d %H:%M:%S")
             #import_file = str(self.swde_file.toUtf8()).decode('utf-8')
      
             try:
                 #self.f = open(self.swde_file "r")
                 f.seek(0.0)
                 tekstline = ""
                 try:
                     print u"Krok 3. Rozpoczynam import pliku: ",  f.name, " ",strftime("%Y-%m-%d %H:%M:%S")
                     i = 0;
                     procent_wykonania = 0; #do monitorowania postepu
                     linianr = 0
                     step = self.ilosc_linii/100
                     
                     print u'ilość linii:',self.ilosc_linii, "step", step
                     
                     for line in f.readlines():
                         tekstline = line #zmienna tekstline bedzie wykorzystywana poza petla w celu lokalizacji bledu - w exception
                         if i == step:
                             i = 0
                             procent_wykonania += 1
                             sys.stdout.write("\r wykonano: %d%s" % (procent_wykonania, "%"))
                             sys.stdout.flush()
                             sleep(0.01)
                             #print u"postęp:", procent_wykonania, u"%"
                         
                         line = unicode(line, txtcodec)
                         #print "unikod zadzialal"
                         i= i + 1
                         linianr+=1 #przyda sie jak sie program wypierniczy
      
                         pocz = StringBetweenChar(line, ',',0)
      
                         if pocz == "RO" or pocz == "RD" or pocz == "RC":
                             #line = unicode(line, txtcodec)
                             G5Table =  StringBetweenChar(line, ',',2)
                             g5id1_value = StringBetweenChar(line,',',3)
                             g5id2_value = StringBetweenChar(line,',',4)
                         if line[0:3] == "P,P":
                             #self.dlg.peditOutput.appendPlainText(u"znaleziono ciąg line 0:3 = P,P")
                             str1 =  StringBetweenChar(line, ',', 2)
                             #self.dlg.peditOutput.appendPlainText(u"str1 = " + str1 + u" o długości " + str(len(str1)) )
                             if str1 == u"G5PZG":
                                 #self.dlg.peditOutput.appendPlainText(u"wlazło")
                                 nr =  StringBetweenChar(line, ',', 3)
                                 #self.dlg.peditOutput.appendPlainText(u"nr = " + nr)
                                 #strnr = nr.rstrip(';\r')# trzeba usuwac pojedynczo czyli tak jak poniżej
                                 strnr = nr.rstrip()# czyli jakiekolwiek białe znaki niezaleznie czy \n \r itp
                                 strnr = strnr.rstrip(';')
                                 #self.dlg.peditOutput.appendPlainText(u"strnr = " + strnr)
                                 #oldline = line
                                 #self.dlg.peditOutput.appendPlainText(u"oldline = " + oldline)
                                 line = "P,G," + self.pzgdic[strnr] + ",;\n"
                                 #self.dlg.peditOutput.appendPlainText(u"line = " + line)
                                 #self.dlg.peditOutput.appendPlainText(u"Zastąpiono ciąg P,P >>" + oldline + "<< na >>" + line + "<< " + strftime("%Y-%m-%d %H:%M:%S"))
      
 
                         if G5Table in tableList:
                             colname = ""
                             colvalue = ""
                             znacznik = StringBetweenChar(line, ',',0)
                             if znacznik == "D" or znacznik == "WG":
                                 line = line.rstrip()
                                 line = line.rstrip(';') # szczególnie linie ze znacznikami WG zakończone są średnikiem 
                                 line = line.strip("'")
                                 line = line.strip('"')
                                 line = line.replace("'", '')
                                 line = line.replace('"', "")
                                 colname = StringBetweenChar(line,',',1)
                                 #zamiana nazw kolumn z polskimi znakami
                                 if colname in plcharCols:
                                     colname = plcharCols[colname] 
                                 colvalue = StringBetweenChar(line,',',3)
                                 #dzialania wspolne dla wszystkich tablic
                                 if colname in g5Cols[G5Table]:
                                     #G5RDZE w G5KLU nie jest typu tablicowego, natomiast w g5BUD
                                     #jest. Na szczescie w g5klu nie ma żadnego pola tablicowego
                                     #to samo dotyczy g5radr - w g5osf i g5ins - nie jest array w przeciwienstwie do g5bud
                                     if colname in arrayCols and G5Table != 'G5KLU' and G5Table != 'G5INS' and G5Table != 'G5OSF':
                                         arraylist.append([colname,colvalue])
      
                                     else:
                                         collist.append(colname)
                                         valuelist.append(colvalue)
      
                                     #dzialania nietypowe
                                     #TODO przewidziec dla g5obr wyluskanie numeru obrebu do osobnego pola
                                     if colname == 'G5IDD' and G5Table == "G5DZE": #trzeba wyluskac numer dzialki i zapisac do oddzielnej kolumny
                                         #nr_dzialki = StringBetweenChar(colvalue, '.', 2)
                                         collist.append(u'nr')
                                         valuelist.append(StringBetweenChar(colvalue, '.', 2))
                                         #nr obrębu też się przyda
                                         collist.append(u'nrobr')
                                         valuelist.append(StringBetweenChar(colvalue, '.', 1))
      
      
                                     if colname == 'G5RPOD': #dla tabel g5udz i g5udw - wyglada to nastepujaco: "WG,G5RPOD,G5OSF,5465;"
                                                             #a więc najpierw mamy określenie do jakiej tabeli jest dowiązanie (osf, ins, mlz czy osz)
                                                             #a potem wartość wiązania w danej tabeli. Należy więc jeszcze wyciągnąć wartość po drugim ','
                                         collist.append(u'rpod_rodzaj')
                                         pod_rodzaj = StringBetweenChar(line, ',', 2)
                                         valuelist.append(pod_rodzaj)
                                         #kolumna zawierajaca polaczone ze soba wartosci 
                                         collist.append(u'id_podmiot')
                                         valuelist.append(colvalue + pod_rodzaj)
                                  
      
                             elif znacznik == "K":
                                 Kznak = StringBetweenChar(line, ',',1)#czyli albo '+;' albo '-;'
                                 Kznak = Kznak[0]#pozostawienie tylko + albo -
                                 newPoly = 1
                                 polycount+=1
                                 
                             elif znacznik == "P":
                                 yvalue = StringBetweenChar(line, ',',2)
                                 xvalue = StringBetweenChar(line, ',',3)
                                 #print "xv:", xvalue, "yv:", yvalue
                                 if transform:
                                     #=======================================
                                     # p1 = pyproj.Proj(str(pyproj4strFrom))
                                     # p2 = pyproj.Proj(str(pyproj4strTo))
                                     # x92, y92 = pyproj.transform(p1,p2,xvalue,yvalue)
                                     # value = str(x92) + " " + str(y92)
                                     #=======================================
                                     
                                     pt1 = xform.transform(QgsPoint(float(xvalue), float(yvalue)))
                                     value = str(pt1[0]) + " " + str(pt1[1])
                                 else:
                                     value = xvalue + " " + yvalue
                                 point.append( polycount)
                                 point.append(newPoly)
                                 point.append(Kznak)
                                 point.append(value) 
                                 pointslist.append(point)
                                 #print point
                                 point = []
                                 newPoly = 0
      
                             elif znacznik[0] == "X": #czyli koniec definicji recordu
                                 #print "2 line", line
                                 #print "2 znacznik = ", znacznik, collist, valuelist
                                 p = ""
                                 p1 = ""
                                 if len(pointslist)>0:
                                     for points in pointslist:
                                         if points[1] == 1:#newPoly
                                             #p1 = points[3]
                                             if points[0] == 1:#czyli pierwszy i byc moze jedyny polygon
                                                 if srid == -1: #niezdefiniowany układ
                                                     p = "POLYGON(("
                                                 else:
                                                     p = "@ST_GeomFromText(\'POLYGON(("
                                             else: #czyli ewentualne kolejne polygony
                                                 p = p + p1 + "),("
                                             p1 = points[3]
                                         p = p + points[3] + ','
                                     if srid == -1:
                                         p = p + p1 + "))"
                                     else:
                                         p = p + p1 + "))\'," + srid + ")"
                                     collist.append("geom")
                                     valuelist.append(p)
      
                                 #dodanie kolumn tablicowych
                                 if len(arraylist) > 0:
                                     old_col = ''
                                     arraystr = "ARRAY["
                                     arraylist.sort()
                                     for col, val in arraylist:
                                         if old_col == '': #startujemy
                                             old_col = col
                                         if  col == old_col:
                                             arraystr += "\'"+ val + "\',"
                                         else: #nastąpiła zmiana columny
                                             arraystr = arraystr.rstrip(",")
                                             arraystr += "]"
                                             collist.append(old_col)
                                             valuelist.append(arraystr)
                                             old_col = col
                                             arraystr = "ARRAY[\'" + val + "\',"
                                     collist.append(old_col)
                                     arraystr = arraystr.rstrip(",")
                                     arraystr += ']'
                                     valuelist.append(arraystr)
                                     arraylist = []
      
                                 #dodatnie self.id_jed_rej do kazdej tabeli
                                 collist.append("id_zd")
                                 valuelist.append(self.id_jed_rej)
                                 #dodanie id1 i id2 do kazdej z tabel
                                 collist.append("g5id1")
                                 valuelist.append(g5id1_value)
                                 collist.append("g5id2")
                                 valuelist.append(g5id2_value)
                                 #dodanie unikatowej kolumny - będzie stanowiła klucz główny w całej bazie
                                 collist.append('tab_uid')
                                 valuelist.append(self.id_jed_rej+g5id1_value)
      
      
                                 #sprawdzenie czy jest jeszcze jakas tablica, ktora nie zostala dodana do valuelist
                                 if len(arrayvalue)>0:
                                     collist.append(arrayname)
                                     values = ""
                                     for value in arrayvalue:
                                         values += "\'" + value.strip('[]') + "\',"
                                     values = values.rstrip(",")#usuniecie ostatniego przecinka
                                     valuelist.append(u"ARRAY[" + values + "]")
                                     arrayname = ''
                                     arrayvalue = []
      
                                 rdg5Table[G5Table].insert(0, collist, valuelist)
                                 if G5Table in insertdic:
                                     insertdic[G5Table] += 1
                                 else:
                                     insertdic[G5Table] = 1
      
                                 #obieg+=1
                                 #if obieg == 1000:
                                 #    rdbase.commit()
                                 #    obieg = 0
                                 obieg+=1
                                 collist = []
                                 valuelist = []
                                 pointslist = []
                                 Kznak = ""
                                 polycount = 0
                                 G5Table = ""
      
                                 if rodz_importu == 'testowyJEW':
                                     #w tym przypadku nie ma co dalej ciągnąć pętli
                                     break
                         #i = i+1
                 except Exception, ex:
                     cols = "["
                     values = "["
                     for col in collist:
                         cols +=  col + ", "
                     for value in valuelist:
                         values += value + ", "
                     cols += "]"
                     values += "]"
                     print u"błąd: ", uni(G5Table),  uni(cols), uni(values), "rekord nr: ", uni(str(obieg)), "line = ",  uni(tekstline), "error: ",uni(str(ex))
                     #przerwanie = 1
      
                 finally:
                     
                     rdbase.commit()
                     print "wykonano commita"
                     insstr = ""
                     for tab, ilosc in insertdic.items():
                         insstr += tab + ':' + str(ilosc) + '; '
                         print "tab:", tab
                     print "zapisano do bazy: ",str(obieg), u" rekordów: ", insstr
                          
                 
                     f.close()
              
             except IOError:
                 print "IOError: ",  strftime("%Y-%m-%d %H:%M:%S")
      
             print "przerobiono lini: ",  str(linianr)
             print "Koniec programu: ",  strftime("%Y-%m-%d %H:%M:%S")