(FILECREATED "21-May-86 02:40:12" {QV}<NOTECARDS>1.3K>FGHPATCH041.;7 21414        changes to:  (VARS FGHPATCH041COMS)		   (FNS NC.ScavengeDatabaseFile NC.ConvertLinkFormat NC.GetAndPutVersion2Card)      previous date: "21-May-86 00:17:46" {QV}<NOTECARDS>1.3K>FGHPATCH041.;1)(* Copyright (c) 1986 by Xerox Corporation. All rights reserved.)(PRETTYCOMPRINT FGHPATCH041COMS)(RPAQQ FGHPATCH041COMS ((* * Fixes for unreported bug whereby which the converter would destroy all 			     global links. From NCCONVERTVERSION2TO3)			  (FNS NC.ReadVersion2Links NC.GetAndPutVersion2Card)			  (* * New FNS for Converter)			  (FNS NC.ConvertLinkFormat)			  (* * From NCREPAIR)			  (FNS NC.ScavengeDatabaseFile)))(* * Fixes for unreported bug whereby which the converter would destroy all global links. From NCCONVERTVERSION2TO3)(DEFINEQ(NC.ReadVersion2Links  (LAMBDA (Stream ID Card Version2HashArray)                 (* fgh: "21-May-86 00:08")          (* * Stream should be positioned at the Links card part of ID. Get the global links and fill in for Card.	  Ignore the To and From links -	  scavenger will rebuild them.)          (* * fgh 5/20/86 Added call to NC.ConvertLinkFormat to convert the format of the global links from NOTECARDLINK 	  records to Link datatypes. Also added Version2HashArray arg to support this.)    (NC.SetLinksDate Card (NC.ReadVersion2CardPartHeader Stream ID NC.Version2LinksIdentifier))                                                             (* Skip the from and to links.							     The scavenger will rebuild them later.)    (READ Stream)    (READ Stream)    (NC.SetGlobalLinks Card (NC.ConvertLinkFormat (READ Stream)						      Version2HashArray))))(NC.GetAndPutVersion2Card  (LAMBDA (Stream ID Version2HashArray FromNoteFile ToNoteFile)                                                             (* fgh: "21-May-86 01:28")          (* * If ID has active status, then get its card parts off Stream and fill in the info into the corresponding card 	  object. Find this object using Version2HashArray.)          (* * rht 12/18/85: Now deactivates card after putting to file.)          (* * fgh 5/20/86 Added extra Version2HashArray arg to call to NC.ReadVersion2Links to support GlobalLinkConversion.	  Changed order in which Links and PropList are processed because global link conversion might need to put a NoSource	  property on the prop list.)    (LET ((Pointers (NC.ReadVersion2Ptrs ID Stream))	  Card)         (SELECTQ (fetch (POINTERLIST STATUS) of Pointers)		    (ACTIVE                                  (* Recover card object from the hash array.)			    (SETQ Card (GETHASH ID Version2HashArray))          (* * Read main data and substance and fill in Card object.)			    (SETFILEPTR Stream (fetch (POINTERLIST MAINPTR) of Pointers))			    (NC.ReadVersion2MainCardData Stream ID Card Version2HashArray 							   FromNoteFile ToNoteFile)          (* * Read title and fill in Card object.)			    (SETFILEPTR Stream (fetch (POINTERLIST TITLEPTR) of Pointers))			    (NC.ReadVersion2Title Stream ID Card)          (* * Read prop list and fill in Card object.)			    (SETFILEPTR Stream (fetch (POINTERLIST PROPSPTR) of Pointers))			    (NC.ReadVersion2PropList Stream ID Card)          (* * Read global links and fill in Card object.)			    (SETFILEPTR Stream (fetch (POINTERLIST LINKSPTR) of Pointers))			    (NC.ReadVersion2Links Stream ID Card Version2HashArray)          (* * If card is a browser, then first convert to version 3 format.)			    (if (NC.IsSubTypeOfP (NC.FetchType Card)						     (QUOTE Browser))				then (NC.ConvertVersion2BrowserCard Card Version2HashArray))          (* * Write down the card parts to the ToNoteFile.)			    (NC.PutMainCardData Card NIL T)			    (NC.PutLinks Card T)			    (NC.PutTitle Card T)			    (NC.PutPropList Card T))		    (SPECIAL                                 (* Deal specially with link labels.)			     (SETQ Card (NC.Version3CardFromVersion2ID ID Version2HashArray))                                                             (* Go get the link labels from version 2 stream and 							     write down to version 3 notefile.)			     (SETFILEPTR Stream (fetch (POINTERLIST MAINPTR) of Pointers))			     (NC.StoreLinkLabels ToNoteFile (NC.ReadVersion2LinkLabels Stream ID 											   Card)))		    NIL)         (AND (NC.CardP Card)		(NC.DeactivateCard Card T))     Card))))(* * New FNS for Converter)(DEFINEQ(NC.ConvertLinkFormat  (LAMBDA (ListOfLinks Version2HashArray)                    (* fgh: "21-May-86 01:37")          (* * Convert links from NOTECARDLINK record to Link datatype. Note the conversion of NoSource from a dangling link 	  to a property list item.)          (* * fgh 5/21/86 First created.)    (bind NewLink ConvertedLinks PropList Card FOR Link in ListOfLinks       do (OR (EQ (CAR Link)			(QUOTE NOTECARDLINK))		  (SETQ Link (CONS (QUOTE NOTECARDLINK)				       Link)))	    (if (NEQ (fetch (NOTECARDLINK DESTINATIONID) of Link)			 (QUOTE NC00000))		then (SETQ NewLink (create Link						 UID _(NC.MakeUID)						 SourceCard _(GETHASH (fetch (NOTECARDLINK 											 SOURCEID)									   of Link)									Version2HashArray)						 DestinationCard _(GETHASH (fetch (NOTECARDLINK											DESTINATIONID)										of Link)									     Version2HashArray)						 AnchorMode _(fetch (NOTECARDLINK ANCHORMODE)								of Link)						 Label _(fetch (NOTECARDLINK LINKLABEL)							   of Link)						 DisplayMode _(fetch (NOTECARDLINK DISPLAYMODE)								 of Link)))		       (NC.CheckDisplayModeFormat NewLink)		       (SETQ ConvertedLinks (CONS NewLink ConvertedLinks))	      else           (* * This is the old form of NoSource. Convert to new form by putting on the prop list.)		     (SETQ PropList (NC.FetchPropList (SETQ Card (GETHASH							      (fetch (NOTECARDLINK SOURCEID)								 of Link)							      Version2HashArray))))		     (NC.SetPropList Card (if PropList						then (LISTPUT PropList (QUOTE NoSource)								  T)						       PropList					      else (LIST (QUOTE NoSource)							     T))))       finally (RETURN ConvertedLinks)))))(* * From NCREPAIR)(DEFINEQ(NC.ScavengeDatabaseFile  (LAMBDA (NoteFileOrFileName BadLinkLabelsFlg ListOfBoxesToReconstruct 			      ListOfCardsNeedingGlobalLinksReconstructed)                                                             (* fgh: "21-May-86 02:37")          (* Scavenge the database FileName. Essentially throw away all of the information about From and ToLinks and 	  recreate them by retrieving the link information from the substance of each card and from the list of global links 	  from the card.)          (* * rht 8/9/84: Now calls NC.OpenDatabaseFile to do the file open.)          (* * rht 7/17/85: Changed so can take a stream argument. Also handles link labels. If BadLinkLabelsFlg is non-nil, 	  then don't try to read current link labels. Just rebuild them from what's out there. Otherwise, only rebuild if 	  find new any new ones.)          (* * fgh 22-Jul-85 Takes a list of bad file box cards and reconstructs the file boxes from the From pointer lists 	  of all the cards in the NoteFile.)          (* * fgh 30-Jul-85 Takes a list of cards with bad global links and reconstructs the global links list from the From	  pointer lists of all the cards in the NoteFile.)          (* * rht 11/23/85: Updated to handle new notefile and card object formats.)          (* * rht 12/1/85: Now calls NC.GetMainCardData and NC.GetLinks instead of NC.GetNoteCard.)          (* * rht 12/19/85: Massive overhaul for sake of speed. Should be wizzier now.)          (* * fgh 2/4/86 Now works on open NFs. No need to error check since this function should always be called from 	  earlier phases of the inspect & repaier.)          (* * fgh 5/21/86 Fixed bu in handling of global links.)    (PROG (NoteFile FileName CardTotal NoteCardNumber OldLinkLabels DiscoveredLinkLabels 		      ReconstructLinks ReconstructGlobalLinks ToBeFiledCards)          (* * First, take care of checking stream's validity, etc.)	    (SETQ FileName (if (type? NoteFile NoteFileOrFileName)				 then (SETQ NoteFile NoteFileOrFileName)					(fetch (NoteFile FullFileName) of NoteFileOrFileName)			       else NoteFileOrFileName))   (* Try to open notefile.)	    (if (NULL (OPENP FileName))		then (if (NULL (SETQ NoteFile				       (NC.OpenDatabaseFile FileName NIL T NIL NIL NIL NIL NIL T)))			   then (NC.PrintMsg NIL NIL "Couldn't open " FileName "." (CHARACTER						   13)						 "Repair aborted."						 (CHARACTER 13))				  (RETURN NIL)))          (* * If link labels aren't screwed up, then read them in.)	    (OR BadLinkLabelsFlg (SETQ OldLinkLabels (NC.RetrieveLinkLabels NoteFile T)))          (* * Mark every card that needs its global links or substance reconstructed so we don't have to search the lists so	  much.)	    (for Card in ListOfCardsNeedingGlobalLinksReconstructed do (NC.SetUserDataProp									       Card									       (QUOTE 								 NeedsGlobalLinksReconstructedFlg)									       T))	    (for Box in ListOfBoxesToReconstruct do (NC.SetUserDataProp Box (QUOTE 									   NeedsReconstructingFlg)										T))          (* Read through all NoteCard substances to find actual pointers. Use this to create the To Links list.	  The list collection function checks to make sure each link is valid.)	    (SETQ CardTotal (SUB1 (fetch (NoteFile NextIndexNum)					       NoteFile)))	    (NC.PrintMsg NIL T "Rebuilding notefile links." (CHARACTER 13)			   "Collecting Links for item " 1 " out of " CardTotal "." (CHARACTER			     13))	    (SETQ NoteCardNumber 0)	    (NC.MapCards	      NoteFile	      (FUNCTION (LAMBDA (Card)		  (SETQ NoteCardNumber (ADD1 NoteCardNumber))		  (AND (ZEROP (REMAINDER NoteCardNumber 10))			 (NC.PrintMsg NIL T "Rebuilding notefile links." (CHARACTER 13)					"Collecting Links for item " NoteCardNumber " out of " 					CardTotal "." (CHARACTER 13)))		  (if (NC.FetchUserDataProp Card (QUOTE NeedsReconstructingFlg))		      then                                 (* Card substance and links will be reconstructed so 							     no need to try to read substance.)			     (NC.GetLinks Card)			     (if (NOT (NC.FetchUserDataProp Card (QUOTE 								 NeedsGlobalLinksReconstructedFlg)))				 then (NC.SetUserDataProp Card (QUOTE ScavengerToLinks)							      (NC.FetchGlobalLinks Card))					(NC.SetUserDataProp Card (QUOTE ScavengerGlobalLinks)							      (NC.FetchGlobalLinks Card)))			     (NC.DeactivateCard Card T)		    else (NC.GetMainCardData Card)			   (NC.GetLinks Card)			   (NC.ActivateCard Card)			   (if (EQ (NC.FetchStatus Card)				       (QUOTE ACTIVE))			       then                        (* Collect links having active destinations.							     Delete the others.)				      (NC.SetUserDataProp					Card					(QUOTE ScavengerToLinks)					(NCONC (for Link in (CAR (NC.CollectReferences									   Card))						    eachtime (BLOCK)						    when (if (EQ (NC.FetchStatus									 (fetch (Link 										  DestinationCard)									    of Link))								       (QUOTE ACTIVE))							     else (NC.DelReferencesToCard Card 											     Link)								    NIL)						    collect Link)						 (if (NC.FetchUserDataProp Card (QUOTE 								 NeedsGlobalLinksReconstructedFlg))						   else (NC.SetUserDataProp Card (QUOTE 									     ScavengerGlobalLinks)										(NC.FetchGlobalLinks										  Card)))))				      (if (NC.FetchUserDataProp Card (QUOTE 								 NeedsGlobalLinksReconstructedFlg))					else (NC.SetUserDataProp Card (QUOTE 									     ScavengerGlobalLinks)								     (NC.FetchGlobalLinks Card)))          (* If there are file boxes to be reconstructed, then look thru the From links to see if this card was filed in one 	  of the to-be-reconstructed boxes)				      (AND ListOfBoxesToReconstruct					     (for Link in (NC.FetchFromLinks Card)						eachtime (BLOCK)						when (AND (NC.ChildLinkP Link)							      (NC.FetchUserDataProp								(fetch (Link SourceCard)								   of Link)								(QUOTE NeedsReconstructingFlg)))						do (push ReconstructLinks Link)))          (* If there are global links to be reconstructed, then look thru the From links to see if this card had a global 	  link from a card whose global links need reconstructing.)				      (AND ListOfCardsNeedingGlobalLinksReconstructed					     (for Link in (NC.FetchFromLinks Card)						eachtime (BLOCK)						when (AND (NC.GlobalLinkP Link)							      (NC.FetchUserDataProp								(fetch (Link SourceCard)								   of Link)								(QUOTE 								 NeedsGlobalLinksReconstructedFlg)))						do (push ReconstructGlobalLinks Link)))				      (NC.DeactivateCard Card T))))))          (* * Reconstruct any cards as requested)	    (for BoxToReconstruct in ListOfBoxesToReconstruct eachtime (BLOCK)	       do                                          (* Make a new file box using the given card.)		    (NC.MakeNoteCard (QUOTE FileBox)				       NoteFile "Untitled: Reconstructed during repair" T NIL 				       BoxToReconstruct)          (* File cards whose from links indicate that they used to be filed in this file box. Also add these new links to 	  collected ToLinks.)		    (NC.SetUserDataProp BoxToReconstruct (QUOTE ScavengerToLinks)					  (APPEND (NC.FetchUserDataProp BoxToReconstruct									    (QUOTE ScavengerToLinks)									    )						    (for Link in ReconstructLinks						       eachtime (BLOCK)						       when (NC.SameCardP BoxToReconstruct									      (fetch (Link 										       SourceCard)										 of Link))						       collect (NC.MakeChildLink								   (fetch (Link DestinationCard)								      of Link)								   BoxToReconstruct NIL))))                                                             (* Put the card away)		    (NC.PutMainCardData BoxToReconstruct)		    (NC.DeactivateCard BoxToReconstruct T))          (* * Reconstruct any global link lists as required)	    (for Link in ReconstructGlobalLinks bind ThisCardsToLinks ThisCardsGlobalLinks 							   SourceCard	       eachtime (BLOCK)	       do (SETQ SourceCard (fetch (Link SourceCard) of Link))                                                              (* Add it to the GlobalLinks list for its source card 							     unless it's already there.)		    (if (for GlobalLink in (SETQ ThisCardsGlobalLinks (NC.FetchUserDataProp						     SourceCard						     (QUOTE ScavengerGlobalLinks)))			     eachtime (BLOCK) never (NC.SameLinkP Link GlobalLink))			then (NC.SetUserDataProp SourceCard (QUOTE ScavengerGlobalLinks)						     (CONS Link ThisCardsGlobalLinks)))                                                             (* Add it to the source card's ToLinks list unless 							     it's already there)		    (if (for ToLink in (SETQ ThisCardsToLinks (NC.FetchUserDataProp						 SourceCard						 (QUOTE ScavengerToLinks)))			     eachtime (BLOCK) never (NC.SameLinkP Link ToLink))			then (NC.SetUserDataProp SourceCard (QUOTE ScavengerToLinks)						     (CONS Link ThisCardsToLinks))))          (* * Compute the From Links list by "inverting" the To Links list)	    (NC.PrintMsg NIL T "Repairing NoteFile." (CHARACTER 13)			   "Inverting links for item " 1 " out of " CardTotal "." (CHARACTER 13))	    (SETQ NoteCardNumber 0)	    (NC.MapCards NoteFile (FUNCTION (LAMBDA (Card)			       (SETQ NoteCardNumber (ADD1 NoteCardNumber))			       (AND (ZEROP (REMAINDER NoteCardNumber 100))				      (NC.PrintMsg NIL T "Repairing NoteFile." (CHARACTER 13)						     "Inverting links for item " NoteCardNumber 						     " out of "						     CardTotal "." (CHARACTER 13)))			       (if (EQ (NC.FetchStatus Card)					   (QUOTE ACTIVE))				   then (for Link in (NC.FetchUserDataProp Card (QUOTE										     ScavengerToLinks)										   )					     bind DestinationCard LinkLabel eachtime (BLOCK)					     do            (* Add this ToLink as a FromLink for the link's 							     destination card.)						  (NC.SetUserDataProp (SETQ DestinationCard									  (fetch (Link 										  DestinationCard)									     of Link))									(QUOTE ScavengerFromLinks)									(CONS Link										(									     NC.FetchUserDataProp										  DestinationCard										  (QUOTE 									       ScavengerFromLinks))))                                                             (* Accumulate the link labels into a list.)						  (if (NOT (FMEMB (SETQ LinkLabel									  (fetch (Link Label)									     of Link))									DiscoveredLinkLabels))						      then (push DiscoveredLinkLabels LinkLabel)))				     ))))          (* * Reset all of the To and From Links lists in the database)	    (NC.PrintMsg NIL T "Repairing NoteFile." (CHARACTER 13)			   "Rewriting links for item " 1 " out of " CardTotal "." (CHARACTER 13))	    (SETQ NoteCardNumber 0)	    (NC.MapCards NoteFile (FUNCTION (LAMBDA (Card)			       (SETQ NoteCardNumber (ADD1 NoteCardNumber))			       (AND (ZEROP (REMAINDER NoteCardNumber 10))				      (NC.PrintMsg NIL T "Repairing NoteFile." (CHARACTER 13)						     "Rewriting links for item " NoteCardNumber 						     " out of "						     CardTotal "." (CHARACTER 13)))			       (if (EQ (NC.FetchStatus Card)					   (QUOTE ACTIVE))				   then (NC.SetGlobalLinks Card (NC.FetchUserDataProp								 Card								 (QUOTE ScavengerGlobalLinks)))					  (NC.SetToLinks Card (NC.FetchUserDataProp Card											(QUOTE											  										 ScavengerToLinks)))					  (NC.SetFromLinks Card (NC.FetchUserDataProp							       Card							       (QUOTE ScavengerFromLinks)))                                                             (* Check whether this card isn't filed anywhere.)					  (if (AND (NOT (NC.UndeletableCardP Card))						       (for Link in (NC.FetchFromLinks Card)							  eachtime (BLOCK) never (										    NC.ChildLinkP											 Link)))					      then (push ToBeFiledCards Card))					  (NC.PutLinks Card))                                                             (* Clean any junk off the card.)			       (NC.DeactivateCard Card T)			       (NC.SetUserDataPropList Card NIL))))          (* * File any unfiled cards in the ToBeFiled box.)	    (if ToBeFiledCards		then (NC.PrintMsg NIL T "Filing " (LENGTH ToBeFiledCards)				      " cards in ToBeFiled box ..."				      (CHARACTER 13))		       (NCP.FileCards ToBeFiledCards (fetch (NoteFile ToBeFiledCard)							  of NoteFile)))                                                             (* Rewrite link labels if we've found any new ones.)	    (if (LDIFFERENCE DiscoveredLinkLabels OldLinkLabels)		then (NC.StoreLinkLabels NoteFile (UNION DiscoveredLinkLabels OldLinkLabels)))                                                             (* Clean up and get out.)	    (NC.CheckpointDatabase NoteFile T)	    (NC.ForceDatabaseClose NoteFile)	    (NC.PrintMsg NIL T "Repair Completed for " (FULLNAME FileName)			   "."			   (CHARACTER 13))	    (if ToBeFiledCards		then (NC.PrintMsg NIL NIL "Filed " (LENGTH ToBeFiledCards)				      " cards in ToBeFiled box."))))))(PUTPROPS FGHPATCH041 COPYRIGHT ("Xerox Corporation" 1986))(DECLARE: DONTCOPY  (FILEMAP (NIL (851 4796 (NC.ReadVersion2Links 861 . 1801) (NC.GetAndPutVersion2Card 1803 . 4794)) (4831 6773 (NC.ConvertLinkFormat 4841 . 6771)) (6800 21332 (NC.ScavengeDatabaseFile 6810 . 21330)))))STOP