Alzabo

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

  www.alzabo.org for details.


ENHANCEMENTS:

- All SQL-generating methods for the Alzabo::Runtime::Schema and
  Alzabo::Runtime::Table classes now accept a "quote_identifiers"
  parameter, which allows you to turn this on for a single query.

- Improved handling of MySQL's "default defaults" when reverse
  engineering or comparing two schemas, so that the code doesn't
  generate ALTER TABLE statements that don't do anything.

- Make many Params::Validate specs into constants, which may improve
  speed a bit, and may affect memory usage under mod_perl.  This is
  probably a useless micro-optimization, though.


BUG FIXES

- Make sure generated SQL for Postgres schema diffs does not include
  dropping & adding the same FK constraint more than once.

- Reverse engineering works with Postgres 7.4.  Thanks to Josh Jore
  for this big patch.  Hopefully this won't break anything for
  Postgres 7.3 ;)

- The Alzabo::Column->is_time_interval method was misspelled, and so
  did not work at all.  Patch from Josh Jore.

- With Postgres 7.4, the DBI tables method always includes system
  tables, so we have to filter these out in the
  Alzabo::Driver::PostgreSQL->tables method.  Patch from Josh Jore.

- Make the is_date & is_datetime method consistent across various
  databases.  For Postgres, is_date was only returning true for the
  DATE type, not TIMESTAMP.

- Make is_datetime return true for Postgres' TIMESTAMPTZ column type.

- Turning on SQL debugging could cause Alzabo to alter bound values
  that were null to the string "NULL" before performing a query.

- If a table name was changed and an index, column, or foreign key
  dropped from that table, then the generated "diff" SQL could refer
  to the old table name in the various DROP statements that were
  generated.

- Workaround a bug in MySQL that reports a "Sub_part" of 1 for
  fulltext indexes.

- The changes introduced in 0.71 to track table and column renames
  could cause bogus SQL to be generated if something was renamed, the
  schema was instantiated, and then the schema was compared to an
  existing live database which also had the same renaming done to it.

- If you tried to create a relationship between two tables where one
  of the tables had a varchar or char column as part of its PK, and
  you let Alzabo create the foreign key column in the other table,
  then Alzabo would try to set the length of the varchar/char column
  to undef, which would cause an exception to be thrown.

---------------------------------------------------------------------------

0.82  January 6, 2004

ENHANCEMENTS:

- The Alzabo::Runtime::Table->insert() and
  Alzabo::Runtime::InsertHandle->insert() methods will not create a
  new row object when called in void context.  This should make
  inserts faster when you don't need a row object back.

- When reverse engineering a MySQL schema, Alzabo will now set a table
  attribute for the table type (MyISAM, InnoDB, etc.) if the server
  supports table types (which any modern version of MySQL does do).

BUG FIXES:

- When creating the test database for MySQL, we now explicitly set the
  table type to MYISAM, in case the default is something else.
  Otherwise the tests will fail when we try to create a fulltext
  index.

KNOWN BUGS:

- This release will fail several tests when tested with Postgres 7.4.
  Specifically, reverse engineering with Postgres 7.4 is known to be
  broken.  This will be fixed in the next release.

---------------------------------------------------------------------------

0.81  December 21, 2003

ENHANCEMENTS:

- Added a new insert handle feature, which should be significantly
  faster for batch inserts than repeatedly calling the table class's
  insert() method.  Development funded by Marigold Technologies.

BUG FIXES:

- An order_by parameter that contained two SQL functions (like
  "COUNT(*) DESC, AVG(score) DESC") caused the error "A sort specifier
  cannot follow another sort specifier in an ORDER BY clause".

- If you passed a no_cache parameter to a method that created a row,
  this would cause an error unless Alzabo::Runtime::UniqueRowCache had
  been loaded.

- Workaround for bug/change/something in DBD::Pg 1.31+ that affects
  the $dbh->tables method, which broke reverse engineering.

---------------------------------------------------------------------------

0.80  October 24, 2003

ENHANCEMENTS:

- Use the non-deprecated form of DBI->tables().

Changes  view on Meta::CPAN


- Foreign keys are now reverse engineered for Postgres 7.3+.
  Implemented by Ken Williams.

- Don't try to include dropped columns when reverse engineering
  Postgres 7.3+.  Implemented by Ken Williams.

- Do a better job of detecting SERIAL type columns when reverse
  engineering Postgres schemas.  Based on a patch from Ken Williams.

- Treat Postgres data types SERIAL4, SERIAL8, BIGSERIAL, and BIGINT as
  valid types.  Implemented by Josh Jore.

- NotNullable exception now include the table and schema name.  Based
  on a patch from Ken Williams.

