2005-04-25 Darren Duncan * SQL-Routine Release 0.60. * New code file versions are: Routine.pm v0.60 and en.pm v0.29. * The primary purpose of this release is the removal of the long-standing feature where a SQL::Routine Node is valid to exist either on its own or inside a Container; these 2 states of a Node were referred to as "alone" and "well known" respectively; as of this release, there is only a single valid state, which corresponds to the old "well known". One result of this change is that the SQL::Routine code can be greatly simplified, and it probably executes faster too. Note that this constitutes an API change, but the only external code that would be affected is that which directly invokes these low-level functions and methods: new_node(), Node.new(), clear_node_id(), put_in_container(), take_from_container(), build_lonely_node(). Any code not invoking these, such as because they use the other high-level build*() functions instead (including all of the SYNOPSIS code), will not break. * All changes in this release are restricted to just the following 3 files unless otherwise explicitly mentioned: Routine.pm and Details.pod and en.pm. * Reversed the change in release 0.59 that removed the Node.delete_node() method; its concept is useful after all. * It is now the case that every Node's "container" and "node id" properties are always set and never empty, from the moment the Node object is created and up to its destruction. Any branch conditionals that tested those properties for definedness were reduced to just the result of the 'yes' branch; this includes the removal of many throwable exceptions. * In Details.pod, deleted the entire NODE EVOLUTION STATES main documentation section, since there is no longer a multiplicity of Node states as it describes. Many other small bits of POD documentation and code comments were updated to remove any references to 'alone' or 'well known'; any documentation that described an either/or scenario pair was reduced to one always-true scenario. * Changed the declaration order of a Node's "container" property so it appears just above "node type"; also moved the method get_container() upwards to just above get_node_type(). * Merged the method put_in_container(), plus a copy of set_node_id(), into Node.new(); the post-merge new() now creates a Node that lives in a Container and has a set Node Id; it does not create links with any other Nodes, but only the pseudo-Node parent; it now takes 3 arguments: a Container, a Node Type, and a Node Id. The merged method has 7 associated user text messages in en.pm, down from the 9 its 2 main constituents had. Updated the new_node() wrapper function to match the new 3 arg signature. * Merged the method take_from_container() into delete_node(); the post-merge delete_node() unlinks the invocant Node from everything else and then gets it garbage collected. The merged method has 1 user text message in en.pm, down from the 2 its constituents had. Updated the method Container.build_child_node() to invoke it rather than take_from_container(). * Deleted method clear_node_id(), along with its single en.pm message. Also removed its invocation from clear_attributes(), and updated the invocations in clear_surrogate_id_attribute() and clear_attribute() to throw an exception where they had used to invoke it; also added 2 new '*_MAND_NID' en.pm messages to go with those last 2 methods. * Updated _normalize_primary_parent_or_node_ref_attribute_value() and en.pm to remove 2 assertions and 4 associated exception messages that will no longer be triggered, SRT_N_SET_[PP|NREF]_AT_[ONE_CONT|MISS_NID]. * Updated these 4 methods so that they always run their payload rather than only doing so if the nref-attr value (that was or to be) is an object reference: _[clear|set]_[primary_parent|node_ref]_attribute(). * Removed function build_lonely_node(). Then merged private function _build_node_normalize_attrs() into its only remaining invoker, private method _build_node_is_child_or_not(). * Updated private method _assert_in_node_deferrable_constraints() so that it no longer tests for the Node Id being defined; that is now redundant. Also, a related piece of documentation in NodeTypes.pod was updated, to say that the 'id' attribute now has a constantly applied mandatory constraint. * Fixed a bug in _build_node_is_child_or_not() where it only trapped SRT_N_ASDC_CH_N_TOO_FEW_SET exceptions and not the similar SRT_N_ASDC_CH_N_TOO_FEW_SET_PSN exceptions. * Fixed a bug in _assert_child_comp_deferrable_constraints() where the SRT_N_ASDC_CH_N_TOO_FEW_SET_PSN exception was missing a variable value. * Updated _build_node_is_child_or_not() so that it always sets the new Node's surrogate id attribute prior to any other non-id/pp attribute; this ensures that if any other attribute settings fail, the error messages are more user friendly. * Updated the following 7 methods to not assert their invocant Node is in a Container, and removed their corresponding '*_NOT_IN_CONT' en.pm messages: move_before_sibling(), get_surrogate_id_chain(), find[|_child]_node_by_surrogate_id(), get_relative_surrogate_id(), build[|_child]_node(). Also updated all 15 Node methods that conditionally (based on the Container's presence) set the 'deferrable constraints tested' property to false so they don't test. * Merged _get_surrogate_id_chain() into get_surrogate_id_chain(). * Merged each _get_all_properties() into its partner get_all_properties(). * Updated the UNDERSTANDING NODE ATTRIBUTE ... section of NodeTypes.pod to remove references to Node states and to say that the mandatory constraint Node Ids is now constantly enforced rather than being deferrable. * In Routine.pm, deleted the second CAVEATS paragraph, concerning Nodes that outlive their host Container; deleted a similar section in the TODO file. * Updated the sqlrt_dt_node struct definition in API_C.pod so that the 'pp_nref' and 'at_nrefs' members are plain refs/pointers and not unions of pointers and unsigned integers. This corresponds to the Routine.pm changes. * Small test suite update: Updated the 2 make_a_[|child_]node small utility functions in t_SRT_Verbose.pm; folded the set_node_id() and put_in_container() invocations into the new_node() invocation. No changes in SQL_Routine.t besides the usual upping of the 'used' module versions. * These core files had exactly zero changes: EnumTypes.pod, Language.pod, t_SRT_Terse.pm, t_SRT_Abstract.pm. * Following all of the above changes, the disk space for all 7 core /lib/SQL files in release 0.60 is 430K, which is 16K (or 4%) less than the 446K used by the same files in release 0.59. Specifically with the executable function+method code (including spaces and dividers and f+m code comments) in Routine.pm, 0.60 is 82K, which is 7K (or 9%) less than the 89K for 0.59; by line count, 0.60 is 2092 f+m code lines, which is 162 (or 7%) lines less than the 2254 lines of 0.59. * For speed comparisions between 0.60 and 0.59, based on 100 iterations of most of the test suite; as we can see, 0.60 performs a bit faster by up to 15% or so: Version 0.60: Benchmark: timing 100 iterations of A_AssDefCon, A_ConvertToXML_NID, A_ConvertToXML_SID, A_MakeAndBreak, T_AssDefCon, T_ConvertToXML_NID, T_ConvertToXML_SID, T_MakeAndBreak, V_AssDefCon, V_ConvertToXML_NID, V_ConvertToXML_SID, V_MakeAndBreak... A_AssDefCon: 13 wallclock secs (12.72 usr + 0.00 sys = 12.72 CPU) @ 7.86/s (n=100) A_ConvertToXML_NID: 2 wallclock secs ( 2.38 usr + 0.02 sys = 2.40 CPU) @ 41.67/s (n=100) A_ConvertToXML_SID: 6 wallclock secs ( 6.20 usr + 0.04 sys = 6.24 CPU) @ 16.03/s (n=100) A_MakeAndBreak: 14 wallclock secs (13.35 usr + 0.01 sys = 13.36 CPU) @ 7.49/s (n=100) T_AssDefCon: 12 wallclock secs (12.81 usr + 0.01 sys = 12.82 CPU) @ 7.80/s (n=100) T_ConvertToXML_NID: 2 wallclock secs ( 2.51 usr + 0.02 sys = 2.53 CPU) @ 39.53/s (n=100) T_ConvertToXML_SID: 7 wallclock secs ( 6.41 usr + 0.03 sys = 6.44 CPU) @ 15.53/s (n=100) T_MakeAndBreak: 7 wallclock secs ( 7.88 usr + 0.00 sys = 7.88 CPU) @ 12.69/s (n=100) V_AssDefCon: 6 wallclock secs ( 5.66 usr + 0.01 sys = 5.67 CPU) @ 17.64/s (n=100) V_ConvertToXML_NID: 1 wallclock secs ( 1.33 usr + 0.00 sys = 1.33 CPU) @ 75.19/s (n=100) V_ConvertToXML_SID: 3 wallclock secs ( 2.97 usr + 0.00 sys = 2.97 CPU) @ 33.67/s (n=100) V_MakeAndBreak: 3 wallclock secs ( 2.95 usr + 0.00 sys = 2.95 CPU) @ 33.90/s (n=100) Version 0.59 Benchmark: timing 100 iterations of A_AssDefCon, A_ConvertToXML_NID, A_ConvertToXML_SID, A_MakeAndBreak, T_AssDefCon, T_ConvertToXML_NID, T_ConvertToXML_SID, T_MakeAndBreak, V_AssDefCon, V_ConvertToXML_NID, V_ConvertToXML_SID, V_MakeAndBreak... A_AssDefCon: 12 wallclock secs (12.81 usr + 0.00 sys = 12.81 CPU) @ 7.81/s (n=100) A_ConvertToXML_NID: 2 wallclock secs ( 2.38 usr + 0.01 sys = 2.39 CPU) @ 41.84/s (n=100) A_ConvertToXML_SID: 6 wallclock secs ( 6.31 usr + 0.02 sys = 6.33 CPU) @ 15.80/s (n=100) A_MakeAndBreak: 15 wallclock secs (14.66 usr + 0.00 sys = 14.66 CPU) @ 6.82/s (n=100) T_AssDefCon: 13 wallclock secs (13.03 usr + 0.00 sys = 13.03 CPU) @ 7.67/s (n=100) T_ConvertToXML_NID: 3 wallclock secs ( 2.54 usr + 0.01 sys = 2.55 CPU) @ 39.22/s (n=100) T_ConvertToXML_SID: 6 wallclock secs ( 6.45 usr + 0.03 sys = 6.48 CPU) @ 15.43/s (n=100) T_MakeAndBreak: 9 wallclock secs ( 9.01 usr + 0.00 sys = 9.01 CPU) @ 11.10/s (n=100) V_AssDefCon: 6 wallclock secs ( 5.70 usr + 0.00 sys = 5.70 CPU) @ 17.54/s (n=100) V_ConvertToXML_NID: 1 wallclock secs ( 1.28 usr + 0.01 sys = 1.29 CPU) @ 77.52/s (n=100) V_ConvertToXML_SID: 3 wallclock secs ( 3.02 usr + 0.00 sys = 3.02 CPU) @ 33.11/s (n=100) V_MakeAndBreak: 4 wallclock secs ( 3.53 usr + 0.01 sys = 3.54 CPU) @ 28.25/s (n=100) The RAM usage was roughly the same for both, or slightly less for 0.60. 2005-04-20 Darren Duncan * SQL-Routine Release 0.59. * New code file versions are: Routine.pm v0.59 and en.pm v0.28. * Added new external dependency on Scalar::Util v1.11 (bundled with Perl 5.8.x); SQL::Routine now uses its 'weak refs' feature internally at strategic places so that you no longer need to explicitly destroy Containers when you are done with them. The circular references between SRT Nodes and their Container no longer prevent Perl's standard garbage collection from working when expected, which is when all external references to a Container go away. This change makes SQL::Routine much more DWIM and easier to use. * Updated Routine.pm and Details.pod: Removed the Container.destroy() method. Removed the CAVEATS documentation concerning it. Updated SQL_Routine.t to remove all destroy() invocations, which also reduced the test count by 6 to 35. Removed the corresponding TODO file item. * Updated Routine.pm: Updated the definitions of 3 Node properties to indicate that they now store weak Perl refs rather than strong ones: 'pp_nref', 'at_nrefs', 'container'. Those 3 properties are all 'upwards' or 'parent pointing' references; each has one or more corresponding 'child pointing' properties which remain strong refs. As such, every conceptual circular reference now has one strong and one weak member. A total of 5 Scalar::Util::weaken() invocations are now used (up from zero): 1 is in Node._set_primary_parent_attribute(); 1 is in Node._set_literal_attribute(); 3 are in Node.put_in_container(), one per property. * Updated Routine.pm and Details.pod and en.pm: Removed the Node.delete_node() method, which was a no-op routine and never invoked; a SRT Node has always been garbage collected by Perl as is normal. This method had existed as a place-holder for an eventual C implementation that actually did something, but since a C version is very far away, if it ever comes, this has been removed meanwhile. Also removed the corresponding en.pm user text message 'SRT_N_DEL_NODE_IN_CONT'. * Updated both CREDITS copies regarding Stevan Little's contribution, to add that he introduced me to Scalar::Util::weaken() last month. * Added new CAVEATS item and TODO file item concerning external refs to Nodes whose host Container was garbage collected. * Renamed this file to 'Changes' from 'ChangeLog'; the new name is more descriptive to its free-form structure, and more consistent with CPAN (which uses both names but 'Changes' seems to be more common these days). Also truncated this Changes file to remove all detail entries for releases v0.28 thru v0.58; in their place was added a change summary for releases v0.01 thru v0.58 that mainly just said what the names and versions of all the predecessor distributions and modules are. 2005-04-03 Darren Duncan * SQL-Routine Release 0.58, containing SQL::Routine 0.58, was released on CPAN. 2005-03-06 Darren Duncan Record update in the PAUSE modules database: statd: [a] was [c] The resulting entry will be: SQL:: ::Routine adpOg Specify all database tasks with SQL routines DUNCAND 2004-11-05 Darren Duncan * SQL-Routine Release 0.48, containing SQL::Routine 0.48, was released on CPAN. This is the first release of SQL::Routine following its merger with SQL::Routine::SkipID. 2004-11-02 Darren Duncan * SQL-Routine-Castaways Release 0.33, containing SQL::Routine::SkipID 0.33, was released on CPAN; this is the last release of the SQL-Routine-Castaways distribution. This is the last release of SQL::Routine::SkipID prior to its merger with SQL::Routine. 2004-11-01 Darren Duncan * SQL-Routine Release 0.47, containing SQL::Routine 0.47, was released on CPAN. This is the last release of SQL::Routine prior to its merger with SQL::Routine::SkipID. This is the first release of SQL::Routine following its merger with SQL::Routine::ByTree. 2004-10-29 Darren Duncan * SQL-Routine Release 0.46, containing SQL::Routine 0.46, was released on CPAN. This is the last release of SQL::Routine prior to its merger with SQL::Routine::ByTree. 2004-10-04 Darren Duncan * SQL-Routine Release 0.43, containing SQL::Routine 0.43, was released on CPAN; this is the first release of the SQL-Routine distribution. This is the first release of any distribution to contain SQL::Routine, which was renamed from SQL::SyntaxModel. This is the first release of this module following its official registration on the Perl 5 Module List. * SQL-Routine-Castaways Release 0.31, containing SQL::Routine::ByTree 0.31 and SQL::Routine::SkipID 0.31, was released on CPAN; this is the first release of the SQL-Routine-Castaways distribution. This is the last release of SQL::Routine::ByTree prior to its merger with SQL::Routine. This is the first release of any distribution to contain SQL::Routine::ByTree or SQL::Routine::SkipID; they were renamed from SQL::SyntaxModel::ByTree and SQL::SyntaxModel::SkipID respectively. 2004-10-04 Darren Duncan The next version of the Module List will list the following module: modid: SQL::Routine DSLIP: cdpOg description: Specify all database tasks with SQL routines userid: DUNCAND (Darren Duncan) chapterid: 11 (String_Lang_Text_Proc) enteredby: BDFOY (brian d foy) enteredon: Mon Oct 4 20:04:46 2004 GMT The resulting entry will be: SQL:: ::Routine cdpOg Specify all database tasks with SQL routines DUNCAND 2004-09-13 Darren Duncan * SQL-SyntaxModel Release 0.42, containing SQL::SyntaxModel 0.42, was released on CPAN; this is the last release of the SQL-SyntaxModel distribution. This is the last release of any distribution to contain SQL::SyntaxModel. This is the last release of this module prior to its official registration on the Perl 5 Module List. 2004-09-01 Darren Duncan * SQL-SyntaxModel-ByTree Release 0.30, containing SQL::SyntaxModel::ByTree 0.30, was released on CPAN; this is the last release of the SQL-SyntaxModel-ByTree distribution. This is the last release of any distribution to contain SQL::SyntaxModel::ByTree. This is the first release for this distribution and module where they both explicitly have matching version numbers. * SQL-SyntaxModel-SkipID Release 0.30, containing SQL::SyntaxModel::SkipID 0.30, was released on CPAN; this is the last release of the SQL-SyntaxModel-SkipID distribution. This is the last release of any distribution to contain SQL::SyntaxModel::SkipID. This is the first release for this distribution and module where they both explicitly have matching version numbers. 2004-08-16 Darren Duncan * SQL-SyntaxModel Release 0.38, containing SQL::SyntaxModel 0.38, was released on CPAN. This is the first release for this distribution and module where they both explicitly have matching version numbers. 2004-08-06 Darren Duncan * SQL-SyntaxModel Release 0.37, containing SQL::SyntaxModel 0.24, was released on CPAN. This is the last release for this distribution and module where they both do not explicitly have matching version numbers. 2004-06-29 Darren Duncan * SQL-SyntaxModel-ByTree Release 0.29, containing SQL::SyntaxModel::ByTree 0.14, was released on CPAN. This is the last release for this distribution and module where they both do not explicitly have matching version numbers. * SQL-SyntaxModel-SkipID Release 0.29, containing SQL::SyntaxModel::SkipID 0.14, was released on CPAN. This is the last release for this distribution and module where they both do not explicitly have matching version numbers. 2004-03-22 Darren Duncan * SQL-SyntaxModel Release 0.28, containing SQL::SyntaxModel 0.15, was released on CPAN; this is the first release of the SQL-SyntaxModel distribution. * SQL-SyntaxModel-ByTree Release 0.28, containing SQL::SyntaxModel::ByTree 0.13, was released on CPAN; this is the first release of the SQL-SyntaxModel-ByTree distribution. * SQL-SyntaxModel-SkipID Release 0.28, containing SQL::SyntaxModel::SkipID 0.13, was released on CPAN; this is the first release of the SQL-SyntaxModel-SkipID distribution. 2004-03-21 Darren Duncan * Rosetta Release 0.27, containing SQL::SyntaxModel 0.14 and SQL::SyntaxModel::ByTree 0.12 and SQL::SyntaxModel::SkipID 0.12, was released on CPAN. This is the last release of the Rosetta distribution to contain any version of those 3 modules. 2003-12-21 Darren Duncan * Rosetta Release 0.20, containing SQL::SyntaxModel 0.08 and SQL::SyntaxModel::ByTree 0.08 and SQL::SyntaxModel::SkipID 0.08, was released on CPAN. This is the first release of any distribution to contain SQL::SyntaxModel::ByTree, which was split off from SQL::SyntaxModel; this is the first release of SQL::SyntaxModel following that split. 2003-12-18 Darren Duncan * Rosetta Release 0.19, containing SQL::SyntaxModel 0.07 and SQL::SyntaxModel::SkipID 0.07, was released on CPAN. This is the last release of SQL::SyntaxModel prior to its split into itself and SQL::SyntaxModel::ByTree. 2003-09-26 Darren Duncan * Rosetta Release 0.18, containing SQL::SyntaxModel 0.06 and SQL::SyntaxModel::SkipID 0.06, was released on CPAN. This is the first release of any distribution to contain either SQL::SyntaxModel or SQL::SyntaxModel::SkipID, which are the results of splitting up the renamed SQL::ObjectModel. 2003-09-16 Darren Duncan * Rosetta Release 0.17, containing SQL::ObjectModel 0.05, was released on CPAN. This is the last release of any distribution to contain SQL::ObjectModel; its subsequent release has it renamed and split in two. 2003-06-11 Darren Duncan * Rosetta Release 0.13, containing SQL::ObjectModel 0.01, was released on CPAN. This is the first release of any distribution to contain SQL::ObjectModel; it is the result of merging 3 pre-existing and renamed modules, Rosetta::Schema::DataType and Rosetta::Schema::Table and Rosetta::Schema::View. 2003-06-10 Darren Duncan * Rosetta Release 0.12, containing Rosetta::Schema::DataType 0.021 and Rosetta::Schema::Table 0.011 and Rosetta::Schema::View 0.012, was released on CPAN. This is the last release of those 3 modules prior to their three-way merger into SQL::ObjectModel. 2003-03-08 Darren Duncan * Rosetta Release 0.06, containing Rosetta::Schema::DataType 0.02 and Rosetta::Schema::Table 0.01 and Rosetta::Schema::View 0.01, was released on CPAN. This is the first release of any distribution to contain either Rosetta::Schema::Table or Rosetta::Schema::View. 2003-03-04 Darren Duncan * Rosetta Release 0.05, containing Rosetta::Schema::DataType 0.01, was released on CPAN. This is the first release of any distribution to contain Rosetta::Schema::DataType. This is the first release of any distribution for which some of the existing work that became the SQL-Routine distribution was in the form of executable code, and not just design documentation. 2003-02-10 Darren Duncan * Rosetta Release 0.04 was released on CPAN. This is the last release of any distribution for which all of the existing work that became the SQL-Routine distribution was purely in the form of design documentation, without executable code of any kind. 2003-01-27 Darren Duncan * Rosetta Release 0.02 was released on CPAN; this is the first release of the Rosetta distribution. Early versions of the design documentation that became the SQL-Routine distribution were included. 2003-01-05 Darren Duncan * DBIx-Portable Release 0.01 was released on CPAN; this is the only release of the DBIx-Portable distribution. This is the first release of any distribution to contain design documentation that became the SQL-Routine distribution. 2002-11-12 Darren Duncan * Began development on the modules which became the SQL-Routine distribution as their own entity that is separate from my application, for open-source distribution on CPAN. The modules were to comprise an RDBMS-generic DB framework for any application to use. * Modules based on a template created by h2xs 1.18. 2002-07-28 * Posted the first significant update to the second prototype, which added an index or cache for data that was expensive to calculate for each page request, and involved rewriting about a fourth of the perl code. 2002-06-07 * Posted to my website the second public prototype demo of the new self-proprietary database driven application, whose database schema, user interface, feature set, and Perl application code was almost completely rewritten. The new version explicitly had separate modules for database communication and the web interface logic, with MySQL-specific code and database generic or data dictionary code in separate files, and separate files for parts of the web interface. The program used the same generic CPAN modules as in the first prototype, DBI/MySQL and CGI::Portable. 2001-11-24 * Posted the last update to the first prototype. 2001-07-12 * Posted to my website the first public prototype demo of a new self-proprietary database driven application, which is like a cross between a multimedia metadata catalogue and a repository for historical or genealogical data. This application contained the first prototypes of code that ended up in these modules. All of this application's code, for database communication and web interface logic, was situated in a single module, with the rest of the program being more generic CPAN modules like DBI (and DBD for MySQL) and CGI::Portable. 2000-05-17 * Requested MySQL database privileges on my web host so I have something to start developing, testing and deploying database driven applications on.