; ; ; SYNCBF ; ; SYNCBF - UPDATES THE DISK IMMAGE OF A DATABASE FILE ; ; ROUTINE NAME: SYNCBF ; ; PURPOSE: To write out all modified blocks in the in-core ; buffers of a database file. This assures that the ; disk version is updated to be the same as the core ; version. ; ; CALLABLE: From FORTRAN only: ; CALL SYNCBF(ROOT[,ERR]) ; ; PARAMETERS: ; ROOT The database in-core root block and I/O buffers. ; ERR The error return parameter, where: ; ERR=-100 Means corruppted root block. ; ERR= +1 Means successfull return. ; ; ROUTINES USED: B$IOERROR, READVB and WRITEVB macros. ; ; EXAMPLE: ; CALL SYNCBF(ROOT) ; ; AUTHOR: Mike Higgins ; ; SOURCE LANGUAGE: MACRO11 with SUPERMAC ; ; OBJECT MODULE NAME: SYNCBF ; ; LIBRARY: [60,100]DATABASE ; ; MAINTENANCE: See Mike Higgins ; ; ;REGESTER ASSIGNMENTS ROOT=R4 TEM=R1 BUF=R3 LEVEL=R2 SAV=R5 .MCALL SUPER SUPER PROCEDURE SYNCBF ;(ROOT) RT=2 ERR=4 LET ROOT := RT(R5) ;GET THE ROOT BLOCK ADDRESS IF DB.BLT(ROOT) NE #"RT ;MAKE SURE IT IS A ROOT BLOCK FORET #ER.NRB,ERR ;HEY!! IT'S NOT!!! RETURN ;RETURN ERROR END LET BUF := ROOT + #DB.SIZE ;SKIP TO THE FIRST BLOCK PAST THE ROOT LET LEVEL := ROOT + #LV.1ST+LV.SIZE ;GET THE POINTER TO THE FIRST LEVEL TABLE LET TEM := RT.NLV(ROOT) ;GET THE NUMBER OF LEVELS THRU TEM ;LOOP FOR ALL OF THEM IF #FL.MOD SET.IN LV.FLG(LEVEL) ;IS THIS BLOCK MODIFIED? WRITEVB LV.PCB(LEVEL),BUF ;THEN WRITE IT OUT ;AND CLEAR THE MOD BIT LET LV.FLG(LEVEL) := . OFF.BY #FL.MOD END LET LEVEL := LEVEL + #LV.SIZE ;INCRIMENT TO NEXT LEVEL TABLE LET BUF := BUF + #DB.SIZE ;INCRIMENT TO NEXT BLOCK IN BUFFER END ;NOW THAT ANY FLAG BITS ARE CLEAR, ;YOU CAN WRITE OUT THE ROOT BLOCK IF #FL.MOD SET.IN RT.FLG(ROOT) ;ONLY WHEN NECC OF COURCE ;IT IS, BUT FIRST CLEAR THIS BIT!! LET RT.FLG(ROOT) := . OFF.BY #FL.MOD WRITEVB #1,ROOT ;WRITE OUT ROOT BLOCK END FORET #1,ERR ENDPROCEDURE SYNCBF .END