예제 #1
0
파일: flsqlite.py 프로젝트: deavid/pineboo
    def Mr_Proper(self):
        util = FLUtil()
        self.db_.dbAux().transaction()
        rx = QRegExp("^.*[\\d][\\d][\\d][\\d].[\\d][\\d].*[\\d][\\d]$")
        rx2 = QRegExp("^.*alteredtable[\\d][\\d][\\d][\\d].*$")
        qry = FLSqlQuery(None, self.db_.dbAux())
        qry2 = FLSqlQuery(None, self.db_.dbAux())
        steps = 0
        item = ""

        rx3 = QRegExp("^.*\\d{6,9}$")
        listOldBks = rx3 in self.tables("")

        qry.exec_("select nombre from flfiles")
        util.createProgressDialog(
            util.tr("Borrando backups"), len(listOldBks) + qry.size() + 5)
        while qry.next():
            item = qry.value(0)
            if item.find(rx) > -1 or item.find(rx2) > -1:
                util.setLabelText(util.tr("Borrando regisro %1").arg(item))
                qry2.exec_("delete from flfiles where nombre = '%s'" % item)
                if item.find("alteredtable") > -1:
                    if item.replace(".mtd", "") in self.tables(""):
                        util.setLabelText(
                            util.tr("Borrando tabla %1").arg(item))
                        qry2.exec_("drop table %s" %
                                   (item.replace(".mtd", "")))

            steps = steps + 1
            util.setProgress(steps)

        for item in listOldBks:
            if item in self.tables(""):
                util.setLabelText(util.tr("Borrando tabla %1").arg(item))
                qry2.exec_("drop table %s" % item)

            steps = steps + 1
            util.setProgress(steps)

        util.setLabelText(util.tr("Inicializando cachés"))
        steps = steps + 1
        util.setProgress(steps)

        qry.exec_("delete from flmetadata")
        qry.exec_("delete from flvar")
        self.db_.manager().cleanupMetaData()
        self.db_.dbAux().commit()

        util.setLabelText(util.tr("Vacunando base de datos"))
        steps = steps + 1
        util.setProgress(steps)
        qry2.exec_("vacuum")
        steps = steps + 1
        util.setProgress(steps)
        util.destryProgressDialog()
예제 #2
0
    def Mr_Proper(self):
        util = FLUtil()
        self.db_.dbAux().transaction()
        rx = QRegExp("^.*[\\d][\\d][\\d][\\d].[\\d][\\d].*[\\d][\\d]$")
        rx2 = QRegExp("^.*alteredtable[\\d][\\d][\\d][\\d].*$")
        qry = FLSqlQuery(None, self.db_.dbAux())
        qry2 = FLSqlQuery(None, self.db_.dbAux())
        steps = 0
        item = ""

        rx3 = QRegExp("^.*\\d{6,9}$")
        listOldBks = rx3 in self.tables("")

        qry.exec_("select nombre from flfiles")
        util.createProgressDialog(util.tr("Borrando backups"),
                                  len(listOldBks) + qry.size() + 5)
        while qry.next():
            item = qry.value(0)
            if item.find(rx) > -1 or item.find(rx2) > -1:
                util.setLabelText(util.tr("Borrando regisro %1").arg(item))
                qry2.exec_("delete from flfiles where nombre = '%s'" % item)
                if item.find("alteredtable") > -1:
                    if item.replace(".mtd", "") in self.tables(""):
                        util.setLabelText(
                            util.tr("Borrando tabla %1").arg(item))
                        qry2.exec_("drop table %s" %
                                   (item.replace(".mtd", "")))

            steps = steps + 1
            util.setProgress(steps)

        for item in listOldBks:
            if item in self.tables(""):
                util.setLabelText(util.tr("Borrando tabla %1").arg(item))
                qry2.exec_("drop table %s" % item)

            steps = steps + 1
            util.setProgress(steps)

        util.setLabelText(util.tr("Inicializando cachés"))
        steps = steps + 1
        util.setProgress(steps)

        qry.exec_("delete from flmetadata")
        qry.exec_("delete from flvar")
        self.db_.manager().cleanupMetaData()
        self.db_.dbAux().commit()

        util.setLabelText(util.tr("Vacunando base de datos"))
        steps = steps + 1
        util.setProgress(steps)
        qry2.exec_("vacuum")
        steps = steps + 1
        util.setProgress(steps)
        util.destryProgressDialog()
