/* archive.h:
 *
 ****************************************************************
 * Copyright (C) 2003 Tom Lord
 *
 * See the file "COPYING" for further information about
 * the copyright and warranty status of this work.
 */

#ifndef INCLUDE__LIBARCH__ARCHIVE_H
#define INCLUDE__LIBARCH__ARCHIVE_H


#include "hackerlab/arrays/ar.h"
#include "hackerlab/mem/talloc.h"
#include "libawk/relational.h"
#include "libarch/hooks.h"
#include "libarch/archive-version.h"
#include "libarch/patch-id.h"
#include "libinifile/inifile.h"




struct arch_archive_vtable;

enum arch_revision_type
{
  arch_import_revision,
  arch_simple_revision,
  arch_continuation_revision
};

enum arch_revision_lock_state
{
  arch_revision_unlocked,
  arch_revision_user_locked,
  arch_revision_txn_locked,
  arch_revision_unknown_lock_state,
  arch_revision_illegal_lock_state,
};

typedef enum arch_fail_action_
{
    arch_fail_ignore,
    arch_fail_warn,
    arch_fail_error
} arch_fail_action_t;


struct arch_archive
{
  struct arch_archive_vtable * vtable;

  struct arch_archive * next;
  
  t_uchar * registered_name;
  t_uchar * official_name;
  t_uchar * location;
  t_uchar * version;
  enum arch_archive_access access;
  enum arch_archive_type type;
  t_uchar * mirror_of;
  t_uchar * client_anticipates_mirror;
  int http_blows; /* initialised during connection */
  int signed_archive;
  arch_fail_action_t when_unsigned;
  int in_registry; /* this is configured by ~/.arch-params/archives/archive-name */
};

struct arch_archive_vtable
{
  t_uchar * type;

  /**
   * \brief return the archive version string.
   *
   * if one is not available (i.e. its not an archive)
   * return NULL
   */
  t_uchar * (*archive_version) (struct arch_archive * a);

  rel_table (*categories) (struct arch_archive * a);
  rel_table (*branches) (struct arch_archive * a, t_uchar * category);
  rel_table (*versions) (struct arch_archive * a, t_uchar * package);
  rel_table (*revisions) (struct arch_archive * a, t_uchar * version);

  t_uchar * (*archive_log) (struct arch_archive *, t_uchar * revision);
  int (*revision_type) (enum arch_revision_type * type, int * is_cached,
			int *has_ancestry, 
                        struct arch_archive * a, t_uchar const * revision);
  void (*get_patch) (int out_fd, struct arch_archive * a, t_uchar * revision);
  void (*get_cached) (int out_fd, struct arch_archive * a, t_uchar * revision);
  void (*get_import) (int out_fd, struct arch_archive * a, t_uchar * revision);
  t_uchar * (*get_continuation) (struct arch_archive * a, t_uchar * revision);
  int (*set_meta_info)  (struct arch_archive * a, t_uchar * meta_info_name, t_uchar * meta_info_value);
  t_uchar * (*get_meta_info)  (struct arch_archive * a, t_uchar * meta_info_name);

  int (*make_category) (t_uchar ** errstr, struct arch_archive * a, t_uchar * category);
  int (*make_branch) (t_uchar ** errstr, struct arch_archive * a, t_uchar * branch);
  int (*make_version) (t_uchar ** errstr, struct arch_archive * a, t_uchar * version);

  int (*lock_revision) (t_uchar ** errstr, struct arch_archive * a,
                        t_uchar * version,
                        t_uchar * prev_level,
                        t_uchar * uid,
                        t_uchar * txn_id,
                        t_uchar * new_level);


  int (*revision_ready) (t_uchar ** errstr, struct arch_archive *a,
			 struct arch_archive * from_archive,
                         t_uchar * version,
                         t_uchar * prev_level,
                         t_uchar * uid, 
                         t_uchar * txn_id,
                         t_uchar * new_level);

  int (*finish_revision) (t_uchar ** errstr, struct arch_archive * a,
                          t_uchar * version,
                          t_uchar * prev_level,
                          t_uchar * uid,
                          t_uchar * txn_id,
                          t_uchar * new_level);

  int (*break_revision_lock) (t_uchar ** errstr, struct arch_archive * a,
                              t_uchar * version,
                              t_uchar * prev_level,
                              t_uchar * uid,
                              t_uchar * txn_id);

  enum arch_revision_lock_state (*lock_state) (t_uchar ** prev_level_ret,
                                               t_uchar ** uid_ret,
                                               t_uchar ** txn_id_ret,
                                               struct arch_archive * a,
                                               t_uchar * version);