- Primary keys are updateable.

- Debugging output from Alzabo::MethodMaker is clearer about what
  methods are being made.  Implemented by Ken Williams.

- Alzabo::MethodMaker will now create foreign key methods when two
  tables have multiple relationships, as long as the name generation
  callback returns different names for each of them.  Implemented by
  Ken Williams.

- A join parameter can now specify an outer join with a single array
  reference, such as:

    [ left_outer_join => $table_A, $table_B ]

  Previously, this could only be done as a double array reference, like:

    [ [ left_outer_join => $table_A, $table_B ] ]

- Various doc fixes and rewriting, most notably in Alzabo.pm.

BUG FIXES:

- A join using multiple aliases to the same table would fail with an
  error message like "Cannot use column (Foo.bar_id) in select unless
  its table is included in the FROM clause".

- Remove the long-ago deprecated next_row() and next_rows() methods.

- Postgres 7.3 allows identifiers to be up to 63 characters.  This
  broke the code that handled sequenced columns for Postgres.  Patch
  by Josh Jore.

- If you tried to create a relationship between two tables, and the
  "table_to" table already had a column of the same name as the
  "column_from" column, then Alzabo died with an error.  Reported by
  Ping Liang.

- If you had previously installed Alzabo, and then provided a new
  Alzabo root directory or a new directory for the Mason components,
  this was not respected during the installation process.

- Alzabo's referential integrity checks will no longer complain if you
  attempt to set a foreign key column to NULL.  Previously it would
  throw an exception if the column was part of the dependent table in
  a foreign key relationship.  Now, it just assumes you really meant
  to allow the column to be NULLable.

- The schema class's load_from_file() method now blesses the loaded
  schema into the calling class.  So if you use MethodMaker to
  generate classes, and then call My::Schema->load_from_file, it
  should always return an object blessed into the My::Schema class.
  Reported by Ken Williams.

- When checking for the MySQL variable sql_mode, the value may be
  simply '' as opposed to 0.  Patch by Andrew Baumhauer.

BACKWARDS INCOMPATIBILITIES:

- Alzabo now requires at least Perl 5.6.0 (5.6.1+ recommended).

- The old caching system has been removed, as it had way too much
  overhead.  There is a new, much simpler caching system provided by
  the Alzabo::UniqueRowCache module.

- The Alzabo::Runtime::Table->row_by_pk() method no longer dies if it
  cannot find a matching row.  Instead it simply returns false.

- Some deprecated MethodMaker options were removed: insert, update,
  lookup_table

- The Alzabo::Runtime::Row->delete() method now works for potential
  rows.

---------------------------------------------------------------------------

0.73  October 5, 2003

BACKWARDS INCOMPATIBILITIES:

- This release no longer includes the Mason schema creation GUI.  It
  can be installed separately via the Alzabo::GUI::Mason package.

BUG FIXES:

- Fixed a bug in Alzabo::Create::Schema that only seems to be
  triggered by newer Perls.  The symptom was an error like "Alzabo
  does not support the 'MySQL' RDBMS" when trying to create a new
  schema.

- Fixed a warning in Alzabo::RDBMSRules.

- The 01-driver.t test ignored any user-supplied RDBMS connection
  parameters.  Reported by Barry Hoggard.

- Newer versions of MySQL may return quoted table names, which broke
  reverse engineering.

- Added a quick and nasty hack to remove the schema name from table
  names when reverse engineering Postgres schemas.

- Reverse engineering of indexes for MySQL 4.0+ was broken.

---------------------------------------------------------------------------

Changes  view on Meta::CPAN

ENHANCEMENTS:

- Rewrote the complex build/install system to use Module::Build, which
  simplified quite a bit of code.  Additionally, this should eliminate
  problems reported by Win32 users with the generated Makefile,
  because there is no longer a Makefile ;)

BUG FIXES:

- Fixed the Alzabo::MethodMaker->docs_as_pod method, which simply died
  when used with a recent version of Params::Validate.  Reported by
  Ken Williams.

---------------------------------------------------------------------------

0.71  April 6, 2003

ENHANCEMENTS:

- Alzabo now tracks table and column renames after a schema has been
  instantiated.  This means that when updating the schema in the
  database after such a change, Alzabo can ensure that there is no
  data lost because of the change.  Previously, Alzabo treated name
  changes as a drop followed by an add, which caused data loss.

- Alzabo::DriverStatement->next_hash has been renamed next_as_hash, in
  order to be consistent with the Alzabo::Runtime::Cursor classes.

- Experimental support for restriction clauses as part of an outer
  join, such as

    SELECT ...
      FROM Foo
           LEFT OUTER JOIN Bar
              ON Foo.foo_id = Bar.foo_id
                 AND Bar.something > 2

