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