Alzabo
view release on metacpan or search on metacpan
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().
- 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.
---------------------------------------------------------------------------
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.
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
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.
- 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.
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:
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 )