#950 closed enhancement (fixed)
Ois.UseCache
| Reported by: | Javier Portugal | Owned by: | Víctor de Buen Remiro |
|---|---|---|---|
| Priority: | normal | Milestone: | Mantainance |
| Component: | OIS | Version: | 2.0.1 |
| Severity: | major | Keywords: | |
| Cc: |
Description (last modified by )
Intenté hacer una función para no usar Ois.UseModule cuando lo que se pretende es generar como caché el contenido final de un archivo en el que se efectúan acciones no declarativas
// Variable global
Real Alg.SPFRes.LoadFromOza = 1;
//////////////////////////////////////////////////////////////////////////////
Set Ois.UseCache(Text fileTOL, Text fileOza)
//////////////////////////////////////////////////////////////////////////////
{
Set If( And( Alg.SPFRes.LoadFromOza, FileExist(fileOza) ),
Set Ois.Load(fullFileOza)[1],
{
Real Ois.Store(Include(fileTOL), fileOza);
Set Ois.Load(fileOza)[1]
}
)
};
El problema es que al cargar desde el oza las funciones y objetos no son globales como si se hubiese cargado con Include u Ois.UseModule
Attachments (2)
Change History (8)
comment:1 Changed 15 years ago by
| Description: | modified (diff) |
|---|---|
| Milestone: | → Mantainance |
| Status: | new → accepted |
| Version: | → 2.0.1 |
comment:3 Changed 15 years ago by
| Resolution: | → fixed |
|---|---|
| Status: | accepted → closed |
Set Ois.UseCache(Text tolPath, Real caducityInMinutes)
Carga un archivo de caché OIS precompilado que almacena todos los objetos de un fichero TOL que será compilado sólo si no existe, está caducado u obsoleto, o si el argumento <caducityInMinutes> es no positivo o desconocido.
Se considera que la caché está obsoleta si su fecha es anterior a la del archivo fuente.
No se tendrá en cuenta si el archivo fuente ha cambiado o no en realidad, sino que se comprobará únicamente su fecha.
Si el archivo fuente depende de otros, éstos no serán tenidos en cuenta a efectos de comprobar si la caché está obsoleta.
Se considera que la caché está caducada si han transcurrido más de <caducityInMinutes> minutos desde su creación.
La imagen OIS se generará la imagen OIS dentro del directorio especificado en la variable global Text Ois.DefRoot.
comment:4 Changed 15 years ago by
| Resolution: | fixed |
|---|---|
| Status: | closed → reopened |
Parece que no funciona correctamente. Te paso dos archivo de prueba:
Si pones ambos archivos en el mismo directorio y compilas prueba1.tol,
la primera vez crea el cache y funciona correctamente, pero si después
de creado, lo compilas ya no reconoce el contenido interno:
OIS: Cargando la caché de prueba.tol ...
- Warning: [281] La función
- ha fallado en : prueba::nom
Changed 15 years ago by
| Attachment: | prueba.tol added |
|---|
Changed 15 years ago by
| Attachment: | prueba1.tol added |
|---|
comment:5 Changed 15 years ago by
| Resolution: | → fixed |
|---|---|
| Status: | reopened → closed |

Yo creo que hay que pensarse un poco mejor el objetivo y la API correspondiente para eliminar la variable global y luego implementarla en C++, pues es la forma más sencilla de que devuelva objetos globales.
Por ejemplo, lo que has propuesto antes se podría hacer sin variables globales con una función built-in con un argumento opcional con valor por defecto 1, lo cual fuerza a usar el .oza si existe
Sin embargo, yo creo que es más práctico que el argumento opcional sea un indicador de caducidad pues aporta mayor flexibilidad.
Si no existe la cache se construye automáticamente sin más contemplaciones. Internamente la función calculará la edad relativa actual como la resta entre la fecha de la caché .oza y el archivo .tol original. Para asegurar la integridad referencial, la caché también deberá ser reconstruida siempre que el fichero original haya sido actualizado dejando obsoleta la caché, o sea, si su edad relativa es negativa. Por lo tanto, no se debe tocar el .tol salvo que realmente se quiera modificar su contenido. Si se altera por error siempre es posible modificar la fecha del archivo .oza mediante el comando touch del sistema operativo para que la edad relativa sea positiva, pero la norma debe ser dejar congelado el archivo de origen. Si la caché está obsoleta la borrará por lo que se tratará como si no hubiese sido creada nunca, es decir se reconstruirá y se recalculará su edad relativa, así que podemos descartar en lo que resta el caso de edad relativa negativa.
Si se le pasa como argumento opcional una caducidad positiva, entonces comprueba si la caché existe; y sólo la reconstruye si ha caducado, es decir, si la edad relativa es positiva y mayor que la caducidad propuesta. El valor por defecto de caducidad infinita indica que el .oza no caduca nunca. Si se le pasa una caducidad nula, negativa o desconocida, se fuerza la reconstrucción de la caché tanto si existía como si no y fuera o no obsoleta. Todo esto permite mucho más control por parte del usuario que un simple flag booleano al mismo tiempo que se asegura la integridad referencial de una forma completamente natural.
Ejemplos:
//Camino general a los archivos .tol de origen Text tolPath = "./"; //Camino general a los archivos .oza de cache Text tolPath = Ois.DefRoot+"cache/MyProject/"; Text prefix = "archiveName"; Text fileTol = tolPath + prefix + ".tol"; Text fileOza = cachePath + prefix + ".tol"; //Fuerza la reconstrucción de la caché en cualquiera de estos casos Set Ois.UseCache(fileTol, fileOza, 0); Set Ois.UseCache(fileTol, fileOza, -1); Set Ois.UseCache(fileTol, fileOza, -1/0); Set Ois.UseCache(fileTol, fileOza, ?); //No caduca nunca, sólo se construye si no existe o está obsoleta Set Ois.UseCache(fileTol, fileOza, 1/0); //Caduca a los 7 días Set Ois.UseCache(fileTol, fileOza, 60*24*7); //Caduca a las 2 horas Set Ois.UseCache(fileTol, fileOza, 60*2); //Fuerza la reconstrucción de la caché sólo si una variable //booleana de usuario es cero Set Ois.UseCache(fileTol, fileOza, If(Alg.SPFRes.LoadFromOza,1/0,0)); //Fuerza la reconstrucción de la caché la primera vez que se //ejecuta durante el día de cada primer viernes de mes Set Ois.UseCache(fileTol, fileOza, { TimeSet firstFridayOfMonth = Succ(Succ(D(1),-1,WD(5)),+1,WD(5)); Real isFirstFridayOfMonth = Belong(Today,firstFridayOfMonth); Real caducityInMinutes = If(isFirstFridayOfMonth,60*24,60*24*31) }); //Para casos complejos se puede construir uno su propia casuística //de reconstrucción usando Case Set Ois.UseCache(fileTol, fileOza, Case(...));