  int (*put_log) (t_uchar ** errstr, struct arch_archive * a,
                  t_uchar * version,
                  t_uchar * prev_level,
                  t_uchar * uid,
                  t_uchar * txn_id,
                  t_uchar * log_text);
  int (*put_continuation) (t_uchar ** errstr, struct arch_archive * a,
                           t_uchar * version,
                           t_uchar * prev_level,
                           t_uchar * uid,
                           t_uchar * txn_id,
                           t_uchar * continuation);
  int (*put_changeset) (t_uchar ** errstr, struct arch_archive * a,
                        t_uchar * version,
                        t_uchar * prev_level,
                        t_uchar * uid,
                        t_uchar * txn_id,
                        t_uchar * level,
                        int in_fd);
  int (*put_import) (t_uchar ** errstr, struct arch_archive * a,
                     t_uchar * version,
                     t_uchar * prev_level,
                     t_uchar * uid,
                     t_uchar * txn_id,
                     t_uchar * level,
                     int in_fd);

  int (*put_cached) (t_uchar ** errstr, struct arch_archive * a,
		     struct arch_archive * from_archive,
                     t_uchar * revision,
                     int in_fd);
  int (*delete_cached) (t_uchar ** errstr, struct arch_archive * a, t_uchar * revision);

  void (*repair_non_txnal) (int chatter_fd, struct arch_archive * a);

  void (*get_ancestry) (int out_fd, struct arch_archive * a, t_uchar * revision);
  int (*put_ancestry) (t_uchar **errstr, struct arch_archive *a,
		       struct arch_archive * from_archive,
		       t_uchar * revision,
		       int in_fd);
  int (*delete_ancestry) (t_uchar ** errstr, struct arch_archive * a, t_uchar * revision);
  int (*set_mirror) (t_uchar ** errstr, struct arch_archive *archive, int enabled);
};



/* TODO this belongs as the underlying mechanism for arch_archive_connect.. name, 0, ?, ? */
/* A connection cache that can be used by the core code eventually,
 * and by any repetitive looping areas in the interim,
 * to simplify archive connection mgmt.
 */
AR_TYPEDEF (struct arch_archive *, arch_archive);
typedef struct _arch_archive_connection_cache
{
    ar_arch_archive cache;
} arch_archive_connection_cache;

extern int arch_archive_finalise (void *archive);
void arch_archive_connection_cache_init (arch_archive_connection_cache * cache);
void arch_archive_connection_cache_finalise (arch_archive_connection_cache * cache, struct arch_archive * dontclose);
struct arch_archive * arch_archive_connection_cache_find_or_maybe_connect (arch_archive_connection_cache * cache, t_uchar * name, int soft_errors);
void arch_archive_connection_cache_add (arch_archive_connection_cache * cache, struct arch_archive * arch);
extern void arch_make_archive (t_uchar * name, t_uchar * location, t_uchar * mirror_of, int dot_listing_lossage, int signed_archive, int tla_archive, int register_archive);
extern void arch_archive_register (struct arch_archive * archive);
extern struct arch_archive * arch_archive_connect_branch (t_uchar const * branch, t_uchar ** branch_out);
extern struct arch_archive * arch_archive_connect_writeable_branch (t_uchar const * branch, t_uchar ** branch_out);
extern struct arch_archive * arch_archive_connect_commitable_branch (t_uchar const * branch, t_uchar ** branch_out);
extern struct arch_archive * arch_archive_connect_readonly (t_uchar const * name);
extern struct arch_archive * arch_archive_connect_writable (t_uchar const * name);
extern struct arch_archive * arch_archive_connect_commitable (t_uchar const * name);
extern struct arch_archive * arch_archive_connect_ext (t_uchar const * const name, t_uchar const * const want_mirror_of, int soft_errors);
extern struct arch_archive * arch_archive_connect_location (t_uchar const * location, int soft_errors);
extern struct arch_archive * arch_archive_connect_location_ext (t_uchar const * name, t_uchar const * location, t_uchar const * want_mirror_of, int soft_errors, int override_signed);
extern int arch_archive_cmp_location (t_uchar const *left, t_uchar const *right);
extern int arch_archive_check_signed_status (struct arch_archive *archive, int status_fd);
extern arch_fail_action_t arch_archive_inifile_signed (struct arch_archive *archive, inifile_t *inifile, arch_fail_action_t default_value);
extern void arch_archive_inifile_set_signed (inifile_t *inifile, arch_fail_action_t value);
extern int arch_archive_set_mirror (t_uchar ** errstr, struct arch_archive *archive, int enabled);
extern int arch_archive_is_cached_connection (struct arch_archive *archive);
#define arch_archive_close(arch) talloc_free(arch)
extern t_uchar * arch_archive_version (struct arch_archive * arch);
extern rel_table arch_archive_categories (struct arch_archive * arch);
extern rel_table arch_archive_branches (struct arch_archive * arch, t_uchar * category);
extern rel_table arch_archive_versions (struct arch_archive * arch, t_uchar * package);
extern t_uchar * arch_archive_latest_revision (struct arch_archive * arch, t_uchar * version, int full);
extern rel_table arch_archive_revisions (struct arch_archive * arch, t_uchar const * version, int full);
extern t_uchar * arch_archive_log (struct arch_archive * arch, t_uchar * revision);
extern enum arch_revision_type arch_archive_get_revision_type (struct arch_archive * arch, t_uchar const * revision);
extern void arch_revision_type (enum arch_revision_type * type, int * is_cached, int *has_ancestry,
                                struct arch_archive * arch, arch_patch_id * revision);
