diff --git a/modules/database/src/ioc/dbStatic/dbStaticLib.c b/modules/database/src/ioc/dbStatic/dbStaticLib.c index fda3cbf51..d5e35e3ea 100644 --- a/modules/database/src/ioc/dbStatic/dbStaticLib.c +++ b/modules/database/src/ioc/dbStatic/dbStaticLib.c @@ -1478,11 +1478,48 @@ long dbDeleteAliases(DBENTRY *pdbentry) return 0; } +static long dbDeleteRecordLinks(dbRecordType *rtyp, struct dbCommon *prec) +{ + short i; + + for (i=0; ino_links; i++) { + dbFldDes *pflddes = rtyp->papFldDes[rtyp->link_ind[i]]; + DBLINK *plink = (DBLINK *)(((char *)prec) + pflddes->offset); + + // TODO: How to handle different link types? + + // switch (plink->type) { + // /* constantStr is allowed to remain NULL if plink->text==NULL + // * constantStr==NULL has special meaning in recGblInitConstantLink() + // */ + // case CONSTANT: plink->value.constantStr = NULL; break; + // case PV_LINK: plink->value.pv_link.pvname = callocMustSucceed(1, 1, "init PV_LINK"); break; + // case JSON_LINK: plink->value.json.string = pNullString; break; + // case VME_IO: plink->value.vmeio.parm = pNullString; break; + // case CAMAC_IO: plink->value.camacio.parm = pNullString; break; + // case AB_IO: plink->value.abio.parm = pNullString; break; + // case GPIB_IO: plink->value.gpibio.parm = pNullString; break; + // case BITBUS_IO: plink->value.bitbusio.parm = pNullString; break; + // case INST_IO: plink->value.instio.string = pNullString; break; + // case BBGPIB_IO: plink->value.bbgpibio.parm = pNullString; break; + // case VXI_IO: plink->value.vxiio.parm = pNullString; break; + // } + + if(!plink->text) + continue; + + free(plink->text); + plink->text = NULL; + } + return 0; +} + long dbDeleteRecord(DBENTRY *pdbentry) { dbBase *pdbbase = pdbentry->pdbbase; dbRecordType *precordType = pdbentry->precordType; dbRecordNode *precnode = pdbentry->precnode; + struct dbCommon *prec = pdbentry->precnode->precord; ELLLIST *preclist; long status; @@ -1493,6 +1530,7 @@ long dbDeleteRecord(DBENTRY *pdbentry) preclist = &precordType->recList; ellDelete(preclist, &precnode->node); dbPvdDelete(pdbbase, precnode); + dbDeleteRecordLinks(precordType, prec); while (!dbFirstInfo(pdbentry)) { dbDeleteInfo(pdbentry); }