예제 #3
0
    def slotRenderProgress(self, p):
        util = FLUtil()
        if not self.rptEngine_:
            return

        if not self.progress_:
            self.totalSteps_ = self.rptEngine_.getRenderSteps()
            if self.totalSteps_ <= 0:
                self.totalSteps_ = 1
            self.progress_ = util.createProgressDialog(
                util.translate("app", "Creando informe..."), self.totalSteps_)
            # self.progress_.setMinimunDuration(self.M_PROGRESS_DELAY)
            self.progress_.canceled.connect(self.slotCancelPrinting)

        util.setProgress(p)
        QtWidgets.QApplication.processEvents()
예제 #4
0
    def run(self):
        # TODO: Refactorizar esta función en otras más sencillas
        # Preparar temporal
        if self.deleteCache and not not os.path.exists(
                self.dir("cache/%s" % self.dbname)):
            self.logger.debug("DEVELOP: DeleteCache Activado\nBorrando %s",
                              self.dir("cache/%s" % self.dbname))
            for root, dirs, files in os.walk(self.dir("cache/%s" %
                                                      self.dbname),
                                             topdown=False):
                for name in files:
                    os.remove(os.path.join(root, name))
                for name in dirs:
                    os.rmdir(os.path.join(root, name))
            # borrando de share
            # for root, dirs, files in os.walk(self.dir("../share/pineboo"), topdown=False):
            #    for name in files:
            #        if name.endswith("qs.py") or name.endswith("qs.py.debug") or name.endswith("qs.xml"):
            #            os.remove(os.path.join(root, name))

        if not os.path.exists(self.dir("cache")):
            os.makedirs(self.dir("cache"))

        # Conectar:

        if not self.conn:
            self.conn = PNConnection(self.dbname, self.dbserver.host,
                                     self.dbserver.port, self.dbauth.username,
                                     self.dbauth.password, self.dbserver.type)
        if self.conn.conn is False:
            return False

        # Se verifica que existen estas tablas
        for table in ("flareas", "flmodules", "flfiles", "flgroups", "fllarge",
                      "flserial", "flusers", "flvar"):
            self.conn.manager().createSystemTable(table)

        util = FLUtil()
        util.writeSettingEntry(u"DBA/lastDB", self.dbname)
        self.cur = self.conn.cursor()
        self.areas = {}
        self.cur.execute(
            """ SELECT idarea, descripcion FROM flareas WHERE 1 = 1""")
        for idarea, descripcion in self.cur:
            self.areas[idarea] = Struct(idarea=idarea, descripcion=descripcion)

        self.areas["sys"] = Struct(idarea="sys", descripcion="Area de Sistema")

        # Obtener modulos activos
        self.cur.execute(
            """ SELECT idarea, idmodulo, descripcion, icono FROM flmodules WHERE bloqueo = %s """
            % self.conn.driver().formatValue("bool", "True", False))
        self.modules = {}
        for idarea, idmodulo, descripcion, icono in self.cur:
            icono = clearXPM(icono)
            self.modules[idmodulo] = Module(self, idarea, idmodulo,
                                            descripcion, icono)

        file_object = open(filedir("..", "share", "pineboo", "sys.xpm"), "r")
        icono = file_object.read()
        file_object.close()
        icono = clearXPM(icono)

        self.modules["sys"] = Module(self, "sys", "sys", "Administración",
                                     icono)

        # Descargar proyecto . . .

        self.cur.execute(
            """ SELECT idmodulo, nombre, sha FROM flfiles ORDER BY idmodulo, nombre """
        )
        size_ = len(self.cur.fetchall())
        self.cur.execute(
            """ SELECT idmodulo, nombre, sha FROM flfiles ORDER BY idmodulo, nombre """
        )
        f1 = open(self.dir("project.txt"), "w")
        self.files = {}
        if self._DGI.useDesktop() and self._DGI.localDesktop():
            tiempo_ini = time.time()
        if not os.path.exists(self.dir("cache")):
            raise AssertionError
        # if self.parseProject:
        if self._DGI.useDesktop() and self._DGI.localDesktop():
            util.createProgressDialog("Pineboo", size_)
        p = 0
        for idmodulo, nombre, sha in self.cur:
            p = p + 1
            if self._DGI.useDesktop() and self._DGI.localDesktop():
                util.setProgress(p)
                util.setLabelText("Convirtiendo %s." % nombre)
            if idmodulo not in self.modules:
                continue  # I
            fileobj = File(self, idmodulo, nombre, sha)
            if nombre in self.files:
                self.logger.warn(
                    "run: file %s already loaded, overwritting..." % nombre)
            self.files[nombre] = fileobj
            self.modules[idmodulo].add_project_file(fileobj)
            f1.write(fileobj.filekey + "\n")
            if os.path.exists(self.dir("cache", fileobj.filekey)):
                continue
            fileobjdir = os.path.dirname(self.dir("cache", fileobj.filekey))
            if not os.path.exists(fileobjdir):
                os.makedirs(fileobjdir)

            cur2 = self.conn.cursor()
            sql = "SELECT contenido FROM flfiles WHERE idmodulo = %s AND nombre = %s AND sha = %s" % (
                self.conn.driver().formatValue("string", idmodulo, False),
                self.conn.driver().formatValue("string", nombre, False),
                self.conn.driver().formatValue("string", sha, False))
            cur2.execute(sql)
            for (contenido, ) in cur2:
                f2 = open(self.dir("cache", fileobj.filekey), "wb")
                # La cadena decode->encode corrige el bug de guardado de
                # AbanQ/Eneboo
                txt = ""
                try:
                    # txt = contenido.decode("UTF-8").encode("ISO-8859-15")
                    txt = contenido.encode("ISO-8859-15")
                except Exception:
                    self.logger.exception("Error al decodificar %s %s",
                                          idmodulo, nombre)
                    # txt = contenido.decode("UTF-8","replace").encode("ISO-8859-15","replace")
                    txt = contenido.encode("ISO-8859-15", "replace")

                f2.write(txt)

            if self.parseProject and nombre.endswith(".qs"):
                self.parseScript(self.dir("cache", fileobj.filekey))

        if self._DGI.useDesktop() and self._DGI.localDesktop():
            tiempo_fin = time.time()
            self.logger.info(
                "Descarga del proyecto completo a disco duro: %.3fs",
                (tiempo_fin - tiempo_ini))

        # Cargar el núcleo común del proyecto
        idmodulo = 'sys'
        for root, dirs, files in os.walk(filedir("..", "share", "pineboo")):
            for nombre in files:
                if root.find("modulos") == -1:
                    fileobj = File(self, idmodulo, nombre, basedir=root)
                    self.files[nombre] = fileobj
                    self.modules[idmodulo].add_project_file(fileobj)
                    if self.parseProject and nombre.endswith(".qs"):
                        self.parseScript(self.dir(root, nombre))

        if self._DGI.useDesktop() and self._DGI.localDesktop():
            try:
                util.destroyProgressDialog()
            except Exception as e:
                self.logger.error(e)

        self.loadTranslations()
        self.readState()
        self.acl_ = FLAccessControlLists()
        self.acl_.init_()