- Added support for HAVING in queries.

BUG FIXES:

- Exceptions did not include a stack trace.

- Trying to create a Postgres schema with foreign keys defined caused
  an exception.  Reported by Josh Jore.

- Fetching rows from the cursor for a join with multiple outer joins
  could fail if data was being prefetched.

DEPRECATIONS:

- Alzabo::DriverStatement->next_hash method has been renamed
  next_as_hash.

---------------------------------------------------------------------------

0.70  November 21, 2002

ENHANCEMENTS:

- The exception thrown when you attempt to set a non-nullable column
  to NULL is now an Alzabo::Exception::NotNullable exception, instead
  of an Alzabo::Exception::Params exception.  In the interests of
  backwards compatibility, the former is a subclass of the latter.

- Improved debugging options.  See the new Alzabo::Debug module for
  details.

BUG FIXES:

- Fixed Alzabo::Table->primary_key, which would die when no primary
  key existed and it was called in a scalar context.  In an array
  context, all the columns in the table were returned.  Reported by
  Eric Prestemon.

- Alzabo::ObjectCache::Sync::RDBMS created a table that it would later
  consider incorrect.  This made this module unusable.

- Alzabo::ObjectCache::Sync::RDBMS caused weird random errors when
  used with MySQL's InnoDB tables.

- In the schema creator, the link to the graph page, and the link _on_
  the graph page to the image, were both broken.

- Alzabo was allowing you to rename a column to the name of an
  existing column in a table.  Similarly, a table could be renamed to
  the same name as an existing table.  Doing this could trash a
  schema.

- Alzabo::Runtime::Table->one_row would return undef if no row was
  found, which in a list context evaluated to a true value.

- Allow no_cache option when calling Alzabo::Runtime::Schema->join.

- When displaying SQL, the schema creator now makes sure to
  HTML-escape it, because it's possible to have HTML in there (in a
  default, most likely).

- The "children" method generated by Alzabo::MethodMaker did not allow
  you to add additional where clause constraints to the query.

---------------------------------------------------------------------------

0.69  September 19, 2002

ENHANCEMENTS:

- Add count method to Alzabo::DriverStatement objects.

BUG FIXES:

- ** A particularly nasty bug sometimes manifested itself when
  removing a foreign key.  This bug caused the deletion of all foreign
  keys involving the _corresponding_ column(s) in the foreign table.
  Needless to say, this could make a big mess.

- Fix some typos in the generated docs created by Alzabo::MethodMaker.

- A join that included a where clause with an 'OR' generated improper
  SQL.  Reported by Ilya Martynov.

Changes  view on Meta::CPAN

  important when the two tables are independent.  Previously it would
  have been a runtime error (attempting to call a method on an
  undefined value).

- Fix warning from Row->update.  Patch by Ilya Martynov.

- Alzabo::Runtime::PotentialRow's id_as_string method was misnamed id.
  The docs had it wrong for all classes.

- Catch where clauses that contain non-column/function objects as left
  hand side value (like if you accidentally pass in a table object).

- The Postgres TEXT column type is now considered a blob, not a
  character type column.

- There was a fatal error when creating an n-to-n relationship if only
  columns were given, without tables.  This was fixed with a patch
  from Dan Martinez.

- Explicitly check for errors after calling $dbh->func.

- There was a bug when trying to use the schema creator to create
  relationships involving more than one column.

- Fixed a bug where a query using the Alzabo::Runtime::Table->one_row
  could cause an exception if no rows were found.

- Alzabo::Create::Schema->sync_backend was not passing through the
  connection parameters it was getting to the ->create method, causing
  failures.  Patch from Ilya Martynov.

---------------------------------------------------------------------------

0.67  June 6, 2002

BUG FIXES:

- There were some broken bits in the installation code in 0.66.  These
  are now fixed.

---------------------------------------------------------------------------

0.66  June 6, 2002

ENHANCEMENTS:

- It is now possible to retrieve auto-generated documentation to go
  along with the methods generated by Alzabo::MethodMaker.  See the
  "GENERATED DOCUMENTATION" section of the Alzabo::MethodMaker docs
  for more details.

- Added documentation to all the components in mason/widgets.  You can
  run perldoc on those files for more details.

- Added a very ugly hack to work around a bug with Storable 2.00 -
  2.03 and a Perl < 5.8.0.

- It is now possible to install Alzabo without defining an Alzabo root
  directory.  This means you will have to set this by calling
  Alzabo::Config::root_dir() every time you load Alzabo.  An attempt
  to load a schema without first defining the root_dir will throw an
  exception.  Based on a patch from Ilya Martynov.

BUG FIXES:

