dbLink: backward link tracking

This commit is contained in:
Michael Davidsaver
2015-03-24 14:18:11 -04:00
parent b8a7da18d2
commit 8ce0ba1e54
3 changed files with 11 additions and 0 deletions
+6
View File
@@ -92,6 +92,12 @@
interest(4)
extra("ELLLIST mlis")
}
field(BKLNK,DBF_NOACCESS) {
prompt("Backwards link tracking")
special(SPC_NOMOD)
interest(4)
extra("ELLLIST bklnk")
}
field(DISP,DBF_UCHAR) {
prompt("Disable putField")
}
+3
View File
@@ -141,6 +141,7 @@ static long dbDbInitLink(struct link *plink, short dbfType)
pdbAddr = dbCalloc(1, sizeof(struct dbAddr));
*pdbAddr = dbaddr; /* structure copy */
plink->value.pv_link.pvt = pdbAddr;
ellAdd(&dbaddr.precord->bklnk, &plink->value.pv_link.backlinknode);
/* merging into the same lockset is deferred to the caller.
* cf. initPVLinks()
*/
@@ -154,6 +155,7 @@ static void dbDbRemoveLink(dbLocker *locker, struct dbCommon *prec, struct link
plink->value.pv_link.getCvt = 0;
plink->value.pv_link.lastGetdbrType = 0;
plink->type = PV_LINK;
ellDelete(&pdbAddr->precord->bklnk, &plink->value.pv_link.backlinknode);
dbLockSetSplit(locker, prec, pdbAddr->precord);
free(pdbAddr);
}
@@ -438,6 +440,7 @@ void dbAddLink(dbLocker *locker, struct dbCommon *precord, struct link *plink, s
plink->type = DB_LINK;
plink->value.pv_link.pvt = ptargetaddr;
ellAdd(&ptargetaddr->precord->bklnk, &plink->value.pv_link.backlinknode);
/* target record is already locked in dbPutFieldLink() */
dbLockSetMerge(locker, plink->value.pv_link.precord, ptargetaddr->precord);
+2
View File
@@ -17,6 +17,7 @@
#define INC_link_H
#include "dbDefs.h"
#include "ellLib.h"
#include "shareLib.h"
#ifdef __cplusplus
@@ -79,6 +80,7 @@ struct dbCommon;
struct pvlet;
struct pv_link {
ELLNODE backlinknode;
char *pvname; /* pvname link points to */
struct dbCommon *precord; /* Address of record owning link */
void *pvt; /* CA or DB private */