[postgis-users] How/where does postgis hook a callback to free	cached geos structures?
    Stephen Woodbridge 
    woodbri at swoodbridge.com
       
    Sun Apr 21 12:03:16 PDT 2013
    
    
  
Hi Mark,
I'm trying to rewrite the wrappers for the pagc address standardizer 
such that I can create and cache the standardizer obj in a per query 
cache. I think the following code modeled after GetGeomCache will do 
what I need. The problem I'm having is that I need to somehow hook the 
query shutdown code with a callback that will allow me to free the 
standardizer.
void FreeStdCache(StdCache * cache)
{
   // free the cached objects
}
StdCache *GetStdCache(FunctionCallInfoData *fcinfo)
{
   MemoryContext old_context;
   StdCache *cache = fcinfo->flinfo->fn_extra;
   if (! cache) {
     old_context = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt);
     cache = palloc(sizeof(StdCache));
     MemoryContextSwitchTo(old_context);
     cache->std = std_init();
     fcinfo->flinfo->fn_extra = cache;
     // ########## not sure how to do the following #############
     ExprContext *econtext = ?????;
     RegisterExprContextCallback(econtext, FreeStdCache, cache);
   }
   return cache;
}
So my function is not an SRF. I would get called like:
select * from standardize_address(
   'lexicon', 'gazeteer', 'rules',
   '123 main st', 'boston ma 02001');
as a single request where we would construct the standardizer and then 
free it. But in a query like the following, we would construct it, cache 
it for each record, and free is when query shutdowns.
select (std).* from (
   select standardize_address('lexicon', 'gazeteer', 'rules', micro, 
macro) as std from table_to_standardize) as foo;
I'm not sure if I can use RegisterExprContextCallback() to do this or of 
there is a better way. And not sure how to get econtext? I think that 
might only be available for SRF functions.
I saw Mark's inquiry here:
http://postgresql.1045698.n5.nabble.com/Any-advice-about-function-caching-td1936551.html
but could not find the code that registers the callback in postgis.
Here is a similar post:
http://web.archiveorange.com/archive/v/alpsnw9p7b8CWMh7hBPj
But neither have an example of how the issue was resolved. So a little 
help or pointer would be appreciated.
Thanks,
   -Steve
    
    
More information about the postgis-users
mailing list