GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages


Manual Reference Pages  -  ALZABO::RDBMSRULES (3)

.ds Aq ’ sub reverse_engineer {
my $self = shift;
my $schema = shift;



    my $dbh = $schema->driver->handle;

    foreach my $table ( $dbh->tables )
    {
        my $t = $schema->make_table( name => $table );

        $self->reverse_engineer_table($t);
    }
}



sub reverse_engineer_table {
my $self = shift;
my $table = shift;



    my $dbh = $table->schema->driver->handle;

    my $sth = $dbh->column_info( undef, $table->schema->name, $table->name, undef );

    while ( my $col_info = $sth->fetchrow_hashref )
    {
        use Data::Dumper; warn Dumper $col_info;
        my %attr = ( name     => $col_info->{COLUMN_NAME},
                     type     => $col_info->{TYPE_NAME},
                     nullable => $col_info->{NULLABLE} ? 1 : 0,
                   );

        $attr{size} =
            $col_info->{COLUMN_SIZE} if $col_info->{COLUMN_SIZE};

        $attr{precision} =
            $col_info->{DECIMAL_DIGITS} if $col_info->{DECIMAL_DIGITS};

        $attr{default} =
            $col_info->{COLUMN_DEF} if defined $col_info->{COLUMN_DEF};

        $attr{comment} =
            $col_info->{REMARKS} if defined $col_info->{REMARKS};

        $table->make_column(%attr);
    }

    $self->reverse_engineer_table_primary_key($table);
}



sub reverse_engineer_table_primary_key {
my $self = shift;
my $table = shift;



    my $dbh = $table->schema->driver->handle;

    my $sth = $dbh->column_info( undef, $table->schema->name, $table->name );

    while ( my $pk_info = $sth->fetchrow_hashref )
    {
        $table->add_primary_key( $table->column( $pk_info->{COLUMN_NAME} ) );
    }
}



NAME

Alzabo::RDBMSRules - Base class for Alzabo RDBMS rulesets

CONTENTS

SYNOPSIS



  use Alzabo::RDBMSRules;

  my $rules = Alzabo::RDBMSRules( rules => MySQL );



DESCRIPTION

This class is the base class for all Alzabo::RDBMSRules modules. To instantiate a subclass call this class’s new() method. See the SUBCLASSING Alzabo::RDBMSRules section for information on how to make a ruleset for the RDBMS of your choice.

METHODS

    available

A list of names representing the available Alzabo::RDBMSRules subclasses. Any one of these names would be appropriate as the rdbms parameter for the Alzabo::RDBMSRules->new() method.

    new

The constructor always accepts one parameter, rdbms, which is the name of the RDBMS to be used.

Some subclasses may accept additional values.

The constructor returns a new Alzabo::RDBMSRules object of the appropriate subclass.

Throws: Alzabo::Exception::Eval

schema_sql (CWAlzabo::Create::Schema object)

Returns a list of SQL statements which would create the given schema.

index_sql (CWAlzabo::Create::Index object)

Returns a list of SQL statements to create the specified index.

drop_table_sql (CWAlzabo::Create::Table object)

Returns a list of SQL statements to drop the specified table.

drop_index_sql (CWAlzabo::Create::Index object)

Returns a list of SQL statements to drop the specified index.

    schema_sql_diff

This method takes two parameters:
o new => Alzabo::Create::Schema object
o old => Alzabo::Create::Schema object
This method compares the two schema objects and returns an array of SQL statements which turn the old schema into the new one.

    table_sql_diff

This method takes two parameters:
o new => Alzabo::Create::Table object
o old => Alzabo::Create::Table object
This method compares the two table objects and returns an array of SQL statements which turn the old table into the new one.

type_is_numeric (CWAlzabo::Column object)

Returns a boolean indicating whether or not the column is numeric (integer or floating point).

    quote_identifiers

Returns true or false to indicate whether or not the generated DDL SQL statements should have their identifiers quoted or not. This may be overridden by subclasses. It defaults to false.

    can_alter_table_name

If this is true, then when syncing a schema, the object will call alter_table_name_sql() to change the table’s name. Otherwise it will call recreate_table_sql().

    can_alter_column_name

If this is true, then when syncing a schema, the object will call alter_column_name_sql() to change the table’s name. Otherwise it will call recreate_table_sql().

    Virtual Methods

The following methods are not implemented in the Alzabo::RDBMSRules class itself and must be implemented in its subclasses.

    column_types

Returns a list of valid column types.

    feature ($feature)

Given a string defining a feature, this method indicates whether or not the given RDBMS supports that feature. By default, this method always returns false unless overridden in the subclass.

Features that may be asked for:
o extended_column_types

Column types that must be input directly from a user, as opposed to being chosen from a list. MySQL’s ENUM and SET types are examples of such types.

o index_column_prefixes

MySQL supports the notion of column prefixes in indexes, allowing you to index only a portion of a large text column.

o fulltext_indexes

This should be self-explanatory.

o functional_indexes

Indexes on functions, as supported by PostgreSQL.

validate_schema_name (CWAlzabo::Schema object)

Throws an Alzabo::Exception::RDBMSRules if the schema’s name is not valid.

validate_table_name (CWAlzabo::Create::Table object)

Throws an Alzabo::Exception::RDBMSRules if the table’s name is not valid.

validate_column_name (CWAlzabo::Create::Column object)

Throws an Alzabo::Exception::RDBMSRules if the column’s name is not valid.

    validate_column_type ($type_as_string)

Throws an Alzabo::Exception::RDBMSRules if the type is not valid.

This method returns a canonized version of the type.

validate_column_length (CWAlzabo::Create::Column object)

