def fetchLargeValue(self, refKey): """ Obtiene el valor de gran tamaño segun su clave de referencia. @param refKey Clave de referencia. Esta clave se suele obtener mediante FLManager::storeLargeValue @return Valor de gran tamaño almacenado """ if refKey is None: return None if not refKey[0:3] == "RK@": return None q = FLSqlQuery() q.setSelect("contenido") q.setFrom("fllarge") q.setWhere(" refkey = '%s'" % refKey) if q.exec_() and q.first(): v = q.value(0) del q # print(v) if v.find("{"): v = v[v.find("{") + 3:] v = v[:v.find("};") + 1] # v = v.replace("\t", "") v = v.replace("\n", "") # v = v.replace("\",", ",") # v = v.replace(",\"", ",") v = v.replace("\t", " ") # v = v.replace("\n\"", "") # v = v.split(",") v = v.split('","') # print(v) return v
def fetchLargeValue(self, refKey): """ Obtiene el valor de gran tamaño segun su clave de referencia. @param refKey Clave de referencia. Esta clave se suele obtener mediante FLManager::storeLargeValue @return Valor de gran tamaño almacenado """ if refKey is None: return None if not refKey[0:3] == "RK@": return None if self._prj.singleFLLarge(): tableName = "fllarge" else: tableName = "fllarge_" + refKey.split("@")[1] if not self.existsTable(tableName): return None q = FLSqlQuery() q.setSelect("contenido") q.setFrom(tableName) q.setWhere(" refkey = '%s'" % refKey) if q.exec_() and q.first(): v = q.value(0) del q # print(v) v = clearXPM(v) # print(v) return v
def fetchLargeValue(self, refKey): if refKey == None: return None if not refKey[0:3] == "RK@": return None q = FLSqlQuery() q.setSelect("contenido") q.setFrom("fllarge") q.setWhere(" refkey = '%s'" % refKey) if q.exec_() and q.first(): v = q.value(0) del q #print(v) if v.find("{"): v = v[v.find("{") + 3:] v = v[:v.find("};") + 1] #v = v.replace("\t", "") v = v.replace("\n", "") #v = v.replace("\",", ",") #v = v.replace(",\"", ",") v = v.replace("\t", " ") #v = v.replace("\n\"", "") #v = v.split(",") v = v.split('","') #print(v) return v
def readDBSettingEntry(self, key): q = FLSqlQuery() q.setSelect("valor") q.setFrom("flsettings") q.setWhere("flkey = '%s'" % key) q.setTablesList("flsettings") if q.exec() and q.first(): return q.value(0) return None
def storeLargeValue(self, mtd, largeValue): if largeValue[0:3] == "RK@" or not mtd: return None tableName = mtd.name() if self.isSystemTable(tableName): return None tableLarge = None if self._prj.singleFLLarge(): tableLarge = "fllarge" else: tableLarge = "fllarge_%s" % tableName if not self.existsTable(tableLarge): mtdLarge = FLTableMetaData(tableLarge, tableLarge) fieldLarge = FLFieldMetaData("refkey", "refkey", False, True, "string", 100) mtdLarge.addFieldMD(fieldLarge) fieldLarge2 = FLFieldMetaData("sha", "sha", True, False, "string", 50) mtdLarge.addFieldMD(fieldLarge2) fieldLarge3 = FLFieldMetaData("contenido", "contenido", True, False, "stringlist") mtdLarge.addFieldMD(fieldLarge3) mtdAux = self.createTable(mtdLarge) mtd.insertChild(mtdLarge) if not mtdAux: return None util = FLUtil() sha = str(util.sha1(largeValue)) refKey = "RK@%s@%s" % (tableName, sha) q = FLSqlQuery() q.setSelect("refkey") q.setFrom("fllarge") q.setWhere(" refkey = '%s'" % refKey) if q.exec_() and q.first(): if not q.value(0) == sha: sql = "UPDATE %s SET contenido = '%s' WHERE refkey ='%s'" % ( tableLarge, largeValue, refKey) if not util.execSql(sql, "Aux"): print("FLManager::ERROR:StoreLargeValue.Update %s.%s" % (tableLarge, refKey)) return None else: sql = "INSERT INTO %s (contenido,refkey) VALUES ('%s','%s')" % ( tableLarge, largeValue, refKey) if not util.execSql(sql, "Aux"): print("FLManager::ERROR:StoreLargeValue.Insert %s.%s" % (tableLarge, refKey)) return None return refKey
def nextSerialVal(self, table, field): q = FLSqlQuery() q.setSelect(u"nextval('" + table + "_" + field + "_seq')") q.setFrom("") q.setWhere("") if not q.exec(): print("not exec sequence") return None if q.first(): return q.value(0) else: return None
def nextSerialVal(self, table, field): q = FLSqlQuery() q.setSelect("max(%s)" % field) q.setFrom(table) q.setWhere("1 = 1") if not q.exec_(): # FIXME: exec es palabra reservada print("not exec sequence") return None if q.first(): return int(q.value(0)) + 1 else: return None
def nextSerialVal(self, table, field): q = FLSqlQuery() q.setSelect("max(%s)" % field) q.setFrom(table) q.setWhere("1 = 1") if not q.exec_(): # FIXME: exec es palabra reservada self.logger.warn("not exec sequence") return None if q.first() and q.value(0) is not None: return int(q.value(0)) + 1 else: return None
def fetchLargeValue(self, refKey): if not refKey[0:3] == "RK@": return None q = FLSqlQuery() q.setSelect("contenido") q.setFrom("fllarge") q.setWhere(" refkey = '%s'" % refKey) if q.exec_() and q.first(): v = q.value(0) del q return v return None
def quickSqlSelect(self, f, s, w, connName="default"): """ Versión rápida de sqlSelect. Ejecuta directamente la consulta sin realizar comprobaciones. Usar con precaución. """ if not w: sql = "select " + s + " from " + f else: sql = "select " + s + " from " + f + " where " + w q = FLSqlQuery(None, connName) if not q.exec_(sql): return False return q.value(0) if q.first() else False
def readDBSettingEntry(self, key): """ Lee el valor de un setting en la tabla flsettings @param key. Clave identificadora del setting @return Valor del setting """ q = FLSqlQuery() q.setSelect("valor") q.setFrom("flsettings") q.setWhere("flkey = '%s'" % key) q.setTablesList("flsettings") if q.exec_() and q.first(): return q.value(0) return None
def storeLargeValue(self, mtd, largeValue): """ Utilizado para almacenar valores grandes de campos en tablas separadas indexadas por claves SHA del contenido del valor. Se utiliza para optimizar consultas que incluyen campos con valores grandes, como por ejemplo imágenes, para manejar en las consulta SQL la referencia al valor que es de tamaño constante en vez del valor en sí. Esto disminuye el tráfico al reducir considerablemente el tamaño de los registros obtenidos. Las consultas pueden utilizar una referencia y obtener su valor sólo cuando se necesita mediante FLManager::fetchLargeValue(). @param mtd Metadatos de la tabla que contiene el campo @param largeValue Valor de gran tamaño del campo @return Clave de referencia al valor """ if largeValue[0:3] == "RK@" or not mtd: return None tableName = mtd.name() if self.isSystemTable(tableName): return None tableLarge = None if self._prj.singleFLLarge(): tableLarge = "fllarge" else: tableLarge = "fllarge_%s" % tableName if not self.existsTable(tableLarge): mtdLarge = FLTableMetaData(tableLarge, tableLarge) fieldLarge = FLFieldMetaData("refkey", "refkey", False, True, "string", 100) mtdLarge.addFieldMD(fieldLarge) fieldLarge2 = FLFieldMetaData("sha", "sha", True, False, "string", 50) mtdLarge.addFieldMD(fieldLarge2) fieldLarge3 = FLFieldMetaData("contenido", "contenido", True, False, "stringlist") mtdLarge.addFieldMD(fieldLarge3) mtdAux = self.createTable(mtdLarge) mtd.insertChild(mtdLarge) if not mtdAux: return None util = FLUtil() sha = str(util.sha1(largeValue)) refKey = "RK@%s@%s" % (tableName, sha) q = FLSqlQuery() q.setSelect("refkey") q.setFrom("fllarge") q.setWhere(" refkey = '%s'" % refKey) if q.exec_() and q.first(): if not q.value(0) == sha: sql = "UPDATE %s SET contenido = '%s' WHERE refkey ='%s'" % ( tableLarge, largeValue, refKey) if not util.execSql(sql, "Aux"): logger.warn( "FLManager::ERROR:StoreLargeValue.Update %s.%s", tableLarge, refKey) return None else: sql = "INSERT INTO %s (contenido,refkey) VALUES ('%s','%s')" % ( tableLarge, largeValue, refKey) if not util.execSql(sql, "Aux"): logger.warn("FLManager::ERROR:StoreLargeValue.Insert %s.%s", tableLarge, refKey) return None return refKey