예제 #5
0
파일: flqpsql.py 프로젝트: deavid/pineboo
    def Mr_Proper(self):
        util = FLUtil()
        self.db_.dbAux().transaction()

        qry = FLSqlQuery(None, self.db_.dbAux())
        qry2 = FLSqlQuery(None, self.db_.dbAux())
        steps = 0

        rx = QRegExp("^.*\\d{6,9}$")
        if rx in self.tables() is not False:
            listOldBks = rx in self.tables()
        else:
            listOldBks = []

        qry.exec_("select nombre from flfiles where nombre similar to"
                  "'%[[:digit:]][[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]]%:[[:digit:]][[:digit:]]%' or nombre similar to"
                  "'%alteredtable[[:digit:]][[:digit:]][[:digit:]][[:digit:]]%' or (bloqueo='f' and nombre like '%.mtd')")

        util.createProgressDialog(
            util.tr("Borrando backups"), len(listOldBks) + qry.size() + 2)

        while qry.next():
            item = qry.value(0)
            util.setLabelText(util.tr("Borrando registro %1").arg(item))
            qry2.exec_("DELETE FROM flfiles WERE nombre ='%s'" % item)
            if item.find("alteredtable") > -1:
                if self.existsTable(item.replace(".mtd", "")):
                    util.setLabelText(util.tr("Borrando tabla %1").arg(item))
                    qry2.exec_("DROP TABLE %s CASCADE" %
                               item.replace(".mtd", ""))

            steps = steps + 1
            util.setProgress(steps)

        for item in listOldBks:
            if self.existsTable(item):
                util.setLabelText(util.tr("Borrando tabla %s" % item))
                qry2.exec_("DROP TABLE %s CASCADE" % item)

            steps = steps + 1
            util.setProgress(steps)

        util.setLabelText(util.tr("Inicializando cachés"))
        steps = steps + 1
        util.setProgress(steps)
        qry.exec_("DELETE FROM flmetadata")
        qry.exec_("DELETE FROM flvar")
        self.db_.manager().cleanupMetaData()
        # self.db_.driver().commit()
        util.destroyProgressDialog()

        steps = 0
        qry.exec_("select tablename from pg_tables where schemaname='public'")
        util.createProgressDialog(
            util.tr("Comprobando base de datos"), qry.size())
        while qry.next():
            item = qry.value(0)
            util.setLabelText(util.tr("Comprobando tabla %s" % item))

            mustAlter = self.mismatchedTable(item, item)
            if mustAlter:
                conte = self.db_.managerModules().content("%s.mtd" % item)
                if conte:
                    msg = util.tr("La estructura de los metadatos de la tabla '%s' y su "
                                  "estructura interna en la base de datos no coinciden. "
                                  "Intentando regenerarla." % item)

                    print(msg)
                    self.alterTable2(conte, conte, None, True)

            steps = steps + 1
            util.setProgress(steps)

        self.db_.dbAux().driver().transaction()
        steps = 0
        sqlCursor = FLSqlCursor(None, True, self.db_.dbAux())
        sqlQuery = FLSqlQuery(None, self.db_.dbAux())
        if sqlQuery.exec_("select relname from pg_class where ( relkind = 'r' ) "
                          "and ( relname !~ '^Inv' ) " "and ( relname !~ '^pg_' ) and ( relname !~ '^sql_' )"):

            util.setTotalSteps(sqlQuery.size())
            while sqlQuery.next():
                item = sqlQuery.value(0)
                steps = steps + 1
                util.setProgress(steps)
                util.setLabelText(util.tr("Creando índices para %s" % item))
                mtd = self.db_.manager().metadata(item)
                fL = mtd.fieldList()
                if not mtd or not fL:
                    continue
                for it in fL:
                    if not it or not it.type() == "pixmap":
                        continue
                    cur = FLSqlCursor(item, True, self.db_.dbAux())
                    cur.select(it.name() + " not like 'RK@%'")
                    while cur.next():
                        v = cur.value(it.name())
                        if v is None:
                            continue

                        v = self.db_.manager().storeLargeValue(mtd, v)
                        if v:
                            buf = cur.primeUpdate()
                            buf.setValue(it.name(), v)
                            cur.update(False)

                sqlCursor.setName(item, True)

        # self.db_.dbAux().driver().commit()

        steps = 0
        qry.exec_("select tablename from pg_tables where schemaname='public'")
        util.createProgressDialog(
            util.tr("Analizando base de datos"), qry.size())
        while qry.next():
            item = qry.value(0)
            util.setLabelText(util.tr("Analizando tabla %s" % item))
            qry2.exec_("vacuum analyze %s" % item)
            steps = steps + 1
            util.setProgress(steps)

        util.destroyProgressDialog()
