/* 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
