Ejemplo n.º 1
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"))