/* reps-table.h : internal interface to `representations' table
 *
 * ====================================================================
 * Copyright (c) 2000-2002 CollabNet.  All rights reserved.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution.  The terms
 * are also available at http://subversion.tigris.org/license-1.html.
 * If newer versions of this license are posted there, you may use a
 * newer version instead, at your option.
 *
 * This software consists of voluntary contributions made by many
 * individuals.  For exact contribution history, see the revision
 * history and logs, available at http://subversion.tigris.org/.
 * ====================================================================
 */

#ifndef SVN_LIBSVN_FS_REPS_TABLE_H
#define SVN_LIBSVN_FS_REPS_TABLE_H

#include "db.h"
#include "svn_io.h"
#include "svn_fs.h"
#include "skel.h"
#include "trail.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */


/*** Creating the `representations' table. ***/

/* Open a `representations' table in ENV.  If CREATE is non-zero,
   create one if it doesn't exist.  Set *REPS_P to the new table.
   Return a Berkeley DB error code.  */
int svn_fs__open_reps_table (DB **reps_p, DB_ENV *env, int create);



/*** Storing and retrieving reps.  ***/

/* Set *SKEL_P to point to the REPRESENTATION skel for the key KEY in
   FS, as part of TRAIL.  Allocate the skel and the data it points
   into in TRAIL->pool.

   If KEY is not a representation in FS, the error
   SVN_ERR_FS_NO_SUCH_REPRESENTATION is returned.  */
svn_error_t *svn_fs__read_rep (skel_t **skel_p,
                               svn_fs_t *fs,
                               const char *key,
                               trail_t *trail);


/* Store SKEL as the representation for KEY in FS, as part of
   TRAIL.  Do any necessary temporary allocation in TRAIL->pool.  */
svn_error_t *svn_fs__write_rep (svn_fs_t *fs,
                                const char *key,
                                skel_t *skel,
                                trail_t *trail);


/* Store SKEL as a new representation in FS, and the new rep's key in
   *KEY, as part of trail.  The new key is allocated in TRAIL->pool.  */
svn_error_t *svn_fs__write_new_rep (const char **key,
                                    svn_fs_t *fs,
                                    skel_t *skel,
                                    trail_t *trail);

/* Delete representation KEY from FS, as part of TRAIL.
   WARNING: This does not ensure that no one references this
   representation!  Callers should ensure that themselves.  */
svn_error_t *svn_fs__delete_rep (svn_fs_t *fs,
                                 const char *key,
                                 trail_t *trail);


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* SVN_LIBSVN_FS_REPS_TABLE_H */


/* 
 * local variables:
 * eval: (load-file "../../tools/dev/svn-dev.el")
 * end:
 */
