/* Whack */ static rc_t KTableWhack ( KTable *self ) { rc_t rc = 0; KRefcountWhack ( & self -> refcount, "KTable" ); if ( self -> db != NULL ) { rc = KDatabaseSever ( self -> db ); if ( rc == 0 ) self -> db = NULL; } if ( rc == 0 ) rc = KDBManagerSever ( self -> mgr ); if ( rc == 0 ) { KDirectoryRelease ( self -> dir ); free ( self ); return 0; } KRefcountInit ( & self -> refcount, 1, "KTable", "whack", "ktbl" ); return rc; }
/* Whack */ static rc_t KDatabaseWhack ( KDatabase *self ) { rc_t rc = 0; KDBManager *mgr = self -> mgr; KSymbol * symb; assert ( mgr != NULL ); KRefcountWhack ( & self -> refcount, "KDatabase" ); /* release dad */ if ( self -> dad != NULL ) { rc = KDatabaseSever ( self -> dad ); if ( rc != 0 ) return rc; self -> dad = NULL; } /* shut down md5 sum file if it is open */ KMD5SumFmtRelease ( self -> md5 ), self -> md5 = NULL; /* remove from mgr */ symb = KDBManagerOpenObjectFind (mgr, self->path); if (symb != NULL) { rc = KDBManagerOpenObjectDelete (mgr, symb); if (rc == 0) { /* release manager should never fail */ rc = KDBManagerSever ( mgr ); if ( rc != 0 ) rc = KDBManagerOpenObjectAdd (mgr, symb); else { /* complete */ KDirectoryRelease ( self -> dir ); free ( self ); return 0; } } } KRefcountInit ( & self -> refcount, 1, "KDatabase", "whack", "kdb" ); return rc; }
/* Whack */ static rc_t KDatabaseWhack ( KDatabase *self ) { rc_t rc = 0; /* unused: const KDBManager *mgr; */ KRefcountWhack ( & self -> refcount, "KDatabase" ); /* shut down md5 fmt file */ if ( self -> md5 != NULL ) { rc = KMD5SumFmtRelease ( self -> md5 ); if ( rc == 0 ) self -> md5 = NULL; } if ( rc == 0 ) { /* release dad */ if ( self -> dad != NULL ) { rc = KDatabaseSever ( self -> dad ); if ( rc == 0 ) self -> dad = NULL; } /* remove from mgr */ if ( rc == 0 ) { /* rc = KDBManagerSever ( self -> mgr, & self -> sym ); */ rc = KDBManagerSever ( self -> mgr ); /* complete */ if ( rc == 0 ) { KDirectoryRelease ( self -> dir ); free ( self ); return 0; } } } KRefcountInit ( & self -> refcount, 1, "KDatabase", "whack", "kdb" ); return rc; }
/* Whack */ static rc_t KColumnWhack ( KColumn *self ) { rc_t rc; KRefcountWhack ( & self -> refcount, "KColumn" ); /* shut down index */ rc = KColumnIdxWhack ( & self -> idx ); if ( rc == 0 ) { /* shut down data fork */ KColumnDataWhack ( & self -> df ); /* release owning table should never fail, and our recovery is flawed */ if ( self -> tbl != NULL ) { rc = KTableSever ( self -> tbl ); if ( rc == 0 ) self -> tbl = NULL; } /* release manager should never fail */ if ( rc == 0 ) rc = KDBManagerSever ( self -> mgr ); if ( rc == 0 ) { KDirectoryRelease ( self -> dir ); free ( self ); return 0; } } KRefcountInit ( & self -> refcount, 1, "KColumn", "whack", "kcol" ); return rc; }