blob: 384c08ae834322309767a60aa897f11e70cbd642 [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_X__REV_FILE_H
#define SVN_LIBSVN_FS_X__REV_FILE_H
#include "svn_fs.h"
#include "id.h"
/* In FSX, index data 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.
*
* Another thing that this allows us is to lazily open the file, i.e. open
* it upon first access.
*/
/* Opaque index stream type.
*/
typedef struct svn_fs_x__packed_number_stream_t
svn_fs_x__packed_number_stream_t;
/* Location and content meta data for an index. */
typedef struct svn_fs_x__index_info_t
{
/* Offset within the pack / rev file at which the index data starts. */
apr_off_t start;
/* First offset behind the index data. */
apr_off_t end;
/* MD5 checksum on the whole on-disk representation of the index. */
svn_checksum_t *checksum;
} svn_fs_x__index_info_t;
/* Location and content meta data for a revision / pack file. */
typedef struct svn_fs_x__rev_file_info_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;
} svn_fs_x__rev_file_info_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_x__revision_file_t svn_fs_x__revision_file_t;
/* Initialize the revision / pack file access structure in *FILE for reading
* revision REV from filesystem FS. The file will not be opened until the
* first call to any of the access functions.
*
* Allocate *FILE in RESULT_POOL. */
svn_error_t *
svn_fs_x__rev_file_init(svn_fs_x__revision_file_t **file,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *result_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_x__rev_file_open_writable(svn_fs_x__revision_file_t **file,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/* 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_x__rev_file_open_proto_rev(svn_fs_x__revision_file_t **file,
svn_fs_t *fs,
svn_fs_x__txn_id_t txn_id,
apr_pool_t* result_pool,
apr_pool_t *scratch_pool);
/* Wrap the TEMP_FILE, used in the context of FS, into a revision file
* struct, allocated in RESULT_POOL, and return it in *FILE.
*/
svn_error_t *
svn_fs_x__rev_file_wrap_temp(svn_fs_x__revision_file_t **file,
svn_fs_t *fs,
apr_file_t *temp_file,
apr_pool_t *result_pool);
/* Access functions */
/* Copy the L2P index info for FILE into *INFO.
*/
svn_error_t *
svn_fs_x__rev_file_info(svn_fs_x__rev_file_info_t *info,
svn_fs_x__revision_file_t *file);
/* Convenience wrapper around svn_io_file_name_get. */
svn_error_t *
svn_fs_x__rev_file_name(const char **filename,
svn_fs_x__revision_file_t *file,
apr_pool_t *result_pool);
/* Set *STREAM to the shared stream object of FILE.
*/
svn_error_t *
svn_fs_x__rev_file_stream(svn_stream_t **stream,
svn_fs_x__revision_file_t *file);
/* Set *APR_FILE to the shared file object of FILE.
*/
svn_error_t *
svn_fs_x__rev_file_get(apr_file_t **apr_file,
svn_fs_x__revision_file_t *file);
/* Set *STREAM to the shared L2P data stream of FILE.
*/
svn_error_t *
svn_fs_x__rev_file_l2p_index(svn_fs_x__packed_number_stream_t **stream,
svn_fs_x__revision_file_t *file);
/* Set *STREAM to the shared P2L data stream of FILE.
*/
svn_error_t *
svn_fs_x__rev_file_p2l_index(svn_fs_x__packed_number_stream_t **stream,
svn_fs_x__revision_file_t *file);
/* Copy the L2P index info for FILE into *INFO.
*/
svn_error_t *
svn_fs_x__rev_file_l2p_info(svn_fs_x__index_info_t *info,
svn_fs_x__revision_file_t *file);
/* Copy the P2L index info for FILE into *INFO.
*/
svn_error_t *
svn_fs_x__rev_file_p2l_info(svn_fs_x__index_info_t *info,
svn_fs_x__revision_file_t *file);
/* File manipulation. */
/* Convenience wrapper around svn_io_file_aligned_seek. */
svn_error_t *
svn_fs_x__rev_file_seek(svn_fs_x__revision_file_t *file,
apr_off_t *buffer_start,
apr_off_t offset);
/* Convenience wrapper around svn_fs_x__get_file_offset. */
svn_error_t *
svn_fs_x__rev_file_offset(apr_off_t *offset,
svn_fs_x__revision_file_t *file);
/* Convenience wrapper around svn_io_file_read_full2. */
svn_error_t *
svn_fs_x__rev_file_read(svn_fs_x__revision_file_t *file,
void *buf,
apr_size_t nbytes);
/* Close all files and streams in FILE. They will be reopened automatically
* by any of the above access functions.
*/
svn_error_t *
svn_fs_x__close_revision_file(svn_fs_x__revision_file_t *file);
#endif