The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#########################################
# CHANGE LOG
#########################################

0.966
 x App::Repository::mk_select_joined_sql(): enable param substitutions in dbexpr's
 x App::Repository::get_rows()/get_row(): use query caching if turned on for the table ({cache_name} => "name_of_shared_datastore")
 x App::Repository::create_temporary_object_set(): can create a temporary object set with data, not bound to the database
 x App::Repository::create_temporary_object_domain(): can create a temporary object domain with data, not bound to the database
 x App::Repository::evaluate_expression(): can now supply defaults for null columns
 x App::Repository::evaluate_expression(): added column defaults
 x App::Repository::evaluate_expression(): fixed to be more efficient and to handle defaults on columns which are expressions themselves
 x App::Repository::evaluate_expression(): fixed a bug when evaluating expressions of columns that end in digits
 x App::Repository::evaluate_expression(): fixed a bug where using a hashref instead of arrayref
 x App::Repository::evaluate_constant_expression(): can also do simple functions (abs(x), min(x,y), max(x,y), if(x,y,z), ifnull(x,y), case(x,y,a,z,b,c))
 x App::Repository::evaluate_constant_expression(): can also do boolean operators (=, !=, <, <=, >, >=)
 x App::Repository::evaluate_constant_expression(): fix for div 0 and sci notation
 x App::Repository::summarize_rows(): can now summarize columns which have alternate aggregate levels
 x App::Repository::summarize_rows(): produce an undef if all values that are summed are undef
 x App::Repository::last_inserted_id($table): new method (without underscore) now takes $table param, works on redirects
 x App::Repository - changed begin_work(), commit(), rollback() to consult an {in_transaction} attribute
   This does something sensible if begin_work() is called within a transaction or a commit()/rollback() is outside a transaction
 x App::Repository - get_table_def(): enable the 'table_def' option in get_rows() to override or supplement table_def entries already in the config
 x App::Repository::* - change debug_sql and all other debug-style output to obey the debug_file option
 x App::Repository::DBI - get_phys_column_names(): new method
 x App::Repository::ValueDomain - use App::Repository::DBI::_do instead of DBI methods
 x App::Repository::_insert_row(): handle update on duplicate
 x App::Repository::* - improved logging of database errors when they occur (includes the SQL statement that failed)

0.965
 x can now configure multiple databases (App::Repository::DBI) from app.conf (xyz.dbhost, xyz.dbname, ... for rep "xyz")
 x full redirection to other tables or other tables in other repositories is done
 x added dbsocket as a parameter which App::Repository::DBI automatically picks up from app.conf
 x added dbioptions to the list of things App::Repository::MySQL takes into account in building its dsn
 x use $dbh->quote() to quote values instead of doing it half-way correctly
 x add App::Repository::summarize_rows() (with extended summaries, ros->get_summary(), ros->get_ext_summary())
 x add bin/dbget --totals and --subtotal_columns options
 x fix App::RepositoryObjectSet->set_params() to not clear cache if %$params are identical
 x fix App::RepositoryObjectDomain->get_object_set() to call $object_set->set_params() 
   instead of update_params() if a %$params subset has not been explicitly defined.
 x added an implementation of insert_rows() for App::Repository::MySQL which uses multiple-row inserts
 x worked on import_rows() to use insert_rows() if ($options->{import_method} eq "insert")
 x enhance summarize_rows() to do extended summaries (count, distinct, min, max, average, mode, median, stddev)
 x add call_procedure() method
 x finalized transaction support with begin_work(), commit(), rollback() (added t/DBI-transaction.t test case)

0.964
 x add bin/dbget
 x add default params and params that don't relate to column names
 x fix index hints.
 x clean up MySQL explain
 x change author email to spadkins@gmail.com

0.963
 x add support for qualified classes on a single table (i.e. get_object("person",...)
   may return an App::RepositoryObject::Man or an App::RepositoryObject::Woman depending
   on the value in the "gender" field)
 x add not_in, not_contains, and not_matches operators
 x add better implied operations to value-side of params (=, !, !=, >, >=, <=, ~, =~)
 x _shutdown_unshareable_resources()
 x substitute() on joincriteria
 x added automatic timings on all debug_sql
 x added explain_sql
 x added support for dbsocket option in App::Repository::MySQL