- Allow UNIQUE as a column attribute for Postgres.  Reported by Dan
  Martinez.

- Add DISTINCT back as an exportable function from the SQLMaker
  subclasses.  It may be useful when calling ->select and ->function.

- Fixed a bug that prevented things from being deleted from the cache
  storage.

- Fixed a variety of problems related to handling Postgres tables and
  columns with mixed or upper case names.  This included a bug that
  prevented them from being reverse engineered properly.  Reported by
  Terrence Brannon.

- Fixed a bug when altering a Postgres column name that caused Alzabo
  to generate incorrect syncing SQL.

- Make the test suite play nice with the latest Test::* modules.  The
  03-runtime.t tests were aborting because I feature I had been using
  in earlier versions of Test::More was removed.

- Alzabo::MethodMaker will die properly if given a non-existent schema
  name.  Suggested by Ilya Martynov.

- If you added a sequenced primary key to a table with MySQL, Alzabo
  did not generate all of the SQL necessary to change the table.
  Reported by Ilya Martynov.

DEPRECATIONS:

- The Alzabo::Schema start_transaction method has been renamed to
  begin_work.  The finish_transaction method is now commit.  The old
  names are deprecated.

---------------------------------------------------------------------------

0.65 May 16, 2002

INCOMPATIBILITIES:

- Alzabo now uses the natively created Postgres sequence for SERIAL
  columns.  If you have existing Alzabo code with SERIAL columns that
  is using the Alzabo-created sequence, then this release will break
  things for you.  One easy fix is to simply drop the existing
  Postgres-created sequence and recreate it with a new starting number
  one higher than the highest row already in existence.  So if your
  hightest "foo_id" value in the "Foo" table is 500, you would do
  this:

    DROP SEQUENCE foo_foo_id_seq;
    CREATE SEQUENCE foo_foo_id_seq START 501;

- The Alzabo::Table->primary_key method is now context-sensitive,
  returning a single column object in scalar context.

- The data browser is no longer installed, until such time as I can

Changes  view on Meta::CPAN

  aborts transactions when there are errors like an attempt to insert
  a duplicate inside a transaction.  These module would just try to
  insert potentially duplicate rows and ignore the error.  Now
  Postgres is handled specially.

- If you told the installer that you didn't want to run any tests with
  a live database, there would be errors when it tried to run
  03-runtime.t.  Now it just skips it.

- Alzabo includes a script called 'pod_merge.pl' that is run before
  installing its modules.  This script merges POD from a parent class
  into a child class (like from Alzabo::Table into
  Alzabo::Create::Table) in order to get all the relevant
  documentation in one place.  The way the Makefile.PL ran this script
  was not working for some people, and in addition, did not end up
  putting the merged documentation into the generated man pages.  This
  release includes a patch from Ilya Martynov that fixes both of these
  problems.

---------------------------------------------------------------------------

0.61 Dec 25, 2001

ENHANCEMENTS:

- Improve documentation for new Alzabo::Create::Schema->sync_backend
  method and note its caveats.

- It is now possible to use SQL functions as part of order_by clauses.
  For example:

    my $cursor = $schema->select( select => [ COUNT('*'), $id_col ],
                                  tables => [ $foo_tab, $bar_tab ],
                                  group_by => $id_col,
                                  order_by => [ COUNT('*'), 'DESC' ] );

- Allow a call to Alzabo::Runtime::Table->insert without a values
  parameter.  This is potentially useful for tables where the primary
  key is sequenced and the other columns have defaults or are
  NULLable.  Patch by Ilya Martynov.

BUG FIXES:

- A call to the schema class's select or function methods that had
  both an order_by and group_by parameter would fail because it tried
  to process the order by clause before the group by clause.

- When thawing potential row objects, Alzabo was trying to stick them
  into the cache, which may have worked before but not now, and should
  be avoided anyway.

- The parent and children methods created by Alzabo::MethodMaker were
  incorrect (and unfortunately the tests of this feature were hosed
  too).

- Add YEAR as exportable function from Alzabo::SQLMaker::MySQL.

- Fix definition of WEEK and YEARWEEK functions exported from
  Alzabo::SQLMaker::MySQL to accept 1 or 2 parameters.

