| 252 | } |
| 253 | |
| 254 | int msDBFJoinNext(joinObj *join) |
| 255 | { |
| 256 | int i, n; |
| 257 | msDBFJoinInfo *joininfo = join->joininfo; |
| 258 | |
| 259 | if(!joininfo) { |
| 260 | msSetError(MS_JOINERR, "Join connection has not be created.", "msDBFJoinNext()"); |
| 261 | return(MS_FAILURE); |
| 262 | } |
| 263 | |
| 264 | if(!joininfo->target) { |
| 265 | msSetError(MS_JOINERR, "No target specified, run msDBFJoinPrepare() first.", "msDBFJoinNext()"); |
| 266 | return(MS_FAILURE); |
| 267 | } |
| 268 | |
| 269 | /* clear any old data */ |
| 270 | if(join->values) { |
| 271 | msFreeCharArray(join->values, join->numitems); |
| 272 | join->values = NULL; |
| 273 | } |
| 274 | |
| 275 | n = msDBFGetRecordCount(joininfo->hDBF); |
| 276 | |
| 277 | for(i=joininfo->nextrecord; i<n; i++) { /* find a match */ |
| 278 | if(strcmp(joininfo->target, msDBFReadStringAttribute(joininfo->hDBF, i, joininfo->toindex)) == 0) break; |
| 279 | } |
| 280 | |
| 281 | if(i == n) { /* unable to do the join */ |
| 282 | if((join->values = (char **)malloc(sizeof(char *)*join->numitems)) == NULL) { |
| 283 | msSetError(MS_MEMERR, NULL, "msDBFJoinNext()"); |
| 284 | return(MS_FAILURE); |
| 285 | } |
| 286 | for(i=0; i<join->numitems; i++) |
| 287 | join->values[i] = msStrdup("\0"); /* intialize to zero length strings */ |
| 288 | |
| 289 | joininfo->nextrecord = n; |
| 290 | return(MS_DONE); |
| 291 | } |
| 292 | |
| 293 | if((join->values = msDBFGetValues(joininfo->hDBF,i)) == NULL) |
| 294 | return(MS_FAILURE); |
| 295 | |
| 296 | joininfo->nextrecord = i+1; /* so we know where to start looking next time through */ |
| 297 | |
| 298 | return(MS_SUCCESS); |
| 299 | } |
| 300 | |
| 301 | int msDBFJoinClose(joinObj *join) |
| 302 | { |
no test coverage detected