package Xmldoom::Schema::Column; use Xmldoom::Threads; use strict; sub new { my $class = shift; my $args = shift; my $parent; my $name; my $required; my $primary_key; my $id_generator; my $type; my $description; my $size; my $options; my $auto_increment; my $default; my $timestamp; if ( ref($args) eq 'HASH' ) { $parent = $args->{parent}; $name = $args->{name}; $type = $args->{type}; $size = $args->{size}; $options = $args->{options}; $required = $args->{required}; $primary_key = $args->{primary_key}; $id_generator = $args->{id_generator}; $description = $args->{description}; $auto_increment = $args->{auto_increment}; $default = $args->{default}; $timestamp = $args->{timestamp}; } else { $parent = $args; $name = shift; $type = shift; $size = shift; $required = shift; $primary_key = shift; $description = shift; } if ( not defined $name or not defined $type ) { die "Cannot create a column without setting both name and type"; } my $self = { parent => $parent, name => $name, type => uc($type), size => $size, options => $options, required => $required || 0, primary_key => $primary_key || 0, auto_increment => $auto_increment || 0, id_generator => $id_generator, description => $description, default => $default, timestamp => $timestamp || 0, }; bless $self, $class; return Xmldoom::Threads::make_shared($self, $args->{shared}); } sub DESTROY { my $self = shift; # we don't need no stinking weak references! $self->{parent} = undef; } sub get_table { return shift->{parent}; } sub get_name { return shift->{name}; } sub get_type { return shift->{type}; } sub get_size { return shift->{size}; } sub get_options { return shift->{options}; } sub get_description { return shift->{description}; } sub get_default { return shift->{default}; } sub get_timestamp { return shift->{timestamp}; } sub get_id_generator { return shift->{id_generator}; } sub is_primary_key { return shift->{primary_key}; } sub is_required { return shift->{required}; } sub is_auto_increment { return shift->{auto_increment}; } sub get_data_type { my $self = shift; my $value = { }; if ( $self->{type} =~ /char|text/i ) { $value->{type} = "string"; $value->{size} = $self->{size}; } elsif ( $self->{type} =~ /enum/i ) { $value->{type} = "string"; $value->{options} = $self->{options}; } elsif ( $self->{type} =~ /int/i ) { $value->{type} = "integer"; } elsif ( $self->{type} =~ /float/i ) { $value->{type} = "float"; } elsif ( $self->{type} =~ /date|time/i ) { $value->{type} = "date"; } return $value; } 1;