From 01d2448b34cf491f7edbd7bb2ed179c512158523 Mon Sep 17 00:00:00 2001 From: vsc Date: Tue, 10 Dec 2002 00:22:01 +0000 Subject: [PATCH] allow recorded(X,Y,Key_Bound). git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@718 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- C/dbase.c | 119 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 89 insertions(+), 30 deletions(-) diff --git a/C/dbase.c b/C/dbase.c index c59465c99..89cfab894 100644 --- a/C/dbase.c +++ b/C/dbase.c @@ -227,7 +227,7 @@ STATIC_PROTO(Int p_rcdzifnot, (void)); STATIC_PROTO(Term GetDBTerm, (DBRef)); STATIC_PROTO(DBProp FetchDBPropFromKey, (Term, int, int, char *)); STATIC_PROTO(Int i_log_upd_recorded, (LogUpdDBProp)); -STATIC_PROTO(Int i_recorded, (DBProp)); +STATIC_PROTO(Int i_recorded, (DBProp,Term)); STATIC_PROTO(Int c_log_upd_recorded, (DBRef *, int)); STATIC_PROTO(Int c_recorded, (int)); STATIC_PROTO(Int in_rded, (void)); @@ -2054,6 +2054,32 @@ copy_attachments(CELL *ts) } #endif +static Term +GetDBKey(DBRef DBSP) +{ + DBProp p = DBSP->Parent; + Term t1, tf; + + READ_LOCK(p->DBRWLock); + /* get the key */ + if (p->ArityOfDB == 0) { + t1 = MkAtomTerm((Atom)(p->FunctorOfDB)); + } else { + t1 = Yap_MkNewApplTerm(p->FunctorOfDB,p->ArityOfDB); + } + if (p->KindOfPE & MkCode) { + Term t[2]; + t[1] = Yap_LookupModule(p->ModuleOfDB); + t[2] = t1; + tf = Yap_MkApplTerm(FunctorModule, 2, t); + } else { + tf = t1; + } + READ_UNLOCK(p->DBRWLock); + return(tf); +} + + static Term GetDBTerm(DBRef DBSP) { @@ -2529,37 +2555,13 @@ p_db_key(void) /* Finds a term recorded under the key ARG1 */ static Int -i_recorded(DBProp AtProp) +i_recorded(DBProp AtProp, Term t3) { Term TermDB, TRef; Register DBRef ref; - Term t3 = Deref(ARG3); Term twork; READ_LOCK(AtProp->DBRWLock); - if (!IsVarTerm(t3)) { - if (!IsDBRefTerm(t3)) { - READ_UNLOCK(AtProp->DBRWLock); - cut_fail(); - } else { - DBRef ref0 = DBRefOfTerm(t3); -#ifdef KEEP_OLD_ENTRIES_HANGING_ABOUT - ref = AtProp->FirstNEr; -#else - ref = AtProp->First; -#endif - while (ref != NULL - && (ref != ref0)) { - ref = NextDBRef(ref); - } - READ_UNLOCK(AtProp->DBRWLock); - if (ref == NULL || DEAD_REF(ref) || !Yap_unify(ARG2,GetDBTerm(ref))) { - cut_fail(); - } else { - cut_succeed(); - } - } - } if (AtProp->KindOfPE & 0x1) return(i_log_upd_recorded((LogUpdDBProp)AtProp)); #ifdef KEEP_OLD_ENTRIES_HANGING_ABOUT @@ -2933,15 +2935,33 @@ in_rded(void) register choiceptr b0=B; Register Term twork = Deref(ARG1); /* initially working with * ARG1 */ + Term t3 = Deref(ARG3); - + if (!IsVarTerm(t3)) { + if (!IsDBRefTerm(t3)) { + cut_fail(); + } else { + DBRef ref = DBRefOfTerm(t3); + LOCK(ref->lock); + if (ref == NULL + || DEAD_REF(ref) + || !Yap_unify(ARG2,GetDBTerm(ref)) + || !Yap_unify(ARG1,GetDBKey(ref))) { + UNLOCK(ref->lock); + cut_fail(); + } else { + UNLOCK(ref->lock); + cut_succeed(); + } + } + } if (EndOfPAEntr(AtProp = FetchDBPropFromKey(twork, 0, FALSE, "recorded/3"))) { if (b0 == B) cut_fail(); else return(FALSE); } - return (i_recorded(AtProp)); + return (i_recorded(AtProp, t3)); } /* recorded(+Functor,+Term,-Ref) */ @@ -2949,7 +2969,8 @@ static Int in_rded_with_key(void) { DBProp AtProp = (DBProp)IntegerOfTerm(Deref(ARG1)); - return (i_recorded(AtProp)); + + return (i_recorded(AtProp,Deref(ARG3))); } static Int @@ -2967,13 +2988,32 @@ in_rdedp(void) Register Term twork = Deref(ARG1); /* initially working with * ARG1 */ + Term t3 = Deref(ARG3); + if (!IsVarTerm(t3)) { + if (!IsDBRefTerm(t3)) { + cut_fail(); + } else { + DBRef ref = DBRefOfTerm(t3); + LOCK(ref->lock); + if (ref == NULL + || DEAD_REF(ref) + || !Yap_unify(ARG2,GetDBTerm(ref)) + || !Yap_unify(ARG1,GetDBKey(ref))) { + UNLOCK(ref->lock); + cut_fail(); + } else { + UNLOCK(ref->lock); + cut_succeed(); + } + } + } if (EndOfPAEntr(AtProp = FetchDBPropFromKey(twork, MkCode, FALSE, "recorded/3"))) { if (b0 == B) cut_fail(); else return(FALSE); } - return (i_recorded(AtProp)); + return (i_recorded(AtProp,t3)); } @@ -2991,6 +3031,25 @@ p_somercdedp(void) DBProp AtProp; Register Term twork = Deref(ARG1); /* initially working with * ARG1 */ + Term t3 = Deref(ARG3); + if (!IsVarTerm(t3)) { + if (!IsDBRefTerm(t3)) { + cut_fail(); + } else { + DBRef ref = DBRefOfTerm(t3); + LOCK(ref->lock); + if (ref == NULL + || DEAD_REF(ref) + || !Yap_unify(ARG2,GetDBTerm(ref)) + || !Yap_unify(ARG1,GetDBKey(ref))) { + UNLOCK(ref->lock); + cut_fail(); + } else { + UNLOCK(ref->lock); + cut_succeed(); + } + } + } if (EndOfPAEntr(AtProp = FetchDBPropFromKey(twork, MkCode, FALSE, "some_recorded/3"))) { return(FALSE); }