Throws an Alzabo::Exception::RDBMSRules if the length or precision is not valid for the given column.

    validate_column_attribute

This method takes two parameters:
o column => Alzabo::Create::Column object
o attribute => $attribute
This method is a bit different from the others in that it takes an existing column object and a <B>potentialB> attribute.

It throws an Alzabo::Exception::RDBMSRules if the attribute is is not valid for the column.

validate_primary_key (CWAlzabo::Create::Column object)

Throws an Alzabo::Exception::RDBMSRules if the column is not a valid primary key for its table.

validate_sequenced_attribute (CWAlzabo::Create::Column object)

Throws an Alzabo::Exception::RDBMSRules if the column cannot be sequenced.

validate_index (CWAlzabo::Create::Index object)

Throws an Alzabo::Exception::RDBMSRules if the index is not valid.

table_sql (CWAlzabo::Create::Table object)

Returns an array of SQL statements to create the specified table.

column_sql (CWAlzabo::Create::Column object)

Returns an array of SQL statements to create the specified column.

foreign_key_sql (CWAlzabo::Create::ForeignKey object)

Returns an array of SQL statements to create the specified foreign key.

drop_column_sql (CWAlzabo::Create::Column object)

Returns an array of SQL statements to drop the specified column.

drop_foreign_key_sql (CWAlzabo::Create::ForeignKey object)

Returns an array of SQL statements to drop the specified foreign key.

column_sql_add (CWAlzabo::Create::Column object)

Returns an array of SQL statements to add the specified column.

    column_sql_diff

This method takes two parameters:
o new => Alzabo::Create::Column object
o old => Alzabo::Create::Column object
This method compares the two table objects and returns an array of SQL statements which turn the old table into the new one.

    index_sql_diff

This method takes two parameters:
o new => Alzabo::Create::Index object
o old => Alzabo::Create::Index object
This method compares the two index objects and returns an array of SQL statements which turn the old index into the new one.

    alter_primary_key_sql

This method takes two parameters:
o new => Alzabo::Create::Table object
o old => Alzabo::Create::Table object
This method compares the two table objects and returns an array of SQL statements which alter the old one’s primary key to match the new one’s.

alter_table_name_sql (CWAlzabo::Create::Table object)

Given a table, this method is expected to change the table’s name from $table->former_name to $table->name. This will only be called if the rules object returns true for can_alter_table_name().

alter_column_name_sql (CWAlzabo::Create::Table object)

Given a column, this method is expected to change the table’s name from $column->former_name to $column->name. This will only be called if the rules object returns true for can_alter_column_name().

    recreate_table_sql

This method takes two parameters:
o new => Alzabo::Create::Table object
o old => Alzabo::Create::Table object
This method is expected to drop the old table and create the new one.

However, it <B>mustB> preserve all the data stored in the old table, excluding data in columns that are being dropped. Additionally, if there are sequences associated with columns in the old table, they should not be dropped.

This method will only be called if either can_alter_table_name() or can_alter_column_name() return false.

reverse_engineer (CWAlzabo::Create::Schema object)

Given a schema object (which presumably has no tables), this method uses the schema’s Alzabo::Driver object to connect to an existing database and reverse engineer it into the appropriate Alzabo objects.

type_is_integer (CWAlzabo::Column object)

Returns a boolean indicating whether or not the column is an integer type.

type_is_floating_point (CWAlzabo::Column object)

Returns a boolean indicating whether or not the column is a floating point type.

type_is_character (CWAlzabo::Column object)

Returns a boolean indicating whether or not the column is a character type. This is defined as any type which is defined to store text, regardless of length.

type_is_date (CWAlzabo::Column object)

Returns a boolean indicating whether or not the column is a date type. This is <B>notB> true for datetime types.

type_is_datetime (CWAlzabo::Column object)

Returns a boolean indicating whether or not the column is a datetime type. This is <B>notB> true for date types.

type_is_time (CWAlzabo::Column object)

Returns a boolean indicating whether or not the column is a time type. This is <B>notB> true for datetime types.

type_is_time_interval (CWAlzabo::Column object)

Returns a boolean indicating whether or not the column is a time interval type.

SUBCLASSING Alzabo::RDBMSRules

To create a subclass of Alzabo::RDBMSRules for your particular RDBMS is fairly simple.

Here’s a sample header to the module using a fictional RDBMS called FooDB:



 package Alzabo::RDBMSRules::FooDB;

 use strict;
 use vars qw($VERSION);

 use Alzabo::RDBMSRules;

 use base qw(Alzabo::RDBMSRules);



The next step is to implement a new() method and the methods listed under the section Virtual Methods. The new method should look a bit like this:



 1:  sub new
 2:  {
 3:      my $proto = shift;
 4:      my $class = ref $proto || $proto;
 5:      my %p = @_;
 6:
 7:      my $self = bless {}, $self;
 8:
 9:      return $self;
 10:  }



The hash %p contains any values passed to the Alzabo::RDBMSRules->new method by its caller.

Lines 1-7 should probably be copied verbatim into your own new method. Line 5 can be deleted if you don’t need to look at the parameters.

The rest of your module should simply implement the methods listed under the Virtual Methods section of this documentation.

Look at the included Alzabo::RDBMSRules subclasses for examples. Feel free to contact me for further help if you get stuck. Please tell me what database you’re attempting to implement, and include the code you’ve written so far.

AUTHOR

Dave Rolsky, <dave@urth.org>
Search for    or go to Top of page |  Section 3 |  Main Index


perl v5.20.3 ALZABO::RDBMSRULES (3) 2016-04-03

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with manServer 1.07.