close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 15 years ago

Closed 15 years ago

Last modified 14 years ago

#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 Víctor de Buen Remiro)

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)

prueba.tol (249 bytes) - added by Javier Portugal 15 years ago.
prueba1.tol (264 bytes) - added by Javier Portugal 15 years ago.

Download all attachments as: .zip

Change History (8)

comment:1 Changed 15 years ago by Víctor de Buen Remiro

Description: modified (diff)
Milestone: Mantainance
Status: newaccepted
Version: 2.0.1

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

Set Ois.UseCache(Text fileTOL, Text fileOza [, Real forceUsingOza=1])

Sin embargo, yo creo que es más práctico que el argumento opcional sea un indicador de caducidad pues aporta mayor flexibilidad.

Set Ois.UseCache(Text fileTOL, Text fileOza [, Real caducityInMinutes=1/0])

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(...));

comment:2 Changed 15 years ago by Víctor de Buen Remiro

(In [2407]) Refs #950

comment:3 Changed 15 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: acceptedclosed

(In [2408]) Fixes #950

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 Javier Portugal

Resolution: fixed
Status: closedreopened

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 Javier Portugal

Attachment: prueba.tol added

Changed 15 years ago by Javier Portugal

Attachment: prueba1.tol added

comment:5 Changed 15 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: reopenedclosed

(In [2515]) Fixes #950

comment:6 Changed 14 years ago by Víctor de Buen Remiro

(In [3144]) Refs #950

Note: See TracTickets for help on using tickets.