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