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()
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_()
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()