summaryrefslogtreecommitdiff
path: root/subversion/libsvn_fs_x/rev_file.h
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/libsvn_fs_x/rev_file.h')
-rw-r--r--subversion/libsvn_fs_x/rev_file.h208
1 files changed, 127 insertions, 81 deletions
diff --git a/subversion/libsvn_fs_x/rev_file.h b/subversion/libsvn_fs_x/rev_file.h
index b96d0351883da..8fa791ab7ea87 100644
--- a/subversion/libsvn_fs_x/rev_file.h
+++ b/subversion/libsvn_fs_x/rev_file.h
@@ -26,11 +26,14 @@
#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.
+/* 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.
@@ -38,11 +41,22 @@
typedef struct svn_fs_x__packed_number_stream_t
svn_fs_x__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_x__revision_file_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. */
@@ -51,60 +65,24 @@ typedef struct svn_fs_x__revision_file_t
/* 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_x__packed_number_stream_t *p2l_stream;
-
- /* the opened L2P index stream or NULL. Always NULL for txns. */
- svn_fs_x__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;
+} svn_fs_x__rev_file_info_t;
- /* 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_x__revision_file_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;
-/* 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. */
+/* 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__open_pack_or_rev_file(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);
+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
@@ -114,39 +92,107 @@ svn_fs_x__open_pack_or_rev_file(svn_fs_x__revision_file_t **file,
* 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__open_pack_or_rev_file_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);
-
-/* 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_x__auto_read_footer(svn_fs_x__revision_file_t *file);
+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__open_proto_rev_file(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);
+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__wrap_temp_rev_file(svn_fs_x__revision_file_t **file,
+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);
-/* Close all files and streams in FILE.
+/* 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);
+
+/* Set *SIZE to the length of the revision data in FILE.
+ */
+svn_error_t *
+svn_fs_x__rev_file_data_size(svn_filesize_t *size,
+ 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);