You are viewing a plain text version of this content. The canonical link for it is here.
Posted to embperl-cvs@perl.apache.org by ri...@apache.org on 2001/11/05 20:04:20 UTC

cvs commit: embperl/driver epxalan.MAKEPL epxalan.cpp

richter     01/11/05 11:04:20

  Modified:    .        Tag: Embperl2c Makefile.PL embperl.h ep.h ep2.h
                        epcache.c epdat.h epmain.c eputil.c
               driver   Tag: Embperl2c epxalan.MAKEPL epxalan.cpp
  Log:
  Embperl 2 - cache management
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.31.4.32 +2 -2      embperl/Makefile.PL
  
  Index: Makefile.PL
  ===================================================================
  RCS file: /home/cvs/embperl/Makefile.PL,v
  retrieving revision 1.31.4.31
  retrieving revision 1.31.4.32
  diff -u -r1.31.4.31 -r1.31.4.32
  --- Makefile.PL	2001/11/02 11:34:25	1.31.4.31
  +++ Makefile.PL	2001/11/05 19:04:19	1.31.4.32
  @@ -3,7 +3,7 @@
   #
   # (C) 1997-2001 G.Richter (richter@dev.ecos.de) / ECOS
   #
  -# $Id: Makefile.PL,v 1.31.4.31 2001/11/02 11:34:25 richter Exp $
  +# $Id: Makefile.PL,v 1.31.4.32 2001/11/05 19:04:19 richter Exp $
   #
   
   
  @@ -1122,7 +1122,7 @@
       'NAME'	   => 'HTML::Embperl',
       'VERSION_FROM' => 'Embperl.pm', 		# finds $VERSION
       'OBJECT'       => 'Embperl$(OBJ_EXT) epmain$(OBJ_EXT) epio$(OBJ_EXT) epchar$(OBJ_EXT) epcmd$(OBJ_EXT) eputil$(OBJ_EXT) epeval$(OBJ_EXT) epapinit$(OBJ_EXT) ' . 
  -                       ($EP2?'epcmd2$(OBJ_EXT) epparse$(OBJ_EXT) epdom$(OBJ_EXT) epcomp$(OBJ_EXT)':'') . $o,
  +                       ($EP2?'epcmd2$(OBJ_EXT) epparse$(OBJ_EXT) epdom$(OBJ_EXT) epcomp$(OBJ_EXT) epcache$(OBJ_EXT)':'') . $o,
       'LIBS'	   => [$libs || ''],   			 
       'DEFINE'	   => "$d \$(DEFS)", 			 
       'INC'	   => $i,     			 
  
  
  
  1.19.4.11 +4 -2      embperl/embperl.h
  
  Index: embperl.h
  ===================================================================
  RCS file: /home/cvs/embperl/embperl.h,v
  retrieving revision 1.19.4.10
  retrieving revision 1.19.4.11
  diff -u -r1.19.4.10 -r1.19.4.11
  --- embperl.h	2001/11/02 11:34:25	1.19.4.10
  +++ embperl.h	2001/11/05 19:04:19	1.19.4.11
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: embperl.h,v 1.19.4.10 2001/11/02 11:34:25 richter Exp $
  +#   $Id: embperl.h,v 1.19.4.11 2001/11/05 19:04:19 richter Exp $
   #
   ###################################################################################*/
   
  @@ -77,7 +77,9 @@
       rcCryptoWrongSyntax,
       rcCryptoNotSupported,
       rcCryptoBufferOverflow,
  -    rcCryptoErr
  +    rcCryptoErr,
  +    rcUnknownProvider,
  +    rcXalanError
       } ;
   
   
  
  
  
  1.27.4.22 +41 -8     embperl/ep.h
  
  Index: ep.h
  ===================================================================
  RCS file: /home/cvs/embperl/ep.h,v
  retrieving revision 1.27.4.21
  retrieving revision 1.27.4.22
  diff -u -r1.27.4.21 -r1.27.4.22
  --- ep.h	2001/11/02 14:38:45	1.27.4.21
  +++ ep.h	2001/11/05 19:04:19	1.27.4.22
  @@ -149,6 +149,15 @@
   
   #endif
   
  +#ifdef WIN32
  +#define PATH_MAX _MAX_DIR
  +#endif
  +
  +#ifndef PATH_MAX
  +#define PATH_MAX 512
  +#endif
  +
  +
   struct tReq ;
   
   typedef struct tReq req ;
  @@ -163,15 +172,7 @@
   #include "embperl.h"
   
   
  -#ifdef WIN32
  -#define PATH_MAX _MAX_DIR
  -#endif
  -
  -#ifndef PATH_MAX
  -#define PATH_MAX 512
  -#endif
   
  -
   /* ---- global variables ---- */
   
   extern tReq * pCurrReq ;                  /* Set before every eval (NOT thread safe!!) */ 
  @@ -431,6 +432,38 @@
   SV * GetHashValueSVinc    (/*in*/  HV *           pHash,
                              /*in*/  const char *   sKey,
                              /*in*/  SV *         sDefault) ;
  +
  +SV * GetHashValueSV       (/*in*/  HV *           pHash,
  +                           /*in*/  const char *   sKey) ;
  +
  +void GetHashValueStrOrHash (/*in*/  HV *           pHash,
  +                              /*in*/  const char *   sKey,
  +                              /*out*/ char * *       sValue,
  +                              /*out*/ HV * *         pHV) ;
  +
  +int GetHashValueHREF      (/*in*/  req *          r,
  +                           /*in*/  HV *           pHash,
  +                           /*in*/  const char *   sKey,
  +                           /*out*/ HV * *         ppHV) ;
  +
  +enum tHashItemType
  +    {
  +    hashtstr,
  +    hashtint,
  +    hashtsv,
  +    } ;
  +
  +HV * CreateHash   (/*in*/  char *   sKey, ...) ;
  +
  +void SetHashValueStr   (/*in*/  HV *           pHash,
  +                        /*in*/  const char *   sKey,
  +                        /*in*/  char *         sValue) ;
  +
  +void SetHashValueInt   (/*in*/  HV *           pHash,
  +                        /*in*/  const char *   sKey,
  +                        /*in*/  IV             nValue) ;
  +
  +
   
   const char * GetHtmlArg (/*in*/  const char *    pTag,
                            /*in*/  const char *    pArg,
  
  
  
  1.1.2.16  +106 -1    embperl/Attic/ep2.h
  
  Index: ep2.h
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/ep2.h,v
  retrieving revision 1.1.2.15
  retrieving revision 1.1.2.16
  diff -u -r1.1.2.15 -r1.1.2.16
  --- ep2.h	2001/10/22 06:25:01	1.1.2.15
  +++ ep2.h	2001/11/05 19:04:19	1.1.2.16
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: ep2.h,v 1.1.2.15 2001/10/22 06:25:01 richter Exp $
  +#   $Id: ep2.h,v 1.1.2.16 2001/11/05 19:04:19 richter Exp $
   #
   ###################################################################################*/
   
  @@ -115,7 +115,112 @@
   
   
   
  +/* ---- from epcache.c ----- */
   
  +struct tProvider ;
  +struct tProviderClass ;
  +struct tCacheItem ;
  +
  +typedef struct tCacheItem
  +    {
  +    const char *    sKey ;                  /**< key under which this cache item is accessable */
  +    
  +    bool            bExpired ;              /**< this item is expired */
  +    bool            bCache ;                /**< if true cache result of provider */
  +    int             nLastChecked ;          /**< request when this item was last checked */
  +    time_t          nLastModified ;         /**< time when item was last modified */
  +    time_t          nExpiresInTime ;        /**< time in sec when item expires, 0 = does not expire */ 
  +    const char *    sExpiresFilename ;      /**< Item expires when mtime of filename is different to nLastModified */
  +    time_t          nFileModified ;         /**< time when file was last modified */
  +    struct stat     FileStat ;              /**< Item expires when mtime of filename is different to nLastModified */
  +    CV *            pExpiresCV ;            /**< Perl code to call. If returns true item expires */
  +    int             (*fExpires) (struct tCacheItem * pItem) ; /**< C code to call. If returns true item expires */
  +
  +    void *          pData ;                 /**< Item C data */
  +    SV *            pSVData ;               /**< Item Perl data */
  +
  +    struct tCacheItem * *  pDependsOn ;            /**< CacheItem on which this one depends */
  +    struct tCacheItem * *  pNeededFor ;            /**< CacheItems that need this item */
  +
  +    struct tProvider *  pProvider ;         /**< Provider for this cacheItem */
  +    
  +    } tCacheItem ;
  +
  +
  +typedef struct tProviderClass
  +    {
  +    const char *    sOutputType ;                       /**< MIME type of output format (maybe override by object) */
  +    int (*fNew)(req * r, tCacheItem * pOutputCache, struct tProviderClass * pProviderClass, HV * pParam)  ;  /**< called to initialize the provider */
  +    int (*fGetContentSV)(req * r, struct tProvider * pProvider, SV ** pData) ; /**< Get the content from that provider */
  +    int (*fGetContentPtr)(req * r, struct tProvider * pProvider, void ** pData) ; /**< Get the content from that provider */
  +    int (*fFreeContent) (req * r, struct tCacheItem * pItem) ;   /**< Called to free memory of associated data */
  +    } tProviderClass ;
  +
  +
  +/*! General provider for input */
  +
  +typedef struct tProvider
  +    {
  +    const char *    sOutputType ;       /**< MIME type of output format */
  +    tCacheItem *    pCache ;            /**< CacheItem for this provider instance */
  +    tProviderClass *    pProviderClass ;    /**< Provider class */
  +    } tProvider ;
  +
  +
  +int Cache_Init (void) ;
  +
  +int Cache_CleanupRequest (req * r) ;
  +
  +int Cache_New (/*in*/ req *             r,
  +               /*in*/ HV *              pParam,
  +               /*in*/ tCacheItem * *    pItem) ;
  +
  +tCacheItem * Cache_GetByKey    (/*in*/ req *       r,
  +                                /*in*/ const char * sFilename,
  +                                /*in*/ const char * sModifier,
  +                                /*in*/ ...) ;
  +
  +int Cache_AddDependency (/*in*/ req *       r,
  +                         /*in*/ tCacheItem *    pItem,
  +                         /*in*/ tCacheItem *    pDependsOn) ;
  +
  +tCacheItem * Cache_GetDependency (/*in*/ req *           r,
  +                                  /*in*/ tCacheItem *    pItem,
  +                                  /*in*/ int             n) ;
  +
  +int Cache_IsExpired     (/*in*/ req *       r,
  +                         /*in*/ tCacheItem *    pItem) ;
  +
  +int Cache_SetNotExpired (/*in*/ req *       r,
  +                         /*in*/ tCacheItem *    pItem) ;
  +
  +int Cache_GetContentSV      (/*in*/ req *             r,
  +                             /*in*/ tCacheItem        *pItem,
  +                             /*in*/ SV * *            pData) ;
  +
  +int Cache_GetContentPtr     (/*in*/ req *             r,
  +                             /*in*/ tCacheItem        *pItem,
  +                             /*in*/ void * *          pData) ;
  +
  +int Cache_ReleaseContent        (/*in*/ req *             r,
  +                                 /*in*/ tCacheItem        *pItem) ;
  +
  +int Cache_FreeContent           (/*in*/ req *             r,
  +                                 /*in*/ tCacheItem        *pItem) ;
  +
  +
  +
  +
  +
  +
  +
  +
  +
  +
  +
  +
  +
  + 
   
   
   
  
  
  
  1.1.2.3   +434 -140  embperl/Attic/epcache.c
  
  Index: epcache.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epcache.c,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- epcache.c	2001/11/04 20:17:35	1.1.2.2
  +++ epcache.c	2001/11/05 19:04:19	1.1.2.3
  @@ -9,98 +9,33 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epcache.c,v 1.1.2.2 2001/11/04 20:17:35 richter Exp $
  +#   $Id: epcache.c,v 1.1.2.3 2001/11/05 19:04:19 richter Exp $
   #
   ###################################################################################*/
   
  +#include "ep.h"
  +#include "epmacro.h"
   
  -#define cache_mallaoc(r,s) malloc(s)
  +#define cache_malloc(r,s) malloc(s)
   #define cache_free(r,m) free(m)
   
  -struct tProvider ;
   
  -
  -typedef struct tCacheItem
  -    {
  -    bool            bExpired ;              /**< this item is expired */
  -    int             nLastChecked ;          /**< request when this item was last checked */
  -    time_t          nLastModified ;         /**< time when item was last modified */
  -    time_t          nExpiresInTime ;        /**< time in sec when item expires, 0 = does not expire */ 
  -    const char *    sExpiresFilename ;      /**< Item expires when mtime of filename is different to nLastModified */
  -    time_t          nFileModified ;         /**< time when file was last modified */
  -    struct stat     FileStat ;              /**< Item expires when mtime of filename is different to nLastModified */
  -    CV *            pExpiresCV ;            /**< Perl code to call. If returns true item expires */
  -    int             (*fExpires) (struct tCacheItem * pItem) ; /**< C code to call. If returns true item expires */
  -
  -    void *          pData ;                 /**< Item C data */
  -    SV *            pSVData ;               /**< Item Perl data */
  -
  -    tArray *        pDependsOn ;            /**< CacheItem on which this one depends */
  -    tArray *        pNeededFor ;            /**< CacheItems that need this item */
  -
  -    struct tProvider *  pProvider ;         /**< Provider for this cacheItem */
  -    
  -    int (*fCacheItemFree) (struct tCacheItem * pItem) ;   /**< Called to free memory of associated data */
  -    } tCacheItem ;
  -
  -
  -typedef struct tProviderClass
  -    {
  -    const char *    sOutputType ;                       /**< MIME type of output format (maybe override by object) */
  -    int (*fNew)(req * r, tCacheItem * pOutputCache)  ;  /**< called to initialize the provider */
  -    int (*fGetContent)(req * r, struct tProvider * pProvider, void ** pData, size_t * pLen) ; /**< Get the content from that provider */
  -    } tProviderClass ;
  -
  -
  -/*! General provider for input */
  -
  -typedef struct tProvider
  -    {
  -    const char *    sOutputType ;       /**< MIME type of output format */
  -    tCacheItem *    pCache ;            /**< CacheItem for this provider instance */
  -    tProviderClass *    pProviderClass ;    /**< Provider class */
  -    } tProvider ;
  -
  -
   /*! Provider that reads input from file */
   
   typedef struct tProviderFile
       {
  +    tProvider           Provider ;
       const char *        sFilename ;         /**< Filename */
       } tProviderFile ;
   
   
  -HV * pProviders ;       /* global hash that holds all known providers classes */
  -
  -tProviderClass ProviderClassFile = {  "text/*", &ProviderFile_New, &ProviderFile_GetContent } ;
   
   
  -/* ------------------------------------------------------------------------ */
  -/*                                                                          */
  -/* Cache_Init      					                    */
  -/*                                                                          */
  -/*! 
  -*   \_en
  -*   Do global initialization of cache system
  -*   @return                 error code
  -*   
  -*   \endif                                                                       
  -*
  -*   \_de									   
  -*   F�hrt die globale Initialisierung des Cachesystems durch
  -*   @return                 Fehlercode
  -*   
  -*   \endif                                                                       
  -*                                                                          
  -* ------------------------------------------------------------------------ */
  -
  -int Cache_Init (void)
   
  -    {
  -    pProviders = newHV () ;
  +HV * pProviders ;       /**< global hash that holds all known providers classes */
  +HV * pCacheItems ;      /**< hash which contains all CacheItems by Key */
  +tCacheItem * * pCachesToRelease = NULL ;
   
  -    SetHashValueStr (pProviders, "file", &ProviderClassFile) ;
  -    }
   
   
   
  @@ -114,7 +49,10 @@
   *   The resulting provider is put into the cache structure
   *   
   *   @param  r               Embperl request record
  -*   @param  pParam          Parameter
  +*   @param  pItem           CacheItem which holds the output of the provider
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               filename        name of file
   *   @return                 error code
   *   \endif                                                                       
   *
  @@ -123,16 +61,20 @@
   *   auf den resultierenden Provider wird in die Cachestrutr eingef�gt
   *   
   *   @param  r               Embperl request record
  -*   @param  pParam          Parameter
  -*   @param  pItem           R�ckgabe des neuen Items
  +*   @param  pItem           CacheItem welches die Ausgabe des Providers 
  +*                           speichert
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               filename        Dateiname
   *   @return                 Fehlercode
   *   \endif                                                                       
   *                                                                          
   * ------------------------------------------------------------------------ */
   
  -int ProviderFile_New (/*in*/ req *              r,
  -                      /*in*/ tCacheItem *       pItem,
  -                      /*in*/ HV *               pParam)
  +static int ProviderFile_New (/*in*/ req *              r,
  +                             /*in*/ tCacheItem *       pItem,
  +                             /*in*/ tProviderClass *   pProviderClass,
  +                             /*in*/ HV *               pParam)
   
   
       {
  @@ -150,18 +92,21 @@
       pNew -> Provider.pCache             = pItem ;
       pNew -> Provider.pProviderClass     = pProviderClass ;
       pNew -> Provider.sOutputType        = pProviderClass -> sOutputType ;
  -    pNew -> sFilename                   = GetHashValueStrDup  (pParam, 'filename', NULL) ;
  +    pNew -> sFilename                   = GetHashValueStrDup  (pParam, "filename", NULL) ;
  +    pItem -> sExpiresFilename           = pNew -> sFilename ;
  +    pItem -> sKey                       = pNew -> sFilename ;
   
  -    pItem -> pProvider = pNew ;
  +    pItem -> pProvider = (tProvider *)pNew ;
   
       return ok ;
       }
   
   
   
  +
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
  -/* ProviderFile_GetContent   					            */
  +/* ProviderFile_GetContentSV   					            */
   /*                                                                          */
   /*! 
   *   \_en
  @@ -171,7 +116,6 @@
   *   @param  r               Embperl request record
   *   @param  pProvider       The provider record
   *   @param  pData           Returns the content
  -*   @param  pLen            Returns the length
   *   @return                 error code
   *   \endif                                                                       
   *
  @@ -182,7 +126,6 @@
   *   @param  r               Embperl request record
   *   @param  pProvider       The provider record
   *   @param  pData           Liefert den Inhalt
  -*   @param  pLen            Liefert die L�nge
   *   @return                 Fehlercode
   *   \endif                                                                       
   *                                                                          
  @@ -190,25 +133,91 @@
   
   
   
  -int ProviderFile_GetContent (/*in*/ req *             r,
  -                             /*in*/ tProviderFile *   pProvider,
  -                             /*in*/ void * *          pData,
  -                             /*in*/ int * *           nLen)
  +static int ProviderFile_GetContentSV (/*in*/ req *             r,
  +                             /*in*/ tProvider *     pProvider,
  +                             /*in*/ SV * *              pData)
   
       {
  +    return ReadHTML(r, (char *)((tProviderFile *)pProvider) -> sFilename, &pProvider -> pCache -> FileStat.st_size, pData) ;
  +    }
   
  -    if (Cache_IsExpired (pProvider -> Provider.pCache))
  -        {
  -        if ((rc = ReadHTML(r, pProvider -> sFilename, pProvider -> Provider.FileStat.st_size, &pProvider -> Provider.pCache ->pSV)) != ok)
  -            return rc ;
  -        Cache_SetNotExpired (r, pItem) ;
  -        }
   
  -    *pData = SvPV(pProvider -> pCache ->pSV, nLen) ;
  -    return ok ;
  +
  +tProviderClass ProviderClassFile = 
  +    {   
  +    "text/*", 
  +    &ProviderFile_New, 
  +    &ProviderFile_GetContentSV,
  +    NULL,
  +    NULL,
  +    } ;
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* Cache_Init      					                    */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Do global initialization of cache system
  +*   @return                 error code
  +*   
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   F�hrt die globale Initialisierung des Cachesystems durch
  +*   @return                 Fehlercode
  +*   
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +int Cache_Init (void)
  +
  +    {
  +    pProviders  = newHV () ;
  +    pCacheItems = newHV () ;
  +
  +    SetHashValueInt (pProviders, "file", (IV)&ProviderClassFile) ;
  +    
  +    ArrayNew (&pCachesToRelease, sizeof (tCacheItem *), 16) ;
       }
   
   
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* Cache_CleanupRequest  				                    */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Do cleanup at end of request
  +*   @param  r               Embperl request record
  +*   @return                 error code
  +*   
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   F�hrt die Aufr�umarbeiten am Requestende aus
  +*   @param  r               Embperl request record
  +*   @return                 Fehlercode
  +*   
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +int Cache_CleanupRequest (req * r)
  +
  +    {
  +    int n = ArrayGetSize (pCachesToRelease) ;
  +    int i ;
  +
  +    for (i = 0; i < n; i++)
  +        Cache_FreeContent (r, pCachesToRelease[i]) ;
  +
  +    ArraySetSize(&pCachesToRelease, 0) ;
  +
  +    return ok ;
  +    }
   
   
   /* ------------------------------------------------------------------------ */
  @@ -221,6 +230,15 @@
   *   
   *   @param  r               Embperl request record
   *   @param  pParam          Parameter
  +*                               expires_in  number of seconds when the item 
  +*                                           expires, 0 = expires never
  +*                               expired_func    Perl Function (coderef) that
  +*                                               is called and item is expired
  +*                                               if it returns true
  +*                               expires_filename    item expires when modification
  +*                                                   time of file changes
  +*                               cache               set to zero to not cache the content
  +*                               provider            parameter for the provider 
   *   @param  pItem           Return of the new Items
   *   @return                 error code
   *   \endif                                                                       
  @@ -230,6 +248,16 @@
   *   
   *   @param  r               Embperl request record
   *   @param  pParam          Parameter
  +*                               expires_in  anzahl der Sekunden wenn Item
  +*                                           abl�uft; 0 = nie
  +*                               expired_func    Perl Funktion (coderef) die
  +*                                               aufgerufen wird. Wenn sie wahr
  +*                                               zur�ckgibt ist das Item abgelaufen
  +*                               expires_filename    Item ist abgelaufen wenn 
  +*                                                   Dateidatum sich �ndert
  +*                               cache               Auf Null setzen damit Inhalt
  +*                                                   nicht gecacht wird
  +*                               provider            parameter f�r Provider
   *   @param  pItem           R�ckgabe des neuen Items
   *   @return                 Fehlercode
   *   \endif                                                                       
  @@ -243,10 +271,11 @@
   
       {
       int          rc ;
  -    HV *         pProviderParameter ;
  +    HV *         pProviderParam ;
       char *       sProvider ;
       tProviderClass *  pProviderClass ;
       tCacheItem * pNew = cache_malloc (r, sizeof(tCacheItem)) ;
  +
       
       if (!pNew)
           return rcOutOfMemory ;
  @@ -254,27 +283,42 @@
       *pItem = NULL ;
       memset (pNew, 0, sizeof (tCacheItem)) ;
   
  -    pNew -> nExpiresInTime      = GetHashValueInt (pParam, 'expires_in', 0) ;
  -    pNew -> nExpiresCV          = GetHashValueSV  (pParam, 'expired_func', NULL) ;
  -    pNew -> sExpiresFilename    = GetHashValueStrDup  (pParam, 'expires_filename', NULL) ;
  -
  -    sProvider      = GetHashValueStr  (pParam, 'provider', NULL) ;
  -    if (sProvider)
  +    pNew -> nExpiresInTime      = GetHashValueInt (pParam, "expires_in", 0) ;
  +    pNew -> pExpiresCV          = (CV *)GetHashValueSVinc  (pParam, "expired_func", NULL) ;
  +    pNew -> sExpiresFilename    = GetHashValueStrDup  (pParam, "expires_filename", NULL) ;
  +    pNew -> bCache              = GetHashValueInt   (pParam, "cache", 1) ;
  +
  +    if ((rc = GetHashValueHREF  (r, pParam, "provider", &pProviderParam)) != ok)
  +        return rc ;
  +    if (pProviderParam)
           {
  -        pProviderClass = GetHashValueInt (pProviders, sProvider, NULL) ;
  +        tCacheItem * pSubItem ;
  +        int          i ;
  +        int	     numItems  ;
  +
  +        
  +        sProvider      = GetHashValueStr  (pParam, "type", "") ;
  +        pProviderClass = (tProviderClass *)GetHashValueInt (pProviders, sProvider, NULL) ;
           if (!pProviderClass)
               {
               cache_free (r, pNew) ;
               strncpy (r -> errdat1, sProvider, sizeof(r -> errdat1) - 1) ;
               return rcUnknownProvider ;
               }
  -        pProviderParam = GetHashValueSV  (pParam, 'param',    NULL) ;
  -        
  -        if ((rc = (*pProvider -> fNew)(pNew, pProviderClass, pProviderParam)) != ok)
  +        if ((rc = (*pProviderClass -> fNew)(r, pNew, pProviderClass, pProviderParam)) != ok)
               {
               cache_free (r, pNew) ;
               return rc ;
               }
  +
  +        /* build key */
  +        numItems = ArrayGetSize (pItem -> pDependsOn) ;
  +        for (i = 0; i < numItems; i++)
  +	    {
  +	    pSubItem = pItem -> pDependsOn[i] ;
  +	    if (Cache_IsExpired (r, pSubItem))
  +	        return pItem -> bExpired = TRUE ;
  +	    }
           }
   
   
  @@ -286,7 +330,7 @@
   
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
  -/* Cache_GetByFileKey  						            */
  +/* Cache_GetByKey  						            */
   /*                                                                          */
   /*! 
   *   \_en
  @@ -295,9 +339,9 @@
   *   to make sure it is unique
   *   
   *   @param  r               Embperl request record
  -*   @param  sFilename       filename
  -*   @param  sModifier       modifier
  -*   @return                 errorcode, 0 on success
  +*   @param  sFilename       filename or NULL
  +*   @param  sModifier       List of modifier(s), last modifier must be NULL. 
  +*   @return                 Returns the cache item specified by the key if found
   *   \endif                                                                       
   *
   *   \_de									   
  @@ -307,14 +351,83 @@
   *   eindeutig zu machen.
   *   
   *   @param  r               Embperl request record
  -*   @param  sFilename       Dateiname
  -*   @param  sModifier       modifier
  -*   @return                 Fehlercode, 0 wenn fehlerfrei ausgef�hrt
  +*   @param  sFilename       Dateiname oder NULL
  +*   @param  sModifier       Liste von Modifizierern, der letzte mu� NULL sein.
  +*   @return                 Liefert das CacheItem welches durch den Schl�ssel
  +*                           angegeben wird, soweit gefunden.
   *   \endif                                                                       
   *                                                                          
   * ------------------------------------------------------------------------ */
  -Cache_GetByFileKey
   
  +tCacheItem * Cache_GetByKey    (/*in*/ req *       r,
  +                                /*in*/ const char * sFilename,
  +                                /*in*/ const char * sModifier,
  +                                /*in*/ ...)
  +
  +    {
  +    va_list         marker;
  +    const char *    sMod ;
  +    bool            bDir = TRUE ;
  +    int             nLen = 0 ;
  +    char *          sKey ;
  +    tCacheItem *    pItem ;
  +
  +
  +    if (sFilename)
  +        {
  +        nLen = strlen(sFilename);
  +
  +        /* is it a relative filename? -> append path */
  +        if (!(sFilename[0] == '/'  
  +#ifdef WIN32
  +            ||
  +            sFilename[0] == '\\' || 
  +                (isalpha(sFilename[0]) && sFilename[1] == ':' && 
  +	          (sFilename[2] == '\\' || sFilename[2] == '/')) 
  +#endif                  
  +            ))            
  +            {
  +	    nLen += strlen(r -> sCWD);
  +            bDir = TRUE ;
  +            }
  +        }
  +
  +    sMod = sModifier ;
  +    va_start (marker, sModifier);     
  +    while (sMod)
  +        {
  +        nLen += strlen (sMod) ;
  +        sMod = va_arg (marker, const char *) ;
  +        }
  +    va_end (marker) ;
  +
  +
  +    sKey = _malloc (r, nLen+1) ;
  +    if (bDir)
  +        strcpy (sKey, r -> sCWD) ;
  +    else
  +        sKey[0] = '\0' ;
  +
  +    if (sFilename)
  +        strcat (sKey, sFilename) ;
  +
  +    sMod = sModifier ;
  +    va_start (marker, sModifier);     
  +    while (sMod)
  +        {
  +        strcat (sKey, sMod) ;
  +        sMod = va_arg (marker, const char *) ;
  +        }
  +    va_end (marker) ;
  +
  +    pItem = (tCacheItem *)GetHashValueInt (pCacheItems, sKey, NULL) ;
  +    _free(r, sKey) ;
  +
  +    return pItem ;
  +    }
  +
  +
  +
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
   /* Cache_AddDependency  						    */
  @@ -367,6 +480,46 @@
       }
   
   
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* Cache_GetDependency  						    */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Get the Nth CacheItem on which this cache depends
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem 
  +*   @param  n               Dependency number
  +*   @return                 Nth Dependency CacheItem
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Gibt das Nte CacheItem von dem pItem abh�ngt zur�ck
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem
  +*   @param  n               Number der Abh�nigkeit
  +*   @return                 Ntes CacheItem von welchem pItem abh�ngt
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +
  +tCacheItem * Cache_GetDependency (/*in*/ req *           r,
  +                                  /*in*/ tCacheItem *    pItem,
  +                                  /*in*/ int             n)
  +
  +    {
  +    if (!pItem -> pDependsOn || ArrayGetSize (pItem -> pDependsOn) < n || n < 0)
  +        return NULL ;
  +
  +    return pItem -> pDependsOn[n] ;
  +    }
  +
  +
   
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
  @@ -379,7 +532,7 @@
   *   
   *   @param  r               Embperl request record
   *   @param  pItem           CacheItem which should be checked
  -*   @return                 true if expired, otherwise false
  +*   @return                 TRUE if expired, otherwise false
   *   \endif                                                                       
   *
   *   \_de									   
  @@ -403,7 +556,7 @@
       {
       int          rc ;
       tCacheItem * pSubItem ;
  -    int          n ;
  +    int          i ;
       int		 numItems = ArrayGetSize (pItem -> pDependsOn) ;
   
       if (pItem -> bExpired || pItem -> nLastChecked == r -> nRequestCount)
  @@ -416,14 +569,14 @@
   	{
   	pSubItem = pItem -> pDependsOn[i] ;
   	if (Cache_IsExpired (r, pSubItem))
  -	    return pItem -> bExpired = true ;
  +	    return pItem -> bExpired = TRUE ;
   	}
   
       if (pItem -> nExpiresInTime && pItem -> nLastModified + pItem -> nExpiresInTime < r -> nRequestTime)
           {
           if (r -> bDebug & dbgCache)
               lprintf (r, "[%d]CACHE: Expired because of timeout (%d sec)\n", r -> nPid, pItem -> nExpiresInTime) ; 
  -	return pItem -> bExpired = true ;
  +	return pItem -> bExpired = TRUE ;
           }
   
       if (pItem -> sExpiresFilename)
  @@ -432,7 +585,7 @@
               {
               if (r -> bDebug & dbgCache)
                   lprintf (r, "[%d]CACHE: Expired because cannot stat file %s\n", r -> nPid, pItem -> sExpiresFilename) ; 
  -	    return pItem -> bExpired = true ;
  +	    return pItem -> bExpired = TRUE ;
               }
   
           if (pItem -> nFileModified != pItem -> FileStat.st_mtime)
  @@ -440,7 +593,7 @@
               if (r -> bDebug & dbgCache)
                   lprintf (r, "[%d]CACHE: Expired because file %s changed\n", r -> nPid, pItem -> sExpiresFilename) ; 
   	    pItem -> nFileModified = pItem -> FileStat.st_mtime ;
  -            return pItem -> bExpired = true ;
  +            return pItem -> bExpired = TRUE ;
               }
           }
       
  @@ -449,17 +602,17 @@
           {
           SV * pRet ;
   
  -        if ((rc = CallCV (r, "Expired?", pExpiresCV, 0, &pRet)) != ok)
  +        if ((rc = CallCV (r, "Expired?", pItem -> pExpiresCV, 0, &pRet)) != ok)
               {
               LogError (r, rc) ;
  -	    return pItem -> bExpired = true ;
  +	    return pItem -> bExpired = TRUE ;
               }
       
           if (pRet && SvTRUE(pRet))
               { /* Expire the entry */
               if (r -> bDebug & dbgCache)
                   lprintf (r, "[%d]CACHE: Expired because expirey Perl sub returned TRUE\n", r -> nPid) ; 
  -	    return pItem -> bExpired = true ;
  +	    return pItem -> bExpired = TRUE ;
               }
           }
   
  @@ -469,11 +622,11 @@
               { 
               if (r -> bDebug & dbgCache)
                   lprintf (r, "[%d]CACHE: Expired because expirey C sub returned TRUE\n", r -> nPid) ; 
  -	    return pItem -> bExpired = true ;
  +	    return pItem -> bExpired = TRUE ;
               }
           }
   
  -    return false ;
  +    return FALSE ;
       }
   
   
  @@ -487,7 +640,7 @@
   *   
   *   @param  r               Embperl request record
   *   @param  pItem           CacheItem which should be checked
  -*   @return                 true if expired, otherwise false
  +*   @return                 TRUE if expired, otherwise false
   *   \endif                                                                       
   *
   *   \_de									   
  @@ -507,18 +660,22 @@
       {
       pItem -> nLastChecked   = r -> nRequestCount ;
       pItem -> nLastModified  = r -> nRequestTime ;
  -    pItem -> bExpired       = false ;
  +    pItem -> bExpired       = FALSE ;
  +
  +    if (!pItem -> bCache)
  +        pCachesToRelease[ArrayAdd(&pCachesToRelease, 1)] = pItem ;
       }
   
   
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
  -/* Cache_GetContent   					                    */
  +/* Cache_GetContentSV  					                    */
   /*                                                                          */
   /*! 
   *   \_en
  -*   Get the whole content, if not expired from the cache, otherwise ask
  -*   the provider to fetch it. 
  +*   Get the whole content as SV, if not expired from the cache, otherwise ask
  +*   the provider to fetch it. This will also put a read lock on the
  +*   Cacheitem. When you are done with the content call ReleaseContent
   *   
   *   @param  r               Embperl request record
   *   @param  pItem           CacheItem which should be checked
  @@ -528,8 +685,10 @@
   *   \endif                                                                       
   *
   *   \_de									   
  -*   Holt den gesamt Inhalt soweit nich abgelaufen aus dem Cache, ansonsten
  -*   wird der Provider beauftragt ihn einzulesen.
  +*   Holt den gesamt Inhalt als SV soweit nich abgelaufen aus dem Cache, ansonsten
  +*   wird der Provider beauftragt ihn einzulesen. Zus�tzlich wird ein
  +*   Read Lock gesetzt. Nach der Bearbeitetung des Inhalts sollte deshalb
  +*   ReleaseLock zum freigeben aufgerufen werden.
   *   
   *   @param  r               Embperl request record
   *   @param  pItem           CacheItem welches �berpr�ft werden soll
  @@ -542,21 +701,156 @@
   
   
   
  -int Cache_GetContent        (/*in*/ req *             r,
  +int Cache_GetContentSV      (/*in*/ req *             r,
                                /*in*/ tCacheItem        *pItem,
  -                             /*in*/ void * *          pData,
  -                             /*in*/ int * *           pLen)
  +                             /*in*/ SV * *            pData)
   
       {
  +    int rc ;
   
  -    if (Cache_IsExpired (pItem))
  +    if (!pItem -> pSVData || Cache_IsExpired (r, pItem))
           {
  -        if ((rc = (*pItem -> pProvider -> pProviderClass -> fGetContent (r, pItem -> pProvider, pData, pLen))) != ok)
  -            return rc ;
  +        if (pItem -> pProvider -> pProviderClass -> fGetContentSV)
  +            if ((rc = ((*pItem -> pProvider -> pProviderClass -> fGetContentSV) (r, pItem -> pProvider, &pItem -> pSVData))) != ok)
  +                return rc ;
  +        Cache_SetNotExpired (r, pItem) ;
  +        }
  +
  +    *pData = pItem -> pSVData  ;
  +
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* Cache_GetContentPtr					                    */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Get the whole content as pointer, if not expired from the cache, otherwise ask
  +*   the provider to fetch it. This will also put a read lock on the
  +*   Cacheitem. When you are done with the content call ReleaseContent
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem which should be checked
  +*   @param  pData           Returns the content
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Holt den gesamt Inhalt als Zeiger soweit nich abgelaufen aus dem Cache, ansonsten
  +*   wird der Provider beauftragt ihn einzulesen. Zus�tzlich wird ein
  +*   Read Lock gesetzt. Nach der Bearbeitetung des Inhalts sollte deshalb
  +*   ReleaseLock zum freigeben aufgerufen werden.
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem welches �berpr�ft werden soll
  +*   @param  pData           Liefert den Inhalt
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +int Cache_GetContentPtr     (/*in*/ req *             r,
  +                             /*in*/ tCacheItem        *pItem,
  +                             /*in*/ void * *          pData)
  +
  +    {
  +    int rc ;
  +
  +    if (!pItem -> pData || Cache_IsExpired (r, pItem))
  +        {
  +        if (pItem -> pProvider -> pProviderClass -> fGetContentPtr)
  +            if ((rc = (*pItem -> pProvider -> pProviderClass -> fGetContentPtr) (r, pItem -> pProvider, &pItem -> pData)) != ok)
  +                return rc ;
           Cache_SetNotExpired (r, pItem) ;
           }
  +
  +    *pData = pItem -> pData ;
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* Cache_ReleaseContent   				                    */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Removes the read and/or write lock from the content.
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem which should be checked
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Gibt den Read und/oder Write Lock wieder frei.
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem welches �berpr�ft werden soll
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +int Cache_ReleaseContent        (/*in*/ req *             r,
  +                                 /*in*/ tCacheItem        *pItem)
  +
  +    {
  +    /* not implemented yet */
  +    return ok ;
  +    }
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* Cache_FreeContent   				                            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Free the cached data
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Gibt die gecachten Daten frei
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +int Cache_FreeContent           (/*in*/ req *             r,
  +                                 /*in*/ tCacheItem        *pItem)
  +
  +    {
  +    int rc ;
  +    
  +    if (r -> bDebug & dbgCache)
  +        lprintf (r, "[%d]CACHE: Free content for %s\n", r -> nPid, pItem -> sKey) ; 
  +
  +    if (pItem -> pProvider -> pProviderClass -> fFreeContent)
  +        if ((rc = (*pItem -> pProvider -> pProviderClass -> fFreeContent) (r, pItem -> pProvider, pItem)) != ok)
  +            return rc ;
  +    
  +    if (pItem -> pSVData)
  +        {
  +        SvREFCNT_dec (pItem -> pSVData) ;
  +        pItem -> pSVData = NULL ;
  +        }
  +    pItem -> pData = NULL ;
   
  -    *pData = SvPV(pItem -> pSV, nLen) ;
       return ok ;
       }
   
  
  
  
  1.20.4.28 +4 -1      embperl/epdat.h
  
  Index: epdat.h
  ===================================================================
  RCS file: /home/cvs/embperl/epdat.h,v
  retrieving revision 1.20.4.27
  retrieving revision 1.20.4.28
  diff -u -r1.20.4.27 -r1.20.4.28
  --- epdat.h	2001/10/22 13:52:16	1.20.4.27
  +++ epdat.h	2001/11/05 19:04:19	1.20.4.28
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epdat.h,v 1.20.4.27 2001/10/22 13:52:16 richter Exp $
  +#   $Id: epdat.h,v 1.20.4.28 2001/11/05 19:04:19 richter Exp $
   #
   ###################################################################################*/
   
  @@ -405,6 +405,9 @@
       int	    nInsideSub ;	/* Are we inside of a sub? */
       int	    bExit ;		/* We should exit the page */
       int	    nPathNdx ;		/* gives the index in the path where the current file is found */
  +    char    sCWD[PATH_MAX] ;    /**< Current working directory */
  +    int     nRequestCount ;     /**< increments by one on each request */
  +    time_t  nRequestTime ;      /**< time when request starts */
   
       char *  sSessionID ;        /* stores session name and id for status session data */
   #ifdef EP2
  
  
  
  1.75.4.53 +11 -1     embperl/epmain.c
  
  Index: epmain.c
  ===================================================================
  RCS file: /home/cvs/embperl/epmain.c,v
  retrieving revision 1.75.4.52
  retrieving revision 1.75.4.53
  diff -u -r1.75.4.52 -r1.75.4.53
  --- epmain.c	2001/11/02 11:34:26	1.75.4.52
  +++ epmain.c	2001/11/05 19:04:19	1.75.4.53
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epmain.c,v 1.75.4.52 2001/11/02 11:34:26 richter Exp $
  +#   $Id: epmain.c,v 1.75.4.53 2001/11/05 19:04:19 richter Exp $
   #
   ###################################################################################*/
   
  @@ -1673,6 +1673,7 @@
      
   #ifdef EP2
       DomInit () ;
  +    Cache_Init () ;
   #endif    
       
       bInitDone = 1 ;
  @@ -2373,6 +2374,10 @@
       r -> nInsideSub	 = 0 ;
       r -> bExit  	 = 0 ;
       
  +    r -> nRequestCount++ ;
  +    r -> nRequestTime = time(NULL) ;
  +    getcwd (r->sCWD, sizeof (r->sCWD)-1) ;
  +    
       r -> pOutData        = pOut ;
       r -> pInData         = pIn ;
   
  @@ -3250,6 +3255,11 @@
   	    (r -> bSubReq?"Sub-":""), asctime(tm), r -> stsv_count, r -> stsv_objcount, sv_count, sv_objcount) ;
           }
   
  +#ifdef EP2
  +    Cache_CleanupRequest (r) ;
  +#endif    
  +
  +    
       r -> Buf.pCurrPos = NULL ;
   
   
  
  
  
  1.15.4.19 +107 -1    embperl/eputil.c
  
  Index: eputil.c
  ===================================================================
  RCS file: /home/cvs/embperl/eputil.c,v
  retrieving revision 1.15.4.18
  retrieving revision 1.15.4.19
  diff -u -r1.15.4.18 -r1.15.4.19
  --- eputil.c	2001/11/02 14:30:13	1.15.4.18
  +++ eputil.c	2001/11/05 19:04:19	1.15.4.19
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: eputil.c,v 1.15.4.18 2001/11/02 14:30:13 richter Exp $
  +#   $Id: eputil.c,v 1.15.4.19 2001/11/05 19:04:19 richter Exp $
   #
   ###################################################################################*/
   
  @@ -742,6 +742,25 @@
   	return NULL ;
       }
   
  +
  +void GetHashValueStrOrHash (/*in*/  HV *           pHash,
  +                              /*in*/  const char *   sKey,
  +                              /*out*/ char * *       sValue,
  +                              /*out*/ HV * *         pHV)
  +
  +    {
  +    SV **   ppSV ;
  +    STRLEN  l ;
  +
  +    ppSV = hv_fetch(pHash, (char *)sKey, strlen (sKey), 0) ;  
  +    if (ppSV != NULL)
  +        if (!SvROK(*ppSV) || SvTYPE (SvRV(*ppSV)) != SVt_PVHV)
  +            *sValue = SvPV (*ppSV, l), pHV = NULL ;
  +        else
  +            *pHV = (HV *)SvRV(*ppSV), sValue = NULL ;
  +    }
  +
  +
   SV * GetHashValueSVinc    (/*in*/  HV *           pHash,
                              /*in*/  const char *   sKey,
                              /*in*/  SV *         sDefault)
  @@ -764,6 +783,55 @@
       }
   
   
  +SV * GetHashValueSV    (/*in*/  HV *           pHash,
  +                           /*in*/  const char *   sKey)
  +    {
  +    SV **   ppSV ;
  +    STRLEN  l ;
  +    char *  s ;
  +
  +    ppSV = hv_fetch(pHash, (char *)sKey, strlen (sKey), 0) ;  
  +    if (ppSV != NULL)
  +        {
  +        return *ppSV ;
  +	}
  +
  +    return NULL ;
  +    }
  +
  +int GetHashValueHREF      (/*in*/  req *          r,
  +                           /*in*/  HV *           pHash,
  +                           /*in*/  const char *   sKey,
  +                           /*out*/ HV * *         ppHV)
  +    {
  +    SV **   ppSV ;
  +    STRLEN  l ;
  +    char *  s ;
  +    HV *    pHV ;
  +
  +    ppSV = hv_fetch(pHash, (char *)sKey, strlen (sKey), 0) ;  
  +    if (ppSV != NULL)
  +        {
  +        if (!SvROK(*ppSV))
  +            {
  +            strncpy (r -> errdat1, sKey, sizeof(r -> errdat1) - 1) ;
  +            return rcNotHashRef ; 
  +            }
  +        pHV = (HV *)SvRV(*ppSV) ;
  +        if (!SvTYPE(pHV) != SVt_PVHV)
  +            {
  +            strncpy (r -> errdat1, sKey, sizeof(r -> errdat1) - 1) ;
  +            return rcNotHashRef ; 
  +            }
  +        *ppHV = pHV ;
  +        return ok ;
  +	}
  +
  +    strncpy (r -> errdat1, sKey, sizeof(r -> errdat1) - 1) ;
  +    return rcNotHashRef ; 
  +    }
  +
  +
   void SetHashValueStr   (/*in*/  HV *           pHash,
                           /*in*/  const char *   sKey,
                           /*in*/  char *         sValue)
  @@ -776,7 +844,45 @@
       hv_store(pHash, (char *)sKey, strlen (sKey), pSV, 0) ;  
       }
   
  +void SetHashValueInt   (/*in*/  HV *           pHash,
  +                        /*in*/  const char *   sKey,
  +                        /*in*/  IV             nValue)
  +
  +    {
  +    SV *   pSV = newSViv (nValue) ;
  +
  +    /*EPENTRY (GetHashValueInt) ;*/
  +
  +    hv_store(pHash, (char *)sKey, strlen (sKey), pSV, 0) ;  
  +    }
  +
   
  +HV * CreateHash   (/*in*/  char *   sKey, ...)
  +    
  +    {
  +    va_list         marker;
  +    SV *            pVal ;
  +    HV *            pHash = newHV() ;
  +    int             nType ;
  +
  +    va_start (marker, sKey);     
  +    while (sKey)
  +        {
  +        nType = va_arg (marker, int) ;
  +        if (nType == hashtstr)
  +            pVal = newSVpv (va_arg(marker, char *), 0) ;
  +        else if (nType == hashtint)
  +            pVal = newSViv (va_arg(marker, int)) ;
  +        else
  +            pVal = va_arg(marker, SV *) ;
  +
  +        hv_store (pHash, sKey, strlen(sKey), pVal, 0) ;
  +        sKey = va_arg(marker, char *) ;
  +        }
  +    va_end (marker) ;
  +
  +    return pHash ;
  +    }
   
   
   
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.9   +7 -5      embperl/driver/Attic/epxalan.MAKEPL
  
  Index: epxalan.MAKEPL
  ===================================================================
  RCS file: /home/cvs/embperl/driver/Attic/epxalan.MAKEPL,v
  retrieving revision 1.1.2.8
  retrieving revision 1.1.2.9
  diff -u -r1.1.2.8 -r1.1.2.9
  --- epxalan.MAKEPL	2001/10/31 08:24:57	1.1.2.8
  +++ epxalan.MAKEPL	2001/11/05 19:04:20	1.1.2.9
  @@ -5,7 +5,7 @@
   $win32 = ($^O eq 'MSWin32') ;
   
   
  -if (!$win32)
  +if (1) # !$win32)
       {
       $path = GetString ("Enter path of XALAN base directory or single dot for not using XALAN", $XALANPATH) ;
   
  @@ -37,7 +37,7 @@
   
       my $currdir = Cwd::fastcwd ;
   
  -    eval { find (\&xalanlib, "$path/lib") ; } ;
  +    eval { find (\&xalanlib, $win32?"$path/Build":"$path/lib") ; } ;
       $@ = '' ;
       chdir ($currdir);
       if (!$xalanlib)
  @@ -80,7 +80,7 @@
           {
           print "Makefile for XALAN not found. Assuming prebuild version using defaults\n" ;
           print "!!! NOTE: If you get compiler errors when build epxalan.cpp, try to build\n" ;
  -        print "!!!       XALAN from the sources. See INSTALL.XALAN.pod\n\n" ;
  +        print "!!!       XALAN from the sources. See INSTALL.pod\n\n" ;
           }
   
   
  @@ -108,7 +108,8 @@
           return ;
           } 
   
  -    if (/^libxalan.*\.so/)
  +    if ((!$win32 && (/^libxalan.*\.so/)) || 
  +        ($win32  && (/^xalantransformer.*\.lib/i)) )
           {
           $xalanlibpath = $File::Find::dir ;
           die $xalanlib = $_ ;
  @@ -125,7 +126,8 @@
           return ;
           } 
   
  -    if (/^libxerces.*\.so/)
  +    if ((!$win32 && (/^libxerces.*\.so/)) || 
  +        ($win32  && (/^xerces.*\.lib/i)) )
           {
           $xerceslibpath = $File::Find::dir ;
           die $xerceslib = $_ ;
  
  
  
  1.1.2.5   +255 -14   embperl/driver/Attic/epxalan.cpp
  
  Index: epxalan.cpp
  ===================================================================
  RCS file: /home/cvs/embperl/driver/Attic/epxalan.cpp,v
  retrieving revision 1.1.2.4
  retrieving revision 1.1.2.5
  diff -u -r1.1.2.4 -r1.1.2.5
  --- epxalan.cpp	2001/11/04 20:17:35	1.1.2.4
  +++ epxalan.cpp	2001/11/05 19:04:20	1.1.2.5
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epxalan.cpp,v 1.1.2.4 2001/11/04 20:17:35 richter Exp $
  +#   $Id: epxalan.cpp,v 1.1.2.5 2001/11/05 19:04:20 richter Exp $
   #
   ###################################################################################*/
   
  @@ -45,13 +45,225 @@
   extern "C"
   {
   
  +// Create a XalanTransformer.
  +XalanTransformer theXalanTransformer;
   
  -
   static int bInitDone = 0 ;
   
   
  +tProviderClass ProviderClassXalanXSL = 
  +    {   
  +    "text/*", 
  +    &ProviderXalanXSL_New, 
  +    NULL,
  +    &ProviderXalanXSL_GetContentPtr,
  +    &ProviderXalanXSL_FreeContent,
  +    } ;
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderXalanXSL_New      					            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Creates a new xalan sytlesheet provider and fills it with data from the hash pParam
  +*   The resulting provider is put into the cache structure
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem which holds the output of the provider
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               stylesheet  filename or provider for the
  +*                                           stylesheet 
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Erzeugt einen neue Provider f�r Xalan Sytlesheets. Der ein Zeiger
  +*   auf den resultierenden Provider wird in die Cachestrutr eingef�gt
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem welches die Ausgabe des Providers 
  +*                           speichert
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               stylesheet  dateiname oder provider f�r das
  +*                                           stylesheet 
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +int ProviderXalanXSL_New (/*in*/ req *              r,
  +                          /*in*/ tCacheItem *       pItem,
  +                          /*in*/ tProviderClass *   pProviderClass,
  +                          /*in*/ HV *               pParam)
  +
  +
  +    {
  +    int                 rc ;
  +    HV *                pStylesheetParam ;
  +    char *              sStylesheet ;
  +    tProviderXalanXSL * pNew = cache_malloc (r, sizeof(tProviderXalanXSL)) ;
  +    
  +    if (!pNew)
  +        return rcOutOfMemory ;
  +
  +    memset (pNew, 0, sizeof (*pNew)) ;
  +
  +    pNew -> Provider.pCache             = pItem ;
  +    pNew -> Provider.pProviderClass     = pItem -> pProviderClass ;
  +    pNew -> Provider.sOutputType        = pItem -> pProviderClass -> sOutputType ;
  +    
  +    GetHashValueStrOrHash (pParam, "stylesheet", &sStylesheet, &pStylesheetParam) ;
  +
  +    if (StylesheetParam)
  +        {
  +        sStylesheet = GetHashValueStr(pStylesheetParam
  +
  +
  +    tCacheItem * pFileCache = Cache_GetByKey (r, sStylesheet, NULL) ;
  +    if (!pFileCache)
  +        {
  +        if (sStylesheet)
  +            {
  +            pStylesheetParam = CreateHash (
  +                "provider", hashtsv, CreateHash (
  +                    "type", hashtstr, "file",
  +                    "filename", hashtstr, sStylesheet,
  +                    NULL),
  +                "cache", hashtint, 0,
  +                NULL) ;
  +            }
  +
  +        if (pStylesheetParam)
  +            {
  +            if ((rc = Cache_New (r, pStylesheetParam, pFileCache)) != ok)
  +                return rc ;
  +
  +            if ((rc = Cache_AddDependency (r, pItem, pFileCache)) != ok)
  +                return rc ;
  +        
  +            Cache_SetByKey (r, pFileCache, sStylesheet, NULL) ;
  +            }
  +        else
  +            {
  +            strcpy (r -> errdat1, "Xalan-XSL") ;
  +            strcpy (r -> errdat2, "stylesheet") ;
  +            return rcMissingParam ;
  +            }
  +
  +
  +    pItem -> pProvider = pNew ;
  +
  +    return ok ;
  +    }
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderXalanXSL_GetContentPtr  				            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Get the whole content from the provider. 
  +*   This gets the stylesheet and compiles it
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @param  pData           Returns the content
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Holt den gesamt Inhalt vom Provider.
  +*   Die Funktion holt sich das Stylesheet und kompiliert es
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @param  pData           Liefert den Inhalt
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +int ProviderXalanXSL_GetContentPtr     (/*in*/ req *            r,
  +                                        /*in*/ tProviderFile *  pProvider,
  +                                        /*in*/ void * *         pData)
  +
  +    {
  +    char * p ;
  +    STRLEN len ;
  +    SV *   pSource ;
  +    XalanCompiledStylesheet* pCompiledStylesheet = NULL ;
  +
  +    pFileCache = Cache_GetDependency(r, pProvider -> pItem, 0) ;
  +    if ((rc = Cache_GetContentSV (r, pFileCache, &pSource)) != ok)
  +        return rc ;
  +        
  +    // Our input streams...
  +    p   = SvPV (pSource, len) ;
  +    istrstream	theXMLStream(p, len);
  +
  +    if (!(pCompiledStylesheet = theXalanTransformer.compileStylesheet(theXMLStream))
  +      	{
  +	Cache_ReleaseContent (r, pFileCache) ;
  +        strncpy (r -> errdat1, "XSL compile", sizeof (r -> errdat1)) ;
  +	strncpy (r -> errdat2, theXalanTransformer.getLastError(), sizeof (r -> errdat2) - 2) ;
  +	return rcXalanError ;
  +	}
  +
  +    Cache_ReleaseContent (r, pFileCache) ;
  +
  +    *pData = pCompiledStylesheet ;
  +
  +    return ok ;
  +    }
  +
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
  +/* ProviderXalanXSL_FreeContent 		                            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Free the cached data
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Gibt die gecachten Daten frei
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +int Cache_FreeContent           (/*in*/ req *             r,
  +                                 /*in*/ tProvider *       pProvider)
  +
  +    {
  +    XalanCompiledStylesheet* pCompiledStylesheet = (XalanCompiledStylesheet*)pProvider -> pItem -> pData ;
  +    if (pCompiledStylesheet)
  +        theXalanTransformer.destroyStylesheet (pCompiledStylesheet) ;
  +
  +    return ok ;
  +    }
  +
  +
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
   /* iowrite                                                                  */
   /*                                                                          */
   /* output callback                                                          */
  @@ -161,24 +373,51 @@
   	XalanTransformer::initialize();
   	}
   
  -    // Create a XalanTransformer.
  -    XalanTransformer theXalanTransformer;
   
  -
       // Our input streams...
       p   = SvPV (pSource, len) ;
       istrstream	theXMLStream(p, len);
   
  +
  +
  +
  +    pParam = CreateHash (
  +        "provider",       hashtsv,  CreateHash (
  +            "type",       hashtstr, "xalan-cxsl",
  +            "stylesheet", hashtsv,  CreateHash (
  +                "provider", hashtsv, CreateHash (
  +                    "type", hashtstr, "file",
  +                    "filename", hashtstr, sStylesheet,
  +                    NULL),
  +                "cache", hashtint, 0,
  +                NULL),
  +        NULL) ;
   
  -    /*
  -    XalanCompiledStylesheet* compiledStylesheet = 0;
  -    compiledStylesheet = theXalanTransformer.compileStylesheet("foo.xsl");
  -    assert(compiledStylesheet!=0);
  -    theXalanTransformer.transform("foo1.xml", *compiledStylesheet, "foo1.out.");
  -    */
   
  -    pFileCache = Cache_GetByKey (r, sStylesheet, NULL) ;
  -    tCacheItem * pXSLCache  = Cache_GetByFileKey (r, sStylesheet, "Xalan-CXSL") ;
  +
  +
  +    tCacheItem * pXSLCache = Cache_GetByKey (r, sStylesheet, "xalan-cxsl", NULL) ;
  +    if (!pXSLCache)
  +        {
  +        tCacheItem * pFileCache = Cache_GetByKey (r, sStylesheet, NULL) ;
  +        if (!pFileCache)
  +            {
  +            if ((rc = Cache_New (r, NULL, &pFileCache)) != ok)
  +                return rc ;
  +
  +            if ((rc = ProviderFile_New (r, pFileCache, sStylesheet)) != ok)
  +                return rc ; 
  +            }
  +
  +        if ((rc = Cache_New (r, NULL, &pXSLCache)) != ok)
  +            return rc ;
  +
  +        if ((rc = ProviderXalanXSL_New (r, pXSLCache, NULL, pFileCache)) != ok)
  +            return rc ; 
  +
  +        Cache_SetByKey (r, pItem, sStylesheet, "xalan-cxsl", NULL) ;
  +        }
  +
       XalanCompiledStylesheet * pCompiledXSL ;
       
       if ((rc = Cache_GetContent (r, pXSLCache, &pCompiledXSL, &l)) != ok)
  @@ -189,11 +428,13 @@
       // Do the transform.
       int theResult = theXalanTransformer.transform(&theXMLStream, *pCompiledXSL, r, iowrite, NULL);
   
  +    Cache_ReleaseContent (r, pXSLCache) ;
  +
       if(theResult != 0)
   	{
   	strncpy (r -> errdat1, "XSLT", sizeof (r -> errdat1)) ;
   	strncpy (r -> errdat2, theXalanTransformer.getLastError(), sizeof (r -> errdat2) - 2) ;
  -	return 9999 ;
  +	return rcXalanError ;
   	}
   
       // Terminate Xalan.
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: embperl-cvs-unsubscribe@perl.apache.org
For additional commands, e-mail: embperl-cvs-help@perl.apache.org