1289177Speter/* rev_file.h --- revision file and index access data structure 2289177Speter * 3289177Speter * ==================================================================== 4289177Speter * Licensed to the Apache Software Foundation (ASF) under one 5289177Speter * or more contributor license agreements. See the NOTICE file 6289177Speter * distributed with this work for additional information 7289177Speter * regarding copyright ownership. The ASF licenses this file 8289177Speter * to you under the Apache License, Version 2.0 (the 9289177Speter * "License"); you may not use this file except in compliance 10289177Speter * with the License. You may obtain a copy of the License at 11289177Speter * 12289177Speter * http://www.apache.org/licenses/LICENSE-2.0 13289177Speter * 14289177Speter * Unless required by applicable law or agreed to in writing, 15289177Speter * software distributed under the License is distributed on an 16289177Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17289177Speter * KIND, either express or implied. See the License for the 18289177Speter * specific language governing permissions and limitations 19289177Speter * under the License. 20289177Speter * ==================================================================== 21289177Speter */ 22289177Speter 23289177Speter#ifndef SVN_LIBSVN_FS__REV_FILE_H 24289177Speter#define SVN_LIBSVN_FS__REV_FILE_H 25289177Speter 26289177Speter#include "svn_fs.h" 27289177Speter#include "id.h" 28289177Speter 29289177Speter/* In format 7, index files must be read in sync with the respective 30289177Speter * revision / pack file. I.e. we must use packed index files for packed 31289177Speter * rev files and unpacked ones for non-packed rev files. So, the whole 32289177Speter * point is to open them with matching "is packed" setting in case some 33289177Speter * background pack process was run. 34289177Speter */ 35289177Speter 36289177Speter/* Opaque index stream type. 37289177Speter */ 38289177Spetertypedef struct svn_fs_fs__packed_number_stream_t 39289177Speter svn_fs_fs__packed_number_stream_t; 40289177Speter 41289177Speter/* Data file, including indexes data, and associated properties for 42289177Speter * START_REVISION. As the FILE is kept open, background pack operations 43289177Speter * will not cause access to this file to fail. 44289177Speter */ 45289177Spetertypedef struct svn_fs_fs__revision_file_t 46289177Speter{ 47289177Speter /* first (potentially only) revision in the rev / pack file. 48289177Speter * SVN_INVALID_REVNUM for txn proto-rev files. */ 49289177Speter svn_revnum_t start_revision; 50289177Speter 51289177Speter /* the revision was packed when the first file / stream got opened */ 52289177Speter svn_boolean_t is_packed; 53289177Speter 54289177Speter /* rev / pack file */ 55289177Speter apr_file_t *file; 56289177Speter 57289177Speter /* stream based on FILE and not NULL exactly when FILE is not NULL */ 58289177Speter svn_stream_t *stream; 59289177Speter 60289177Speter /* the opened P2L index stream or NULL. Always NULL for txns. */ 61289177Speter svn_fs_fs__packed_number_stream_t *p2l_stream; 62289177Speter 63289177Speter /* the opened L2P index stream or NULL. Always NULL for txns. */ 64289177Speter svn_fs_fs__packed_number_stream_t *l2p_stream; 65289177Speter 66289177Speter /* Copied from FS->FFD->BLOCK_SIZE upon creation. It allows us to 67289177Speter * use aligned seek() without having the FS handy. */ 68289177Speter apr_off_t block_size; 69289177Speter 70289177Speter /* Offset within FILE at which the rev data ends and the L2P index 71289177Speter * data starts. Less than P2L_OFFSET. -1 if svn_fs_fs__auto_read_footer 72289177Speter * has not been called, yet. */ 73289177Speter apr_off_t l2p_offset; 74289177Speter 75289177Speter /* MD5 checksum on the whole on-disk representation of the L2P index. 76289177Speter * NULL if svn_fs_fs__auto_read_footer has not been called, yet. */ 77289177Speter svn_checksum_t *l2p_checksum; 78289177Speter 79289177Speter /* Offset within FILE at which the L2P index ends and the P2L index 80289177Speter * data starts. Greater than L2P_OFFSET. -1 if svn_fs_fs__auto_read_footer 81289177Speter * has not been called, yet. */ 82289177Speter apr_off_t p2l_offset; 83289177Speter 84289177Speter /* MD5 checksum on the whole on-disk representation of the P2L index. 85289177Speter * NULL if svn_fs_fs__auto_read_footer has not been called, yet. */ 86289177Speter svn_checksum_t *p2l_checksum; 87289177Speter 88289177Speter /* Offset within FILE at which the P2L index ends and the footer starts. 89289177Speter * Greater than P2L_OFFSET. -1 if svn_fs_fs__auto_read_footer has not 90289177Speter * been called, yet. */ 91289177Speter apr_off_t footer_offset; 92289177Speter 93289177Speter /* pool containing this object */ 94289177Speter apr_pool_t *pool; 95289177Speter} svn_fs_fs__revision_file_t; 96289177Speter 97289177Speter/* Open the correct revision file for REV. If the filesystem FS has 98289177Speter * been packed, *FILE will be set to the packed file; otherwise, set *FILE 99289177Speter * to the revision file for REV. Return SVN_ERR_FS_NO_SUCH_REVISION if the 100289177Speter * file doesn't exist. Allocate *FILE in RESULT_POOL and use SCRATCH_POOL 101289177Speter * for temporaries. */ 102289177Spetersvn_error_t * 103289177Spetersvn_fs_fs__open_pack_or_rev_file(svn_fs_fs__revision_file_t **file, 104289177Speter svn_fs_t *fs, 105289177Speter svn_revnum_t rev, 106289177Speter apr_pool_t *result_pool, 107289177Speter apr_pool_t *scratch_pool); 108289177Speter 109289177Speter/* Open the correct revision file for REV with read and write access. 110289177Speter * If necessary, temporarily reset the file's read-only state. If the 111289177Speter * filesystem FS has been packed, *FILE will be set to the packed file; 112289177Speter * otherwise, set *FILE to the revision file for REV. 113289177Speter * 114289177Speter * Return SVN_ERR_FS_NO_SUCH_REVISION if the file doesn't exist. 115289177Speter * Allocate *FILE in RESULT_POOL and use SCRATCH_POOLfor temporaries. */ 116289177Spetersvn_error_t * 117289177Spetersvn_fs_fs__open_pack_or_rev_file_writable(svn_fs_fs__revision_file_t **file, 118289177Speter svn_fs_t *fs, 119289177Speter svn_revnum_t rev, 120289177Speter apr_pool_t *result_pool, 121289177Speter apr_pool_t *scratch_pool); 122289177Speter 123289177Speter/* If the footer data in FILE has not been read, yet, do so now. 124289177Speter * Index locations will only be read upon request as we assume they get 125289177Speter * cached and the FILE is usually used for REP data access only. 126289177Speter * Hence, the separate step. 127289177Speter */ 128289177Spetersvn_error_t * 129289177Spetersvn_fs_fs__auto_read_footer(svn_fs_fs__revision_file_t *file); 130289177Speter 131289177Speter/* Open the proto-rev file of transaction TXN_ID in FS and return it in *FILE. 132289177Speter * Allocate *FILE in RESULT_POOL use and SCRATCH_POOL for temporaries.. */ 133289177Spetersvn_error_t * 134289177Spetersvn_fs_fs__open_proto_rev_file(svn_fs_fs__revision_file_t **file, 135289177Speter svn_fs_t *fs, 136289177Speter const svn_fs_fs__id_part_t *txn_id, 137289177Speter apr_pool_t* result_pool, 138289177Speter apr_pool_t *scratch_pool); 139289177Speter 140289177Speter/* Close all files and streams in FILE. 141289177Speter */ 142289177Spetersvn_error_t * 143289177Spetersvn_fs_fs__close_revision_file(svn_fs_fs__revision_file_t *file); 144289177Speter 145289177Speter#endif 146