cvsuser     05/08/10 11:32:39

  Modified:    App-Repository/lib/App Repository.pm RepositoryObject.pm
  Log:
  new_object(): set column default, temp option, check not_null, check null in 
alternate key
  
  Revision  Changes    Path
  1.22      +77 -22    p5ee/App-Repository/lib/App/Repository.pm
  
  Index: Repository.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/App-Repository/lib/App/Repository.pm,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- Repository.pm     9 Aug 2005 18:50:17 -0000       1.21
  +++ Repository.pm     10 Aug 2005 18:32:39 -0000      1.22
  @@ -1500,6 +1500,7 @@
   }
   
   # $ok = $rep->insert_row ($table, [EMAIL PROTECTED], [EMAIL PROTECTED]);
  +# $ok = $rep->insert_row ($table, \%obj);
   sub insert_row {
       &App::sub_entry if ($App::trace);
       my ($self, $table, $cols, $row, $options) = @_;
  @@ -1561,41 +1562,95 @@
   # set in the database that I don't know about, and I want them to be
   # reflected in the returned object.
   # NOTE 2: Tables which have
  +# $object = $rep->new_object($table, [EMAIL PROTECTED], [EMAIL PROTECTED]);
  +# $object = $rep->new_object($table, \%obj_values);
  +# $object = $rep->new_object($table, $col, $value);
  +# $object = $rep->new_object($table);
   sub new_object {
       &App::sub_entry if ($App::trace);
       my ($self, $table, $cols, $row, $options) = @_;
  +
  +    my $tabledef = $self->{table}{$table};
  +    my $class = $tabledef->{class} || "App::RepositoryObject";
  +
       my $ref = ref($cols);
  -    if ($ref && $ref ne "ARRAY") {
  -        $self->_set_defaults($table, $cols);
  -        $self->_check_required_fields($table, $cols);
  -    }
  -    my $retval = $self->insert_row($table, $cols, $row, $options);
  -    die "new($table) unable to create a new row" if (!$retval);
  -    my $params = $self->_last_inserted_id();
  -    if (!$params) {
  -        $params = {};
  +    my ($object);
  +    if ($ref && $ref eq "ARRAY") {
  +        $object = {};
           for (my $i = 0; $i <= $#$cols; $i++) {
  -            if (!$row->[$i] || $row->[$i] !~ /^@/) {
  -                $params->{$cols->[$i] . ".eq"} = $row->[$i];
  +            $object->{$cols->[$i]} = $row->[$i];
  +        }
  +    }
  +    elsif ($ref) {
  +        $object = { %$cols };
  +    }
  +    elsif ($cols) {
  +        $object = { $cols => $row };
  +    }
  +    else {
  +        $object = {};
  +    }
  +
  +    App->use($class);
  +    bless $object, $class;
  +    $object->_init();
  +    $self->_check_default_and_required_fields($object);
  +
  +    if (!$options->{temp}) {
  +        my $retval = $self->insert_row($table, $object, undef, $options);
  +        die "new($table) unable to create a new row" if (!$retval);
  +        my $params = $self->_last_inserted_id();
  +        if (!$params) {
  +            $params = {};
  +            foreach my $col (keys %$object) {
  +                $params->{$col . ".eq"} = $object->{$col};
               }
           }
  +        $object = $self->get_object($table, $params, undef, $options);
       }
  -    my $object = $self->get_object($table, $params, undef, $options);
  +
       &App::sub_exit($object) if ($App::trace);
       $object;
   }
   
  -sub _set_defaults {
  +sub _check_default_and_required_fields {
       &App::sub_entry if ($App::trace);
       my ($self, $table, $hash) = @_;
  -    # TODO: flesh this out
  -    &App::sub_exit() if ($App::trace);
  -}
  -
  -sub _check_required_fields {
  -    &App::sub_entry if ($App::trace);
  -    my ($self, $table, $hash) = @_;
  -    # TODO: flesh this out
  +    my $tabledef = $self->{table}{$table};
  +    my $columns = $tabledef->{column};
  +    if ($columns) {
  +        foreach my $column (keys %$columns) {
  +            if (!defined $hash->{$column}) {
  +                if (defined $columns->{$column}{default}) {
  +                    $hash->{$column} = $columns->{$column}{default};
  +                }
  +                elsif (defined $columns->{$column}{not_null}) {
  +                    die "Illegal object value for $table: $column cannot be 
NULL (i.e. undef)";
  +                }
  +            }
  +        }
  +    }
  +    my $primary_key = $tabledef->{primary_key};
  +    if ($primary_key) {
  +        # Watch out for auto-generated primary keys. It's OK for them to be 
NULL.
  +        #if ($#$primary_key > 0) {
  +        #    foreach my $column (@$primary_key) {
  +        #        if (!defined $hash->{$column}) {
  +        #            die "Illegal object value for $table: $column cannot be 
NULL because it exists in the primary key";
  +        #        }
  +        #    }
  +        #}
  +    }
  +    my $alternate_keys = $tabledef->{alternate_key};
  +    if ($alternate_keys) {
  +        foreach my $alternate_key (@$alternate_keys) {
  +            foreach my $column (@$alternate_key) {
  +                if (!defined $hash->{$column}) {
  +                    die "Illegal object value for $table: $column cannot be 
NULL because it exists in an alternate key";
  +                }
  +            }
  +        }
  +    }
       &App::sub_exit() if ($App::trace);
   }
   
  
  
  
  1.5       +35 -1     p5ee/App-Repository/lib/App/RepositoryObject.pm
  
  Index: RepositoryObject.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/App-Repository/lib/App/RepositoryObject.pm,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- RepositoryObject.pm       9 Aug 2005 18:54:33 -0000       1.4
  +++ RepositoryObject.pm       10 Aug 2005 18:32:39 -0000      1.5
  @@ -175,6 +175,40 @@
       return($nrows);
   }
   
  +#############################################################################
  +# PRIVATE METHODS
  +#############################################################################
  +
  +=head1 Private Methods
  +
  +=cut
  +
  +#############################################################################
  +# _init()
  +#############################################################################
  +
  +=head2 _init()
  +
  +    * Signature: $obj->_init();
  +    * Param:     void
  +    * Return:    void
  +    * Throws:    App::Exception
  +    * Since:     0.01
  +
  +    Sample Usage: 
  +
  +    $obj->_init();
  +
  +This method initializes the values of a newly created object.
  +The default implementation on the App::RepositoryObject base class does 
nothing.
  +It is provided so that it may be overridden in a subclass if desired.
  +
  +=cut
  +
  +sub _init {
  +    my ($self) = @_;
  +}
  +
   =head1 ACKNOWLEDGEMENTS
   
    * Author:  Stephen Adkins <[EMAIL PROTECTED]>
  
  
  

Reply via email to