1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
|
package VCP::DB;
=head1 NAME
VCP::DB - Persistant storage for id -> (name, rev_id) maps
=head1 SYNOPSIS
use base qw( VCP::DB );
=head1 DESCRIPTION
By default, most VCP::Dest::* drivers keep track of the relationship
between the id field assigned by the (original) VCP::Source::* driver
and the final name and rev_id (or whatever fields are important to it)
in the destination repository so that the previous_id fields, which
refer to the original id, may be resolved when backfilling or branching.
The VCP::*::revml drivers do not do this; they do not need to resolve id
fields.
The intent for this file is to serve as a base class so that individual
sites may write their own ", ref $self, " plugins to, for instance, store this
state in a RDBMS table. This is not quite offered at this time; we need
to add an option to the appropriate VCP::Dest::* modules to allow the
appropriate ", ref $self, " file to be loaded.
To write your own ", ref $self, " file, see VCP::DB::sdbm.
=for test_script t/01db_file.t
=cut
$VERSION = 1 ;
use strict ;
use Carp;
use VCP::Debug qw( :debug );
use VCP::Utils qw( start_dir );
#use fields (
# 'Store', ## object used to store the database
#);
=head2 Methods
=over
=cut
=item new
VCP::DB::foo->new(
StoreLoc => $dir, ## path to a dir to keep the state store in
);
The C<Store> field indicates where the DBFile should be stored, for
instance a DBI specification string or a directory to place a
"revmap.db" file in. There is no control over the filename, as
different storage modes may need different conventions.
=cut
sub new {
my $class = shift;
my $self = bless { @_ }, $class;
my $type = delete $self->{Type} || "sdbm";
$self->{Store} ||= do {
my $try_type = "VCP::DB_File::$type";
eval "require $try_type"
? $type = $try_type
: (
eval "require $type;"
|| Carp::confess
"Could not load VCP::DB_File subclass $type for $self->{TableName}"
);
$type->new( @_ );
};
return $self ;
}
=item store_loc
Gets (does not set) the StoreLoc field as an absolute path.
=cut
sub store_loc {
my $self = shift;
$self->{Store}->store_loc( @_ )
}
=item delete_db
$db->delete_db;
Deletes the persitent store. This should remove all files, lock files,
etc. for filesystem stores and drop any tables for RDBMS stores.
Default action is to call close_db; subclasses should
(subclasses should call C<$self->SUPER::delete_db before doing anything
else in their delete_db() overrides).
=cut
sub delete_db {
my $self = shift;
$self->{Store}->delete_db( @_ )
}
=item open_db
$db->open_db;
Creates a new or opens an existing db.
(subclasses should call C<$self->SUPER::open_db before doing anything
else in their open_db() overrides).
=cut
sub open_db {
my $self = shift;
$self->{Store}->open_db( @_ )
}
=item open_existing_db
$db->open_existing_db;
Opens an existing db.
(subclasses should call C<$self->SUPER::open_existing_db before doing anything
else in their open_existing_db() overrides).
=cut
sub open_existing_db {
my $self = shift;
$self->{Store}->open_existing_db( @_ );
}
=item close_db
$db->close_db;
(subclasses should call C<$self->SUPER::close_db before doing anything
else in their close_db() overrides).
=cut
sub close_db {
my $self = shift;
$self->{Store}->close_db( @_ );
}
=item set
$db->set( $key, @values );
Sets the values for $key.
=cut
sub set {
my $self = shift;
$self->{Store}->set( @_ );
}
=item get
my @values = $db->get( $key );
Gets the values for $key.
=cut
sub get {
my $self = shift;
$self->{Store}->get( @_ )
}
=item exists
$db->exists( $key );
Tests that key exists
=cut
sub exists {
my $self = shift;
$self->{Store}->exists( @_ );
}
=item keys
my @keys = $db->keys;
Returns a list of ARRAY references, each ARRAY reference contains
the fields for one key.
=cut
sub keys {
my $self = shift;
$self->{Store}->keys( @_ );
}
=item dump
$db->dump( \*STDOUT );
my $s = $db->dump;
my @l = $db->dump;
Dumps keys and values from a DB, in lexically sorted key order.
If a filehandle reference is provided, prints to that filehandle.
Otherwise, returns a string or array containing the entire dump,
depending on context.
=cut
sub dump {
my $self = shift;
$self->{Store}->dump( @_ );
}
=back
=head1 AUTHOR
Barrie Slaymaker <barries@slaysys.com>
=head1 COPYRIGHT
Copyright (c) 2000, 2001, 2002 Perforce Software, Inc.
All rights reserved.
See L<VCP::License|VCP::License> (C<vcp help license>) for the terms of use.
=cut
1
|