<HTML dir=ltr><HEAD><TITLE>Re: More of pooling, mapquery.c</TITLE>
<META http-equiv=Content-Type content="text/html; charset=unicode">
<META content="MSHTML 6.00.6000.16414" name=GENERATOR></HEAD>
<BODY>
<DIV id=idOWAReplyText56598 dir=ltr>
<DIV dir=ltr><FONT face=Arial color=#000000 size=2>Thanks again Tamas (and other),</FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT face=Arial color=#000000 size=2>I have missed that piece. It could be the missing part.</FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT face=Arial size=2>I will try it tomorrow.</FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT face=Arial size=2>Thanks again,</FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2>Johan</FONT></DIV>
<DIV dir=ltr><FONT face=Arial color=#000000 size=2><SPAN lang=SV style="FONT-SIZE: 10pt"><FONT face=Arial>___________________________________</FONT></SPAN></DIV></DIV>
<DIV id=idSignature30716 dir=ltr>
<DIV>
<DIV dir=ltr align=left>
<H3 style="MARGIN: 0cm 0cm 0pt"><SPAN lang=SV><FONT face=Arial size=3>Johan Hallgren</FONT></SPAN></H3>
<DIV class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=SV></SPAN>&nbsp;</DIV>
<DIV class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=SV style="FONT-SIZE: 9pt; FONT-FAMILY: Arial">WM-data</SPAN></DIV>
<DIV class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=SV style="FONT-SIZE: 9pt; FONT-FAMILY: Arial">Pelle Bergs backe 3</SPAN></DIV>
<DIV class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=SV style="FONT-SIZE: 9pt; FONT-FAMILY: Arial"></SPAN><SPAN lang=SV style="FONT-SIZE: 9pt; FONT-FAMILY: Arial">Box 1938,&nbsp;791 19 Falun</SPAN></DIV>
<DIV class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=SV style="FONT-SIZE: 9pt; FONT-FAMILY: Arial">
<DIV class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=SV style="FONT-SIZE: 9pt; FONT-FAMILY: Arial; mso-ansi-language: SV; mso-no-proof: yes">Tel (och mobil): 023-547&nbsp;46 (int: +46-2354746)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-no-proof: yes"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></DIV></SPAN><SPAN lang=SV style="FONT-SIZE: 9pt; FONT-FAMILY: Arial"><U><FONT color=#0000ff>johan.e.hallgren</FONT></U><A href="mailto:johan.e.hallgren@wmdata.com" target=_blank>@wmdata.com</A></SPAN></DIV>
<DIV class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=SV style="FONT-SIZE: 9pt; FONT-FAMILY: Arial"><A href="https://webaccess.wmdata.com/exchweb/bin/redir.asp?URL=http://www.wmdata.se/" target=_blank>http://www.wmdata.se</A></SPAN></DIV></DIV></FONT></DIV></DIV>
<DIV dir=ltr><BR>
<HR tabIndex=-1>
<FONT face=Tahoma size=2><B>Från:</B> Tamas Szekeres [mailto:szekerest@gmail.com]<BR><B>Skickat:</B> må 2007-05-07 14:17<BR><B>Till:</B> Hallgren Johan E<BR><B>Kopia:</B> MAPSERVER-DEV@lists.umn.edu<BR><B>Ämne:</B> Re: More of pooling, mapquery.c<BR></FONT><BR></DIV>
<DIV>
<P><FONT size=2>Did you test with<BR><BR>PROCESSING CLOSE_CONNECTION=DEFER option with your SDE layer?<BR><BR>Best regards,<BR><BR>Tamas<BR><BR><BR>2007/5/7, Hallgren Johan E &lt;jhhal@wmdata.com&gt;:<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; Hello again,<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; I have made a test with the following code with extremely good performance.<BR>&gt; I have only tested this specific call, but couldn't the concept be<BR>&gt; implemented in other functions as well? As I see it, it will implement the<BR>&gt; Connection pool between mapscript calls.<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; My added sections start with Johan START and ends with Johan END.<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; int msQueryByAttributes(mapObj *map, int qlayer, char *qitem, char *qstring,<BR>&gt; int mode)<BR>&gt;<BR>&gt; {<BR>&gt;<BR>&gt;&nbsp;&nbsp; layerObj *lp;<BR>&gt;<BR>&gt;&nbsp;&nbsp; int status;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; /* Johan START */<BR>&gt;<BR>&gt;&nbsp;&nbsp; int bLayerWasOpen;<BR>&gt;<BR>&gt;&nbsp;&nbsp; /* Johan START */<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; int old_filtertype=-1;<BR>&gt;<BR>&gt;&nbsp;&nbsp; char *old_filterstring=NULL, *old_filteritem=NULL;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; rectObj searchrect;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; shapeObj shape;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(qlayer &lt; 0 || qlayer &gt;= map-&gt;numlayers) {<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; msSetError(MS_MISCERR, "No query layer defined.",<BR>&gt; "msQueryByAttributes()");<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return(MS_FAILURE);<BR>&gt;<BR>&gt;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; lp = &amp;(map-&gt;layers[qlayer]);<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; /* free any previous search results, do now in case one of the following<BR>&gt; tests fails */<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(lp-&gt;resultcache) {<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if(lp-&gt;resultcache-&gt;results) free(lp-&gt;resultcache-&gt;results);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; free(lp-&gt;resultcache);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; lp-&gt;resultcache = NULL;<BR>&gt;<BR>&gt;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(!msIsLayerQueryable(lp)) {<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; msSetError(MS_QUERYERR, "Requested layer has no templates defined so is<BR>&gt; not queryable.", "msQueryByAttributes()");<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return(MS_FAILURE);<BR>&gt;<BR>&gt;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(!qstring) {<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; msSetError(MS_QUERYERR, "No query expression defined.",<BR>&gt; "msQueryByAttributes()");<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return(MS_FAILURE);<BR>&gt;<BR>&gt;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; /* save any previously defined filter */<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(lp-&gt;filter.string) {<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; old_filtertype = lp-&gt;filter.type;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; old_filterstring = strdup(lp-&gt;filter.string);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if(lp-&gt;filteritem)<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old_filteritem = strdup(lp-&gt;filteritem);<BR>&gt;<BR>&gt;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; /* apply the passed query parameters */<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(qitem)<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; lp-&gt;filteritem = strdup(qitem);<BR>&gt;<BR>&gt;&nbsp;&nbsp; else<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; lp-&gt;filteritem = NULL;<BR>&gt;<BR>&gt;&nbsp;&nbsp; msLoadExpressionString(&amp;(lp-&gt;filter), qstring);<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; msInitShape(&amp;shape);<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; /* open this layer */<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Johan START */<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //int bLayerWasOpen;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bLayerWasOpen = msLayerIsOpen(lp);<BR>&gt;<BR>&gt;&nbsp;&nbsp; if (!bLayerWasOpen)<BR>&gt;<BR>&gt;&nbsp;&nbsp; {<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; status = msLayerOpen(lp);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(status != MS_SUCCESS) return(MS_FAILURE);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //status = msLayerOpen(lp);<BR>&gt;<BR>&gt;&nbsp; // if(status != MS_SUCCESS) return(MS_FAILURE);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*Johan END*/<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; /* build item list (no annotation) */<BR>&gt;<BR>&gt;&nbsp;&nbsp; status = msLayerWhichItems(lp, MS_TRUE, MS_FALSE, NULL);<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(status != MS_SUCCESS) return(MS_FAILURE);<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; /* identify target shapes */<BR>&gt;<BR>&gt;&nbsp;&nbsp; searchrect = map-&gt;extent;<BR>&gt;<BR>&gt; #ifdef USE_PROJ<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(lp-&gt;project &amp;&amp; msProjectionsDiffer(&amp;(lp-&gt;projection),<BR>&gt; &amp;(map-&gt;projection)))<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; msProjectRect(&amp;(map-&gt;projection), &amp;(lp-&gt;projection),<BR>&gt; &amp;searchrect); /* project the searchrect to source coords */<BR>&gt;<BR>&gt;&nbsp;&nbsp; else<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; lp-&gt;project = MS_FALSE;<BR>&gt;<BR>&gt; #endif<BR>&gt;<BR>&gt;&nbsp;&nbsp; status = msLayerWhichShapes(lp, searchrect);<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(status == MS_DONE) { /* no overlap */<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; msLayerClose(lp);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; msSetError(MS_NOTFOUND, "No matching record(s) found, layer and area of<BR>&gt; interest do not overlap.", "msQueryByAttributes()");<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return(MS_FAILURE);<BR>&gt;<BR>&gt;&nbsp;&nbsp; } else if(status != MS_SUCCESS) {<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; msLayerClose(lp);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return(MS_FAILURE);<BR>&gt;<BR>&gt;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; lp-&gt;resultcache = (resultCacheObj *)malloc(sizeof(resultCacheObj)); /*<BR>&gt; allocate and initialize the result cache */<BR>&gt;<BR>&gt;&nbsp;&nbsp; lp-&gt;resultcache-&gt;results = NULL;<BR>&gt;<BR>&gt;&nbsp;&nbsp; lp-&gt;resultcache-&gt;numresults = lp-&gt;resultcache-&gt;cachesize = 0;<BR>&gt;<BR>&gt;&nbsp;&nbsp; lp-&gt;resultcache-&gt;bounds.minx = lp-&gt;resultcache-&gt;bounds.miny =<BR>&gt; lp-&gt;resultcache-&gt;bounds.maxx = lp-&gt;resultcache-&gt;bounds.maxy = -1;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; while((status = msLayerNextShape(lp, &amp;shape)) == MS_SUCCESS) { /* step<BR>&gt; through the shapes */<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; shape.classindex = msShapeGetClass(lp, &amp;shape, map-&gt;scale);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if(!(lp-&gt;template) &amp;&amp; ((shape.classindex == -1) ||<BR>&gt; (lp-&gt;class[shape.classindex].status == MS_OFF))) { /* not a valid shape */<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msFreeShape(&amp;shape);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if(!(lp-&gt;template) &amp;&amp; !(lp-&gt;class[shape.classindex].template)) { /* no<BR>&gt; valid template */<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msFreeShape(&amp;shape);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; #ifdef USE_PROJ<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if(lp-&gt;project &amp;&amp;<BR>&gt; msProjectionsDiffer(&amp;(lp-&gt;projection), &amp;(map-&gt;projection)))<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msProjectShape(&amp;(lp-&gt;projection), &amp;(map-&gt;projection),<BR>&gt; &amp;shape);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lp-&gt;project = MS_FALSE;<BR>&gt;<BR>&gt; #endif<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; addResult(lp-&gt;resultcache, shape.classindex, shape.index,<BR>&gt; shape.tileindex);<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if(lp-&gt;resultcache-&gt;numresults == 1)<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lp-&gt;resultcache-&gt;bounds = shape.bounds;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msMergeRect(&amp;(lp-&gt;resultcache-&gt;bounds),<BR>&gt; &amp;shape.bounds);<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; msFreeShape(&amp;shape);<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if(mode == MS_SINGLE) { /* no need to look any further */<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; status = MS_DONE;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(status != MS_DONE) return(MS_FAILURE);<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; /* the FILTER set was just temporary, clean up here */<BR>&gt;<BR>&gt;&nbsp;&nbsp; freeExpression(&amp;(lp-&gt;filter));<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(lp-&gt;filteritem) {<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; free(lp-&gt;filteritem);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; lp-&gt;filteritem = NULL;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; lp-&gt;filteritemindex = -1;<BR>&gt;<BR>&gt;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; /* restore any previously defined filter */<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(old_filterstring) {<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; lp-&gt;filter.type = old_filtertype;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; lp-&gt;filter.string = strdup(old_filterstring);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; free(old_filterstring);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if(old_filteritem) {<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lp-&gt;filteritem = strdup(old_filteritem);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(old_filteritem);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*Johan START*/<BR>&gt;<BR>&gt;&nbsp;&nbsp; if (!bLayerWasOpen)<BR>&gt;<BR>&gt;&nbsp;&nbsp; {<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msLayerClose(lp);<BR>&gt;<BR>&gt;&nbsp;&nbsp; }<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //msLayerClose(lp);<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*Johan END*/<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; /* was anything found?&nbsp; */<BR>&gt;<BR>&gt;&nbsp;&nbsp; if(lp-&gt;resultcache &amp;&amp; lp-&gt;resultcache-&gt;numresults &gt; 0)<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return(MS_SUCCESS);<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp; msSetError(MS_NOTFOUND, "No matching record(s) found.",<BR>&gt; "msQueryByAttributes()");<BR>&gt;<BR>&gt;&nbsp;&nbsp; return(MS_FAILURE);<BR>&gt;<BR>&gt; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; /Ugh<BR>&gt; ___________________________________<BR>&gt; Johan Hallgren<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; WM-data a LogicaCMG company<BR>&gt;<BR>&gt;<BR>&gt; Pelle Bergs backe 3<BR>&gt;<BR>&gt;<BR>&gt; Box 1938, 791 19 Falun<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; Tel: 023-547 46 (int: +46-2354746)<BR>&gt;<BR>&gt; Mobil: 070-588 44 28 (int: +46-705884428)<BR>&gt;<BR>&gt;<BR>&gt; johan.e.hallgren@wmdata.com<BR>&gt;<BR>&gt;<BR>&gt; <A href="http://www.wmdata.se/">http://www.wmdata.se</A><BR>&gt;<BR>&gt;<BR></FONT></P></DIV></BODY></HTML>