def contentStatic(self, n): str_ret = FLStaticLoader.content(n, self.staticBdInfo_) if str_ret: from pineboolib.fllegacy.FLUtil import FLUtil util = FLUtil() sha = util.sha1(str_ret) if n in self.dictKeyFiles.keys(): s = self.dictKeyFiles[n] if self.dictKeyFiles and s == sha: return None elif self.dictKeyFiles and n.find(".qs") > -1: self.dictKeyFiles[n] = sha if n.endswith(".mtd"): from PyQt5.QtXml import QDomDocument doc = QDomDocument(n) if util.domDocumentSetContent(doc, str_ret): mng = self.conn_.manager() docElem = doc.documentElement() mtd = mng.metadata(docElem, True) if not mtd or mtd.isQuery(): return str_ret if not mng.existTable(mtd.name()): mng.createTable(mng) elif (self.conn_.canRegenTables()): self.conn_.regenTable(mtd.name(), mtd) return str_ret
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 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