예제 #6
0
    def printReport(self):
        if self.report_ == 0:
            return False

        self.report_.setPrintToPos(self.printToPos_)

        if self.report_.printToPos():
            return self.printToPosReport()

        if False:
            # WIN32 #FIXME
            pass

        cnt = self.report_.pageCount()

        if cnt == 0:
            QtCore.QMessageBox.critical(
                self, "Kugar",
                FLUtil.translate(self, "app",
                                 "No hay páginas en el\ninforme para."),
                QtCore.QMessageBox.Ok, QtCore.QMessageBox.NoButton,
                QtCore.QMessageBox.NoButton)
            return False

        self.printer_ = QtPrintSupport.QPrinter(
            QtPrintSupport.QPrinter.HighResolution)
        self.printer_.setPageSize(self.report_.pageSize())
        if self.printer_.pageSize() == self.printer_.Custom:
            self.printer_.setCustomPaperSize(self.report_.pageDimensions())
        self.printer_.setOrientation(self.report_.pageOrientation())
        self.printer_.setPrintRange(self.printer_.AllPages)
        self.printer_.setFromTo(1, cnt)
        self.printer_.setFullPage(True)
        self.printer_.setColorMode(self.colorMode_)
        self.printer_.setCopyCount(self.numCopies_)
        if self.printerName_ and self.printerName_ != "":
            self.printer_.setPrinterName(self.printerName_)
        printProg = self.printer_.printProgram()
        if printProg and printProg != "":
            self.printer_.setPrintProgram(printProg)

        printNow = True
        if not self.printerName_ or self.printerName_ == "":
            dialog = QtPrintSupport.QPrintDialog()
            if dialog.exec_() != dialog.Accepted:
                printNow = False

            # printNow = self.printer_.setup(
            # QtWidgets.QApplication.focusWidget())

        if printNow:
            painter = QtGui.QPainter()
            printRev = False

            viewIdx = self.report_.getCurrentIndex()

            lpf = QtPrintSupport.QPrinter.LastPageFirst
            if self.printer_.pageOrder() == lpf:
                printRev = True

            printFrom = self.printer_.fromPage() - 1
            printTo = self.printer_.toPage()
            printCnt = (printTo - printFrom)
            printCopies = self.printer_.copyCount()
            self.totalSteps_ = printCnt * printCopies
            currentStep = 1

            self.printer_.setCopyCount(1)

            util = FLUtil()

            self.progress_ = util.createProgressDialog(
                util.translate("app", "Imprimiendo Informe..."),
                self.totalSteps_)
            # self.progress_.setMinimunDuration(self.M_PROGRESS_DELAY)
            self.progress_.canceled.connect(self.slotCancelPrinting)
            util.setProgress(0)
            QtWidgets.QApplication.processEvents()

            painter.begin(self.printer_)
            pdm = self.printer_.device()
            dim = self.report_.pageDimensions()
            painter.setWindow(0, 0, dim.width(), dim.height())
            painter.setViewport(0, 0, pdm.width(), pdm.height())

            for j in range(printCopies):
                i = printFrom
                while i < printTo:
                    if not self.printer_.aborted():
                        util.setProgress(currentStep)
                        QtWidgets.QApplication.processEvents()

                        if printRev:
                            self.report_.setCurrentPage(i if printCnt == 1 else
                                                        (printCnt - 1) - i)
                        else:
                            self.report_.setCurrentPage(i)

                        page = self.report_.getCurrentPage()
                        page.play(painter)
                        if (i - printFrom) < (printCnt - 1):
                            self.printer_.newPage()
                    else:
                        j = printCopies
                        break

                    i += 1
                    currentStep += 1

                if j < (printCopies - 1):
                    self.printer_.newPage()

            painter.end()
            self.report_.setCurrentPage(viewIdx)

            del self.printer_
            return True

        del self.printer_
        return False