extern int arch_revision_exists (struct arch_archive * arch, t_uchar * revision);
extern void arch_get_patch_targz (int out_fd, struct arch_archive * arch, t_uchar * revision);
extern void arch_get_patch (struct arch_archive * arch, arch_patch_id * const revision, t_uchar const * const dest_dir);
extern void arch_get_cached_revision_targz (int out_fd, struct arch_archive * arch, t_uchar * revision);
extern void arch_get_cached_revision (struct arch_archive * arch, arch_patch_id * const revision, t_uchar const * const dest_dir);
extern void arch_get_import_targz (int out_fd, struct arch_archive * arch, t_uchar * revision);
extern void arch_get_import_revision (struct arch_archive * arch, arch_patch_id * const revision, t_uchar const * const dest_dir);
extern arch_patch_id * arch_get_continuation (struct arch_archive * arch, arch_patch_id * revision);
extern int arch_set_meta_info (struct arch_archive * arch, t_uchar * meta_info_name, t_uchar * meta_info_value);
extern t_uchar * arch_get_meta_info (struct arch_archive * arch, t_uchar * meta_info_name);
extern t_uchar * arch_archive_not_writable (struct arch_archive * arch, int mirror_ok);
extern int arch_make_category (t_uchar ** errstr,
                               struct arch_archive * arch, t_uchar * category);
extern int arch_make_branch (t_uchar ** errstr,
                             struct arch_archive * arch, t_uchar * branch);
extern int arch_make_version (t_uchar ** errstr,
                              struct arch_archive * arch, t_uchar * version);
extern int arch_archive_lock_revision (t_uchar ** errstr, struct arch_archive * a,
                                       t_uchar * version,
                                       t_uchar * prev_level,
                                       t_uchar * uid,
                                       t_uchar * txn_id,
                                       t_uchar * new_level);
extern int arch_revision_ready (t_uchar ** errstr, struct arch_archive *a,
                                t_uchar * version,
                                t_uchar * prev_level,
                                t_uchar * uid,
                                t_uchar * txn_id,
                                t_uchar * new_level);
extern int arch_mirror_revision_ready (t_uchar ** errstr, struct arch_archive *a,
				       struct arch_archive *from_archive,
				       t_uchar * version,
				       t_uchar * prev_level,
				       t_uchar * uid,
				       t_uchar * txn_id,
				       t_uchar * new_level);
extern int arch_archive_finish_revision (t_uchar ** errstr, struct arch_archive * a,
                                         t_uchar * version,
                                         t_uchar * prev_level,
                                         t_uchar * uid,
                                         t_uchar * txn_id,
                                         t_uchar * new_level);
extern enum arch_revision_lock_state arch_archive_revision_lock_state (t_uchar ** prev_level_ret,
                                                                       t_uchar ** uid_ret,
                                                                       t_uchar ** txn_id_ret,
                                                                       struct arch_archive * a,
                                                                       t_uchar * version);
extern int arch_archive_break_revision_lock (t_uchar ** errstr, struct arch_archive * a,
                                             t_uchar * version,
                                             t_uchar * prev_level,
                                             t_uchar * uid,
                                             t_uchar * txn_id);
extern int arch_archive_put_log (t_uchar ** errstr, struct arch_archive * a,
                                 t_uchar * version,
                                 t_uchar * prev_level,
                                 t_uchar * uid,
                                 t_uchar * txn_id,
                                 t_uchar * log_text);
extern int arch_archive_put_continuation (t_uchar ** errstr, struct arch_archive * a,
                                          t_uchar * version,
                                          t_uchar * prev_level,
                                          t_uchar * uid,
                                          t_uchar * txn_id,
                                          t_uchar * continuation);
extern int arch_archive_put_changeset_targz (t_uchar ** errstr, struct arch_archive * a,
                                             t_uchar * version,
                                             t_uchar * prev_level,
                                             t_uchar * uid,
                                             t_uchar * txn_id,
                                             t_uchar * level,
                                             int in_fd);
extern int arch_archive_put_changeset (t_uchar ** errstr, struct arch_archive * a,
                                       t_uchar * version,
                                       t_uchar * prev_level,
                                       t_uchar * uid,
                                       t_uchar * txn_id,
                                       t_uchar * level,
                                       t_uchar * dir);
