def createTable(self, n_or_tmd): """ Crea una tabla en la base de datos. @param n_tmd Nombre o metadatos de la tabla que se quiere crear @return Un objeto FLTableMetaData con los metadatos de la tabla que se ha creado, o 0 si no se pudo crear la tabla o ya existía """ util = FLUtil() if n_or_tmd is None: return False if isinstance(n_or_tmd, str): tmd = self.metadata(n_or_tmd) if not tmd: return False if self.existsTable(tmd.name()): self.listTables_.append(n_or_tmd) return tmd else: qWarning("FLMAnager :: No existe tabla %s" % n_or_tmd) return self.createTable(tmd) else: if n_or_tmd.isQuery() or self.existsTable(n_or_tmd.name(), False): return n_or_tmd if not self.db_.createTable(n_or_tmd): logger.warn("FLManager : %s", util.tr( "No se ha podido crear la tabla ") + n_or_tmd.name()) return False return n_or_tmd
def createTable(self, n_or_tmd): util = FLUtil() if n_or_tmd == None: return False if isinstance(n_or_tmd, str): tmd = self.metadata(n_or_tmd) if not tmd: return False if self.existsTable(tmd.name()): self.listTables_.append(n_or_tmd) return tmd else: qWarning("FLMAnager :: No existe tabla %s" % n_or_tmd) return self.createTable(tmd) else: if n_or_tmd.isQuery() or self.existsTable(n_or_tmd.name(), False): return n_or_tmd if not self.db_.createTable(n_or_tmd): print( "FLManager :", util.tr("No se ha podido crear la tabla ") + n_or_tmd.name()) return False return n_or_tmd
def createSystemTable(self, n): util = FLUtil() if not self.existsTable(n): doc = QDomDocument() _path = filedir("..", "share", "pineboo", "tables") dir = qsatype.Dir(_path) _tables = dir.entryList("%s.mtd" % n) for f in _tables: path = "%s/%s" % (_path, f) _file = QtCore.QFile(path) _file.open(QtCore.QIODevice.ReadOnly) _in = QtCore.QTextStream(_file) _data = _in.readAll() if not util.domDocumentSetContent(doc, _data): print( "FLManager::createSystemTable :", util.tr( "Error al cargar los metadatos para la tabla %1"). arg(n)) return False else: docElem = doc.documentElement() mtd = self.createTable(self.metadata(docElem, True)) return mtd f.close() return False
def installACL(self, idacl): """ Crea un nuevo fichero "acl.xml" y lo almacena sustituyendo el anterior, en el caso de que exista. @param idacl Identificador del registro de la tabla "flacls" a utilizar para crear "acl.xml". """ util = FLUtil() doc = QDomDocument("ACL") root = doc.createElement("ACL") doc.appendChild(root) name = doc.createElement("name") root.appendChild(name) n = doc.createTextNode(idacl) name.appendChild(n) q = FLSqlQuery() q.setTablesList("flacs") q.setSelect("idac,tipo,nombre,iduser,idgroup,degroup,permiso") q.setFrom("flacs") q.setWhere("idacl='%s'" % idacl) q.setOrderBy("prioridad DESC, tipo") q.setForwarOnly(True) if q.exec_(): step = 0 progress = util.ProgressDialog( util.tr("Instalando control de acceso..."), None, q.size(), None, None, True) progress.setCaption(util.tr("Instalando ACL")) progress.setMinimumDuration(0) progress.setProgress(++step) while q.next(): self.makeRule(q, doc) progress.setProgress(++step) self.database().managerModules().setContent( "acl.xml", "sys", doc.toString())
def installACL(self, idacl): """ Crea un nuevo fichero "acl.xml" y lo almacena sustituyendo el anterior, en el caso de que exista. @param idacl Identificador del registro de la tabla "flacls" a utilizar para crear "acl.xml". """ util = FLUtil() doc = QDomDocument("ACL") root = doc.createElement("ACL") doc.appendChild(root) name = doc.createElement("name") root.appendChild(name) n = doc.createTextNode(idacl) name.appendChild(n) q = FLSqlQuery() q.setTablesList("flacs") q.setSelect("idac,tipo,nombre,iduser,idgroup,degroup,permiso") q.setFrom("flacs") q.setWhere("idacl='%s'" % idacl) q.setOrderBy("prioridad DESC, tipo") q.setForwarOnly(True) if q.exec_(): step = 0 progress = util.ProgressDialog( util.tr("Instalando control de acceso..."), None, q.size(), None, None, True) progress.setCaption(util.tr("Instalando ACL")) progress.setMinimumDuration(0) progress.setProgress(++step) while q.next(): self.makeRule(q, doc) progress.setProgress(++step) self.database().managerModules().setContent("acl.xml", "sys", doc.toString())
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()
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()
def init(self, aclXml=None): util = FLUtil() if not aclXml: self.init(self.database().managerModules().content("acl.xml")) return doc = QDomDocument("ACL") if self.accessControlList_: self.accessControlList_.clear() del self.accessControlList_ self.accessControlList_ = {} if not util.domDocumentSetContent(doc, aclXml): qWarning("FLAccessControlList : " + util.tr("Lista de control de acceso vacia o errónea")) return self.accessControlList_ = {} self.accessControlList_.setAutoDelete(True) docElem = doc.documentElement() no = docElem.firstChild() while no: e = no.toElement() if e: if e.tagName() == "name": self.name_ = e.text() no = no.nextSibling() continue ac = FLAccessControlFactory.create(e.tagName()) if ac: ac.set(e) self.accessControlList_.replace( "%s::%s::%s" % (ac.type(), ac.name(), ac.user()), ac) no = no.nextSibling() continue no = no.nextSibling()
def createSystemTable(self, n): """ Crea una tabla del sistema. Este método lee directamente de disco el fichero con la descripción de una tabla del sistema y la crea en la base de datos. Su uso normal es para inicializar el sistema con tablas iniciales. @param n Nombre de la tabla. @return Un objeto FLTableMetaData con los metadatos de la tabla que se ha creado, o False si no se pudo crear la tabla o ya existía """ util = FLUtil() if not self.existsTable(n): doc = QDomDocument() _path = filedir("..", "share", "pineboo", "tables") dir = qsatype.Dir_Class(_path) _tables = dir.entryList("%s.mtd" % n) for f in _tables: path = "%s/%s" % (_path, f) _file = QtCore.QFile(path) _file.open(QtCore.QIODevice.ReadOnly) _in = QtCore.QTextStream(_file) _data = _in.readAll() if not util.domDocumentSetContent(doc, _data): logger.warn( "FLManager::createSystemTable: %s", util.tr( "Error al cargar los metadatos para la tabla %1"). arg(n)) return False else: docElem = doc.documentElement() mtd = self.createTable(self.metadata(docElem, True)) return mtd f.close() return False
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 metadata(self, n, quick=False): """ Para obtener definicion de una tabla de la base de datos, a partir de un fichero XML. El nombre de la tabla corresponde con el nombre del fichero mas la extensión ".mtd" que contiene en XML la descripción de la tablas. Este método escanea el fichero y construye/devuelve el objeto FLTableMetaData correspondiente, además realiza una copia de estos metadatos en una tabla de la misma base de datos para poder determinar cuando ha sido modificados y así, si es necesario, reconstruir la tabla para que se adapte a la nuevos metadatos. NO SE HACEN CHEQUEOS DE ERRORES SINTÁCTICOS EN EL XML. IMPORTANTE :Para que estos métodos funcionen correctamente, es estrictamente necesario haber creado la base de datos en PostgreSQL con codificación UNICODE; "createdb -E UNICODE abanq". @param n Nombre de la tabla de la base de datos de la que obtener los metadatos @param quick Si TRUE no realiza chequeos, usar con cuidado @return Un objeto FLTableMetaData con los metadatos de la tabla solicitada """ util = FLUtil() if not n: return None if isinstance(n, str): if not n or not self.db_.dbAux(): return None ret = False acl = False key = n stream = None isSysTable = (n[0:3] == "sys" or self.isSystemTable(n)) if not isSysTable: stream = self.db_.managerModules().contentCached("%s.mtd" % key) if not stream: qWarning( "FLManager : Error al cargar los metadatos para la tabla %s" % n) return None # if not key: # key = n if not isSysTable: for fi in self.cacheMetaData_: if fi.name() == key: ret = fi break else: for fi in self.cacheMetaDataSys_: if fi.name() == key: ret = fi break if not ret: if isSysTable: stream = self.db_.managerModules().contentCached("%s.mtd" % n) if not stream: qWarning("FLManager : " + util.tr( "Error al cargar los metadatos para la tabla %s" % n)) return None doc = QDomDocument(n) if not util.domDocumentSetContent(doc, stream): qWarning("FLManager : " + util.tr( "Error al cargar los metadatos para la tabla %s" % n)) return None docElem = doc.documentElement() ret = self.metadata(docElem, quick) if not ret: return None if not isSysTable and not ret.isQuery(): self.cacheMetaData_.append(ret) elif isSysTable: self.cacheMetaDataSys_.append(ret) else: acl = self._prj.acl() if ret.fieldsNamesUnlock(): ret = FLTableMetaData(ret) if acl: acl.process(ret) if not quick and not isSysTable and self._prj.consoleShown( ) and not ret.isQuery() and self.db_.mismatchedTable(n, ret): msg = util.translate( "application", "La estructura de los metadatos de la tabla '%1' y su estructura interna en la base de datos no coinciden.\n" "Debe regenerar la base de datos.").replace("%1", n) logger.warn(msg) # throwMsgWarning(self.db_, msg) return ret else: # QDomDoc name = None q = None a = None ftsfun = None v = True ed = True cw = False dl = False no = n.firstChild() while not no.isNull(): e = no.toElement() if not e.isNull(): if e.tagName() == "field": no = no.nextSibling() continue if e.tagName() == "name": name = e.text() no = no.nextSibling() continue if e.tagName() == "query": q = e.text() no = no.nextSibling() continue if e.tagName() == "alias": a = auto_qt_translate_text(e.text()) a = util.translate("Metadata", a) no = no.nextSibling() continue if e.tagName() == "visible": v = (e.text() == "true") no = no.nextSibling() continue if e.tagName() == "editable": ed = (e.text() == "true") no = no.nextSibling() continue if e.tagName() == "concurWarn": cw = (e.text() == "true") no = no.nextSibling() continue if e.tagName() == "detectLocks": dl = (e.text() == "true") no = no.nextSibling() continue if e.tagName() == "FTSFunction": ftsfun = (e.text() == "true") no = no.nextSibling() continue no = no.nextSibling() tmd = FLTableMetaData(name, a, q) cK = None assocs = [] tmd.setFTSFunction(ftsfun) tmd.setConcurWarn(cw) tmd.setDetectLocks(dl) no = n.firstChild() while not no.isNull(): e = no.toElement() if not e.isNull(): if e.tagName() == "field": f = self.metadataField(e, v, ed) if not tmd: tmd = FLTableMetaData(name, a, q) tmd.addFieldMD(f) if f.isCompoundKey(): if not cK: cK = FLCompoundKey() cK.addFieldMD(f) if f.associatedFieldName(): assocs.append(f.associatedFieldName()) assocs.append(f.associatedFieldFilterTo()) assocs.append(f.name()) no = no.nextSibling() continue no = no.nextSibling() tmd.setCompoundKey(cK) aWith = None aBy = None for it in assocs: if not aWith: aWith = it continue if not aBy: aBy = it continue if not tmd.field(it): continue tmd.field(it).setAssociatedField(tmd.field(aWith), aBy) if q and not quick: qry = self.query(q, tmd) if qry: fL = qry.fieldList() table = None field = None fields = tmd.fieldsNames() # .split(",") fieldsEmpty = (not fields) for it in fL: pos = it.find(".") if pos > -1: table = it[:pos] field = it[pos + 1:] else: field = it # if not (not fieldsEmpty and table == name and fields.find(field.lower())) != fields.end(): # print("Tabla %s nombre %s campo %s buscando en %s" % (table, name, field, fields)) # if not fieldsEmpty and table == name and (field.lower() in fields): Asi esta en Eneboo, pero incluye campos repetidos if not fieldsEmpty and (field.lower() in fields): continue mtdAux = self.metadata(table, True) if mtdAux: fmtdAux = mtdAux.field(field) if mtdAux: isForeignKey = False if fmtdAux.isPrimaryKey( ) and not table == name: fmtdAux = FLFieldMetaData(fmtdAux) fmtdAux.setIsPrimaryKey(False) fmtdAux.setEditable(False) # newRef = (not isForeignKey) fmtdAuxName = fmtdAux.name().lower() if fmtdAuxName.find(".") == -1: # fieldsAux = tmd.fieldsNames().split(",") fieldsAux = tmd.fieldsNames() # if not fieldsAux.find(fmtdAuxName) == fieldsAux.end(): if fmtdAuxName not in fieldsAux: if not isForeignKey: FLFieldMetaData(fmtdAux) # fmtdAux.setName("%s.%s" % (table, field)) # if newRef: # fmtdAux.ref() tmd.addFieldMD(fmtdAux) del qry acl = self._prj.acl() if acl: acl.process(tmd) return tmd
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()
def metadata(self, n, quick=False): util = FLUtil() if not n: return None if isinstance(n, str): if not n or not self.db_.dbAux(): return None ret = False acl = False key = n stream = None isSysTable = (n[0:3] == "sys" or self.isSystemTable(n)) if not isSysTable: stream = self.db_.managerModules().contentCached("%s.mtd" % key) if not stream: qWarning( "FLManager : Error al cargar los metadatos para la tabla %s" % n) return None # if not key: # key = n if not isSysTable: for fi in self.cacheMetaData_: if fi.name() == key: ret = fi break else: for fi in self.cacheMetaDataSys_: if fi.name() == key: ret = fi break if not ret: if isSysTable: stream = self.db_.managerModules().contentCached("%s.mtd" % n) if not stream: qWarning("FLManager : " + util.tr( "Error al cargar los metadatos para la tabla %s" % n)) return None doc = QDomDocument(n) if not util.domDocumentSetContent(doc, stream): qWarning("FLManager : " + util.tr( "Error al cargar los metadatos para la tabla %s" % n)) return None docElem = doc.documentElement() ret = self.metadata(docElem, quick) if not ret: return None if not isSysTable and not ret.isQuery(): self.cacheMetaData_.append(ret) elif isSysTable: self.cacheMetaDataSys_.append(ret) else: acl = self._prj.acl() if ret.fieldsNamesUnlock(): ret = FLTableMetaData(ret) if acl: acl.process(ret) if not quick and not isSysTable and self._prj.consoleShown( ) and not ret.isQuery() and self.db_.mismatchedTable(n, ret): msg = util.tr( "La estructura de los metadatos de la tabla '%1' y su " "estructura interna en la base de datos no coinciden. " "Debe regenerar la base de datos.").arg(n) throwMsgWarning(self.db_, msg) return ret else: #QDomDoc name = None q = None a = None ftsfun = None v = True ed = True cw = False dl = False no = n.firstChild() while not no.isNull(): e = no.toElement() if not e.isNull(): if e.tagName() == "field": no = no.nextSibling() continue if e.tagName() == "name": name = e.text() no = no.nextSibling() continue if e.tagName() == "query": q = e.text() no = no.nextSibling() continue if e.tagName() == "alias": a = auto_qt_translate_text(e.text()) a = util.translate("Metadata", a) no = no.nextSibling() continue if e.tagName() == "visible": v = (e.text() == "true") no = no.nextSibling() continue if e.tagName() == "editable": ed = (e.text() == "true") no = no.nextSibling() continue if e.tagName() == "concurWarn": cw = (e.text() == "true") no = no.nextSibling() continue if e.tagName() == "detectLocks": dl = (e.text() == "true") no = no.nextSibling() continue if e.tagName() == "FTSFunction": ftsfun = (e.text() == "true") no = no.nextSibling() continue no = no.nextSibling() tmd = FLTableMetaData(name, a, q) cK = None assocs = [] tmd.setFTSFunction(ftsfun) tmd.setConcurWarn(cw) tmd.setDetectLocks(dl) no = n.firstChild() while not no.isNull(): e = no.toElement() if not e.isNull(): if e.tagName() == "field": f = self.metadataField(e, v, ed) if not tmd: tmd = FLTableMetaData(name, a, q) tmd.addFieldMD(f) if f.isCompoundKey(): if not cK: cK = FLCompoundKey() cK.addFieldMD(f) if f.associatedFieldName(): assocs.append(f.associatedFieldName()) assocs.append(f.associatedFieldFilterTo()) assocs.append(f.name()) no = no.nextSibling() continue no = no.nextSibling() tmd.setCompoundKey(cK) aWith = None aBy = None for it in assocs: if not aWith: aWith = it continue if not aBy: aBy = it continue tmd.field(it).setAssociatedField(tmd.field(aWith), aBy) if q and not quick: qry = self.query(q, tmd) if qry: fL = qry.fieldList() table = None field = None fields = tmd.fieldsNames().split(",") fieldsEmpty = (not fields) for it in fL: pos = it.find(".") if pos > -1: table = it[:pos] field = it[:pos] else: field = it if not (not fieldsEmpty and table == name and fields.find(field.lower())) == fields.end(): continue mtdAux = self.metadata(table, True) if mtdAux: fmtdAux = mtdAux.field(field) if mtdAux: isForeignKey = False if fmtdAux.isPrimaryKey( ) and not table == name: fmtdAux = FLFieldMetaData(fmtdAux) fmtdAux.setIsprimaryKey(False) fmtdAux.setEditable(False) newRef = (not isForeignKey) fmtdAuxName = fmtdAux.name().lower() if fmtdAuxName.find(".") == -1: fieldsAux = tmd.fieldsNames().split(",") if not fieldsAux.find( fmtdAuxName) == fieldsAux.end(): if not isForeignKey: fmdtAux = FLFieldMetaData(fmtdAux) fmtdAux.setName("%s.%s" % (tambe, field)) newRef = False if newRef: fmtdAux.ref() tmd.addFieldMD(fmtdAux) qry.deleteLater() acl = self._prj.acl() if acl: acl.process(tmd) return tmd