Oryx::DBM - DBM Storage interface for Oryx


Oryx documentation Contained in the Oryx distribution.

Index


Code Index:

NAME

Top

Oryx::DBM - DBM Storage interface for Oryx

SYNOPSIS

Top

 my $storage = Oryx::DBM->new;

 $storage->connect([ 'dbm:Deep:datapath=/path/to/datafiles' ]);

 $storage->dbh;
 $storage->db_name;
 $storage->ping;
 $storage->schema;
 $storage->util;
 $storage->set_util;
 $storage->deploy_class;
 $storage->deploy_schema;

DESCRIPTION

Top

DBM Storage interface for Oryx. You should not need to instantiate this directly, use Oryx->connect() instead.

METHODS

Top

new

Simple constructor

dbh

stub - returns $self

connect( \@conn, [$schema] )

Called by Oryx->connect(). You shouldn't need to be doing this.

catalog

DBM::Deep instance for holding the catalog of tables. This is a sort of global internal store for the DBM backend for keeping meta data which it needs.

ping

ping the database - all this does here is make sure the catalog exists and is a DBM::Deep instance

schema

returns the schema if called with no arguments, otherwise sets if called with a Oryx::Schema instance.

schema

returns the schema if called with no arguments, otherwise sets if called with a Oryx::Schema instance.

set_util

determines which Oryx::DBI::Util class to instantiate by looking at the dsn passed to connect and sets it

deploy_schema( $schema )

Takes a Oryx::Schema instance and deploys all classes seen by that schema instance to the database creating all DBM::Deep db files needed for storing your persistent objects.

deploy_class( $class )

does the work of deploying a given class; called by deploy_schema

SEE ALSO

Top

Oryx, Oryx::Class, Oryx::DBM::Util

AUTHOR

Top

Copyright (C) 2005 Richard Hundt <richard NO SPAM AT protea-systems.com>

LICENSE

Top

This library is free software and may be used under the same terms as Perl itself.


Oryx documentation Contained in the Oryx distribution.
package Oryx::DBM;

use DBM::Deep;
use Oryx::DBM::Class;
use Oryx::DBM::Util;
use Oryx::Class;

use base qw(Oryx Oryx::MetaClass);

__PACKAGE__->mk_classdata("datapath");

our $DEBUG = 0;

sub new {
    my $class = shift;
    return bless { }, $class;
}


sub dbh { $_[0] }
sub commit {  }

# $conn looks like this : ["dbm:Deep:datapath=/path/to/data"]
sub connect {
    my ($self, $conn, $schema) = @_;

    if ($conn->[0] =~ /^dbm:Deep:datapath=(.+)$/) {
        $self->_croak('ERROR: connect called without a datapath')
            unless $1;
        $self->datapath($1);
    } else {
        $self->_croak("ERROR: bad dsn $conn->[0]");
    }

    $self->catalog(DBM::Deep->new($self->datapath.'/oryx_catalog'));

    $self->init('Oryx::DBM::Class', $conn, $schema);

    return $self;
}

sub catalog { $_[0]->{catalog} = $_[1] if $_[1]; $_[0]->{catalog} }

sub ping {
    my $self = shift;
    return UNIVERSAL::isa($self->catalog, 'DBM::Deep');
}


sub schema {
    my $self = shift;
    $self->{schema} = shift if @_;
    $self->{schema};
}

sub util {
    my $self = shift;
    $self->{util} = shift if @_;
    $self->{util};
}

sub set_util {
    my $self = shift;
    $self->util( Oryx::DBM::Util->new );
}

sub deploy_schema {
    my ($self, $schema) = @_;
    $schema = $self->schema unless defined $schema;

    $DEBUG && $self->_carp(
	"deploy_schema $schema : classes => ".join(",\n", $schema->classes)
    );
    unless (-d $self->datapath) {
	mkdir $self->datapath;
    }
    foreach my $class ($schema->classes) {
	$self->deploy_class($class);
    }
}

sub deploy_class {
    my ($self, $class) = @_;
    $DEBUG && $self->_carp("DEPLOYING $class");
    $self->util->table_create($self, $class->table);
}

1;