- A bug in the caching code was throwing an exception when attempting
  to update objects that weren't expired.  This only seemed to occur
  in conjuction with the prefetch functionality.  The caching code has
  been simplified a bit and is hopefully now bug-free (I can dream,
  can't I?).

- Make it possible to call Alzabo::Runtime::Schema->join with only one
  table in the tables parameter.  This is useful if you are
  constructing your join at runtime and you don't know how many tables
  you'll end up with.

- Where clauses that began with '(' were not working.  Reported (with
  a test suite patch) by Ilya Martynov.

- Where clauses that contained something like ( ')', 'and' (or 'or') )
  were not working either.

- This file incorrectly thanked TJ Mather for separating out
  Class::Factory::Util, but this was done by Terrence Brannon.  Oops,
  brain fart.

- Improve the recognition of more defaults that MySQL uses for column
  lengths and defaults, in order to improve reverse engineering.

- Recognize defaults like 0 or '' for MySQL.

- Fix Alzabo::Create::Schema->sync_backend method.

---------------------------------------------------------------------------

0.60 Dec 6, 2001

ENHANCEMENTS:

- When passing order_by specifications, it is now possible to do this:

    order_by => [ $col1, $col2, 'DESC', $col3, 'ASC' ]

  which allow for multiple levels of sorting as well as being much
  simpler to remember.

- It is now possible to do something like

    $table->select( select => [ 1, $column ] ... );

  and have it work.  In this case, every row returned by the cursor
  will have 1 as its first element.

- Added Alzabo::MySQL and Alzabo::PostgreSQL POD pages.  These pages
  document how Alzabo does (or does not) support various RDBMS
  specific features.

- Remove Alzabo::Util.  Use Class::Factory::Util from CPAN instead.
  Class::Factory::Util is a slight revision of Alzabo::Util that has
  been separated from the Alzabo core code by Terrence Brannon.
  Thanks Terrence.

- Add the ability to sync the RDBMS backend to the current state of
  the Alzabo schema.  This allows you to arbitrarily update the RDBMS
  schema to match the current state of the Alzabo schema.

Changes  view on Meta::CPAN


- Make caching code work under Perl 5.00503.

- Make code warnings clean (I think) under Perl 5.00503;

DEPRECATIONS:

- The way order_by and group_by parameters are passed has changed a
  bit.  In particular, this form:

    order_by => { columns => ..., sort => ... }

  has been deprecated in favor of a simpler syntax.

---------------------------------------------------------------------------

0.59 Nov 17, 2001

ENHANCEMENTS:

- Got rid of the post_select_hash hook and combined it with
  post_select, which now receives a hash reference.  Suggested by Ilya
  Martynov.

- Run all hooks inside Alzabo::Schema->run_in_transaction method to
  ensure database integrity in cases where your hooks might
  update/delete/insert data.  Suggested by Ilya Martynov.

- Added new Alzabo::Runtime::Table->select method.  This is just like
  the existing ->function method, but returns a cursor instead of the
  entire result set.

- Added a 'limit' parameter to the ->function method (also works for
  the ->select method).

- Added new Alzabo::Runtime::Schema->select method.  This is like the
  method of the same name in the table class but it allows for joins.

- Added new potential rows, which are objects with (largely) the same
  interface as regular rows, but which are not (yet) inserted into the
  database.  They are created via the new
  Alzabo::Runtime::Table->potential_row method.  Thanks to Ilya
  Martynov for suggestions and code for this feature.

- Added Alzabo::Runtime::Row->schema method.  Suggested by Ilya
  Martynov.

- Made it possible to use Storable to freeze and thaw any type of row
  object.  Previously, this would have worked but would have
  serialized basically every single Alzabo object in memory (whee!).
  Patch by Ilya Martynov.

- Make Alzabo::Schema->run_in_transaction preserve scalar/array
  context and return whatever was returned by the wrapped code.

BUG FIXES:

- Did some review and cleanup of the exception handling code.  There
  were some places where exceptions were being handled in an unsafe
  manner as well as some spots where exception objects should have
  been thrown that were just using die.

- Ignore failure to rollback for MySQL when not using transactional
  table.

- Alzabo was not handling the BETWEEN operator in where clauses
  properly.  Patch by Eric Hillman.

- Passing in something like this to rows_where:

    ( where => [ $col_foo, '=', 1,
                 $col_bar, '=', 2 ] )

  worked when it shouldn't.

- Trying to do a select that involved a group by and a limit was not
  being allowed.

INCOMPATIBILITIES:

- Got rid of the post_select_hash hook and combined it with
  post_select, which now receives a hash reference.

---------------------------------------------------------------------------

0.58 Oct 18, 2001

ENHANCEMENTS:

- Added new insert_hooks, update_hooks, select_hooks, and delete_hooks
  options to Alzabo::MethodMaker.  Suggested by Ilya Martynov.

- Moved all the important document for the object caching system into
  Alzabo::ObjectCache, including the import options for all of the
  various modules.

- Added Alzabo::ObjectCache::Sync::RDBMS &
  Alzabo::ObjectCache::Store::RDBMS.  The former finally allows
  synchronization of multiple processes across multiple machines!

- Add Alzabo::Schema->has_table and Alzabo::Table->has_column methods.

- Make BYTEA a legal column type for postgres.  This is treated as a
  blob type.

BUG FIXES:

- The way cardinality and dependency was being represented in the
  schema graphs was sometimes backward and sometimes just broken.

- Fixed Alzabo::ObjectCache::Store::BerkeleyDB->clear, which was not
  actually doing anything.  Added tests that catch this.

- The lookup_tables option, which was deprecated in 0.57, was not
  being allowed at all.

- Calls to select_hash on cached rows were not going through the cache
  checking routines, possibly returning expired data.  Added tests for
  this.

- Eliminate race condition in Alzabo::ObjectCache::Sync::BerkeleyDB.

Changes  view on Meta::CPAN


BUG FIXES:

- Make sure that index names are not too long.

- Added a missing file to the MANIFEST.  0.46 was missing a needed
  file from the tarball.

---------------------------------------------------------------------------

0.46 Jul 2, 2001

ENHANCEMENTS:

- Column types are now canonized to be all upper case.  When multiple
  keywords specify the same type ('INT' and 'INTEGER', for example),
  one will be chosen.  This improves the quality of the reverse
  engineering and the usability of the schema creation interface.

- You can now use SQL functions pretty much anywhere you would want
  (in inserts, updates, where clauses, etc).  See the "Using SQL
  Functions" section in the Alzabo.pm docs for more details.

- As a corollary to the above, the Alzabo::Runtime::Table->function
  method has been created to replace the old
  Alzabo::Runtime::Table->func method.  This new method takes
  advantage of the new system for using SQL functions and is simpler
  and more flexible.  It allows you to perform all sorts of aggregate
  selects.

- Added the Alzabo::Runtime::Row->select_hash method.  Requested by
  Dana Powers.

DEPRECATIONS:

- The Alzabo::Runtime::Table->func method has been deprecated.

BUG FIXES:

- When adding an AUTO_INCREMENT column to an existing MySQL table, the
  SQL generated would cause an error.  This has been fixed.  However,
  if the table already has more than row then chances are this still
  won't work (because MySQL does not try to generate needed unique
  values for the column when it is added).

