/* ** Which column number in the .DBF file does the item correspond to */ int msDBFGetItemIndex(DBFHandle dbffile, char *name) { int i; int fWidth,fnDecimals; /* field width and number of decimals */ char fName[32]; /* field name */ if(!name) { #if MAPSHAPEERROR msSetError(MS_MISCERR, "NULL item name passed.", "msGetItemIndex()"); #endif return(-1); } /* does name exist as a field? */ for(i=0;i<msDBFGetFieldCount(dbffile);i++) { msDBFGetFieldInfo(dbffile,i,fName,&fWidth,&fnDecimals); if(m_strcasecmp(name,fName) == 0) /* found it */ return(i); } #if MAPSHAPEERROR msSetError(MS_DBFERR, "Item '%s' not found.", "msDBFGetItemIndex()",name); #endif return(-1); /* item not found */ }
int msDBFJoinConnect(layerObj *layer, joinObj *join) { int i; char szPath[MS_MAXPATHLEN]; msDBFJoinInfo *joininfo; if(join->joininfo) return(MS_SUCCESS); /* already open */ if ( msCheckParentPointer(layer->map,"map")==MS_FAILURE ) return MS_FAILURE; /* allocate a msDBFJoinInfo struct */ joininfo = (msDBFJoinInfo *) malloc(sizeof(msDBFJoinInfo)); if(!joininfo) { msSetError(MS_MEMERR, "Error allocating XBase table info structure.", "msDBFJoinConnect()"); return(MS_FAILURE); } /* initialize any members that won't get set later on in this function */ joininfo->target = NULL; joininfo->nextrecord = 0; join->joininfo = joininfo; /* open the XBase file */ if((joininfo->hDBF = msDBFOpen( msBuildPath3(szPath, layer->map->mappath, layer->map->shapepath, join->table), "rb" )) == NULL) { if((joininfo->hDBF = msDBFOpen( msBuildPath(szPath, layer->map->mappath, join->table), "rb" )) == NULL) { msSetError(MS_IOERR, "(%s)", "msDBFJoinConnect()", join->table); return(MS_FAILURE); } } /* get "to" item index */ if((joininfo->toindex = msDBFGetItemIndex(joininfo->hDBF, join->to)) == -1) { msSetError(MS_DBFERR, "Item %s not found in table %s.", "msDBFJoinConnect()", join->to, join->table); return(MS_FAILURE); } /* get "from" item index */ for(i=0; i<layer->numitems; i++) { if(strcasecmp(layer->items[i],join->from) == 0) { /* found it */ joininfo->fromindex = i; break; } } if(i == layer->numitems) { msSetError(MS_JOINERR, "Item %s not found in layer %s.", "msDBFJoinConnect()", join->from, layer->name); return(MS_FAILURE); } /* finally store away the item names in the XBase table */ join->numitems = msDBFGetFieldCount(joininfo->hDBF); join->items = msDBFGetItems(joininfo->hDBF); if(!join->items) return(MS_FAILURE); return(MS_SUCCESS); }