diff options
Diffstat (limited to 'subversion/libsvn_fs_x/rev_file.h')
-rw-r--r-- | subversion/libsvn_fs_x/rev_file.h | 208 |
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); |