예제 #7
0
    def printReportToPS(self, outPsFile):
        if self.report_ == 0:
            return False

        if False:
            # WIN32/MAC #FIXME
            return self.printGhostReportToPS(outPsFile)

        cnt = self.report_.pageCount()

        if cnt == 0:
            QtCore.QMessageBox.critical(
                self, "Kugar",
                FLUtil.translate(self, "app",
                                 "No hay páginas en el\ninforme para."),
                QtCore.QMessageBox.Ok, QtCore.QMessageBox.NoButton,
                QtCore.QMessageBox.NoButton)
            return False

        self.printer_ = QtPrintSupport.QPrinter(
            QtPrintSupport.QPrinter.HighResolution)
        self.printer_.setPageSize(self.report_.pageSize())
        if self.printer_.pageSize() == QtPrintSupport.QPrinter.PageSize.Custom:
            self.printer_.setCustomPaperSize(self.report_.pageDimensions())
        self.printer_.setOrientation(self.report_.pageOrientation())
        self.printer_.setMinMax(1, cnt)
        self.printer_.setFromTo(1, cnt)
        self.printer_.setFullPage(True)
        self.printer_.setColorMode(self.colorMode_)
        self.printer_.setNumCopies(self.numCopies_)
        self.printer_.setOutputToFile(True)
        self.printer_.setOutputFileName(outPsFile)

        painter = QtGui.QPainter()
        printRev = False

        viewIdx = self.report_.getCurrentIndex()

        lpf = QtPrintSupport.QPrinter.PageOrder.LastPageFirst
        if self.printer_.pageOrder() == lpf:
            printRev = True

        printFrom = self.printer_.fromPage() - 1
        printTo = self.printer_.toPage()
        printCnt = (printTo - printFrom)
        printCopies = self.printer_.numCopies()
        self.totalSteps_ = printCnt * printCopies
        currentStep = 1

        self.printer_.setNumCopies(self.numCopies_)
        self.printer_.setResolution(self.dpi_)

        util = FLUtil()

        self.progress_ = util.createProgressDialog(
            FLUtil.translate(self, "app", "Imprimiendo Informe..."),
            self.totalSteps_)
        # self.progress_.setMinimunDuration(self.M_PROGRESS_DELAY)
        self.progress_.canceled.connect(self.slotCancelPrinting)
        util.setProgress(0)
        QtWidgets.QApplication.processEvents()

        painter.begin(self.printer_)
        pdm = self.printer_.device()
        dim = self.report_.pageDimensions()
        painter.setWindow(0, 0, dim.width(), dim.height())
        painter.setViewport(0, 0, pdm.width(), pdm.height())

        for j in range(printCopies):
            i = printFrom
            while i < printTo:
                if not self.printer_.aborted():
                    util.setProgress(currentStep)
                    QtWidgets.QApplication.processEvents()

                    if printRev:
                        self.report_.setCurrentPage(i if printCnt == 1 else
                                                    (printCnt - 1) - i)
                    else:
                        self.report_.setCurrentPage(i)

                    page = self.report_.getCurrentPage()
                    page.play(painter)
                    if (i - printFrom) < (printCnt - 1):
                        self.printer_.newPage()
                else:
                    j = printCopies
                    break

                i += 1
                currentStep += 1

            if j < (printCopies - 1):
                self.printer_.newPage()

        painter.end()
        self.report_.setCurrentPage(viewIdx)

        del self.printer_
        return True