---------------------------------------------------------------------------

0.45 Jun 6, 2001

INCOMPATIBILITIES:

- The 'dbm_file' parameter given when loading a syncing module that
  used DBM files (such as Alzabo::ObjectCache::Sync::SDBM_File) has
  been changed to 'sync_dbm_file', because this release includes a new
  cache storage module that uses DBM files as well.

- The schema creator now requires HTTP::BrowserDetect.

- Fix what was arguably a bug in the caching/syncing code.
  Previously, one process could update a row and another process could
  then update that same row.  Now the second process will throw an
  exception.

BUG FIXES:

- Accidentally left debugging turned on in Alzabo::Exceptions.

- The schema creator did not allow you to remove a length or precision
  setting for a column once it had been made.

- Require a length for CHAR and VARCHAR columns with MySQL.

- Add error on setting precision for any column that doesn't allow
  them with MySQL.

- The interaction of caching rows and Alzabo::MethodMaker was not
  right.  Basically, it was determined at compile time whether or not
  to use the cached row class but this needs to be determined at run
  time.  This has been fixed.

- Using the Alzabo::Runtime::Row->rows_by_foreign_key method would
  fail when the column in one table did not have the same name as a
  column in the other table.  Reported by Michael Graham (along with a
  correct diagnosis, thanks!).

- Don't specify a database name when creating or dropping a database.
  Reported and patched by Dana Powers.

ENHANCEMENTS:

- Rules violations error messages (bad table name, for example) in the
  schema creator are now handled in a much friendlier manner.  Instead
  of the big error dump exception page it returns you to the page you
  submitted from with an error message.

- Add Alzabo::Create::Column->alter method which allows you to change
  the column type, length, and precision all at once.  This is
  necessary because some of the column type validation code will
  insist that a column have a length setting.  If you try to change
  them in two separate operations it will throw an exception.

- Add Alzabo::ObjectCache::Store::Null - This allows you to use any
  multi-process syncing module without using up the memory that
  Alzabo::ObjectCache::Store::Memory uses.

- Add Alzabo::ObjectCache::Store::BerkeleyDB - I'm not sure if storing
  in a db file is really a performance win (vs. null storage) because
  of the work needed to freeze & thaw the row objects.  Benchmarks are
  needed.

- Add support for fulltext indexes (MySQL).

- Don't show fulltext or column prefix options when creating indexes
  for databases that don't support these features.

- Use cardinality & dependency language for relations.

- Add some style to the schema creator (via stylesheets).  It looks a
  little better now.

---------------------------------------------------------------------------

