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