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