0.44 May 4, 2001

BUG FIXES:

- Bug fix in Alzabo::Runtime::Table->set_prefetch.  Reported by Bob
  Gustafson.

- Don't try to make directories when running Makefile.PL.  Save it for
  later after user does 'make install'.

- Fix handling of geometric types in Postgres (they were all being
  rejected as invalid).

- Drop columns from a table before adding new ones.  Sometimes this
  makes a difference.  For example, if you are using MySQL and drop an
  existing AUTO_INCREMENT column and add a new one that is also
  AUTO_INCREMENT.

- Only allow one sequenced column per table when using MySQL.

- Doc fixes.  Thanks to Ron Savage for pointing me towards some of
  these.

- Fix a bug with the schema creator.  If you attempted to make a
  change to a column with an extended type and you did not change the
  type, an error occurred.

ENHANCEMENTS:

- Schema creator now shows you a list of possible column types instead
  of having you type it in.  However, for complex types like MySQL's
  ENUM or Postgres' POLYGON there is a text box to type it in.

---------------------------------------------------------------------------

0.43 Apr 25, 2001

ENHANCEMENTS:

Changes  view on Meta::CPAN

  Also changed the docs, which were way out of sync with the changes
  in this area.

- Attempting to update more than one value at once was broken.  Fixed
  this.

- Added Alzabo::Runtime::Table->func method to allow arbitrary column
  aggregate functions like MAX, MIN, AVG, etc.

- Fixed schema creator bug.  It was not possible to change a column's
  NULLability after it was created.

- When changing a column's type, Alzabo now removes any column
  attributes that are not valid for that column.  In addition, if the
  existing length and precision parameters are not valid, they will be
  set to undef.

- Fixed the code to get rid of weird error messages that came from DBI
  with Perl 5.6.0+ when the Alzabo::Create::Schema->create or
  Alzabo::Create::Schema->reverse_engineer methods were called.  For
  the curious, this has to do with the DBI object passing through
  Storable::dclone.

---------------------------------------------------------------------------

0.32 Feb 7, 2001

- Forgot to include data browser files in MANIFEST.  Caused weirdness
  if you said you wanted it when asked during install.  Reported by
  Remi Cohen-Scali.

---------------------------------------------------------------------------

0.31 Feb 5, 2001

Bug fixes only

- Fix bugs in Alzabo::MethodMaker.  The insert, update, lookup_table,
  and self_relation (parent portion only) were broken.

- A bug in the SQL making code was causing some queries to appear as
  if they failed when they didn't.

---------------------------------------------------------------------------

0.30 Feb 4, 2001

- The convert.pl script in eg/ has been updated to handle the new
  release.  IMPORTANT: I forgot to include a mention of this in the
  last release but you need to run the script _before_ installing a
  new version of Alzabo.

- Many improvements and updates to Alzabo::MethodMaker.  Highlights
  include fixing a bug that prevented the insert and update methods
  from being created, a new callback system that allows you to specify
  all the method names to be generated, and a new 'self_relations'
  option for tables that have parent/child relationships with
  themself.

- Fix handling of NULL columns for inserts and updates.  Now, Alzabo
  only throws an exception if the column is not nullable and has no
  default.  If it has a default and is specified as NULL then it will
  not be included in the INSERT clause (in which case the RDBMS should
  insert the default value itself).

- Fix bugs in Postgres reverse engineering.  Defaults were not handled
  properly, nor were numeric column type length and precision.

- The schema creator and data browser now allow you to enter the host
  for database connections where needed.

- Foreign keys can now span multiple columns.  This means you can have
  a relation from foo.foo_id and foo.index_id to bar.foo_id and
  bar.index_id.  This required some changes to the interface for the
  foreign key objects.  Notably, the Alzabo::ForeignKey->column_from
  and Alzabo::ForeignKey->column_to methods are now
  Alzabo::ForeignKey->columns_from and Alzabo::ForeignKey->columns_to.
  In addition, the parameters given to the
  Alzabo::Create::Schema->add_relation have changed.

- Major changes to caching architecture.  The caching code has been
  split up.  There is now a 'storing' class, which holds onto the
  objects (the cache).  Then there is a 'sync' class.  This class
  handles expiration and deletion tracking.  These two classes can be
  mixed and matched.  Right now there is only one storage class (which
  stores the objects in memory).  There are 3 syncing classes.  One,
  NullSync, doesn't actually sync objects.  It does track deletions,
  but not expirations.  The others, IPCSync and DBMSync, use IPC or
  DBM files to track expiration and deletion of objects.

