More of pooling, mapquery.c

Hallgren Johan E jhhal at WMDATA.COM
Mon May 7 06:00:07 EDT 2007


Hello again,

 

I have made a test with the following code with extremely good
performance. I have only tested this specific call, but couldn't the
concept be implemented in other functions as well? As I see it, it will
implement the Connection pool between mapscript calls.

 

My added sections start with Johan START and ends with Johan END. 

 

int msQueryByAttributes(mapObj *map, int qlayer, char *qitem, char
*qstring, int mode)

{

  layerObj *lp;

  int status;

 

  /* Johan START */

  int bLayerWasOpen; 

  /* Johan START */

  

  int old_filtertype=-1;

  char *old_filterstring=NULL, *old_filteritem=NULL;

 

  rectObj searchrect;

 

  shapeObj shape;

 

  if(qlayer < 0 || qlayer >= map->numlayers) {

    msSetError(MS_MISCERR, "No query layer defined.",
"msQueryByAttributes()"); 

    return(MS_FAILURE);

  }

 

  lp = &(map->layers[qlayer]);

 

  /* free any previous search results, do now in case one of the
following tests fails */

  if(lp->resultcache) {

    if(lp->resultcache->results) free(lp->resultcache->results);

    free(lp->resultcache);

    lp->resultcache = NULL;

  }

 

  if(!msIsLayerQueryable(lp)) {

    msSetError(MS_QUERYERR, "Requested layer has no templates defined so
is not queryable.", "msQueryByAttributes()"); 

    return(MS_FAILURE);

  }

 

  if(!qstring) {

    msSetError(MS_QUERYERR, "No query expression defined.",
"msQueryByAttributes()"); 

    return(MS_FAILURE);

  }

 

  /* save any previously defined filter */

  if(lp->filter.string) {

    old_filtertype = lp->filter.type;

    old_filterstring = strdup(lp->filter.string);

    if(lp->filteritem) 

      old_filteritem = strdup(lp->filteritem);

  }

 

  /* apply the passed query parameters */

  if(qitem) 

    lp->filteritem = strdup(qitem);

  else

    lp->filteritem = NULL;

  msLoadExpressionString(&(lp->filter), qstring);

 

  msInitShape(&shape);

 

  /* open this layer */

      /* Johan START */

      //int bLayerWasOpen; 

      bLayerWasOpen = msLayerIsOpen(lp);

  if (!bLayerWasOpen)

  {

            status = msLayerOpen(lp);

            if(status != MS_SUCCESS) return(MS_FAILURE);

      }

      //status = msLayerOpen(lp);

 // if(status != MS_SUCCESS) return(MS_FAILURE);

      /*Johan END*/

  

  /* build item list (no annotation) */

  status = msLayerWhichItems(lp, MS_TRUE, MS_FALSE, NULL);

  if(status != MS_SUCCESS) return(MS_FAILURE);

 

  /* identify target shapes */

  searchrect = map->extent;

#ifdef USE_PROJ  

  if(lp->project && msProjectionsDiffer(&(lp->projection),
&(map->projection)))  

    msProjectRect(&(map->projection), &(lp->projection), &searchrect);
/* project the searchrect to source coords */

  else

    lp->project = MS_FALSE;

#endif

  status = msLayerWhichShapes(lp, searchrect);

  if(status == MS_DONE) { /* no overlap */

    msLayerClose(lp);

    msSetError(MS_NOTFOUND, "No matching record(s) found, layer and area
of interest do not overlap.", "msQueryByAttributes()");

    return(MS_FAILURE);

  } else if(status != MS_SUCCESS) {

    msLayerClose(lp);

    return(MS_FAILURE);

  }

 

  lp->resultcache = (resultCacheObj *)malloc(sizeof(resultCacheObj)); /*
allocate and initialize the result cache */

  lp->resultcache->results = NULL;

  lp->resultcache->numresults = lp->resultcache->cachesize = 0;

  lp->resultcache->bounds.minx = lp->resultcache->bounds.miny =
lp->resultcache->bounds.maxx = lp->resultcache->bounds.maxy = -1;

  

  while((status = msLayerNextShape(lp, &shape)) == MS_SUCCESS) { /* step
through the shapes */

 

    shape.classindex = msShapeGetClass(lp, &shape, map->scale);    

    if(!(lp->template) && ((shape.classindex == -1) ||
(lp->class[shape.classindex].status == MS_OFF))) { /* not a valid shape
*/

      msFreeShape(&shape);

      continue;

    }

    

    if(!(lp->template) && !(lp->class[shape.classindex].template)) { /*
no valid template */

      msFreeShape(&shape);

      continue;

    }

 

#ifdef USE_PROJ

    if(lp->project && msProjectionsDiffer(&(lp->projection),
&(map->projection)))

      msProjectShape(&(lp->projection), &(map->projection), &shape);

    else

      lp->project = MS_FALSE;

#endif

 

    addResult(lp->resultcache, shape.classindex, shape.index,
shape.tileindex);

    

    if(lp->resultcache->numresults == 1)

      lp->resultcache->bounds = shape.bounds;

    else

      msMergeRect(&(lp->resultcache->bounds), &shape.bounds);

    

    msFreeShape(&shape);

 

    if(mode == MS_SINGLE) { /* no need to look any further */

      status = MS_DONE;

      break;

    }

  }

 

  if(status != MS_DONE) return(MS_FAILURE);

 

  /* the FILTER set was just temporary, clean up here */

  freeExpression(&(lp->filter));

  if(lp->filteritem) {

    free(lp->filteritem);

    lp->filteritem = NULL;

    lp->filteritemindex = -1;

  }

  

  /* restore any previously defined filter */

  if(old_filterstring) {

    lp->filter.type = old_filtertype;

    lp->filter.string = strdup(old_filterstring);

    free(old_filterstring);

    if(old_filteritem) { 

      lp->filteritem = strdup(old_filteritem);

      free(old_filteritem);

    }

  }

 

      /*Johan START*/

  if (!bLayerWasOpen)

  {

            msLayerClose(lp);

  }

      //msLayerClose(lp);

      /*Johan END*/

 

 

  /* was anything found?  */

  if(lp->resultcache && lp->resultcache->numresults > 0)

    return(MS_SUCCESS);

 

  msSetError(MS_NOTFOUND, "No matching record(s) found.",
"msQueryByAttributes()"); 

  return(MS_FAILURE);

}

 

 

/Ugh


___________________________________


Johan Hallgren


 

WM-data a LogicaCMG company 

Pelle Bergs backe 3

Box 1938, 791 19 Falun

Tel: 023-547 46 (int: +46-2354746)

Mobil: 070-588 44 28 (int: +46-705884428)

johan.e.hallgren at wmdata.com
<BLOCKED::mailto:johan.e.hallgren at wmdata.com> 

http://www.wmdata.se
<BLOCKED::/exchweb/bin/redir.asp?URL=http://www.wmdata.se/> 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/mapserver-dev/attachments/20070507/56020111/attachment.html


More information about the mapserver-dev mailing list