0.962
 ???

0.96
 x test suites are driven by app.conf (App::Options) (dbdriver/dbhost/dbname/dbuser/dbpass)
   (and they succeed trivially when no app.conf is set up)
 x App::Repository::DBI - change the meaning of param.eq, .eq means =, not infer IN
 x App::Repository::DBI - return 0 rather than 0E0 from update()
 x App::SessionObject::RepositoryObjectSet - add max_age feature to serve as default if not provided in get_objects({max_age => 0})
 x App::Repository::DBI - dbexpr_update option sprintf()s using more than one $value (5 actually) for 'if(%s=5,%s,3)' expressions
 x App::Repository::DBI - add support for literal aggregation functions
 x App::Repository::DBI - rename summarykeys to group_by
 x App::Repository::DBI - enhanced debug_sql output on _do()
 x App::Repository::DBI - protect against undef params
 x App::Repository::DBI - retry when _connect() gets a Lost connection
 x App::Repository::DBI - _get_default_columns() use configured columns for get_hashes() etc. when no columns specified
 x App::Repository::DBI - table-level hints now work (main table only) (MySQL-compatible)
 x App::Repository/::DBI - _get_default_columns($table) returns {default_columns}, {phys_columns}, or {columns}
 x App::ValueDomain::RepositoryTables - a list of tables from a repository
 x App::ValueDomain::RepositoryTableColumns - a list of column from a table in a repository
 x App::ValueDomain::Repository - added EACH as a special kind of {extra_values}
 x App::ValueDomain::Repository - added {extra_values} and {extra_labels} attribs
 x App::Repository - (logical to physical) table redirection
 x App::Repository::evaluate_expressions() - can now evaluate expressions for column definitions
 x App::Repository::sort() - can now sort arrays of hashrefs as well as arrays of arrayrefs
 x App::Repository::DBI - add _do($sql) method - same as $db->{dbh}->do($sql) with added debugging features
   The "_" reminds you this is not really a portable method in the spirit of the App::Repository abstraction.
   It is provided so that you won't be tempted to use the work-around described above.
   Any need to use this method is an indication that the API still needs work. Please send feedback to me.
   NOTE: _do() works for select as well as insert/update/delete statements, returning the array of rows
 x App::ValueDomain::Repository - add extra_values, extra_labels, and order_by
 x App::SessionObject::RepositoryObjectSet - enable relevant "columns" to be configured (limits them)
 x App::SessionObject::RepositoryObjectDomain - can configure mappings of domain params to individual object set params
 x $rep->new_object() calls class-specific (RepositoryObject) _init() method to set up object values
 x $rep->new_object() now adds configured "default" values
 x $rep->new_object() now throws an exception for NULL values in "not_null" and alternate key columns
 x $rep->new_object() has option { temp => 1 } that doesn't create the RepositoryObject in the repository

0.95
 x add "config_from_options" as a default behavior for App::Repository::DBI
 x add $rep->new_object($table, {@initializers}); (and tests)
 x add $repobj->delete(); (and tests)
 x add $rep->import_rows(...)  (import from file) (handles CSV by default)
 x add $rep->export_rows(...)  (export to file)   (handles CSV by default)

0.94
 x add "distinct => 1" to options hash for get_rows()/get_row()
 x recognize the following special cases in inferred-op params: '' (same as as 'ALL' in non-quoted/numeric params)
 x recognize the following special cases in inferred-op params: 'ALL','NULL','NULL,value','@[db expr]'
 x support set() with hash values. i.e. set($table,\@cols,\%values)
 x fix set_rows() to work (also with create option)
 x support compressed columns (through dbexpr/dbexpr_update)
 x changed test scripts to be driven by App::Options

0.93
 x MySQL - auto_reconnect flag set
 x DBI   - Reconnect on disconnect in _get_rows()/_get_row() (MySQL-specific?)
 x MySQL - load primary key, alternate keys, indexes
 x all   - Multiple (delegated) repositories

0.90 First functional/supportable release