- Doing this work highlighted some bugs in the caching/syncing code.
  One oversight was that if you deleted an object and then inserted
  another row with the exact same primary key, the cache continued to
  think the object was deleted.  Other bugs also surfaced.  These have
  been fixed and the test suite has been updated so caching should be
  stable (if not, I'll have to cry).

- When viewing an existing column in the schema creator, defaults,
  lengths, and precision of 0 were not being shown.

- Alzabo::Runtime::Table->row_count can now take a where clause.

- Fix bugs in Alzabo::Create::Table.  This was causing problems with
  indexes when the table name was changed.

- Fixed a bug in Alzabo::Util that caused the test cases to fail if
  Alzabo hadn't been previously installed.  Reported by Robert Goff.

- The SQLMaker class is now smarter about not letting you make bad
  SQL.  For example, if you try to make a WHERE clause with tables not
  mentioned in the FROM clause, it will throw an exception.  This will
  hopefully help catch logic errors in your code a bit sooner.

- Removed use of prepare_cached in Alzabo::Driver.  This has the
  potential to cause some strange errors under Alzabo.  Because of the
  way Alzabo works, it is possible to have a Cursor object holding
  onto a statement handle that needs to be used elsewhere (by a row
  object, for example).  It is safer to let a new statement handle be
  created in this case.

INCOMPATIBILITIES

- See the note above about the changes required to support
  multi-column foreign keys.

- Because of the aforementioned changes to the caching architecture,
  caching just does not work the way it used to.

  1. By default, there is no caching at all.

  2. To get the old behavior, which defaulted to an in-process memory
  cache with no inter-process syncing (meaning deletes are tracked but
  there is no such thing as expiration), you can do this in your code:

    use Alzabo::ObjectCache( store => 'Alzabo::ObjectCache::MemoryStore',
                             sync  => 'Alzabo::ObjectCache::NullSync' );

  or just:

    use Alzabo::ObjectCache;  # the above modules are the defaults

  3. To get the behavior of the old Alzabo::ObjectCacheIPC module, do:

    use Alzabo::ObjectCache( store => 'Alzabo::ObjectCache::MemoryStore',
                             sync  => 'Alzabo::ObjectCache::IPCSync' );

  However, the new DBMSync module will probably scale better, and
  performance should be about the same for smaller applications.  To
  use it, do:

    use Alzabo::ObjectCache( store => 'Alzabo::ObjectCache::MemoryStore',
                             sync  => 'Alzabo::ObjectCache::DBMSync' );

  4. If you run without any caching at all then the
  Alzabo::Runtime::Row class's behavior has changed somewhat.  In
  particular, selects or updates against a deleted object will always
  throw an Alzabo::Exception::NoSuchRow exception.  Before, the
  behavior wasn't very well defined.

  Please read the section on clearing the cache in the
  Alzabo::ObjectCache module, as this is an important concept.  By
  default, the caching and syncing modules will just grow unchecked.
  You need to clear at the appropriate points (usually your
  application's entry points) in order to keep them under control.

---------------------------------------------------------------------------

0.20 Jan 9, 2001

- Preliminary Postgres support.  There is no support yet for
  constraints or foreign keys when reverse engineering or making SQL.
  There is also no support for large objects (I'm hoping that 7.1 will
  be released soon so I won't have to think about this).  Otherwise,
  the support is about at the same level as MySQL support, though less
  mature.

- Added Alzabo::MethodMaker module.  This can be used to auto-generate
  useful methods for your schema/table/row objects based on the
  properties of your objects themselves.

- Reworking/expanding/clarifying/editing of the docs.

- Add order_by and limit options whenever creating a cursor.

- Method documentation POD from the Alzabo::* modules is merged into
  the relevant Alzabo::Create::* and Alzabo::Runtime::* modules during
  install.  This should make it easier to find what you need since the
  average user will only need to look at a few modules in
  Alzabo::Runtime::*.

- Reworked exceptions so they are all now
  Alzabo::Exception::Something.

- Added default as a column attribute (thus there are now
  Alzabo::Column->default and Alzabo::Create::Column->set_default
  methods).

- Added length & precision attributes for columns.  Both are set
  through the Alzabo::Create::Column->set_length method.

- This release includes a script in eg/ called convert.pl to convert
  older schemas.

- Alzabo::Schema->tables & Alzabo::Table->columns now take an optional
  list of tables/columns as an argument and return a list of matching
  objects.

- Added Alzabo::Column->has_attribute method.

- The data browser has actually lost some functionality (the
  filtering).  Making this more powerful is a fairly low priority at
  the moment.

- Fix bugs where extra params passed to Alzabo::Runtime::Table->insert
  were not making it to the Alzabo::Runtime::Row->new method.

- Fix for Alzabo::Runtime::Table->set_prefetch method.



( run in 1.114 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )