2005-04-25   Darren Duncan <[EMAIL PROTECTED]>
--------------------------------------------------

Version 0.60 of SQL::Routine (SRT), a fully atomic and portable abstract syntax tree to define any database tasks, has been uploaded to CPAN; it should appear on your favorite mirror within the next few hours.

http://search.cpan.org/dist/SQL-Routine/

This release is primarily to remove a large and long-standing but dubious feature where a SQL::Routine Node is valid to exist outside of a Container, which is the context by which it associates with other Nodes to form trees. So there was a fair amount of code that had to work under both conditions of 'alone' and 'well known', and there was a fair amount of documentation that had to differentiate between the two statuses. As of this release 0.60, Nodes may only exist within a Container (aka 'well known').

As a result of this change, the main executable code is about 10% smaller, and executes about that much faster. More importantly, the code (and the documentation too) should now be fully twice as easy for a novice to understand and debug and extend. It will even be a fair bit easier for me to continue maintaining the module.

A small part of the low-level public API has changed; if you invoked any of the following 6 functions or methods directly, you will have to change your code: new_node(), Node.new(), clear_node_id(), put_in_container(), take_from_container(), build_lonely_node(). But the change should be simple, helped by search-n-replace.

Where you used to do this:

  my $model = SQL::Routine->new_container();
  my $node = SQL::Routine->new_node( 'table' );
  $node->set_node_id( 42 );
  # ... up to now, you can do use $node in its 'alone' state ...
  $node->put_in_container( $model );
  # ... now the $node is 'well known' ...
  $node->set_literal_attribute( 'si_name', 'persons' );

You now do this:

  my $model = SQL::Routine->new_container();
  my $node = SQL::Routine->new_node( $model, 'table', 42 );
  # ... the $node is akin to 'well known' ...
  $node->set_literal_attribute( 'si_name', 'persons' );

Of course, if you used the higher-level API that is shown in the SYNOPSIS, you may have done this all along instead and weren't affected by the change:

my $model = SQL::Routine->new_container();
my $node = $model->build_node( 'table', { 'id' => 42, 'si_name' => 'persons' } );


Where you used to do this:

  $node->take_from_container();
  # ... the $node is 'alone' again but still useable
  # ... $node is garbage collected when it goes out of scope

You now do this:

  $node->delete_node();
  # ... $node has mostly been destroyed by now

Where you used to do this:

  $node->clear_node_id();

You now can't do that anymore; a Node always has an id set; you can still change its value to another defined value using set_node_id(), however, or just delete the Node.

Where you used to do this:

  my $model = SQL::Routine->new_container();
  my $node = SQL::Routine->build_lonely_node( 'table', 42 );
  $node->put_in_container( $model );

You now do this:

  my $model = SQL::Routine->new_container();
  my $node = $model->build_node( 'table', 42 );

There are no other API changes that would break external code.

The Changes files for this release contains a lot more details than are shown in this announcement email; the Changes does not contain any before/after code, however.

Any questions, feedback, requests, or offers of assistence with the module are welcome and appreciated.

Thank you and have a good day. -- Darren Duncan

Reply via email to