blob: 951199446052dba9572fd68aa1824988ac121758 [file] [log] [blame]
/* rev_file.h --- revision file and index access data structure
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#ifndef SVN_LIBSVN_FS__REV_FILE_H
#define SVN_LIBSVN_FS__REV_FILE_H
#include "svn_fs.h"
#include "id.h"
/* In format 7, index files must be read in sync with the respective
* revision / pack file. I.e. we must use packed index files for packed
* rev files and unpacked ones for non-packed rev files. So, the whole
* point is to open them with matching "is packed" setting in case some
* background pack process was run.
*/
/* Opaque index stream type.
*/
typedef struct svn_fs_fs__packed_number_stream_t
svn_fs_fs__packed_number_stream_t;
/* Data file, including indexes data, and associated properties for
* START_REVISION. As the FILE is kept open, background pack operations
* will not cause access to this file to fail.
*/
typedef struct svn_fs_fs__revision_file_t
{
/* first (potentially only) revision in the rev / pack file.
* SVN_INVALID_REVNUM for txn proto-rev files. */
svn_revnum_t start_revision;
/* the revision was packed when the first file / stream got opened */
svn_boolean_t is_packed;
/* rev / pack file */
apr_file_t *file;
/* stream based on FILE and not NULL exactly when FILE is not NULL */
svn_stream_t *stream;
/* the opened P2L index stream or NULL. Always NULL for txns. */
svn_fs_fs__packed_number_stream_t *p2l_stream;
/* the opened L2P index stream or NULL. Always NULL for txns. */
svn_fs_fs__packed_number_stream_t *l2p_stream;
/* Copied from FS->FFD->BLOCK_SIZE upon creation. It allows us to
* use aligned seek() without having the FS handy. */
apr_off_t block_size;
/* Offset within FILE at which the rev data ends and the L2P index
* data starts. Less than P2L_OFFSET. -1 if svn_fs_fs__auto_read_footer
* has not been called, yet. */
apr_off_t l2p_offset;
/* MD5 checksum on the whole on-disk representation of the L2P index.
* NULL if svn_fs_fs__auto_read_footer has not been called, yet. */
svn_checksum_t *l2p_checksum;
/* Offset within FILE at which the L2P index ends and the P2L index
* data starts. Greater than L2P_OFFSET. -1 if svn_fs_fs__auto_read_footer
* has not been called, yet. */
apr_off_t p2l_offset;
/* MD5 checksum on the whole on-disk representation of the P2L index.
* NULL if svn_fs_fs__auto_read_footer has not been called, yet. */
svn_checksum_t *p2l_checksum;
/* Offset within FILE at which the P2L index ends and the footer starts.
* Greater than P2L_OFFSET. -1 if svn_fs_fs__auto_read_footer has not
* been called, yet. */
apr_off_t footer_offset;
/* pool containing this object */
apr_pool_t *pool;
} svn_fs_fs__revision_file_t;
/* Open the correct revision file for REV. If the filesystem FS has
* been packed, *FILE will be set to the packed file; otherwise, set *FILE
* to the revision file for REV. Return SVN_ERR_FS_NO_SUCH_REVISION if the
* file doesn't exist. Allocate *FILE in RESULT_POOL and use SCRATCH_POOL
* for temporaries. */
svn_error_t *
svn_fs_fs__open_pack_or_rev_file(svn_fs_fs__revision_file_t **file,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/* Open the correct revision file for REV with read and write access.
* If necessary, temporarily reset the file's read-only state. If the
* filesystem FS has been packed, *FILE will be set to the packed file;
* otherwise, set *FILE to the revision file for REV.
*
* Return SVN_ERR_FS_NO_SUCH_REVISION if the file doesn't exist.
* Allocate *FILE in RESULT_POOL and use SCRATCH_POOLfor temporaries. */
svn_error_t *
svn_fs_fs__open_pack_or_rev_file_writable(svn_fs_fs__revision_file_t **file,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/* If the footer data in FILE has not been read, yet, do so now.
* Index locations will only be read upon request as we assume they get
* cached and the FILE is usually used for REP data access only.
* Hence, the separate step.
*/
svn_error_t *
svn_fs_fs__auto_read_footer(svn_fs_fs__revision_file_t *file);
/* Open the proto-rev file of transaction TXN_ID in FS and return it in *FILE.
* Allocate *FILE in RESULT_POOL use and SCRATCH_POOL for temporaries.. */
svn_error_t *
svn_fs_fs__open_proto_rev_file(svn_fs_fs__revision_file_t **file,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t* result_pool,
apr_pool_t *scratch_pool);
/* Close all files and streams in FILE.
*/
svn_error_t *
svn_fs_fs__close_revision_file(svn_fs_fs__revision_file_t *file);
#endif