10.92
2
3BUG FIXES:
4
5- Reverse engineering with MySQL broke when the tables were returned
6  _without_ the schema name.
7
8- Enable subselects for MySQL, though there's still no good API for
9  subselects.
10
11- Pass any unknown command line options through to Module::Build, for
12  example things like "--install-base". Reported by Lars Dieckow. RT
13  Ticket #28410.
14
15- Fix a possible bug in Alzabo::Config::available_schemas. Reported by
16  Otto Hirr. RT Ticket #28312
17
18
190.91  Mar 25, 2007
20
21BUG FIXES:
22
23- Alzabo checked whether a particular variable was an array reference
24  with a construct like this "eval { @$thing } ? @$thing :
25  $thing". Under most circumstances, this is ok, but Mason installs a
26  $SIG{__DIE__} handler that turns all string exceptions into
27  exception objects. This meant that under Mason, for any eval where
28  the reference in question was _not_ an array reference, a string
29  exception was caught and turned into a full-blown exception
30  object. This could cause a massive performance hit in some cases.
31
32
330.90  Mar 9, 2007
34
35ENHANCEMENTS:
36
37- Added handling of multi-column indexes which include one function
38  when reverse-engineering Pg schemas.
39
40
41BUG FIXES:
42
43- When a row was deleted, it was not being deleted from the cache. If
44  you then inserted a row with the same primary key, you got back the
45  row from the cache, which was marked as deleted, instead of the new
46  row.
47
48- Newer versions of MySQL may return fully qualified and quoted table
49  names (`Schema`.`Table`) from $dbh->tables. This broke
50  reverse-engineering.
51
52- The Alzabo::Column->is_time() method was totally broken for MySQL.
53
54
550.8904  Nov 17, 2006
56
57BUG FIXES:
58
59- The t/21-row_by_pk-exception test blew up if no test config was
60  provided, instead of just skipping its tests gracefully. Reported by
61  Andy Lester.
62
63
640.8903  Nov 16, 2006
65
66BUG FIXES:
67
68- The change in 0.8902 to not use UNIVERSAL::isa exposed a bug in the
69  handling of an attempt to load a row which doesn't exist in the
70  DBMS. Reported by Jon Prettyman.
71
72
730.8902  Nov 9, 2006
74
75BUG FIXES:
76
77- Make Alzabo "safe" to use with UNIVERSAL::can (the module), which
78  spits out lots of warning if you use Alzabo after it has been
79  loaded.
80
81- Fixed a warning from DBI in the 03-runtime.t tests.
82
83- Fixed reverse engineering of nextval() as a column default with Pg.
84
85
860.8901  Jul 19, 2006
87
88BUG FIXES:
89
90- Fix reverse engineering of "now()" as default for a column with Pg.
91
92
930.89  Jun 20, 2006
94
95ENHANCEMENTS:
96
97- Improved schema diffs for Postgres, particularly in the area of
98  comparing two columns. Now we attempt to determine if two columns
99  are logically equivalent, even if they might have minor variations
100  (INT vs INTEGER type name, 'f' versus 'false' for BOOLEAN default,
101  etc.).
102
103- Added Alzabo::SQLMaker->distinct_requires_order_by_in_select for the
104  benefit of Pg, which requires that anything in the ORDER BY clause
105  show up in the SELECT when you SELECT DISTINCT. This change is
106  experimental, and may go away in future versions.
107
108- Removed support for passing order_by and group_by as a hash
109  reference. This was deprecated in 0.59.
110
111BUG FIXES:
112
113- When reverse engineering a Postgres schema, Alzabo did not look for
114  its own sequences to determine if a column should be marked as
115  sequenced.
116
117- Defer FK creation until all other DDL has been executed. This
118  ensures that the table to which we're referring will be available.
119
120- When recreating a table during a SQL diff, make this an exception so
121  we don't do other column diff/add/drop operations on the same table.
122
123- Fixed a test failure in 07-methodmaker.t when testing with
124  Postgres. This failure may not have showed up often because it came
125  from a test that depended on the DBMS returning rows in a speific
126  order by without specifying an ORDER BY.
127
128- When a Postgres table is renamed, its sequences are also renamed.
129
130
1310.8801  Mar 13, 2006
132
133BUG FIXES:
134
135- Quoting of PostgreSQL column defaults in DDL SQL was completely
136  broken.
137
138
1390.88  Mar 13, 2006
140
141ENHANCEMENTS:
142
143- Added a new option when creating a column, "default_is_raw", which
144  can be used to allow for a function like NOW() as a column default.
145
146- Added an "--automated" option for Build.PL, to force it to just use
147  default prereqs. Also added other options to be used with this one,
148  see "perl Build.PL --help" for detalis.
149
150- The Alzabo::Driver classes will now transparently reconnect to the
151  DBMS if you attempt to use them in a child process after a
152  fork. This prevents various problems that can occur if you attempt
153  to share a DBI handle between two processes. One notable problem is
154  that the parent's DBI handle is closed when the child exits.
155
156- Added support for (VAR)BINARY type columns in MySQL. Request by
157  Martin Groenemeyer. RT Ticket #16338.
158
159BUG FIXES:
160
161- Alzabo::Table->foreign_keys_by_table() and foreign_keys_by_column()
162  could return the same object more than once when using
163  multiple-column foreign keys. Reported by Rainer Rohmfeld. RT Ticket
164  #13885.
165
166- Calling connect() on a driver object (via a schema object) with
167  different parameters did not reconnect if the existing handle was
168  still good. This was explicitly opposite what the docs said the code
169  was doing. RT Ticket #17942.
170
171- Fix bug in reverse engineering function indexes in Postgres.  The
172  reverse engineering code always ended up thinking all of the columns
173  in the table were used in the index.
174
175- Fix failing MySQL test in 03-runtime.t.  The problem was the test,
176  not the Alzabo core.  Reported by Alex McLintock.
177
178- Fixed adding too many "=cut" directives in docs generated by
179  Alzabo::MethodMaker.
180
181- Fixed SQL generation for the Postgres functions CURRENT_DATE,
182  CURRENT_TIME, and CURRENT_TIMESTAMP, which should not have
183  parentheses after them.
184
185- Documented that DATE_TRUNC() is a support Pg function in
186  Alzabo::SQLMaker::PostgreSQL. RT Ticket #13843.
187
188
1890.87  May 14, 2005
190
191BUG FIXES:
192
193- Table names in CREATE INDEX statements for Postgres were not quoted.
194
195- Database names in CREATE/DROP DATABASE statements for Postgres were
196  not quoted.
197
198- Postgres database names with upper case characters were never being
199  detected as being instantiated, which meant Alzabo always tried to
200  recreate the schema from scratch.
201
202- ALTER TABLE statements for Postgres left the table name unquoted
203  when renaming a column.
204
205- Even if Alzabo::Runtime::Schema->referential_integrity was false,
206  Alzabo was still doing referential integrity checking on inserts.
207  Reported by Michal Jurosz.
208
209- 19-schema-name.t did not use the user-supplied connection parameters
210  and could fail because of this.  Reported by Daniel Puro.
211
212- Handle quotes in table names returned by Postgres when reverse
213  engineering.
214
215- Reverse engineering a Postgres schema that contained indexes on
216  functions could fail because the Alzabo::RDBMSRules::PostgreSQL code
217  used a function from Text::Balanced without loading it first (or
218  making it a prereq for the distro).  Reported by an anonymous user
219  via rt.cpan.org.
220
221- When getting the next sequence number from a Postgres schema, Alzabo
222  was not quoting the sequence name even if the schema's
223  quote_identifiers attribute was true.  Reported by "Martin" via
224  rt.cpan.org.
225
226ENHANCEMENTS:
227
228- Allow any key starting with "pg_" when connecting a Postgres
229  database.  This allows you to pass attributes like "pg_enable_utf8"
230  or "pg_bool_tf".  Prompted by a discussion with Boris Shomodjvarac.
231
232
2330.86  December 22, 2004
234
235BUG FIXES:
236
237- Allow a UNIQUE constraint as a column attribute for MySQL.
238
239ENHANCEMENTS:
240
241- It is now possible to use a single Alzabo schema object to create
242  and access multiple copies of that schema in an RDBMS.  This is done
243  by setting the "schema_name" parameter whenever calling a method
244  that accesses the RDBMS.
245
246  This feature has a bad interaction with the way internal schema
247  diffs are generated, however.  Please see the "MULTIPLE COPIES OF
248  THE SAME SCHEMA" section in Alzabo::Intro for details.
249
250- The Alzabo::Runtime::Row->update() method now returns a boolean
251  indicating whether any changes were actually made.  Patch by Eric
252  Waters.
253
254
2550.85  October 12, 2004
256
257BUG FIXES:
258
259- The DECIMAL and NUMERIC column types in MySQL were not being treated
260  as numeric types.  This meant that you couldn't give such a column
261  the UNSIGNED attribute, among other problems.  Reported by Bob
262  Sidebotham.
263
264- If a column had CHECK constraints, the Postgres reverse engineering
265  failed.  Reported by Ken Miller, fixed by Joshua Jore.
266
267- Insert handles did not include sequenced Postgres columns, causing
268  17-insert-handle.t to fail when run against Postgres.  Reported by
269  Eric Schwartz.
270
271
2720.84  September 4, 2004
273
274ENHANCEMENTS:
275
276- Alzabo::MethodMaker will now warn you when you it creates a method
277  that overrides a parent class's method.  This can cause problems
278  when you override the table class's name() method with one that
279  returns a column object.
280
281
282BUG FIXES:
283
284- Make Alzabo::Create::Schema->delete work under taint mode.  Reported
285  by Dana Hudes.
286
287- Improve Alazbo::PostgreSQL docs, specifically mentioning that if you
288  create a Postgres schema with mixed or upper case table names, you
289  need to do $schema->set_quote_identifiers(1) for any DML SQL to
290  work.
291
292- The Alzabo::Runtime::Row->is_potential method didn't exist.
293
294- The caching had a very nasty interaction with reverse engineering
295  that could cause data loss (of foreign keys) when the "sync with
296  backend" functionality was called from the Mason GUI.  There may
297  have been other bugs as well.  This was fixed by not caching reverse
298  engineered schemas, which is somewhat of a hack.
299
300  Anyone using the Mason GUI with MySQL is encouraged to upgrade
301  because of this bug.
302
303
3040.83  June 9, 2004
305
306MISCELLANEOUS:
307
308- I got fed up with the instability of CVS on Sourceforge, and am now
309  using a Subversion repository I host myself.  See "source" page on
310  www.alzabo.org for details.
311
312
313ENHANCEMENTS:
314
315- All SQL-generating methods for the Alzabo::Runtime::Schema and
316  Alzabo::Runtime::Table classes now accept a "quote_identifiers"
317  parameter, which allows you to turn this on for a single query.
318
319- Improved handling of MySQL's "default defaults" when reverse
320  engineering or comparing two schemas, so that the code doesn't
321  generate ALTER TABLE statements that don't do anything.
322
323- Make many Params::Validate specs into constants, which may improve
324  speed a bit, and may affect memory usage under mod_perl.  This is
325  probably a useless micro-optimization, though.
326
327
328BUG FIXES
329
330- Make sure generated SQL for Postgres schema diffs does not include
331  dropping & adding the same FK constraint more than once.
332
333- Reverse engineering works with Postgres 7.4.  Thanks to Josh Jore
334  for this big patch.  Hopefully this won't break anything for
335  Postgres 7.3 ;)
336
337- The Alzabo::Column->is_time_interval method was misspelled, and so
338  did not work at all.  Patch from Josh Jore.
339
340- With Postgres 7.4, the DBI tables method always includes system
341  tables, so we have to filter these out in the
342  Alzabo::Driver::PostgreSQL->tables method.  Patch from Josh Jore.
343
344- Make the is_date & is_datetime method consistent across various
345  databases.  For Postgres, is_date was only returning true for the
346  DATE type, not TIMESTAMP.
347
348- Make is_datetime return true for Postgres' TIMESTAMPTZ column type.
349
350- Turning on SQL debugging could cause Alzabo to alter bound values
351  that were null to the string "NULL" before performing a query.
352
353- If a table name was changed and an index, column, or foreign key
354  dropped from that table, then the generated "diff" SQL could refer
355  to the old table name in the various DROP statements that were
356  generated.
357
358- Workaround a bug in MySQL that reports a "Sub_part" of 1 for
359  fulltext indexes.
360
361- The changes introduced in 0.71 to track table and column renames
362  could cause bogus SQL to be generated if something was renamed, the
363  schema was instantiated, and then the schema was compared to an
364  existing live database which also had the same renaming done to it.
365
366- If you tried to create a relationship between two tables where one
367  of the tables had a varchar or char column as part of its PK, and
368  you let Alzabo create the foreign key column in the other table,
369  then Alzabo would try to set the length of the varchar/char column
370  to undef, which would cause an exception to be thrown.
371
372---------------------------------------------------------------------------
373
3740.82  January 6, 2004
375
376ENHANCEMENTS:
377
378- The Alzabo::Runtime::Table->insert() and
379  Alzabo::Runtime::InsertHandle->insert() methods will not create a
380  new row object when called in void context.  This should make
381  inserts faster when you don't need a row object back.
382
383- When reverse engineering a MySQL schema, Alzabo will now set a table
384  attribute for the table type (MyISAM, InnoDB, etc.) if the server
385  supports table types (which any modern version of MySQL does do).
386
387BUG FIXES:
388
389- When creating the test database for MySQL, we now explicitly set the
390  table type to MYISAM, in case the default is something else.
391  Otherwise the tests will fail when we try to create a fulltext
392  index.
393
394KNOWN BUGS:
395
396- This release will fail several tests when tested with Postgres 7.4.
397  Specifically, reverse engineering with Postgres 7.4 is known to be
398  broken.  This will be fixed in the next release.
399
400---------------------------------------------------------------------------
401
4020.81  December 21, 2003
403
404ENHANCEMENTS:
405
406- Added a new insert handle feature, which should be significantly
407  faster for batch inserts than repeatedly calling the table class's
408  insert() method.  Development funded by Marigold Technologies.
409
410BUG FIXES:
411
412- An order_by parameter that contained two SQL functions (like
413  "COUNT(*) DESC, AVG(score) DESC") caused the error "A sort specifier
414  cannot follow another sort specifier in an ORDER BY clause".
415
416- If you passed a no_cache parameter to a method that created a row,
417  this would cause an error unless Alzabo::Runtime::UniqueRowCache had
418  been loaded.
419
420- Workaround for bug/change/something in DBD::Pg 1.31+ that affects
421  the $dbh->tables method, which broke reverse engineering.
422
423---------------------------------------------------------------------------
424
4250.80  October 24, 2003
426
427ENHANCEMENTS:
428
429- Use the non-deprecated form of DBI->tables().
430
431- Added an is_time_interval method to Alzabo::Column.
432
433- Lots and lots of doc cleanup and re-formatting.
434
435---------------------------------------------------------------------------
436
4370.79_04  October 18, 2003
438
439- Identical to 0.79_03 except for minor POD changes in order to try to
440  fix the problem of search.cpan.org treating the wrong file as the
441  main Alzabo.pm docs.  Again reported by Darren Duncan.
442
443---------------------------------------------------------------------------
444
4450.79_03  October 18, 2003
446
447ENHANCEMENTS:
448
449- Many doc rewrites and updates.
450
451- Documented row state classes.
452
453- Added back the no_cache parameter to avoid caching one or more rows.
454
455- Moved the relevant documentation from Alzabo::Runtime::PotentialRow
456  into Alzabo::Runtime::Row.
457
458BUG FIXES:
459
460- Fixed the NAME portion of the Alzabo::MySQL and Alzabo::PostgreSQL
461  POD files so that search.cpan.org doesn't think Alzabo::MySQL is the
462  Alzabo.pm file.  Reported by Darren Duncan.
463
464- The 12-rev_engineer_pg_fk.t test would try to load DBD::Pg even if
465  you weren't using Postgres, which would cause the test file to die
466  if DBD::Pg wasn't installed.  Reported by Jost's smokehouse.
467
468- More documentation updates to remove outdated information.
469
470- Split out the documentation in Alzabo.pm into Alzabo::Intro and
471  Alzabo::Design.
472
473- Added a FAQ from a question on the mailing list.  Suggested by
474  Terrence Brannon.
475
476- Eliminated a circular reference between tables created via the
477  Alzabo::Runtime::Table->alias() method, and the columns those alias
478  tables contain.  This required the use of weak references.
479
480  NOTE: Alzabo regular tables and columns have circular references to
481  each other, but this normally isn't a problem because you generally
482  want to keep a whole schema around all the time anyway.
483
484---------------------------------------------------------------------------
485
4860.79_02  October 17, 2003
487
488ENHANCEMENTS:
489
490- Added support for table attributes like MySQL's "TYPE = ..." or
491  Postgres's "WITH OIDS".
492
493- Added support for functional indexes in Postgres, like
494  "LOWER(some_col)".  Funded by Kineticode, Inc. for Bricolage 2.0.
495
496- Added column/table constraint/check reverse engineering for
497  Postgres.  Funded by Kineticode, Inc. for Bricolage 2.0.
498
499- The SQL generated for Postgres schemas now includes foreign key
500  constraints.
501
502- Added a new method to Alzabo::Runtime::Schema, prefetch_none().
503
504- Added a new method to Alzabo::Table, has_index().
505
506- Documented Alzabo::Runtime::UniqueRowCache.
507
508- The definitions of the is_character and is_blob column methods have
509  been clarified.  Note that these definitions have changed from the
510  previous, undefined behavior.
511
512- When a 1..1 or 1..n foreign key is added to a table, a unique index
513  is created on the columns involved in the foreign key, unless those
514  columns are part of the table's primary key.
515
516BUG FIXES:
517
518- Fixed a problem in the Makefile.PL which would cause it to fail even
519  if you had Module::Build installed.  Reported by Ken Williams.
520
521- Fixed (really, this time, I hope) a problem where the user-provided
522  connection parameters were not respected in the 01-driver.t tests.
523  Reported by Ken Williams.
524
525- FK reverse engineering for Postgres sometimes got the cardinality of
526  the relationship wrong, making it 1..1 when it should be 1..n.  This
527  should be much improved in this release, though it may still have
528  bugs.
529
530- Removed references to the old caching code in various spots.
531
532- Fixed handling of case_sensitive parameter to
533  Alzabo::Column->has_attribute().
534
535BACKWARDS INCOMPATIBILITIES:
536
537- When you load a runtime schema, it now calls
538  "$self->prefetch_all_but_blobs" in order to turn on pre-fetching by
539  default, since for the vast majority of users, this is a huge
540  performance improvement.  The new prefetch_none() method can be used
541  to turn off all prefetching.
542
543- The is_character column method now returns true for any text type
544  column, regardless of size.
545
546- The is_blob column method now returns true only for columns that are
547  defined to hold binary data.
548
549---------------------------------------------------------------------------
550
5510.79_01  October 10, 2003
552
553ENHANCEMENTS:
554
555- Distribution is now signed with Module::Signature.
556
557- Lots of refactoring of the row object internals to simplify the
558  code.  Implemented by Ilya Martynov.
559
560- The testing code has been cleaned up quite a bit, and all of the
561  utility functions used in the tests have been consolidated in
562  t/lib/Alzabo/Test/Utils.pm.
563
564- Added intermediate table and row classes for MethodMaker created
565  classes, to provide a central point for adding new methods to table
566  and row objects.  Based on a patch from Ken Williams.
567
568- Support for "self-linking" tables in Alzabo::MethodMaker, a linking
569  table which connects a table to itself in an n..n relationship.
570  Implemented by Ken Williams.
571
572- Added rdbms_version method to driver classes.  Implemented by Ken
573  Williams.
574
575- Added Alzabo::Create::Schema->is_saved() method.
576
577- Foreign keys are now reverse engineered for Postgres 7.3+.
578  Implemented by Ken Williams.
579
580- Don't try to include dropped columns when reverse engineering
581  Postgres 7.3+.  Implemented by Ken Williams.
582
583- Do a better job of detecting SERIAL type columns when reverse
584  engineering Postgres schemas.  Based on a patch from Ken Williams.
585
586- Treat Postgres data types SERIAL4, SERIAL8, BIGSERIAL, and BIGINT as
587  valid types.  Implemented by Josh Jore.
588
589- NotNullable exception now include the table and schema name.  Based
590  on a patch from Ken Williams.
591
592- Primary keys are updateable.
593
594- Debugging output from Alzabo::MethodMaker is clearer about what
595  methods are being made.  Implemented by Ken Williams.
596
597- Alzabo::MethodMaker will now create foreign key methods when two
598  tables have multiple relationships, as long as the name generation
599  callback returns different names for each of them.  Implemented by
600  Ken Williams.
601
602- A join parameter can now specify an outer join with a single array
603  reference, such as:
604
605    [ left_outer_join => $table_A, $table_B ]
606
607  Previously, this could only be done as a double array reference, like:
608
609    [ [ left_outer_join => $table_A, $table_B ] ]
610
611- Various doc fixes and rewriting, most notably in Alzabo.pm.
612
613BUG FIXES:
614
615- A join using multiple aliases to the same table would fail with an
616  error message like "Cannot use column (Foo.bar_id) in select unless
617  its table is included in the FROM clause".
618
619- Remove the long-ago deprecated next_row() and next_rows() methods.
620
621- Postgres 7.3 allows identifiers to be up to 63 characters.  This
622  broke the code that handled sequenced columns for Postgres.  Patch
623  by Josh Jore.
624
625- If you tried to create a relationship between two tables, and the
626  "table_to" table already had a column of the same name as the
627  "column_from" column, then Alzabo died with an error.  Reported by
628  Ping Liang.
629
630- If you had previously installed Alzabo, and then provided a new
631  Alzabo root directory or a new directory for the Mason components,
632  this was not respected during the installation process.
633
634- Alzabo's referential integrity checks will no longer complain if you
635  attempt to set a foreign key column to NULL.  Previously it would
636  throw an exception if the column was part of the dependent table in
637  a foreign key relationship.  Now, it just assumes you really meant
638  to allow the column to be NULLable.
639
640- The schema class's load_from_file() method now blesses the loaded
641  schema into the calling class.  So if you use MethodMaker to
642  generate classes, and then call My::Schema->load_from_file, it
643  should always return an object blessed into the My::Schema class.
644  Reported by Ken Williams.
645
646- When checking for the MySQL variable sql_mode, the value may be
647  simply '' as opposed to 0.  Patch by Andrew Baumhauer.
648
649BACKWARDS INCOMPATIBILITIES:
650
651- Alzabo now requires at least Perl 5.6.0 (5.6.1+ recommended).
652
653- The old caching system has been removed, as it had way too much
654  overhead.  There is a new, much simpler caching system provided by
655  the Alzabo::UniqueRowCache module.
656
657- The Alzabo::Runtime::Table->row_by_pk() method no longer dies if it
658  cannot find a matching row.  Instead it simply returns false.
659
660- Some deprecated MethodMaker options were removed: insert, update,
661  lookup_table
662
663- The Alzabo::Runtime::Row->delete() method now works for potential
664  rows.
665
666---------------------------------------------------------------------------
667
6680.73  October 5, 2003
669
670BACKWARDS INCOMPATIBILITIES:
671
672- This release no longer includes the Mason schema creation GUI.  It
673  can be installed separately via the Alzabo::GUI::Mason package.
674
675BUG FIXES:
676
677- Fixed a bug in Alzabo::Create::Schema that only seems to be
678  triggered by newer Perls.  The symptom was an error like "Alzabo
679  does not support the 'MySQL' RDBMS" when trying to create a new
680  schema.
681
682- Fixed a warning in Alzabo::RDBMSRules.
683
684- The 01-driver.t test ignored any user-supplied RDBMS connection
685  parameters.  Reported by Barry Hoggard.
686
687- Newer versions of MySQL may return quoted table names, which broke
688  reverse engineering.
689
690- Added a quick and nasty hack to remove the schema name from table
691  names when reverse engineering Postgres schemas.
692
693- Reverse engineering of indexes for MySQL 4.0+ was broken.
694
695---------------------------------------------------------------------------
696
6970.72  April 12, 2003
698
699ENHANCEMENTS:
700
701- Rewrote the complex build/install system to use Module::Build, which
702  simplified quite a bit of code.  Additionally, this should eliminate
703  problems reported by Win32 users with the generated Makefile,
704  because there is no longer a Makefile ;)
705
706BUG FIXES:
707
708- Fixed the Alzabo::MethodMaker->docs_as_pod method, which simply died
709  when used with a recent version of Params::Validate.  Reported by
710  Ken Williams.
711
712---------------------------------------------------------------------------
713
7140.71  April 6, 2003
715
716ENHANCEMENTS:
717
718- Alzabo now tracks table and column renames after a schema has been
719  instantiated.  This means that when updating the schema in the
720  database after such a change, Alzabo can ensure that there is no
721  data lost because of the change.  Previously, Alzabo treated name
722  changes as a drop followed by an add, which caused data loss.
723
724- Alzabo::DriverStatement->next_hash has been renamed next_as_hash, in
725  order to be consistent with the Alzabo::Runtime::Cursor classes.
726
727- Experimental support for restriction clauses as part of an outer
728  join, such as
729
730    SELECT ...
731      FROM Foo
732           LEFT OUTER JOIN Bar
733              ON Foo.foo_id = Bar.foo_id
734                 AND Bar.something > 2
735
736- Added support for HAVING in queries.
737
738BUG FIXES:
739
740- Exceptions did not include a stack trace.
741
742- Trying to create a Postgres schema with foreign keys defined caused
743  an exception.  Reported by Josh Jore.
744
745- Fetching rows from the cursor for a join with multiple outer joins
746  could fail if data was being prefetched.
747
748DEPRECATIONS:
749
750- Alzabo::DriverStatement->next_hash method has been renamed
751  next_as_hash.
752
753---------------------------------------------------------------------------
754
7550.70  November 21, 2002
756
757ENHANCEMENTS:
758
759- The exception thrown when you attempt to set a non-nullable column
760  to NULL is now an Alzabo::Exception::NotNullable exception, instead
761  of an Alzabo::Exception::Params exception.  In the interests of
762  backwards compatibility, the former is a subclass of the latter.
763
764- Improved debugging options.  See the new Alzabo::Debug module for
765  details.
766
767BUG FIXES:
768
769- Fixed Alzabo::Table->primary_key, which would die when no primary
770  key existed and it was called in a scalar context.  In an array
771  context, all the columns in the table were returned.  Reported by
772  Eric Prestemon.
773
774- Alzabo::ObjectCache::Sync::RDBMS created a table that it would later
775  consider incorrect.  This made this module unusable.
776
777- Alzabo::ObjectCache::Sync::RDBMS caused weird random errors when
778  used with MySQL's InnoDB tables.
779
780- In the schema creator, the link to the graph page, and the link _on_
781  the graph page to the image, were both broken.
782
783- Alzabo was allowing you to rename a column to the name of an
784  existing column in a table.  Similarly, a table could be renamed to
785  the same name as an existing table.  Doing this could trash a
786  schema.
787
788- Alzabo::Runtime::Table->one_row would return undef if no row was
789  found, which in a list context evaluated to a true value.
790
791- Allow no_cache option when calling Alzabo::Runtime::Schema->join.
792
793- When displaying SQL, the schema creator now makes sure to
794  HTML-escape it, because it's possible to have HTML in there (in a
795  default, most likely).
796
797- The "children" method generated by Alzabo::MethodMaker did not allow
798  you to add additional where clause constraints to the query.
799
800---------------------------------------------------------------------------
801
8020.69  September 19, 2002
803
804ENHANCEMENTS:
805
806- Add count method to Alzabo::DriverStatement objects.
807
808BUG FIXES:
809
810- ** A particularly nasty bug sometimes manifested itself when
811  removing a foreign key.  This bug caused the deletion of all foreign
812  keys involving the _corresponding_ column(s) in the foreign table.
813  Needless to say, this could make a big mess.
814
815- Fix some typos in the generated docs created by Alzabo::MethodMaker.
816
817- A join that included a where clause with an 'OR' generated improper
818  SQL.  Reported by Ilya Martynov.
819
820- Calling the Alzabo::Runtime::JoinCursor->next_as_hash method when
821  the query involved an outer join could cause a runtime error.
822
823- In where clause specifications, 'and' and 'or' were only being
824  allowed in lower-case.  They are now allowed in any case.
825
826- Aliases did not work in outer joins.  This has been fixed.
827
828- Using outer joins was a bit fragile, in that the order of the outer
829  join in the context of the other joins could cause Alzabo to
830  generate incorrect SQL.  Now outer joins should work no matter what.
831
832- A couple links in the schema creator had a hardcoded ".mhtml"
833  extension, as opposed to using the value of
834  Alzabo::Config::mason_extension().  Patch by Scott Lanning.
835
836---------------------------------------------------------------------------
837
8380.68  July 20, 2002
839
840ENHANCEMENTS:
841
842- Updated the thank you list in the README file (you too can be listed
843  by sending me useful bug reports, patches, suggestions, or reminding
844  that you already did so and I forgot ;)
845
846- Allow the Driver's ->schemas method to take connection params,
847  wherever possible.  This allows Alzabo::Create::Schema methods like
848  ->create, ->sync_backend_sql, and ->sync_backend to work properly
849  when the database server is on another machine.  Patch by Ilya
850  Martynov.
851
852- Added Alzabo::Runtime::*Row->is_live method to easily distinguish
853  between real and potential rows.
854
855- Did some profiling of data retrieval (Alzabo::Runtime bits) and
856  optimized some of the most heavily used pieces of Alzabo.
857
858- Added the Alzabo::Runtime::Schema->prefetch_all and
859  Alzabo::Runtime::Schema->prefetch_all_but_blobs convenience methods.
860
861- Added a ->count method to the cursor classes.
862
863- Added ->is_integer, ->is_floating_point, ->is_date, ->is_datetime,
864->is_time, and ->generic_type methods to column objects.
865
866- The Alzabo::Driver->schemas method now takes connection parameters.
867  See your specific driver subclass for details on which.  Bug report
868  by Ilya Martynov.
869
870- Added Alzabo::Runtime::Schema->disconnect method.  Patch by Ilya
871  Martynov.
872
873- Make the Makefile.PL act gracefully when it is invoked without a
874  tty.  Patch by Ilya Martynov.
875
876- The quoting of identifiers (table/column names) is now optional, and
877  _off_ by default.  In profiling I found that a non-trivial amount of
878  time was being spent quoting these, and in most cases it's not
879  necessary.  There is now a
880  Alzabo::Runtime::Schema->set_quote_identifiers method that can be
881  used to change this behavior.
882
883  Identifiers are always quoted when using Alzabo::Create::* with
884  Postgres, however.
885
886- Did a fair amount of profiling in order to optimize Alzabo's data
887  fetching.  In general, Alzabo::Runtime::* operations should be
888  faster.
889
890- Added Alzabo::Runtime::Column->alias which is useful when executing
891  queries via the Alzabo::Runtime::Schema and Alzabo::Runtime::Table
892  ->select methods.
893
894BUG FIXES:
895
896- Alzabo::MethodMake generated "lookup column/table" methods will
897  return if there is no matching entry in the related table, which is
898  important when the two tables are independent.  Previously it would
899  have been a runtime error (attempting to call a method on an
900  undefined value).
901
902- Fix warning from Row->update.  Patch by Ilya Martynov.
903
904- Alzabo::Runtime::PotentialRow's id_as_string method was misnamed id.
905  The docs had it wrong for all classes.
906
907- Catch where clauses that contain non-column/function objects as left
908  hand side value (like if you accidentally pass in a table object).
909
910- The Postgres TEXT column type is now considered a blob, not a
911  character type column.
912
913- There was a fatal error when creating an n-to-n relationship if only
914  columns were given, without tables.  This was fixed with a patch
915  from Dan Martinez.
916
917- Explicitly check for errors after calling $dbh->func.
918
919- There was a bug when trying to use the schema creator to create
920  relationships involving more than one column.
921
922- Fixed a bug where a query using the Alzabo::Runtime::Table->one_row
923  could cause an exception if no rows were found.
924
925- Alzabo::Create::Schema->sync_backend was not passing through the
926  connection parameters it was getting to the ->create method, causing
927  failures.  Patch from Ilya Martynov.
928
929---------------------------------------------------------------------------
930
9310.67  June 6, 2002
932
933BUG FIXES:
934
935- There were some broken bits in the installation code in 0.66.  These
936  are now fixed.
937
938---------------------------------------------------------------------------
939
9400.66  June 6, 2002
941
942ENHANCEMENTS:
943
944- It is now possible to retrieve auto-generated documentation to go
945  along with the methods generated by Alzabo::MethodMaker.  See the
946  "GENERATED DOCUMENTATION" section of the Alzabo::MethodMaker docs
947  for more details.
948
949- Added documentation to all the components in mason/widgets.  You can
950  run perldoc on those files for more details.
951
952- Added a very ugly hack to work around a bug with Storable 2.00 -
953  2.03 and a Perl < 5.8.0.
954
955- It is now possible to install Alzabo without defining an Alzabo root
956  directory.  This means you will have to set this by calling
957  Alzabo::Config::root_dir() every time you load Alzabo.  An attempt
958  to load a schema without first defining the root_dir will throw an
959  exception.  Based on a patch from Ilya Martynov.
960
961BUG FIXES:
962
963- Allow UNIQUE as a column attribute for Postgres.  Reported by Dan
964  Martinez.
965
966- Add DISTINCT back as an exportable function from the SQLMaker
967  subclasses.  It may be useful when calling ->select and ->function.
968
969- Fixed a bug that prevented things from being deleted from the cache
970  storage.
971
972- Fixed a variety of problems related to handling Postgres tables and
973  columns with mixed or upper case names.  This included a bug that
974  prevented them from being reverse engineered properly.  Reported by
975  Terrence Brannon.
976
977- Fixed a bug when altering a Postgres column name that caused Alzabo
978  to generate incorrect syncing SQL.
979
980- Make the test suite play nice with the latest Test::* modules.  The
981  03-runtime.t tests were aborting because I feature I had been using
982  in earlier versions of Test::More was removed.
983
984- Alzabo::MethodMaker will die properly if given a non-existent schema
985  name.  Suggested by Ilya Martynov.
986
987- If you added a sequenced primary key to a table with MySQL, Alzabo
988  did not generate all of the SQL necessary to change the table.
989  Reported by Ilya Martynov.
990
991DEPRECATIONS:
992
993- The Alzabo::Schema start_transaction method has been renamed to
994  begin_work.  The finish_transaction method is now commit.  The old
995  names are deprecated.
996
997---------------------------------------------------------------------------
998
9990.65 May 16, 2002
1000
1001INCOMPATIBILITIES:
1002
1003- Alzabo now uses the natively created Postgres sequence for SERIAL
1004  columns.  If you have existing Alzabo code with SERIAL columns that
1005  is using the Alzabo-created sequence, then this release will break
1006  things for you.  One easy fix is to simply drop the existing
1007  Postgres-created sequence and recreate it with a new starting number
1008  one higher than the highest row already in existence.  So if your
1009  hightest "foo_id" value in the "Foo" table is 500, you would do
1010  this:
1011
1012    DROP SEQUENCE foo_foo_id_seq;
1013    CREATE SEQUENCE foo_foo_id_seq START 501;
1014
1015- The Alzabo::Table->primary_key method is now context-sensitive,
1016  returning a single column object in scalar context.
1017
1018- The data browser is no longer installed, until such time as I can
1019  rewrite it to be more useful.
1020
1021DEPRECATIONS:
1022
1023- The Alzabo::Create::Schema->add_relation method has been renamed as
1024  Alzabo::Create::Schema->add_relationship.
1025
1026ENHANCEMENTS:
1027
1028- Check out the mason/widgets directory for some handy widgets that
1029  can help integrate Mason and Alzabo in useful ways.  These aren't
1030  really well-documented yet but may be useful for playing with.  More
1031  widgets will be included in future releases (I hope).
1032
1033- When creating a relationship between tables in the schema creator,
1034  you can now let Alzabo figure out which columns to use instead of
1035  choosing them yourself.  For most relationships, Alzabo will simply
1036  do the right thing, adding a column to one of the tables as needed.
1037
1038- The problems running the tests with Postgres should now be fixed.
1039
1040- Fix stupid and inefficient internal handling of "SELECT DISTINCT"
1041  queries.  Now Alzabo simply lets the database handle this, the way
1042  it should have in the first place.
1043
1044- The Alzabo::Runtime::Schema and Alzabo::Runtime::Table ->function
1045  and ->select methods now allow you to select scalars so you can do
1046  things like SELECT 1 FROM Foo WHERE ... in order to test for the
1047  existence of a row.
1048
1049- Added Alzabo::Table->primary_key_size method, which indicates how
1050  many columns participate in the table's primary key.
1051
1052- Added Alzabo::Runtime::Schema->row_count.  Suggested by Daniel
1053  Gaspani.
1054
1055- Alzabo now detects older versions of schemas and transparently
1056  updates them.  This will work for all schemas created with version
1057  0.55 or later.
1058
1059  See the section titled "Backwards Compability" in Alzabo.pm for more
1060  details.
1061
1062- Added comment attribute for tables, columns, and foreign keys.
1063
1064- Add VARBIT and TIMESTAMPTZ as legal types for Postgres.
1065
1066- Handle SERIAL columns in Postgres better.  Use the sequence Postgres
1067  creates for the columns rather than making our own and just insert
1068  undef into new rows for that column.
1069
1070BUG FIXES:
1071
1072- Adding a column that is not-nullable or has a default to a table
1073  under Postgres was causing an error with Postgres 7.2.1.  It seems
1074  likely that with earlier versions of Postgres, this was simply
1075  failing silently.  Patch by Daniel Gaspani.
1076
1077- Fixed buggy handling of joins that had a table with a multi-column
1078  primary key as the "distinct" parameter.
1079
1080- Calling the Alzabo::Runtime::Schema->join method with no 'select'
1081  parameter and a 'join' parameter that was an array reference of
1082  array references would fail.
1083
1084- Avoid an uninit value in Alzabo::MethodMaker.  Reported by Daniel
1085  Gaspani.
1086
1087- If you created a cursor inside an eval{} block, the cursor contained
1088  an object whose DESTROY method would overwrite $@ as it went out of
1089  scope when the eval block exited.  This could basically make it look
1090  like an exception had disappeared.  Thanks to Brad Bowman for an
1091  excellent bug report.
1092
1093- Loading a schema failed in taint mode.  This was reported ages ago
1094  by Raul Nohea Goodness and dropped on the floor by me.  My bad.
1095
1096- The schema creator's exception handling was a little bit buggered up
1097  when handling Alzabo::Exception::Driver exceptions.
1098
1099---------------------------------------------------------------------------
1100
11010.64 Mar 27, 2002
1102
1103ENHANCEMENTS:
1104
1105- Added potentially useful script, alzabo_to_ascii, in eg/ dir.
1106
1107- Ask for port when setting up tests.
1108
1109- Turn on stacktraces for all Alzabo::Exception objects.
1110
1111- Removed the deprecated "lookup_tables" option from
1112  Alzabo::MethodMaker.
1113
1114- Removed the deprecated next_row methods from the various cursor
1115  classes.
1116
1117- Removed the deprecated Alzabo::Runtime::Table->func method.
1118
1119- Major changes to how joins are done.  It is now possible to mix
1120  together various sorts of outer joins in a single query.  In
1121  addition, it is now possible to specify a foreign key that should be
1122  used when joining two tables.
1123
1124- The "tables" parameter has been renamed as "join".
1125
1126- The Alzabo::Create::Schema->right_outer_join and
1127  Alzabo::Create::Schema->left_outer_join methods have been removed.
1128  Use the ->join method instead, which can now be used to do outer
1129  joins as well, via:
1130
1131    $schema->join( join => [ left_outer_join => $foo, $bar ], ... )
1132
1133- The functionality of Alzabo::Runtime::OuterJoinCursor has been
1134  merged into Alzabo::Runtime::JoinCursor.
1135
1136- Alzabo::Exception::Driver->bind now returns an array reference, not
1137  an array.
1138
1139BUG FIXES:
1140
1141- Fix failure to load schema objects from file when $\ is set to
1142  something like "\n".  Reported by Brad Bowman.
1143
1144- Fixed Postgres reverse engineering to work with slightly changed
1145  system tables in 7.2.
1146
1147- Fix handling of table alterations for postgres.  Temp tables were
1148  being created but not dropped and the data saved in the temp table
1149  was not being restored to the real table.  Also, Alzabo was trying
1150  to create sequences again when altering tables Based mostly on a
1151  patch from Daniel Gaspani.
1152
1153- Fix handling of primary key changes for Postgres (I'm still not sure
1154  it's entirely correct).
1155
1156- Fix detection of primary key changes for schema diffs.
1157
1158- Handle NOT IN for where conditions.
1159
1160---------------------------------------------------------------------------
1161
11620.63 Feb 18, 2002
1163
1164ENHANCEMENTS:
1165
1166- Calling Alzabo::Runtime::Row->select or
1167  Alzabo::Runtime::Row->select_hash with no arguments returns the
1168  values for all of the columns in the table.  Suggested by Jeremy
1169  R. Semeiks.
1170
1171- The Alzabo::Runtime::Row->id method has been renamed to id_as_string
1172  for the benefit of those crazy people who like to use "id" as a
1173  column name and want Alzabo::MethodMaker to be able to create such a
1174  method.  Suggested by Alexei Barantsev.
1175
1176- Changed the Alzabo::Create::Schema->sync_backend method so that if
1177  there was no corresponding schema in the RDBMS, then it will
1178  instantiate a new schema instead of just blowing up.  Similarly, the
1179  sync_backend_sql method will just return the SQL necessary to create
1180  the schema from scratch.
1181
1182BUG FIXES:
1183
1184- Removing column attributes via the schema creator was broken.
1185  Adding them could have caused errors but generally worked.
1186
1187- If you changed a column from non-sequenced to sequenced, the SQL
1188  "diff" was not reflecting this.
1189
1190- Revert a previous change to MySQL reverse engineering.  Now default
1191  for numeric columns that are not 0 or 0.00 are used instead of being
1192  ignored.  The fact that MySQL has 'default defaults' _really_ screws
1193  things up.  Bad MySQL!
1194
1195- A query that ended with a subgroup could not be followed with an
1196  order by or group by clause.  Bug report and test case submitted by
1197  Ilya Martynov.
1198
1199- Nested subgroups in where clauses (like where => [ '(', '(', ....)
1200  were not being allowed.  Bug report and test case submitted by Ilya
1201  Martynov.
1202
1203- Alzabo::MethodMaker would overwrite methods in the
1204  Alzabo::Runtime::Row/CachedRow/PotentialRow classes.  This has been
1205  fixed.  Reported by Alexei Barantsev.
1206
1207- Allow order by clause to contain only a SQL function to allow things
1208  like "SELECT foo FROM Bar ORDER BY RAND()", which works with MySQL.
1209
1210---------------------------------------------------------------------------
1211
12120.62 Jan 15, 2002
1213
1214ENHANCEMENTS:
1215
1216- Add support for IFNULL, NULLIF, and IF for MySQL.
1217
1218- Document that Alzabo supports COALESCE and NULLIF for Postgres.
1219
1220- Added Alzabo::ObjectCache::Sync::Mmap which uses Cache::Mmap.  This
1221  is just slightly slower than using SDBM_File.
1222
1223- New table alias feature for making queries that join against a table
1224  more than once.  An example:
1225
1226    my $foo_alias = $foo_tab->alias;
1227
1228    my $cursor = $schema->join( select => $foo_tab,
1229                                tables => [ $foo_tab, $bar_tab, $foo_alias ],
1230                                where  => [ [ $bar_tab->column('baz'), '=', 10 ],
1231                                            [ $foo_alias->column('quux'), '=', 100 ] ],
1232                                order_by => $foo_alias->column('briz') );
1233
1234  In this query, we want to get all the entries in the foo table based
1235  on a join between foo and bar with certain conditions.  However, we
1236  want to order the results by a _different_ criteria than that used
1237  for the join.  This doesn't necessarily happen often, but when it
1238  does its nice to be able to do it.  In SQL, this query would look
1239  something like this:
1240
1241    SELECT foo.foo_id
1242    FROM   foo, bar, foo as foo1
1243    WHERE  foo.foo_id = bar.foo_id
1244      AND  bar.foo_id = foo1.foo_id
1245      AND  bar.baz = 10
1246      AND  foo1.quux = 100
1247    ORDER BY foo1.quux
1248
1249FEATURE REMOVAL:
1250
1251- It is no longer possible to pass sorting specifications ('ASC' or
1252  'DESC') as part of the group_by parameter.  This was only supported
1253  by MySQL and it was broken in MySQL until 3.23.47 anyway.  It's
1254  weird and non-standard.  Just use order_by instead.
1255
1256BUG FIXES:
1257
1258- If prefetch wasn't set, all the rows in the table were being
1259  pre-fetched.
1260
1261- The newest Test::More (0.40) uses eval{} inside its isa_ok()
1262  function.  The test suite was passing $@ directly into isa_ok() and
1263  it would then get reset by the eval{} in the isa_ok() function.
1264  This has been fixed by copying $@ into another variable before
1265  passing it into isa_ok().  Apparently, Test::More 0.41 will fix this
1266  as well.
1267
1268- Make Alzabo::ObjectCache::Store::RDBMS and
1269  Alzabo::ObjectCache::Sync::RDBMS play nice with Postgres.  Postgres
1270  aborts transactions when there are errors like an attempt to insert
1271  a duplicate inside a transaction.  These module would just try to
1272  insert potentially duplicate rows and ignore the error.  Now
1273  Postgres is handled specially.
1274
1275- If you told the installer that you didn't want to run any tests with
1276  a live database, there would be errors when it tried to run
1277  03-runtime.t.  Now it just skips it.
1278
1279- Alzabo includes a script called 'pod_merge.pl' that is run before
1280  installing its modules.  This script merges POD from a parent class
1281  into a child class (like from Alzabo::Table into
1282  Alzabo::Create::Table) in order to get all the relevant
1283  documentation in one place.  The way the Makefile.PL ran this script
1284  was not working for some people, and in addition, did not end up
1285  putting the merged documentation into the generated man pages.  This
1286  release includes a patch from Ilya Martynov that fixes both of these
1287  problems.
1288
1289---------------------------------------------------------------------------
1290
12910.61 Dec 25, 2001
1292
1293ENHANCEMENTS:
1294
1295- Improve documentation for new Alzabo::Create::Schema->sync_backend
1296  method and note its caveats.
1297
1298- It is now possible to use SQL functions as part of order_by clauses.
1299  For example:
1300
1301    my $cursor = $schema->select( select => [ COUNT('*'), $id_col ],
1302                                  tables => [ $foo_tab, $bar_tab ],
1303                                  group_by => $id_col,
1304                                  order_by => [ COUNT('*'), 'DESC' ] );
1305
1306- Allow a call to Alzabo::Runtime::Table->insert without a values
1307  parameter.  This is potentially useful for tables where the primary
1308  key is sequenced and the other columns have defaults or are
1309  NULLable.  Patch by Ilya Martynov.
1310
1311BUG FIXES:
1312
1313- A call to the schema class's select or function methods that had
1314  both an order_by and group_by parameter would fail because it tried
1315  to process the order by clause before the group by clause.
1316
1317- When thawing potential row objects, Alzabo was trying to stick them
1318  into the cache, which may have worked before but not now, and should
1319  be avoided anyway.
1320
1321- The parent and children methods created by Alzabo::MethodMaker were
1322  incorrect (and unfortunately the tests of this feature were hosed
1323  too).
1324
1325- Add YEAR as exportable function from Alzabo::SQLMaker::MySQL.
1326
1327- Fix definition of WEEK and YEARWEEK functions exported from
1328  Alzabo::SQLMaker::MySQL to accept 1 or 2 parameters.
1329
1330- A bug in the caching code was throwing an exception when attempting
1331  to update objects that weren't expired.  This only seemed to occur
1332  in conjuction with the prefetch functionality.  The caching code has
1333  been simplified a bit and is hopefully now bug-free (I can dream,
1334  can't I?).
1335
1336- Make it possible to call Alzabo::Runtime::Schema->join with only one
1337  table in the tables parameter.  This is useful if you are
1338  constructing your join at runtime and you don't know how many tables
1339  you'll end up with.
1340
1341- Where clauses that began with '(' were not working.  Reported (with
1342  a test suite patch) by Ilya Martynov.
1343
1344- Where clauses that contained something like ( ')', 'and' (or 'or') )
1345  were not working either.
1346
1347- This file incorrectly thanked TJ Mather for separating out
1348  Class::Factory::Util, but this was done by Terrence Brannon.  Oops,
1349  brain fart.
1350
1351- Improve the recognition of more defaults that MySQL uses for column
1352  lengths and defaults, in order to improve reverse engineering.
1353
1354- Recognize defaults like 0 or '' for MySQL.
1355
1356- Fix Alzabo::Create::Schema->sync_backend method.
1357
1358---------------------------------------------------------------------------
1359
13600.60 Dec 6, 2001
1361
1362ENHANCEMENTS:
1363
1364- When passing order_by specifications, it is now possible to do this:
1365
1366    order_by => [ $col1, $col2, 'DESC', $col3, 'ASC' ]
1367
1368  which allow for multiple levels of sorting as well as being much
1369  simpler to remember.
1370
1371- It is now possible to do something like
1372
1373    $table->select( select => [ 1, $column ] ... );
1374
1375  and have it work.  In this case, every row returned by the cursor
1376  will have 1 as its first element.
1377
1378- Added Alzabo::MySQL and Alzabo::PostgreSQL POD pages.  These pages
1379  document how Alzabo does (or does not) support various RDBMS
1380  specific features.
1381
1382- Remove Alzabo::Util.  Use Class::Factory::Util from CPAN instead.
1383  Class::Factory::Util is a slight revision of Alzabo::Util that has
1384  been separated from the Alzabo core code by Terrence Brannon.
1385  Thanks Terrence.
1386
1387- Add the ability to sync the RDBMS backend to the current state of
1388  the Alzabo schema.  This allows you to arbitrarily update the RDBMS
1389  schema to match the current state of the Alzabo schema.
1390
1391- Add support for SELECT and WHERE clauses that use MySQL's fulltext
1392  search features.
1393
1394- Add BIT and BIT VARYING as allowed types for Postgres.
1395
1396BUG FIXES:
1397
1398- Reverse engineering was not checking for fulltext indexes with
1399  MySQL.  These indexes were treated the same as other indexes.
1400
1401- Make sure Alzabo::SQLMaker always handles stringification of
1402  functions properly.
1403
1404- Improve recognition of default column lengths under MySQL (and
1405  ignore them).  Also improve recognition of default defaults (like
1406  '0000-00-00' for DATE columns) and ignore those.
1407
1408- When using the BerkeleyDB module for object syncing or storage, the
1409  Berkeley DB code itself creates a number of temporary files.  These
1410  will now be created in the same directory as the storage/syncing
1411  file specified.
1412
1413- Allow GROUP BY foo ASC/DESC for MySQL.  The MySQL manual claims this
1414  works.  In my testing, it accepts the syntax but doesn't actually
1415  respect the order requested.  Of course, you can always add order by
1416  clause with your group by and that seems to work just fine.
1417
1418- Don't allow a GROUP BY clause to follow an ORDER BY clause.  The
1419  reverse is still allowed.
1420
1421- MySQL: Allow fulltext indexes to include *text type columns without
1422  specifying a prefix.
1423
1424- Dropping a column that had an index on it would cause an error in
1425  the generated SQL diff where Alzabo would drop the column and then
1426  try to drop (the now non-existent) index.  The fix is simply to drop
1427  the indexes first.
1428
1429- Make caching code work under Perl 5.00503.
1430
1431- Make code warnings clean (I think) under Perl 5.00503;
1432
1433DEPRECATIONS:
1434
1435- The way order_by and group_by parameters are passed has changed a
1436  bit.  In particular, this form:
1437
1438    order_by => { columns => ..., sort => ... }
1439
1440  has been deprecated in favor of a simpler syntax.
1441
1442---------------------------------------------------------------------------
1443
14440.59 Nov 17, 2001
1445
1446ENHANCEMENTS:
1447
1448- Got rid of the post_select_hash hook and combined it with
1449  post_select, which now receives a hash reference.  Suggested by Ilya
1450  Martynov.
1451
1452- Run all hooks inside Alzabo::Schema->run_in_transaction method to
1453  ensure database integrity in cases where your hooks might
1454  update/delete/insert data.  Suggested by Ilya Martynov.
1455
1456- Added new Alzabo::Runtime::Table->select method.  This is just like
1457  the existing ->function method, but returns a cursor instead of the
1458  entire result set.
1459
1460- Added a 'limit' parameter to the ->function method (also works for
1461  the ->select method).
1462
1463- Added new Alzabo::Runtime::Schema->select method.  This is like the
1464  method of the same name in the table class but it allows for joins.
1465
1466- Added new potential rows, which are objects with (largely) the same
1467  interface as regular rows, but which are not (yet) inserted into the
1468  database.  They are created via the new
1469  Alzabo::Runtime::Table->potential_row method.  Thanks to Ilya
1470  Martynov for suggestions and code for this feature.
1471
1472- Added Alzabo::Runtime::Row->schema method.  Suggested by Ilya
1473  Martynov.
1474
1475- Made it possible to use Storable to freeze and thaw any type of row
1476  object.  Previously, this would have worked but would have
1477  serialized basically every single Alzabo object in memory (whee!).
1478  Patch by Ilya Martynov.
1479
1480- Make Alzabo::Schema->run_in_transaction preserve scalar/array
1481  context and return whatever was returned by the wrapped code.
1482
1483BUG FIXES:
1484
1485- Did some review and cleanup of the exception handling code.  There
1486  were some places where exceptions were being handled in an unsafe
1487  manner as well as some spots where exception objects should have
1488  been thrown that were just using die.
1489
1490- Ignore failure to rollback for MySQL when not using transactional
1491  table.
1492
1493- Alzabo was not handling the BETWEEN operator in where clauses
1494  properly.  Patch by Eric Hillman.
1495
1496- Passing in something like this to rows_where:
1497
1498    ( where => [ $col_foo, '=', 1,
1499                 $col_bar, '=', 2 ] )
1500
1501  worked when it shouldn't.
1502
1503- Trying to do a select that involved a group by and a limit was not
1504  being allowed.
1505
1506INCOMPATIBILITIES:
1507
1508- Got rid of the post_select_hash hook and combined it with
1509  post_select, which now receives a hash reference.
1510
1511---------------------------------------------------------------------------
1512
15130.58 Oct 18, 2001
1514
1515ENHANCEMENTS:
1516
1517- Added new insert_hooks, update_hooks, select_hooks, and delete_hooks
1518  options to Alzabo::MethodMaker.  Suggested by Ilya Martynov.
1519
1520- Moved all the important document for the object caching system into
1521  Alzabo::ObjectCache, including the import options for all of the
1522  various modules.
1523
1524- Added Alzabo::ObjectCache::Sync::RDBMS &
1525  Alzabo::ObjectCache::Store::RDBMS.  The former finally allows
1526  synchronization of multiple processes across multiple machines!
1527
1528- Add Alzabo::Schema->has_table and Alzabo::Table->has_column methods.
1529
1530- Make BYTEA a legal column type for postgres.  This is treated as a
1531  blob type.
1532
1533BUG FIXES:
1534
1535- The way cardinality and dependency was being represented in the
1536  schema graphs was sometimes backward and sometimes just broken.
1537
1538- Fixed Alzabo::ObjectCache::Store::BerkeleyDB->clear, which was not
1539  actually doing anything.  Added tests that catch this.
1540
1541- The lookup_tables option, which was deprecated in 0.57, was not
1542  being allowed at all.
1543
1544- Calls to select_hash on cached rows were not going through the cache
1545  checking routines, possibly returning expired data.  Added tests for
1546  this.
1547
1548- Eliminate race condition in Alzabo::ObjectCache::Sync::BerkeleyDB.
1549
1550- The Alzabo::Runtime::Row->rows_by_foreign_key method wasn't doing
1551  quite what it said.  In cases where there was a 1..1 or n..1
1552  relationship to columns that were not the table's primary key, a
1553  cursor would be returned instead of a single row.  Reported by Ilya
1554  Martynov.
1555
1556- Alzabo::MethoMaker could generate 'subroutine foo redefined'
1557  warnings .  Reported by Ilya Martynov.
1558
1559- Fixed clear method for all Alzabo::ObjectCache::Store::* modules.
1560
1561DEPRECATIONS:
1562
1563- The insert and update options for Alzabo::MethodMaker have been
1564  deprecated.  They have been replaced by the new insert_hooks and
1565  update_hooks options, along with new select_hooks and delete_hooks
1566  options.
1567
1568INCOMPATIBILITIES:
1569
1570- If you specify give the 'all' parameter to MethodMaker, 'insert' and
1571  'update' are no longer included.
1572
1573---------------------------------------------------------------------------
1574
15750.57 Oct 9, 2001
1576
1577ENHANCEMENTS:
1578
1579- When MethodMaker creates 'row_column' methods, these are now get/set
1580  methods.
1581
1582- Added new lookup_columns option to MethodMaker (like lookup_tables
1583  but more flexible).  This replaces the now deprecated lookup_tables
1584  option.  See DEPRECATIONS and INCOMPATIBILITIES for more details.
1585
1586- Added the ability to make any storage cache module an LRU.  Simply
1587  pass an lru_size parameter to Alzabo::ObjectCache when using it and
1588  the storage module will be an LRU cache.
1589
1590- Documented Alzabo's referential integrity rules in Alzabo.pm
1591  (perldoc Alzabo).
1592
1593- Added section on optimizing memory usage to Alzabo::FAQ.
1594
1595- Alzabo::Runtime::Schema->join now takes a parameter called
1596  'distinct'.  This is useful in situations where you are joining
1597  between several tables but don't want rows back from all of them.
1598  In that case, it is possible that you could end up getting more
1599  duplicates than you need.  This parameter can help you eliminate
1600  those.
1601
1602- Add the following Alzabo::Schema methods: begin_work, rollback,
1603  commit, run_in_transaction.
1604
1605- If you have GraphViz installed the schema creator can now use it to
1606  show you a graph of your schema.
1607
1608BUG FIXES:
1609
1610- Fix handling of binary attribute for MySQL columns.  Generated SQL
1611  for creating/altering these columns may have been invalid
1612  previously.
1613
1614- The rules were not catching an attempt to create a CHAR/VARCHAR
1615  column with no length (MySQL).
1616
1617- Fixed bug that caused limit to not work when there was a where
1618  clause or order_by clause.  Reported by Ilya Martynov.
1619
1620- Documented row_column option for MethodMaker.
1621
1622- order_by was ignored when given to the Alzabo::Runtime::Schema->join
1623  method.  Reported by Martin Ertl.
1624
1625- When viewing an existing column in the schema creator, the three
1626  checkboxes at the bottom were always unchecked.
1627
1628- The test suite has been revamped to use Test::More.  In the process
1629  some new tests were added and some (gulp) false positives were
1630  caught.
1631
1632- The default column value wasn't being escaped in the schema creator.
1633
1634DEPRECATIONS
1635
1636- The Alzabo::MethodMaker option 'lookup_tables' has been deprecated.
1637  Use the new 'lookup_columns' option instead.
1638
1639INCOMPATIBILITIES:
1640
1641- Alzabo::ObjectCache::Store modules now expect an object id instead
1642  of an object for their delete_from_cache method.
1643
1644- If you specify give the 'all' parameter to MethodMaker,
1645  'lookup_tables' is no longer included.
1646
1647---------------------------------------------------------------------------
1648
16490.56
1650
1651Had to become 0.57 cause I was too hasty in uploading to CPAN.  Doh!
1652
1653---------------------------------------------------------------------------
1654
16550.55 Sep 24, 2001
1656
1657UPGRADE INSTRUCTIONS:
1658
1659Because of changes to the internal data structures for some objects,
1660the saved schema files from older versions of Alzabo will no longer
1661work with this new version.
1662
1663In the eg/ directory of this distribution, there is a script called
1664convert.pl that can be used to convert your schemas.
1665
1666It is _crucial_ that this script be run while you still have your
1667_current_ version of Alzabo installed.
1668
1669To repeat, DO NOT INSTALL THE NEWEST VERSION OF Alzabo BEFORE RUNNING
1670THIS SCRIPT!
1671
1672Now that we've got that straightened out...
1673
1674What this script does is read an existing schema and generate code
1675that you can run after installing the new version of Alzabo.  This
1676code will recreate your schema from scratch.
1677
1678It should be noted that this script _will_ reverse the cardinalities
1679of the relationships in your schema.  See the entries in BUG FIXES
1680about this.
1681
1682If you don't like this and want it the old broken way, you can run the
1683reverse_cardinality.pl script in the eg/ directory on your schemas.
1684However, you can only do this _after_ installing this new version of
1685Alzabo.
1686
1687So the steps you should take are:
1688
16891. Backup all of your schema files (by default, these are stored under
1690   /usr/local/alzabo).
1691
16922. Run convert.pl against each schema you have created by doing:
1693
1694     perl convert.pl <schema name>
1695
1696   This will create a file named <schema name>_schema.pl
1697
16983. After doing this for _all_ of your schemas, install this version
1699   Alzabo.
1700
17014. Simply run each file created by the convert.pl script.  This will
1702   overwrite the old schema files.
1703
1704If you are creating your schemas via a script, then you can use the
1705code generated by convert.pl to replace the code that does this.  Do
1706note that the cardinalities will be reversed in the generated code.
1707Those who are doing this will notice that the generated code seems to
1708contain everything twice.  This has to do with how Alzabo keeps track
1709of changes from one generation of a schema to the next.  Simply use
1710the code up to right before the generated code contains the comment
1711"Previous generation of schema".
1712
1713ENHANCEMENTS:
1714
1715- Greatly improved the flexibility of the join and *_outer_join
1716  methods for the schema class.  It is now possible to construct
1717  arbitrary joins between any set of tables in any manner.
1718
1719- Eliminate use of transactions where not needed and shorten their
1720  length in other places.  Also make sure failed commit triggers a
1721  rollback.
1722
1723- Get rid of silly min/max language in favor of cardinality and
1724  dependencies.
1725
1726BUG FIXES:
1727
1728- Fixed a problem with syncing after the Unix time rollover to 10
1729  digits.
1730
1731- Alzabo::ForeignKey->is_many_to_one always returned false.
1732
1733- Alzabo::MethodMaker was interpreting foreign key cardinality
1734  incorrectly (backwards).  This meant it was treating one-to-many
1735  relationships as many-to-one.  Reported by Martin Ertl.
1736
1737  NOTE: This fix will break code that depended on this behavior.  See
1738  the UPGRADE INSTRUCTIONS above.
1739
1740- This was also broken in Alzabo::Create::Schema->add_relation.  I
1741  took this opportunity to rewrite the code get rid of the use of
1742  min_max_* and replace it with cardinality and dependency, which is
1743  easier to understand.
1744
1745  NOTE: This fix will break old code that created schemas
1746  programmatically.  See the UPGRADE INSTRUCTIONS above.
1747
1748DEPRECATIONS:
1749
1750- The Alzabo::Runtime::RowCursor->next_row,
1751  Alzabo::Runtime::JoinCursor->next_rows, and
1752  Alzabo::Runtime::OuterJoinCursor->next_rows methods have all been
1753  deprecated.  Instead, simply use the ->next method for all of them.
1754
1755INCOMPATIBILITIES:
1756
1757- The Alzabo::Column->null and Alzabo::Create::Column->set_null
1758  methods (deprecated in 0.20) are gone.  Use ->nullable and
1759  ->set_nullable instead.
1760
1761---------------------------------------------------------------------------
1762
17630.51 Aug 29, 2001
1764
1765BUG FIXES:
1766
1767- Accidentally broke foreign key display for schema creation interface
1768  in 0.50. -- In retrospect, the bug was fixing this.  Oh well, live
1769  and learn.
1770
1771ENHANCEMENTS:
1772
1773- Add ->handle method to Alzabo::Driver class, which lets you set and
1774  get the current database handle.  Suggested by Ilya Martynov.
1775
1776---------------------------------------------------------------------------
1777
17780.50 Aug 16, 2001
1779
1780ENHANCEMENTS:
1781
1782- There is now support for left and right outer joins.  The interface
1783  to this may change a bit in future releases.
1784
1785- Added the following methods to foreign key objects:
1786  from_is_dependent, to_is_dependent, is_one_to_one, is_one_to_many,
1787  is_many_to_one.
1788
1789- Improved and fixed the Alzabo::MethodMaker documentation.
1790
1791DEPRECATIONS:
1792
1793- In some future release all references to the concept 'min_max_from'
1794  and 'min_max_to' will go away.  Instead, relationships will be
1795  described by their cardinality and dependencies.  This was changed
1796  in the schema creation interface a while ago but the APIs have not
1797  yet completely switched over (there are accessors for the new way,
1798  but the set methods still use the old concepts).  I'll make sure
1799  that there is a time when using these methods issues a warning about
1800  their deprecation.
1801
1802BUG FIXES:
1803
1804- Fix pod merging, which broke a while back (this merges superclass
1805  documentation into subclasses for things like
1806  Alzabo::Runtime::Table).
1807
1808- The code was accidentally serializing a DBI handle, which generates
1809  lots of useless warnings.  This wasn't affecting Alzabo's operations
1810  as it never attempted to use the thawed handle.
1811
1812- Fix handling of ENUM and SET column types for MySQL.  These were not
1813  being allowed through properly.
1814
1815- Attempting to insert a value into a column that was related to a
1816  non-primary key column were not allowed if the value being inserted
1817  did not match the related column in the other table, even when the
1818  columns were not dependent on each other.  Now this is only
1819  disallowed when the foreign key is a primary key in its own table.
1820
1821---------------------------------------------------------------------------
1822
18230.49 Jul 18, 2001
1824
1825BUG FIXES:
1826
1827- Found out even more missing files from the MANIFEST (all related to
1828  the schema creation interface).  Fortunately, I just discovered
1829  Perl's "make distcheck" so this shouldn't happen in the future.
1830
1831- One link each in the schema creator and data browser were using a
1832  hard-coded .mhtml extension instead of calling
1833  Alzabo::Config::mason_extension().  Reported by Barry Hoggard.
1834
1835---------------------------------------------------------------------------
1836
18370.48 Jul 17, 2001
1838
1839BUG FIXES:
1840
1841- I was missing yet another file from the MANIFEST.  Thanks to Barry
1842  Hoggard for helping me out with this.
1843
1844- Fix a bug in the test number for 03-runtime.t.
1845
1846---------------------------------------------------------------------------
1847
18480.47 Jul 17, 2001
1849
1850ENHANCEMENTS:
1851
1852- Make several of the config values settable via the Alzabo::Config
1853  module.  Suggested by Jared Rhine.
1854
1855- Transactions should now work under MySQL.  Whether it does anything
1856  or not depends on the table type you are using.  This needs testing
1857  though.
1858
1859BUG FIXES:
1860
1861- Make sure that index names are not too long.
1862
1863- Added a missing file to the MANIFEST.  0.46 was missing a needed
1864  file from the tarball.
1865
1866---------------------------------------------------------------------------
1867
18680.46 Jul 2, 2001
1869
1870ENHANCEMENTS:
1871
1872- Column types are now canonized to be all upper case.  When multiple
1873  keywords specify the same type ('INT' and 'INTEGER', for example),
1874  one will be chosen.  This improves the quality of the reverse
1875  engineering and the usability of the schema creation interface.
1876
1877- You can now use SQL functions pretty much anywhere you would want
1878  (in inserts, updates, where clauses, etc).  See the "Using SQL
1879  Functions" section in the Alzabo.pm docs for more details.
1880
1881- As a corollary to the above, the Alzabo::Runtime::Table->function
1882  method has been created to replace the old
1883  Alzabo::Runtime::Table->func method.  This new method takes
1884  advantage of the new system for using SQL functions and is simpler
1885  and more flexible.  It allows you to perform all sorts of aggregate
1886  selects.
1887
1888- Added the Alzabo::Runtime::Row->select_hash method.  Requested by
1889  Dana Powers.
1890
1891DEPRECATIONS:
1892
1893- The Alzabo::Runtime::Table->func method has been deprecated.
1894
1895BUG FIXES:
1896
1897- When adding an AUTO_INCREMENT column to an existing MySQL table, the
1898  SQL generated would cause an error.  This has been fixed.  However,
1899  if the table already has more than row then chances are this still
1900  won't work (because MySQL does not try to generate needed unique
1901  values for the column when it is added).
1902
1903---------------------------------------------------------------------------
1904
19050.45 Jun 6, 2001
1906
1907INCOMPATIBILITIES:
1908
1909- The 'dbm_file' parameter given when loading a syncing module that
1910  used DBM files (such as Alzabo::ObjectCache::Sync::SDBM_File) has
1911  been changed to 'sync_dbm_file', because this release includes a new
1912  cache storage module that uses DBM files as well.
1913
1914- The schema creator now requires HTTP::BrowserDetect.
1915
1916- Fix what was arguably a bug in the caching/syncing code.
1917  Previously, one process could update a row and another process could
1918  then update that same row.  Now the second process will throw an
1919  exception.
1920
1921BUG FIXES:
1922
1923- Accidentally left debugging turned on in Alzabo::Exceptions.
1924
1925- The schema creator did not allow you to remove a length or precision
1926  setting for a column once it had been made.
1927
1928- Require a length for CHAR and VARCHAR columns with MySQL.
1929
1930- Add error on setting precision for any column that doesn't allow
1931  them with MySQL.
1932
1933- The interaction of caching rows and Alzabo::MethodMaker was not
1934  right.  Basically, it was determined at compile time whether or not
1935  to use the cached row class but this needs to be determined at run
1936  time.  This has been fixed.
1937
1938- Using the Alzabo::Runtime::Row->rows_by_foreign_key method would
1939  fail when the column in one table did not have the same name as a
1940  column in the other table.  Reported by Michael Graham (along with a
1941  correct diagnosis, thanks!).
1942
1943- Don't specify a database name when creating or dropping a database.
1944  Reported and patched by Dana Powers.
1945
1946ENHANCEMENTS:
1947
1948- Rules violations error messages (bad table name, for example) in the
1949  schema creator are now handled in a much friendlier manner.  Instead
1950  of the big error dump exception page it returns you to the page you
1951  submitted from with an error message.
1952
1953- Add Alzabo::Create::Column->alter method which allows you to change
1954  the column type, length, and precision all at once.  This is
1955  necessary because some of the column type validation code will
1956  insist that a column have a length setting.  If you try to change
1957  them in two separate operations it will throw an exception.
1958
1959- Add Alzabo::ObjectCache::Store::Null - This allows you to use any
1960  multi-process syncing module without using up the memory that
1961  Alzabo::ObjectCache::Store::Memory uses.
1962
1963- Add Alzabo::ObjectCache::Store::BerkeleyDB - I'm not sure if storing
1964  in a db file is really a performance win (vs. null storage) because
1965  of the work needed to freeze & thaw the row objects.  Benchmarks are
1966  needed.
1967
1968- Add support for fulltext indexes (MySQL).
1969
1970- Don't show fulltext or column prefix options when creating indexes
1971  for databases that don't support these features.
1972
1973- Use cardinality & dependency language for relations.
1974
1975- Add some style to the schema creator (via stylesheets).  It looks a
1976  little better now.
1977
1978---------------------------------------------------------------------------
1979
19800.44 May 4, 2001
1981
1982BUG FIXES:
1983
1984- Bug fix in Alzabo::Runtime::Table->set_prefetch.  Reported by Bob
1985  Gustafson.
1986
1987- Don't try to make directories when running Makefile.PL.  Save it for
1988  later after user does 'make install'.
1989
1990- Fix handling of geometric types in Postgres (they were all being
1991  rejected as invalid).
1992
1993- Drop columns from a table before adding new ones.  Sometimes this
1994  makes a difference.  For example, if you are using MySQL and drop an
1995  existing AUTO_INCREMENT column and add a new one that is also
1996  AUTO_INCREMENT.
1997
1998- Only allow one sequenced column per table when using MySQL.
1999
2000- Doc fixes.  Thanks to Ron Savage for pointing me towards some of
2001  these.
2002
2003- Fix a bug with the schema creator.  If you attempted to make a
2004  change to a column with an extended type and you did not change the
2005  type, an error occurred.
2006
2007ENHANCEMENTS:
2008
2009- Schema creator now shows you a list of possible column types instead
2010  of having you type it in.  However, for complex types like MySQL's
2011  ENUM or Postgres' POLYGON there is a text box to type it in.
2012
2013---------------------------------------------------------------------------
2014
20150.43 Apr 25, 2001
2016
2017ENHANCEMENTS:
2018
2019- Allow passing of port when executing SQL from schema creator.
2020
2021- Confirm schema deletion in schema creator.
2022
2023BUG FIXES:
2024
2025- Quick hack to fix a problem with Alzabo::MethodMaker when using
2026  caching.  However, this requires that the caching modules be loaded
2027  first, before Alzabo::MethodMaker.  A more palatable fix will be in
2028  a future release.
2029
2030- Fix a problem with prefetching rows that caused row objects to
2031  contain undefined values for certain columns.  This only happened if
2032  you were prefetching one column.
2033
2034- Fix another problem that left the schema creator still broken.
2035
2036---------------------------------------------------------------------------
2037
20380.42 Apr 25, 2001
2039
2040BUG FIXES:
2041
2042- The schema creator was broken (for lack of quotes around one string)
2043
2044- Remove 255 char limit on prefix length (this needs more research).
2045
2046---------------------------------------------------------------------------
2047
20480.41 Apr 24, 2001
2049
2050BUG FIXES:
2051
2052- 0.40 was missing a file in the distro
2053  (lib/Alzabo/ObjectCache/Sync/DBM.pm).
2054
2055---------------------------------------------------------------------------
2056
20570.40 Apr 24, 2001
2058
2059INCOMPATIBILITIES:
2060
2061The classes in the ObjectCache hierarchy have been reorganized.  The
2062renaming is as follows:
2063
2064  Alzabo::ObjectCache::MemoryStore => Alzabo::ObjectCache::Store::Memory
2065  Alzabo::ObjectCache::DBMSync     => Alzabo::ObjectCache::Sync::DB_File
2066  Alzabo::ObjectCache::IPCSync     => Alzabo::ObjectCache::Sync::IPC.pm
2067  Alzabo::ObjectCache::NullSync    => Alzabo::ObjectCache::Sync::Null.pm
2068
2069ENHANCEMENTS:
2070
2071- Document order by clauses for joins.
2072
2073- Document limit clauses for joins and single table selects.
2074
2075- Expand options for where clauses to allow 'OR' conditionals as well
2076  as subgroupings of conditional clauses.
2077
2078- If you set prefetch columns for a table, these are now fetched along
2079  with other data for the table in a cursor, reducing the number of
2080  database SELECTs being done.
2081
2082- Added Alzabo::Create::Schema->clone method.  This allows you to
2083  clone a schema object (except for the name, which must be changed as
2084  part of the cloning process).
2085
2086- Using the profiler, I have improved some of the hot spots in the
2087  code.  I am not sure how noticeable these improvements are but I
2088  plan to do a lot more of this type of work in the future.
2089
2090- Added the Alzabo::ObjectCache::Sync::BerkeleyDB and
2091  Alzabo::ObjectCache::Sync::SDBM_File modules.  These modules are
2092  much faster than the old DBMSync or IPCSync modules and actually
2093  appear to be faster than not syncing at all.  The NullSync (now
2094  Sync::Null) module is still faster than all of them, however.
2095
2096BUG FIXES:
2097
2098- Reversing engineering a MySQL schema with ENUM or SET columns may
2099  have caused an error if the values for the enum/set contained
2100  spaces.
2101
2102- A bug in the schema creation interface made it impossible to create
2103  an index without a prefix.  Reported by Sam Horrocks.
2104
2105- When dropping a table in Postgres, the sequences for its columns (if
2106  any), need to be dropped as well.  Adapted from a patch submitted by
2107  Sam Horrocks.
2108
2109- The modules needed by the schema creator and data browser are now
2110  used by the components.  However, it is still better to load them at
2111  server startup in order to maximize shared memory.
2112
2113- Calling the object cache's clear method did not work when using the
2114  IPCSync or NullSync modules.
2115
2116- Reverse engineering a Postgres database was choking on char(n)
2117  columns, which are converted internally by Postgres into bpchar(n)
2118  columns.  This is now fixed (by converting them back during reverse
2119  engineering).
2120
2121- Reject column prefixes > 255 with MySQL.  I hesitate to call this a
2122  bug fix since this appears to be undocumented in the MySQL docs.
2123
2124- Using the DBMSync module in an environment which started as one user
2125  and then became another (like Apache) may have caused permiission
2126  problems with the dbm file.  This has been fixed.
2127
2128MISC:
2129
2130- Require DBD::Pg 0.97 (the latest version as of this writing) as it
2131  fixes some bugs in earlier versions.
2132
2133ARCHITECTURE:
2134
2135- Split up Row object into Alzabo::Runtime::Row (base class for
2136  standard uncached row) and Alzabo::Runtime::CachedRow (subclass for
2137  rows that have to interact with a cache).  This simplifies the code,
2138  particulary in terms of how it interacts with the caching system.
2139
2140- Made Alzabo::Runtime::Row->get_data a private method.  This served
2141  no purpose for end users anyway.
2142
2143---------------------------------------------------------------------------
2144
21450.36 Mar 20, 2001
2146
2147- Addition of Params::Validate broke several methods:
2148-- The Alzabo::Schema->tables method was broken when trying to
2149   retrieve a subset of all the tables.
2150-- The Alzabo::Create::Schema->move_table method was broken (thus
2151   breaking the ability to add a table at a specified place in the table
2152   order).
2153-- Same problem for Alzabo::Create::Table->move_column.
2154
2155- Added to the test suite to catch all this in the future.
2156
2157- Attempting to dynamically generate component paths in the Mason
2158  component was a bad idea, particularly since it was unnecessary
2159  because I can find the component by doing '../common/foo'.  Thanks
2160  to Bob Gustafson for suggesting this.
2161
2162- Fix bug in Postgres rules that didn't allow length for CHAR columns.
2163
2164- Fixed problems running multi-process tests with Postgres.
2165
2166---------------------------------------------------------------------------
2167
21680.35 Mar 18, 2001
2169
2170- Add ability to specify port parameter when connecting to DB for
2171  reverse engineering/data browser.
2172
2173- Fix support for host param in data browser.
2174
2175- Added a new Alzabo/FAQ.pod file.  Its pretty skimpy but hopefully it
2176  will become more useful over time.
2177
2178- If your Mason component root was under your document then the links
2179  to return to the top levels of the schema creator and data browser
2180  were broken.  Note: if your component root is entirely outside your
2181  document root then things may not work at all.
2182
2183- Add support for extra MySQL connection params (like
2184  mysql_default_file).  See the Alzabo::Driver::MySQL docs for more
2185  details.
2186
2187- Add support for Postgres connect params 'options' and 'tty'.
2188
2189- Alzabo::Create::Schema->reverse_engineer was not passing the 'port'
2190  parameter to the driver when attempting to make a driver.
2191
2192- Attempting to pass in the port parameter to a connection would have
2193  generated a bad DSN due to a type in the code.
2194
2195- Started using Params::Validate so I can be even stricter about
2196  argument checking.
2197
2198- Fix bug introduced in 0.33.  Changing a column's type always removed
2199  any length and precision setting for the column.  Now it is only
2200  removed if the new column type does not allow a length or precision
2201  setting.
2202
2203- Fix some warnings in the Makefile.PL code.  Also require Pod::Man >=
2204  1.14 to handle =head3 and =head4 directives.
2205
2206- The Postgres code did not allow the ABSTIME, MACADDR, or RELTIME
2207  column types.  These have been added.  Thanks to Bob Gustafson for
2208  helping me find this problem.
2209
2210- The Alzabo::Create::Schema->reverse_engineer method was not doing
2211  anything with a host parameter.  Reported by Aaron Johnson.
2212
2213- Fix bug in Alzabo::ObjectCache docs.  Reported by Robin Berjon.
2214
2215- Include a first version of the quick method reference suggested by
2216  Robin Berjon.  This Alzabo::QuickRef.  The HTML version is
2217  table-ized and spiffed up a bit from the POD version.
2218
2219---------------------------------------------------------------------------
2220
22210.34 Feb 26, 2001
2222
2223- If you were trying to run the tests on a system without MySQL
2224  installed, or without the DB_File or IPC::Shareable modules, you saw
2225  lots of test failures, even if you said you did not plan to use the
2226  parts of Alzabo that required these.  This has been fixed.  I can
2227  now run the tests successfully using a Perl with only DBD::Pg and
2228  DBI installed and it will skip any tests that it can't run.
2229
2230- Fixed another caching bug related to objects that were deleted and
2231  then another row was inserted with the same primary key.  Note to
2232  self: premature optimization is the root of all evil.
2233
2234---------------------------------------------------------------------------
2235
22360.33 Feb 21, 2001
2237
2238- The linking table methods generated by Alzabo::MethodMaker were
2239  broken.  Fixed this.
2240
2241- Changed how order by clauses can be passed to select operations.
2242  Also changed the docs, which were way out of sync with the changes
2243  in this area.
2244
2245- Attempting to update more than one value at once was broken.  Fixed
2246  this.
2247
2248- Added Alzabo::Runtime::Table->func method to allow arbitrary column
2249  aggregate functions like MAX, MIN, AVG, etc.
2250
2251- Fixed schema creator bug.  It was not possible to change a column's
2252  NULLability after it was created.
2253
2254- When changing a column's type, Alzabo now removes any column
2255  attributes that are not valid for that column.  In addition, if the
2256  existing length and precision parameters are not valid, they will be
2257  set to undef.
2258
2259- Fixed the code to get rid of weird error messages that came from DBI
2260  with Perl 5.6.0+ when the Alzabo::Create::Schema->create or
2261  Alzabo::Create::Schema->reverse_engineer methods were called.  For
2262  the curious, this has to do with the DBI object passing through
2263  Storable::dclone.
2264
2265---------------------------------------------------------------------------
2266
22670.32 Feb 7, 2001
2268
2269- Forgot to include data browser files in MANIFEST.  Caused weirdness
2270  if you said you wanted it when asked during install.  Reported by
2271  Remi Cohen-Scali.
2272
2273---------------------------------------------------------------------------
2274
22750.31 Feb 5, 2001
2276
2277Bug fixes only
2278
2279- Fix bugs in Alzabo::MethodMaker.  The insert, update, lookup_table,
2280  and self_relation (parent portion only) were broken.
2281
2282- A bug in the SQL making code was causing some queries to appear as
2283  if they failed when they didn't.
2284
2285---------------------------------------------------------------------------
2286
22870.30 Feb 4, 2001
2288
2289- The convert.pl script in eg/ has been updated to handle the new
2290  release.  IMPORTANT: I forgot to include a mention of this in the
2291  last release but you need to run the script _before_ installing a
2292  new version of Alzabo.
2293
2294- Many improvements and updates to Alzabo::MethodMaker.  Highlights
2295  include fixing a bug that prevented the insert and update methods
2296  from being created, a new callback system that allows you to specify
2297  all the method names to be generated, and a new 'self_relations'
2298  option for tables that have parent/child relationships with
2299  themself.
2300
2301- Fix handling of NULL columns for inserts and updates.  Now, Alzabo
2302  only throws an exception if the column is not nullable and has no
2303  default.  If it has a default and is specified as NULL then it will
2304  not be included in the INSERT clause (in which case the RDBMS should
2305  insert the default value itself).
2306
2307- Fix bugs in Postgres reverse engineering.  Defaults were not handled
2308  properly, nor were numeric column type length and precision.
2309
2310- The schema creator and data browser now allow you to enter the host
2311  for database connections where needed.
2312
2313- Foreign keys can now span multiple columns.  This means you can have
2314  a relation from foo.foo_id and foo.index_id to bar.foo_id and
2315  bar.index_id.  This required some changes to the interface for the
2316  foreign key objects.  Notably, the Alzabo::ForeignKey->column_from
2317  and Alzabo::ForeignKey->column_to methods are now
2318  Alzabo::ForeignKey->columns_from and Alzabo::ForeignKey->columns_to.
2319  In addition, the parameters given to the
2320  Alzabo::Create::Schema->add_relation have changed.
2321
2322- Major changes to caching architecture.  The caching code has been
2323  split up.  There is now a 'storing' class, which holds onto the
2324  objects (the cache).  Then there is a 'sync' class.  This class
2325  handles expiration and deletion tracking.  These two classes can be
2326  mixed and matched.  Right now there is only one storage class (which
2327  stores the objects in memory).  There are 3 syncing classes.  One,
2328  NullSync, doesn't actually sync objects.  It does track deletions,
2329  but not expirations.  The others, IPCSync and DBMSync, use IPC or
2330  DBM files to track expiration and deletion of objects.
2331
2332- Doing this work highlighted some bugs in the caching/syncing code.
2333  One oversight was that if you deleted an object and then inserted
2334  another row with the exact same primary key, the cache continued to
2335  think the object was deleted.  Other bugs also surfaced.  These have
2336  been fixed and the test suite has been updated so caching should be
2337  stable (if not, I'll have to cry).
2338
2339- When viewing an existing column in the schema creator, defaults,
2340  lengths, and precision of 0 were not being shown.
2341
2342- Alzabo::Runtime::Table->row_count can now take a where clause.
2343
2344- Fix bugs in Alzabo::Create::Table.  This was causing problems with
2345  indexes when the table name was changed.
2346
2347- Fixed a bug in Alzabo::Util that caused the test cases to fail if
2348  Alzabo hadn't been previously installed.  Reported by Robert Goff.
2349
2350- The SQLMaker class is now smarter about not letting you make bad
2351  SQL.  For example, if you try to make a WHERE clause with tables not
2352  mentioned in the FROM clause, it will throw an exception.  This will
2353  hopefully help catch logic errors in your code a bit sooner.
2354
2355- Removed use of prepare_cached in Alzabo::Driver.  This has the
2356  potential to cause some strange errors under Alzabo.  Because of the
2357  way Alzabo works, it is possible to have a Cursor object holding
2358  onto a statement handle that needs to be used elsewhere (by a row
2359  object, for example).  It is safer to let a new statement handle be
2360  created in this case.
2361
2362INCOMPATIBILITIES
2363
2364- See the note above about the changes required to support
2365  multi-column foreign keys.
2366
2367- Because of the aforementioned changes to the caching architecture,
2368  caching just does not work the way it used to.
2369
2370  1. By default, there is no caching at all.
2371
2372  2. To get the old behavior, which defaulted to an in-process memory
2373  cache with no inter-process syncing (meaning deletes are tracked but
2374  there is no such thing as expiration), you can do this in your code:
2375
2376    use Alzabo::ObjectCache( store => 'Alzabo::ObjectCache::MemoryStore',
2377                             sync  => 'Alzabo::ObjectCache::NullSync' );
2378
2379  or just:
2380
2381    use Alzabo::ObjectCache;  # the above modules are the defaults
2382
2383  3. To get the behavior of the old Alzabo::ObjectCacheIPC module, do:
2384
2385    use Alzabo::ObjectCache( store => 'Alzabo::ObjectCache::MemoryStore',
2386                             sync  => 'Alzabo::ObjectCache::IPCSync' );
2387
2388  However, the new DBMSync module will probably scale better, and
2389  performance should be about the same for smaller applications.  To
2390  use it, do:
2391
2392    use Alzabo::ObjectCache( store => 'Alzabo::ObjectCache::MemoryStore',
2393                             sync  => 'Alzabo::ObjectCache::DBMSync' );
2394
2395  4. If you run without any caching at all then the
2396  Alzabo::Runtime::Row class's behavior has changed somewhat.  In
2397  particular, selects or updates against a deleted object will always
2398  throw an Alzabo::Exception::NoSuchRow exception.  Before, the
2399  behavior wasn't very well defined.
2400
2401  Please read the section on clearing the cache in the
2402  Alzabo::ObjectCache module, as this is an important concept.  By
2403  default, the caching and syncing modules will just grow unchecked.
2404  You need to clear at the appropriate points (usually your
2405  application's entry points) in order to keep them under control.
2406
2407---------------------------------------------------------------------------
2408
24090.20 Jan 9, 2001
2410
2411- Preliminary Postgres support.  There is no support yet for
2412  constraints or foreign keys when reverse engineering or making SQL.
2413  There is also no support for large objects (I'm hoping that 7.1 will
2414  be released soon so I won't have to think about this).  Otherwise,
2415  the support is about at the same level as MySQL support, though less
2416  mature.
2417
2418- Added Alzabo::MethodMaker module.  This can be used to auto-generate
2419  useful methods for your schema/table/row objects based on the
2420  properties of your objects themselves.
2421
2422- Reworking/expanding/clarifying/editing of the docs.
2423
2424- Add order_by and limit options whenever creating a cursor.
2425
2426- Method documentation POD from the Alzabo::* modules is merged into
2427  the relevant Alzabo::Create::* and Alzabo::Runtime::* modules during
2428  install.  This should make it easier to find what you need since the
2429  average user will only need to look at a few modules in
2430  Alzabo::Runtime::*.
2431
2432- Reworked exceptions so they are all now
2433  Alzabo::Exception::Something.
2434
2435- Added default as a column attribute (thus there are now
2436  Alzabo::Column->default and Alzabo::Create::Column->set_default
2437  methods).
2438
2439- Added length & precision attributes for columns.  Both are set
2440  through the Alzabo::Create::Column->set_length method.
2441
2442- This release includes a script in eg/ called convert.pl to convert
2443  older schemas.
2444
2445- Alzabo::Schema->tables & Alzabo::Table->columns now take an optional
2446  list of tables/columns as an argument and return a list of matching
2447  objects.
2448
2449- Added Alzabo::Column->has_attribute method.
2450
2451- The data browser has actually lost some functionality (the
2452  filtering).  Making this more powerful is a fairly low priority at
2453  the moment.
2454
2455- Fix bugs where extra params passed to Alzabo::Runtime::Table->insert
2456  were not making it to the Alzabo::Runtime::Row->new method.
2457
2458- Fix for Alzabo::Runtime::Table->set_prefetch method.
2459
2460- Fixed bug in handling of deleted object in Alzabo::ObjectCacheIPC
2461  (they were never reported as deleted).
2462
2463- Fix bug that caused schema to get bigger every time it was saved.
2464
2465- Finally switched to regular hashes for objects.
2466
2467- Added Alzabo::SQLMaker classes to handle generating SQL in a
2468  cross-platform compatible way.
2469
2470DEPRECATIONS:
2471
2472- Parameters for Alzabo::Create::Column->new: 'null' parameter is now
2473  'nullable'.  The use of the parameter 'null' is deprecated.
2474
2475- Alzabo::Column->null & Alzabo::Column->set_null methods are now
2476  Alzabo::Column->nullable & Alzabo::Column->set_nullable.  The old
2477  methods are deprecated.
2478
2479- Alzabo::Create::ForeignKey->new no longer requires table_from &
2480  table_to params (it took me this long to realize I can get that from
2481  the column passed in.  doh!)
2482
2483INCOMPATIBILITIES:
2484
2485- Alzabo::Runtime::Table->rows_where parameters have changed.  The
2486  from parameter has been removed (use the
2487  Alzabo::Runtime::Schema->join method instead).  The where parameter
2488  expects something different now.
2489
2490- Alzabo::Runtime::Table->rows_by_where_clause method has been
2491  removed.
2492
2493- Alzabo::Runtime::Schema->join method's where parameter expects
2494  something different.
2495
2496---------------------------------------------------------------------------
2497
24980.10_5 Oct 10, 2000
2499
2500- You can now specify a database name to be used for testing.  The
2501  default is 'test_alzabo'.  This a good default for MySQL, at least.
2502  Thanks to Randal Schwartz for the help.
2503
2504- Make sure test file cleanup is done _before_ attempting tests so
2505  that files from a test previously aborted are cleaned up (and no
2506  errors are generated.  Thanks to Randal Schwartz for the bug report.
2507
2508- Doesn't fail on install for Mason components if no Mason component
2509  extension was given.  Thanks _again_ to Randal for working with me
2510  on this in IRC late at night.
2511
2512---------------------------------------------------------------------------
2513
25140.10_4 Oct 10, 2000
2515
2516- Fix Makefile.PL bug
2517
2518- Auto select a column when adding a relation (if there is a logical
2519  one to select).
2520
2521---------------------------------------------------------------------------
2522
25230.10_3
2524
2525- Fix bug with deleting foreign key objects from tables.
2526
2527---------------------------------------------------------------------------
2528
25290.10
2530
2531  **FIRST BETA VERSION**
2532
2533- Doc bug fixes in Alzabo::Runtime::Schema.
2534
2535- Fix fact that Alzabo::Runtime::Row rows_by_foreign_key method could
2536  return either a Row _or_ RowCursor object.  Now it always returns a
2537  cursor object.
2538
2539- Fix fact that no_cache parameter was not propagated through the
2540  RowCursor object to the rows it created.
2541
2542- Add all all_rows method to Alzabo::Runtime::RowCursor.
2543
2544- Add ability to reset instantiation flag in schema creation
2545  interface.
2546
2547- Updated INSTALL to mention how to get the schema creator and data
2548  browser working.
2549
2550- Finally make creating relations between tables _without_ specifying
2551  the columns work.  This does some, IMHO, pretty cool DWIMmery.
2552
2553- Added primary_key param to Alzabo::Runtime::Table make_column
2554  method.
2555
2556- Added set_host and host methods to Alzabo::Runtime::Schema.
2557
2558- Added drop method to Alzabo::Create::Schema and necessary support in
2559  driver modules.
2560
2561- Changed 'id' param to 'pk' for Alzabo::Runtime::Table row_by_pk
2562  method.  'id' still works, for now, but is deprecated.
2563
2564- Fix problem where an insert could generate a referential integrity
2565  exception but still end up in the database.  Note, without
2566  transactions (in MySQL, for example), there's no way to make the all
2567  of the referential integrity code work correctly 100% of the time.
2568
2569- Added new class Alzabo::ObjectCache to make sure that objects stay
2570  in sync after referential integrity operations happen.  This is now
2571  the default caching class.  Please make sure to read the docs for
2572  this new module, particularly if you're running Alzabo under a
2573  persistent environment where this module can be quite the memory hog
2574  if not used properly (clear the cache!).
2575
2576- Fixed breakage in maintenance of referential integrity caused by
2577  switch to cursors (and me not fixing all the code that expected row
2578  objects).
2579
2580- Added Alzabo::Runtime::Cursor base class.
2581
2582- Added join method to Alzabo::Runtime::Schema.  *EXPERIMENTAL*
2583
2584- Added Alzabo::Runtime::JoinCursor class.  *EXPERIMENTAL*
2585
2586- Began conversion of all classes from pseudohash to hash.
2587
2588- Both schema creator and data browser now respect user choice of
2589  component extension.
2590
2591---------------------------------------------------------------------------
2592
25930.09
2594
2595- MAJOR CHANGE: All the Alzabo::Runtime::Row methods that used to
2596  return lists of rows now return the new Alzabo::Runtime::RowCursor
2597  object.  This change is a major speed and memory optimization.  It
2598  does, however, break the old interface.  But its worth it.
2599
2600- Set autohandlers for schema maker and data browser so that they
2601  won't inherit from other autohandlers higher up the directory tree.
2602
2603- Fix bug in Alzabo::Driver which made it so that the one_row_hash
2604  method always returned a hash with keys.  This caused spurious row
2605  object to be created in the Alzabo::Runtime::Row class.
2606
2607- Fix bug in Alzabo::Table::rows_where method where it wasn't handling
2608  the construct $table->rows_where( where => { foo => undef } )
2609  properly.
2610
2611---------------------------------------------------------------------------
2612
26130.08
2614
2615- Lazy column evaluation had made it possible to create an
2616  Alzabo::Runtime::Row object that did not correspond to any data in
2617  the database if its table object did specify any rows to prefetch.
2618  This would have only been discovered later by calling the select
2619  method on a non-primary key column.  This hole was plugged.
2620
2621- As a corollary to the above change methods in Alzabo::Runtime::Table
2622  that produce rows now always return an empty list or undef when the
2623  rows cannot be made because the specified primary key doesn't exist.
2624  Previously, the rows_by_where_clause method did this while others
2625  would cause an exception either during the object creation or later,
2626  depending upon the situation described above.
2627
2628- GENERAL NOTE: I probably used exceptions too much, as in the above
2629  case.  I will probably be making a few more changes like this in the
2630  future.
2631
2632- Bug fix in Alzabo::RDBMSRules when making SQL diffs.  Forgot to
2633  account for new foreign key method names.
2634
2635- Bug fix related to MySQL auto_increment column and
2636  Alzabo::Runtime::Table insert method.  Basically, you couldn't
2637  insert into a table and use its auto_increment feature.
2638
2639- Alzabo::Table::set_prefetch now makes sure that primary key columns
2640  are not included.  It simply ignores them but they will not be
2641  returned by the prefetch method.
2642
2643- fix bug where some row retrieval methods would fail if not given a
2644  'bind' parameter.
2645
2646- Doc bug fix.  Docs for Alzabo::Runtime::Table listed group_by_column
2647  as simply group.  Of course, this probably only needs to be used by
2648  Alzabo::Runtime::Row anyway.
2649
2650- Added Alzabo::Runtime::Table rows_where method.
2651
2652- Added Alzabo::Runtime::Table all_rows method.
2653
2654- Documented 'bind' parameter for Alzabo::Runtime::Table
2655  rows_by_where_clause method.
2656
2657---------------------------------------------------------------------------
2658
26590.07
2660
2661- Fixed major bugs in Alzabo::Runtime::Table::insert method.
2662
2663- Fixed bug in Alzabo::Runtime::Row::delete method related to API
2664  change in 0.06
2665
2666- Reduce amount of work done in Alzabo::Runtime::Row when referential
2667  integrity maintenance is set to false.
2668
2669- Added new method to Alzabo::Runtime::Row: rows_by_foreign_key.  A
2670  row can now fetch the rows that are related to it automatically.
2671
2672- Made all Alzabo::Table foreign key object returning methods
2673  list/scalar context sensitive.  This is useful when you know that
2674  there is only one foreign key that matches what you are looking for.
2675
2676---------------------------------------------------------------------------
2677
26780.06
2679
2680- change return value from Alzabo::Index id method to be something
2681  that can be an actual index name.  This is a bug fix as previously
2682  index SQL was not valid (at least not for MySQL).
2683
2684- cosmetic fixes in schema creator
2685
2686- moved exception component to common mason files so its shared by
2687  schema creator and data browser.
2688
2689- added Index attribute of unique (so we can make unique indexes).
2690
2691- made SQL making code for MySQL aware of this.
2692
2693- added ability to set this to schema creator.
2694
2695- added ability to specify column order in an index in schema creator.
2696
2697- made it possible for a table to have more than one foreign from a
2698  given column.  documented how this changes API in Alzbo::Table.
2699
2700- API: The Alzabo::Table foreign_keys() method name has been changed
2701  to all_foreign_keys().  The foreign_key method (which returns keys
2702  by table to and column from) is now the foreign_keys() method
2703  because it can return more than one object.
2704
2705- change schema creator, Alzabo::Create::Schema module, and
2706  03/create.t test to handle this properly.
2707
2708- added ability to move columns and tables to arbitrary new locations
2709  after they've been created (without the arrows).
2710
2711---------------------------------------------------------------------------
2712
27130.05
2714
2715- bug fix for Alzabo::Runtime::Row calling wrong method from schema
2716  object
2717
2718- got rid of the locking stuff in the MySQL driver.  Since its not
2719  possible to have more than 1 lock at a time with the GET_LOCK
2720  function there's no way to have the right kinds of locks for
2721  cascading deletes.  It might be possible to do this kind of locking
2722  via some other mechanism (semaphores, DBM files, whatever, but
2723  that's a hack for another day.
2724
2725---------------------------------------------------------------------------
2726
27270.04
2728
2729- Switched to use Tie::IxHash object interface
2730
2731- fixed stupid bug in Alzabo::RDBMSRules::MySQL
2732
2733- changed the way Alzabo::ChangeTracker works.  it requires fewer
2734  method calls to do its job now.
2735
2736- added set_referential_integrity/referential_integrity methods to
2737  Alzabo::Runtime::Schema.  The default is to not attempt to maintain
2738  referential_integrity.
2739
2740- It should no longer be possible for Alzabo::Runtime::ForeignKey
2741  objects to create loops when maintaining referential integrity.  It
2742  also should be a bit more efficient in the register_delete method.
2743  If no action needs to be taken, it won't loop through all the rows
2744  in the related table before finding this out.
2745
2746- fixed data browser bug when putting in a filter on any page that was
2747  not the first page of results for a table.
2748
2749- fixed data browser bug in paging with filters.
2750
2751---------------------------------------------------------------------------
2752
27530.03
2754
2755- Fixed bugs in Alzabo::ObjectCacheIPC so it now works.
2756
2757- Added lazy column evaluation (see Alzabo::Runtime::Table) docs
2758
2759- Added Alzabo::DriverStatement and Alzabo::Driver::Exception to Alzabo::Driver
2760
2761- improved data browser memory efficiency
2762
2763- minor bug fixes (bad links) in data browser and schema maker
2764
2765- minor buglet fix in Alzabo::Driver::MySQL
2766
2767- big fix to how Alzabo::Runtime::Schema is saved from
2768  Alzabo::Create::Schema.  Previous implementation was accidentally
2769  saving both the runtime and create versions at once.  The new
2770  version fixes this.
2771