/* UseMetaRevision * opens indicated revision of metadata * all non-zero revisions are read-only */ LIB_EXPORT rc_t CC SRATableUseMetaRevision ( const SRATable *cself, uint32_t revision ) { rc_t rc; if ( cself == NULL ) rc = RC ( rcSRA, rcTable, rcUpdating, rcSelf, rcNull ); else if ( cself -> read_only == false ) rc = RC ( rcSRA, rcTable, rcUpdating, rcMetadata, rcBusy ); else { uint32_t cur; rc = KMetadataRevision ( cself -> meta, & cur ); if ( rc == 0 && cur != revision ) { SRATable *self = ( SRATable* ) cself; const KMetadata *meta; rc = KMetadataOpenRevision ( self -> meta, & meta, revision ); if ( rc == 0 ) { KMetadataRelease ( self -> meta ); self -> meta = meta; } } } return rc; }
static rc_t copy_back_revisions ( const KMetadata *src_meta, VTable *dst_table, const bool show_meta ) { uint32_t max_revision, revision; rc_t rc = KMetadataMaxRevision ( src_meta, &max_revision ); DISP_RC( rc, "copy_back_revisions:KMetadataMaxRevision() failed" ); if ( rc != 0 ) return rc; if ( max_revision == 0 ) return rc; for ( revision = 1; revision <= max_revision && rc == 0; ++revision ) { const KMetadata *src_rev_meta; if ( show_meta ) KOutMsg( "+++copy metadata rev. #%u:\n", revision ); rc = KMetadataOpenRevision ( src_meta, &src_rev_meta, revision ); DISP_RC( rc, "copy_back_revisions:KMetadataOpenRevision() failed" ); if ( rc == 0 ) { KMetadata *dst_meta; rc = VTableOpenMetadataUpdate ( dst_table, & dst_meta ); DISP_RC( rc, "copy_table_meta:VTableOpenMetadataUpdate() failed" ); if ( rc == 0 ) { rc = copy_stray_metadata ( src_rev_meta, dst_meta, NULL, show_meta ); if ( rc == 0 ) { rc = KMetadataCommit ( dst_meta ); DISP_RC( rc, "copy_back_revisions:KMetadataCommit() failed" ); if ( rc == 0 ) { rc = KMetadataFreeze ( dst_meta ); DISP_RC( rc, "copy_back_revisions:KMetadataFreeze() failed" ); } } KMetadataRelease ( dst_meta ); } KMetadataRelease ( src_rev_meta ); } } return rc; }
/* OpenRevision * opens a read-only indexed revision of metadata */ inline rc_t OpenRevision ( const KMetadata **meta, uint32_t revision ) const throw() { return KMetadataOpenRevision ( this, meta, revision ); }