extern int arch_archive_put_import_targz (t_uchar ** errstr, struct arch_archive * a,
                                          t_uchar * version,
                                          t_uchar * prev_level,
                                          t_uchar * uid,
                                          t_uchar * txn_id,
                                          t_uchar * level,
                                          int in_fd);
extern int arch_archive_put_import (t_uchar ** errstr, struct arch_archive * a,
                                    t_uchar * version,
                                    t_uchar * prev_level,
                                    t_uchar * uid,
                                    t_uchar * txn_id,
                                    t_uchar * level,
                                    t_uchar * dir);
extern int arch_archive_put_cached_targz (t_uchar ** errstr, struct arch_archive * a, t_uchar * revision, int in_fd);
extern int arch_archive_mirror_cached_targz (t_uchar ** errstr, struct arch_archive * a, struct arch_archive *from_archive, t_uchar * revision, int in_fd);
extern int arch_archive_put_cached (t_uchar ** errstr, struct arch_archive * a, t_uchar * revision, t_uchar * dir);
extern int arch_archive_delete_cached (t_uchar ** errstr, struct arch_archive * a, t_uchar * revision);
extern void arch_archive_repair_non_txnal (int chatter_fd, struct arch_archive * a);
extern void arch_archive_get_ancestry (int out_fd, struct arch_archive * arch, t_uchar * revision);
extern int arch_archive_put_ancestry (t_uchar ** errstr, struct arch_archive * a, t_uchar * revision, int in_fd);
extern int arch_archive_mirror_ancestry (t_uchar ** errstr, struct arch_archive * a, struct arch_archive *from_archive, t_uchar * revision, int in_fd);
extern int arch_archive_delete_ancestry (t_uchar ** errstr, struct arch_archive * a, t_uchar * revision);
extern t_uchar * arch_generate_txn_id (void);
extern arch_patch_id * arch_previous_revision (struct arch_archive * arch, arch_patch_id * revision);
extern t_uchar * arch_ancestor_revision (struct arch_archive * arch, t_uchar * revision);
extern t_uchar * archive_tmp_file_name (t_uchar * dir, t_uchar * basename);
extern t_uchar * make_tmp_tar_archive (t_uchar * dir);
extern int arch_get_meta_int_info(struct arch_archive * arch, t_uchar * key);
extern void arch_maybe_cache_commit (struct arch_archive *arch, 
                                     t_uchar * revision, 
                                     t_uchar * anc_archive,
                                     t_uchar * anc_revision,
                                     t_uchar * changeset_path);
extern int arch_archive_has_registry_entry (struct arch_archive * arch);
extern t_uchar * arch_fs_archive_category_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar * category);
extern t_uchar * arch_fs_archive_branch_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar * package);
extern t_uchar * arch_fs_archive_version_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar * version);
extern t_uchar * arch_fs_archive_revision_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar const * revision);
extern t_uchar * arch_fs_archive_revision_log_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar const * revision);
extern t_uchar * arch_fs_archive_changeset_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar const * revision);
extern t_uchar * arch_fs_archive_import_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar const * revision);
extern t_uchar * arch_fs_archive_cached_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar const * revision);
extern t_uchar * arch_fs_archive_cached_checksum_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar const * revision);
extern t_uchar * arch_fs_archive_ancestry_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar const * revision);
extern t_uchar * arch_fs_archive_ancestry_checksum_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar const * revision);
extern t_uchar * arch_fs_archive_continuation_path (struct arch_archive * arch, t_uchar * archive_path, t_uchar const * revision);
extern t_uchar * arch_fs_archive_revision_lock_unlocked_path (struct arch_archive * arch, t_uchar * archive_path,
                                                              t_uchar * version,
                                                              t_uchar * prev_level);
extern t_uchar * arch_fs_archive_revision_lock_locked_path (struct arch_archive * arch, t_uchar * archive_path,
                                                            t_uchar * version,
                                                            t_uchar * prev_level,
                                                            t_uchar * arch_user_id,
                                                            t_uchar * txn_id);
extern t_uchar * arch_fs_archive_revision_lock_locked_contents_path (struct arch_archive * arch, t_uchar * archive_path,
                                                                     t_uchar * version,
                                                                     t_uchar * prev_level,
                                                                     t_uchar * arch_user_id,
                                                                     t_uchar * txn_id);
extern t_uchar * arch_fs_archive_revision_lock_broken_path (struct arch_archive * arch, t_uchar * archive_path,
                                                            t_uchar * version,
                                                            t_uchar * prev_level);
#endif  /* INCLUDE__LIBARCH__ARCHIVE_H */


/* tag: Tom Lord Sat Jan  5 15:26:10 2002 (archive.h)
 */


syntax highlighted by Code2HTML, v. 0.9.1