예제 #8
0
    def Mr_Proper(self):
        util = FLUtil()
        self.db_.dbAux().transaction()

        qry = FLSqlQuery(None, self.db_.dbAux())
        qry2 = FLSqlQuery(None, self.db_.dbAux())
        steps = 0

        rx = QRegExp("^.*\\d{6,9}$")
        listOldBks = rx in self.tables("")
        qry.exec_(
            "select nombre from flfiles where nombre similar to"
            "'%[[:digit:]][[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]]%:[[:digit:]][[:digit:]]%' or nombre similar to"
            "'%alteredtable[[:digit:]][[:digit:]][[:digit:]][[:digit:]]%' or (bloqueo='f' and nombre like '%.mtd')"
        )

        util.createProgressDialog(util.tr("Borrando backups"),
                                  len(listOldBks) + qry.size() + 2)
        while qry.next():
            item = qry.value(0)
            util.setLabelText(util.tr("Borrando registro %1").arg(item))
            qry2.exec_("DELETE FROM flfiles WERE nombre ='%s'" % item)
            if item.find("alteredtable") > -1:
                if self.existsTable(item.replace(".mtd", "")):
                    util.setLabelText(util.tr("Borrando tabla %1").arg(item))
                    qry2.exec_("DROP TABLE %s CASCADE" %
                               item.replace(".mtd", ""))

            steps = steps + 1
            util.setProgress(steps)

        for item in listOldBks:
            if self.existsTable(item):
                util.setLabelText(util.tr("Borrando tabla %1").arg(item))
                qry2.exec_("DROP TABLE %s CASCADE" % item)

            steps = steps + 1
            util.setProgress(steps)

        util.setLabelText(util.tr("Inicializando cachés"))
        steps = steps + 1
        util.setProgress(steps)
        qry.exec_("DELETE FROM flmetadata")
        qry.exec_("DELETE FROM flvar")
        self.db_.manager().cleanupMetaData()
        self.db_.commit()
        util.destroyProgressDialog()

        steps = 0
        qry.exec_("select tablename from pg_tables where schemaname='public'")
        util.createProgressDialog(util.tr("Comprobando base de datos"),
                                  qry.size())
        while qry.next():
            item = qry.value(0)
            util.setLabelText(util.tr("Comprobando tabla %1").arg(item))

            mustAlter = self.mismatchedTable(item, item)
            if mustAlter:
                conte = self.db_.managerModules().content("%s.mtd" % item)
                if conte:
                    msg = util.tr(
                        "La estructura de los metadatos de la tabla '%1' y su "
                        "estructura interna en la base de datos no coinciden. "
                        "Intentando regenerarla.").arg(item)

                    print(msg)
                    self.alterTable2(conte, conte, None, True)

            steps = steps + 1
            util.setProgress(steps)

        self.db_.dbAux().transaction()
        steps = 0
        sqlCursor = FLSqlCursor(None, True, self.db_.dbAux())
        sqlQuery = FLSqlQuery(None, self.db_.dbAux())
        if sqlQuery.exec_(
                "select relname from pg_class where ( relkind = 'r' ) "
                "and ( relname !~ '^Inv' ) "
                "and ( relname !~ '^pg_' ) and ( relname !~ '^sql_' )"):

            util.setTotalSteps(sqlQuery.size())
            while sqlQuery.next():
                item = sqlQuery.value(0)
                steps = steps + 1
                util.setProgress(steps)
                util.setLabelText(util.tr("Creando índices para %1").arg(item))
                mtd = self.db_.manager().metadata(item)
                fL = mtd.fieldList()
                if not mtd or not fL:
                    continue
                for it in fL:
                    if not it or not it.type() == "pixmap":
                        continue
                    cur = FLSqlCursor(item, True, self.db_.dbAux())
                    cur.select("%s not like 'RK@%'" % it.name())
                    while cur.next():
                        v = cur.value(it.name())
                        if v is None:
                            continue

                        v = self.db_.manager().storeLargeValue(mtd, v)
                        if v:
                            buf = cur.primeUpdate()
                            buf.setValue(it.name(), v)
                            cur.update(False)

                sqlCursor.setName(item, True)

        self.db_.dbAux().commit()

        steps = 0
        qry.exec_("select tablename from pg_tables where schemaname='public'")
        util.createProgressDialog(util.tr("Analizando base de datos"),
                                  qry.size())
        while qry.next():
            item = qry.value(0)
            util.setLabelText(util.tr("Analizando tabla %1").arg(item))
            qry2.exec_("vacuum analyze %s" % item)
            steps = steps + 1
            util.setProgress(steps)

        util.destroyProgressDialog()