def tables(self, typeName=None): tl = [] if not self.isOpen(): return tl t = FLSqlQuery() t.setForwardOnly(True) if not typeName or typeName == "Tables": t.exec_( "select relname from pg_class where ( relkind = 'r' ) AND ( relname !~ '^Inv' ) AND relname !~ '^pg_' ) " ) while t.next(): tl.append(str(t.value(0))) if not typeName or typeName == "Views": t.exec_( "select relname from pg_class where ( relkind = 'v' ) AND ( relname !~ '^Inv' ) AND relname !~ '^pg_' ) " ) while t.next(): tl.append(str(t.value(0))) if not typeName or typeName == "SystemTables": t.exec_( "select relname from pg_class where ( relkind = 'r' ) AND relname like 'pg_%' ) " ) while t.next(): tl.append(str(t.value(0))) del t return tl
def tables(self, typeName=None): tl = [] if not self.isOpen(): return tl t = FLSqlQuery() t.setForwardOnly(True) if not typeName or typeName == "Tables": t.exec_( "select relname from pg_class where ( relkind = 'r' ) AND ( relname !~ '^Inv' ) AND ( relname !~ '^pg_' ) ") while t.next(): tl.append(str(t.value(0))) if not typeName or typeName == "Views": t.exec_( "select relname from pg_class where ( relkind = 'v' ) AND ( relname !~ '^Inv' ) AND ( relname !~ '^pg_' ) ") while t.next(): tl.append(str(t.value(0))) if not typeName or typeName == "SystemTables": t.exec_( "select relname from pg_class where ( relkind = 'r' ) AND ( relname like 'pg_%' ) ") while t.next(): tl.append(str(t.value(0))) del t return tl
def init(self): """ Acciones de inicialización. """ self.initCount_ = self.initCount_ + 1 self.createSystemTable("flmetadata") self.createSystemTable("flseqs") if not self.db_.dbAux(): return q = FLSqlQuery(None, self.db_.dbAux()) # q.setForwardOnly(True) self.createSystemTable("flsettings") if not q.exec_("SELECT * FROM flsettings WHERE flkey = 'sysmodver'"): if pineboolib.project.conn.driver().cascadeSupport(): q.exec_("DROP TABLE flsettings CASCADE") else: q.exec_("DROP TABLE flsettings") self.createSystemTable("flsettings") if not self.dictKeyMetaData_: self.dictKeyMetaData_ = {} # self.dictKeyMetaData_.setAutoDelete(True) else: self.dictKeyMetaData_.clear() q.exec_("SELECT tabla,xml FROM flmetadata") while q.next(): self.dictKeyMetaData_[q.value(0)] = q.value(1) q.exec_("SELECT * FROM flsettings WHERE flkey = 'sysmodver'") if not q.next(): if pineboolib.project.conn.driver().cascadeSupport(): q.exec_("DROP TABLE flmetadata CASCADE") else: q.exec_("DROP TABLE flmetadata") self.createSystemTable("flmetadata") c = FLSqlCursor("flmetadata", True, self.db_.dbAux()) for key, value in self.dictKeyMetaData_: buffer = c.primeInsert() buffer.setValue("tabla", key) buffer.setValue("xml", value) c.insert() if not self.cacheMetaData_: self.cacheMetaData_ = [] if not self.cacheAction_: self.cacheAction_ = [] if not self.cacheMetaDataSys_: self.cacheMetaDataSys_ = []
def cleanupMetaData(self): """ Limpieza la tabla flmetadata, actualiza el cotenido xml con el de los fichero .mtd actualmente cargados """ # util = FLUtil() if not self.existsTable("flfiles") or not self.existsTable( "flmetadata"): return q = FLSqlQuery(None, self.db_.dbAux()) c = FLSqlCursor("flmetadata", True, self.db_.dbAux()) buffer = None table = "" # q.setForwardOnly(True) # c.setForwardOnly(True) if not self.dictKeyMetaData_: self.dictKeyMetaData_ = {} else: self.dictKeyMetaData_.clear() self.loadTables() self.db_.managerModules().loadKeyFiles() self.db_.managerModules().loadAllIdModules() self.db_.managerModules().loadIdAreas() q.exec_("SELECT tabla, xml FROM flmetadata") while q.next(): self.dictKeyMetaData_[str(q.value(0))] = str(q.value(1)) q.exec_( "SELECT nombre, sha FROM flfiles WHERE nombre LIKE '%.mtd'") while q.next(): table = str(q.value(0)) table = table.replace(".mtd", "") if not self.existsTable(table): self.createTable(table) tmd = self.metadata(table) if not tmd: qWarning("FLManager::cleanupMetaDAta " + QApplication.tr( "No se ha podido crear los metadatatos para la tabla %1" ).arg(table)) c.select("tabla='%s'" % table) if c.next(): buffer = c.primeUpdate() buffer.setValue("xml", str(q.value(1))) c.update() self.dictKeyMetaData_[table] = str(q.value(1))
def sqlSelect(self, f, s, w, tL=None, size=0, connName="default"): if w == None or w == "": return False q = FLSqlQuery(None, connName) if tL: q.setTablesList(tL) else: q.setTablesList(f) q.setSelect(s) q.setFrom(f) q.setWhere(w) #q.setForwardOnly(True) if not q.exec(): return False if q.next(): valor = q.value(0) if isinstance(valor, datetime.date): valor = str(valor) return valor if size: return False
def sqlSelect(self, f, s, w, tL=None, size=0, connName="default"): """ Ejecuta una query de tipo select, devolviendo los resultados del primer registro encontrado @param f: Sentencia from de la query @param s: Sentencia select de la query, que será el nombre del campo a devolver @param w: Sentencia where de la query @param tL: Sentencia tableslist de la query. Necesario cuando en la sentencia from se incluya más de una tabla @param size: Número de líneas encontradas. (-1 si hay error) @param connName Nombre de la conexion @return Valor resultante de la query o falso si no encuentra nada. """ if w is None or w == "": return False q = FLSqlQuery(None, connName) if tL: q.setTablesList(tL) else: q.setTablesList(f) q.setSelect(s) q.setFrom(f) q.setWhere(w) # q.setForwardOnly(True) if not q.exec_(): return False if q.next(): valor = q.value(0) if isinstance(valor, datetime.date): valor = str(valor) return valor return False
def makeRuleUser(self, q, d, iduser): if not iduser or not q or not d: return ac = FLAccesccControlFactory.create(str(q.value(1))) if ac: ac.setName(str(q.value(2))) ac.setUser(iduser) ac.setPerm(str(q.value(6))) qAcos = FLSqlQuery() qAcos.setTablesList("flacos") qAcos.setSelect("nombre,permiso") qAcos.setFrom("flacos") qAcos.setWhere("idac ='%s'" % q.value(0)) qAcos.setForwardOnly() acos = None if qAcos.exec_(): while qAcos.next(): acos << str(qAcos.value(0)) acos << str(qAcos.value(1)) ac.setAcos(acos) ac.get(d) del ac
def tables(self, typeName=None): tl = [] if not self.isOpen(): return tl t = FLSqlQuery() t.setForwardOnly(True) if typeName == "Tables" and typeName == "Views": t.exec_( "SELECT name FROM sqlite_master WHERE type='table' OR type='view'" ) elif not typeName or typeName == "Tables": t.exec_("SELECT name FROM sqlite_master WHERE type='table'") elif not typeName or typeName == "Views": t.exec_("SELECT name FROM sqlite_master WHERE type='view'") while t.next(): tl.append(str(t.value(0))) if not typeName or typeName == "SystemTables": tl.append("sqlite_master") del t return tl
def makeRuleGroup(self, q, d, idgroup): """ Crea varios nodos DOM correspondientes a un registro de la tabla "flacs" y para un grupo de usuarios determinado. La función de este método es crear una regla para cada uno de los usuarios miembros del grupo, utilizando FLAccessControlLists::makeRuleUser. @param q Consulta sobre la tabla "flacs" posicionada en el registro a utilizar para construir las reglas. @param d Documento DOM/XML en el que insertarán los nodos que describe las reglas de control de acceso. @param idgroup Identificador del grupo de usuarios. """ if not idgroup or not q or not d: return qU = FLSqlQuery() qU.setTablesList("flusers") qU.setSelect("iduser") qU.setFrom("flusers") qU.setWhere("'idgroup='%s'" % idgroup) qU.setForwardOnly(True) if qU.exec_(): while qU.next(): self.makeRuleUser(q, d, str(qU.value(0)))
def quickSqlSelect(self, f, s, w, connName="default"): from pineboolib.fllegacy.FLSqlConnections import FLSqlConnections if not w: sql = "select " + s + " from " + f else: sql = "select " + s + " from " + f + " where " + w q = FLSqlQuery(sql, FLSqlConnections().database(connName).db()) return q.value(0) if q.next() else False
def init(self): self.initCount_ = self.initCount_ + 1 tmpTMD = self.createSystemTable("flmetadata") tmpTMD = self.createSystemTable("flseqs") if not self.db_.dbAux(): return q = FLSqlQuery(None, self.db_.dbAux()) q.setForwardOnly(True) tmpTMD = self.createSystemTable("flsettings") if not q.exec_("SELECT * FROM flsettings WHERE flkey = 'sysmodver'"): q.exec_("DROP TABLE flsettings CASCADE") tmpTMD = self.createSystemTable("flsettings") if not self.dictKeyMetaData_: self.dictKeyMetaData_ = {} #self.dictKeyMetaData_.setAutoDelete(True) else: self.dictKeyMetaData_.clear() q.exec_("SELECT tabla,xml FROM flmetadata") while q.next(): self.dictKeyMetaData_.insert(q.value(0), q.value(1)) q.exec_("SELECT * FROM flsettings WHERE flkey = 'sysmodver'") if not q.next(): q.exec_("DROP TABLE flmetadata CASCADE") tmpTMD = self.createSystemTable("flmetadata") c = FLSqlCursor("flmetadata", True, self.db_.dbAux()) for key, value in self.dictKeyMetaData_: buffer = c.primeInsert() buffer.setValue("tabla", key) buffer.setValue("xml", value) c.insert() if not self.cacheMetaData_: self.cacheMetaData_ = [] if not self.cacheAction_: self.cacheAction_ = [] if not self.cacheMetaDataSys_: self.cacheMetaDataSys_ = []
def validateForm(self): if not self.cursor_: return True mtd = self.cursor_.metadata() if not mtd: return True if self.cursor_.modeAccess() == FLSqlCursor.Edit and mtd.concurWarn(): colFields = [] colFields = self.cursor_.concurrencyFields() if colFields: pKN = mtd.primaryKey() pKWhere = self.cursor_.db().manager().formatAssignValue( mtd.field(pKN), self.cursor_.valueBuffer(pKN)) q = FLSqlQuery(None, self.cursor_.db().connectionName()) q.setTablesList(mtd.name()) q.setSelect(colFields) q.setFrom(mtd.name()) q.setWhere(pKWhere) q.setForwardOnly(True) if q.exec_() and q.next(): i = 0 for field in colFields: # msg = "El campo '%s' con valor '%s' ha sido modificado\npor otro usuario con el valor '%s'" % ( # mtd.fieldNameToAlias(field), self.cursor_.valueBuffer(field), q.value(i)) res = QtWidgets.QMessageBox.warning( QtWidgets.QApplication.focusWidget(), "Aviso de concurrencia", "\n\n ¿ Desea realmente modificar este campo ?\n\n" "Sí : Ignora el cambio del otro usuario y utiliza el valor que acaba de introducir\n" "No : Respeta el cambio del otro usuario e ignora el valor que ha introducido\n" "Cancelar : Cancela el guardado del registro y vuelve a la edición del registro\n\n", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.Default, QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.Cancel | QtWidgets.QMessageBox.Escape) if res == QtWidgets.QMessageBox.Cancel: return False if res == QtWidgets.QMessageBox.No: self.cursor_.setValueBuffer(field, q.value(i)) if self.iface and self.cursor_.modeAccess( ) == FLSqlCursor.Insert or self.cursor_.modeAccess( ) == FLSqlCursor.Edit: if self.iface: try: v = self.iface.validateForm() except Exception: pass if v and not isinstance(v, bool): return False return True
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 loadIdAreas(self): if not self._prj.conn.dbAux(): return self.listIdAreas_ = [] q = FLSqlQuery(None, self._prj.conn.dbAux()) # q.setForwardOnly(True) q.exec_("SELECT idarea from flareas WHERE idarea <> 'sys'") while q.next(): self.listIdAreas_.append(str(q.value(0))) self.listIdAreas_.append("sys")
def loadKeyFiles(self): self.dictKeyFiles = {} self.dictModFiles = {} q = FLSqlQuery(None, pineboolib.project.conn.dbAux()) # q.setForwardOnly(True) q.exec_("SELECT nombre, sha, idmodulo FROM flfiles") name = None while q.next(): name = str(q.value(0)) self.dictKeyFiles[name] = str(q.value(1)) self.dictModFiles[name.upper()] = str(q.value(2))
def existsTable(self, name): if not self.isOpen(): return False t = FLSqlQuery() t.setForwardOnly(True) ok = t.exec_("SELECT * FROM %s WHERE 1 = 1 LIMIT 1" % name) if ok: ok = t.next() del t return ok
def loadKeyFiles(self): self.dictKeyFiles = {} self.dictModFiles = {} q = FLSqlQuery(None, self._prj.conn.dbAux()) # q.setForwardOnly(True) q.exec_("SELECT nombre, sha, idmodulo FROM flfiles") name = None while q.next(): name = str(q.value(0)) self.dictKeyFiles[name] = str(q.value(1)) self.dictModFiles[name.upper()] = str(q.value(2))
def loadIdAreas(self): if not pineboolib.project.conn.dbAux(): return self.listIdAreas_ = [] q = FLSqlQuery(None, pineboolib.project.conn.dbAux()) # q.setForwardOnly(True) q.exec_("SELECT idarea from flareas WHERE idarea <> 'sys'") while q.next(): self.listIdAreas_.append(str(q.value(0))) if not "sys" in self.listIdAreas_: self.listIdAreas_.append("sys")
def shaOfFile(self, n): if pineboolib.project.conn.dbAux() and not n[:3] == "sys" and not pineboolib.project.conn.manager().isSystemTable(n): formatVal = pineboolib.project.conn.manager( ).formatAssignValue("nombre", "string", n, True) q = FLSqlQuery(None, pineboolib.project.conn.dbAux()) # q.setForwardOnly(True) q.exec_("SELECT sha FROM flfiles WHERE %s" % formatVal) if q.next(): return str(q.value(0)) return None else: return None
def existsTable(self, name): if not self.isOpen(): return False t = FLSqlQuery() t.setForwardOnly(True) ok = t.exec_("select relname from pg_class where relname = '%s'" % name) if ok: ok = t.next() del t return ok
def existsTable(self, name): if not self.isOpen(): return False t = FLSqlQuery() t.setForwardOnly(True) ok = t.exec_( "select relname from pg_class where relname = '%s'" % name) if ok: ok = t.next() del t return ok
def makeRuleGroup(self, q, d, idgroup): if not idgroup or not q or not d: return qU = FLSqlQuery() qU.setTablesList("flusers") qU.setSelect("iduser") qU.setFrom("flusers") qU.setWhere("'idgroup='%s'" % idgroup) qU.setForwardOnly(True) if qU.exec_(): while qU.next(): self.makeRuleUser(q, d, str(qU.value(0)))
def shaOfFile(self, n): if self._prj.conn.dbAux( ) and not n[:3] == "sys" and not self._prj.conn.manager( ).isSystemTable(n): formatVal = self._prj.conn.manager().formatAssignValue( "nombre", "string", n, True) q = FLSqlQuery(None, self._prj.conn.dbAux()) # q.setForwardOnly(True) q.exec_("SELECT sha FROM flfiles WHERE %s" % formatVal) if q.next(): return str(q.value(0)) return None else: return None
def loadAllIdModules(self): if not pineboolib.project.conn.dbAux(): return self.listAllIdModules_ = [] self.listAllIdModules_.append("sys") self.dictInfoMods = {} q = FLSqlQuery(None, pineboolib.project.conn.dbAux()) q.setTablesList("flmodules,flareas") q.setSelect("idmodulo,flmodules.idarea,flmodules.descripcion,version,icono,flareas.descripcion") q.setFrom("flmodules left join flareas on flmodules.idarea = flareas.idarea") q.setWhere("1 = 1") q.setForwardOnly(True) q.exec_() # q.exec_("SELECT idmodulo,flmodules.idarea,flmodules.descripcion,version,icono,flareas.descripcion " # "FROM flmodules left join flareas on flmodules.idarea = flareas.idarea") sysModuleFound = False while q.next(): infoMod = FLInfoMod() infoMod.idModulo = str(q.value(0)) infoMod.idArea = str(q.value(1)) infoMod.descripcion = str(q.value(2)) infoMod.version = str(q.value(3)) infoMod.icono = str(q.value(4)) infoMod.areaDescripcion = str(q.value(5)) self.dictInfoMods[infoMod.idModulo.upper()] = infoMod if not infoMod.idModulo == "sys": self.listAllIdModules_.append(infoMod.idModulo) else: sysModuleFound = True if not sysModuleFound: infoMod = FLInfoMod() infoMod.idModulo = "sys" infoMod.idArea = "sys" infoMod.descripcion = "Administracion" infoMod.version = "0.0" infoMod.icono = self.contentFS( "%s/%s" % (filedir("../share/pineboo"), "/sys.xpm")) infoMod.areaDescripcion = "Sistema" self.dictInfoMods[infoMod.idModulo.upper()] = infoMod
def sqlSelect(self, f, s, w, tL=None, size=0, connName="default"): q = FLSqlQuery(None, connName) if tL: q.setTablesList(tL) else: q.setTablesList(f) q.setSelect(s) q.setFrom(f) q.setWhere(w) q.setForwardOnly(True) if not q.exec(): return False if q.next(): return q.value(0) if size: return False
def validateForm(self): if not self.cursor_: return True mtd = self.cursor_.metadata() if not mtd: return True if self.cursor_.modeAccess() == FLSqlCursor.Edit and mtd.concurWarn(): colFields = [] colFields = self.cursor_.concurrencyFields() if colFields: pKN = mtd.primaryKey() pKWhere = self.cursor_.db().manager().formatAssignValue(mtd.field(pKN), self.cursor_.valueBuffer(pKN)) q = FLSqlQuery(None, self.cursor_.db().connectionName()) q.setTablesList(mtd.name()) q.setSelect(colFields) q.setFrom(mtd.name()) q.setWhere(pKWhere) q.setForwardOnly(True) if q.exec_() and q.next(): i = 0 for field in colFields: msg = "El campo '%s' con valor '%s' ha sido modificado\npor otro usuario con el valor '%s'" % (mtd.fieldNameToAlias(field), self.cursor_.valueBuffer(field), q.value(i)) res = QtGui.QMessageBox.warning(QtGui.qApp.focusWidget(), "Aviso de concurrencia", "\n\n ¿ Desea realmente modificar este campo ?\n\nSí : Ignora el cambio del otro usuario y utiliza el valor que acaba de introducir\nNo : Respeta el cambio del otro usuario e ignora el valor que ha introducido\nCancelar : Cancela el guardado del registro y vuelve a la edición del registro\n\n", QtGui.QMessageBox.Yes | QtGui.QMessageBox.Default, QtGui.QMessageBox.No, QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Escape) if res == QtGui.QMessageBox.Cancel: return False if res == QtGui.QMessageBox.No: self.cursor_.setValueBuffer(field, q.value(i)) if self.iface and self.cursor_.modeAccess() == FLSqlCursor.Insert or self.cursor_.modeAccess() == FLSqlCursor.Edit: if self.iface: try: v = self.iface.validateForm() except Exception: pass if v and not isinstance(v, bool): return False return True
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 loadAllIdModules(self): if not self._prj.conn.dbAux(): return self.listAllIdModules_ = [] self.listAllIdModules_.append("sys") self.dictInfoMods = {} q = FLSqlQuery(None, self._prj.conn.dbAux()) # q.setForwardOnly(True) q.exec_( "SELECT idmodulo,flmodules.idarea,flmodules.descripcion,version,icono,flareas.descripcion " "FROM flmodules left join flareas on flmodules.idarea = flareas.idarea" ) sysModuleFound = False while q.next(): infoMod = FLInfoMod() infoMod.idModulo = str(q.value(0)) infoMod.idArea = str(q.value(1)) infoMod.descripcion = str(q.value(2)) infoMod.version = str(q.value(3)) infoMod.icono = str(q.value(4)) infoMod.areaDescripcion = str(q.value(5)) self.dictInfoMods[infoMod.idModulo.upper()] = infoMod if not infoMod.idModulo == "sys": self.listAllIdModules_.append(infoMod.idModulo) else: sysModuleFound = True if not sysModuleFound: infoMod = FLInfoMod() infoMod.idModulo = "sys" infoMod.idArea = "sys" infoMod.descripcion = "Administracion" infoMod.version = "0.0" infoMod.icono = self.contentFS( "%s/%s" % (filedir("../share/pineboo"), "/sys.xpm")) infoMod.areaDescripcion = "Sistema" self.dictInfoMods[infoMod.idModulo.upper()] = infoMod
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 parseKey(name=None): ret = None value = None if name is None: ret = None else: q = FLSqlQuery() # q.setForwardOnly(True) q.exec_("SELECT contenido FROM fllarge WHERE refkey='%s'" % name) if q.next(): value = clearXPM(q.value(0)) imgFile = filedir("../tempdata") imgFile += "/%s.png" % name if not os.path.exists(imgFile) and value: pix = QPixmap(value) if not pix.save(imgFile): self.logger.warn("rml:refkey2cache No se ha podido guardar la imagen %s" % imgFile) ret = None ret = imgFile return ret
def tables(self, typeName=None): tl = [] if not self.isOpen(): return tl t = FLSqlQuery() t.setForwardOnly(True) if typeName == "Tables" and typeName == "Views": t.exec_( "SELECT name FROM sqlite_master WHERE type='table' OR type='view'") elif not typeName or typeName == "Tables": t.exec_("SELECT name FROM sqlite_master WHERE type='table'") elif not typeName or typeName == "Views": t.exec_("SELECT name FROM sqlite_master WHERE type='view'") while t.next(): tl.append(str(t.value(0))) if not typeName or typeName == "SystemTables": tl.append("sqlite_master") del t return tl
def sqlSelect(self, f, s, w, tL=None, size=0, connName="default"): """ Ejecuta una query de tipo select, devolviendo los resultados del primer registro encontrado @param f: Sentencia from de la query @param s: Sentencia select de la query, que será el nombre del campo a devolver @param w: Sentencia where de la query @param tL: Sentencia tableslist de la query. Necesario cuando en la sentencia from se incluya más de una tabla @param size: Número de líneas encontradas. (-1 si hay error) @param connName Nombre de la conexion @return Valor resultante de la query o falso si no encuentra nada. """ if w is None or w == "": return False q = FLSqlQuery(None, connName) if tL: q.setTablesList(tL) else: q.setTablesList(f) q.setSelect(s) q.setFrom(f) q.setWhere(w) # q.setForwardOnly(True) if not q.exec_(): return False if q.next(): valor = q.value(0) if isinstance(valor, datetime.date): valor = str(valor) return valor if size: return False
def makeRuleUser(self, q, d, iduser): """ Crea un nodo DOM correspondiente a un registro de la tabla "flacs" y para un usuario determinado. @param q Consulta sobre la tabla "flacs" posicionada en el registro a utilizar para construir la regla. @param d Documento DOM/XML en el que insertará el nodo que describe la regla de control de acceso. @param iduser Identificador del usuario utilizado en la regla de control de acceso. """ if not iduser or not q or not d: return ac = FLAccessControlFactory.create(str(q.value(1))) if ac: ac.setName(str(q.value(2))) ac.setUser(iduser) ac.setPerm(str(q.value(6))) qAcos = FLSqlQuery() qAcos.setTablesList("flacos") qAcos.setSelect("nombre,permiso") qAcos.setFrom("flacos") qAcos.setWhere("idac ='%s'" % q.value(0)) qAcos.setForwardOnly() acos = None if qAcos.exec_(): while qAcos.next(): acos << str(qAcos.value(0)) acos << str(qAcos.value(1)) ac.setAcos(acos) ac.get(d) del ac
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 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 nextCounter(self, *args, **kwargs): if len(args) == 2: name = args[0] cursor_ = args[1] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not not type_ == "double": return None _len = field.length() cadena = None q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(name) q.setFrom(tMD.name()) q.setWhere("LENGTH(%s)=%d" % (name, _len)) q.setOrderBy(name + " DESC") if not q.exec(): return None maxRange = 10**_len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string": cadena = str(numero) if len(cadena) < _len: relleno = None relleno = cadena.rjust(_len - len(cadena), '0') cadena = str + cadena return cadena if type_ == "double": return numero return None else: serie = args[0] name = args[1] cursor_ = args[2] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not type_ == "double": return None _len = field.length() - len(serie) cadena = None where = "length(%s)=%d AND substring(%s FROM 1 for %d) = '%s'" % ( name, field.length(), name, len(serie), serie) select = "substring(%s FROM %d) as %s" % (name, len(serie) + 1, name) q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(select) q.setFrom(tMD.name()) q.setWhere(where) q.setOrderBy(name + " DESC") if not q.exec(): return None maxRange = 10**_len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string" or type_ == "double": cadena = numero if len(cadena) < _len: relleno = cadena.rjust(_len - len(cadena), '0') cadena = relleno + cadena #res = serie + cadena return cadena return None
def nextCounter(self, *args, **kwargs): if len(args) == 2: name = args[0] cursor_ = args[1] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not not type_ == "double": return None _len = field.length() cadena = None q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(name) q.setFrom(tMD.name()) q.setWhere("LENGTH(%s)=%d" % (name, _len)) q.setOrderBy(name + " DESC") if not q.exec(): return None maxRange = 10 ** _len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string": cadena = str(numero) if len(cadena) < _len: relleno = None relleno = cadena.rjust(_len - len(cadena), '0') cadena = str + cadena return cadena if type_ == "double": return numero return None else: serie = args[0] name = args[1] cursor_ = args[2] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not type_ == "double": return None _len = field.length() - len(serie) cadena = None where = "length(%s)=%d AND substring(%s FROM 1 for %d) = '%s'" % (name, field.length(), name, len(serie), serie) select = "substring(%s FROM %d) as %s" % (name, len(serie) + 1, name) q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(select) q.setFrom(tMD.name()) q.setWhere(where) q.setOrderBy(name + " DESC") if not q.exec(): return None maxRange = 10 ** _len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string" or type_ == "double": cadena = numero if len(cadena) < _len: relleno = cadena.rjust(_len - len(cadena), '0') cadena = relleno + cadena #res = serie + cadena return cadena return None
def nextCounter(self, *args, **kwargs): """ Este metodo devuelve el siguiente valor de un campo tipo contador de una tabla. Este metodo es muy util cuando se insertan registros en los que la referencia es secuencial y no nos acordamos de cual fue el ultimo numero usado. El valor devuelto es un QVariant del tipo de campo es el que se busca la ultima referencia. Lo más aconsejable es que el tipo del campo sea 'String' porque así se le puede dar formato y ser usado para generar un código de barras. De todas formas la función soporta tanto que el campo sea de tipo 'String' como de tipo 'double'. @param name Nombre del campo @param cursor_ Cursor a la tabla donde se encuentra el campo. @return Qvariant con el numero siguiente. @author Andrés Otón Urbano. """ """ dpinelo: Este método es una extensión de nextCounter pero permitiendo la introducción de una primera secuencia de caracteres. Es útil cuando queremos mantener diversos contadores dentro de una misma tabla. Ejemplo, Tabla Grupo de clientes: Agregamos un campo prefijo, que será una letra: A, B, C, D. Queremos que la numeración de los clientes sea del tipo A00001, o B000023. Con esta función, podremos seguir usando los métodos counter cuando agregamos esa letra. Este metodo devuelve el siguiente valor de un campo tipo contador de una tabla para una serie determinada. Este metodo es muy util cuando se insertan registros en los que la referencia es secuencial según una secuencia y no nos acordamos de cual fue el último numero usado. El valor devuelto es un QVariant del tipo de campo es el que se busca la ultima referencia. Lo más aconsejable es que el tipo del campo sea 'String' porque así se le puede dar formato y ser usado para generar un código de barras. De todas formas la función soporta tanto que el campo sea de tipo 'String' como de tipo 'double'. @param serie serie que diferencia los contadores @param name Nombre del campo @param cursor_ Cursor a la tabla donde se encuentra el campo. @return Qvariant con el numero siguiente. @author Andrés Otón Urbano. """ if len(args) == 2: name = args[0] cursor_ = args[1] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not not type_ == "double": return None _len = int(field.length()) cadena = None q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(name) q.setFrom(tMD.name()) q.setWhere("LENGTH(%s)=%s" % (name, _len)) q.setOrderBy(name + " DESC") if not q.exec_(): return None maxRange = 10 ** _len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = int(q.value(0)) numero = numero + 1 if type_ == "string": cadena = str(numero) if len(cadena) < _len: relleno = None relleno = cadena.rjust(_len, '0') cadena = relleno return cadena if type_ == "double": return numero return None else: serie = args[0] name = args[1] cursor_ = args[2] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not type_ == "double": return None _len = field.length() - len(serie) cadena = None where = "length(%s)=%d AND substring(%s FROM 1 for %d) = '%s'" % ( name, field.length(), name, len(serie), serie) select = "substring(%s FROM %d) as %s" % ( name, len(serie) + 1, name) q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(select) q.setFrom(tMD.name()) q.setWhere(where) q.setOrderBy(name + " DESC") if not q.exec_(): return None maxRange = 10 ** _len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string" or type_ == "double": cadena = numero if len(cadena) < _len: relleno = cadena.rjust(_len - len(cadena), '0') cadena = relleno + cadena # res = serie + cadena return cadena return None
def sqlCreateTable(self, tmd): util = FLUtil() if not tmd: return None primaryKey = None sql = "CREATE TABLE %s (" % tmd.name() seq = None fieldList = tmd.fieldList() unlocks = 0 for field in fieldList: if field.type() == "unlock": unlocks = unlocks + 1 if unlocks > 1: qWarning(u"FLManager : No se ha podido crear la tabla " + tmd.name()) qWarning( u"FLManager : Hay mas de un campo tipo unlock. Solo puede haber uno." ) return None i = 1 for field in fieldList: sql = sql + field.name() if field.type() == "int": sql = sql + " INT2" elif field.type() == "uint": sql = sql + " INT4" elif field.type() in ("bool", "unlock"): sql = sql + " BOOLEAN" elif field.type() == "double": sql = sql + " FLOAT8" elif field.type() == "time": sql = sql + " TIME" elif field.type() == "date": sql = sql + " DATE" elif field.type() == "pixmap": sql = sql + " TEXT" elif field.type() == "string": sql = sql + " VARCHAR" elif field.type() == "stringlist": sql = sql + " TEXT" elif field.type() == "bytearray": sql = sql + " BYTEA" elif field.type() == "serial": seq = "%s_%s_seq" % (tmd.name(), field.name()) q = FLSqlQuery() q.setForwardOnly(True) q.exec_("SELECT relname FROM pg_class WHERE relname='%s'" % seq) if not q.next(): q.exec_("CREATE SEQUENCE %s" % seq) sql = sql + " INT4 DEFAULT NEXTVAL('%s')" % seq del q longitud = field.length() if longitud > 0: sql = sql + "(%s)" % longitud if field.isPrimaryKey(): if primaryKey == None: sql = sql + " PRIMARY KEY" else: qWarning( QApplication.tr("FLManager : Tabla-> ") + tmd.name() + QApplication. tr(" . Se ha intentado poner una segunda clave primaria para el campo " ) + field.name() + QApplication.tr(" , pero el campo ") + primaryKey + QApplication. tr(" ya es clave primaria. Sólo puede existir una clave primaria en FLTableMetaData, use FLCompoundKey para crear claves compuestas." )) return None else: if field.isUnique(): sql = sql + " UNIQUE" if not field.allowNull(): sql = sql + " NOT NULL" else: sql = sql + " NULL" if not i == len(fieldList): sql = sql + "," i = i + 1 sql = sql + ")" return sql
def sqlCreateTable(self, tmd): # util = FLUtil() if not tmd: return None primaryKey = None sql = "CREATE TABLE %s (" % tmd.name() seq = None fieldList = tmd.fieldList() unlocks = 0 for field in fieldList: if field.type() == "unlock": unlocks = unlocks + 1 if unlocks > 1: qWarning(u"FLManager : No se ha podido crear la tabla " + tmd.name()) qWarning( u"FLManager : Hay mas de un campo tipo unlock. Solo puede haber uno.") return None i = 1 for field in fieldList: sql = sql + field.name() if field.type() == "int": sql = sql + " INT2" elif field.type() == "uint": sql = sql + " INT4" elif field.type() in ("bool", "unlock"): sql = sql + " BOOLEAN" elif field.type() == "double": sql = sql + " FLOAT8" elif field.type() == "time": sql = sql + " TIME" elif field.type() == "date": sql = sql + " DATE" elif field.type() == "pixmap": sql = sql + " TEXT" elif field.type() == "string": sql = sql + " VARCHAR" elif field.type() == "stringlist": sql = sql + " TEXT" elif field.type() == "bytearray": sql = sql + " BYTEA" elif field.type() == "serial": seq = "%s_%s_seq" % (tmd.name(), field.name()) q = FLSqlQuery() q.setForwardOnly(True) q.exec_("SELECT relname FROM pg_class WHERE relname='%s'" % seq) if not q.next(): q.exec_("CREATE SEQUENCE %s" % seq) sql = sql + " INT4 DEFAULT NEXTVAL('%s')" % seq del q longitud = field.length() if longitud > 0: sql = sql + "(%s)" % longitud if field.isPrimaryKey(): if primaryKey is None: sql = sql + " PRIMARY KEY" else: qWarning(QApplication.tr("FLManager : Tabla-> ") + tmd.name() + QApplication.tr(" . Se ha intentado poner una segunda clave primaria para el campo ") + field.name() + QApplication.tr(" , pero el campo ") + primaryKey + QApplication.tr(" ya es clave primaria. Sólo puede existir una clave primaria en FLTableMetaData," " use FLCompoundKey para crear claves compuestas.")) return None else: if field.isUnique(): sql = sql + " UNIQUE" if not field.allowNull(): sql = sql + " NOT NULL" else: sql = sql + " NULL" if not i == len(fieldList): sql = sql + "," i = i + 1 sql = sql + ")" return sql
def nextCounter(self, *args, **kwargs): """ Este metodo devuelve el siguiente valor de un campo tipo contador de una tabla. Este metodo es muy util cuando se insertan registros en los que la referencia es secuencial y no nos acordamos de cual fue el ultimo numero usado. El valor devuelto es un QVariant del tipo de campo es el que se busca la ultima referencia. Lo más aconsejable es que el tipo del campo sea 'String' porque así se le puede dar formato y ser usado para generar un código de barras. De todas formas la función soporta tanto que el campo sea de tipo 'String' como de tipo 'double'. @param name Nombre del campo @param cursor_ Cursor a la tabla donde se encuentra el campo. @return Qvariant con el numero siguiente. @author Andrés Otón Urbano. """ """ dpinelo: Este método es una extensión de nextCounter pero permitiendo la introducción de una primera secuencia de caracteres. Es útil cuando queremos mantener diversos contadores dentro de una misma tabla. Ejemplo, Tabla Grupo de clientes: Agregamos un campo prefijo, que será una letra: A, B, C, D. Queremos que la numeración de los clientes sea del tipo A00001, o B000023. Con esta función, podremos seguir usando los métodos counter cuando agregamos esa letra. Este metodo devuelve el siguiente valor de un campo tipo contador de una tabla para una serie determinada. Este metodo es muy util cuando se insertan registros en los que la referencia es secuencial según una secuencia y no nos acordamos de cual fue el último numero usado. El valor devuelto es un QVariant del tipo de campo es el que se busca la ultima referencia. Lo más aconsejable es que el tipo del campo sea 'String' porque así se le puede dar formato y ser usado para generar un código de barras. De todas formas la función soporta tanto que el campo sea de tipo 'String' como de tipo 'double'. @param serie serie que diferencia los contadores @param name Nombre del campo @param cursor_ Cursor a la tabla donde se encuentra el campo. @return Qvariant con el numero siguiente. @author Andrés Otón Urbano. """ if len(args) == 2: name = args[0] cursor_ = args[1] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not not type_ == "double": return None _len = int(field.length()) cadena = None q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(name) q.setFrom(tMD.name()) q.setWhere("LENGTH(%s)=%s" % (name, _len)) q.setOrderBy(name + " DESC") if not q.exec_(): return None maxRange = 10**_len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = int(q.value(0)) numero = numero + 1 if type_ == "string": cadena = str(numero) if len(cadena) < _len: relleno = None relleno = cadena.rjust(_len, '0') cadena = relleno return cadena if type_ == "double": return numero return None else: serie = args[0] name = args[1] cursor_ = args[2] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not type_ == "double": return None _len = field.length() - len(serie) cadena = None where = "length(%s)=%d AND substring(%s FROM 1 for %d) = '%s'" % ( name, field.length(), name, len(serie), serie) select = "substring(%s FROM %d) as %s" % (name, len(serie) + 1, name) q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(select) q.setFrom(tMD.name()) q.setWhere(where) q.setOrderBy(name + " DESC") if not q.exec_(): return None maxRange = 10**_len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string" or type_ == "double": cadena = numero if len(cadena) < _len: relleno = cadena.rjust(_len - len(cadena), '0') cadena = relleno + cadena # res = serie + cadena return cadena return None