[Zope] Storing published objects (?)

Samir Mishra SamirMishra@cbuae.gov.ae
Thu, 29 May 2003 10:33:50 +0400


Thanks Dylan. I'll try this out. It 'looks' right for what I'm looking to
do. Now to figure out the details...

I'll have an umbrella script somewhere, triggered by an event, not sure
what, to do the updates.

Another suggestion made by 'zerkani_user_list' (name on email) is that I
store the data to be published in a database, like a summary table in a DW,
rather than the HTML code. I am looking into this approach as an
alternative, but I feel storing the HTML is more suitable to the business
logic in this instance. Ultimately it'll come down to a combination of
suitability & convenience.

Thanks to everyone.

Regards,
Samir.


-----Original Message-----
From: Dylan Reinhardt [mailto:zope@dylanreinhardt.com]
Sent: Wednesday, May 28, 2003 19:05
To: Samir Mishra
Cc: zope@zope.org
Subject: RE: [Zope] Storing published objects (?)


What you're describing could be done fairly easily with a Python
product.

------

# untested, top-of-head, etc.


class DeepCache(REGULAR_MIXINS):

    def __init__(self, id, title, object_path):
        self.id = id
        self.title = title
        self.obj_path = object_path
        self.results = self.refresh()

    index_html = DTMLFile('index', globals())
    # points to a dtml file that consists of:
    # <dtml-var view>

    def view(self):
        return self.results

    def refresh(self):
        self.results = self.restrictedTraverse(object_path)

------


That's an incomplete product (no security, no constructor method, etc),
but it's a decent sketch of a general-purpose object that will allow you
to cache the output of any object you can put in the ZMI.  This, of
course, assumes that you want caching refreshed manually...
automatically detecting when underlying data has changed is quite a bit
more difficult and must be done in a target-specific way.

If you're not updating too often, an approach like this should work
fine... if your objects change with any frequency, you'll want to make
sure to pack the ZODB pretty aggressively.

HTH,

Dylan

    



On Tue, 2003-05-27 at 23:56, Samir Mishra wrote:
> Jamie,
> 
> Thanks for the response. I think you misunderstood my question. I'm not
> looking to implement a cache manager.
> 
> What I'm looking to do is, not store the page for a few minutes/hours, but
> months. Or longer. I also want external apps to have access to the
rendered
> page. 
> 
> I have to generate weekly financial reports. The data for each report is
> from NUMEROUS sources. So the query, formatting etc. are complex and time
> consuming. The weekly report gets updated over the duration of the month,
> but at the end of the month the report is frozen. So once the report is
> published, it will almost NEVER be changed. We may publish corrections to
> the report, but these will be labelled as corrections, and will not
replace
> the originally published document. 
> 
> I'd rather not have to re-create the report every time it's viewed. I'd
> prefer to save the HTML representation of the report as a BLOB in a
database
> (and later extend this to PDFs of the same). And that's what I'm hoping to
> do - assign the results of a page rendered by Zope, i.e., all of the HTML
> generated, to a binary column in a DB.
> 
> OT: I believe Berkeley DB is extremely fast for this sort of
> indexing/retrieval. Anyone have any experience?
> 
> Hope that's clearer.
> 
> Thanks again.
> 
> Samir.
> 
> -----Original Message-----
> From: Jamie Heilman [mailto:jamie@audible.transient.net]
> Sent: Wednesday, May 28, 2003 08:25
> To: Samir Mishra
> Cc: zope@zope.org
> Subject: Re: [Zope] Storing published objects (?)
> 
> 
> Samir Mishra wrote:
> > The underlying SQL queries are complex, the data doesn't change often,
and
> I
> > think this may be the best way to lighten the burden on the DB.
> 
> Hmmm, well generally this is what CacheManagers do, but storing the
> results in a database would be a new one (to date I've seen managers
> that use memory, the filesystem, and just add HTTP headers to the
> response).  While its entirely likely you could achieve what you want
> using a memory cache, if the data is sufficiently large it may be not
> be a good idea, and its certainly not persistent accross
> zope-restarts.  Implementing a cache manager that stored its data in a
> RDBMS shouldn't be impossible, take a look at the Cache & CacheManager
> interfaces in OFS/Cache.py -- and I'd suggest using the updated code
> I've prepared in http://collector.zope.org/Zope/911 as its cleaner
> than the existing stuff.