| 436 | } |
| 437 | |
| 438 | int msCSVJoinNext(joinObj *join) |
| 439 | { |
| 440 | int i,j; |
| 441 | msCSVJoinInfo *joininfo = join->joininfo; |
| 442 | |
| 443 | if(!joininfo) { |
| 444 | msSetError(MS_JOINERR, "Join connection has not be created.", "msCSVJoinNext()"); |
| 445 | return(MS_FAILURE); |
| 446 | } |
| 447 | |
| 448 | /* clear any old data */ |
| 449 | if(join->values) { |
| 450 | msFreeCharArray(join->values, join->numitems); |
| 451 | join->values = NULL; |
| 452 | } |
| 453 | |
| 454 | for(i=joininfo->nextrow; i<joininfo->numrows; i++) { /* find a match */ |
| 455 | if(strcmp(joininfo->target, joininfo->rows[i][joininfo->toindex]) == 0) break; |
| 456 | } |
| 457 | |
| 458 | if((join->values = (char ** )malloc(sizeof(char *)*join->numitems)) == NULL) { |
| 459 | msSetError(MS_MEMERR, NULL, "msCSVJoinNext()"); |
| 460 | return(MS_FAILURE); |
| 461 | } |
| 462 | |
| 463 | if(i == joininfo->numrows) { /* unable to do the join */ |
| 464 | for(j=0; j<join->numitems; j++) |
| 465 | join->values[j] = msStrdup("\0"); /* intialize to zero length strings */ |
| 466 | |
| 467 | joininfo->nextrow = joininfo->numrows; |
| 468 | return(MS_DONE); |
| 469 | } |
| 470 | |
| 471 | for(j=0; j<join->numitems; j++) |
| 472 | join->values[j] = msStrdup(joininfo->rows[i][j]); |
| 473 | |
| 474 | joininfo->nextrow = i+1; /* so we know where to start looking next time through */ |
| 475 | |
| 476 | return(MS_SUCCESS); |
| 477 | } |
| 478 | |
| 479 | int msCSVJoinClose(joinObj *join) |
| 480 | { |
no test coverage detected