[Bast-commits] r6514 - in DBIx-Class/0.08/branches/sybase_noquote: . examples/Schema examples/Schema/MyDatabase examples/Schema/MyDatabase/Main/Result examples/Schema/db lib/DBIx lib/DBIx/Class lib/DBIx/Class/CDBICompat lib/DBIx/Class/ClassResolver lib/DBIx/Class/InflateColumn lib/DBIx/Class/Manual lib/DBIx/Class/PK lib/DBIx/Class/PK/Auto lib/DBIx/Class/Relationship lib/DBIx/Class/ResultClass lib/DBIx/Class/ResultSource lib/DBIx/Class/ResultSourceProxy lib/DBIx/Class/SQLAHacks lib/DBIx/Class/Schema lib/DBIx/Class/Serialize lib/DBIx/Class/Storage lib/DBIx/Class/Storage/DBI lib/DBIx/Class/Storage/DBI/ODBC lib/DBIx/Class/Storage/DBI/Oracle lib/DBIx/Class/Storage/DBI/Replicated lib/DBIx/Class/Storage/DBI/Replicated/Balancer lib/DBIx/Class/Storage/DBI/Role lib/DBIx/Class/Storage/DBI/Sybase lib/SQL/Translator/Parser/DBIx lib/SQL/Translator/Producer/DBIx/Class maint script t t/96multi_create t/bind t/cdbi t/cdbi/DeepAbstractSearch t/cdbi/abstract t/cdbi/sweet t/cdbi/testlib t/cdbi/testlib/DBIC t/cdbi/testlib/DBIC/Test t/count t/delete t/lib t/lib/DBIC t/lib/DBICNSTest t/lib/DBICNSTest/Bogus t/lib/DBICNSTest/OtherRslt t/lib/DBICNSTest/RSet t/lib/DBICNSTest/Result t/lib/DBICNSTest/ResultSet t/lib/DBICNSTest/Rslt t/lib/DBICNSTest/RtBug41083 t/lib/DBICNSTest/RtBug41083/ResultSet t/lib/DBICNSTest/RtBug41083/ResultSet_A t/lib/DBICNSTest/RtBug41083/Schema t/lib/DBICNSTest/RtBug41083/Schema/Foo t/lib/DBICNSTest/RtBug41083/Schema_A t/lib/DBICNSTest/RtBug41083/Schema_A/A t/lib/DBICTest t/lib/DBICTest/ForeignComponent t/lib/DBICTest/Plain t/lib/DBICTest/ResultSetManager t/lib/DBICTest/Schema t/lib/DBICTest/Taint/Classes t/lib/DBICTest/Taint/Namespaces/Result t/ordered t/prefetch t/relationship t/resultset t/search

caelum at dev.catalyst.perl.org caelum at dev.catalyst.perl.org
Fri Jun 5 00:05:21 GMT 2009


Author: caelum
Date: 2009-06-05 00:05:19 +0000 (Fri, 05 Jun 2009)
New Revision: 6514

Added:
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/SQLAHacks.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/SQLAHacks/
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/SQLAHacks/OracleJoins.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MultiColumnIn.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Types.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_exception.t
   DBIx-Class/0.08/branches/sybase_noquote/t/63register_source.t
   DBIx-Class/0.08/branches/sybase_noquote/t/746sybase.t
   DBIx-Class/0.08/branches/sybase_noquote/t/bind/
   DBIx-Class/0.08/branches/sybase_noquote/t/bind/attribute.t
   DBIx-Class/0.08/branches/sybase_noquote/t/bind/bindtype_columns.t
   DBIx-Class/0.08/branches/sybase_noquote/t/bind/order_by.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/DBIC/
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/DBIC/Test/
   DBIx-Class/0.08/branches/sybase_noquote/t/count/
   DBIx-Class/0.08/branches/sybase_noquote/t/count/distinct.t
   DBIx-Class/0.08/branches/sybase_noquote/t/count/grouped_pager.t
   DBIx-Class/0.08/branches/sybase_noquote/t/count/in_subquery.t
   DBIx-Class/0.08/branches/sybase_noquote/t/count/joined.t
   DBIx-Class/0.08/branches/sybase_noquote/t/count/prefetch.t
   DBIx-Class/0.08/branches/sybase_noquote/t/delete/
   DBIx-Class/0.08/branches/sybase_noquote/t/delete/m2m.t
   DBIx-Class/0.08/branches/sybase_noquote/t/delete/related.t
   DBIx-Class/0.08/branches/sybase_noquote/t/from_subquery.t
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Bogus/
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Bogus/Bigos.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/AuthorCheck.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/BaseResult.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/BaseResultSet.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZDeprecated.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZPg.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/
   DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/attrs_untouched.t
   DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/diamond.t
   DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/multiple_hasmany.t
   DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/pollute_already_joined.t
   DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/rows_bug.t
   DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/standard.t
   DBIx-Class/0.08/branches/sybase_noquote/t/relationship/
   DBIx-Class/0.08/branches/sybase_noquote/t/relationship/after_update.t
   DBIx-Class/0.08/branches/sybase_noquote/t/relationship/core.t
   DBIx-Class/0.08/branches/sybase_noquote/t/relationship/doesnt_exist.t
   DBIx-Class/0.08/branches/sybase_noquote/t/resultset/update_delete.t
   DBIx-Class/0.08/branches/sybase_noquote/t/zzzzzzz_perl_perf_bug.t
Removed:
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MultiDistinctEmulation.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Test/
   DBIx-Class/0.08/branches/sybase_noquote/t/47bind_attribute.t
   DBIx-Class/0.08/branches/sybase_noquote/t/53delete_chained.t
   DBIx-Class/0.08/branches/sybase_noquote/t/53delete_related.t
   DBIx-Class/0.08/branches/sybase_noquote/t/66relationship.t
   DBIx-Class/0.08/branches/sybase_noquote/t/77prefetch.t
   DBIx-Class/0.08/branches/sybase_noquote/t/98rows_prefetch.t
   DBIx-Class/0.08/branches/sybase_noquote/t/99rh_perl_perf_bug.t
   DBIx-Class/0.08/branches/sybase_noquote/t/bindtype_columns.t
   DBIx-Class/0.08/branches/sybase_noquote/t/deleting_many_to_many.t
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNGTest/
   DBIx-Class/0.08/branches/sybase_noquote/t/relationship_after_update.t
   DBIx-Class/0.08/branches/sybase_noquote/t/relationship_doesnt_exist.t
Modified:
   DBIx-Class/0.08/branches/sybase_noquote/
   DBIx-Class/0.08/branches/sybase_noquote/Changes
   DBIx-Class/0.08/branches/sybase_noquote/Features_09
   DBIx-Class/0.08/branches/sybase_noquote/MANIFEST.SKIP
   DBIx-Class/0.08/branches/sybase_noquote/Makefile.PL
   DBIx-Class/0.08/branches/sybase_noquote/TODO
   DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/MyDatabase/Main.pm
   DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/MyDatabase/Main/Result/Artist.pm
   DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/MyDatabase/Main/Result/Cd.pm
   DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/MyDatabase/Main/Result/Track.pm
   DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/db/example.sql
   DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/insertdb.pl
   DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/testdb.pl
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/AccessorGroup.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/AbstractSearch.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/AccessorMapping.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/AttributeAPI.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/AutoUpdate.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnCase.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnGroups.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnsAsHash.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Constraints.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Constructor.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Copy.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/DestroyWarning.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/GetSet.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ImaDBI.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Iterator.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/LazyLoading.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/LiveObjectIndex.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/NoObjectIndex.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Pager.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ReadOnly.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Relationship.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Relationships.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Retrieve.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/SQLTransformer.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Stringify.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/TempColumns.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Triggers.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ClassResolver/PassThrough.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Componentised.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Core.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Cursor.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/DB.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Exception.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/InflateColumn.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/InflateColumn/DateTime.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/InflateColumn/File.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual.pod
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Component.pod
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Cookbook.pod
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/DocMap.pod
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Example.pod
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/FAQ.pod
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Glossary.pod
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Intro.pod
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Joining.pod
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Reading.pod
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Troubleshooting.pod
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Ordered.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto/DB2.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto/MSSQL.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto/MySQL.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto/Pg.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto/SQLite.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Accessor.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Base.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/BelongsTo.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/CascadeActions.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/HasMany.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/HasOne.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Helpers.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/ManyToMany.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/ProxyMethods.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultClass/HashRefInflator.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSet.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSetColumn.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSetManager.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSetProxy.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource/Table.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource/View.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSourceHandle.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSourceProxy.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSourceProxy/Table.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Row.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Schema.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Schema/Versioned.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Serialize/Storable.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/StartupCheck.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Cursor.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/DB2.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MSSQL.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/NoBindVars.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/ACCESS.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/DB2_400_SQL.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle/WhereJoins.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Pg.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/First.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Replicant.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Role/QueryCounter.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/SQLite.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase/MSSQL.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/mysql.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/Statistics.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/TxnScopeGuard.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/UTF8Columns.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/SQL/Translator/Parser/DBIx/Class.pm
   DBIx-Class/0.08/branches/sybase_noquote/lib/SQL/Translator/Producer/DBIx/Class/File.pm
   DBIx-Class/0.08/branches/sybase_noquote/maint/benchmark_hashrefinflator.pl
   DBIx-Class/0.08/branches/sybase_noquote/maint/gen-pod-index.pl
   DBIx-Class/0.08/branches/sybase_noquote/maint/gen-schema.pl
   DBIx-Class/0.08/branches/sybase_noquote/maint/gen-tests.pl
   DBIx-Class/0.08/branches/sybase_noquote/maint/inheritance_pod.pl
   DBIx-Class/0.08/branches/sybase_noquote/maint/steal-svn-log.sh
   DBIx-Class/0.08/branches/sybase_noquote/maint/svn-log.perl
   DBIx-Class/0.08/branches/sybase_noquote/script/dbicadmin
   DBIx-Class/0.08/branches/sybase_noquote/t/02pod.t
   DBIx-Class/0.08/branches/sybase_noquote/t/03podcoverage.t
   DBIx-Class/0.08/branches/sybase_noquote/t/04dont_break_c3.t
   DBIx-Class/0.08/branches/sybase_noquote/t/05components.t
   DBIx-Class/0.08/branches/sybase_noquote/t/100extra_source.t
   DBIx-Class/0.08/branches/sybase_noquote/t/100populate.t
   DBIx-Class/0.08/branches/sybase_noquote/t/101populate_rs.t
   DBIx-Class/0.08/branches/sybase_noquote/t/102load_classes.t
   DBIx-Class/0.08/branches/sybase_noquote/t/103many_to_many_warning.t
   DBIx-Class/0.08/branches/sybase_noquote/t/104view.t
   DBIx-Class/0.08/branches/sybase_noquote/t/18inserterror.t
   DBIx-Class/0.08/branches/sybase_noquote/t/19quotes.t
   DBIx-Class/0.08/branches/sybase_noquote/t/19quotes_newstyle.t
   DBIx-Class/0.08/branches/sybase_noquote/t/20setuperrors.t
   DBIx-Class/0.08/branches/sybase_noquote/t/26dumper.t
   DBIx-Class/0.08/branches/sybase_noquote/t/30dbicplain.t
   DBIx-Class/0.08/branches/sybase_noquote/t/31stats.t
   DBIx-Class/0.08/branches/sybase_noquote/t/32connect_code_ref.t
   DBIx-Class/0.08/branches/sybase_noquote/t/33storage_reconnect.t
   DBIx-Class/0.08/branches/sybase_noquote/t/34exception_action.t
   DBIx-Class/0.08/branches/sybase_noquote/t/35disable_sth_caching.t
   DBIx-Class/0.08/branches/sybase_noquote/t/36datetime.t
   DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_1.t
   DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_2.t
   DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_3.t
   DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_4.t
   DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_rt41083.t
   DBIx-Class/0.08/branches/sybase_noquote/t/40resultsetmanager.t
   DBIx-Class/0.08/branches/sybase_noquote/t/41orrible.t
   DBIx-Class/0.08/branches/sybase_noquote/t/42toplimit.t
   DBIx-Class/0.08/branches/sybase_noquote/t/46where_attribute.t
   DBIx-Class/0.08/branches/sybase_noquote/t/50fork.t
   DBIx-Class/0.08/branches/sybase_noquote/t/51threads.t
   DBIx-Class/0.08/branches/sybase_noquote/t/51threadtxn.t
   DBIx-Class/0.08/branches/sybase_noquote/t/52cycle.t
   DBIx-Class/0.08/branches/sybase_noquote/t/54taint.t
   DBIx-Class/0.08/branches/sybase_noquote/t/55storage_stress.t
   DBIx-Class/0.08/branches/sybase_noquote/t/60core.t
   DBIx-Class/0.08/branches/sybase_noquote/t/61findnot.t
   DBIx-Class/0.08/branches/sybase_noquote/t/63register_class.t
   DBIx-Class/0.08/branches/sybase_noquote/t/64db.t
   DBIx-Class/0.08/branches/sybase_noquote/t/65multipk.t
   DBIx-Class/0.08/branches/sybase_noquote/t/67pager.t
   DBIx-Class/0.08/branches/sybase_noquote/t/68inflate.t
   DBIx-Class/0.08/branches/sybase_noquote/t/68inflate_resultclass_hashrefinflator.t
   DBIx-Class/0.08/branches/sybase_noquote/t/68inflate_serialize.t
   DBIx-Class/0.08/branches/sybase_noquote/t/69update.t
   DBIx-Class/0.08/branches/sybase_noquote/t/70auto.t
   DBIx-Class/0.08/branches/sybase_noquote/t/71mysql.t
   DBIx-Class/0.08/branches/sybase_noquote/t/72pg.t
   DBIx-Class/0.08/branches/sybase_noquote/t/73oracle.t
   DBIx-Class/0.08/branches/sybase_noquote/t/73oracle_inflate.t
   DBIx-Class/0.08/branches/sybase_noquote/t/745db2.t
   DBIx-Class/0.08/branches/sybase_noquote/t/746db2_400.t
   DBIx-Class/0.08/branches/sybase_noquote/t/746mssql.t
   DBIx-Class/0.08/branches/sybase_noquote/t/74mssql.t
   DBIx-Class/0.08/branches/sybase_noquote/t/75limit.t
   DBIx-Class/0.08/branches/sybase_noquote/t/76joins.t
   DBIx-Class/0.08/branches/sybase_noquote/t/76select.t
   DBIx-Class/0.08/branches/sybase_noquote/t/77join_count.t
   DBIx-Class/0.08/branches/sybase_noquote/t/78self_referencial.t
   DBIx-Class/0.08/branches/sybase_noquote/t/79aliasing.t
   DBIx-Class/0.08/branches/sybase_noquote/t/80unique.t
   DBIx-Class/0.08/branches/sybase_noquote/t/81transactions.t
   DBIx-Class/0.08/branches/sybase_noquote/t/82cascade_copy.t
   DBIx-Class/0.08/branches/sybase_noquote/t/83cache.t
   DBIx-Class/0.08/branches/sybase_noquote/t/84serialize.t
   DBIx-Class/0.08/branches/sybase_noquote/t/85utf8.t
   DBIx-Class/0.08/branches/sybase_noquote/t/86might_have.t
   DBIx-Class/0.08/branches/sybase_noquote/t/86sqlt.t
   DBIx-Class/0.08/branches/sybase_noquote/t/87ordered.t
   DBIx-Class/0.08/branches/sybase_noquote/t/88result_set_column.t
   DBIx-Class/0.08/branches/sybase_noquote/t/89dbicadmin.t
   DBIx-Class/0.08/branches/sybase_noquote/t/89inflate_datetime.t
   DBIx-Class/0.08/branches/sybase_noquote/t/90ensure_class_loaded.t
   DBIx-Class/0.08/branches/sybase_noquote/t/90join_torture.t
   DBIx-Class/0.08/branches/sybase_noquote/t/91debug.t
   DBIx-Class/0.08/branches/sybase_noquote/t/91merge_attr.t
   DBIx-Class/0.08/branches/sybase_noquote/t/92storage.t
   DBIx-Class/0.08/branches/sybase_noquote/t/92storage_on_connect_do.t
   DBIx-Class/0.08/branches/sybase_noquote/t/93nobindvars.t
   DBIx-Class/0.08/branches/sybase_noquote/t/93single_accessor_object.t
   DBIx-Class/0.08/branches/sybase_noquote/t/93storage_replication.t
   DBIx-Class/0.08/branches/sybase_noquote/t/94pk_mutation.t
   DBIx-Class/0.08/branches/sybase_noquote/t/94versioning.t
   DBIx-Class/0.08/branches/sybase_noquote/t/95sql_maker.t
   DBIx-Class/0.08/branches/sybase_noquote/t/95sql_maker_quote.t
   DBIx-Class/0.08/branches/sybase_noquote/t/96_is_deteministic_value.t
   DBIx-Class/0.08/branches/sybase_noquote/t/96file_column.t
   DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create.t
   DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create/cd_single.t
   DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create/multilev_might_have_PKeqFK.t
   DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create_new.t
   DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create_torture.t
   DBIx-Class/0.08/branches/sybase_noquote/t/97result_class.t
   DBIx-Class/0.08/branches/sybase_noquote/t/98savepoints.t
   DBIx-Class/0.08/branches/sybase_noquote/t/99dbic_sqlt_parser.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/01-columns.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/02-Film.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/03-subclassing.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/04-lazy.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/06-hasa.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/08-inheritcols.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/09-has_many.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/11-triggers.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/12-filter.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/13-constraint.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/14-might_have.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/15-accessor.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/16-reserved.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/18-has_a.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/19-set_sql.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/21-iterator.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/22-deflate_order.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/22-self_referential.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/23-cascade.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/24-meta_info.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/26-mutator.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/30-pager.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/68-inflate_has_a.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/98-failure.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/DeepAbstractSearch/01_search.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/abstract/search_where.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/columns_as_hashes.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/columns_dont_override_custom_accessors.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/construct.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/copy.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/early_column_heisenbug.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/has_many_loads_foreign_class.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/hasa_without_loading.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/max_min_value_of.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/mk_group_accessors.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/multi_column_set.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/object_cache.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/retrieve_from_sql_with_limit.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/set_to_undef.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/set_vs_DateTime.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/sweet/08pager.t
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Actor.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/ActorAlias.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Binary.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Blurb.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/CDBase.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/DBIC/Test/SQLite.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Director.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Film.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Lazy.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Log.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyBase.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyFilm.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyFoo.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyStar.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyStarLink.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyStarLinkMCPK.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Order.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/OtherFilm.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/OtherThing.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/PgBase.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Thing.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/dbh_do.t
   DBIx-Class/0.08/branches/sybase_noquote/t/discard_changes_in_DESTROY.t
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBIC/SqlMakerTest.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Bogus/A.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/OtherRslt/D.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RSBase.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RSet/A.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RSet/C.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Result/A.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Result/B.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/ResultSet/A.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/ResultSet/C.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Rslt/A.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Rslt/B.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/ResultSet.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/ResultSet/Foo.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/ResultSet_A/A.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/Schema/Foo.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/Schema/Foo/Sub.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/Schema_A/A.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/Schema_A/A/Sub.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/ErrorComponent.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/FakeComponent.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/ForeignComponent.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/ForeignComponent/TestComp.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/OptionalComponent.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Plain.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Plain/Test.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/ResultSetManager.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/ResultSetManager/Foo.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artist.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ArtistSourceName.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ArtistSubclass.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ArtistUndirectedMap.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artwork.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artwork_to_Artist.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/BindType.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Bookmark.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/BooksInLibrary.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CD.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CD_to_Producer.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Collection.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CollectionObject.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Dummy.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Employee.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Encoded.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Event.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZ.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FileColumn.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ForceForeign.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FourKeys.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FourKeys_to_TwoKeys.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Genre.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Image.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/LinerNotes.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Link.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/LyricVersion.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Lyrics.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/NoPrimaryKey.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/NoSuchClass.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/OneKey.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Owners.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Producer.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SelfRef.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SelfRefAlias.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SequenceTest.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Serialized.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Tag.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Track.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TreeLike.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TwoKeyTreeLike.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TwoKeys.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TypedObject.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Year1999CDs.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Year2000CDs.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Stats.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/SyntaxErrorComponent1.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/SyntaxErrorComponent2.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/SyntaxErrorComponent3.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Taint/Classes/Auto.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Taint/Classes/Manual.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Taint/Namespaces/Result/Test.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICVersionNew.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICVersionOrig.pm
   DBIx-Class/0.08/branches/sybase_noquote/t/lib/sqlite.sql
   DBIx-Class/0.08/branches/sybase_noquote/t/ordered/cascade_delete.t
   DBIx-Class/0.08/branches/sybase_noquote/t/resultset/as_query.t
   DBIx-Class/0.08/branches/sybase_noquote/t/resultset_class.t
   DBIx-Class/0.08/branches/sybase_noquote/t/resultset_overload.t
   DBIx-Class/0.08/branches/sybase_noquote/t/search/subquery.t
Log:
 r1183 at hlagh (orig r5683):  ribasushi | 2009-03-03 14:32:50 -0800
 Put code back into branch (and fix trunk snafu)
 r1185 at hlagh (orig r5685):  robkinyon | 2009-03-05 10:17:48 -0800
 Added experimental tag to as_query and subqueries in general
 r1190 at hlagh (orig r5690):  robkinyon | 2009-03-06 07:43:40 -0800
  r5672 at rkinyon-lt-osx (orig r5671):  robkinyon | 2009-02-28 22:46:19 -0500
  Added comment to describe the proposed fix in the test
 
 r1191 at hlagh (orig r5691):  robkinyon | 2009-03-06 07:43:50 -0800
  r5673 at rkinyon-lt-osx (orig r5672):  robkinyon | 2009-03-01 00:13:38 -0500
  Added more notes to the bottom of the failing testcase
 
 r1192 at hlagh (orig r5692):  robkinyon | 2009-03-06 07:44:24 -0800
  r5687 at rkinyon-lt-osx (orig r5686):  robkinyon | 2009-03-06 09:57:38 -0500
  Added solution, though no fix
 
 r1193 at hlagh (orig r5693):  robkinyon | 2009-03-06 07:44:34 -0800
  r5688 at rkinyon-lt-osx (orig r5687):  robkinyon | 2009-03-06 10:25:34 -0500
  Intermezzo checkin
 
 r1194 at hlagh (orig r5694):  robkinyon | 2009-03-06 07:44:58 -0800
  r5689 at rkinyon-lt-osx (orig r5688):  robkinyon | 2009-03-06 10:30:08 -0500
  Broke up the prefetch tests into their own directory
 
 r1195 at hlagh (orig r5695):  robkinyon | 2009-03-06 09:55:52 -0800
 Changed how the EXPERIMENTAL tag for subqueries and as_query is noted
 r1196 at hlagh (orig r5696):  ribasushi | 2009-03-06 09:56:54 -0800
 Remove erroneously merged file
 r1200 at hlagh (orig r5700):  robkinyon | 2009-03-06 11:57:07 -0800
  r5698 at rkinyon-lt-osx (orig r5697):  robkinyon | 2009-03-06 14:55:57 -0500
  Added solution for prefetch + hasmany bug
  r5700 at rkinyon-lt-osx (orig r5699):  robkinyon | 2009-03-06 14:56:50 -0500
  Fixed documentation for test
 
 r1201 at hlagh (orig r5701):  robkinyon | 2009-03-06 13:18:09 -0800
 Added a little more verbiage to explain how collapsing from HRI-form should happen
 r1206 at hlagh (orig r5718):  ribasushi | 2009-03-09 05:22:54 -0700
 Disable reconnect test except fpor when AUTHORS is set
 r1207 at hlagh (orig r5719):  ribasushi | 2009-03-09 05:23:12 -0700
 One more cdbi-compat author req
 r1208 at hlagh (orig r5720):  ribasushi | 2009-03-09 05:42:12 -0700
 Use homegrown AUTHOR detection
 r1209 at hlagh (orig r5721):  ribasushi | 2009-03-09 09:29:30 -0700
 Strip bogus Data::Dump requires
 r1210 at hlagh (orig r5727):  groditi | 2009-03-09 15:33:50 -0700
 remove (groditi) instances
 r1211 at hlagh (orig r5732):  wreis | 2009-03-10 17:56:06 -0700
 fixed View's doc | added me to contributors list
 r1212 at hlagh (orig r5733):  ribasushi | 2009-03-10 23:57:05 -0700
 Moose-related test hierarchy not removed at r4326
 r1213 at hlagh (orig r5734):  ribasushi | 2009-03-11 02:43:40 -0700
 Allow accessors type single to return defined but false objects (needed for null-pattern style components)
 r1214 at hlagh (orig r5735):  ribasushi | 2009-03-11 03:03:06 -0700
 Replace the fallback _dbh_last_insert_id with an explicit exception.
 Currently all known Storage::DBI engines provide their own _dbh_last_insert_id, except for Storage::DBI::Sybase, for which the old sqlite-ish fallback doesn't work anyway: http://rt.cpan.org/Public/Bug/Display.html?id=40265
 r1215 at hlagh (orig r5736):  wreis | 2009-03-11 12:25:25 -0700
 removed configure_sqlt method
 r1216 at hlagh (orig r5737):  ribasushi | 2009-03-11 16:23:18 -0700
 Properly returb undef/null on single rewlationship accessor
 r1218 at hlagh (orig r5743):  matthewt | 2009-03-12 11:35:16 -0700
 warning in author mode to avoid confusing the easily confused
 r1219 at hlagh (orig r5744):  castaway | 2009-03-12 13:24:55 -0700
 Document how to overload connect/connection
 
 r1220 at hlagh (orig r5745):  castaway | 2009-03-12 13:36:41 -0700
 Add docs in various places to point out how to get the total count of rows for a paged resultset
 
 r1221 at hlagh (orig r5746):  castaway | 2009-03-12 15:33:42 -0700
 Add doc on how conditions and attrs are merged when chaining.
 
 r1222 at hlagh (orig r5747):  ribasushi | 2009-03-12 16:30:26 -0700
 Move author warning in front of auto_install
 r1228 at hlagh (orig r5753):  jmmills | 2009-03-13 05:32:35 -0700
 Added test for source sub-class register_extra_sources warning.
 Sub-classes should not generate this warning - bug via non-inhertiance sorting via register_source.
 
 r1233 at hlagh (orig r5758):  arcanez | 2009-03-15 09:14:56 -0700
 update Makefile.PL to require latest C3, C3::Componentised, MRO::Compat
 r1235 at hlagh (orig r5760):  arcanez | 2009-03-16 12:53:34 -0700
  * change search_literal to use \[] when passing into search (help with binding order)
  * provide documentation on how to use search instead of search_literal
 
 
 r1236 at hlagh (orig r5761):  plu | 2009-03-17 08:31:08 -0700
 putting IC::DateTime locale, timezone or floating_tz_ok attributes into extra => {} has been deprecated. The new way is to put these things directly into the columns definition
 r1237 at hlagh (orig r5763):  ribasushi | 2009-03-17 16:57:49 -0700
 Basic binary op logic FAIL
 r1238 at hlagh (orig r5768):  rafl | 2009-03-18 12:02:07 -0700
 Use MRO::Compat instead of Class::C3 directly.
 r1239 at hlagh (orig r5769):  rafl | 2009-03-18 12:02:23 -0700
 Depend on the latest C3::Componentised so we use mro:: on 5.10 and Class::C3 on 5.8.
 r1240 at hlagh (orig r5772):  robkinyon | 2009-03-19 10:05:00 -0700
 Special-case handling for (undef,undef) passed to search_rs()
 r1241 at hlagh (orig r5776):  robkinyon | 2009-03-19 13:35:37 -0700
 Moved some SQL parsing of ORDER BY from _select_args() to retrieve_from_sql() where it belongs
 r1242 at hlagh (orig r5778):  robkinyon | 2009-03-19 13:52:54 -0700
 Commit another fix for arcanez to test
 r1243 at hlagh (orig r5779):  robkinyon | 2009-03-19 14:07:06 -0700
 Commit another fix for arcanez to test
 r1244 at hlagh (orig r5784):  wdh | 2009-03-20 08:23:40 -0700
 clarify need for scalarref when using db functions with 'default_value' attribute
 r1245 at hlagh (orig r5786):  solomon | 2009-03-20 14:41:49 -0700
 Add cookbook entry for dealing with runaway prepared statement cache
 r1246 at hlagh (orig r5791):  groditi | 2009-03-21 18:10:30 -0700
 adding test for exception if nullable rel call is not explicitly defined as undef on insert
 r1247 at hlagh (orig r5792):  ribasushi | 2009-03-22 14:09:22 -0700
 New SQLA::Test handles () differences *much* better, thus fixing the tests
 r1248 at hlagh (orig r5803):  groditi | 2009-03-23 11:16:41 -0700
 skip test doc issue relating to db-side defaults
 r1249 at hlagh (orig r5808):  jmmills | 2009-03-24 00:49:54 -0700
 Fixed _register_source to not produce 'register_extra_source' warnings
 when "registering class" isa (or is a sub-class) source class.
 This is not exactly an elegant fix as I had to pass a hash key (as _to_register via $params) with the original source class instance; I was not able to determine inheritance via the result_source_instance (ResultSource::Table) object.
  
 r1250 at hlagh (orig r5815):  robkinyon | 2009-03-25 18:09:55 -0700
 Deprecated search_like()
 r1251 at hlagh (orig r5816):  lukes | 2009-03-26 02:13:18 -0700
 changed my nick in contribs section
 r1252 at hlagh (orig r5819):  castaway | 2009-03-26 06:54:09 -0700
 Improved  metapod docs
 
 r1253 at hlagh (orig r5822):  nigel | 2009-03-27 05:21:14 -0700
  r11142 at hex:  nigel | 2009-03-27 12:20:55 +0000
  Removed Cookbook section on pagers that stated page attribute was not required.
  [Since the pager throws an exception if the pager attribute is not specified, 
  this was completely wrong]
 
 r1254 at hlagh (orig r5823):  norbi | 2009-03-27 05:30:00 -0700
  r5969 at vger:  mendel | 2009-03-27 13:29:24 +0100
   * Fixed the alphabetical order of the contributors list (that I screwed up, sorry).
 
 r1255 at hlagh (orig r5830):  ribasushi | 2009-03-28 14:46:34 -0700
 Bump SQLA and CAG dependencies
 r1256 at hlagh (orig r5831):  ribasushi | 2009-03-28 15:05:35 -0700
 Clarify DBIC behavior wrt RDBMS default values
 r1257 at hlagh (orig r5832):  ribasushi | 2009-03-29 01:31:47 -0700
 detabify
 r1258 at hlagh (orig r5835):  ribasushi | 2009-03-29 01:49:32 -0700
 detabify
 r1259 at hlagh (orig r5836):  ribasushi | 2009-03-29 03:06:02 -0700
 Revert r5808 - this is NOT a bug, the warning IS correct
 r1260 at hlagh (orig r5837):  ribasushi | 2009-03-29 03:18:19 -0700
 Adjust parenthesis to pass with latest SQLA
 r1261 at hlagh (orig r5838):  ribasushi | 2009-03-29 03:22:49 -0700
 Remove failing test before branching
 r1269 at hlagh (orig r5846):  ribasushi | 2009-03-29 16:05:37 -0700
 Take experimental off TxnScopeGuard
 r1270 at hlagh (orig r5847):  ribasushi | 2009-03-29 16:44:40 -0700
 Dev-Release 0.08099_08
 r1272 at hlagh (orig r5851):  castaway | 2009-03-30 23:41:42 -0700
 Fix my email address in AUTHOR
 
 r1274 at hlagh (orig r5858):  plu | 2009-04-07 07:15:32 -0700
 Added caveat notes to dual trick in cookbook
 r1276 at hlagh (orig r5863):  jmmills | 2009-04-08 12:28:16 -0700
  r81350 at ofelia (orig r5840):  ribasushi | 2009-03-29 03:30:21 -0700
  Re-add failing test
 
 r1277 at hlagh (orig r5874):  arcanez | 2009-04-09 06:35:46 -0700
 require DBD::SQLite 1.21+
 r1278 at hlagh (orig r5884):  caelum | 2009-04-13 05:47:47 -0700
 add test for connect_info hashref
 r1279 at hlagh (orig r5886):  pcc | 2009-04-13 11:35:51 -0700
 Correctly propagate forced left joins through arrayrefs and hashrefs
 r1280 at hlagh (orig r5888):  caelum | 2009-04-15 06:47:53 -0700
 duplicate
 r1281 at hlagh (orig r5890):  plu | 2009-04-17 01:10:19 -0700
 Added update_or_new to ResultSet.pm
 r1282 at hlagh (orig r5902):  ilmari | 2009-04-18 11:38:44 -0700
 Don't warn when reregistering a source under the same name
 r1283 at hlagh (orig r5912):  matthewt | 2009-04-19 07:52:15 -0700
 0.08100 release
 r1284 at hlagh (orig r5915):  arcanez | 2009-04-20 15:07:07 -0700
 move load_optional_class into Class::C3::Componentised
 
 r1285 at hlagh (orig r5922):  ribasushi | 2009-04-21 01:37:11 -0700
 New SQLite kicks ass - remove some warning silencers and reinstantiate tests
 r1286 at hlagh (orig r5923):  ribasushi | 2009-04-21 01:51:03 -0700
 Multiple cdbi-compat test cleanups
 Clarify search_like deprecation
 r1287 at hlagh (orig r5924):  ribasushi | 2009-04-21 01:51:59 -0700
 More author test-requires
 r1288 at hlagh (orig r5925):  ribasushi | 2009-04-21 01:53:35 -0700
 t/ janitorial work
 r1295 at hlagh (orig r5935):  ribasushi | 2009-04-21 07:17:04 -0700
 Fix dumb omission in t/89dbicadmin.t
 Adjust svn:ignore
 r1296 at hlagh (orig r5936):  peter | 2009-04-21 08:52:58 -0700
 added IRC nick to contributor list
 r1302 at hlagh (orig r5943):  arcanez | 2009-04-21 20:21:28 -0700
 un-todo these tests, load_optional_class is fixed
 r1303 at hlagh (orig r5944):  ribasushi | 2009-04-22 01:14:13 -0700
 RT45195 various indexer fixes
 r1304 at hlagh (orig r5945):  ribasushi | 2009-04-22 01:18:14 -0700
 Another indexer trick
 r1306 at hlagh (orig r5948):  ribasushi | 2009-04-22 15:25:32 -0700
 This code belongs in t/
 r1308 at hlagh (orig r5950):  ribasushi | 2009-04-22 15:28:26 -0700
  r5846 at Thesaurus (orig r5845):  ribasushi | 2009-03-29 16:55:03 +0200
  Fix test - inane assumption on my part
 
 r1309 at hlagh (orig r5951):  ribasushi | 2009-04-22 15:33:42 -0700
  r5863 at Thesaurus (orig r5862):  jmmills | 2009-04-08 21:26:57 +0200
  patch for no-op, further testing required.
  
 
 r1310 at hlagh (orig r5952):  ribasushi | 2009-04-22 15:34:11 -0700
  r5927 at Thesaurus (orig r5926):  ribasushi | 2009-04-21 11:57:03 +0200
  Fix number of tests
 
 r1311 at hlagh (orig r5953):  ribasushi | 2009-04-22 15:35:52 -0700
  r5928 at Thesaurus (orig r5927):  ribasushi | 2009-04-21 12:42:14 +0200
  Clarify _register_source code, no functional changes
 
 r1312 at hlagh (orig r5954):  ribasushi | 2009-04-22 15:35:59 -0700
  r5929 at Thesaurus (orig r5928):  ribasushi | 2009-04-21 12:53:25 +0200
  Back out my bogus test from r4902 - this warning was never supposed to be here in the first place - we are essentially dynamically subclassing Artist (although in a very sloppy way)
 
 r1313 at hlagh (orig r5955):  ribasushi | 2009-04-22 15:37:43 -0700
 
 r1314 at hlagh (orig r5956):  ribasushi | 2009-04-22 15:37:49 -0700
  r5931 at Thesaurus (orig r5930):  ribasushi | 2009-04-21 13:06:25 +0200
  Sloppy merge - adding imlari's fix from r5902
 
 r1316 at hlagh (orig r5958):  ribasushi | 2009-04-22 15:48:08 -0700
 Fix botched merge again - sorry r5959-5956 are actually a single commit
 r1318 at hlagh (orig r5966):  gphat | 2009-04-23 13:49:04 -0700
 Fix busted get_column when using +select (and friends)
 r1319 at hlagh (orig r5967):  arcanez | 2009-04-23 13:58:59 -0700
 update Changes for moving load_optional_class
 r1320 at hlagh (orig r5975):  ribasushi | 2009-04-23 16:47:04 -0700
 Whops
 r1321 at hlagh (orig r5977):  mo | 2009-04-24 07:24:26 -0700
 patch for DBI.pm so store_column is called only once on create() and tests for that
 r1322 at hlagh (orig r5978):  mo | 2009-04-24 07:27:20 -0700
 cleanup 72pg.t
 r1323 at hlagh (orig r5979):  ribasushi | 2009-04-24 08:22:05 -0700
 Cosmetic change
 r1325 at hlagh (orig r5986):  castaway | 2009-04-25 02:59:28 -0700
 Docs on using multiple db schemas (from abraxxa maybe, I forget)
 Docs on setting result_class from agaran
 
 r1326 at hlagh (orig r5987):  ribasushi | 2009-04-27 01:03:58 -0700
 Refactor the (almost obsolete) DBD::SQLite check not to fork() within win32
 r1327 at hlagh (orig r5988):  ribasushi | 2009-04-27 01:05:43 -0700
 Whops, we don't exit under win32
 r1328 at hlagh (orig r5989):  ribasushi | 2009-04-27 01:14:38 -0700
 More AUTHOR dependencies pulled from Replicated.pm
 Up MI version to 0.79 (not going further as auto_install is broken again, need a permanent solution)
 Reorder configure_requires() as per Alias
 Remove Meta_TupleKeys munging as per Alias
 r1329 at hlagh (orig r5990):  ribasushi | 2009-04-27 02:11:15 -0700
 Release 0.08101
 r1331 at hlagh (orig r5994):  arcanez | 2009-04-28 00:05:53 -0700
 change from DB::Schema to My::Schema
 add ::Result:: as necessary (load_namespaces instead of load_classes)
 
 r1332 at hlagh (orig r5995):  ribasushi | 2009-04-28 02:12:33 -0700
 Fix a todo and some minor test adjustments
 r1333 at hlagh (orig r5996):  ribasushi | 2009-04-28 02:35:31 -0700
 Bogus test dependency
 r1334 at hlagh (orig r6002):  arcanez | 2009-04-28 13:20:42 -0700
 fix for columns => [ ... ] issue
 r1335 at hlagh (orig r6013):  arcanez | 2009-04-28 16:16:48 -0700
 test for prefetch by columns
 r1336 at hlagh (orig r6015):  ribasushi | 2009-04-29 01:22:16 -0700
 test and patch for failing mini-prefetch via columns (arcanez++)
 r1337 at hlagh (orig r6016):  ribasushi | 2009-04-29 01:23:25 -0700
 Add two TODOs by arcanez (not sure about those)
 r1338 at hlagh (orig r6017):  ribasushi | 2009-04-29 01:24:20 -0700
 Add TODOs illustrating a problem with as_query
 r1339 at hlagh (orig r6018):  arcanez | 2009-04-29 05:47:03 -0700
 untodo/fix test
 r1340 at hlagh (orig r6019):  ribasushi | 2009-04-29 06:39:27 -0700
 Strip out inane todo
 r1341 at hlagh (orig r6020):  ribasushi | 2009-04-29 06:40:03 -0700
 Forgotten debugging
 r1342 at hlagh (orig r6021):  ribasushi | 2009-04-29 06:41:37 -0700
 Fixes to massive breakage introduced by 5948  ribasushi--
 r1343 at hlagh (orig r6022):  ribasushi | 2009-04-29 06:47:23 -0700
 Changes
 r1344 at hlagh (orig r6023):  jasonmay | 2009-04-29 08:18:11 -0700
 allow multiple classless sources to be registered without dying
 
 r1345 at hlagh (orig r6024):  jasonmay | 2009-04-29 09:47:26 -0700
 add jasonmay to list of contributors
 
 r1346 at hlagh (orig r6033):  ribasushi | 2009-04-29 23:53:51 -0700
 Add tests for r6002
 r1348 at hlagh (orig r6035):  ribasushi | 2009-04-30 01:12:23 -0700
 Revert addition of superficial relationship in r5886
 r1351 at hlagh (orig r6038):  ribasushi | 2009-04-30 01:28:04 -0700
 Release 0.08102
 r1361 at hlagh (orig r6109):  plu | 2009-05-02 12:11:40 -0700
 Failing testcase for using subselect (as_query)
 r1362 at hlagh (orig r6110):  ribasushi | 2009-05-02 17:00:19 -0700
 Failing test without immediate fixes go to branches, not to trunk
 r1365 at hlagh (orig r6113):  ribasushi | 2009-05-03 01:23:28 -0700
 Bump SQLA ependencies so parenthesis_significant is guaranteed to be there
 r1377 at hlagh (orig r6126):  arcanez | 2009-05-05 00:27:56 -0700
  r6037 at mullet (orig r6036):  arcanez | 2009-04-30 01:24:41 -0700
  branch to work on Sybase/MSSQL subtleties
  r6038 at mullet (orig r6037):  arcanez | 2009-04-30 01:27:11 -0700
  jump to ::DBI::Sybase::MSSQL if we are using MSSQL through Sybase
  r6062 at mullet (orig r6061):  arcanez | 2009-04-30 14:05:24 -0700
  fixes for MSSQL via Sybase
  r6126 at mullet (orig r6125):  arcanez | 2009-05-05 00:27:13 -0700
  add a line to Changes and add a CAVEAT
 
 r2490 at hlagh (orig r6163):  ribasushi | 2009-05-07 10:09:01 -0700
  r6115 at Thesaurus (orig r6114):  plu | 2009-05-03 10:39:16 +0200
  new branch to fix $rs->update and $rs->delete using the new as_query method
  
  r6116 at Thesaurus (orig r6115):  plu | 2009-05-03 10:52:07 +0200
  Methods update/delete on resultset use now new as_query method to updated/delete properly on joined/prefetched resultset using a subquery. Therefore some tests have been added and some have been changed as well as the warnings around $rs->update/delete have been removed. Cheers!
  r6117 at Thesaurus (orig r6116):  plu | 2009-05-03 11:13:48 +0200
  Using "is" instead of "cmp_ok"
  r6160 at Thesaurus (orig r6159):  ribasushi | 2009-05-07 11:58:14 +0200
  Back out skip_parens support in as_query
  r6161 at Thesaurus (orig r6160):  ribasushi | 2009-05-07 19:00:48 +0200
  This test is completely borked, needs a rewrite
  r6162 at Thesaurus (orig r6161):  ribasushi | 2009-05-07 19:07:19 +0200
  Temporary fix or the IN ( ( ... ) ) problem until we get proper SQLA AST (needs SQLA released with commit 6158 to work)
 
 r2491 at hlagh (orig r6164):  ribasushi | 2009-05-07 10:11:46 -0700
 Changes, remove merged branch
 r2492 at hlagh (orig r6168):  ribasushi | 2009-05-07 10:24:54 -0700
 Bump SQLA dependency so -in/-between workarounds overload properly
 r2495 at hlagh (orig r6171):  ribasushi | 2009-05-07 11:49:26 -0700
 Cookbook cleanup
 r2496 at hlagh (orig r6173):  ribasushi | 2009-05-08 01:13:30 -0700
 Throw away some debugging code
 r2497 at hlagh (orig r6174):  ribasushi | 2009-05-08 01:21:53 -0700
 Documentation patch by nniuq
 r2498 at hlagh (orig r6175):  plu | 2009-05-08 01:30:20 -0700
 Set NLS_LANG so we  have a predictable date format when using MON
 r2499 at hlagh (orig r6176):  ribasushi | 2009-05-08 03:15:15 -0700
 Fix POD
 r2500 at hlagh (orig r6178):  jgoulah | 2009-05-08 07:27:49 -0700
 renaming rh performance test so it will show up at the end of test output
 r2513 at hlagh (orig r6194):  caelum | 2009-05-09 06:46:55 -0700
 added postgres default port stuff to FAQ
 r2514 at hlagh (orig r6198):  mo | 2009-05-10 08:37:16 -0700
 set_$rel accepts now a $link_vals hashref like add_to_$rel does
 r2516 at hlagh (orig r6201):  ribasushi | 2009-05-10 10:57:31 -0700
 Require DBICTest.pm in all tests even if it is not needed at all
 r2517 at hlagh (orig r6202):  ribasushi | 2009-05-10 11:17:09 -0700
 No more 'I forgot to run perl Makefile.PL'
 r2518 at hlagh (orig r6203):  ribasushi | 2009-05-10 12:35:03 -0700
 Switch the m2m method warnings from warnings::register to $ENV{DBIC_METHOD_CLOBBER_OK} = 1
 r2519 at hlagh (orig r6205):  ribasushi | 2009-05-11 03:50:54 -0700
 Change the makefile to test r6202
 r2527 at hlagh (orig r6217):  ribasushi | 2009-05-11 22:02:14 -0700
 Trying to untangle failing merge (whitespace change)
 r2529 at hlagh (orig r6219):  ribasushi | 2009-05-11 22:02:56 -0700
  r5757 at Thesaurus (orig r5756):  arcanez | 2009-03-14 14:55:55 +0100
  created count_distinct branch
  r5758 at Thesaurus (orig r5757):  arcanez | 2009-03-14 15:33:03 +0100
   * change count with group_by (distinct) to use a subquery
   * rewrite of _bind_to_sql (uses placeholders and bindvars)
   * tests for count distinct
   * fixed tests for from subquery 
  
  r5760 at Thesaurus (orig r5759):  arcanez | 2009-03-16 16:48:28 +0100
  don't remove the where clause unless we're doing distinct, it needs to be there
  r5850 at Thesaurus (orig r5849):  arcanez | 2009-03-30 21:40:05 +0200
   * add more tests
   * remove old cruft
   * remove old note
  
  r6035 at Thesaurus (orig r6034):  ribasushi | 2009-04-30 09:10:36 +0200
  Add joined count test
  r6079 at Thesaurus (orig r6078):  arcanez | 2009-05-01 08:41:34 +0200
  cleanup/fix some broken tests
  r6097 at Thesaurus (orig r6096):  arcanez | 2009-05-01 19:37:04 +0200
  make sure merge bind
  test for aformentioned
  TODO count_joined test for a little while
  
  r6105 at Thesaurus (orig r6104):  arcanez | 2009-05-02 02:33:49 +0200
  remove hackish ways
  
  r6106 at Thesaurus (orig r6105):  arcanez | 2009-05-02 03:20:04 +0200
  more fixes to tests
  r6107 at Thesaurus (orig r6106):  arcanez | 2009-05-02 03:33:47 +0200
  remove DBIx::Class::Storage::DBI::MultiDistinctEmulation
  r6111 at Thesaurus (orig r6110):  ribasushi | 2009-05-03 02:00:19 +0200
  Failing test without immediate fixes go to branches, not to trunk
  r6114 at Thesaurus (orig r6113):  ribasushi | 2009-05-03 10:23:28 +0200
  Bump SQLA ependencies so parenthesis_significant is guaranteed to be there
  r6148 at Thesaurus (orig r6147):  ribasushi | 2009-05-06 17:40:31 +0200
  Add subquery/from test by michaelr (copied from subquery branch r5742)
  r6151 at Thesaurus (orig r6150):  ribasushi | 2009-05-06 17:56:07 +0200
  TODOify sqla-dependent tests
  r6152 at Thesaurus (orig r6151):  arcanez | 2009-05-06 18:33:58 +0200
  fix old test using new bind vars (no more interpolating)
  r6154 at Thesaurus (orig r6153):  ribasushi | 2009-05-07 00:56:40 +0200
  Rename internal function to clarify what it does
  r6171 at Thesaurus (orig r6170):  ribasushi | 2009-05-07 19:53:30 +0200
  Adjust tests for the IN fixes
  r6187 at Thesaurus (orig r6186):  ribasushi | 2009-05-08 23:11:43 +0200
  Final count tests
  r6188 at Thesaurus (orig r6187):  arcanez | 2009-05-09 03:50:12 +0200
  rewrite DISTINCT/COUNT(DISTINCT) Cookbook entries
  r6213 at Thesaurus (orig r6212):  arcanez | 2009-05-11 22:41:21 +0200
  warn/die based on { select => { distinct => { } } }
  r6214 at Thesaurus (orig r6213):  arcanez | 2009-05-11 23:21:11 +0200
  use carp instead of warn
  r6216 at Thesaurus (orig r6215):  arcanez | 2009-05-11 23:45:05 +0200
  make sure we get just a string
  r6217 at Thesaurus (orig r6216):  arcanez | 2009-05-11 23:52:11 +0200
  oops
 
 r2531 at hlagh (orig r6221):  ribasushi | 2009-05-11 23:11:27 -0700
  r6112 at Thesaurus (orig r6111):  nniuq | 2009-05-03 02:36:33 +0200
  Initially, fixes to enable saving of LOB types in Oracle.  Possibly timestamp tweaks.
  
  r6113 at Thesaurus (orig r6112):  nniuq | 2009-05-03 03:52:29 +0200
  Support for saving CLOB and BLOB types in Oracle.
  
  r6118 at Thesaurus (orig r6117):  nniuq | 2009-05-04 03:58:03 +0200
  Proper support for timestamp inflation.  Added last_updated_at to DBICTest::Schema::Track as a date by default, initialized in sqlite loader, redefined to timestamp for Oracle tests.
  
  r6119 at Thesaurus (orig r6118):  nniuq | 2009-05-04 04:03:28 +0200
  Re-added last_updated_at to create table statement.
  
  r6134 at Thesaurus (orig r6133):  nniuq | 2009-05-05 15:11:49 +0200
  Added self to contributors; clarified comment on :ora_types imports.
  
  r6182 at Thesaurus (orig r6181):  nniuq | 2009-05-08 17:10:58 +0200
  Refactored to call _{inflate_to,deflate_from}_datetime through a _flate_or_fallback wrapper handling a parser's lack of support for the requested type.
  
  r6183 at Thesaurus (orig r6182):  ribasushi | 2009-05-08 17:24:54 +0200
  Remove redundant var
  r6189 at Thesaurus (orig r6188):  nniuq | 2009-05-09 03:59:20 +0200
  Changed test of lob values from is to ok on an eq expr, to avoid a huge got/expected diagnosis.  In doing so, discovered it was testing undef vs undef!  Whoops.  Fixed.
  
  r6210 at Thesaurus (orig r6209):  nniuq | 2009-05-11 16:24:27 +0200
  Moved DBIC::SQL::Abstract inner classes to DBIx::Class::SQLAHacks namespace to decouple 41orrible.t tests from use of DBD::Oracle in Oracle Generic driver.
 
 r2533 at hlagh (orig r6223):  ribasushi | 2009-05-11 23:13:31 -0700
  r6223 at Thesaurus (orig r6222):  ribasushi | 2009-05-12 08:12:50 +0200
  Whops, forgotten post-merge tweaks
 
 r2535 at hlagh (orig r6225):  ribasushi | 2009-05-11 23:43:58 -0700
 Cleanup
 r2536 at hlagh (orig r6226):  ribasushi | 2009-05-12 00:42:45 -0700
 Shuffle delete tests, and sanify the delete related ones
 r2537 at hlagh (orig r6227):  ribasushi | 2009-05-12 00:54:37 -0700
 Rename m2m warn disable envvar
 r2538 at hlagh (orig r6228):  ribasushi | 2009-05-12 01:20:08 -0700
 Switch warn to carp and die to throw_exception where possible
 r2539 at hlagh (orig r6229):  bricas | 2009-05-12 04:31:35 -0700
 added info to Changes from my DateTime::InflateColumn modifications
 r2540 at hlagh (orig r6230):  nniuq | 2009-05-12 06:08:14 -0700
 Added synopsis of merged oracle-tweaks branch to Changes
 r2542 at hlagh (orig r6232):  debolaz | 2009-05-12 08:17:09 -0700
 Test for failing code related to many to many in MySQL
 
 r2543 at hlagh (orig r6233):  arcanez | 2009-05-12 08:33:56 -0700
 Changes for count_distinct branch merge
 r2544 at hlagh (orig r6234):  ribasushi | 2009-05-12 09:09:14 -0700
 Some more die/croak conversions
 r2545 at hlagh (orig r6235):  ribasushi | 2009-05-12 09:51:38 -0700
 Fix shot test
 r2546 at hlagh (orig r6243):  ribasushi | 2009-05-12 18:02:11 -0700
 fix bogus test
 r2547 at hlagh (orig r6244):  ribasushi | 2009-05-12 18:06:42 -0700
 Fix _select_for_update/delete - bring back old code, use subqueries only when resultset attributes call for it
 r2554 at hlagh (orig r6251):  ribasushi | 2009-05-13 16:41:31 -0700
 Better testing and heuristics for subqueried _cond_for_update_delete
 r2555 at hlagh (orig r6252):  ribasushi | 2009-05-13 16:54:41 -0700
 join can be found without seen_join
 r2557 at hlagh (orig r6254):  ribasushi | 2009-05-14 03:12:44 -0700
 Sometimes _prepare_for_execute may not return a set of bind vars - guard against that
 r2558 at hlagh (orig r6255):  ribasushi | 2009-05-14 03:14:19 -0700
 Clarify test
 r2564 at hlagh (orig r6263):  ribasushi | 2009-05-14 06:40:19 -0700
  r6121 at Thesaurus (orig r6120):  caelum | 2009-05-04 17:13:22 +0200
  Making new branch for storage tweaking
  r6122 at Thesaurus (orig r6121):  caelum | 2009-05-04 20:07:47 +0200
  support hashrefs for connect_replicants
  r6123 at Thesaurus (orig r6122):  caelum | 2009-05-04 23:07:43 +0200
  ::Replicated - test hashref for connect_replicants and croak on coderef, switch to MX::Types, make test less noisy
  r6143 at Thesaurus (orig r6142):  caelum | 2009-05-06 05:13:56 +0200
  fix ::DBI::Replicated::all_storages
  r6144 at Thesaurus (orig r6143):  caelum | 2009-05-06 05:25:04 +0200
  Replicated - fixup types and namespace::clean
  r6147 at Thesaurus (orig r6146):  caelum | 2009-05-06 15:29:39 +0200
  ::DBI:Replicated - merge connect_info from master to replicants
  r6184 at Thesaurus (orig r6183):  caelum | 2009-05-08 18:08:29 +0200
  support ::DBI::Replicated opts in connect_info
  r6190 at Thesaurus (orig r6189):  caelum | 2009-05-09 05:31:15 +0200
  ::DBI::Replicated - add master_read_weight to ::Random balancer_type
  r6191 at Thesaurus (orig r6190):  caelum | 2009-05-09 12:50:25 +0200
  ::DBI::Replicated - fix fallback to master, test for the warning, other cleanups
  r6193 at Thesaurus (orig r6192):  caelum | 2009-05-09 13:52:52 +0200
  updated Changes
  r6194 at Thesaurus (orig r6193):  caelum | 2009-05-09 14:21:44 +0200
  ::DBI::Replicated - don't build pool/balancer from connect_info unless necessary
 
 r2568 at hlagh (orig r6267):  caelum | 2009-05-14 19:04:12 -0700
 minor replication changes - use a real hash merge, clarify master_read_weight, really done with this now.
 r2570 at hlagh (orig r6271):  abraxxa | 2009-05-15 04:45:54 -0700
 added Static sub-classing DBIx::Class result classes section to the cookbook
 
 r2572 at hlagh (orig r6276):  ribasushi | 2009-05-15 15:46:00 -0700
 Optimize some Ordered.pm code
 r2573 at hlagh (orig r6277):  ribasushi | 2009-05-15 23:02:18 -0700
 Cleanup tests
 r2575 at hlagh (orig r6279):  ribasushi | 2009-05-16 00:30:05 -0700
 Not sure what this part of the test is for, but it breaks custom resultsets, and the test passes without it. Removing as a possible remnant of an ancient civilization
 r2576 at hlagh (orig r6280):  ribasushi | 2009-05-16 00:33:24 -0700
 Add default resultclass/resultsetclass to the entire test schema, as I am tired of typing extra shit for debugging purposes
 r2577 at hlagh (orig r6281):  ribasushi | 2009-05-16 00:34:21 -0700
 Now we can do diag $rs->hri_dump, ain't that nice
 r4123 at hlagh (orig r6289):  ribasushi | 2009-05-16 15:06:40 -0700
 Rewrite SqlMakerTest to fully depend on SQLA::Test
 Allow is_same_sql_bind to accept an arrayrefref instead of any pair of $sql, \@bind
 r4127 at hlagh (orig r6298):  frew | 2009-05-18 09:16:44 -0700
 Fix order by clauses for MSSQL
 r4131 at hlagh (orig r6303):  frew | 2009-05-18 12:43:48 -0700
 Test to show problem
 r4132 at hlagh (orig r6304):  ribasushi | 2009-05-18 13:12:35 -0700
 Failing tests go to branches
 r4133 at hlagh (orig r6305):  ribasushi | 2009-05-18 13:14:26 -0700
 Require bugfixed sqla
 r4137 at hlagh (orig r6311):  ribasushi | 2009-05-18 14:05:10 -0700
  r6157 at Thesaurus (orig r6156):  ribasushi | 2009-05-07 10:28:14 +0200
  new branch for the diamond join/prefetch bug
  r6158 at Thesaurus (orig r6157):  ribasushi | 2009-05-07 11:12:41 +0200
  Add failing test by gheift
  r6294 at Thesaurus (orig r6293):  ribasushi | 2009-05-18 01:10:22 +0200
  Fixes for the diamond-relationship prefetch/join problem
  The core of the issue was that resolve_prefetch calculated duplicate join alias numbers separate from resolve_join
  In order to solve this, now the only join alias calculation happens in resolve_join (with prefetch being always merged as extra joins), and each join arrayref in from is labeled with the full relationship chain from me to the particular join. Then resolve_prefetch has to walk this chain and pull the necessary alias in order to generate the correct select
  r6296 at Thesaurus (orig r6295):  ribasushi | 2009-05-18 14:05:31 +0200
  Add a comment about a small resolve_join omission
 
 r4139 at hlagh (orig r6313):  frew | 2009-05-18 14:56:37 -0700
 cleanup for ribasushi
 r4141 at hlagh (orig r6315):  frew | 2009-05-18 16:10:20 -0700
 I contributed!
 r4142 at hlagh (orig r6316):  arcanez | 2009-05-18 20:30:18 -0700
 doc patch per amiri
 r4143 at hlagh (orig r6317):  arcanez | 2009-05-18 20:33:47 -0700
 I think I got it right this time
 r4146 at hlagh (orig r6321):  abraxxa | 2009-05-19 10:07:08 -0700
 added test for total_entries on a paged resultset
 
 r4150 at hlagh (orig r6325):  ribasushi | 2009-05-19 10:34:45 -0700
  r6258 at Thesaurus (orig r6257):  ribasushi | 2009-05-14 13:18:58 +0200
  Refactor count handling - use a different code path depending on the complexity of the resultset query, allows proper collapsing of count results via group_by subqueries
  
 
 r4151 at hlagh (orig r6326):  ribasushi | 2009-05-19 10:34:53 -0700
  r6259 at Thesaurus (orig r6258):  ribasushi | 2009-05-14 13:19:35 +0200
  Straightforward test changes
 
 r4152 at hlagh (orig r6327):  ribasushi | 2009-05-19 10:35:00 -0700
  r6260 at Thesaurus (orig r6259):  ribasushi | 2009-05-14 13:19:59 +0200
  Questionable test changes - need a review
 
 r4153 at hlagh (orig r6328):  ribasushi | 2009-05-19 10:35:07 -0700
  r6269 at Thesaurus (orig r6268):  ribasushi | 2009-05-15 10:43:04 +0200
  Add failing multikey rs delete (and by implication update) test
 
 r4154 at hlagh (orig r6329):  ribasushi | 2009-05-19 10:35:14 -0700
  r6276 at Thesaurus (orig r6275):  ribasushi | 2009-05-15 23:35:06 +0200
  A workable fix for the resultset multicol update/delete debacle - by default fallback to per-row deletions, with the ability to overide this behavior for various storage drivers
 
 r4155 at hlagh (orig r6330):  ribasushi | 2009-05-19 10:35:20 -0700
  r6279 at Thesaurus (orig r6278):  ribasushi | 2009-05-16 08:36:45 +0200
  Rename tests
 
 r4156 at hlagh (orig r6331):  ribasushi | 2009-05-19 10:36:37 -0700
  r6284 at Thesaurus (orig r6283):  ribasushi | 2009-05-16 10:40:44 +0200
  Test and fixed for paged grouped count
 
 r4157 at hlagh (orig r6332):  ribasushi | 2009-05-19 10:38:00 -0700
  r6301 at Thesaurus (orig r6300):  ribasushi | 2009-05-18 19:32:42 +0200
  pager optimization
 
 r4158 at hlagh (orig r6333):  ribasushi | 2009-05-19 10:39:27 -0700
  r6321 at Thesaurus (orig r6320):  ribasushi | 2009-05-19 18:11:00 +0200
  Make select always equal group by on count subqueries
  Make sure offset does not increment boundlessly on every _resolved_attrs run
 
 r4159 at hlagh (orig r6334):  ribasushi | 2009-05-19 10:39:34 -0700
  r6323 at Thesaurus (orig r6322):  ribasushi | 2009-05-19 19:26:21 +0200
  Make sure pg test can restart after half-way failures
 
 r4160 at hlagh (orig r6335):  ribasushi | 2009-05-19 10:39:42 -0700
  r6324 at Thesaurus (orig r6323):  ribasushi | 2009-05-19 19:34:19 +0200
  Hide resultsource methods that should have never been documented
 
 r4161 at hlagh (orig r6336):  ribasushi | 2009-05-19 10:42:59 -0700
 Add files dropped by the screwed up merge - I suck
 r4162 at hlagh (orig r6337):  ribasushi | 2009-05-19 10:43:56 -0700
 Adjust dependencies - most of them pull in bugfixes
 r4163 at hlagh (orig r6338):  ribasushi | 2009-05-19 10:52:39 -0700
 Make podcoverage happy (deprecated, undocumented methods)
 r4164 at hlagh (orig r6339):  ribasushi | 2009-05-19 11:46:40 -0700
 Simplify __count() - explicitly specify which attributes to copy, instead of deleting a whole bunch of them
 r4166 at hlagh (orig r6341):  dandv | 2009-05-19 17:56:57 -0700
 Tiny POD formatting fix
 r4167 at hlagh (orig r6342):  caelum | 2009-05-19 20:11:12 -0700
 add mysql lost password faq
 r4168 at hlagh (orig r6343):  caelum | 2009-05-19 20:58:36 -0700
 add test for distinct result of sql function
 r4311 at hlagh (orig r6344):  ribasushi | 2009-05-20 00:03:08 -0700
 Make joined rs counts backwards compatible - we do not collapse a result exploded by a has_many join unless it is explicitly requested by distinct => 1, OR unless we have collapse set which implies prefetch
 r4312 at hlagh (orig r6346):  ribasushi | 2009-05-20 03:44:54 -0700
 detect/purge having bind for compeleteness
 r4313 at hlagh (orig r6347):  ribasushi | 2009-05-20 03:51:05 -0700
 Bring back the old code from resolve_prefetch so ash's code can work
 Add tests to make sure we throw it away in 09
 r4314 at hlagh (orig r6348):  ribasushi | 2009-05-20 05:30:40 -0700
 Add explicit grouping for rs update/delete operations if the parameters warrant it (tests coming tonight)
 r4315 at hlagh (orig r6349):  ribasushi | 2009-05-20 06:32:27 -0700
 Make sure we always work with resolved rs attributes while counting (and test)
 r4316 at hlagh (orig r6350):  ribasushi | 2009-05-20 06:42:48 -0700
 More explicit attribute deletion/detection - a lof of this is probably redundant, as _resoved_attrs() should flatten them away (i.e. prefetch to collapse and distinct to group_by). Nevertheless keep them there for explcetness ( delete() is cheap )
 r4317 at hlagh (orig r6351):  arcanez | 2009-05-20 08:04:17 -0700
 update to Changes
 r4318 at hlagh (orig r6352):  arcanez | 2009-05-20 08:06:50 -0700
 fix for sql functions in group_by
 r4319 at hlagh (orig r6353):  frew | 2009-05-20 09:03:55 -0700
 fix test for people with spaces in path
 r4320 at hlagh (orig r6354):  ribasushi | 2009-05-20 13:59:10 -0700
 POD fixes
 r4321 at hlagh (orig r6355):  ribasushi | 2009-05-20 14:00:13 -0700
 Switch as_query testing to direct specification in is_same_sql_bind
 r4322 at hlagh (orig r6356):  ribasushi | 2009-05-20 14:47:05 -0700
 on_connect_do now accepts a single string like it does an arrayref (patch by prema)
 r4323 at hlagh (orig r6357):  ribasushi | 2009-05-21 00:45:52 -0700
 Clarify usage of _resolved_attrs by adding the explicit _resolved_attrs_copy
 Clarify code in ResultSetColumn
 r4324 at hlagh (orig r6358):  ribasushi | 2009-05-21 00:59:50 -0700
 Duh, no point of having ordered subqueries while counting, Debolaz++
 r4327 at hlagh (orig r6366):  caelum | 2009-05-21 19:54:12 -0700
 add some support for trying to determine storage driver without being connected
 r4328 at hlagh (orig r6367):  caelum | 2009-05-21 21:52:47 -0700
 comment addition
 r4329 at hlagh (orig r6368):  caelum | 2009-05-21 23:09:05 -0700
 fix limit for DB2
 r4330 at hlagh (orig r6369):  ribasushi | 2009-05-22 01:28:58 -0700
 Extend DB2 test
 r4331 at hlagh (orig r6370):  ribasushi | 2009-05-22 01:31:25 -0700
 Some attributes require a grouped count subquery, some - just a subquery. Differentiate properly
 r4332 at hlagh (orig r6371):  ribasushi | 2009-05-22 01:35:36 -0700
 duh
 r4334 at hlagh (orig r6373):  caelum | 2009-05-22 06:50:45 -0700
 ::Replicated -- check for master rebless and reapply role if necessary
 r4336 at hlagh (orig r6375):  ash | 2009-05-22 09:54:00 -0700
 Make distinct calculate columns *after* prefetch has been resolved. Tests to come
 
 r4339 at hlagh (orig r6379):  ribasushi | 2009-05-23 01:09:46 -0700
 Refactor rs_update_delete (too many methods for no reason)
 Make mysql use _per_row_update_delete by default as this is the only thing it understands: http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html
 r4340 at hlagh (orig r6380):  caelum | 2009-05-23 07:44:59 -0700
 Sybase autopk, and a test, no limit support yet
 r4341 at hlagh (orig r6381):  ribasushi | 2009-05-23 12:33:28 -0700
 Tests and test schema adjustments for resultset update/delete
 r4342 at hlagh (orig r6382):  ribasushi | 2009-05-23 12:35:59 -0700
 Add storage component of multipk resultset update/delete for multicolumn IN capable rdbms
 Switch Pg to that (tested via DBICTEST_DSN)
 r4343 at hlagh (orig r6383):  caelum | 2009-05-23 12:46:11 -0700
 Sybase bindvar and IC::DT support
 r4344 at hlagh (orig r6384):  caelum | 2009-05-23 12:57:08 -0700
 hide internal Sybase classes from PAUSE
 r4346 at hlagh (orig r6386):  caelum | 2009-05-23 13:28:42 -0700
 revert last Sybase changes
 r4349 at hlagh (orig r6389):  ribasushi | 2009-05-23 13:59:17 -0700
 Extra test and count fixes for prefetch + distinct
 r4350 at hlagh (orig r6390):  caelum | 2009-05-23 14:04:01 -0700
 minor clean up
 r4351 at hlagh (orig r6391):  ribasushi | 2009-05-23 14:37:19 -0700
 Make sure MultiColumnIn quotes column names while munging literal sql
 Tested by running t/resultset/update_delete against pg with quote char " and name sep .
 r4352 at hlagh (orig r6392):  ribasushi | 2009-05-23 15:47:40 -0700
 update changes
 r4353 at hlagh (orig r6393):  ribasushi | 2009-05-23 15:50:08 -0700
 Extend distinct deprecation tests and clarify warnings
 r4355 at hlagh (orig r6395):  ribasushi | 2009-05-24 01:47:03 -0700
 MSSQL through ODBC does not like unfinished statements - make sure we finish the scope identity retrieval
 (This worked before because of the automatic retry on exception, essentially running any select after insert twice)
 r4356 at hlagh (orig r6396):  ribasushi | 2009-05-24 02:42:01 -0700
 Make sure we do not clobber search attributes when using subqueries
 r4357 at hlagh (orig r6397):  ribasushi | 2009-05-24 02:43:32 -0700
 SUPER is so last century
 r4358 at hlagh (orig r6398):  ribasushi | 2009-05-24 05:12:39 -0700
 Deprecate ::DBI::Sybase::MSSQL
 r4359 at hlagh (orig r6399):  ribasushi | 2009-05-24 06:00:50 -0700
 eol adjustments
 r4360 at hlagh (orig r6400):  ribasushi | 2009-05-24 06:07:45 -0700
 Switch trunk to native eol-style
 r4361 at hlagh (orig r6401):  ribasushi | 2009-05-24 06:35:07 -0700
 Failing test about warnings triggered in SQLA::Limit when using a subquery
 r4365 at hlagh (orig r6405):  ribasushi | 2009-05-24 13:53:15 -0700
 Switch around inheritance of MSSQL drivers, remove some duplicate code
 r4366 at hlagh (orig r6406):  caelum | 2009-05-24 16:49:17 -0700
 fix double connect for ODBC/MSSQL
 r4367 at hlagh (orig r6407):  caelum | 2009-05-24 16:53:12 -0700
 added test to make sure only one connection to ODBC/MSSQL is made
 r4520 at hlagh (orig r6410):  ribasushi | 2009-05-24 23:48:38 -0700
 Factor out the order_by sqlahacks resolver
 r4521 at hlagh (orig r6411):  ribasushi | 2009-05-25 00:42:45 -0700
 Move the DB2 Limit syntax setting into the storage class
 r4522 at hlagh (orig r6412):  ribasushi | 2009-05-25 00:47:01 -0700
 Forgotten podcoverage override
 r4523 at hlagh (orig r6413):  ribasushi | 2009-05-25 02:11:01 -0700
 Define how Top limit emulation should behave
 r5249 at hlagh (orig r6418):  ribasushi | 2009-05-25 07:53:13 -0700
 Actually don't need this anymore
 r5251 at hlagh (orig r6420):  tomboh | 2009-05-25 09:33:46 -0700
 Small documentation improvement:  link to a documented method.
 r5253 at hlagh (orig r6422):  ribasushi | 2009-05-25 10:42:02 -0700
 This method does not exist anymore
 r5254 at hlagh (orig r6426):  ribasushi | 2009-05-25 23:15:34 -0700
 TODOified test for RT#40701
 r5256 at hlagh (orig r6428):  ash | 2009-05-26 07:17:44 -0700
 Fix 'timestamp with time zone' columns for IC::DT inflation
 
 r5258 at hlagh (orig r6430):  ribasushi | 2009-05-26 07:29:55 -0700
  r6415 at Thesaurus (orig r6414):  ribasushi | 2009-05-25 11:18:05 +0200
  Yet another branch to attempt a top fix
  r6416 at Thesaurus (orig r6415):  ribasushi | 2009-05-25 11:24:32 +0200
  The Top limit emulation bundled with SQLA::Limit assumes that the limited resultset will be _always_ sorted. In order to fix this, I reimplemented _Top in SQLAHacks with a slight modification. Now the original order_by is passed to the outside of the nested select block, while order_up/down are calculated either based on the original order_by, or if one is not present an order by all PKs is attempted.
  Since I do not have access to $rsrc in SQLA, I pass the list of PKs as an extra group_by hash entry. This appears to be rather safe, and besides we already pollute order_by with group_by and having (which seems to work rather well).
  The only thing I am unsure about is the need for _gen_virtual_order(). Initially I was going to generate the pk list, only if we use the Top limit. Then it turned out there is no limit dialect before we connect, so I commented it out. Now all it does is check for a limit condition and returns the PK list. Is this necessary at all?
  r6417 at Thesaurus (orig r6416):  ribasushi | 2009-05-25 16:08:40 +0200
  Shoot another Top problem, move test from top_limit_tweaks branch and delete
  r6420 at Thesaurus (orig r6419):  ribasushi | 2009-05-25 17:45:33 +0200
  Too much logic for no benefit - always populate _virtual_order_by
 
 r5260 at hlagh (orig r6432):  ribasushi | 2009-05-26 07:36:55 -0700
 Fix test skip message
 r5261 at hlagh (orig r6433):  ribasushi | 2009-05-26 08:20:57 -0700
 Minor fixes of the return value of rs->update/delete
 r5262 at hlagh (orig r6434):  ribasushi | 2009-05-26 11:49:49 -0700
 fix comments
 r5263 at hlagh (orig r6435):  ribasushi | 2009-05-26 12:28:49 -0700
 Attempt to reproduce reported mysql error (failed) - fixed another bug in ResultSetColumn along the way
 r5264 at hlagh (orig r6436):  ribasushi | 2009-05-26 13:02:29 -0700
 Release 0.08103
 r5288 at hlagh (orig r6446):  ribasushi | 2009-05-28 01:20:57 -0700
 Commit rather useless but already written mysql test extension
 r5289 at hlagh (orig r6447):  ribasushi | 2009-05-28 04:02:22 -0700
 Fix multiprefetch warning - we can now count properly
 r5290 at hlagh (orig r6456):  ribasushi | 2009-05-29 22:40:24 -0700
 Patch + test for more informative exceptions on load_namespace a non-rs class
 r5291 at hlagh (orig r6457):  ribasushi | 2009-05-30 00:34:20 -0700
 Add better error reporting on bulk_insert (ash++)
 r5300 at hlagh (orig r6469):  ribasushi | 2009-05-30 10:46:09 -0700
 populate() fix and Changes
 r5301 at hlagh (orig r6470):  ribasushi | 2009-05-31 00:37:37 -0700
 M::I 0.89 finally resolves all provlems with auto_install
 r5302 at hlagh (orig r6471):  ribasushi | 2009-05-31 00:42:35 -0700
 Throw away the makefile SQLite test - it served its purpose
 r5303 at hlagh (orig r6472):  ribasushi | 2009-05-31 02:24:15 -0700
 There is a saner way to write out resources
 r5304 at hlagh (orig r6473):  ribasushi | 2009-05-31 07:07:18 -0700
 Last set of Makefile.PL optimizations
 r5305 at hlagh (orig r6474):  ribasushi | 2009-06-01 03:24:41 -0700
 deploy-related pod fixes
 r5307 at hlagh (orig r6476):  ribasushi | 2009-06-01 07:40:22 -0700
  r6462 at Thesaurus (orig r6461):  mo | 2009-05-30 11:06:54 +0200
  order_by tests
 
 r5308 at hlagh (orig r6477):  ribasushi | 2009-06-01 07:40:30 -0700
  r6463 at Thesaurus (orig r6462):  ribasushi | 2009-05-30 16:54:37 +0200
  TODOify some of the order with bind tests
 
 r5309 at hlagh (orig r6478):  ribasushi | 2009-06-01 07:40:41 -0700
  r6464 at Thesaurus (orig r6463):  ribasushi | 2009-05-30 16:55:37 +0200
  Restructure bind tests
 
 r5310 at hlagh (orig r6479):  ribasushi | 2009-06-01 07:40:50 -0700
  r6465 at Thesaurus (orig r6464):  ribasushi | 2009-05-30 17:15:57 +0200
  Greatly simplify _order_by override to fallback on new SQLA
 
 r5311 at hlagh (orig r6480):  ribasushi | 2009-06-01 07:40:56 -0700
  r6467 at Thesaurus (orig r6466):  ribasushi | 2009-05-30 19:13:23 +0200
  Evil hack to make Carp::Clan work throughout SQLA as well
 
 r5312 at hlagh (orig r6481):  ribasushi | 2009-06-01 07:41:42 -0700
  r6468 at Thesaurus (orig r6467):  ribasushi | 2009-05-30 19:17:02 +0200
  Add changes
 
 r5313 at hlagh (orig r6482):  ribasushi | 2009-06-01 07:41:49 -0700
 
 r5315 at hlagh (orig r6484):  ribasushi | 2009-06-01 07:49:09 -0700
 Fix fallout from another botched merge (I suck, part 2)
 r5317 at hlagh (orig r6486):  ribasushi | 2009-06-03 01:14:51 -0700
 Require a recent version of Date::Simple during CDBI tests
 r5325 at hlagh (orig r6495):  ribasushi | 2009-06-04 00:35:25 -0700
 Move relationship tests around
 r5328 at hlagh (orig r6498):  ribasushi | 2009-06-04 02:52:18 -0700
 Delegate actual counting to the storage class
 r5334 at hlagh (orig r6501):  ribasushi | 2009-06-04 06:38:21 -0700
 Really delegate counting to the storage class - now we have either a grouped count or a regular one
 r5341 at hlagh (orig r6508):  ribasushi | 2009-06-04 13:54:28 -0700
 having without group_by is useless - thus do not supply a group_by on count, let things die
 r5343 at hlagh (orig r6510):  ribasushi | 2009-06-04 14:51:13 -0700
 It seems that this localisation can lead to problems
 Unfortunately no test case as the trigger was buried deep within Reaction, I coulnd't figure out an isolation



Property changes on: DBIx-Class/0.08/branches/sybase_noquote
___________________________________________________________________
Name: svn:ignore
   - _build
blib
pm_to_blib
Build
Build.bat
Makefile
Makefile.old
inc
README
META.yml
MANIFEST


   + _build
blib
pm_to_blib
Build
Build.bat
Makefile
Makefile.old
inc
README
META.yml
MANIFEST
MANIFEST.bak

Name: svk:merge
   - 168d5346-440b-0410-b799-f706be625ff1:/DBIx-Class-current:2207
462d4d0c-b505-0410-bf8e-ce8f877b3390:/local/bast/DBIx-Class:3159
4d5fae46-8e6a-4e08-abee-817e9fb894a2:/local/bast/DBIx-Class/0.08/branches/resultsetcolumn_custom_columns:5160
4d5fae46-8e6a-4e08-abee-817e9fb894a2:/local/bast/DBIx-Class/0.08/branches/sqla_1.50_compat:5414
4d5fae46-8e6a-4e08-abee-817e9fb894a2:/local/bast/DBIx-Class/0.08/trunk:5635
9c88509d-e914-0410-b01c-b9530614cbfe:/local/DBIx-Class:32260
9c88509d-e914-0410-b01c-b9530614cbfe:/local/DBIx-Class-CDBICompat:54993
9c88509d-e914-0410-b01c-b9530614cbfe:/vendor/DBIx-Class:31122
ab17426e-7cd3-4704-a2a2-80b7c0a611bb:/local/dbic_column_attr:10946
ab17426e-7cd3-4704-a2a2-80b7c0a611bb:/local/dbic_trunk:10954
bd5ac9a7-f185-4d95-9186-dbb8b392a572:/local/os/bast/DBIx-Class/0.08/trunk:2798
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/belongs_to_null_col_fix:5244
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/cdbicompat_integration:4160
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/column_attr:5074
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/complex_join_rels:4589
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/file_column:3920
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/multi_stuff:5565
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/on_disconnect_do:3694
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/oracle_sequence:4173
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/parser_fk_index:4485
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/replication_dedux:4600
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/rt_bug_41083:5437
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/savepoints:4223
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/sqla_1.50_compat:5321
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/storage-ms-access:4142
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/subquery:5617
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/sybase:5651
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/versioned_enhancements:4125
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/versioning:4578
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/views:5585
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-C3:318
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-current:2222
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-joins:173
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-resultset:570
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/datetime:1716
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/find_compat:1855
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/find_unique_query_fixes:2142
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/inflate:1988
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/many_to_many:2025
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/re_refactor_bugfix:1944
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/reorganize_tests:1827
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset-new-refactor:1766
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset_2_electric_boogaloo:2175
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset_cleanup:2102
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/sqlt_tests_refactor:2043
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/trunk/DBIx-Class:3606
fe160bb6-dc1c-0410-9f2b-d64a711b54a5:/local/DBIC-trunk-0.08:10510
   + 168d5346-440b-0410-b799-f706be625ff1:/DBIx-Class-current:2207
462d4d0c-b505-0410-bf8e-ce8f877b3390:/local/bast/DBIx-Class:3159
4d5fae46-8e6a-4e08-abee-817e9fb894a2:/local/bast/DBIx-Class/0.08/branches/resultsetcolumn_custom_columns:5160
4d5fae46-8e6a-4e08-abee-817e9fb894a2:/local/bast/DBIx-Class/0.08/branches/sqla_1.50_compat:5414
4d5fae46-8e6a-4e08-abee-817e9fb894a2:/local/bast/DBIx-Class/0.08/trunk:5969
9c88509d-e914-0410-b01c-b9530614cbfe:/local/DBIx-Class:32260
9c88509d-e914-0410-b01c-b9530614cbfe:/local/DBIx-Class-CDBICompat:54993
9c88509d-e914-0410-b01c-b9530614cbfe:/vendor/DBIx-Class:31122
ab17426e-7cd3-4704-a2a2-80b7c0a611bb:/local/dbic_column_attr:10946
ab17426e-7cd3-4704-a2a2-80b7c0a611bb:/local/dbic_trunk:11142
bd5ac9a7-f185-4d95-9186-dbb8b392a572:/local/os/bast/DBIx-Class/0.08/trunk:2798
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/belongs_to_null_col_fix:5244
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/cdbicompat_integration:4160
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/column_attr:5074
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/complex_join_rels:4589
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/count_distinct:6218
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/diamond_relationships:6310
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/file_column:3920
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/fix-update-and-delete-as_query:6162
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/joined_count:6323
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/multi_stuff:5565
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/on_disconnect_do:3694
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/oracle-tweaks:6222
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/oracle_sequence:4173
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/order_by_refactor:6475
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/parser_fk_index:4485
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/prefetch:5699
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/replication_dedux:4600
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/rt_bug_41083:5437
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/savepoints:4223
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/sqla_1.50_compat:5321
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/storage-ms-access:4142
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/storage-tweaks:6262
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/subclassed_rsset:5930
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/subquery:5617
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/sybase:5651
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/sybase_mssql:6125
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/top_limit_altfix:6429
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/versioned_enhancements:4125
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/versioning:4578
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/views:5585
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/trunk:6510
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-C3:318
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-current:2222
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-joins:173
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-resultset:570
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/datetime:1716
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/find_compat:1855
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/find_unique_query_fixes:2142
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/inflate:1988
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/many_to_many:2025
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/re_refactor_bugfix:1944
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/reorganize_tests:1827
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset-new-refactor:1766
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset_2_electric_boogaloo:2175
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset_cleanup:2102
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/sqlt_tests_refactor:2043
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/trunk/DBIx-Class:3606
fe160bb6-dc1c-0410-9f2b-d64a711b54a5:/local/DBIC-trunk-0.08:10510

Modified: DBIx-Class/0.08/branches/sybase_noquote/Changes
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/Changes	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/Changes	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,5 +1,83 @@
 Revision history for DBIx::Class
 
+        - order_by now can take \[$sql, @bind] as in
+          order_by => { -desc => \['colA LIKE ?', 'somestring'] }
+        - SQL::Abstract errors are now properly croak()ed with the
+          correct trace
+        - populate() now properly reports the dataset slice in case of
+          an exception
+        - fixed corner case when populate() erroneously falls back to
+          create()
+
+0.08103 2009-05-26 19:50:00 (UTC)
+        - Multiple $resultset -> count/update/delete fixes. Now any
+          of these operations will succeed, regardless of the complexity
+          of $resultset. distinct, group_by, join, prefetch are all
+          supported with expected results
+        - Return value of $rs->delete is now the storage return value
+          and not 1 as it used to be
+        - don't pass SQL functions into GROUP BY
+        - Remove MultiDistinctEmulation.pm, effectively deprecating
+          { select => { distinct => [ qw/col1 col2/ ] } }
+        - Change ->count code to work correctly with DISTINCT (distinct => 1)
+          via GROUP BY
+        - Removed interpolation of bind vars for as_query - placeholders
+          are preserved and nested query bind variables are properly 
+          merged in the correct order
+        - Refactor DBIx::Class::Storage::DBI::Sybase to automatically 
+          load a subclass, namely Microsoft_SQL_Server.pm
+          (similar to DBIx::Class::Storage::DBI::ODBC)
+        - Refactor InflateColumn::DateTime to allow components to
+          circumvent DateTime parsing
+        - Support inflation of timestamp datatype
+        - Support BLOB and CLOB datatypes on Oracle
+        - Storage::DBI::Replicated::Balancer::Random:
+          added master_read_weight
+        - Storage::DBI::Replicated: storage opts from connect_info,
+          connect_info merging to replicants, hashref connect_info support,
+          improved trace output, other bug fixes/cleanups
+        - distinct => 1 with prefetch now groups by all columns
+        - on_connect_do accepts a single string equivalent to a one
+          element arrayref (RT#45159)
+        - DB2 limit + offset now works correctly
+        - Sybase now supports autoinc PKs (RT#40265)
+        - Prefetch on joins over duplicate relations now works
+          correctly (RT#28451)
+        - "timestamp with time zone" columns (for Pg) now get inflated with a
+          time zone information preserved
+        - MSSQL Top limit-emulation improvements (GROUP BY and subquery support)
+        - ResultSetColumn will not lose the joins infered from a parent
+          resultset prefetch
+
+0.08102 2009-04-30 08:29:00 (UTC)
+        - Fixed two subtle bugs when using columns or select/as
+          paired with a join (limited prefetch)
+        - Fixed breakage of cdbi tests (RT#45551)
+        - Some POD improvements
+
+0.08101 2009-04-27 09:45:00 (UTC)
+        - Fix +select, +as, +columns and include_columns being stripped
+          by $rs->get_column
+        - move load_optional_class from DBIx::Class::Componentised to
+          Class::C3::Componentised, bump dependency
+        - register_extra_source() now *really* fixed wrt subclassing
+        - Added missing POD descriptions (RT#45195)
+        - Fix insert() to not store_column() every present object column
+        - Multiple Makefile.PL fixes
+
+0.08100 2009-04-19 11:39:35 (UTC)
+        - Todo out the register_extra_source test until after shipping
+
+0.08099_08 2009-03-30 00:00:00 (UTC)
+        - Fixed taint mode with load_namespaces
+        - Putting IC::DateTime locale, timezone or floating_tz_ok attributes into
+          extra => {} has been deprecated. The new way is to put these things
+          directly into the columns definition
+        - Switched MI code to MRO::Compat
+        - Document db-side default_value caveats
+        - Search_like() now warns to indicate deprecation in 0.09.
+        - TxnScopeGuard left experimental state
+
 0.08099_07 2009-02-27 02:00:00 (UTC)
         - multi-create using find_or_create rather than _related for post-insert
         - fix get_inflated_columns to check has_column_loaded
@@ -9,15 +87,15 @@
           - not try and insert things tagged on via new_related unless required
         - Possible to set locale in IC::DateTime extra => {} config
         - Calling the accessor of a belongs_to when the foreign_key
-          was NULL and the row was not stored would unexpectedly fail (groditi)
+          was NULL and the row was not stored would unexpectedly fail 
         - Split sql statements for deploy only if SQLT::Producer returned a scalar
           containing all statements to be executed
         - Add as_query() for ResultSet and ResultSetColumn. This makes subqueries
-          possible. See the Cookbook for details. (robkinyon, michaelr)
+          possible. See the Cookbook for details.
         - Massive rewrite of Ordered to properly handle position constraints and
           to make it more matpath-friendly
         - deploy_statements called ddl_filename with the $version and $dir arguments
-          in the wrong order. (groditi)
+          in the wrong order.
         - columns/+columns attributes now support { as => select } hahsrefs
         - support for views both in DBIC and via deploy() in SQLT
 
@@ -37,15 +115,15 @@
         - new order_by => { -desc => 'colname' } syntax supported
         - PG array datatype supported
         - insert should use store_column, not set_column to avoid marking
-          clean just-stored values as dirty. New test for this (groditi)
-        - regression test for source_name (groditi)
+          clean just-stored values as dirty. New test for this 
+        - regression test for source_name 
 
 0.08099_05 2008-10-30 21:30:00 (UTC)
-        - Rewritte of Storage::DBI::connect_info(), extended with an
+        - Rewrite of Storage::DBI::connect_info(), extended with an
           additional argument format type
         - InflateColumn::DateTime: add warning about floating timezone
         - InflateColumn::DateTime: possible to enforce/skip inflation
-        - delete throws exception if passed arguments to prevent drunken mishaps. (purge)
+        - delete throws exception if passed arguments to prevent drunken mishaps.
         - Fix storage to copy scalar conds before regexping to avoid
           trying to modify a constant in odd edge cases
         - Related resultsets on uninserted objects are now empty


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/Changes
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/Features_09
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/MANIFEST.SKIP
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/MANIFEST.SKIP	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/MANIFEST.SKIP	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,3 +1,6 @@
+^(?!script/|examples/|lib/|inc/|t/|Makefile.PL$|README$|MANIFEST$|Changes$|META.yml$)
+
+
 # Avoid version control files.
 \bRCS\b
 \bCVS\b


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/MANIFEST.SKIP
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/Makefile.PL
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/Makefile.PL	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/Makefile.PL	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,4 +1,4 @@
-use inc::Module::Install 0.67;
+use inc::Module::Install 0.89;
 use strict;
 use warnings;
 use POSIX ();
@@ -9,30 +9,31 @@
 perl_version '5.006001';
 all_from 'lib/DBIx/Class.pm';
 
+requires 'DBD::SQLite'              => 1.25;
 requires 'Data::Page'               => 2.00;
-requires 'Scalar::Util'             => 0;
-requires 'SQL::Abstract'            => 1.49;
+requires 'SQL::Abstract'            => 1.56;
 requires 'SQL::Abstract::Limit'     => 0.13;
-requires 'Class::C3'                => 0.20;
-requires 'Class::C3::Componentised' => 0;
-requires 'Storable'                 => 0;
-requires 'Carp::Clan'               => 0;
-requires 'DBI'                      => 1.40;
-requires 'Module::Find'             => 0;
-requires 'Class::Inspector'         => 0;
-requires 'Class::Accessor::Grouped' => 0.08002;
-requires 'JSON::Any'                => 1.17;
+requires 'Class::C3::Componentised' => 1.0005;
+requires 'Carp::Clan'               => 6.0;
+requires 'DBI'                      => 1.605;
+requires 'Module::Find'             => 0.06;
+requires 'Class::Inspector'         => 1.24;
+requires 'Class::Accessor::Grouped' => 0.08003;
+requires 'JSON::Any'                => 1.18;
 requires 'Scope::Guard'             => 0.03;
-requires 'Path::Class'              => 0;
-requires 'List::Util'               => 1.19;
+requires 'Path::Class'              => 0.16;
 requires 'Sub::Name'                => 0.04;
+requires 'MRO::Compat'              => 0.09;
 
+# Core
+requires 'List::Util'               => 0;
+requires 'Scalar::Util'             => 0;
+requires 'Storable'                 => 0;
+
 # Perl 5.8.0 doesn't have utf8::is_utf8()
-requires 'Encode'                   => 0 if ($] <= 5.008000);  
+requires 'Encode'                   => 0 if ($] <= 5.008000);
 
-# configure_requires so the sanity check below can run
-configure_requires 'DBD::SQLite'    => 1.14;
-
+test_requires 'Test::More'          => 0.82;
 test_requires 'Test::Builder'       => 0.33;
 test_requires 'Test::Warn'          => 0.11;
 test_requires 'Test::Exception'     => 0;
@@ -40,10 +41,20 @@
 
 recommends 'SQL::Translator'        => 0.09004;
 
-install_script 'script/dbicadmin';
+install_script (qw|
+    script/dbicadmin
+|);
 
-tests_recursive 't';
+tests_recursive (qw|
+    t
+|);
 
+resources 'IRC'         => 'irc://irc.perl.org/#dbix-class';
+resources 'license'     => 'http://dev.perl.org/licenses/';
+resources 'repository'  => 'http://dev.catalyst.perl.org/svnweb/bast/browse/DBIx-Class/';
+resources 'MailingList' => 'http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class';
+
+
 # re-build README and require extra modules for testing if we're in a checkout
 
 my %force_requires_if_author = (
@@ -52,28 +63,52 @@
 
   # CDBI-compat related
   'DBIx::ContextualFetch'     => 0,
+  'Class::DBI::Plugin::DeepAbstractSearch' => 0,
   'Class::Trigger'            => 0,
-  'Time::Piece'               => 0,
+  'Time::Piece::MySQL'        => 0,
   'Clone'                     => 0,
+  'Date::Simple'              => 3.03,
 
   # t/52cycle.t
   'Test::Memory::Cycle'       => 0,
 
   # t/60core.t
   'DateTime::Format::MySQL'   => 0,
+  
+  # t/89inflate_datetime.t
+  'DateTime::Format::Pg'      => 0,
 
+  # t/72pg.t
+  $ENV{DBICTEST_PG_DSN}
+    ? ('Sys::SigAction'=> 0)
+    : ()
+  ,
+
   # t/93storage_replication.t
-  'Moose',                    => 0,
-  'MooseX::AttributeHelpers'  => 0.12,
+  'Moose',                        => 0.77,
+  'MooseX::AttributeHelpers'      => 0.12,
+  'MooseX::Types',                => 0.10,
+  'namespace::clean'              => 0.11,
+  'Hash::Merge',                  => 0.11,
 
   # t/96_is_deteministic_value.t
   'DateTime::Format::Strptime' => 0,
 );
 
 if ($Module::Install::AUTHOR) {
+  warn <<'EOW';
+******************************************************************************
+******************************************************************************
+***                                                                        ***
+*** AUTHOR MODE: all optional test dependencies converted to hard requires ***
+***                                                                        ***
+******************************************************************************
+******************************************************************************
 
+EOW
+
   foreach my $module (keys %force_requires_if_author) {
-    requires ($module => $force_requires_if_author{$module});
+    build_requires ($module => $force_requires_if_author{$module});
   }
 
   system('pod2text lib/DBIx/Class.pm > README');
@@ -83,129 +118,15 @@
 
 auto_install;
 
-# Have all prerequisites, check DBD::SQLite sanity
-if (! $ENV{DBICTEST_NO_SQLITE_CHECK} ) {
-
-  my $pid = fork();
-  if (not defined $pid) {
-      die "Unable to fork(): $!";
-  }
-  elsif (! $pid) {
-
-      # Win32 does not have real fork()s so a segfault will bring
-      # everything down. Warn about it.
-      if ($^O eq 'MSWin32') {
-        print <<'EOW';
-
-######################################################################
-#                                                                    #
-# A short stress-testing of DBD::SQLite will follow. If you have a   #
-# buggy library this might very well be the last text you will see   #
-# before the installation silently terminates. If this happens it    #
-# would mean that you are running a buggy version of DBD::SQLite     #
-# known to randomly segfault on errors. Even if you have the latest  #
-# CPAN module version, the system sqlite3 dynamic library might have #
-# been compiled against an older buggy sqlite3 dev library (oddly    #
-# DBD::SQLite will prefer the system library against the one bundled #
-# with it). You are strongly advised to resolve this issue before    #
-# proceeding.                                                        #
-#                                                                    #
-# If this happens to you (this text is the last thing you see), and  #
-# you just want to install this module without worrying about the    #
-# tests (which will almost certainly fail) - set the environment     #
-# variable DBICTEST_NO_SQLITE_CHECK to a true value and try again.   #
-#                                                                    #
-######################################################################
-
-EOW
-      }
-
-      require DBI;
-      for (1 .. 100) {
-          my $dbh;
-          $dbh = DBI->connect ('dbi:SQLite::memory:', undef, undef, {
-              AutoCommit => 1,
-              RaiseError => 0,
-              PrintError => 0,
-          })
-              or die "Unable to connect to database: $@";
-          $dbh->do ('CREATE TABLE name_with_no_columns');   # a subtle syntax error
-          $dbh->do ('COMMIT');                              # followed by commit
-          $dbh->disconnect;
-      }
-
-      exit 0;
-  }
-  else {
-      eval {
-          local $SIG{ALRM} = sub { die "timeout\n" };
-          alarm 5;
-          wait();
-          alarm 0;
-      };
-      my $exception = $@;
-
-      my $sig = $? & 127;
-
-# make sure process actually dies
-      $exception && kill POSIX::SIGKILL(), $pid;
-
-      if ($exception || $sig == POSIX::SIGSEGV() || $sig == POSIX::SIGABRT()
-        || $sig == 7) { # 7 == SIGBUS, haven't seen it but just in case
-          warn (<<EOE);
-
-############################### WARNING #################################
-#                                                                       #
-# You are running a buggy version of DBD::SQLite known to randomly      #
-# segfault on errors.  Even if you have the latest CPAN module version, #
-# the sqlite3 dynamic library on this system might have been compiled   #
-# against an older buggy sqlite3 dev library (oddly DBD::SQLite will    #
-# prefer the system library against the one bundled with it). You are   #
-# strongly advised to resolve this issue before proceeding.             #
-#                                                                       #
-#########################################################################
-
-EOE
-          my $ans = prompt (
-            "The test suite of this module is almost certain to fail.\n"
-            . 'Do you really want to continue?',
-            'no',
-          );
-          exit 0 unless ($ans =~ /^y(es)?$/i);
-      }
-  }
-}
-
-
 WriteAll();
 
-
+# Re-write META.yml to _exclude_ all forced requires (we do not want to ship this)
 if ($Module::Install::AUTHOR) {
-  # Need to do this _after_ WriteAll else it looses track of them
-  Meta->{values}{build_requires} = [ grep {
-    my $ok = 1;
-    foreach my $module (keys %force_requires_if_author) {
-      if ($_->[0] =~ /$module/) {
-        $ok = 0;
-        last;
-      }
-    }
-    $ok;
-  } @{Meta->{values}{build_requires}} ];
 
-  my @scalar_keys = Module::Install::Metadata::Meta_TupleKeys();
-  my $cr = Module::Install::Metadata->can("Meta_TupleKeys");
-  {
-    no warnings 'redefine';
-    *Module::Install::Metadata::Meta_TupleKeys = sub {
-      return $cr->(@_), 'resources';
-    };
-  }
-  Meta->{values}{resources} = [ 
-    [ 'MailingList', 'http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class' ],
-    [ 'IRC', 'irc://irc.perl.org/#dbix-class' ],
-    [ 'license', 'http://dev.perl.org/licenses/' ],
-    [ 'repository', 'http://dev.catalyst.perl.org/svnweb/bast/browse/DBIx-Class/' ],
+  Meta->{values}{build_requires} = [ grep 
+    { not exists $force_requires_if_author{$_->[0]} }
+    ( @{Meta->{values}{build_requires}} )
   ];
+
   Meta->write;
 }


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/Makefile.PL
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/TODO
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/MyDatabase/Main/Result/Artist.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/MyDatabase/Main/Result/Cd.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/MyDatabase/Main/Result/Track.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/MyDatabase/Main.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/db/example.sql
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/insertdb.pl
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/examples/Schema/testdb.pl
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/AccessorGroup.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/AbstractSearch.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/AbstractSearch.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/AbstractSearch.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -6,7 +6,7 @@
 
 =head1 NAME
 
-DBIx::Class::CDBICompat::AbstractSearch
+DBIx::Class::CDBICompat::AbstractSearch - Emulates Class::DBI::AbstractSearch
 
 =head1 SYNOPSIS
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/AbstractSearch.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/AccessorMapping.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/AttributeAPI.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/AutoUpdate.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnCase.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnGroups.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnGroups.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnGroups.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -155,7 +155,8 @@
   return map { $class->find_column($_) } @col;
 }
 
-package DBIx::Class::CDBICompat::ColumnGroups::GrouperShim;
+package # hide from PAUSE (should be harmless, no POD no Version)
+    DBIx::Class::CDBICompat::ColumnGroups::GrouperShim;
 
 sub groups_for {
   my ($self, @cols) = @_;
@@ -167,6 +168,5 @@
   }
   return keys %groups;
 }
-    
 
 1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnGroups.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnsAsHash.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnsAsHash.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnsAsHash.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -7,7 +7,7 @@
 
 =head1 NAME
 
-DBIx::Class::CDBICompat::ColumnsAsHash
+DBIx::Class::CDBICompat::ColumnsAsHash - Emulates the behavior of Class::DBI where the object can be accessed as a hash of columns.
 
 =head1 SYNOPSIS
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ColumnsAsHash.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Constraints.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Constructor.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Copy.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Copy.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Copy.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -8,7 +8,7 @@
 
 =head1 NAME
 
-DBIx::Class::CDBICompat::Copy
+DBIx::Class::CDBICompat::Copy - Emulates Class::DBI->copy($new_id)
 
 =head1 SYNOPSIS
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Copy.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/DestroyWarning.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/GetSet.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ImaDBI.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ImaDBI.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ImaDBI.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -55,7 +55,7 @@
         $self->throw_exception( "No relationship to JOIN from ${from_class} to ${to_class}" )
           unless $rel_obj;
         my $join = $from_class->storage->sql_maker->_join_condition(
-          $from_class->result_source_instance->resolve_condition(
+          $from_class->result_source_instance->_resolve_condition(
             $rel_obj->{cond}, $to, $from) );
         return $join;
       }


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ImaDBI.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Iterator.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Iterator.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Iterator.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -6,7 +6,7 @@
 
 =head1 NAME
 
-DBIx::Class::CDBICompat::Iterator
+DBIx::Class::CDBICompat::Iterator - Emulates the extra behaviors of the Class::DBI search iterator.
 
 =head1 SYNOPSIS
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Iterator.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/LazyLoading.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/LiveObjectIndex.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/LiveObjectIndex.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/LiveObjectIndex.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -51,15 +51,15 @@
 sub insert {
   my ($self, @rest) = @_;
   $self->next::method(@rest);
-  
+
   return $self if $self->nocache;
 
-    # Because the insert will die() if it can't insert into the db (or should)
-    # we can be sure the object *was* inserted if we got this far. In which
-    # case, given primary keys are unique and ID only returns a
-    # value if the object has all its primary keys, we can be sure there
-    # isn't a real one in the object index already because such a record
-    # cannot have existed without the insert failing.
+  # Because the insert will die() if it can't insert into the db (or should)
+  # we can be sure the object *was* inserted if we got this far. In which
+  # case, given primary keys are unique and ID only returns a
+  # value if the object has all its primary keys, we can be sure there
+  # isn't a real one in the object index already because such a record
+  # cannot have existed without the insert failing.
   if (my $key = $self->ID) {
     my $live = $self->live_object_index;
     weaken($live->{$key} = $self);
@@ -67,7 +67,7 @@
       if ++$self->live_object_init_count->{count}
               % $self->purge_object_index_every == 0;
   }
-  #use Data::Dumper; warn Dumper($self);
+
   return $self;
 }
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/LiveObjectIndex.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/NoObjectIndex.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/NoObjectIndex.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/NoObjectIndex.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -6,7 +6,7 @@
 
 =head1 NAME
 
-DBIx::Class::CDBICompat::NoObjectIndex
+DBIx::Class::CDBICompat::NoObjectIndex - Defines empty methods for object indexing. They do nothing
 
 =head1 SYNOPSIS
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/NoObjectIndex.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Pager.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Pager.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Pager.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,19 +1,19 @@
 package # hide from PAUSE
     DBIx::Class::CDBICompat::Pager;
-
+
 use strict;
 use warnings FATAL => 'all';
-
+
 *pager = \&page;
-
+
 sub page {
   my $class = shift;
-
+
   my $rs = $class->search(@_);
   unless ($rs->{attrs}{page}) {
     $rs = $rs->page(1);
   }
   return ( $rs->pager, $rs );
 }
-
+
 1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Pager.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/ReadOnly.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Relationship.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Relationship.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Relationship.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -7,7 +7,7 @@
 
 =head1 NAME
 
-DBIx::Class::CDBICompat::Relationship
+DBIx::Class::CDBICompat::Relationship - Emulate the Class::DBI::Relationship object returned from meta_info()
 
 =head1 DESCRIPTION
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Relationship.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Relationships.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Relationships.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Relationships.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -14,7 +14,7 @@
 
 =head1 NAME
 
-DBIx::Class::CDBICompat::Relationships
+DBIx::Class::CDBICompat::Relationships - Emulate has_a(), has_many(), might_have() and meta_info()
 
 =head1 DESCRIPTION
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Relationships.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Retrieve.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Retrieve.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Retrieve.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -50,11 +50,24 @@
 
   $cond =~ s/^\s*WHERE//i;
 
-  if( $cond =~ s/\bLIMIT (\d+)\s*$//i ) {
-      push @rest, { rows => $1 };
+  # Need to parse the SQL clauses after WHERE in reverse
+  # order of appearance.
+
+  my %attrs;
+
+  if( $cond =~ s/\bLIMIT\s+(\d+)\s*$//i ) {
+      $attrs{rows} = $1;
   }
 
-  return $class->search_literal($cond, @rest);
+  if ( $cond =~ s/\bORDER\s+BY\s+(.*)\s*$//i ) {
+      $attrs{order_by} = $1;
+  }
+
+  if( $cond =~ s/\bGROUP\s+BY\s+(.*)\s*$//i ) {
+      $attrs{group_by} = $1;
+  }
+
+  return $class->search_literal($cond, @rest, ( %attrs ? \%attrs : () ) );
 }
 
 sub construct {


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Retrieve.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/SQLTransformer.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Stringify.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/TempColumns.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat/Triggers.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/CDBICompat.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ClassResolver/PassThrough.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Componentised.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Componentised.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Componentised.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -17,7 +17,7 @@
       foreach my $first_comp (@comps) {
         if ($to eq 'DBIx::Class::Core' &&
             $target->isa("DBIx::Class::${first_comp}")) {
-          warn "Possible incorrect order of components in ".
+          carp "Possible incorrect order of components in ".
                "${target}::load_components($first_comp) call: Core loaded ".
                "before $first_comp. See the documentation for ".
                "DBIx::Class::$first_comp for more information";
@@ -31,25 +31,4 @@
   $class->next::method($target, @to_inject);
 }
 
-# Returns a true value if the specified class is installed and loaded
-# successfully, throws an exception if the class is found but not loaded
-# successfully, and false if the class is not installed
-sub load_optional_class {
-  my ($class, $f_class) = @_;
-  eval { $class->ensure_class_loaded($f_class) };
-  my $err = $@;   # so we don't lose it
-  if (! $err) {
-    return 1;
-  }
-  else {
-    my $fn = (join ('/', split ('::', $f_class) ) ) . '.pm';
-    if ($err =~ /Can't locate ${fn} in \@INC/ ) {
-      return 0;
-    }
-    else {
-      die $err;
-    }
-  }
-}
-
 1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Componentised.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Core.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Cursor.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/DB.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/DB.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/DB.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -162,11 +162,12 @@
 sub _maybe_attach_source_to_schema {
   my ($class, $source) = @_;
   if (my $meth = $class->can('schema_instance')) {
-    my $schema = $class->$meth;
-    $schema->register_class($class, $class);
-    my $new_source = $schema->source($class);
-    %$source = %$new_source;
-    $schema->source_registrations->{$class} = $source;
+    if (my $schema = $class->$meth) {
+      $schema->register_class($class, $class);
+      my $new_source = $schema->source($class);
+      %$source = %$new_source;
+      $schema->source_registrations->{$class} = $source;
+    }
   }
 }
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/DB.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Exception.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/InflateColumn/DateTime.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/InflateColumn/DateTime.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/InflateColumn/DateTime.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -3,6 +3,7 @@
 use strict;
 use warnings;
 use base qw/DBIx::Class/;
+use Carp::Clan qw/^DBIx::Class/;
 
 =head1 NAME
 
@@ -30,7 +31,7 @@
 If you want to set a specific timezone and locale for that field, use:
 
   __PACKAGE__->add_columns(
-    starts_when => { data_type => 'datetime', extra => { timezone => "America/Chicago", locale => "de_DE" } }
+    starts_when => { data_type => 'datetime', timezone => "America/Chicago", locale => "de_DE" }
   );
 
 If you want to inflate no matter what data_type your column is,
@@ -94,7 +95,7 @@
 
   my $type;
 
-  for (qw/date datetime/) {
+  for (qw/date datetime timestamp/) {
     my $key = "inflate_${_}";
 
     next unless exists $info->{$key};
@@ -106,46 +107,49 @@
 
   unless ($type) {
     $type = lc($info->{data_type});
-    $type = 'datetime' if ($type =~ /^timestamp/);
+    if ($type eq "timestamp with time zone" || $type eq "timestamptz") {
+      $type = "timestamp";
+      $info->{_ic_dt_method} ||= "timestamp_with_timezone";
+    }
   }
 
   my $timezone;
   if ( defined $info->{extra}{timezone} ) {
+    carp "Putting timezone into extra => { timezone => '...' } has been deprecated, ".
+         "please put it directly into the columns definition.";
     $timezone = $info->{extra}{timezone};
   }
 
   my $locale;
   if ( defined $info->{extra}{locale} ) {
+    carp "Putting locale into extra => { locale => '...' } has been deprecated, ".
+         "please put it directly into the columns definition.";
     $locale = $info->{extra}{locale};
   }
+  
+  $locale   = $info->{locale}   if defined $info->{locale};
+  $timezone = $info->{timezone} if defined $info->{timezone};
 
   my $undef_if_invalid = $info->{datetime_undef_if_invalid};
 
-  if ($type eq 'datetime' || $type eq 'date') {
-    my ($parse, $format) = ("parse_${type}", "format_${type}");
+  if ($type eq 'datetime' || $type eq 'date' || $type eq 'timestamp') {
+    # This shallow copy of %info avoids t/52_cycle.t treating
+    # the resulting deflator as a circular reference.
+    my %info = ( '_ic_dt_method' => $type , %{ $info } );
 
-    # This assignment must happen here, otherwise Devel::Cycle treats
-    # the resulting deflator as a circular reference (go figure):
-    #
-    # Cycle #1
-    #     DBICTest::Schema A->{source_registrations} => %B
-    #     %B->{Event} => DBIx::Class::ResultSource::Table C
-    #     DBIx::Class::ResultSource::Table C->{_columns} => %D
-    #     %D->{created_on} => %E
-    #     %E->{_inflate_info} => %F
-    #     %F->{deflate} => &G
-    #     closure &G, $info => $H
-    #     $H => %E
-    #
-    my $floating_tz_ok = $info->{extra}{floating_tz_ok};
+    if (defined $info->{extra}{floating_tz_ok}) {
+      carp "Putting floating_tz_ok into extra => { floating_tz_ok => 1 } has been deprecated, ".
+           "please put it directly into the columns definition.";
+      $info{floating_tz_ok} = $info->{extra}{floating_tz_ok};
+    }
 
     $self->inflate_column(
       $column =>
         {
           inflate => sub {
             my ($value, $obj) = @_;
-            my $dt = eval { $obj->_datetime_parser->$parse($value); };
-            die "Error while inflating ${value} for ${column} on ${self}: $@"
+            my $dt = eval { $obj->_inflate_to_datetime( $value, \%info ) };
+            $self->throw_exception ("Error while inflating ${value} for ${column} on ${self}: $@")
               if $@ and not $undef_if_invalid;
             $dt->set_time_zone($timezone) if $timezone;
             $dt->set_locale($locale) if $locale;
@@ -154,21 +158,41 @@
           deflate => sub {
             my ($value, $obj) = @_;
             if ($timezone) {
-                warn "You're using a floating timezone, please see the documentation of"
+                carp "You're using a floating timezone, please see the documentation of"
                   . " DBIx::Class::InflateColumn::DateTime for an explanation"
                   if ref( $value->time_zone ) eq 'DateTime::TimeZone::Floating'
-                      and not $floating_tz_ok
+                      and not $info{floating_tz_ok}
                       and not $ENV{DBIC_FLOATING_TZ_OK};
                 $value->set_time_zone($timezone);
                 $value->set_locale($locale) if $locale;
             }
-            $obj->_datetime_parser->$format($value);
+            $obj->_deflate_from_datetime( $value, \%info );
           },
         }
     );
   }
 }
 
+sub _flate_or_fallback
+{
+  my( $self, $value, $info, $method_fmt ) = @_;
+
+  my $parser = $self->_datetime_parser;
+  my $preferred_method = sprintf($method_fmt, $info->{ _ic_dt_method });
+  my $method = $parser->can($preferred_method) ? $preferred_method : sprintf($method_fmt, 'datetime');
+  return $parser->$method($value);
+}
+
+sub _inflate_to_datetime {
+  my( $self, $value, $info ) = @_;
+  return $self->_flate_or_fallback( $value, $info, 'parse_%s' );
+}
+
+sub _deflate_from_datetime {
+  my( $self, $value, $info ) = @_;
+  return $self->_flate_or_fallback( $value, $info, 'format_%s' );
+}
+
 sub _datetime_parser {
   my $self = shift;
   if (my $parser = $self->__datetime_parser) {
@@ -189,7 +213,7 @@
 result you expect). For example:
 
   __PACKAGE__->add_columns(
-    starts_when => { data_type => 'datetime', extra => { timezone => "America/Chicago" } }
+    starts_when => { data_type => 'datetime', timezone => "America/Chicago" }
   );
 
   my $event = $schema->resultset('EventTZ')->create({
@@ -213,7 +237,7 @@
 =item Suppress the check on per-column basis
 
   __PACKAGE__->add_columns(
-    starts_when => { data_type => 'datetime', extra => { timezone => "America/Chicago", floating_tz_ok => 1 } }
+    starts_when => { data_type => 'datetime', timezone => "America/Chicago", floating_tz_ok => 1 }
   );
 
 =item Suppress the check globally
@@ -222,8 +246,11 @@
 
 =back
 
+Putting extra attributes like timezone, locale or floating_tz_ok into extra => {} has been
+B<DEPRECATED> because this gets you into trouble using L<DBIx::Class::Schema::Versioned>.
+Instead put it directly into the columns definition like in the examples above. If you still
+use the old way you'll see a warning - please fix your code then!
 
-
 =head1 SEE ALSO
 
 =over 4


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/InflateColumn/DateTime.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/InflateColumn/File.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/InflateColumn.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Component.pod
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Cookbook.pod
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Cookbook.pod	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Cookbook.pod	2009-06-05 00:05:19 UTC (rev 6514)
@@ -19,20 +19,9 @@
 
   return $rs->all(); # all records for page 1
 
-The C<page> attribute does not have to be specified in your search:
+You can get a L<Data::Page> object for the resultset (suitable for use
+in e.g. a template) using the C<pager> method:
 
-  my $rs = $schema->resultset('Artist')->search(
-    undef,
-    {
-      rows => 10,
-    }
-  );
-
-  return $rs->page(1); # DBIx::Class::ResultSet containing first 10 records
-
-In either of the above cases, you can get a L<Data::Page> object for the
-resultset (suitable for use in e.g. a template) using the C<pager> method:
-
   return $rs->pager();
 
 =head2 Complex WHERE clauses
@@ -116,7 +105,7 @@
 Say you want to run a complex custom query on your user data, here's what
 you have to add to your User class:
 
-  package My::Schema::User;
+  package My::Schema::Result::User;
   
   use base qw/DBIx::Class/;
   
@@ -160,10 +149,10 @@
 achieve the same with subclassing the resultset class and defining the
 ResultSource there:
 
-  package My::Schema::UserFriendsComplex;
+  package My::Schema::Result::UserFriendsComplex;
 
-  use My::Schema::User;
-  use base qw/My::Schema::User/;
+  use My::Schema::Result::User;
+  use base qw/My::Schema::Result::User/;
 
   __PACKAGE__->table('dummy');  # currently must be called before anything else
 
@@ -248,30 +237,50 @@
 
 =head2 SELECT DISTINCT with multiple columns
 
-  my $rs = $schema->resultset('Foo')->search(
+  my $rs = $schema->resultset('Artist')->search(
     {},
     {
-      select => [
-        { distinct => [ $source->columns ] }
-      ],
-      as => [ $source->columns ] # remember 'as' is not the same as SQL AS :-)
+      columns => [ qw/artistid name rank/ ],
+      distinct => 1
+    } 
+  );
+
+  my $rs = $schema->resultset('Artist')->search(
+    {},
+    {
+      columns => [ qw/artistid name rank/ ],
+      group_by => [ qw/artistid name rank/ ],
     }
   );
 
+  # Equivalent SQL:
+  # SELECT me.artistid, me.name, me.rank
+  # FROM artist me
+  # GROUP BY artistid, name, rank
+
 =head2 SELECT COUNT(DISTINCT colname)
 
-  my $rs = $schema->resultset('Foo')->search(
+  my $rs = $schema->resultset('Artist')->search(
     {},
     {
-      select => [
-        { count => { distinct => 'colname' } }
-      ],
-      as => [ 'count' ]
+      columns => [ qw/name/ ],
+      distinct => 1
     }
   );
 
-  my $count = $rs->next->get_column('count');
+  my $rs = $schema->resultset('Artist')->search(
+    {},
+    {
+      columns => [ qw/name/ ],
+      group_by => [ qw/name/ ],
+    }
+  );
 
+  my $count = $rs->count;
+
+  # Equivalent SQL:
+  # SELECT COUNT( DISTINCT( me.name ) ) FROM artist me 
+
 =head2 Grouping results
 
 L<DBIx::Class> supports C<GROUP BY> as follows:
@@ -295,7 +304,7 @@
 are in any way unsure about the use of the attributes above (C< join
 >, C< select >, C< as > and C< group_by >).
 
-=head2 Subqueries
+=head2 Subqueries (EXPERIMENTAL)
 
 You can write subqueries relatively easily in DBIC.
 
@@ -343,6 +352,10 @@
        WHERE artistid = me.artistid
       )
 
+=head3 EXPERIMENTAL
+
+Please note that subqueries are considered an experimental feature.
+
 =head2 Predefined searches
 
 You can write your own L<DBIx::Class::ResultSet> class by inheriting from it
@@ -504,9 +517,6 @@
 so no additional SQL statements are executed. You now have a much more
 efficient query.
 
-Note that as of L<DBIx::Class> 0.05999_01, C<prefetch> I<can> be used with
-C<has_many> relationships.
-
 Also note that C<prefetch> should only be used when you know you will
 definitely use data from a related table. Pre-fetching related tables when you
 only need columns from the main table will make performance worse!
@@ -624,7 +634,7 @@
 
 =head2 Multi-step prefetch
 
-From 0.04999_05 onwards, C<prefetch> can be nested more than one relationship
+C<prefetch> can be nested more than one relationship
 deep using the same syntax as a multi-step join:
 
   my $rs = $schema->resultset('Tag')->search(
@@ -664,8 +674,7 @@
 
 AKA getting last_insert_id
 
-If you are using PK::Auto (which is a core component as of 0.07), this is 
-straightforward:
+Thanks to the core component PK::Auto, this is straightforward:
 
   my $foo = $rs->create(\%blah);
   # do more stuff
@@ -680,7 +689,7 @@
 module.
 
 To make an object stringify itself as a single column, use something
-like this (replace C<foo> with the column/method of your choice):
+like this (replace C<name> with the column/method of your choice):
 
   use overload '""' => sub { shift->name}, fallback => 1;
 
@@ -724,6 +733,48 @@
     # do whatever else you wanted if it was a new row
   }
 
+=head2 Static sub-classing DBIx::Class result classes 
+
+AKA adding additional relationships/methods/etc. to a model for a
+specific usage of the (shared) model.
+
+B<Schema definition> 
+ 
+    package My::App::Schema; 
+     
+    use base DBIx::Class::Schema; 
+
+    # load subclassed classes from My::App::Schema::Result/ResultSet
+    __PACKAGE__->load_namespaces;
+
+    # load classes from shared model
+    load_classes({
+        'My::Shared::Model::Result' => [qw/
+            Foo
+            Bar
+        /]});
+
+    1;
+ 
+B<Result-Subclass definition> 
+ 
+    package My::App::Schema::Result::Baz;
+     
+    use strict; 
+    use warnings; 
+    use base My::Shared::Model::Result::Baz; 
+    
+    # WARNING: Make sure you call table() again in your subclass,
+    # otherwise DBIx::Class::ResultSourceProxy::Table will not be called
+    # and the class name is not correctly registered as a source
+    __PACKAGE__->table('baz'); 
+     
+    sub additional_method { 
+        return "I'm an additional method only needed by this app"; 
+    }
+
+    1;
+     
 =head2 Dynamic Sub-classing DBIx::Class proxy classes 
 
 AKA multi-class object inflation from one table
@@ -747,16 +798,18 @@
  
 B<Schema Definition> 
  
-    package DB::Schema; 
+    package My::Schema; 
      
     use base qw/DBIx::Class::Schema/; 
  
-    __PACKAGE__->load_classes(qw/User/); 
+    __PACKAGE__->load_namespaces;
+
+    1;
  
  
 B<Proxy-Class definitions> 
  
-    package DB::Schema::User; 
+    package My::Schema::Result::User; 
      
     use strict; 
     use warnings; 
@@ -789,13 +842,15 @@
         print "I am a regular user.\n"; 
         return ; 
     } 
+    
+    1;
+
      
+    package My::Schema::Result::User::Admin; 
      
-    package DB::Schema::User::Admin; 
-     
     use strict; 
     use warnings; 
-    use base qw/DB::Schema::User/; 
+    use base qw/My::Schema::Result::User/; 
      
     sub hello 
     { 
@@ -807,13 +862,15 @@
     { 
         print "I am doing admin stuff\n"; 
         return ; 
-    } 
+    }
+
+    1;
  
 B<Test File> test.pl 
  
     use warnings; 
     use strict; 
-    use DB::Schema; 
+    use My::Schema; 
      
     my $user_data = { email    => 'someguy at place.com',  
                       password => 'pass1',  
@@ -823,7 +880,7 @@
                        password => 'pass2',  
                        admin    => 1 }; 
                            
-    my $schema = DB::Schema->connection('dbi:Pg:dbname=test'); 
+    my $schema = My::Schema->connection('dbi:Pg:dbname=test'); 
      
     $schema->resultset('User')->create( $user_data ); 
     $schema->resultset('User')->create( $admin_data ); 
@@ -861,11 +918,16 @@
 
 Wasn't that easy?
 
+Beware, changing the Result class using
+L<DBIx::Class::ResultSet/result_class> will replace any existing class
+completely including any special components loaded using
+load_components, eg L<DBIx::Class::InflateColumn::DateTime>.
+
 =head2 Get raw data for blindingly fast results
 
 If the L<HashRefInflator|DBIx::Class::ResultClass::HashRefInflator> solution
 above is not fast enough for you, you can use a DBIx::Class to return values
-exactly as they come out of the data base with none of the convenience methods
+exactly as they come out of the database with none of the convenience methods
 wrapped round them.
 
 This is used like so:
@@ -876,13 +938,13 @@
   }
 
 You will need to map the array offsets to particular columns (you can
-use the I<select> attribute of C<search()> to force ordering).
+use the L<DBIx::Class::ResultSet/select> attribute of L<DBIx::Class::ResultSet/search> to force ordering).
 
 =head1 RESULTSET OPERATIONS
 
 =head2 Getting Schema from a ResultSet
 
-To get the schema object from a result set, do the following:
+To get the L<DBIx::Class::Schema> object from a ResultSet, do the following:
 
  $rs->result_source->schema
 
@@ -1022,6 +1084,98 @@
   $rs = $user->addresses(); # get all addresses for a user
   $rs = $address->users(); # get all users for an address
 
+=head2 Relationships across DB schemas
+
+Mapping relationships across L<DB schemas|DBIx::Class::Manual::Glossary/DB schema>
+is easy as long as the schemas themselves are all accessible via the same DBI
+connection. In most cases, this means that they are on the same database host
+as each other and your connecting database user has the proper permissions to them.
+
+To accomplish this one only needs to specify the DB schema name in the table
+declaration, like so...
+
+  package MyDatabase::Main::Artist;
+  use base qw/DBIx::Class/;
+  __PACKAGE__->load_components(qw/PK::Auto Core/);
+  
+  __PACKAGE__->table('database1.artist'); # will use "database1.artist" in FROM clause
+  
+  __PACKAGE__->add_columns(qw/ artistid name /);
+  __PACKAGE__->set_primary_key('artistid');
+  __PACKAGE__->has_many('cds' => 'MyDatabase::Main::Cd');
+
+  1;
+
+Whatever string you specify there will be used to build the "FROM" clause in SQL
+queries.
+
+The big drawback to this is you now have DB schema names hardcoded in your
+class files. This becomes especially troublesome if you have multiple instances
+of your application to support a change lifecycle (e.g. DEV, TEST, PROD) and
+the DB schemas are named based on the environment (e.g. database1_dev).
+
+However, one can dynamically "map" to the proper DB schema by overriding the
+L<connection|DBIx::Class::Schama/connection> method in your Schema class and
+building a renaming facility, like so:
+
+  package MyDatabase::Schema;
+  use Moose;
+  
+  extends 'DBIx::Class::Schema';
+  
+  around connection => sub {
+    my ( $inner, $self, $dsn, $username, $pass, $attr ) = ( shift, @_ );
+   
+    my $postfix = delete $attr->{schema_name_postfix};
+    
+    $inner->(@_);
+    
+    if ( $postfix ) {
+        $self->append_db_name($postfix);
+    }
+  };
+
+  sub append_db_name {
+    my ( $self, $postfix ) = @_;
+    
+    my @sources_with_db 
+        = grep 
+            { $_->name =~ /^\w+\./mx } 
+            map 
+                { $self->source($_) } 
+                $self->sources;
+    
+    foreach my $source (@sources_with_db) {
+        my $name = $source->name;
+        $name =~ s{^(\w+)\.}{${1}${postfix}\.}mx;
+        
+        $source->name($name);
+    }
+  }
+
+  1;
+
+By overridding the L<connection|DBIx::Class::Schama/connection>
+method and extracting a custom option from the provided \%attr hashref one can
+then simply iterate over all the Schema's ResultSources, renaming them as
+needed.
+
+To use this facility, simply add or modify the \%attr hashref that is passed to 
+L<connection|DBIx::Class::Schama/connect>, as follows:
+
+  my $schema 
+    = MyDatabase::Schema->connect(
+      $dsn, 
+      $user, 
+      $pass,
+      {
+        schema_name_postfix => '_dev'
+        # ... Other options as desired ... 
+      })
+
+Obviously, one could accomplish even more advanced mapping via a hash map or a
+callback routine.
+
 =head1 TRANSACTIONS
 
 As of version 0.04001, there is improved transaction support in
@@ -1174,6 +1328,18 @@
   while (my @vals = $cursor->next) {
     print $vals[0]."\n";
   }
+
+In case you're going to use this "trick" together with L<DBIx::Class::Schema/deploy> or
+L<DBIx::Class::Schema/create_ddl_dir> a table called "dual" will be created in your
+current schema. This would overlap "sys.dual" and you could not fetch "sysdate" or
+"sequence.nextval" anymore from dual. To avoid this problem, just tell
+L<SQL::Translator> to not create table dual:
+
+    my $sqlt_args = {
+        add_drop_table => 1,
+        parser_args    => { sources => [ grep $_ ne 'Dual', schema->sources ] },
+    };
+    $schema->create_ddl_dir( [qw/Oracle/], undef, './sql', undef, $sqlt_args );
  
 Or use L<DBIx::Class::ResultClass::HashRefInflator>
  
@@ -1219,7 +1385,7 @@
 L<callback system|DBIx::Class::ResultSource/sqlt_deploy_callback> if you wish
 to share a hook between multiple sources):
 
- package My::Schema::Artist;
+ package My::Schema::Result::Artist;
 
  __PACKAGE__->table('artist');
  __PACKAGE__->add_columns(id => { ... }, name => { ... })
@@ -1733,4 +1899,33 @@
 syntax to load the appropriate classes there is not a direct alternative
 avoiding L<Module::Find|Module::Find>.
 
+=head1 MEMORY USAGE
+
+=head2 Cached statements
+
+L<DBIx::Class> normally caches all statements with L<< prepare_cached()|DBI/prepare_cached >>.
+This is normally a good idea, but if too many statements are cached, the database may use too much
+memory and may eventually run out and fail entirely.  If you suspect this may be the case, you may want
+to examine DBI's L<< CachedKids|DBI/CachedKidsCachedKids_(hash_ref) >> hash:
+
+    # print all currently cached prepared statements
+    print for keys %{$schema->storage->dbh->{CachedKids}};
+    # get a count of currently cached prepared statements
+    my $count = scalar keys %{$schema->storage->dbh->{CachedKids}};
+
+If it's appropriate, you can simply clear these statements, automatically deallocating them in the
+database:
+
+    my $kids = $schema->storage->dbh->{CachedKids};
+    delete @{$kids}{keys %$kids} if scalar keys %$kids > 100;
+
+But what you probably want is to expire unused statements and not those that are used frequently.
+You can accomplish this with L<Tie::Cache> or L<Tie::Cache::LRU>:
+
+    use Tie::Cache;
+    use DB::Main;
+    my $schema = DB::Main->connect($dbi_dsn, $user, $pass, {
+        on_connect_do => sub { tie %{shift->_dbh->{CachedKids}}, 'Tie::Cache', 100 },
+    });
+
 =cut


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Cookbook.pod
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/DocMap.pod
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Example.pod
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/FAQ.pod
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/FAQ.pod	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/FAQ.pod	2009-06-05 00:05:19 UTC (rev 6514)
@@ -274,7 +274,7 @@
 
 Or, if you have quoting off:
 
- ->search({ 'YEAR(date_of_birth' => 1979 });
+ ->search({ 'YEAR(date_of_birth)' => 1979 });
 
 =item .. find more help on constructing searches?
 
@@ -353,6 +353,20 @@
 L<DBIx::Class::PK/discard_changes> does just that by re-fetching the row from storage
 using the row's primary key.
 
+=item .. fetch my data a "page" at a time?
+
+Pass the C<rows> and C<page> attributes to your search, eg:
+
+  ->search({}, { rows => 10, page => 1});
+
+=item .. get a count of all rows even when paging?
+
+Call C<pager> on the paged resultset, it will return a L<Data::Page>
+object. Calling C<total_entries> on the pager will return the correct
+total.
+
+C<count> on the resultset will only return the total number in the page.
+
 =back
 
 =head2 Inserting and updating data
@@ -538,3 +552,38 @@
 See L<DBIx::Class::Manual::Cookbook/Stringification>
 
 =back
+
+=head2 Troubleshooting
+
+=over 4
+
+=item Help, I can't connect to postgresql!
+
+If you get an error such as:
+
+  DBI connect('dbname=dbic','user',...) failed: could not connect to server:
+  No such file or directory Is the server running locally and accepting
+  connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
+
+Likely you have/had two copies of postgresql installed simultaneously, the
+second one will use a default port of 5433, while L<DBD::Pg> is compiled with a
+default port of 5432.
+
+You can chance the port setting in C<postgresql.conf>.
+
+=item I've lost or forgotten my mysql password
+
+Stop mysqld and restart it with the --skip-grant-tables option.
+
+Issue the following statements in the mysql client.
+
+  UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';
+  FLUSH PRIVILEGES;
+
+Restart mysql.
+
+Taken from:
+
+L<http://dev.mysql.com/doc/refman/5.1/en/resetting-permissions.html>.
+
+=back


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/FAQ.pod
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Glossary.pod
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Glossary.pod	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Glossary.pod	2009-06-05 00:05:19 UTC (rev 6514)
@@ -9,6 +9,17 @@
 
 =head1 TERMS
 
+=head2 DB schema
+
+Refers to a single physical schema within an RDBMS. Synonymous with the terms
+'database', for MySQL; and 'schema', for most other RDBMS(s).
+
+In other words, it's the 'xyz' _thing_ you're connecting to when using any of
+the following L<DSN|DBI/connect>(s):
+
+  dbi:DriverName:xyz at hostname:port
+  dbi:DriverName:database=xyz;host=hostname;port=port
+
 =head2 Inflation
 
 The act of turning database row data into objects in


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Glossary.pod
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Intro.pod
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Joining.pod
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Reading.pod
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Reading.pod	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Reading.pod	2009-06-05 00:05:19 UTC (rev 6514)
@@ -34,13 +34,18 @@
 
 =item *
 
-Each method starts with a "head2" statement of it's name.
+Each method starts with a "head2" statement of its name.
 
+Just the plain method name, not an example of how to call it, or a link.
+This is to ensure easy linking to method documentation from other POD.
+
 =item *
 
-The header is followed by a one-item list.
+The header is followed by a two-item list. This contains a description
+of the arguments the method is expected to take, and an indication of
+what the method returns.
 
-The single item provides a list of all possible values for the
+The first item provides a list of all possible values for the
 arguments of the method in order, separated by C<, >, preceeded by the
 text "Arguments: "
 
@@ -70,24 +75,60 @@
 
 =item *
 
+%var - A hashref variable (list of key/value pairs) - rarely used in DBIx::Class.
+
+Reading an argument as a hash variable will consume all subsequent
+method arguments, use with caution.
+
+=item *
+
+ at var - An array variable (list of values).
+
+Reading an argument as a array variable will consume all subsequent
+method arguments, use with caution.
+
+=item *
+
 ? - Optional, should be placed after the argument type and name.
 
+  ## Correct
+  \%myhashref|\@myarrayref?
+
+  ## Wrong
+  \%myhashref?|\@myarrayref
+
+Applies to the entire argument.
+
+Optional arguments can be left out of method calls, unless the caller
+needs to pass in any of the following arguments. In which case the
+caller should pass C<undef> in place of the missing argument.
+
 =item *
 
-| - Alternate argument types.
+| - Alternate argument content types. 
 
+At least one of these must be supplied unless the argument is also
+marked optional.
+
 =back
 
-NOTES:
+The second item starts with the text "Return value:". The remainder of
+the line is either the text "undefined", a text describing the result of
+the method, or a variable with a descriptive name.
 
-If several arguments are optional, it is always possible to pass
-C<undef> as one optional argument in order to skip it and provide a
-value for the following ones. This does not need to be indicated in
-the Arguments line, it is assumed.
+  ## Good examples
+  =item Return value: undefined
+  =item Return value: A schema object
+  =item Return value: $classname
 
-The C<?> for optional arguments always applies to the entire argument
-value, not a particular type or argument.
+  ## Bad examples
+  =item Return value: The names
 
+"undefined" means the method does not deliberately return a value, and
+the caller should not use or rely on anything it does return. (Perl
+functions always return something, usually the result of the last code
+statement, if there is no explicit return statement.)
+
 =item *
 
 The argument list is followed by a single paragraph describing what
@@ -98,6 +139,9 @@
 The description paragraph is followed by another list. Each item in
 the list explains one of the possible argument/type combinations.
 
+This list may be omitted if the author feels that the variable names are
+self-explanatory enough to not require it. Use best judgement.
+
 =item *
 
 The argument list is followed by some examples of how to use the


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Reading.pod
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Troubleshooting.pod
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Troubleshooting.pod	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Troubleshooting.pod	2009-06-05 00:05:19 UTC (rev 6514)
@@ -47,7 +47,7 @@
 
 L<DBI> version 1.50 and L<DBD::Pg> 1.43 are known to work.
 
-=head2 ... Can't locate object method "source_name" via package ...
+=head2 Can't locate object method "source_name" via package
 
 There's likely a syntax error in the table class referred to elsewhere
 in this error message.  In particular make sure that the package


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual/Troubleshooting.pod
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Manual.pod
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Ordered.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Ordered.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Ordered.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -272,6 +272,20 @@
     return defined $lsib ? $lsib : 0;
 }
 
+# an optimised method to get the last sibling position without inflating a row object
+sub _last_sibling_pos {
+    my $self = shift;
+    my $position_column = $self->position_column;
+
+    my $cursor = $self->next_siblings->search(
+        {},
+        { rows => 1, order_by => { '-desc' => $position_column }, columns => $position_column },
+    )->cursor;
+
+    my ($pos) = $cursor->next;
+    return $pos;
+}
+
 =head2 move_previous
 
   $item->move_previous();
@@ -427,7 +441,7 @@
         if ( not defined($to_position) or $to_position > $new_group_count) {
             $self->set_column(
                 $position_column => $new_group_count
-                    ? $self->_next_position_value ( $self->last_sibling->get_column ($position_column) )    # FIXME - no need to inflate last_sibling
+                    ? $self->_next_position_value ( $self->_last_sibling_pos )
                     : $self->_initial_position_value
             );
         }
@@ -459,10 +473,10 @@
     my $position_column = $self->position_column;
 
     unless ($self->get_column($position_column)) {
-        my $lsib = $self->last_sibling;     # FIXME - no need to inflate last_sibling
+        my $lsib_pos = $self->_last_sibling_pos;
         $self->set_column(
-            $position_column => ($lsib
-                ? $self->_next_position_value ( $lsib->get_column ($position_column) )
+            $position_column => (defined $lsib_pos
+                ? $self->_next_position_value ( $lsib_pos )
                 : $self->_initial_position_value
             )
         );
@@ -692,12 +706,22 @@
     # position column is part of a unique constraint, and do a
     # one-by-one update if this is the case
 
-    if (grep { $_ eq $position_column } ( map { @$_ } (values %{{ $self->result_source->unique_constraints }} ) ) ) {
+    my $rsrc = $self->result_source;
 
-        my $rs = $shift_rs->search ({}, { order_by => { "-$ord", $position_column } } );
-        # FIXME - no need to inflate each row
-        while (my $r = $rs->next) {
-            $r->_ordered_internal_update ({ $position_column => \ "$position_column $op 1" } );
+    if (grep { $_ eq $position_column } ( map { @$_ } (values %{{ $rsrc->unique_constraints }} ) ) ) {
+
+        my @pcols = $rsrc->primary_columns;
+        my $cursor = $shift_rs->search ({}, { order_by => { "-$ord", $position_column }, columns => \@pcols } )->cursor;
+        my $rs = $self->result_source->resultset;
+
+        while (my @pks = $cursor->next ) {
+
+          my $cond;
+          for my $i (0.. $#pcols) {
+            $cond->{$pcols[$i]} = $pks[$i];
+          }
+
+          $rs->search($cond)->update ({ $position_column => \ "$position_column $op 1" } );
         }
     }
     else {


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Ordered.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto/DB2.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto/MSSQL.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto/MySQL.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto/Pg.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto/SQLite.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK/Auto.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/PK.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Accessor.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Accessor.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Accessor.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -27,15 +27,16 @@
       } elsif (exists $self->{_relationship_data}{$rel}) {
         return $self->{_relationship_data}{$rel};
       } else {
-        my $cond = $self->result_source->resolve_condition(
+        my $cond = $self->result_source->_resolve_condition(
           $rel_info->{cond}, $rel, $self
         );
         if ($rel_info->{attrs}->{undef_on_null_fk}){
-          return unless ref($cond) eq 'HASH';
-          return if grep { not defined } values %$cond;
+          return undef unless ref($cond) eq 'HASH';
+          return undef if grep { not defined $_ } values %$cond;
         }
         my $val = $self->find_related($rel, {}, {});
-        return unless $val;
+        return $val unless $val;  # $val instead of undef so that null-objects can go through
+
         return $self->{_relationship_data}{$rel} = $val;
       }
     };


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Accessor.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Base.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Base.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Base.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -189,7 +189,7 @@
     my $query = ((@_ > 1) ? {@_} : shift);
 
     my $source = $self->result_source;
-    my $cond = $source->resolve_condition(
+    my $cond = $source->_resolve_condition(
       $rel_obj->{cond}, $rel, $self
     );
     if ($cond eq $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION) {
@@ -404,7 +404,7 @@
       unless Scalar::Util::blessed($f_obj) and $f_obj->isa($f_class);
   }
   $self->set_columns(
-    $self->result_source->resolve_condition(
+    $self->result_source->_resolve_condition(
        $rel_obj->{cond}, $f_obj, $rel));
   return 1;
 }
@@ -470,7 +470,7 @@
 
 =over 4
 
-=item Arguments: (\@hashrefs | \@objs)
+=item Arguments: (\@hashrefs | \@objs), $link_vals?
 
 =back
 
@@ -481,6 +481,10 @@
   $actor->set_roles(\@roles);
      # Replaces all of $actor's previous roles with the two named
 
+  $actor->set_roles(\@roles, { salary => 15_000_000 });
+     # Sets a column in the link table for all roles
+
+
 Replace all the related objects with the given reference to a list of
 objects. This does a C<delete> B<on the link table resultset> to remove the
 association between the current object and all related objects, then calls


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Base.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/BelongsTo.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/BelongsTo.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/BelongsTo.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -79,12 +79,14 @@
   return 1;
 }
 
-=head1 AUTHORS
+# Attempt to remove the POD so it (maybe) falls off the indexer
 
-Alexander Hartmaier <Alexander.Hartmaier at t-systems.at>
+#=head1 AUTHORS
+#
+#Alexander Hartmaier <Alexander.Hartmaier at t-systems.at>
+#
+#Matt S. Trout <mst at shadowcatsystems.co.uk>
+#
+#=cut
 
-Matt S. Trout <mst at shadowcatsystems.co.uk>
-
-=cut
-
 1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/BelongsTo.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/CascadeActions.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/HasMany.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/HasOne.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/Helpers.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/ManyToMany.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/ManyToMany.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/ManyToMany.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -3,7 +3,8 @@
 
 use strict;
 use warnings;
-use warnings::register;
+
+use Carp::Clan qw/^DBIx::Class/;
 use Sub::Name ();
 
 sub many_to_many {
@@ -28,16 +29,20 @@
 
     for ($add_meth, $remove_meth, $set_meth, $rs_meth) {
       if ( $class->can ($_) ) {
-        warnings::warnif(<<"EOW")
+        carp (<<"EOW") unless $ENV{DBIC_OVERWRITE_HELPER_METHODS_OK};
+
 ***************************************************************************
-The many-to-many relationship $meth is trying to create a utility method called
-$_. This will overwrite the existing method on $class. You almost certainly
-want to rename your method or the many-to-many relationship, as your method
-will not be callable (it will use the one from the relationship instead.)
+The many-to-many relationship '$meth' is trying to create a utility method
+called $_.
+This will completely overwrite one such already existing method on class
+$class.
 
-To disable this warning add the following to $class
+You almost certainly want to rename your method or the many-to-many
+relationship, as the functionality of the original method will not be
+accessible anymore.
 
-  no warnings 'DBIx::Class::Relationship::ManyToMany';
+To disable this warning set to a true value the environment variable
+DBIC_OVERWRITE_HELPER_METHODS_OK
 
 ***************************************************************************
 EOW
@@ -103,7 +108,7 @@
       );
       my @to_set = (ref($_[0]) eq 'ARRAY' ? @{ $_[0] } : @_);
       $self->search_related($rel, {})->delete;
-      $self->$add_meth($_) for (@to_set);
+      $self->$add_meth($_, ref($_[1]) ? $_[1] : {}) for (@to_set);
     };
 
     my $remove_meth_name = join '::', $class, $remove_meth;
@@ -114,7 +119,7 @@
       my $obj = shift;
       my $rel_source = $self->search_related($rel)->result_source;
       my $cond = $rel_source->relationship_info($f_rel)->{cond};
-      my $link_cond = $rel_source->resolve_condition(
+      my $link_cond = $rel_source->_resolve_condition(
         $cond, $obj, $f_rel
       );
       $self->search_related($rel, $link_cond)->delete;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/ManyToMany.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship/ProxyMethods.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Relationship.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultClass/HashRefInflator.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultClass/HashRefInflator.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultClass/HashRefInflator.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -5,7 +5,7 @@
 
 =head1 NAME
 
-DBIx::Class::ResultClass::HashRefInflator
+DBIx::Class::ResultClass::HashRefInflator - Get raw hashrefs from a resultset
 
 =head1 SYNOPSIS
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultClass/HashRefInflator.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSet.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSet.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSet.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -46,30 +46,16 @@
 ResultSet. The new one will contain all the conditions of the
 original, plus any new conditions added in the C<search> call.
 
-A ResultSet is also an iterator. L</next> is used to return all the
-L<DBIx::Class::Row>s the ResultSet represents.
+A ResultSet also incorporates an implicit iterator. L</next> and L</reset>
+can be used to walk through all the L<DBIx::Class::Row>s the ResultSet
+represents.
 
 The query that the ResultSet represents is B<only> executed against
 the database when these methods are called:
+L</find> L</next> L</all> L</first> L</single> L</count>
 
-=over
+=head1 EXAMPLES
 
-=item L</find>
-
-=item L</next>
-
-=item L</all>
-
-=item L</count>
-
-=item L</single>
-
-=item L</first>
-
-=back
-
-=head1 EXAMPLES 
-
 =head2 Chaining resultsets
 
 Let's say you've got a query that needs to be run to return some data
@@ -102,6 +88,21 @@
     });
   }
 
+=head3 Resolving conditions and attributes
+
+When a resultset is chained from another resultset, conditions and
+attributes with the same keys need resolving.
+
+L</join>, L</prefetch>, L</+select>, L</+as> attributes are merged
+into the existing ones from the original resultset.
+
+The L</where>, L</having> attribute, and any search conditions are
+merged with an SQL C<AND> to the existing condition from the original
+resultset.
+
+All other attributes are overridden by any new ones supplied in the
+search attributes.
+
 =head2 Multiple queries
 
 Since a resultset just defines a query, you can do all sorts of
@@ -178,7 +179,7 @@
   return $class->new_result(@_) if ref $class;
 
   my ($source, $attrs) = @_;
-  $source = $source->handle 
+  $source = $source->handle
     unless $source->isa('DBIx::Class::ResultSourceHandle');
   $attrs = { %{$attrs||{}} };
 
@@ -264,6 +265,11 @@
 sub search_rs {
   my $self = shift;
 
+  # Special-case handling for (undef, undef).
+  if ( @_ == 2 && !defined $_[1] && !defined $_[0] ) {
+    pop(@_); pop(@_);
+  }
+
   my $attrs = {};
   $attrs = pop(@_) if @_ > 1 and ref $_[$#_] eq 'HASH';
   my $our_attrs = { %{$self->{attrs}} };
@@ -276,7 +282,7 @@
 
   unless (
     (@_ && defined($_[0])) # @_ == () or (undef)
-    || 
+    ||
     (keys %$attrs # empty attrs or only 'safe' attrs
     && List::Util::first { !$safe{$_} } keys %$attrs)
   ) {
@@ -287,7 +293,7 @@
   my $new_attrs = { %{$our_attrs}, %{$attrs} };
 
   # merge new attrs into inherited
-  foreach my $key (qw/join prefetch +select +as/) {
+  foreach my $key (qw/join prefetch +select +as bind/) {
     next unless exists $attrs->{$key};
     $new_attrs->{$key} = $self->_merge_attr($our_attrs->{$key}, $attrs->{$key});
   }
@@ -373,19 +379,29 @@
 resultset query.
 
 CAVEAT: C<search_literal> is provided for Class::DBI compatibility and should
-only be used in that context. There are known problems using C<search_literal>
-in chained queries; it can result in bind values in the wrong order.  See
-L<DBIx::Class::Manual::Cookbook/Searching> and
+only be used in that context. C<search_literal> is a convenience method.
+It is equivalent to calling $schema->search(\[]), but if you want to ensure
+columns are bound correctly, use C<search>.
+
+Example of how to use C<search> instead of C<search_literal>
+
+  my @cds = $cd_rs->search_literal('cdid = ? AND (artist = ? OR artist = ?)', (2, 1, 2));
+  my @cds = $cd_rs->search(\[ 'cdid = ? AND (artist = ? OR artist = ?)', [ 'cdid', 2 ], [ 'artist', 1 ], [ 'artist', 2 ] ]);
+
+
+See L<DBIx::Class::Manual::Cookbook/Searching> and
 L<DBIx::Class::Manual::FAQ/Searching> for searching techniques that do not
 require C<search_literal>.
 
 =cut
 
 sub search_literal {
-  my ($self, $cond, @vals) = @_;
-  my $attrs = (ref $vals[$#vals] eq 'HASH' ? { %{ pop(@vals) } } : {});
-  $attrs->{bind} = [ @{$self->{attrs}{bind}||[]}, @vals ];
-  return $self->search(\$cond, $attrs);
+  my ($self, $sql, @bind) = @_;
+  my $attr;
+  if ( @bind && ref($bind[-1]) eq 'HASH' ) {
+    $attr = pop @bind;
+  }
+  return $self->search(\[ $sql, map [ __DUMMY__ => $_ ], @bind ], ($attr || () ));
 }
 
 =head2 find
@@ -475,7 +491,7 @@
         && ($info = $self->result_source->relationship_info($key))) {
       my $val = delete $input_query->{$key};
       next KEY if (ref($val) eq 'ARRAY'); # has_many for multi_create
-      my $rel_q = $self->result_source->resolve_condition(
+      my $rel_q = $self->result_source->_resolve_condition(
                     $info->{cond}, $val, $key
                   );
       die "Can't handle OR join condition in find" if ref($rel_q) eq 'ARRAY';
@@ -644,7 +660,9 @@
 sub cursor {
   my ($self) = @_;
 
-  my $attrs = { %{$self->_resolved_attrs} };
+  my $attrs = $self->_resolved_attrs_copy;
+  $attrs->{_virtual_order_by} = $self->_gen_virtual_order;
+
   return $self->{cursor}
     ||= $self->result_source->storage->select($attrs->{from}, $attrs->{select},
           $attrs->{where},$attrs);
@@ -682,7 +700,7 @@
   Query returned more than one row
 
 In this case, you should be using L</first> or L</find> instead, or if you really
-know what you are doing, use the L</rows> attribute to explicitly limit the size 
+know what you are doing, use the L</rows> attribute to explicitly limit the size
 of the resultset.
 
 =back
@@ -695,7 +713,9 @@
       $self->throw_exception('single() only takes search conditions, no attributes. You want ->search( $cond, $attrs )->single()');
   }
 
-  my $attrs = { %{$self->_resolved_attrs} };
+  my $attrs = $self->_resolved_attrs_copy;
+  $attrs->{_virtual_order_by} = $self->_gen_virtual_order;
+
   if ($where) {
     if (defined $attrs->{where}) {
       $attrs->{where} = {
@@ -722,6 +742,16 @@
   return (@data ? ($self->_construct_object(@data))[0] : undef);
 }
 
+# _gen_virtual_order
+#
+# This is a horrble hack, but seems like the best we can do at this point
+# Some limit emulations (Top) require an ordered resultset in order to 
+# function at all. So supply a PK order to be used if necessary
+
+sub _gen_virtual_order {
+  return [ shift->result_source->primary_columns ];
+}
+
 # _is_unique_query
 #
 # Try to determine if the specified query is guaranteed to be unique, based on
@@ -766,19 +796,16 @@
   if (ref $query eq 'ARRAY') {
     foreach my $subquery (@$query) {
       next unless ref $subquery;  # -or
-#      warn "ARRAY: " . Dumper $subquery;
       $collapsed = $self->_collapse_query($subquery, $collapsed);
     }
   }
   elsif (ref $query eq 'HASH') {
     if (keys %$query and (keys %$query)[0] eq '-and') {
       foreach my $subquery (@{$query->{-and}}) {
-#        warn "HASH: " . Dumper $subquery;
         $collapsed = $self->_collapse_query($subquery, $collapsed);
       }
     }
     else {
-#      warn "LEAF: " . Dumper $query;
       foreach my $col (keys %$query) {
         my $value = $query->{$col};
         $collapsed->{$col}{$value}++;
@@ -830,10 +857,24 @@
 
 For more information, see L<DBIx::Class::Manual::Cookbook>.
 
+This method is deprecated and will be removed in 0.09. Use L</search()>
+instead. An example conversion is:
+
+  ->search_like({ foo => 'bar' });
+
+  # Becomes
+
+  ->search({ foo => { like => 'bar' } });
+
 =cut
 
 sub search_like {
   my $class = shift;
+  carp (
+    'search_like() is deprecated and will be removed in DBIC version 0.09.'
+   .' Instead use ->search({ x => { -like => "y%" } })'
+   .' (note the outer pair of {}s - they are important!)'
+  );
   my $attrs = (@_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {});
   my $query = ref $_[0] eq 'HASH' ? { %{shift()} }: {@_};
   $query->{$_} = { 'like' => $query->{$_} } for keys %$query;
@@ -975,7 +1016,7 @@
   do { # no need to check anything at the front, we always want the first row
 
     my %const;
-  
+
     foreach my $this_as (@construct_as) {
       $const{$this_as->[0]||''}{$this_as->[1]} = shift(@copy);
     }
@@ -1022,7 +1063,7 @@
         foreach my $p (@parts) {
           $target = $target->[1]->{$p} ||= [];
           $cur .= ".${p}";
-          if ($cur eq ".${key}" && (my @ckey = @{$collapse{$cur}||[]})) { 
+          if ($cur eq ".${key}" && (my @ckey = @{$collapse{$cur}||[]})) {
             # collapsing at this point and on final part
             my $pos = $collapse_pos{$cur};
             CK: foreach my $ck (@ckey) {
@@ -1073,10 +1114,15 @@
 
 =back
 
-An accessor for the class to use when creating row objects. Defaults to 
-C<< result_source->result_class >> - which in most cases is the name of the 
+An accessor for the class to use when creating row objects. Defaults to
+C<< result_source->result_class >> - which in most cases is the name of the
 L<"table"|DBIx::Class::Manual::Glossary/"ResultSource"> class.
 
+Note that changing the result_class will also remove any components
+that were originally loaded in the source class via
+L<DBIx::Class::ResultSource/load_components>. Any overloaded methods
+in the original source class will not run.
+
 =cut
 
 sub result_class {
@@ -1099,65 +1145,25 @@
 =back
 
 Performs an SQL C<COUNT> with the same query as the resultset was built
-with to find the number of elements. If passed arguments, does a search
-on the resultset and counts the results of that.
+with to find the number of elements. Passing arguments is equivalent to
+C<< $rs->search ($cond, \%attrs)->count >>
 
-Note: When using C<count> with C<group_by>, L<DBIx::Class> emulates C<GROUP BY>
-using C<COUNT( DISTINCT( columns ) )>. Some databases (notably SQLite) do
-not support C<DISTINCT> with multiple columns. If you are using such a
-database, you should only use columns from the main table in your C<group_by>
-clause.
-
 =cut
 
 sub count {
   my $self = shift;
   return $self->search(@_)->count if @_ and defined $_[0];
   return scalar @{ $self->get_cache } if $self->get_cache;
-  my $count = $self->_count;
-  return 0 unless $count;
 
-  # need to take offset from resolved attrs
+  my $meth = $self->_has_attr (qw/prefetch collapse distinct group_by/)
+    ? 'count_grouped'
+    : 'count'
+  ;
 
-  $count -= $self->{_attrs}{offset} if $self->{_attrs}{offset};
-  $count = $self->{attrs}{rows} if
-    $self->{attrs}{rows} and $self->{attrs}{rows} < $count;
-  $count = 0 if ($count < 0);
-  return $count;
-}
+  my $attrs = $self->_resolved_attrs_copy;
+  my $rsrc = $self->result_source;
 
-sub _count { # Separated out so pager can get the full count
-  my $self = shift;
-  my $select = { count => '*' };
-
-  my $attrs = { %{$self->_resolved_attrs} };
-  if (my $group_by = delete $attrs->{group_by}) {
-    delete $attrs->{having};
-    my @distinct = (ref $group_by ?  @$group_by : ($group_by));
-    # todo: try CONCAT for multi-column pk
-    my @pk = $self->result_source->primary_columns;
-    if (@pk == 1) {
-      my $alias = $attrs->{alias};
-      foreach my $column (@distinct) {
-        if ($column =~ qr/^(?:\Q${alias}.\E)?$pk[0]$/) {
-          @distinct = ($column);
-          last;
-        }
-      }
-    }
-
-    $select = { count => { distinct => \@distinct } };
-  }
-
-  $attrs->{select} = $select;
-  $attrs->{as} = [qw/count/];
-
-  # offset, order by and page are not needed to count. record_filter is cdbi
-  delete $attrs->{$_} for qw/rows offset order_by page pager record_filter/;
-
-  my $tmp_rs = (ref $self)->new($self->result_source, $attrs);
-  my ($count) = $tmp_rs->cursor->next;
-  return $count;
+  return $rsrc->storage->$meth ($rsrc, $attrs);
 }
 
 sub _bool {
@@ -1269,6 +1275,72 @@
   return $_[0]->reset->next;
 }
 
+
+# _rs_update_delete
+#
+# Determines whether and what type of subquery is required for the $rs operation.
+# If grouping is necessary either supplies its own, or verifies the current one
+# After all is done delegates to the proper storage method.
+
+sub _rs_update_delete {
+  my ($self, $op, $values) = @_;
+
+  my $rsrc = $self->result_source;
+
+  my $needs_group_by_subq = $self->_has_attr (qw/prefetch distinct join seen_join group_by/);
+  my $needs_subq = $self->_has_attr (qw/row offset page/);
+
+  if ($needs_group_by_subq or $needs_subq) {
+
+    # make a new $rs selecting only the PKs (that's all we really need)
+    my $attrs = $self->_resolved_attrs_copy;
+
+    delete $attrs->{$_} for qw/prefetch collapse select +select as +as columns +columns/;
+    $attrs->{columns} = [ map { "$attrs->{alias}.$_" } ($self->result_source->primary_columns) ];
+
+    if ($needs_group_by_subq) {
+      # make sure no group_by was supplied, or if there is one - make sure it matches
+      # the columns compiled above perfectly. Anything else can not be sanely executed
+      # on most databases so croak right then and there
+
+      if (my $g = $attrs->{group_by}) {
+        my @current_group_by = map
+          { $_ =~ /\./ ? $_ : "$attrs->{alias}.$_" }
+          (ref $g eq 'ARRAY' ? @$g : $g );
+
+        if (
+          join ("\x00", sort @current_group_by)
+            ne
+          join ("\x00", sort @{$attrs->{columns}} )
+        ) {
+          $self->throw_exception (
+            "You have just attempted a $op operation on a resultset which does group_by"
+            . ' on columns other than the primary keys, while DBIC internally needs to retrieve'
+            . ' the primary keys in a subselect. All sane RDBMS engines do not support this'
+            . ' kind of queries. Please retry the operation with a modified group_by or'
+            . ' without using one at all.'
+          );
+        }
+      }
+      else {
+        $attrs->{group_by} = $attrs->{columns};
+      }
+    }
+
+    my $subrs = (ref $self)->new($rsrc, $attrs);
+
+    return $self->result_source->storage->subq_update_delete($subrs, $op, $values);
+  }
+  else {
+    return $rsrc->storage->$op(
+      $rsrc,
+      $op eq 'update' ? $values : (),
+      $self->_cond_for_update_delete,
+    );
+  }
+}
+
+
 # _cond_for_update_delete
 #
 # update/delete require the condition to be modified to handle
@@ -1298,11 +1370,9 @@
   elsif (ref $full_cond eq 'HASH') {
     if ((keys %{$full_cond})[0] eq '-and') {
       $cond->{-and} = [];
-
       my @cond = @{$full_cond->{-and}};
-      for (my $i = 0; $i < @cond; $i++) {
+       for (my $i = 0; $i < @cond; $i++) {
         my $entry = $cond[$i];
-
         my $hash;
         if (ref $entry eq 'HASH') {
           $hash = $self->_cond_for_update_delete($entry);
@@ -1311,7 +1381,6 @@
           $entry =~ /([^.]+)$/;
           $hash->{$1} = $cond[++$i];
         }
-
         push @{$cond->{-and}}, $hash;
       }
     }
@@ -1323,9 +1392,7 @@
     }
   }
   else {
-    $self->throw_exception(
-      "Can't update/delete on resultset with condition unless hash or array"
-    );
+    $self->throw_exception("Can't update/delete on resultset with condition unless hash or array");
   }
 
   return $cond;
@@ -1350,19 +1417,10 @@
 
 sub update {
   my ($self, $values) = @_;
-  $self->throw_exception("Values for update must be a hash")
+  $self->throw_exception('Values for update must be a hash')
     unless ref $values eq 'HASH';
 
-  carp(   'WARNING! Currently $rs->update() does not generate proper SQL'
-        . ' on joined resultsets, and may affect rows well outside of the'
-        . ' contents of $rs. Use at your own risk' )
-    if ( $self->{attrs}{seen_join} );
-
-  my $cond = $self->_cond_for_update_delete;
-   
-  return $self->result_source->storage->update(
-    $self->result_source, $values, $cond
-  );
+  return $self->_rs_update_delete ('update', $values);
 }
 
 =head2 update_all
@@ -1382,7 +1440,7 @@
 
 sub update_all {
   my ($self, $values) = @_;
-  $self->throw_exception("Values for update must be a hash")
+  $self->throw_exception('Values for update_all must be a hash')
     unless ref $values eq 'HASH';
   foreach my $obj ($self->all) {
     $obj->set_columns($values)->update;
@@ -1396,7 +1454,7 @@
 
 =item Arguments: none
 
-=item Return Value: 1
+=item Return Value: $storage_rv
 
 =back
 
@@ -1404,30 +1462,17 @@
 will not run DBIC cascade triggers. See L</delete_all> if you need triggers
 to run. See also L<DBIx::Class::Row/delete>.
 
-delete may not generate correct SQL for a query with joins or a resultset
-chained from a related resultset.  In this case it will generate a warning:-
+Return value will be the amount of rows deleted; exact type of return value
+is storage-dependent.
 
-  WARNING! Currently $rs->delete() does not generate proper SQL on
-  joined resultsets, and may delete rows well outside of the contents
-  of $rs. Use at your own risk
-
-In these cases you may find that delete_all is more appropriate, or you
-need to respecify your query in a way that can be expressed without a join.
-
 =cut
 
 sub delete {
-  my ($self) = @_;
-  $self->throw_exception("Delete should not be passed any arguments")
-    if $_[1];
-  carp(   'WARNING! Currently $rs->delete() does not generate proper SQL'
-        . ' on joined resultsets, and may delete rows well outside of the'
-        . ' contents of $rs. Use at your own risk' )
-    if ( $self->{attrs}{seen_join} );
-  my $cond = $self->_cond_for_update_delete;
+  my $self = shift;
+  $self->throw_exception('delete does not accept any arguments')
+    if @_;
 
-  $self->result_source->storage->delete($self->result_source, $cond);
-  return 1;
+  return $self->_rs_update_delete ('delete');
 }
 
 =head2 delete_all
@@ -1446,7 +1491,10 @@
 =cut
 
 sub delete_all {
-  my ($self) = @_;
+  my $self = shift;
+  $self->throw_exception('delete_all does not accept any arguments')
+    if @_;
+
   $_->delete for $self->all;
   return 1;
 }
@@ -1464,7 +1512,7 @@
 forsubmitting to a $resultset->create(...) method.
 
 In void context, C<insert_bulk> in L<DBIx::Class::Storage::DBI> is used
-to insert the data, as this is a faster method.  
+to insert the data, as this is a faster method.
 
 Otherwise, each set of data is inserted into the database using
 L<DBIx::Class::ResultSet/create>, and a arrayref of the resulting row
@@ -1473,10 +1521,10 @@
 Example:  Assuming an Artist Class that has many CDs Classes relating:
 
   my $Artist_rs = $schema->resultset("Artist");
-  
-  ## Void Context Example 
+
+  ## Void Context Example
   $Artist_rs->populate([
-     { artistid => 4, name => 'Manufactured Crap', cds => [ 
+     { artistid => 4, name => 'Manufactured Crap', cds => [
         { title => 'My First CD', year => 2006 },
         { title => 'Yet More Tweeny-Pop crap', year => 2007 },
       ],
@@ -1488,7 +1536,7 @@
       ],
      },
   ]);
-  
+
   ## Array Context Example
   my ($ArtistOne, $ArtistTwo, $ArtistThree) = $Artist_rs->populate([
     { name => "Artist One"},
@@ -1498,7 +1546,7 @@
     { title => "Second CD", year => 2008},
   ]}
   ]);
-  
+
   print $ArtistOne->name; ## response is 'Artist One'
   print $ArtistThree->cds->count ## reponse is '2'
 
@@ -1514,11 +1562,11 @@
   ]);
 
 Please note an important effect on your data when choosing between void and
-wantarray context. Since void context goes straight to C<insert_bulk> in 
+wantarray context. Since void context goes straight to C<insert_bulk> in
 L<DBIx::Class::Storage::DBI> this will skip any component that is overriding
-c<insert>.  So if you are using something like L<DBIx-Class-UUIDColumns> to 
-create primary keys for you, you will find that your PKs are empty.  In this 
-case you will have to use the wantarray context in order to create those 
+C<insert>.  So if you are using something like L<DBIx-Class-UUIDColumns> to
+create primary keys for you, you will find that your PKs are empty.  In this
+case you will have to use the wantarray context in order to create those
 values.
 
 =cut
@@ -1528,7 +1576,7 @@
   my $data = ref $_[0][0] eq 'HASH'
     ? $_[0] : ref $_[0][0] eq 'ARRAY' ? $self->_normalize_populate_args($_[0]) :
     $self->throw_exception('Populate expects an arrayref of hashes or arrayref of arrayrefs');
-  
+
   if(defined wantarray) {
     my @created;
     foreach my $item (@$data) {
@@ -1540,28 +1588,34 @@
 
     my @names = grep {!ref $first->{$_}} keys %$first;
     my @rels = grep { $self->result_source->has_relationship($_) } keys %$first;
-    my @pks = $self->result_source->primary_columns;  
+    my @pks = $self->result_source->primary_columns;
 
-    ## do the belongs_to relationships  
+    ## do the belongs_to relationships
     foreach my $index (0..$#$data) {
-      if( grep { !defined $data->[$index]->{$_} } @pks ) {
-        my @ret = $self->populate($data);
-        return;
+
+      # delegate to create() for any dataset without primary keys with specified relationships
+      if (grep { !defined $data->[$index]->{$_} } @pks ) {
+        for my $r (@rels) {
+          if (grep { ref $data->[$index]{$r} eq $_ } qw/HASH ARRAY/) {  # a related set must be a HASH or AoH
+            my @ret = $self->populate($data);
+            return;
+          }
+        }
       }
-    
+
       foreach my $rel (@rels) {
-        next unless $data->[$index]->{$rel} && ref $data->[$index]->{$rel} eq "HASH";
+        next unless ref $data->[$index]->{$rel} eq "HASH";
         my $result = $self->related_resultset($rel)->create($data->[$index]->{$rel});
         my ($reverse) = keys %{$self->result_source->reverse_relationship_info($rel)};
-        my $related = $result->result_source->resolve_condition(
+        my $related = $result->result_source->_resolve_condition(
           $result->result_source->relationship_info($reverse)->{cond},
-          $self,        
-          $result,        
+          $self,
+          $result,
         );
 
         delete $data->[$index]->{$rel};
         $data->[$index] = {%{$data->[$index]}, %$related};
-      
+
         push @names, keys %$related if $index == 0;
       }
     }
@@ -1570,8 +1624,8 @@
     my @values = map { [ @$_{@names} ] } @$data;
 
     $self->result_source->storage->insert_bulk(
-      $self->result_source, 
-      \@names, 
+      $self->result_source,
+      \@names,
       \@values,
     );
 
@@ -1581,12 +1635,12 @@
       foreach my $rel (@rels) {
         next unless $item->{$rel} && ref $item->{$rel} eq "ARRAY";
 
-        my $parent = $self->find(map {{$_=>$item->{$_}} } @pks) 
+        my $parent = $self->find(map {{$_=>$item->{$_}} } @pks)
      || $self->throw_exception('Cannot find the relating object.');
-     
+
         my $child = $parent->$rel;
-    
-        my $related = $child->result_source->resolve_condition(
+
+        my $related = $child->result_source->_resolve_condition(
           $parent->result_source->relationship_info($rel)->{cond},
           $child,
           $parent,
@@ -1618,7 +1672,7 @@
     foreach my $index (0..$#names) {
       $result_to_create{$names[$index]} = $$datum[$index];
     }
-    push @results_to_create, \%result_to_create;    
+    push @results_to_create, \%result_to_create;
   }
   return \@results_to_create;
 }
@@ -1636,16 +1690,32 @@
 Return Value a L<Data::Page> object for the current resultset. Only makes
 sense for queries with a C<page> attribute.
 
+To get the full count of entries for a paged resultset, call
+C<total_entries> on the L<Data::Page> object.
+
 =cut
 
 sub pager {
   my ($self) = @_;
+
+  return $self->{pager} if $self->{pager};
+
   my $attrs = $self->{attrs};
   $self->throw_exception("Can't create pager for non-paged rs")
     unless $self->{attrs}{page};
   $attrs->{rows} ||= 10;
-  return $self->{pager} ||= Data::Page->new(
-    $self->_count, $attrs->{rows}, $self->{attrs}{page});
+
+  # throw away the paging flags and re-run the count (possibly
+  # with a subselect) to get the real total count
+  my $count_attrs = { %$attrs };
+  delete $count_attrs->{$_} for qw/rows offset page pager/;
+  my $total_count = (ref $self)->new($self->result_source, $count_attrs)->count;
+
+  return $self->{pager} = Data::Page->new(
+    $total_count,
+    $attrs->{rows},
+    $self->{attrs}{page}
+  );
 }
 
 =head2 page
@@ -1706,13 +1776,13 @@
     $self->throw_exception(
       "Can't abstract implicit construct, condition not a hash"
     ) if ($self->{cond} && !(ref $self->{cond} eq 'HASH'));
-  
+
     my $collapsed_cond = (
       $self->{cond}
         ? $self->_collapse_cond($self->{cond})
         : {}
     );
-  
+
     # precendence must be given to passed values over values inherited from
     # the cond, so the order here is important.
     my %implied =  %{$self->_remove_alias($collapsed_cond, $alias)};
@@ -1737,7 +1807,7 @@
 
 # _is_deterministic_value
 #
-# Make an effor to strip non-deterministic values from the condition, 
+# Make an effor to strip non-deterministic values from the condition,
 # to make sure new_result chokes less
 
 sub _is_deterministic_value {
@@ -1749,6 +1819,50 @@
   return 0;
 }
 
+# _has_attr
+#
+# determines if the resultset defines at least one
+# of the attributes supplied
+#
+# used to determine if a subquery is neccessary
+
+sub _has_attr {
+  my ($self, @attr_names) = @_;
+
+  my $attrs = $self->_resolved_attrs;
+
+  my $join_check_req;
+
+  for my $n (@attr_names) {
+    ++$join_check_req if $n =~ /join/;
+
+    my $attr =  $attrs->{$n};
+
+    next if not defined $attr;
+
+    if (ref $attr eq 'HASH') {
+      return 1 if keys %$attr;
+    }
+    elsif (ref $attr eq 'ARRAY') {
+      return 1 if @$attr;
+    }
+    else {
+      return 1 if $attr;
+    }
+  }
+
+  # a join can be expressed as a multi-level from
+  return 1 if (
+    $join_check_req
+      and
+    ref $attrs->{from} eq 'ARRAY'
+      and
+    @{$attrs->{from}} > 1
+  );
+
+  return 0;
+}
+
 # _collapse_cond
 #
 # Recursively collapse the condition.
@@ -1761,19 +1875,16 @@
   if (ref $cond eq 'ARRAY') {
     foreach my $subcond (@$cond) {
       next unless ref $subcond;  # -or
-#      warn "ARRAY: " . Dumper $subcond;
       $collapsed = $self->_collapse_cond($subcond, $collapsed);
     }
   }
   elsif (ref $cond eq 'HASH') {
     if (keys %$cond and (keys %$cond)[0] eq '-and') {
       foreach my $subcond (@{$cond->{-and}}) {
-#        warn "HASH: " . Dumper $subcond;
         $collapsed = $self->_collapse_cond($subcond, $collapsed);
       }
     }
     else {
-#      warn "LEAF: " . Dumper $cond;
       foreach my $col (keys %$cond) {
         my $value = $cond->{$col};
         $collapsed->{$col} = $value;
@@ -1807,7 +1918,7 @@
   return \%unaliased;
 }
 
-=head2 as_query
+=head2 as_query (EXPERIMENTAL)
 
 =over 4
 
@@ -1821,6 +1932,8 @@
 
 This is generally used as the RHS for a subquery.
 
+B<NOTE>: This feature is still experimental.
+
 =cut
 
 sub as_query { return shift->cursor->as_query(@_) }
@@ -1908,12 +2021,12 @@
     name=>"Some Person",
     email=>"somebody at someplace.com"
   });
-  
+
 Example of creating a new row and also creating rows in a related C<has_many>
 or C<has_one> resultset.  Note Arrayref.
 
   $artist_rs->create(
-     { artistid => 4, name => 'Manufactured Crap', cds => [ 
+     { artistid => 4, name => 'Manufactured Crap', cds => [
         { title => 'My First CD', year => 2006 },
         { title => 'Yet More Tweeny-Pop crap', year => 2007 },
       ],
@@ -2029,10 +2142,10 @@
     { key => 'cd_artist_title' }
   );
 
-  $cd->cd_to_producer->update_or_create({ 
-    producer => $producer, 
+  $cd->cd_to_producer->update_or_create({
+    producer => $producer,
     name => 'harry',
-  }, { 
+  }, {
     key => 'primary,
   });
 
@@ -2067,6 +2180,63 @@
   return $self->create($cond);
 }
 
+=head2 update_or_new
+
+=over 4
+
+=item Arguments: \%col_values, { key => $unique_constraint }?
+
+=item Return Value: $rowobject
+
+=back
+
+  $resultset->update_or_new({ col => $val, ... });
+
+First, searches for an existing row matching one of the unique constraints
+(including the primary key) on the source of this resultset. If a row is
+found, updates it with the other given column values. Otherwise, instantiate
+a new result object and return it. The object will not be saved into your storage
+until you call L<DBIx::Class::Row/insert> on it.
+
+Takes an optional C<key> attribute to search on a specific unique constraint.
+For example:
+
+  # In your application
+  my $cd = $schema->resultset('CD')->update_or_new(
+    {
+      artist => 'Massive Attack',
+      title  => 'Mezzanine',
+      year   => 1998,
+    },
+    { key => 'cd_artist_title' }
+  );
+
+  if ($cd->in_storage) {
+      # the cd was updated
+  }
+  else {
+      # the cd is not yet in the database, let's insert it
+      $cd->insert;
+  }
+
+See also L</find>, L</find_or_create> and L<find_or_new>.
+
+=cut
+
+sub update_or_new {
+    my $self  = shift;
+    my $attrs = ( @_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {} );
+    my $cond  = ref $_[0] eq 'HASH' ? shift : {@_};
+
+    my $row = $self->find( $cond, $attrs );
+    if ( defined $row ) {
+        $row->update($cond);
+        return $row;
+    }
+
+    return $self->new_result($cond);
+}
+
 =head2 get_cache
 
 =over 4
@@ -2160,7 +2330,7 @@
       "search_related: result source '" . $self->result_source->source_name .
         "' has no such relationship $rel")
       unless $rel_obj;
-    
+
     my ($from,$seen) = $self->_resolve_from($rel);
 
     my $join_count = $seen->{$rel};
@@ -2253,32 +2423,43 @@
   return ($self->{attrs} || {})->{alias} || 'me';
 }
 
+# This code is called by search_related, and makes sure there
+# is clear separation between the joins before, during, and
+# after the relationship. This information is needed later
+# in order to properly resolve prefetch aliases (any alias
+# with a relation_chain_depth less than the depth of the
+# current prefetch is not considered)
 sub _resolve_from {
   my ($self, $extra_join) = @_;
   my $source = $self->result_source;
   my $attrs = $self->{attrs};
-  
+
   my $from = $attrs->{from}
     || [ { $attrs->{alias} => $source->from } ];
-    
-  my $seen = { %{$attrs->{seen_join}||{}} };
 
-  my $join = ($attrs->{join}
-               ? [ $attrs->{join}, $extra_join ]
-               : $extra_join);
+  my $seen = $attrs->{seen_join} || {};
 
-  # we need to take the prefetch the attrs into account before we 
-  # ->resolve_join as otherwise they get lost - captainL
-  my $merged = $self->_merge_attr( $join, $attrs->{prefetch} );
+  # we need to take the prefetch the attrs into account before we
+  # ->_resolve_join as otherwise they get lost - captainL
+  my $merged = $self->_merge_attr( $attrs->{join}, $attrs->{prefetch} );
 
-  $from = [
-    @$from,
-    ($join ? $source->resolve_join($merged, $attrs->{alias}, $seen) : ()),
-  ];
+  push @$from, $source->_resolve_join($merged, $attrs->{alias}, $seen) if ($merged);
 
+  ++$seen->{-relation_chain_depth};
+
+  push @$from, $source->_resolve_join($extra_join, $attrs->{alias}, $seen);
+
+  ++$seen->{-relation_chain_depth};
+
   return ($from,$seen);
 }
 
+# too many times we have to do $attrs = { %{$self->_resolved_attrs} }
+sub _resolved_attrs_copy {
+  my $self = shift;
+  return { %{$self->_resolved_attrs (@_)} };
+}
+
 sub _resolved_attrs {
   my $self = shift;
   return $self->{_attrs} if $self->{_attrs};
@@ -2293,12 +2474,20 @@
   # build columns (as long as select isn't set) into a set of as/select hashes
   unless ( $attrs->{select} ) {
       @colbits = map {
-          ( ref($_) eq 'HASH' ) ? $_
-            : {
-              (
-                  /^\Q${alias}.\E(.+)$/ ? $1
-                  : $_
-                ) => ( /\./ ? $_ : "${alias}.$_" )
+          ( ref($_) eq 'HASH' )
+              ? $_
+              : {
+                  (
+                    /^\Q${alias}.\E(.+)$/
+                      ? "$1"
+                      : "$_"
+                  )
+                =>
+                  (
+                    /\./
+                      ? "$_"
+                      : "${alias}.$_"
+                  )
             }
       } ( ref($attrs->{columns}) eq 'ARRAY' ) ? @{ delete $attrs->{columns}} : (delete $attrs->{columns} || $source->columns );
   }
@@ -2364,15 +2553,13 @@
     $attrs->{from} =    # have to copy here to avoid corrupting the original
       [
       @{ $attrs->{from} },
-      $source->resolve_join(
+      $source->_resolve_join(
         $join, $alias, { %{ $attrs->{seen_join} || {} } }
       )
       ];
 
   }
 
-  $attrs->{group_by} ||= $attrs->{select}
-    if delete $attrs->{distinct};
   if ( $attrs->{order_by} ) {
     $attrs->{order_by} = (
       ref( $attrs->{order_by} ) eq 'ARRAY'
@@ -2388,30 +2575,53 @@
   if ( my $prefetch = delete $attrs->{prefetch} ) {
     $prefetch = $self->_merge_attr( {}, $prefetch );
     my @pre_order;
-    my $seen = { %{ $attrs->{seen_join} || {} } };
     foreach my $p ( ref $prefetch eq 'ARRAY' ? @$prefetch : ($prefetch) ) {
 
       # bring joins back to level of current class
+      my $join_map = $self->_joinpath_aliases ($attrs->{from}, $attrs->{seen_join});
       my @prefetch =
-        $source->resolve_prefetch( $p, $alias, $seen, \@pre_order, $collapse );
+        $source->_resolve_prefetch( $p, $alias, $join_map, \@pre_order, $collapse );
       push( @{ $attrs->{select} }, map { $_->[0] } @prefetch );
       push( @{ $attrs->{as} },     map { $_->[1] } @prefetch );
     }
     push( @{ $attrs->{order_by} }, @pre_order );
   }
+
+  if (delete $attrs->{distinct}) {
+    $attrs->{group_by} ||= [ grep { !ref($_) || (ref($_) ne 'HASH') } @{$attrs->{select}} ];
+  }
+
   $attrs->{collapse} = $collapse;
 
-  if ( $attrs->{page} ) {
-    $attrs->{offset} ||= 0;
-    $attrs->{offset} += ( $attrs->{rows} * ( $attrs->{page} - 1 ) );
+  if ( $attrs->{page} and not defined $attrs->{offset} ) {
+    $attrs->{offset} = ( $attrs->{rows} * ( $attrs->{page} - 1 ) );
   }
 
   return $self->{_attrs} = $attrs;
 }
 
+sub _joinpath_aliases {
+  my ($self, $fromspec, $seen) = @_;
+
+  my $paths = {};
+  return $paths unless ref $fromspec eq 'ARRAY';
+
+  for my $j (@$fromspec) {
+
+    next if ref $j ne 'ARRAY';
+    next if $j->[0]{-relation_chain_depth} < ( $seen->{-relation_chain_depth} || 0);
+
+    my $p = $paths;
+    $p = $p->{$_} ||= {} for @{$j->[0]{-join_path}};
+    push @{$p->{-join_aliases} }, $j->[0]{-join_alias};
+  }
+
+  return $paths;
+}
+
 sub _rollout_attr {
   my ($self, $attr) = @_;
-  
+
   if (ref $attr eq 'HASH') {
     return $self->_rollout_hash($attr);
   } elsif (ref $attr eq 'ARRAY') {
@@ -2462,7 +2672,7 @@
       }
     } else {
       return ($a eq $b_key) ? 1 : 0;
-    }       
+    }
   } else {
     if (ref $a eq 'HASH') {
       my ($a_key) = keys %{$a};
@@ -2478,7 +2688,7 @@
 
   return $import unless defined($orig);
   return $orig unless defined($import);
-  
+
   $orig = $self->_rollout_attr($orig);
   $import = $self->_rollout_attr($import);
 
@@ -2754,19 +2964,19 @@
     }
   );
 
-You need to use the relationship (not the table) name in  conditions, 
-because they are aliased as such. The current table is aliased as "me", so 
+You need to use the relationship (not the table) name in  conditions,
+because they are aliased as such. The current table is aliased as "me", so
 you need to use me.column_name in order to avoid ambiguity. For example:
 
-  # Get CDs from 1984 with a 'Foo' track 
+  # Get CDs from 1984 with a 'Foo' track
   my $rs = $schema->resultset('CD')->search(
-    { 
+    {
       'me.year' => 1984,
       'tracks.name' => 'Foo'
     },
     { join => 'tracks' }
   );
-  
+
 If the same join is supplied twice, it will be aliased to <rel>_2 (and
 similarly for a third time). For e.g.
 
@@ -2819,12 +3029,12 @@
 case.
 
 Simple prefetches will be joined automatically, so there is no need
-for a C<join> attribute in the above search. 
+for a C<join> attribute in the above search.
 
 C<prefetch> can be used with the following relationship types: C<belongs_to>,
 C<has_one> (or if you're using C<add_relationship>, any relationship declared
 with an accessor type of 'single' or 'filter'). A more complex example that
-prefetches an artists cds, the tracks on those cds, and the tags associted 
+prefetches an artists cds, the tracks on those cds, and the tags associted
 with that artist is given below (assuming many-to-many from artists to tags):
 
  my $rs = $schema->resultset('Artist')->search(
@@ -2836,8 +3046,8 @@
      ]
    }
  );
- 
 
+
 B<NOTE:> If you specify a C<prefetch> attribute, the C<join> and C<select>
 attributes will be ignored.
 
@@ -2855,6 +3065,10 @@
 
 If L<rows> attribute is not specified it defualts to 10 rows per page.
 
+When you have a paged resultset, L</count> will only return the number
+of rows in the page. To get the total, use the L</pager> and call
+C<total_entries> on it.
+
 =head2 rows
 
 =over 4
@@ -3084,12 +3298,12 @@
     $table = $rs->result_source->name;
     $latest = $rs->search (
         undef,
-        { from => \ " 
-            (SELECT e1.* FROM $table e1 
-                JOIN $table e2 
-                    ON e1.location = e2.location 
-                    AND e1.sequence < e2.sequence 
-                WHERE e2.sequence is NULL 
+        { from => \ "
+            (SELECT e1.* FROM $table e1
+                JOIN $table e2
+                    ON e1.location = e2.location
+                    AND e1.sequence < e2.sequence
+                WHERE e2.sequence is NULL
             ) me",
         },
     );


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSet.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSetColumn.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSetColumn.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSetColumn.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -36,25 +36,35 @@
 sub new {
   my ($class, $rs, $column) = @_;
   $class = ref $class if ref $class;
+
+  $rs->throw_exception("column must be supplied") unless $column;
+
   my $new_parent_rs = $rs->search_rs; # we don't want to mess up the original, so clone it
-  my $attrs = $new_parent_rs->_resolved_attrs;
-  $new_parent_rs->{attrs}->{$_} = undef for qw(prefetch include_columns +select +as); # prefetch, include_columns, +select, +as cause additional columns to be fetched
 
+  # prefetch causes additional columns to be fetched, but we can not just make a new
+  # rs via the _resolved_attrs trick - we need to retain the separation between
+  # +select/+as and select/as. At the same time we want to preserve any joins that the
+  # prefetch would otherwise generate.
+  my $init_attrs = $new_parent_rs->{attrs} ||= {};
+  delete $init_attrs->{collapse};
+  $init_attrs->{join} = $rs->_merge_attr( delete $init_attrs->{join}, delete $init_attrs->{prefetch} );
+
   # If $column can be found in the 'as' list of the parent resultset, use the
   # corresponding element of its 'select' list (to keep any custom column
   # definition set up with 'select' or '+select' attrs), otherwise use $column
   # (to create a new column definition on-the-fly).
+  my $attrs = $new_parent_rs->_resolved_attrs;
+
   my $as_list = $attrs->{as} || [];
   my $select_list = $attrs->{select} || [];
   my $as_index = List::Util::first { ($as_list->[$_] || "") eq $column } 0..$#$as_list;
   my $select = defined $as_index ? $select_list->[$as_index] : $column;
 
   my $new = bless { _select => $select, _as => $column, _parent_resultset => $new_parent_rs }, $class;
-  $new->throw_exception("column must be supplied") unless $column;
   return $new;
 }
 
-=head2 as_query
+=head2 as_query (EXPERIMENTAL)
 
 =over 4
 
@@ -68,9 +78,11 @@
 
 This is generally used as the RHS for a subquery.
 
+B<NOTE>: This feature is still experimental.
+
 =cut
 
-sub as_query { return shift->_resultset->as_query }
+sub as_query { return shift->_resultset->as_query(@_) }
 
 =head2 next
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSetColumn.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSetManager.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSetProxy.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource/Table.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource/View.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource/View.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource/View.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -46,7 +46,7 @@
 Deploying the view does B<not> translate it between different database
 syntaxes, so be careful what you write in your view SQL.
 
-Virtual views (L</is_virtual> unset or false), are assumed to not
+Virtual views (L</is_virtual> true), are assumed to not
 exist in your database as a real view. The L</view_definition> in this
 case replaces the view name in a FROM clause in a subselect.
 
@@ -54,13 +54,13 @@
 
 =over
 
-=item is_virtual set to true
+=item is_virtual set to false
 
   $schema->resultset('Year2000CDs')->all();
 
   SELECT cdid, artist, title FROM year2000cds me
 
-=item is_virtual set to false
+=item is_virtual set to true
 
   $schema->resultset('Year2000CDs')->all();
 
@@ -115,6 +115,8 @@
 
 Jess Robinson <castaway at desert-island.me.uk>
 
+Wallace Reis <wreis at cpan.org>
+
 =head1 LICENSE
 
 You may distribute this code under the same terms as Perl itself.


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource/View.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -113,7 +113,7 @@
 
 Set this to a true value for a column whose value is somehow
 automatically set. This is used to determine which columns to empty
-when cloning objects using C<copy>. It is also used by
+when cloning objects using L<DBIx::Class::Row/copy>. It is also used by
 L<DBIx::Class::Schema/deploy>.
 
 =item is_foreign_key
@@ -125,9 +125,13 @@
 =item default_value
 
 Set this to the default value which will be inserted into a column
-by the database. Can contain either a value or a function. This is
-currently only used by L<DBIx::Class::Schema/deploy>.
+by the database. Can contain either a value or a function (use a
+reference to a scalar e.g. C<\'now()'> if you want a function). This
+is currently only used by L<DBIx::Class::Schema/deploy>.
 
+See the note on L<DBIx::Class::Row/new> for more information about possible
+issues related to db-side default values.
+
 =item sequence
 
 Set this on a primary key column to the name of the sequence used to
@@ -837,7 +841,7 @@
 =back
 
 Throws an exception if the condition is improperly supplied, or cannot
-be resolved using L</resolve_join>.
+be resolved.
 
 =cut
 
@@ -877,7 +881,7 @@
   }
   return unless $f_source; # Can't test rel without f_source
 
-  eval { $self->resolve_join($rel, 'me') };
+  eval { $self->_resolve_join($rel, 'me') };
 
   if ($@) { # If the resolve failed, back out and re-throw the error
     delete $rels{$rel}; #
@@ -1011,29 +1015,22 @@
       my @other_cond = keys(%$othercond);
       my @other_refkeys = map {/^\w+\.(\w+)$/} @other_cond;
       my @other_keys = map {$othercond->{$_} =~ /^\w+\.(\w+)$/} @other_cond;
-      next if (!$self->compare_relationship_keys(\@refkeys, \@other_keys) ||
-               !$self->compare_relationship_keys(\@other_refkeys, \@keys));
+      next if (!$self->_compare_relationship_keys(\@refkeys, \@other_keys) ||
+               !$self->_compare_relationship_keys(\@other_refkeys, \@keys));
       $ret->{$otherrel} =  $otherrel_info;
     }
   }
   return $ret;
 }
 
-=head2 compare_relationship_keys
+sub compare_relationship_keys {
+  carp 'compare_relationship_keys is a private method, stop calling it';
+  my $self = shift;
+  $self->_compare_relationship_keys (@_);
+}
 
-=over 4
-
-=item Arguments: \@keys1, \@keys2
-
-=item Return value: 1/0 (true/false)
-
-=back
-
-Returns true if both sets of keynames are the same, false otherwise.
-
-=cut
-
-sub compare_relationship_keys {
+# Returns true if both sets of keynames are the same, false otherwise.
+sub _compare_relationship_keys {
   my ($self, $keys1, $keys2) = @_;
 
   # Make sure every keys1 is in keys2
@@ -1066,44 +1063,54 @@
   return $found;
 }
 
-=head2 resolve_join
+sub resolve_join {
+  carp 'resolve_join is a private method, stop calling it';
+  my $self = shift;
+  $self->_resolve_join (@_);
+}
 
-=over 4
+# Returns the {from} structure used to express JOIN conditions
+sub _resolve_join {
+  my ($self, $join, $alias, $seen, $force_left, $jpath) = @_;
 
-=item Arguments: $relation
+  # we need a supplied one, because we do in-place modifications, no returns
+  $self->throw_exception ('You must supply a seen hashref as the 3rd argument to _resolve_join')
+    unless $seen;
 
-=item Return value: Join condition arrayref
+  $force_left ||= { force => 0 };
 
-=back
+  # This isn't quite right, we should actually dive into $seen and reconstruct
+  # the entire path (the reference entry point would be the join conditional
+  # with depth == current_depth - 1. At this point however nothing depends on
+  # having the entire path, transcending related_resultset, so just leave it
+  # as is, hairy enough already.
+  $jpath ||= [];  
 
-Returns the join structure required for the related result source.
-
-=cut
-
-sub resolve_join {
-  my ($self, $join, $alias, $seen, $force_left) = @_;
-  $seen ||= {};
-  $force_left ||= { force => 0 };
   if (ref $join eq 'ARRAY') {
-    return map { $self->resolve_join($_, $alias, $seen) } @$join;
+    return
+      map {
+        local $force_left->{force} = $force_left->{force};
+        $self->_resolve_join($_, $alias, $seen, $force_left, [@$jpath]);
+      } @$join;
   } elsif (ref $join eq 'HASH') {
     return
       map {
-        my $as = ($seen->{$_} ? $_.'_'.($seen->{$_}+1) : $_);
-        local $force_left->{force};
+        my $as = ($seen->{$_} ? join ('_', $_, $seen->{$_} + 1) : $_);  # the actual seen value will be incremented below
+        local $force_left->{force} = $force_left->{force};
         (
-          $self->resolve_join($_, $alias, $seen, $force_left),
-          $self->related_source($_)->resolve_join(
-            $join->{$_}, $as, $seen, $force_left
+          $self->_resolve_join($_, $alias, $seen, $force_left, [@$jpath]),
+          $self->related_source($_)->_resolve_join(
+            $join->{$_}, $as, $seen, $force_left, [@$jpath, $_]
           )
         );
       } keys %$join;
   } elsif (ref $join) {
     $self->throw_exception("No idea how to resolve join reftype ".ref $join);
   } else {
+
     my $count = ++$seen->{$join};
-    #use Data::Dumper; warn Dumper($seen);
     my $as = ($count > 1 ? "${join}_${count}" : $join);
+
     my $rel_info = $self->relationship_info($join);
     $self->throw_exception("No such relationship ${join}") unless $rel_info;
     my $type;
@@ -1114,28 +1121,25 @@
       $force_left->{force} = 1 if lc($type) eq 'left';
     }
     return [ { $as => $self->related_source($join)->from,
-               -join_type => $type },
-             $self->resolve_condition($rel_info->{cond}, $as, $alias) ];
+               -join_type => $type,
+               -join_path => [@$jpath, $join],
+               -join_alias => $as,
+               -relation_chain_depth => $seen->{-relation_chain_depth} || 0,
+             },
+             $self->_resolve_condition($rel_info->{cond}, $as, $alias) ];
   }
 }
 
-=head2 pk_depends_on
+sub pk_depends_on {
+  carp 'pk_depends_on is a private method, stop calling it';
+  my $self = shift;
+  $self->_pk_depends_on (@_);
+}
 
-=over 4
-
-=item Arguments: $relname, $rel_data
-
-=item Return value: 1/0 (true/false)
-
-=back
-
-Determines whether a relation is dependent on an object from this source
-having already been inserted. Takes the name of the relationship and a
-hashref of columns of the related object.
-
-=cut
-
-sub pk_depends_on {
+# Determines whether a relation is dependent on an object from this source
+# having already been inserted. Takes the name of the relationship and a
+# hashref of columns of the related object.
+sub _pk_depends_on {
   my ($self, $relname, $rel_data) = @_;
   my $cond = $self->relationship_info($relname)->{cond};
 
@@ -1164,23 +1168,18 @@
   return 1;
 }
 
-=head2 resolve_condition
+sub resolve_condition {
+  carp 'resolve_condition is a private method, stop calling it';
+  my $self = shift;
+  $self->_resolve_condition (@_);
+}
 
-=over 4
-
-=item Arguments: $cond, $as, $alias|$object
-
-=back
-
-Resolves the passed condition to a concrete query fragment. If given an alias,
-returns a join condition; if given an object, inverts that object to produce
-a related conditional from that object.
-
-=cut
-
+# Resolves the passed condition to a concrete query fragment. If given an alias,
+# returns a join condition; if given an object, inverts that object to produce
+# a related conditional from that object.
 our $UNRESOLVABLE_CONDITION = \'1 = 0';
 
-sub resolve_condition {
+sub _resolve_condition {
   my ($self, $cond, $as, $for) = @_;
   #warn %$cond;
   if (ref $cond eq 'HASH') {
@@ -1196,7 +1195,11 @@
         #warn "$self $k $for $v";
         unless ($for->has_column_loaded($v)) {
           if ($for->in_storage) {
-            $self->throw_exception("Column ${v} not loaded on ${for} trying to resolve relationship");
+            $self->throw_exception(
+              "Column ${v} not loaded or not passed to new() prior to insert()"
+                ." on ${for} trying to resolve relationship (maybe you forgot "
+                  ."to call ->discard_changes to get defaults from the db)"
+            );
           }
           return $UNRESOLVABLE_CONDITION;
         }
@@ -1217,66 +1220,18 @@
     }
     return \%ret;
   } elsif (ref $cond eq 'ARRAY') {
-    return [ map { $self->resolve_condition($_, $as, $for) } @$cond ];
+    return [ map { $self->_resolve_condition($_, $as, $for) } @$cond ];
   } else {
    die("Can't handle this yet :(");
   }
 }
 
-=head2 resolve_prefetch
+# Legacy code, needs to go entirely away (fully replaced by _resolve_prefetch)
+sub resolve_prefetch {
+  carp 'resolve_prefetch is a private method, stop calling it';
 
-=over 4
-
-=item Arguments: hashref/arrayref/scalar
-
-=back
-
-Accepts one or more relationships for the current source and returns an
-array of column names for each of those relationships. Column names are
-prefixed relative to the current source, in accordance with where they appear
-in the supplied relationships. Examples:
-
-  my $source = $schema->resultset('Tag')->source;
-  @columns = $source->resolve_prefetch( { cd => 'artist' } );
-
-  # @columns =
-  #(
-  #  'cd.cdid',
-  #  'cd.artist',
-  #  'cd.title',
-  #  'cd.year',
-  #  'cd.artist.artistid',
-  #  'cd.artist.name'
-  #)
-
-  @columns = $source->resolve_prefetch( qw[/ cd /] );
-
-  # @columns =
-  #(
-  #   'cd.cdid',
-  #   'cd.artist',
-  #   'cd.title',
-  #   'cd.year'
-  #)
-
-  $source = $schema->resultset('CD')->source;
-  @columns = $source->resolve_prefetch( qw[/ artist producer /] );
-
-  # @columns =
-  #(
-  #  'artist.artistid',
-  #  'artist.name',
-  #  'producer.producerid',
-  #  'producer.name'
-  #)
-
-=cut
-
-sub resolve_prefetch {
   my ($self, $pre, $alias, $seen, $order, $collapse) = @_;
   $seen ||= {};
-  #$alias ||= $self->name;
-  #warn $alias, Dumper $pre;
   if( ref $pre eq 'ARRAY' ) {
     return
       map { $self->resolve_prefetch( $_, $alias, $seen, $order, $collapse ) }
@@ -1289,7 +1244,6 @@
       $self->related_source($_)->resolve_prefetch(
                $pre->{$_}, "${alias}.$_", $seen, $order, $collapse)
     } keys %$pre;
-    #die Dumper \@ret;
     return @ret;
   }
   elsif( ref $pre ) {
@@ -1320,8 +1274,7 @@
             ? "at the same level (${as_prefix}) "
             : "at top level "
           )
-          . 'will currently disrupt both the functionality of $rs->count(), '
-          . 'and the amount of objects retrievable via $rs->next(). '
+          . 'will explode the number of row objects retrievable via ->next or ->all. '
           . 'Use at your own risk.'
         );
       }
@@ -1342,11 +1295,94 @@
 
     return map { [ "${as}.$_", "${as_prefix}${pre}.$_", ] }
       $rel_source->columns;
-    #warn $alias, Dumper (\@ret);
-    #return @ret;
   }
 }
 
+# Accepts one or more relationships for the current source and returns an
+# array of column names for each of those relationships. Column names are
+# prefixed relative to the current source, in accordance with where they appear
+# in the supplied relationships. Needs an alias_map generated by
+# $rs->_joinpath_aliases
+
+sub _resolve_prefetch {
+  my ($self, $pre, $alias, $alias_map, $order, $collapse, $pref_path) = @_;
+  $pref_path ||= [];
+
+  if( ref $pre eq 'ARRAY' ) {
+    return
+      map { $self->_resolve_prefetch( $_, $alias, $alias_map, $order, $collapse, [ @$pref_path ] ) }
+        @$pre;
+  }
+  elsif( ref $pre eq 'HASH' ) {
+    my @ret =
+    map {
+      $self->_resolve_prefetch($_, $alias, $alias_map, $order, $collapse, [ @$pref_path ] ),
+      $self->related_source($_)->_resolve_prefetch(
+               $pre->{$_}, "${alias}.$_", $alias_map, $order, $collapse, [ @$pref_path, $_] )
+    } keys %$pre;
+    return @ret;
+  }
+  elsif( ref $pre ) {
+    $self->throw_exception(
+      "don't know how to resolve prefetch reftype ".ref($pre));
+  }
+  else {
+
+    my $p = $alias_map;
+    $p = $p->{$_} for (@$pref_path, $pre);
+
+    $self->throw_exception (
+      "Unable to resolve prefetch $pre - join alias map does not contain an entry for path "
+      . join (' -> ', @$pref_path, $pre)
+    ) if (ref $p->{-join_aliases} ne 'ARRAY' or not @{$p->{-join_aliases}} );
+    
+    my $as = shift @{$p->{-join_aliases}};
+
+    my $rel_info = $self->relationship_info( $pre );
+    $self->throw_exception( $self->name . " has no such relationship '$pre'" )
+      unless $rel_info;
+    my $as_prefix = ($alias =~ /^.*?\.(.+)$/ ? $1.'.' : '');
+    my $rel_source = $self->related_source($pre);
+
+    if (exists $rel_info->{attrs}{accessor}
+         && $rel_info->{attrs}{accessor} eq 'multi') {
+      $self->throw_exception(
+        "Can't prefetch has_many ${pre} (join cond too complex)")
+        unless ref($rel_info->{cond}) eq 'HASH';
+      my $dots = @{[$as_prefix =~ m/\./g]} + 1; # +1 to match the ".${as_prefix}"
+      if (my ($fail) = grep { @{[$_ =~ m/\./g]} == $dots }
+                         keys %{$collapse}) {
+        my ($last) = ($fail =~ /([^\.]+)$/);
+        carp (
+          "Prefetching multiple has_many rels ${last} and ${pre} "
+          .(length($as_prefix)
+            ? "at the same level (${as_prefix}) "
+            : "at top level "
+          )
+          . 'will explode the number of row objects retrievable via ->next or ->all. '
+          . 'Use at your own risk.'
+        );
+      }
+      #my @col = map { (/^self\.(.+)$/ ? ("${as_prefix}.$1") : ()); }
+      #              values %{$rel_info->{cond}};
+      $collapse->{".${as_prefix}${pre}"} = [ $rel_source->primary_columns ];
+        # action at a distance. prepending the '.' allows simpler code
+        # in ResultSet->_collapse_result
+      my @key = map { (/^foreign\.(.+)$/ ? ($1) : ()); }
+                    keys %{$rel_info->{cond}};
+      my @ord = (ref($rel_info->{attrs}{order_by}) eq 'ARRAY'
+                   ? @{$rel_info->{attrs}{order_by}}
+                   : (defined $rel_info->{attrs}{order_by}
+                       ? ($rel_info->{attrs}{order_by})
+                       : ()));
+      push(@$order, map { "${as}.$_" } (@key, @ord));
+    }
+
+    return map { [ "${as}.$_", "${as_prefix}${pre}.$_", ] }
+      $rel_source->columns;
+  }
+}
+
 =head2 related_source
 
 =over 4


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSource.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSourceHandle.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSourceHandle.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSourceHandle.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -20,7 +20,7 @@
 
 =head1 NAME
 
-DBIx::Class::ResultSourceHandle
+DBIx::Class::ResultSourceHandle - Decouple Rows/ResultSets objects from their Source objects
 
 =head1 DESCRIPTION
 
@@ -87,7 +87,7 @@
 
 Thaws frozen handle. Resets the internal schema reference to the package
 variable C<$thaw_schema>. The recomened way of setting this is to use 
-C<$schema->thaw($ice)> which handles this for you.
+C<< $schema->thaw($ice) >> which handles this for you.
 
 =cut
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSourceHandle.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSourceProxy/Table.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/ResultSourceProxy.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Row.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Row.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Row.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -77,6 +77,23 @@
 
 For a more involved explanation, see L<DBIx::Class::ResultSet/create>.
 
+Please note that if a value is not passed to new, no value will be sent
+in the SQL INSERT call, and the column will therefore assume whatever
+default value was specified in your database. While DBIC will retrieve the
+value of autoincrement columns, it will never make an explicit database
+trip to retrieve default values assigned by the RDBMS. You can explicitly
+request that all values be fetched back from the database by calling
+L</discard_changes>, or you can supply an explicit C<undef> to columns
+with NULL as the default, and save yourself a SELECT.
+
+ CAVEAT:
+
+ The behavior described above will backfire if you use a foreign key column
+ with a database-defined default. If you call the relationship accessor on
+ an object that doesn't have a set value for the FK column, DBIC will throw
+ an exception, as it has no way of knowing the PK of the related object (if
+ there is one).
+
 =cut
 
 ## It needs to store the new objects somewhere, and call insert on that list later when insert is called on this object. We may need an accessor for these so the user can retrieve them, if just doing ->new().
@@ -95,7 +112,7 @@
                 ->resultset
                 ->new_result($data);
   }
-  if ($self->result_source->pk_depends_on($relname, $data)) {
+  if ($self->result_source->_pk_depends_on($relname, $data)) {
     MULTICREATE_DEBUG and warn "MC $self constructing $relname via find_or_new";
     return $self->result_source
                 ->related_source($relname)
@@ -115,7 +132,7 @@
   foreach my $key (keys %$reverse) {
     # if their primary key depends on us, then we have to
     # just create a result and we'll fill it out afterwards
-    return 1 if $rel_source->pk_depends_on($key, $us);
+    return 1 if $rel_source->_pk_depends_on($key, $us);
   }
   return 0;
 }
@@ -287,7 +304,7 @@
       next REL unless (Scalar::Util::blessed($rel_obj)
                        && $rel_obj->isa('DBIx::Class::Row'));
 
-      next REL unless $source->pk_depends_on(
+      next REL unless $source->_pk_depends_on(
                         $relname, { $rel_obj->get_columns }
                       );
 
@@ -330,7 +347,6 @@
     $self->throw_exception( "Can't get last insert id" )
       unless (@ids == @auto_pri);
     $self->store_column($auto_pri[$_] => $ids[$_]) for 0 .. $#ids;
-#use Data::Dumper; warn Dumper($self);
   }
 
 
@@ -864,10 +880,10 @@
 object. If a hashref of replacement data is supplied, these will take
 precedence over data in the original.
 
-If the row has related objects in a
-L<DBIx::Class::Relationship/has_many> then those objects may be copied
-too depending on the L<cascade_copy|DBIx::Class::Relationship>
-relationship attribute.
+Relationships will be followed by the copy procedure B<only> if the
+relationship specifes a true value for its
+L<cascade_copy|DBIx::Class::Relationship::Base> attribute. C<cascade_copy>
+is set by default on C<has_many> relationships and unset on all others.
 
 =cut
 
@@ -897,7 +913,7 @@
 
     next unless $rel_info->{attrs}{cascade_copy};
   
-    my $resolved = $self->result_source->resolve_condition(
+    my $resolved = $self->result_source->_resolve_condition(
       $rel_info->{cond}, $rel, $new
     );
 
@@ -964,6 +980,9 @@
 Reblessing can also be done more easily by setting C<result_class> in
 your Result class. See L<DBIx::Class::ResultSource/result_class>.
 
+Different types of results can also be created from a particular
+L<DBIx::Class::ResultSet>, see L<DBIx::Class::ResultSet/result_class>.
+
 =cut
 
 sub inflate_result {
@@ -1009,7 +1028,6 @@
         $fetched = $pre_source->result_class->inflate_result(
                       $pre_source, @{$pre_val});
       }
-      $new->related_resultset($pre)->set_cache([ $fetched ]);
       my $accessor = $source->relationship_info($pre)->{attrs}{accessor};
       $class->throw_exception("No accessor for prefetched $pre")
        unless defined $accessor;
@@ -1020,6 +1038,7 @@
       } else {
        $class->throw_exception("Prefetch not supported with accessor '$accessor'");
       }
+      $new->related_resultset($pre)->set_cache([ $fetched ]);
     }
   }
   return $new;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Row.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/SQLAHacks/OracleJoins.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/SQLAHacks/OracleJoins.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/SQLAHacks/OracleJoins.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,171 @@
+package # Hide from PAUSE
+  DBIx::Class::SQLAHacks::OracleJoins;
+
+use base qw( DBIx::Class::SQLAHacks );
+use Carp::Clan qw/^DBIx::Class/;
+
+sub select {
+  my ($self, $table, $fields, $where, $order, @rest) = @_;
+
+  if (ref($table) eq 'ARRAY') {
+    $where = $self->_oracle_joins($where, @{ $table });
+  }
+
+  return $self->SUPER::select($table, $fields, $where, $order, @rest);
+}
+
+sub _recurse_from {
+  my ($self, $from, @join) = @_;
+
+  my @sqlf = $self->_make_as($from);
+
+  foreach my $j (@join) {
+    my ($to, $on) = @{ $j };
+
+    if (ref $to eq 'ARRAY') {
+      push (@sqlf, $self->_recurse_from(@{ $to }));
+    }
+    else {
+      push (@sqlf, $self->_make_as($to));
+    }
+  }
+
+  return join q{, }, @sqlf;
+}
+
+sub _oracle_joins {
+  my ($self, $where, $from, @join) = @_;
+  my $join_where = {};
+  $self->_recurse_oracle_joins($join_where, $from, @join);
+  if (keys %$join_where) {
+    if (!defined($where)) {
+      $where = $join_where;
+    } else {
+      if (ref($where) eq 'ARRAY') {
+        $where = { -or => $where };
+      }
+      $where = { -and => [ $join_where, $where ] };
+    }
+  }
+  return $where;
+}
+
+sub _recurse_oracle_joins {
+  my ($self, $where, $from, @join) = @_;
+
+  foreach my $j (@join) {
+    my ($to, $on) = @{ $j };
+
+    if (ref $to eq 'ARRAY') {
+      $self->_recurse_oracle_joins($where, @{ $to });
+    }
+
+    my $to_jt      = ref $to eq 'ARRAY' ? $to->[0] : $to;
+    my $left_join  = q{};
+    my $right_join = q{};
+
+    if (ref $to_jt eq 'HASH' and exists $to_jt->{-join_type}) {
+      #TODO: Support full outer joins -- this would happen much earlier in
+      #the sequence since oracle 8's full outer join syntax is best
+      #described as INSANE.
+      croak "Can't handle full outer joins in Oracle 8 yet!\n"
+        if $to_jt->{-join_type} =~ /full/i;
+
+      $left_join  = q{(+)} if $to_jt->{-join_type} =~ /left/i
+        && $to_jt->{-join_type} !~ /inner/i;
+
+      $right_join = q{(+)} if $to_jt->{-join_type} =~ /right/i
+        && $to_jt->{-join_type} !~ /inner/i;
+    }
+
+    foreach my $lhs (keys %{ $on }) {
+      $where->{$lhs . $left_join} = \"= $on->{ $lhs }$right_join";
+    }
+  }
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+DBIx::Class::SQLAHacks::OracleJoins - Pre-ANSI Joins-via-Where-Clause Syntax
+
+=head1 PURPOSE
+
+This module was originally written to support Oracle < 9i where ANSI joins
+weren't supported at all, but became the module for Oracle >= 8 because
+Oracle's optimising of ANSI joins is horrible.  (See:
+http://scsys.co.uk:8001/7495)
+
+=head1 SYNOPSIS
+
+Not intended for use directly; used as the sql_maker_class for schemas and components.
+
+=head1 DESCRIPTION
+
+Implements pre-ANSI joins specified in the where clause.  Instead of:
+
+    SELECT x FROM y JOIN z ON y.id = z.id
+
+It will write:
+
+    SELECT x FROM y, z WHERE y.id = z.id
+
+It should properly support left joins, and right joins.  Full outer joins are
+not possible due to the fact that Oracle requires the entire query be written
+to union the results of a left and right join, and by the time this module is
+called to create the where query and table definition part of the sql query,
+it's already too late.
+
+=head1 METHODS
+
+=over
+
+=item select ($\@$;$$@)
+
+Replaces DBIx::Class::SQLAHacks's select() method, which calls _oracle_joins()
+to modify the column and table list before calling SUPER::select().
+
+=item _recurse_from ($$\@)
+
+Recursive subroutine that builds the table list.
+
+=item _oracle_joins ($$$@)
+
+Creates the left/right relationship in the where query.
+
+=back
+
+=head1 BUGS
+
+Does not support full outer joins.
+Probably lots more.
+
+=head1 SEE ALSO
+
+=over
+
+=item L<DBIx::Class::Storage::DBI::Oracle::WhereJoins> - Storage class using this
+
+=item L<DBIx::Class::SQLAHacks> - Parent module
+
+=item L<DBIx::Class> - Duh
+
+=back
+
+=head1 AUTHOR
+
+Justin Wheeler C<< <jwheeler at datademons.com> >>
+
+=head1 CONTRIBUTORS
+
+David Jack Olrik C<< <djo at cpan.org> >>
+
+=head1 LICENSE
+
+This module is licensed under the same terms as Perl itself.
+
+=cut
+


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/SQLAHacks/OracleJoins.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/SQLAHacks.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/SQLAHacks.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/SQLAHacks.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,483 @@
+package # Hide from PAUSE
+  DBIx::Class::SQLAHacks;
+
+use base qw/SQL::Abstract::Limit/;
+use strict;
+use warnings;
+use Carp::Clan qw/^DBIx::Class|^SQL::Abstract/;
+
+BEGIN {
+  # reinstall the carp()/croak() functions imported into SQL::Abstract
+  # as Carp and Carp::Clan do not like each other much
+  no warnings qw/redefine/;
+  no strict qw/refs/;
+  for my $f (qw/carp croak/) {
+    my $orig = \&{"SQL::Abstract::$f"};
+    *{"SQL::Abstract::$f"} = sub {
+
+      local $Carp::CarpLevel = 1;   # even though Carp::Clan ignores this, $orig will not
+
+      if (Carp::longmess() =~ /DBIx::Class::SQLAHacks::[\w]+\(\) called/) {
+        __PACKAGE__->can($f)->(@_);
+      }
+      else {
+        $orig->(@_);
+      }
+    }
+  }
+}
+
+sub new {
+  my $self = shift->SUPER::new(@_);
+
+  # This prevents the caching of $dbh in S::A::L, I believe
+  # If limit_dialect is a ref (like a $dbh), go ahead and replace
+  #   it with what it resolves to:
+  $self->{limit_dialect} = $self->_find_syntax($self->{limit_dialect})
+    if ref $self->{limit_dialect};
+
+  $self;
+}
+
+
+# Some databases (sqlite) do not handle multiple parenthesis
+# around in/between arguments. A tentative x IN ( ( 1, 2 ,3) )
+# is interpreted as x IN 1 or something similar.
+#
+# Since we currently do not have access to the SQLA AST, resort
+# to barbaric mutilation of any SQL supplied in literal form
+
+sub _strip_outer_paren {
+  my ($self, $arg) = @_;
+
+  return $self->_SWITCH_refkind ($arg, {
+    ARRAYREFREF => sub {
+      $$arg->[0] = __strip_outer_paren ($$arg->[0]);
+      return $arg;
+    },
+    SCALARREF => sub {
+      return \__strip_outer_paren( $$arg );
+    },
+    FALLBACK => sub {
+      return $arg
+    },
+  });
+}
+
+sub __strip_outer_paren {
+  my $sql = shift;
+
+  if ($sql and not ref $sql) {
+    while ($sql =~ /^ \s* \( (.*) \) \s* $/x ) {
+      $sql = $1;
+    }
+  }
+
+  return $sql;
+}
+
+sub _where_field_IN {
+  my ($self, $lhs, $op, $rhs) = @_;
+  $rhs = $self->_strip_outer_paren ($rhs);
+  return $self->SUPER::_where_field_IN ($lhs, $op, $rhs);
+}
+
+sub _where_field_BETWEEN {
+  my ($self, $lhs, $op, $rhs) = @_;
+  $rhs = $self->_strip_outer_paren ($rhs);
+  return $self->SUPER::_where_field_BETWEEN ($lhs, $op, $rhs);
+}
+
+# Slow but ANSI standard Limit/Offset support. DB2 uses this
+sub _RowNumberOver {
+  my ($self, $sql, $order, $rows, $offset ) = @_;
+
+  $offset += 1;
+  my $last = $rows + $offset - 1;
+  my ( $order_by ) = $self->_order_by( $order );
+
+  $sql = <<"SQL";
+SELECT * FROM
+(
+   SELECT Q1.*, ROW_NUMBER() OVER( ) AS ROW_NUM FROM (
+      $sql
+      $order_by
+   ) Q1
+) Q2
+WHERE ROW_NUM BETWEEN $offset AND $last
+
+SQL
+
+  return $sql;
+}
+
+# Crappy Top based Limit/Offset support. MSSQL uses this currently,
+# but may have to switch to RowNumberOver one day
+sub _Top {
+  my ( $self, $sql, $order, $rows, $offset ) = @_;
+
+  croak '$order supplied to SQLAHacks limit emulators must be a hash'
+    if (ref $order ne 'HASH');
+
+  $order = { %$order }; #copy
+
+  my $last = $rows + $offset;
+
+  my $req_order = $self->_order_by ($order->{order_by});
+
+  my $limit_order = $req_order ? $order->{order_by} : $order->{_virtual_order_by};
+
+  delete $order->{$_} for qw/order_by _virtual_order_by/;
+  my $grpby_having = $self->_order_by ($order);
+
+  my ( $order_by_inner, $order_by_outer ) = $self->_order_directions($limit_order);
+
+  $sql =~ s/^\s*(SELECT|select)//;
+
+  $sql = <<"SQL";
+  SELECT * FROM
+  (
+    SELECT TOP $rows * FROM
+    (
+        SELECT TOP $last $sql $grpby_having $order_by_inner
+    ) AS foo
+    $order_by_outer
+  ) AS bar
+  $req_order
+
+SQL
+    return $sql;
+}
+
+
+
+# While we're at it, this should make LIMIT queries more efficient,
+#  without digging into things too deeply
+sub _find_syntax {
+  my ($self, $syntax) = @_;
+  return $self->{_cached_syntax} ||= $self->SUPER::_find_syntax($syntax);
+}
+
+sub select {
+  my ($self, $table, $fields, $where, $order, @rest) = @_;
+
+  $self->{"${_}_bind"} = [] for (qw/having from order/);
+
+  if (ref $table eq 'SCALAR') {
+    $table = $$table;
+  }
+  elsif (not ref $table) {
+    $table = $self->_quote($table);
+  }
+  local $self->{rownum_hack_count} = 1
+    if (defined $rest[0] && $self->{limit_dialect} eq 'RowNum');
+  @rest = (-1) unless defined $rest[0];
+  croak "LIMIT 0 Does Not Compute" if $rest[0] == 0;
+    # and anyway, SQL::Abstract::Limit will cause a barf if we don't first
+  my ($sql, @where_bind) = $self->SUPER::select(
+    $table, $self->_recurse_fields($fields), $where, $order, @rest
+  );
+  $sql .= 
+    $self->{for} ?
+    (
+      $self->{for} eq 'update' ? ' FOR UPDATE' :
+      $self->{for} eq 'shared' ? ' FOR SHARE'  :
+      ''
+    ) :
+    ''
+  ;
+  return wantarray ? ($sql, @{$self->{from_bind}}, @where_bind, @{$self->{having_bind}}, @{$self->{order_bind}} ) : $sql;
+}
+
+sub insert {
+  my $self = shift;
+  my $table = shift;
+  $table = $self->_quote($table) unless ref($table);
+  $self->SUPER::insert($table, @_);
+}
+
+sub update {
+  my $self = shift;
+  my $table = shift;
+  $table = $self->_quote($table) unless ref($table);
+  $self->SUPER::update($table, @_);
+}
+
+sub delete {
+  my $self = shift;
+  my $table = shift;
+  $table = $self->_quote($table) unless ref($table);
+  $self->SUPER::delete($table, @_);
+}
+
+sub _emulate_limit {
+  my $self = shift;
+  if ($_[3] == -1) {
+    return $_[1].$self->_order_by($_[2]);
+  } else {
+    return $self->SUPER::_emulate_limit(@_);
+  }
+}
+
+sub _recurse_fields {
+  my ($self, $fields, $params) = @_;
+  my $ref = ref $fields;
+  return $self->_quote($fields) unless $ref;
+  return $$fields if $ref eq 'SCALAR';
+
+  if ($ref eq 'ARRAY') {
+    return join(', ', map {
+      $self->_recurse_fields($_)
+        .(exists $self->{rownum_hack_count} && !($params && $params->{no_rownum_hack})
+          ? ' AS col'.$self->{rownum_hack_count}++
+          : '')
+      } @$fields);
+  } elsif ($ref eq 'HASH') {
+    foreach my $func (keys %$fields) {
+      if ($func eq 'distinct') {
+        my $_fields = $fields->{$func};
+        if (ref $_fields eq 'ARRAY' && @{$_fields} > 1) {
+          croak (
+            'The select => { distinct => ... } syntax is not supported for multiple columns.'
+           .' Instead please use { group_by => [ qw/' . (join ' ', @$_fields) . '/ ] }'
+           .' or { select => [ qw/' . (join ' ', @$_fields) . '/ ], distinct => 1 }'
+          );
+        }
+        else {
+          $_fields = @{$_fields}[0] if ref $_fields eq 'ARRAY';
+          carp (
+            'The select => { distinct => ... } syntax will be deprecated in DBIC version 0.09,'
+           ." please use { group_by => '${_fields}' } or { select => '${_fields}', distinct => 1 }"
+          );
+        }
+      }
+      return $self->_sqlcase($func)
+        .'( '.$self->_recurse_fields($fields->{$func}).' )';
+    }
+  }
+  # Is the second check absolutely necessary?
+  elsif ( $ref eq 'REF' and ref($$fields) eq 'ARRAY' ) {
+    return $self->_fold_sqlbind( $fields );
+  }
+  else {
+    croak($ref . qq{ unexpected in _recurse_fields()})
+  }
+}
+
+sub _order_by {
+  my ($self, $arg) = @_;
+
+  if (ref $arg eq 'HASH' and keys %$arg and not grep { $_ =~ /^-(?:desc|asc)/i } keys %$arg ) {
+
+    my $ret = '';
+
+    if (defined $arg->{group_by}) {
+      $ret = $self->_sqlcase(' group by ')
+        .$self->_recurse_fields($arg->{group_by}, { no_rownum_hack => 1 });
+    }
+
+    if (defined $arg->{having}) {
+      my ($frag, @bind) = $self->_recurse_where($arg->{having});
+      push(@{$self->{having_bind}}, @bind);
+      $ret .= $self->_sqlcase(' having ').$frag;
+    }
+
+    if (defined $arg->{order_by}) {
+      my ($frag, @bind) = $self->SUPER::_order_by($arg->{order_by});
+      push(@{$self->{order_bind}}, @bind);
+      $ret .= $frag;
+    }
+
+    return $ret;
+  }
+  else {
+    my ($sql, @bind) = $self->SUPER::_order_by ($arg);
+    push(@{$self->{order_bind}}, @bind);
+    return $sql;
+  }
+}
+
+sub _order_directions {
+  my ($self, $order) = @_;
+
+  # strip bind values - none of the current _order_directions users support them
+  return $self->SUPER::_order_directions( [ map
+    { ref $_ ? $_->[0] : $_ }
+    $self->_order_by_chunks ($order)
+  ]);
+}
+
+sub _table {
+  my ($self, $from) = @_;
+  if (ref $from eq 'ARRAY') {
+    return $self->_recurse_from(@$from);
+  } elsif (ref $from eq 'HASH') {
+    return $self->_make_as($from);
+  } else {
+    return $from; # would love to quote here but _table ends up getting called
+                  # twice during an ->select without a limit clause due to
+                  # the way S::A::Limit->select works. should maybe consider
+                  # bypassing this and doing S::A::select($self, ...) in
+                  # our select method above. meantime, quoting shims have
+                  # been added to select/insert/update/delete here
+  }
+}
+
+sub _recurse_from {
+  my ($self, $from, @join) = @_;
+  my @sqlf;
+  push(@sqlf, $self->_make_as($from));
+  foreach my $j (@join) {
+    my ($to, $on) = @$j;
+
+    # check whether a join type exists
+    my $join_clause = '';
+    my $to_jt = ref($to) eq 'ARRAY' ? $to->[0] : $to;
+    if (ref($to_jt) eq 'HASH' and exists($to_jt->{-join_type})) {
+      $join_clause = ' '.uc($to_jt->{-join_type}).' JOIN ';
+    } else {
+      $join_clause = ' JOIN ';
+    }
+    push(@sqlf, $join_clause);
+
+    if (ref $to eq 'ARRAY') {
+      push(@sqlf, '(', $self->_recurse_from(@$to), ')');
+    } else {
+      push(@sqlf, $self->_make_as($to));
+    }
+    push(@sqlf, ' ON ', $self->_join_condition($on));
+  }
+  return join('', @sqlf);
+}
+
+sub _fold_sqlbind {
+  my ($self, $sqlbind) = @_;
+
+  my @sqlbind = @$$sqlbind; # copy
+  my $sql = shift @sqlbind;
+  push @{$self->{from_bind}}, @sqlbind;
+
+  return $sql;
+}
+
+sub _make_as {
+  my ($self, $from) = @_;
+  return join(' ', map { (ref $_ eq 'SCALAR' ? $$_
+                        : ref $_ eq 'REF'    ? $self->_fold_sqlbind($_)
+                        : $self->_quote($_))
+                       } reverse each %{$self->_skip_options($from)});
+}
+
+sub _skip_options {
+  my ($self, $hash) = @_;
+  my $clean_hash = {};
+  $clean_hash->{$_} = $hash->{$_}
+    for grep {!/^-/} keys %$hash;
+  return $clean_hash;
+}
+
+sub _join_condition {
+  my ($self, $cond) = @_;
+  if (ref $cond eq 'HASH') {
+    my %j;
+    for (keys %$cond) {
+      my $v = $cond->{$_};
+      if (ref $v) {
+        croak (ref($v) . qq{ reference arguments are not supported in JOINS - try using \"..." instead'})
+            if ref($v) ne 'SCALAR';
+        $j{$_} = $v;
+      }
+      else {
+        my $x = '= '.$self->_quote($v); $j{$_} = \$x;
+      }
+    };
+    return scalar($self->_recurse_where(\%j));
+  } elsif (ref $cond eq 'ARRAY') {
+    return join(' OR ', map { $self->_join_condition($_) } @$cond);
+  } else {
+    die "Can't handle this yet!";
+  }
+}
+
+sub _quote {
+  my ($self, $label) = @_;
+  return '' unless defined $label;
+  return "*" if $label eq '*';
+  return $label unless $self->{quote_char};
+  if(ref $self->{quote_char} eq "ARRAY"){
+    return $self->{quote_char}->[0] . $label . $self->{quote_char}->[1]
+      if !defined $self->{name_sep};
+    my $sep = $self->{name_sep};
+    return join($self->{name_sep},
+        map { $self->{quote_char}->[0] . $_ . $self->{quote_char}->[1]  }
+       split(/\Q$sep\E/,$label));
+  }
+  return $self->SUPER::_quote($label);
+}
+
+sub limit_dialect {
+    my $self = shift;
+    $self->{limit_dialect} = shift if @_;
+    return $self->{limit_dialect};
+}
+
+sub quote_char {
+    my $self = shift;
+    $self->{quote_char} = shift if @_;
+    return $self->{quote_char};
+}
+
+sub name_sep {
+    my $self = shift;
+    $self->{name_sep} = shift if @_;
+    return $self->{name_sep};
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+DBIx::Class::SQLAHacks - This module is a subclass of SQL::Abstract::Limit
+and includes a number of DBIC-specific workarounds, not yet suitable for
+inclusion into SQLA proper.
+
+=head1 METHODS
+
+=head2 new
+
+Tries to determine limit dialect.
+
+=head2 select
+
+Quotes table names, handles "limit" dialects (e.g. where rownum between x and
+y), supports SELECT ... FOR UPDATE and SELECT ... FOR SHARE.
+
+=head2 insert update delete
+
+Just quotes table names.
+
+=head2 limit_dialect
+
+Specifies the dialect of used for implementing an SQL "limit" clause for
+restricting the number of query results returned.  Valid values are: RowNum.
+
+See L<DBIx::Class::Storage::DBI/connect_info> for details.
+
+=head2 name_sep
+
+Character separating quoted table names.
+
+See L<DBIx::Class::Storage::DBI/connect_info> for details.
+
+=head2 quote_char
+
+Set to an array-ref to specify separate left and right quotes for table names.
+
+See L<DBIx::Class::Storage::DBI/connect_info> for details.
+
+=cut
+


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/SQLAHacks.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Schema/Versioned.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Schema/Versioned.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Schema/Versioned.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -70,12 +70,12 @@
 
 =head1 SYNOPSIS
 
-  package Library::Schema;
+  package MyApp::Schema;
   use base qw/DBIx::Class::Schema/;
 
   our $VERSION = 0.001;
 
-  # load Library::Schema::CD, Library::Schema::Book, Library::Schema::DVD
+  # load MyApp::Schema::CD, MyApp::Schema::Book, MyApp::Schema::DVD
   __PACKAGE__->load_classes(qw/CD Book DVD/);
 
   __PACKAGE__->load_components(qw/Schema::Versioned/);
@@ -181,8 +181,9 @@
 use strict;
 use warnings;
 use base 'DBIx::Class';
+
+use Carp::Clan qw/^DBIx::Class/;
 use POSIX 'strftime';
-use Data::Dumper;
 
 __PACKAGE__->mk_classdata('_filedata');
 __PACKAGE__->mk_classdata('upgrade_directory');
@@ -226,7 +227,7 @@
 
   # must be called on a fresh database
   if ($self->get_db_version()) {
-    warn 'Install not possible as versions table already exists in database';
+    carp 'Install not possible as versions table already exists in database';
   }
 
   # default to current version if none passed
@@ -292,13 +293,13 @@
 
   # db unversioned
   unless ($db_version) {
-    warn 'Upgrade not possible as database is unversioned. Please call install first.';
+    carp 'Upgrade not possible as database is unversioned. Please call install first.';
     return;
   }
 
   # db and schema at same version. do nothing
   if ($db_version eq $self->schema_version) {
-    print "Upgrade not necessary\n";
+    carp "Upgrade not necessary\n";
     return;
   }
 
@@ -318,11 +319,11 @@
   $self->create_upgrade_path({ upgrade_file => $upgrade_file });
 
   unless (-f $upgrade_file) {
-    warn "Upgrade not possible, no upgrade file found ($upgrade_file), please create one\n";
+    carp "Upgrade not possible, no upgrade file found ($upgrade_file), please create one\n";
     return;
   }
 
-  warn "\nDB version ($db_version) is lower than the schema version (".$self->schema_version."). Attempting upgrade.\n";
+  carp "\nDB version ($db_version) is lower than the schema version (".$self->schema_version."). Attempting upgrade.\n";
 
   # backup if necessary then apply upgrade
   $self->_filedata($self->_read_sql_file($upgrade_file));
@@ -392,7 +393,7 @@
 sub apply_statement {
     my ($self, $statement) = @_;
 
-    $self->storage->dbh->do($_) or warn "SQL was:\n $_";
+    $self->storage->dbh->do($_) or carp "SQL was:\n $_";
 }
 
 =head2 get_db_version
@@ -491,17 +492,17 @@
 
   if($pversion eq $self->schema_version)
     {
-#         warn "This version is already installed\n";
+#         carp "This version is already installed\n";
         return 1;
     }
 
   if(!$pversion)
     {
-        warn "Your DB is currently unversioned. Please call upgrade on your schema to sync the DB.\n";
+        carp "Your DB is currently unversioned. Please call upgrade on your schema to sync the DB.\n";
         return 1;
     }
 
-  warn "Versions out of sync. This is " . $self->schema_version . 
+  carp "Versions out of sync. This is " . $self->schema_version . 
     ", your database contains version $pversion, please call upgrade on your Schema.\n";
 }
 
@@ -533,7 +534,6 @@
   $db_tr->producer($db);
   my $dbic_tr = SQL::Translator->new;
   $dbic_tr->parser('SQL::Translator::Parser::DBIx::Class');
-  $dbic_tr = $self->storage->configure_sqlt($dbic_tr, $db);
   $dbic_tr->data($self);
   $dbic_tr->producer($db);
 
@@ -565,7 +565,7 @@
   print $file $diff;
   close($file);
 
-  print "WARNING: There may be differences between your DB and your DBIC schema. Please review and if necessary run the SQL in $filename to sync your DB.\n";
+  carp "WARNING: There may be differences between your DB and your DBIC schema. Please review and if necessary run the SQL in $filename to sync your DB.\n";
 }
 
 
@@ -587,7 +587,7 @@
   my $file = shift || return;
 
   my $fh;
-  open $fh, "<$file" or warn("Can't open upgrade file, $file ($!)");
+  open $fh, "<$file" or carp("Can't open upgrade file, $file ($!)");
   my @data = split(/\n/, join('', <$fh>));
   @data = grep(!/^--/, @data);
   @data = split(/;/, join('', @data));
@@ -614,7 +614,7 @@
 
 =head1 AUTHORS
 
-Jess Robinson <castaway at desert-island.demon.co.uk>
+Jess Robinson <castaway at desert-island.me.uk>
 Luke Saunders <luke at shadowcatsystems.co.uk>
 
 =head1 LICENSE


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Schema/Versioned.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Schema.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Schema.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Schema.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -173,8 +173,8 @@
 }
 
 # returns a hash of $shortname => $fullname for every package
-#  found in the given namespaces ($shortname is with the $fullname's
-#  namespace stripped off)
+# found in the given namespaces ($shortname is with the $fullname's
+# namespace stripped off)
 sub _map_namespaces {
   my ($class, @namespaces) = @_;
 
@@ -190,6 +190,22 @@
   @results_hash;
 }
 
+# returns the result_source_instance for the passed class/object,
+# or dies with an informative message (used by load_namespaces)
+sub _ns_get_rsrc_instance {
+  my $class = shift;
+  my $rs = ref ($_[0]) || $_[0];
+
+  if ($rs->can ('result_source_instance') ) {
+    return $rs->result_source_instance;
+  }
+  else {
+    $class->throw_exception (
+      "Attempt to load_namespaces() class $rs failed - are you sure this is a real Result Class?"
+    );
+  }
+}
+
 sub load_namespaces {
   my ($class, %args) = @_;
 
@@ -231,27 +247,27 @@
       my $result_class = $results{$result};
 
       my $rs_class = delete $resultsets{$result};
-      my $rs_set = $result_class->resultset_class;
+      my $rs_set = $class->_ns_get_rsrc_instance ($result_class)->resultset_class;
       
       if($rs_set && $rs_set ne 'DBIx::Class::ResultSet') {
         if($rs_class && $rs_class ne $rs_set) {
-          warn "We found ResultSet class '$rs_class' for '$result', but it seems "
+          carp "We found ResultSet class '$rs_class' for '$result', but it seems "
              . "that you had already set '$result' to use '$rs_set' instead";
         }
       }
       elsif($rs_class ||= $default_resultset_class) {
         $class->ensure_class_loaded($rs_class);
-        $result_class->resultset_class($rs_class);
+        $class->_ns_get_rsrc_instance ($result_class)->resultset_class($rs_class);
       }
 
-      my $source_name = $result_class->source_name || $result;
+      my $source_name = $class->_ns_get_rsrc_instance ($result_class)->source_name || $result;
 
       push(@to_register, [ $source_name, $result_class ]);
     }
   }
 
   foreach (sort keys %resultsets) {
-    warn "load_namespaces found ResultSet class $_ with no "
+    carp "load_namespaces found ResultSet class $_ with no "
       . 'corresponding Result class';
   }
 
@@ -344,7 +360,7 @@
 
         my $snsub = $comp_class->can('source_name');
         if(! $snsub ) {
-          warn "Failed to load $comp_class. Can't find source_name method. Is $comp_class really a full DBIC result class? Fix it, move it elsewhere, or make your load_classes call more specific.";
+          carp "Failed to load $comp_class. Can't find source_name method. Is $comp_class really a full DBIC result class? Fix it, move it elsewhere, or make your load_classes call more specific.";
           next;
         }
         $comp = $snsub->($comp_class) || $comp;
@@ -483,6 +499,12 @@
 C<connect> does not. C<connect> wraps it's arguments in an arrayref
 before passing them to C<connect_info>.
 
+=head3 Overloading
+
+C<connect> is a convenience method. It is equivalent to calling
+$schema->clone->connection(@connectinfo). To write your own overloaded
+version, overload L</connection> instead.
+
 =cut
 
 sub connect { shift->clone->connection(@_) }
@@ -611,7 +633,7 @@
   $self->storage->txn_do(@_);
 }
 
-=head2 txn_scope_guard (EXPERIMENTAL)
+=head2 txn_scope_guard
 
 Runs C<txn_scope_guard> on the schema's storage. See 
 L<DBIx::Class::Storage/txn_scope_guard>.
@@ -760,7 +782,10 @@
 data in-place on the Schema class. You should probably be calling
 L</connect> to get a proper Schema object instead.
 
+=head3 Overloading
 
+Overload C<connection> to change the behaviour of C<connect>.
+
 =cut
 
 sub connection {
@@ -990,15 +1015,17 @@
 
 =over 4
 
-=item Arguments: $sqlt_args, $dir
+=item Arguments: \%sqlt_args, $dir
 
 =back
 
 Attempts to deploy the schema to the current storage using L<SQL::Translator>.
 
-See L<SQL::Translator/METHODS> for a list of values for C<$sqlt_args>. The most
-common value for this would be C<< { add_drop_table => 1, } >> to have the SQL
-produced include a DROP TABLE statement for each table created.
+See L<SQL::Translator/METHODS> for a list of values for C<\%sqlt_args>.
+The most common value for this would be C<< { add_drop_table => 1 } >>
+to have the SQL produced include a C<DROP TABLE> statement for each table
+created. For quoting purposes supply C<quote_table_names> and
+C<quote_field_names>.
 
 Additionally, the DBIx::Class parser accepts a C<sources> parameter as a hash 
 ref or an array ref, containing a list of source to deploy. If present, then 
@@ -1018,19 +1045,16 @@
 
 =over 4
 
-=item Arguments: $rdbms_type, $sqlt_args, $dir
+=item Arguments: See L<DBIx::Class::Storage::DBI/deployment_statements>
 
 =item Return value: $listofstatements
 
 =back
 
-A convenient shortcut to storage->deployment_statements(). Returns the
-SQL statements used by L</deploy> and
-L<DBIx::Class::Schema::Storage/deploy>. C<$rdbms_type> provides the
-(optional) SQLT (not DBI) database driver name for which the SQL
-statements are produced.  If not supplied, the type is determined by
-interrogating the current connection.  The other two arguments are
-identical to those of L</deploy>.
+A convenient shortcut to
+C<< $self->storage->deployment_statements($self, @args) >>.
+Returns the SQL statements used by L</deploy> and
+L<DBIx::Class::Schema::Storage/deploy>.
 
 =cut
 
@@ -1047,43 +1071,16 @@
 
 =over 4
 
-=item Arguments: \@databases, $version, $directory, $preversion, $sqlt_args
+=item Arguments: See L<DBIx::Class::Storage::DBI/create_ddl_dir>
 
 =back
 
+A convenient shortcut to 
+C<< $self->storage->create_ddl_dir($self, @args) >>.
+
 Creates an SQL file based on the Schema, for each of the specified
-database types, in the given directory. Given a previous version number,
-this will also create a file containing the ALTER TABLE statements to
-transform the previous schema into the current one. Note that these
-statements may contain DROP TABLE or DROP COLUMN statements that can
-potentially destroy data.
+database types, in the given directory.
 
-The file names are created using the C<ddl_filename> method below, please
-override this method in your schema if you would like a different file
-name format. For the ALTER file, the same format is used, replacing
-$version in the name with "$preversion-$version".
-
-See L<DBIx::Class::Schema/deploy> for details of $sqlt_args.
-
-If no arguments are passed, then the following default values are used:
-
-=over 4
-
-=item databases  - ['MySQL', 'SQLite', 'PostgreSQL']
-
-=item version    - $schema->schema_version
-
-=item directory  - './'
-
-=item preversion - <none>
-
-=back
-
-Note that this feature is currently EXPERIMENTAL and may not work correctly
-across all databases, or fully handle complex relationships.
-
-WARNING: Please check all SQL files created, before applying them.
-
 =cut
 
 sub create_ddl_dir {
@@ -1256,24 +1253,33 @@
 sub _register_source {
   my ($self, $moniker, $source, $params) = @_;
 
+  my $orig_source = $source;
+
   $source = $source->new({ %$source, source_name => $moniker });
+  $source->schema($self);
+  weaken($source->{schema}) if ref($self);
 
+  my $rs_class = $source->result_class;
+
   my %reg = %{$self->source_registrations};
   $reg{$moniker} = $source;
   $self->source_registrations(\%reg);
 
-  $source->schema($self);
-  weaken($source->{schema}) if ref($self);
   return if ($params->{extra});
+  return unless defined($rs_class) && $rs_class->can('result_source_instance');
 
-  if ($source->result_class) {
-    my %map = %{$self->class_mappings};
-    if (exists $map{$source->result_class}) {
-      warn $source->result_class . ' already has a source, use register_extra_source for additional sources';
-    }
-    $map{$source->result_class} = $moniker;
-    $self->class_mappings(\%map);
+  my %map = %{$self->class_mappings};
+  if (
+    exists $map{$rs_class}
+      and
+    $map{$rs_class} ne $moniker
+      and
+    $rs_class->result_source_instance ne $orig_source
+  ) {
+    carp "$rs_class already has a source, use register_extra_source for additional sources";
   }
+  $map{$rs_class} = $moniker;
+  $self->class_mappings(\%map);
 }
 
 sub _unregister_source {
@@ -1330,7 +1336,7 @@
   sub compose_connection {
     my ($self, $target, @info) = @_;
 
-    warn "compose_connection deprecated as of 0.08000"
+    carp "compose_connection deprecated as of 0.08000"
       unless ($INC{"DBIx/Class/CDBICompat.pm"} || $warn++);
 
     my $base = 'DBIx::Class::ResultSetProxy';


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Schema.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Serialize/Storable.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/StartupCheck.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Cursor.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Cursor.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Cursor.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -36,8 +36,8 @@
 
 sub new {
   my ($class, $storage, $args, $attrs) = @_;
-  #use Data::Dumper; warn Dumper(@_);
   $class = ref $class if ref $class;
+
   my $new = {
     storage => $storage,
     args => $args,
@@ -72,7 +72,7 @@
 
   my @args = $storage->_select_args(@{$self->{args}});
   my ($sql, $bind)  = $storage->_prep_for_execute(@args[0 .. 2], [@args[4 .. $#args]]);
-  return \[ "($sql)", @$bind ];
+  return \[ "($sql)", @{ $bind || [] }];
 }
 
 =head2 next
@@ -152,7 +152,7 @@
   my ($self) = @_;
   if ($self->{attrs}{software_limit}
         && ($self->{attrs}{offset} || $self->{attrs}{rows})) {
-    return $self->SUPER::all;
+    return $self->next::method;
   }
   $self->{storage}->dbh_do($self->can('_dbh_all'), $self);
 }


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Cursor.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/DB2.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/DB2.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/DB2.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -20,6 +20,16 @@
 
 sub datetime_parser_type { "DateTime::Format::DB2"; }
 
+sub _sql_maker_opts {
+    my ( $self, $opts ) = @_;
+    
+    if ( $opts ) {
+        $self->{_sql_maker_opts} = { %$opts };
+    }
+                    
+    return { limit_dialect => 'RowNumberOver', %{$self->{_sql_maker_opts}||{}} };
+}
+
 1;
 
 =head1 NAME


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/DB2.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MSSQL.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MSSQL.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MSSQL.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -16,9 +16,21 @@
   my $type = "DateTime::Format::Strptime";
   eval "use ${type}";
   $self->throw_exception("Couldn't load ${type}: $@") if $@;
-  return $type->new( pattern => '%m/%d/%Y %H:%M:%S' );
+  return $type->new( pattern => '%Y-%m-%d %H:%M:%S' );  # %F %T
 }
 
+sub sqlt_type { 'SQLServer' }
+
+sub _sql_maker_opts {
+    my ( $self, $opts ) = @_;
+
+    if ( $opts ) {
+        $self->{_sql_maker_opts} = { %$opts };
+    }
+
+    return { limit_dialect => 'Top', %{$self->{_sql_maker_opts}||{}} };
+}
+
 1;
 
 =head1 NAME
@@ -39,6 +51,17 @@
 merge this class with a DBD-specific class to obtain fully
 correct behavior for your scenario.
 
+=head1 METHODS
+
+=head2 last_insert_id
+
+=head2 sqlt_type
+
+=head2 build_datetime_parser
+
+The resulting parser handles the MSSQL C<DATETIME> type, but is almost
+certainly not sufficient for the other MSSQL 2008 date/time types.
+
 =head1 AUTHORS
 
 Brian Cassidy <bricas at cpan.org>


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MSSQL.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MultiColumnIn.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MultiColumnIn.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MultiColumnIn.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,61 @@
+package DBIx::Class::Storage::DBI::MultiColumnIn;
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Storage::DBI';
+
+=head1 NAME 
+
+DBIx::Class::Storage::DBI::MultiColumnIn - Storage component for RDBMS supporting multicolumn in clauses
+
+=head1 DESCRIPTION
+
+While ANSI SQL does not define a multicolumn in operator, many databases can
+in fact understand WHERE (cola, colb) IN ( SELECT subcol_a, subcol_b ... )
+The storage class for any such RDBMS should inherit from this class, in order
+to dramatically speed up update/delete operations on joined multipk resultsets.
+
+At this point the only overriden method is C<_multipk_update_delete()>
+
+=cut
+
+sub _multipk_update_delete {
+  my $self = shift;
+  my ($rs, $op, $values) = @_;
+
+  my $rsrc = $rs->result_source;
+  my @pcols = $rsrc->primary_columns;
+  my $attrs = $rs->_resolved_attrs;
+
+  # naive check - this is an internal method after all, we should know what we are doing 
+  $self->throw_exception ('Number of columns selected by supplied resultset does not match number of primary keys')
+    if ( ref $attrs->{select} ne 'ARRAY' or @{$attrs->{select}} != @pcols );
+
+  # This is hideously ugly, but SQLA does not understand multicol IN expressions
+  my $sqla = $self->_sql_maker;
+  my ($sql, @bind) = @${$rs->as_query};
+  $sql = sprintf ('(%s) IN %s',   # the as_query stuff is already enclosed in ()s
+    join (', ', map { $sqla->_quote ($_) } @pcols),
+    $sql,
+  );
+
+  return $self->$op (
+    $rsrc,
+    $op eq 'update' ? $values : (),
+    \[$sql, @bind],
+  );
+
+}
+
+=head1 AUTHORS
+
+See L<DBIx::Class/CONTRIBUTORS>
+
+=head1 LICENSE
+
+You may distribute this code under the same terms as Perl itself.
+
+=cut
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MultiColumnIn.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MultiDistinctEmulation.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MultiDistinctEmulation.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/MultiDistinctEmulation.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,51 +0,0 @@
-package DBIx::Class::Storage::DBI::MultiDistinctEmulation;
-
-use strict;
-use warnings;
-
-use base qw/DBIx::Class::Storage::DBI/;
-
-sub _select {
-  my ($self, $ident, $select, $condition, $attrs) = @_;
-
-  # hack to make count distincts with multiple columns work in SQLite and Oracle
-  if (ref $select eq 'ARRAY') { 
-      @{$select} = map {$self->replace_distincts($_)} @{$select};
-  } else { 
-      $select = $self->replace_distincts($select);
-  }
-
-  return $self->next::method($ident, $select, $condition, $attrs);
-}
-
-sub replace_distincts {
-    my ($self, $select) = @_;
-
-    $select->{count}->{distinct} = join("||", @{$select->{count}->{distinct}}) 
-	if (ref $select eq 'HASH' && $select->{count} && ref $select->{count} eq 'HASH' && 
-	    $select->{count}->{distinct} && ref $select->{count}->{distinct} eq 'ARRAY');
-
-    return $select;
-}
-
-1;
-
-=head1 NAME 
-
-DBIx::Class::Storage::DBI::MultiDistinctEmulation - Some databases can't handle count distincts with multiple cols. They should use base on this.
-
-=head1 SYNOPSIS
-
-=head1 DESCRIPTION
-
-This class allows count distincts with multiple columns for retarded databases (Oracle and SQLite)
-
-=head1 AUTHORS
-
-Luke Saunders <luke.saunders at gmail.com>
-
-=head1 LICENSE
-
-You may distribute this code under the same terms as Perl itself.
-
-=cut

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/NoBindVars.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/NoBindVars.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/NoBindVars.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -61,7 +61,7 @@
   }
   $new_sql .= join '', @sql_part;
 
-  return ($new_sql);
+  return ($new_sql, []);
 }
 
 =head2 should_quote_data_type


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/NoBindVars.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/ACCESS.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/ACCESS.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/ACCESS.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,129 +1,127 @@
-package DBIx::Class::Storage::DBI::ODBC::ACCESS;
-use strict;
-use warnings;
-
-use Data::Dump qw( dump );
-
-use DBI;
-use base qw/DBIx::Class::Storage::DBI/;
-
-my $ERR_MSG_START = __PACKAGE__ . ' failed: ';
-
-sub insert {
-    my $self = shift;
-    my ( $source, $to_insert ) = @_;
-
-    my $bind_attributes = $self->source_bind_attributes( $source );
-    my ( undef, $sth ) = $self->_execute( 'insert' => [], $source, $bind_attributes, $to_insert );
-
-    #store the identity here since @@IDENTITY is connection global and this prevents
-    #possibility that another insert to a different table overwrites it for this resultsource
-    my $identity = 'SELECT @@IDENTITY';
-    my $max_sth  = $self->{ _dbh }->prepare( $identity )
-        or $self->throw_exception( $ERR_MSG_START . $self->{ _dbh }->errstr() );
-    $max_sth->execute() or $self->throw_exception( $ERR_MSG_START . $max_sth->errstr );
-
-    my $row = $max_sth->fetchrow_arrayref()
-        or $self->throw_exception( $ERR_MSG_START . "$identity did not return any result." );
-
-    $self->{ last_pk }->{ $source->name() } = $row;
-
-    return $to_insert;
-}
-
-sub last_insert_id {
-    my $self = shift;
-    my ( $result_source ) = @_;
-
-    return @{ $self->{ last_pk }->{ $result_source->name() } };
-}
-
-sub bind_attribute_by_data_type {
-    my $self = shift;
-    
-    my ( $data_type ) = @_;
-    
-    return { TYPE => $data_type } if $data_type == DBI::SQL_LONGVARCHAR;
-    
-    return;
-}
-
-sub sqlt_type { 'ACCESS' }
-
-1;
-
-=head1 NAME
-
-DBIx::Class::Storage::DBI::ODBC::ACCESS - Support specific to MS Access over ODBC
-
-=head1 WARNING
-
-I am not a DBI, DBIx::Class or MS Access guru. Use this module with that in
-mind.
-
-This module is currently considered alpha software and can change without notice.
-
-=head1 DESCRIPTION
-
-This class implements support specific to Microsoft Access over ODBC.
-
-It is loaded automatically by by DBIx::Class::Storage::DBI::ODBC when it
-detects a MS Access back-end.
-
-=head1 SUPPORTED VERSIONS
-
-This module have currently only been tested on MS Access 2003 using the Jet 4.0 engine.
-
-As far as my knowledge it should work on MS Access 2000 or later, but that have not been tested.
-Information about support for different version of MS Access is welcome.
-
-=head1 IMPLEMENTATION NOTES
-
-MS Access supports the @@IDENTITY function for retriving the id of the latest inserted row.
-@@IDENTITY is global to the connection, so to support the possibility of getting the last inserted
-id for different tables, the insert() function stores the inserted id on a per table basis.
-last_insert_id() then just returns the stored value.
-
-=head1 KNOWN ACCESS PROBLEMS
-
-=over
-
-=item Invalid precision value
-
-This error message is received when trying to store more than 255 characters in a MEMO field.
-The problem is (to my knowledge) an error in the MS Access ODBC driver. The problem is fixed
-by setting the C<data_type> of the column to C<SQL_LONGVARCHAR> in C<add_columns>. 
-C<SQL_LONGVARCHAR> is a constant in the C<DBI> module.
-
-=back
-
-=head1 IMPLEMENTED FUNCTIONS
-
-=head2 bind_attribute_by_data_type
-
-This function currently supports the SQL_LONGVARCHAR column type.
-
-=head2 insert
-
-=head2 last_insert_id
-
-=head2 sqlt_type
-
-=head1 BUGS
-
-Most likely. Bug reports are welcome.
-
-=head1 AUTHORS
-
-Øystein Torget C<< <oystein.torget at dnv.com> >>
-
-=head1 COPYRIGHT
-
-You may distribute this code under the same terms as Perl itself.
-
-Det Norske Veritas AS (DNV)
-
-http://www.dnv.com
-
-=cut
-
+package DBIx::Class::Storage::DBI::ODBC::ACCESS;
+use strict;
+use warnings;
+
+use DBI;
+use base qw/DBIx::Class::Storage::DBI/;
+
+my $ERR_MSG_START = __PACKAGE__ . ' failed: ';
+
+sub insert {
+    my $self = shift;
+    my ( $source, $to_insert ) = @_;
+
+    my $bind_attributes = $self->source_bind_attributes( $source );
+    my ( undef, $sth ) = $self->_execute( 'insert' => [], $source, $bind_attributes, $to_insert );
+
+    #store the identity here since @@IDENTITY is connection global and this prevents
+    #possibility that another insert to a different table overwrites it for this resultsource
+    my $identity = 'SELECT @@IDENTITY';
+    my $max_sth  = $self->{ _dbh }->prepare( $identity )
+        or $self->throw_exception( $ERR_MSG_START . $self->{ _dbh }->errstr() );
+    $max_sth->execute() or $self->throw_exception( $ERR_MSG_START . $max_sth->errstr );
+
+    my $row = $max_sth->fetchrow_arrayref()
+        or $self->throw_exception( $ERR_MSG_START . "$identity did not return any result." );
+
+    $self->{ last_pk }->{ $source->name() } = $row;
+
+    return $to_insert;
+}
+
+sub last_insert_id {
+    my $self = shift;
+    my ( $result_source ) = @_;
+
+    return @{ $self->{ last_pk }->{ $result_source->name() } };
+}
+
+sub bind_attribute_by_data_type {
+    my $self = shift;
+    
+    my ( $data_type ) = @_;
+    
+    return { TYPE => $data_type } if $data_type == DBI::SQL_LONGVARCHAR;
+    
+    return;
+}
+
+sub sqlt_type { 'ACCESS' }
+
+1;
+
+=head1 NAME
+
+DBIx::Class::Storage::DBI::ODBC::ACCESS - Support specific to MS Access over ODBC
+
+=head1 WARNING
+
+I am not a DBI, DBIx::Class or MS Access guru. Use this module with that in
+mind.
+
+This module is currently considered alpha software and can change without notice.
+
+=head1 DESCRIPTION
+
+This class implements support specific to Microsoft Access over ODBC.
+
+It is loaded automatically by by DBIx::Class::Storage::DBI::ODBC when it
+detects a MS Access back-end.
+
+=head1 SUPPORTED VERSIONS
+
+This module have currently only been tested on MS Access 2003 using the Jet 4.0 engine.
+
+As far as my knowledge it should work on MS Access 2000 or later, but that have not been tested.
+Information about support for different version of MS Access is welcome.
+
+=head1 IMPLEMENTATION NOTES
+
+MS Access supports the @@IDENTITY function for retriving the id of the latest inserted row.
+@@IDENTITY is global to the connection, so to support the possibility of getting the last inserted
+id for different tables, the insert() function stores the inserted id on a per table basis.
+last_insert_id() then just returns the stored value.
+
+=head1 KNOWN ACCESS PROBLEMS
+
+=over
+
+=item Invalid precision value
+
+This error message is received when trying to store more than 255 characters in a MEMO field.
+The problem is (to my knowledge) an error in the MS Access ODBC driver. The problem is fixed
+by setting the C<data_type> of the column to C<SQL_LONGVARCHAR> in C<add_columns>. 
+C<SQL_LONGVARCHAR> is a constant in the C<DBI> module.
+
+=back
+
+=head1 IMPLEMENTED FUNCTIONS
+
+=head2 bind_attribute_by_data_type
+
+This function currently supports the SQL_LONGVARCHAR column type.
+
+=head2 insert
+
+=head2 last_insert_id
+
+=head2 sqlt_type
+
+=head1 BUGS
+
+Most likely. Bug reports are welcome.
+
+=head1 AUTHORS
+
+Øystein Torget C<< <oystein.torget at dnv.com> >>
+
+=head1 COPYRIGHT
+
+You may distribute this code under the same terms as Perl itself.
+
+Det Norske Veritas AS (DNV)
+
+http://www.dnv.com
+
+=cut
+


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/ACCESS.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/DB2_400_SQL.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,13 +2,13 @@
 use strict;
 use warnings;
 
-use base qw/DBIx::Class::Storage::DBI/;
+use base qw/DBIx::Class::Storage::DBI::MSSQL/;
 
 sub _prep_for_execute {
     my $self = shift;
     my ($op, $extra_bind, $ident, $args) = @_;
 
-    my ($sql, $bind) = $self->SUPER::_prep_for_execute(@_);
+    my ($sql, $bind) = $self->next::method (@_);
     $sql .= ';SELECT SCOPE_IDENTITY()' if $op eq 'insert';
 
     return ($sql, $bind);
@@ -19,33 +19,16 @@
     my ($op) = @_;
 
     my ($rv, $sth, @bind) = $self->dbh_do($self->can('_dbh_execute'), @_);
-    $self->{_scope_identity} = $sth->fetchrow_array if $op eq 'insert';
+    if ($op eq 'insert') {
+      $self->{_scope_identity} = $sth->fetchrow_array;
+      $sth->finish;
+    }
 
     return wantarray ? ($rv, $sth, @bind) : $rv;
 }
 
 sub last_insert_id { shift->{_scope_identity} }
 
-sub sqlt_type { 'SQLServer' }
-
-sub _sql_maker_opts {
-    my ( $self, $opts ) = @_;
-
-    if ( $opts ) {
-        $self->{_sql_maker_opts} = { %$opts };
-    }
-
-    return { limit_dialect => 'Top', %{$self->{_sql_maker_opts}||{}} };
-}
-
-sub build_datetime_parser {
-  my $self = shift;
-  my $type = "DateTime::Format::Strptime";
-  eval "use ${type}";
-  $self->throw_exception("Couldn't load ${type}: $@") if $@;
-  return $type->new( pattern => '%F %T' );
-}
-
 1;
 
 __END__
@@ -72,17 +55,6 @@
 So, this implementation appends a SELECT SCOPE_IDENTITY() statement
 onto each INSERT to accommodate that requirement.
 
-=head1 METHODS
-
-=head2 last_insert_id
-
-=head2 sqlt_type
-
-=head2 build_datetime_parser
-
-The resulting parser handles the MSSQL C<DATETIME> type, but is almost
-certainly not sufficient for the other MSSQL 2008 date/time types.
-
 =head1 AUTHORS
 
 Marc Mims C<< <marc at questright.com> >>


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -7,7 +7,7 @@
 sub _rebless {
     my ($self) = @_;
 
-    my $dbtype = eval { $self->_dbh->get_info(17) };
+    my $dbtype = eval { $self->dbh->get_info(17) };
     unless ( $@ ) {
         # Translate the backend name into a perl identifier
         $dbtype =~ s/\W/_/gi;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/ODBC.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,5 +1,4 @@
 package DBIx::Class::Storage::DBI::Oracle::Generic;
-# -*- mode: cperl; cperl-indent-level: 2 -*-
 
 use strict;
 use warnings;
@@ -24,12 +23,12 @@
 
 =cut
 
+use base qw/DBIx::Class::Storage::DBI/;
 use Carp::Clan qw/^DBIx::Class/;
 
-use base qw/DBIx::Class::Storage::DBI::MultiDistinctEmulation/;
+# For ORA_BLOB => 113, ORA_CLOB => 112
+use DBD::Oracle qw( :ora_types );
 
-# __PACKAGE__->load_components(qw/PK::Auto/);
-
 sub _dbh_last_insert_id {
   my ($self, $dbh, $source, @columns) = @_;
   my @ids = ();
@@ -98,7 +97,7 @@
 sub connected {
   my $self = shift;
 
-  if (not $self->SUPER::connected(@_)) {
+  if (not $self->next::method(@_)) {
     return 0;
   }
   else {
@@ -128,9 +127,9 @@
     do {
       eval {
         if ($wantarray) {
-          @res    = $self->SUPER::_dbh_execute(@_);
+          @res    = $self->next::method(@_);
         } else {
-          $res[0] = $self->SUPER::_dbh_execute(@_);
+          $res[0] = $self->next::method(@_);
         }
       };
       $exception = $@;
@@ -190,6 +189,48 @@
     $self->dbh->do("SAVEPOINT $name");
 }
 
+=head2 source_bind_attributes
+
+Handle LOB types in Oracle.  Under a certain size (4k?), you can get away
+with the driver assuming your input is the deprecated LONG type if you
+encode it as a hex string.  That ain't gonna fly at larger values, where
+you'll discover you have to do what this does.
+
+This method had to be overridden because we need to set ora_field to the
+actual column, and that isn't passed to the call (provided by Storage) to
+bind_attribute_by_data_type.
+
+According to L<DBD::Oracle>, the ora_field isn't always necessary, but
+adding it doesn't hurt, and will save your bacon if you're modifying a
+table with more than one LOB column.
+
+=cut
+
+sub source_bind_attributes 
+{
+	my $self = shift;
+	my($source) = @_;
+
+	my %bind_attributes;
+
+	foreach my $column ($source->columns) {
+		my $data_type = $source->column_info($column)->{data_type} || '';
+		next unless $data_type;
+
+		my %column_bind_attrs = $self->bind_attribute_by_data_type($data_type);
+
+		if ($data_type =~ /^[BC]LOB$/i) {
+			$column_bind_attrs{'ora_type'}
+				= uc($data_type) eq 'CLOB' ? ORA_CLOB : ORA_BLOB;
+			$column_bind_attrs{'ora_field'} = $column;
+		}
+
+		$bind_attributes{$column} = \%column_bind_attrs;
+	}
+
+	return \%bind_attributes;
+}
+
 # Oracle automatically releases a savepoint when you start another one with the
 # same name.
 sub _svp_release { 1 }


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle/WhereJoins.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle/WhereJoins.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle/WhereJoins.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -5,95 +5,8 @@
 use strict;
 use warnings;
 
-__PACKAGE__->sql_maker_class('DBIC::SQL::Abstract::Oracle');
+__PACKAGE__->sql_maker_class('DBIx::Class::SQLAHacks::OracleJoins');
 
-BEGIN {
-  package # Hide from PAUSE
-    DBIC::SQL::Abstract::Oracle;
-
-  use base qw( DBIC::SQL::Abstract );
-
-  sub select {
-    my ($self, $table, $fields, $where, $order, @rest) = @_;
-
-    if (ref($table) eq 'ARRAY') {
-      $where = $self->_oracle_joins($where, @{ $table });
-    }
-
-    return $self->SUPER::select($table, $fields, $where, $order, @rest);
-  }
-
-  sub _recurse_from {
-    my ($self, $from, @join) = @_;
-
-    my @sqlf = $self->_make_as($from);
-
-    foreach my $j (@join) {
-      my ($to, $on) = @{ $j };
-
-      if (ref $to eq 'ARRAY') {
-        push (@sqlf, $self->_recurse_from(@{ $to }));
-      }
-      else {
-        push (@sqlf, $self->_make_as($to));
-      }
-    }
-
-    return join q{, }, @sqlf;
-  }
-
-  sub _oracle_joins {
-    my ($self, $where, $from, @join) = @_;
-    my $join_where = {};
-    $self->_recurse_oracle_joins($join_where, $from, @join);
-    if (keys %$join_where) {
-      if (!defined($where)) {
-        $where = $join_where;
-      } else {
-        if (ref($where) eq 'ARRAY') {
-          $where = { -or => $where };
-        }
-        $where = { -and => [ $join_where, $where ] };
-      }
-    }
-    return $where;
-  }
-
-  sub _recurse_oracle_joins {
-    my ($self, $where, $from, @join) = @_;
-
-    foreach my $j (@join) {
-      my ($to, $on) = @{ $j };
-
-      if (ref $to eq 'ARRAY') {
-        $self->_recurse_oracle_joins($where, @{ $to });
-      }
-
-      my $to_jt      = ref $to eq 'ARRAY' ? $to->[0] : $to;
-      my $left_join  = q{};
-      my $right_join = q{};
-
-      if (ref $to_jt eq 'HASH' and exists $to_jt->{-join_type}) {
-        #TODO: Support full outer joins -- this would happen much earlier in
-        #the sequence since oracle 8's full outer join syntax is best
-        #described as INSANE.
-        die "Can't handle full outer joins in Oracle 8 yet!\n"
-          if $to_jt->{-join_type} =~ /full/i;
-
-        $left_join  = q{(+)} if $to_jt->{-join_type} =~ /left/i
-                             && $to_jt->{-join_type} !~ /inner/i;
-
-        $right_join = q{(+)} if $to_jt->{-join_type} =~ /right/i
-                             && $to_jt->{-join_type} !~ /inner/i;
-      }
-
-      foreach my $lhs (keys %{ $on }) {
-        $where->{$lhs . $left_join} = \"= $on->{ $lhs }$right_join";
-      }
-    }
-  }
-}
-
 1;
 
 __END__
@@ -135,34 +48,8 @@
 
 =head1 METHODS
 
-This module replaces a subroutine contained in DBIC::SQL::Abstract:
+See L<DBIx::Class::SQLAHacks::OracleJoins> for implementation details.
 
-=over
-
-=item sql_maker
-
-=back
-
-It also creates a new module in its BEGIN { } block called
-DBIC::SQL::Abstract::Oracle which has the following methods:
-
-=over
-
-=item select ($\@$;$$@)
-
-Replaces DBIC::SQL::Abstract's select() method, which calls _oracle_joins()
-to modify the column and table list before calling SUPER::select().
-
-=item _recurse_from ($$\@)
-
-Recursive subroutine that builds the table list.
-
-=item _oracle_joins ($$$@)
-
-Creates the left/right relationship in the where query.
-
-=back
-
 =head1 BUGS
 
 Does not support full outer joins.
@@ -172,8 +59,10 @@
 
 =over
 
-=item L<DBIC::SQL::Abstract>
+=item L<DBIx::Class::SQLAHacks>
 
+=item L<DBIx::Class::SQLAHacks::OracleJoins>
+
 =item L<DBIx::Class::Storage::DBI::Oracle::Generic>
 
 =item L<DBIx::Class>


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle/WhereJoins.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -8,7 +8,7 @@
 sub _rebless {
     my ($self) = @_;
 
-    my $version = eval { $self->_dbh->get_info(18); };
+    my $version = eval { $self->dbh->get_info(18); };
 
     if ( !$@ ) {
         my ($major, $minor, $patchlevel) = split(/\./, $version);


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Oracle.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Pg.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Pg.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Pg.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -5,7 +5,7 @@
 
 use DBD::Pg qw(:pg_types);
 
-use base qw/DBIx::Class::Storage::DBI/;
+use base qw/DBIx::Class::Storage::DBI::MultiColumnIn/;
 
 # __PACKAGE__->load_components(qw/PK::Auto/);
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Pg.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/First.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/First.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/First.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,6 +2,7 @@
 
 use Moose;
 with 'DBIx::Class::Storage::DBI::Replicated::Balancer';
+use namespace::clean -except => 'meta';
 
 =head1 NAME
 
@@ -50,4 +51,4 @@
 
 __PACKAGE__->meta->make_immutable;
 
-1;
\ No newline at end of file
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/First.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,6 +2,8 @@
 
 use Moose;
 with 'DBIx::Class::Storage::DBI::Replicated::Balancer';
+use DBIx::Class::Storage::DBI::Replicated::Types 'Weight';
+use namespace::clean -except => 'meta';
 
 =head1 NAME
 
@@ -26,6 +28,23 @@
 
 This class defines the following attributes.
 
+=head2 master_read_weight
+
+A number greater than 0 that specifies what weight to give the master when
+choosing which backend to execute a read query on. A value of 0, which is the
+default, does no reads from master, while a value of 1 gives it the same
+priority as any single replicant.
+
+For example: if you have 2 replicants, and a L</master_read_weight> of C<0.5>,
+the chance of reading from master will be C<20%>.
+
+You can set it to a value higher than 1, making master have higher weight than
+any single replicant, if for example you have a very powerful master.
+
+=cut
+
+has master_read_weight => (is => 'rw', isa => Weight, default => sub { 0 });
+
 =head1 METHODS
 
 This class defines the following methods.
@@ -40,13 +59,25 @@
 
 sub next_storage {
   my $self = shift @_;
-  my @active_replicants = $self->pool->active_replicants;
-  my $count_active_replicants = $#active_replicants +1;
-  my $random_replicant = int(rand($count_active_replicants));
-  
-  return $active_replicants[$random_replicant];
+
+  my @replicants = $self->pool->active_replicants;
+
+  if (not @replicants) {
+    # will fall back to master anyway
+    return;
+  }
+
+  my $master     = $self->master;
+
+  my $rnd = $self->_random_number(@replicants + $self->master_read_weight);
+
+  return $rnd >= @replicants ? $master : $replicants[int $rnd];
 }
 
+sub _random_number {
+  rand($_[1])
+}
+
 =head1 AUTHOR
 
 John Napiorkowski <john.napiorkowski at takkle.com>
@@ -59,4 +90,4 @@
 
 __PACKAGE__->meta->make_immutable;
 
-1;
\ No newline at end of file
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,7 +2,10 @@
 
 use Moose::Role;
 requires 'next_storage';
+use MooseX::Types::Moose qw/Int/;
 
+use namespace::clean -except => 'meta';
+
 =head1 NAME
 
 DBIx::Class::Storage::DBI::Replicated::Balancer - A Software Load Balancer 
@@ -31,7 +34,7 @@
 
 has 'auto_validate_every' => (
   is=>'rw',
-  isa=>'Int',
+  isa=>Int,
   predicate=>'has_auto_validate_every',
 );
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -3,8 +3,13 @@
 use Moose;
 use MooseX::AttributeHelpers;
 use DBIx::Class::Storage::DBI::Replicated::Replicant;
-use List::Util qw(sum);
+use List::Util 'sum';
+use Scalar::Util 'reftype';
+use Carp::Clan qw/^DBIx::Class/;
+use MooseX::Types::Moose qw/Num Int ClassName HashRef/;
 
+use namespace::clean -except => 'meta';
+
 =head1 NAME
 
 DBIx::Class::Storage::DBI::Replicated::Pool - Manage a pool of replicants
@@ -37,7 +42,7 @@
 
 has 'maximum_lag' => (
   is=>'rw',
-  isa=>'Num',
+  isa=>Num,
   required=>1,
   lazy=>1,
   default=>0,
@@ -53,7 +58,7 @@
 
 has 'last_validated' => (
   is=>'rw',
-  isa=>'Int',
+  isa=>Int,
   reader=>'last_validated',
   writer=>'_last_validated',
   lazy=>1,
@@ -70,7 +75,7 @@
 
 has 'replicant_type' => (
   is=>'ro',
-  isa=>'ClassName',
+  isa=>ClassName,
   required=>1,
   default=>'DBIx::Class::Storage::DBI',
   handles=>{
@@ -120,7 +125,7 @@
 has 'replicants' => (
   is=>'rw',
   metaclass => 'Collection::Hash',
-  isa=>'HashRef[DBIx::Class::Storage::DBI]',
+  isa=>HashRef['DBIx::Class::Storage::DBI'],
   default=>sub {{}},
   provides  => {
     'set' => 'set_replicant',
@@ -137,9 +142,9 @@
 
 =head2 connect_replicants ($schema, Array[$connect_info])
 
-Given an array of $dsn suitable for connected to a database, create an
-L<DBIx::Class::Storage::DBI::Replicated::Replicant> object and store it in the
-L</replicants> attribute.
+Given an array of $dsn or connect_info structures suitable for connected to a
+database, create an L<DBIx::Class::Storage::DBI::Replicated::Replicant> object
+and store it in the L</replicants> attribute.
 
 =cut
 
@@ -149,8 +154,18 @@
   
   my @newly_created = ();
   foreach my $connect_info (@_) {
+    $connect_info = [ $connect_info ]
+      if reftype $connect_info ne 'ARRAY';
+
+    croak "coderef replicant connect_info not supported"
+      if ref $connect_info->[0] && reftype $connect_info->[0] eq 'CODE';
+
     my $replicant = $self->connect_replicant($schema, $connect_info);
-    my ($key) = ($connect_info->[0]=~m/^dbi\:.+\:(.+)$/);
+
+    my $key = $connect_info->[0];
+    $key = $key->{dsn} if ref $key && reftype $key eq 'HASH';
+    ($key) = ($key =~ m/^dbi\:.+\:(.+)$/);
+
     $self->set_replicant( $key => $replicant);  
     push @newly_created, $replicant;
   }
@@ -169,7 +184,20 @@
   my ($self, $schema, $connect_info) = @_;
   my $replicant = $self->create_replicant($schema);
   $replicant->connect_info($connect_info);
-  $self->_safely_ensure_connected($replicant);
+
+## It is undesirable for catalyst to connect at ->conect_replicants time, as
+## connections should only happen on the first request that uses the database.
+## So we try to set the driver without connecting, however this doesn't always
+## work, as a driver may need to connect to determine the DB version, and this
+## may fail.
+##
+## Why this is necessary at all, is that we need to have the final storage
+## class to apply the Replicant role.
+
+  $self->_safely($replicant, '->_determine_driver', sub {
+    $replicant->_determine_driver
+  });
+
   DBIx::Class::Storage::DBI::Replicated::Replicant->meta->apply($replicant);  
   return $replicant;
 }
@@ -180,21 +208,39 @@
 connect.  For the master database this is desirable, but since replicants are
 allowed to fail, this behavior is not desirable.  This method wraps the call
 to ensure_connected in an eval in order to catch any generated errors.  That
-way a slave to go completely offline (ie, the box itself can die) without
+way a slave can go completely offline (ie, the box itself can die) without
 bringing down your entire pool of databases.
 
 =cut
 
 sub _safely_ensure_connected {
   my ($self, $replicant, @args) = @_;
+
+  return $self->_safely($replicant, '->ensure_connected', sub {
+    $replicant->ensure_connected(@args)
+  });
+}
+
+=head2 _safely ($replicant, $name, $code)
+
+Execute C<$code> for operation C<$name> catching any exceptions and printing an
+error message to the C<<$replicant->debugobj>>.
+
+Returns 1 on success and undef on failure.
+
+=cut
+
+sub _safely {
+  my ($self, $replicant, $name, $code) = @_;
+
   eval {
-    $replicant->ensure_connected(@args);
+    $code->()
   }; 
   if ($@) {
     $replicant
       ->debugobj
       ->print(
-        sprintf( "Exception trying to ->ensure_connected for replicant %s, error is %s",
+        sprintf( "Exception trying to $name for replicant %s, error is %s",
           $replicant->_dbi_connect_info->[0], $@)
         );
   	return;
@@ -280,13 +326,13 @@
     if($self->_safely_ensure_connected($replicant)) {
       my $is_replicating = $replicant->is_replicating;
       unless(defined $is_replicating) {
-        $replicant->debugobj->print("Storage Driver ".ref $self." Does not support the 'is_replicating' method.  Assuming you are manually managing.");
+        $replicant->debugobj->print("Storage Driver ".ref($self)." Does not support the 'is_replicating' method.  Assuming you are manually managing.\n");
         next;
       } else {
         if($is_replicating) {
           my $lag_behind_master = $replicant->lag_behind_master;
           unless(defined $lag_behind_master) {
-            $replicant->debugobj->print("Storage Driver ".ref $self." Does not support the 'lag_behind_master' method.  Assuming you are manually managing.");
+            $replicant->debugobj->print("Storage Driver ".ref($self)." Does not support the 'lag_behind_master' method.  Assuming you are manually managing.\n");
             next;
           } else {
             if($lag_behind_master <= $self->maximum_lag) {


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Replicant.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Replicant.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Replicant.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,7 +2,11 @@
 
 use Moose::Role;
 requires qw/_query_start/;
+with 'DBIx::Class::Storage::DBI::Replicated::WithDSN';
+use MooseX::Types::Moose 'Bool';
 
+use namespace::clean -except => 'meta';
+
 =head1 NAME
 
 DBIx::Class::Storage::DBI::Replicated::Replicant - A replicated DBI Storage Role
@@ -42,7 +46,7 @@
 
 has 'active' => (
   is=>'rw',
-  isa=>'Bool',
+  isa=>Bool,
   lazy=>1,
   required=>1,
   default=>1,
@@ -52,18 +56,6 @@
 
 This class defines the following methods.
 
-=head2 around: _query_start
-
-advice iof the _query_start method to add more debuggin
-
-=cut
-
-around '_query_start' => sub {
-  my ($method, $self, $sql, @bind) = @_;
-  my $dsn = $self->_dbi_connect_info->[0];
-  $self->$method("DSN: $dsn SQL: $sql", @bind);
-};
-
 =head2 debugobj
 
 Override the debugobj method to redirect this method call back to the master.
@@ -76,7 +68,8 @@
 
 =head1 ALSO SEE
 
-L<<a href="http://en.wikipedia.org/wiki/Replicant">http://en.wikipedia.org/wiki/Replicant</a>>
+L<http://en.wikipedia.org/wiki/Replicant>,
+L<DBIx::Class::Storage::DBI::Replicated>
 
 =head1 AUTHOR
 
@@ -88,4 +81,4 @@
 
 =cut
 
-1;
\ No newline at end of file
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Replicant.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Types.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Types.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Types.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,47 @@
+package # hide from PAUSE
+  DBIx::Class::Storage::DBI::Replicated::Types;
+
+=head1 NAME
+
+DBIx::Class::Storage::DBI::Replicated::Types - Types used internally by
+L<DBIx::Class::Storage::DBI::Replicated>
+
+=cut
+
+use MooseX::Types
+  -declare => [qw/BalancerClassNamePart Weight/];
+use MooseX::Types::Moose qw/ClassName Str Num/;
+
+class_type 'DBIx::Class::Storage::DBI';
+class_type 'DBIx::Class::Schema';
+
+subtype BalancerClassNamePart,
+  as ClassName;
+    
+coerce BalancerClassNamePart,
+  from Str,
+  via {
+    my $type = $_;
+    if($type=~m/^::/) {
+      $type = 'DBIx::Class::Storage::DBI::Replicated::Balancer'.$type;
+    }  
+    Class::MOP::load_class($type);  
+    $type;  	
+  };
+
+subtype Weight,
+  as Num,
+  where { $_ >= 0 },
+  message { 'weight must be a decimal greater than 0' };
+
+=head1 AUTHOR
+
+  John Napiorkowski <john.napiorkowski at takkle.com>
+
+=head1 LICENSE
+
+You may distribute this code under the same terms as Perl itself.
+
+=cut
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/Types.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,51 @@
+package DBIx::Class::Storage::DBI::Replicated::WithDSN;
+
+use Moose::Role;
+requires qw/_query_start/;
+
+use namespace::clean -except => 'meta';
+
+=head1 NAME
+
+DBIx::Class::Storage::DBI::Replicated::WithDSN - A DBI Storage Role with DSN
+information in trace output
+
+=head1 SYNOPSIS
+
+This class is used internally by L<DBIx::Class::Storage::DBI::Replicated>.
+    
+=head1 DESCRIPTION
+
+This role adds C<DSN: > info to storage debugging output.
+
+=head1 METHODS
+
+This class defines the following methods.
+
+=head2 around: _query_start
+
+Add C<DSN: > to debugging output.
+
+=cut
+
+around '_query_start' => sub {
+  my ($method, $self, $sql, @bind) = @_;
+  my $dsn = $self->_dbi_connect_info->[0];
+  $self->$method("DSN: $dsn SQL: $sql", @bind);
+};
+
+=head1 ALSO SEE
+
+L<DBIx::Class::Storage::DBI>
+
+=head1 AUTHOR
+
+John Napiorkowski <john.napiorkowski at takkle.com>
+
+=head1 LICENSE
+
+You may distribute this code under the same terms as Perl itself.
+
+=cut
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -7,10 +7,11 @@
   ## use, so we explicitly test for these.
 	
   my %replication_required = (
-    Moose => '0.54',
+    Moose => '0.77',
     MooseX::AttributeHelpers => '0.12',
-    Moose::Util::TypeConstraints => '0.54',
-    Class::MOP => '0.63',
+    MooseX::Types => '0.10',
+    namespace::clean => '0.11',
+    Hash::Merge => '0.11'
   );
 	
   my @didnt_load;
@@ -25,10 +26,18 @@
     if @didnt_load;  	
 }
 
+use Moose;
 use DBIx::Class::Storage::DBI;
 use DBIx::Class::Storage::DBI::Replicated::Pool;
 use DBIx::Class::Storage::DBI::Replicated::Balancer;
+use DBIx::Class::Storage::DBI::Replicated::Types 'BalancerClassNamePart';
+use MooseX::Types::Moose qw/ClassName HashRef Object/;
+use Scalar::Util 'reftype';
+use Carp::Clan qw/^DBIx::Class/;
+use Hash::Merge 'merge';
 
+use namespace::clean -except => 'meta';
+
 =head1 NAME
 
 DBIx::Class::Storage::DBI::Replicated - BETA Replicated database support
@@ -99,10 +108,11 @@
 
 Replicated Storage has additional requirements not currently part of L<DBIx::Class>
 
-  Moose => 0.54
+  Moose => 0.77
   MooseX::AttributeHelpers => 0.12 
-  Moose::Util::TypeConstraints => 0.54
-  Class::MOP => 0.63
+  MooseX::Types => 0.10
+  namespace::clean => 0.11
+  Hash::Merge => 0.11
   
 You will need to install these modules manually via CPAN or make them part of the
 Makefile for your distribution.
@@ -132,9 +142,8 @@
 =cut
 
 has 'pool_type' => (
-  is=>'ro',
-  isa=>'ClassName',
-  required=>1,
+  is=>'rw',
+  isa=>ClassName,
   default=>'DBIx::Class::Storage::DBI::Replicated::Pool',
   handles=>{
     'create_pool' => 'new',
@@ -149,10 +158,9 @@
 =cut
 
 has 'pool_args' => (
-  is=>'ro',
-  isa=>'HashRef',
+  is=>'rw',
+  isa=>HashRef,
   lazy=>1,
-  required=>1,
   default=>sub { {} },
 );
 
@@ -164,23 +172,9 @@
 
 =cut
 
-subtype 'DBIx::Class::Storage::DBI::Replicated::BalancerClassNamePart',
-  as 'ClassName';
-    
-coerce 'DBIx::Class::Storage::DBI::Replicated::BalancerClassNamePart',
-  from 'Str',
-  via {
-  	my $type = $_;
-    if($type=~m/^::/) {
-      $type = 'DBIx::Class::Storage::DBI::Replicated::Balancer'.$type;
-    }  
-    Class::MOP::load_class($type);  
-    $type;  	
-  };
-
 has 'balancer_type' => (
-  is=>'ro',
-  isa=>'DBIx::Class::Storage::DBI::Replicated::BalancerClassNamePart',
+  is=>'rw',
+  isa=>BalancerClassNamePart,
   coerce=>1,
   required=>1,
   default=> 'DBIx::Class::Storage::DBI::Replicated::Balancer::First',
@@ -197,8 +191,8 @@
 =cut
 
 has 'balancer_args' => (
-  is=>'ro',
-  isa=>'HashRef',
+  is=>'rw',
+  isa=>HashRef,
   lazy=>1,
   required=>1,
   default=>sub { {} },
@@ -230,7 +224,7 @@
 =cut
 
 has 'balancer' => (
-  is=>'ro',
+  is=>'rw',
   isa=>'DBIx::Class::Storage::DBI::Replicated::Balancer',
   lazy_build=>1,
   handles=>[qw/auto_validate_every/],
@@ -265,7 +259,7 @@
 
 has 'read_handler' => (
   is=>'rw',
-  isa=>'Object',
+  isa=>Object,
   lazy_build=>1,
   handles=>[qw/
     select
@@ -282,9 +276,8 @@
 
 has 'write_handler' => (
   is=>'ro',
-  isa=>'Object',
+  isa=>Object,
   lazy_build=>1,
-  lazy_build=>1,
   handles=>[qw/   
     on_connect_do
     on_disconnect_do       
@@ -313,11 +306,74 @@
 
     reload_row
     _prep_for_execute
-    configure_sqlt
     
   /],
 );
 
+has _master_connect_info_opts =>
+  (is => 'rw', isa => HashRef, default => sub { {} });
+
+=head2 around: connect_info
+
+Preserve master's C<connect_info> options (for merging with replicants.)
+Also set any Replicated related options from connect_info, such as
+C<pool_type>, C<pool_args>, C<balancer_type> and C<balancer_args>.
+
+=cut
+
+around connect_info => sub {
+  my ($next, $self, $info, @extra) = @_;
+
+  my $wantarray = wantarray;
+
+  my %opts;
+  for my $arg (@$info) {
+    next unless (reftype($arg)||'') eq 'HASH';
+    %opts = %{ merge($arg, \%opts) };
+  }
+  delete $opts{dsn};
+
+  if (@opts{qw/pool_type pool_args/}) {
+    $self->pool_type(delete $opts{pool_type})
+      if $opts{pool_type};
+
+    $self->pool_args(
+      merge((delete $opts{pool_args} || {}), $self->pool_args)
+    );
+
+    $self->pool($self->_build_pool)
+	if $self->pool;
+  }
+
+  if (@opts{qw/balancer_type balancer_args/}) {
+    $self->balancer_type(delete $opts{balancer_type})
+      if $opts{balancer_type};
+
+    $self->balancer_args(
+      merge((delete $opts{balancer_args} || {}), $self->balancer_args)
+    );
+
+    $self->balancer($self->_build_balancer)
+	if $self->balancer;
+  }
+
+  $self->_master_connect_info_opts(\%opts);
+
+  my (@res, $res);
+  if ($wantarray) {
+    @res = $self->$next($info, @extra);
+  } else {
+    $res = $self->$next($info, @extra);
+  }
+
+  # May have to reapply role if master will be reblessed to a more specific
+  # driver.
+  $self->master->_determine_driver;
+  DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($self->master);
+
+  $wantarray ? @res : $res;
+};
+
 =head1 METHODS
 
 This class defines the following methods.
@@ -348,7 +404,9 @@
 
 sub _build_master {
   my $self = shift @_;
-  DBIx::Class::Storage::DBI->new($self->schema);
+  my $master = DBIx::Class::Storage::DBI->new($self->schema);
+  DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($master);
+  $master
 }
 
 =head2 _build_pool
@@ -403,13 +461,49 @@
 =head2 around: connect_replicants
 
 All calls to connect_replicants needs to have an existing $schema tacked onto
-top of the args, since L<DBIx::Storage::DBI> needs it.
+top of the args, since L<DBIx::Storage::DBI> needs it, and any C<connect_info>
+options merged with the master, with replicant opts having higher priority.
 
 =cut
 
-around 'connect_replicants' => sub {
-  my ($method, $self, @args) = @_;
-  $self->$method($self->schema, @args);
+around connect_replicants => sub {
+  my ($next, $self, @args) = @_;
+
+  for my $r (@args) {
+    $r = [ $r ] unless reftype $r eq 'ARRAY';
+
+    croak "coderef replicant connect_info not supported"
+      if ref $r->[0] && reftype $r->[0] eq 'CODE';
+
+# any connect_info options?
+    my $i = 0;
+    $i++ while $i < @$r && (reftype($r->[$i])||'') ne 'HASH';
+
+# make one if none    
+    $r->[$i] = {} unless $r->[$i];
+
+# merge if two hashes
+    my @hashes = @$r[$i .. $#{$r}];
+
+    croak "invalid connect_info options"
+      if (grep { reftype($_) eq 'HASH' } @hashes) != @hashes;
+
+    croak "too many hashrefs in connect_info"
+      if @hashes > 2;
+
+    my %opts = %{ merge(reverse @hashes) };
+
+# delete them
+    splice @$r, $i+1, ($#{$r} - $i), ();
+
+# merge with master
+    %opts = %{ merge(\%opts, $self->_master_connect_info_opts) };
+
+# update
+    $r->[$i] = \%opts;
+  }
+
+  $self->$next($self->schema, @args);
 };
 
 =head2 all_storages
@@ -424,7 +518,7 @@
   my $self = shift @_;
   return grep {defined $_ && blessed $_} (
      $self->master,
-     $self->replicants,
+     values %{ $self->replicants },
   );
 }
 
@@ -694,6 +788,21 @@
   }
 }
 
+=head2 cursor_class
+
+set cursor class on all storages, or return master's
+
+=cut
+
+sub cursor_class {
+  my ($self, $cursor_class) = @_;
+
+  if ($cursor_class) {
+    $_->cursor_class($cursor_class) for $self->all_storages;
+  }
+  $self->master->cursor_class;
+}
+  
 =head1 GOTCHAS
 
 Due to the fact that replicants can lag behind a master, you must take care to


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Replicated.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Role/QueryCounter.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/SQLite.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/SQLite.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/SQLite.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -6,7 +6,7 @@
 use File::Copy;
 use File::Spec;
 
-use base qw/DBIx::Class::Storage::DBI::MultiDistinctEmulation/;
+use base qw/DBIx::Class::Storage::DBI/;
 
 sub _dbh_last_insert_id {
   my ($self, $dbh, $source, $col) = @_;
@@ -45,21 +45,6 @@
   return $backupfile;
 }
 
-sub disconnect {
-
-  # As described in this node http://www.perlmonks.org/?node_id=666210
-  # there seems to be no sane way to ->disconnect a SQLite database with
-  # cached statement handles. As per mst we just zap the cache and 
-  # proceed as normal.
-
-  my $self = shift;
-  if ($self->connected) {
-    $self->_dbh->{CachedKids} = {};
-    $self->next::method (@_);
-  }
-}
-
-
 1;
 
 =head1 NAME


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/SQLite.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase/MSSQL.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase/MSSQL.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase/MSSQL.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -3,16 +3,32 @@
 use strict;
 use warnings;
 
-use Class::C3;
-use base qw/DBIx::Class::Storage::DBI::MSSQL DBIx::Class::Storage::DBI::Sybase/;
+use Carp::Clan qw/^DBIx::Class/;
 
+carp 'Setting of storage_type is redundant as connections through DBD::Sybase'
+    .' are now properly recognized and reblessed into the appropriate subclass'
+    .' (DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server in the'
+    .' case of MSSQL). Please remove the explicit call to'
+    .q/ $schema->storage_type('::DBI::Sybase::MSSQL')/
+    .', as this storage class has been deprecated in favor of the autodetected'
+    .' ::DBI::Sybase::Microsoft_SQL_Server';
+
+
+use base qw/DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server/;
+
 1;
 
 =head1 NAME
 
-DBIx::Class::Storage::DBI::Sybase::MSSQL - Storage::DBI subclass for MSSQL via
-DBD::Sybase
+DBIx::Class::Storage::DBI::Sybase::MSSQL - (DEPRECATED) Legacy storage class for MSSQL via DBD::Sybase
 
+=head1 NOTE
+
+Connections through DBD::Sybase are now correctly recognized and reblessed
+into the appropriate subclass (L<DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server>
+in the case of MSSQL). Please remove the explicit storage_type setting from your
+schema.
+
 =head1 SYNOPSIS
 
 This subclass supports MSSQL connected via L<DBD::Sybase>.
@@ -29,6 +45,8 @@
 
 Brandon L Black <blblack at gmail.com>
 
+Justin Hunter <justin.d.hunter at gmail.com>
+
 =head1 LICENSE
 
 You may distribute this code under the same terms as Perl itself.


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase/MSSQL.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase/MSSQL.pm)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,41 @@
+package DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server;
+
+use strict;
+use warnings;
+
+use base qw/
+  DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server
+  DBIx::Class::Storage::DBI::Sybase
+/;
+
+1;
+
+=head1 NAME
+
+DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server - Storage::DBI subclass for MSSQL via
+DBD::Sybase
+
+=head1 SYNOPSIS
+
+This subclass supports MSSQL server connections via L<DBD::Sybase>.
+
+=head1 CAVEATS
+
+This storage driver uses L<DBIx::Class::Storage::DBI::NoBindVars> as a base.
+This means that bind variables will be interpolated (properly quoted of course)
+into the SQL query itself, without using bind placeholders.
+
+More importantly this means that caching of prepared statements is explicitly
+disabled, as the interpolation renders it useless.
+
+=head1 AUTHORS
+
+Brandon L Black <blblack at gmail.com>
+
+Justin Hunter <justin.d.hunter at gmail.com>
+
+=head1 LICENSE
+
+You may distribute this code under the same terms as Perl itself.
+
+=cut


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm
___________________________________________________________________
Name: svn:mergeinfo
   + 
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -5,6 +5,25 @@
 
 use base qw/DBIx::Class::Storage::DBI::NoBindVars/;
 
+sub _rebless {
+    my $self = shift;
+
+    my $dbtype = eval { @{$self->dbh->selectrow_arrayref(qq{sp_server_info \@attribute_id=1})}[2] };
+    unless ( $@ ) {
+        $dbtype =~ s/\W/_/gi;
+        my $subclass = "DBIx::Class::Storage::DBI::Sybase::${dbtype}";
+        if ($self->load_optional_class($subclass) && !$self->isa($subclass)) {
+            bless $self, $subclass;
+            $self->_rebless;
+        }
+    }
+}
+
+sub _dbh_last_insert_id {
+    my ($self, $dbh, $source, $col) = @_;
+    return ($dbh->selectrow_array('select @@identity'))[0];
+}
+
 my $noquote = {
     int => qr/^ \-? \d+ $/x,
     integer => qr/^ \-? \d+ $/x,
@@ -37,10 +56,21 @@
 you are using an MSSQL database via L<DBD::Sybase>, see
 L<DBIx::Class::Storage::DBI::Sybase::MSSQL>.
 
+=head1 CAVEATS
+
+This storage driver uses L<DBIx::Class::Storage::DBI::NoBindVars> as a base.
+This means that bind variables will be interpolated (properly quoted of course)
+into the SQL query itself, without using bind placeholders.
+
+More importantly this means that caching of prepared statements is explicitly
+disabled, as the interpolation renders it useless.
+
 =head1 AUTHORS
 
 Brandon L Black <blblack at gmail.com>
 
+Justin Hunter <justin.d.hunter at gmail.com>
+
 =head1 LICENSE
 
 You may distribute this code under the same terms as Perl itself.


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/Sybase.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/mysql.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/mysql.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/mysql.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use base qw/DBIx::Class::Storage::DBI/;
+use base qw/DBIx::Class::Storage::DBI::MultiColumnIn/;
 
 # __PACKAGE__->load_components(qw/PK::Auto/);
 
@@ -51,6 +51,12 @@
     return shift->dbh->selectrow_hashref('show slave status')->{Seconds_Behind_Master};
 }
 
+# MySql can not do subquery update/deletes, only way is slow per-row operations.
+# This assumes you have set proper transaction isolation and use innodb.
+sub subq_update_delete {
+  return shift->_per_row_update_delete (@_);
+}
+
 1;
 
 =head1 NAME


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI/mysql.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -7,10 +7,11 @@
 use warnings;
 use Carp::Clan qw/^DBIx::Class/;
 use DBI;
-use SQL::Abstract::Limit;
+use DBIx::Class::SQLAHacks;
 use DBIx::Class::Storage::DBI::Cursor;
 use DBIx::Class::Storage::Statistics;
 use Scalar::Util qw/blessed weaken/;
+use List::Util();
 
 __PACKAGE__->mk_group_accessors('simple' =>
     qw/_connect_info _dbi_connect_info _dbh _sql_maker _sql_maker_opts
@@ -29,327 +30,9 @@
 __PACKAGE__->cursor_class('DBIx::Class::Storage::DBI::Cursor');
 
 __PACKAGE__->mk_group_accessors('inherited' => qw/sql_maker_class/);
-__PACKAGE__->sql_maker_class('DBIC::SQL::Abstract');
+__PACKAGE__->sql_maker_class('DBIx::Class::SQLAHacks');
 
-BEGIN {
 
-package # Hide from PAUSE
-  DBIC::SQL::Abstract; # Would merge upstream, but nate doesn't reply :(
-
-use base qw/SQL::Abstract::Limit/;
-
-# This prevents the caching of $dbh in S::A::L, I believe
-sub new {
-  my $self = shift->SUPER::new(@_);
-
-  # If limit_dialect is a ref (like a $dbh), go ahead and replace
-  #   it with what it resolves to:
-  $self->{limit_dialect} = $self->_find_syntax($self->{limit_dialect})
-    if ref $self->{limit_dialect};
-
-  $self;
-}
-
-# DB2 is the only remaining DB using this. Even though we are not sure if
-# RowNumberOver is still needed here (should be part of SQLA) leave the 
-# code in place
-sub _RowNumberOver {
-  my ($self, $sql, $order, $rows, $offset ) = @_;
-
-  $offset += 1;
-  my $last = $rows + $offset;
-  my ( $order_by ) = $self->_order_by( $order );
-
-  $sql = <<"SQL";
-SELECT * FROM
-(
-   SELECT Q1.*, ROW_NUMBER() OVER( ) AS ROW_NUM FROM (
-      $sql
-      $order_by
-   ) Q1
-) Q2
-WHERE ROW_NUM BETWEEN $offset AND $last
-
-SQL
-
-  return $sql;
-}
-
-
-# While we're at it, this should make LIMIT queries more efficient,
-#  without digging into things too deeply
-use Scalar::Util 'blessed';
-sub _find_syntax {
-  my ($self, $syntax) = @_;
-  
-  # DB2 is the only remaining DB using this. Even though we are not sure if
-  # RowNumberOver is still needed here (should be part of SQLA) leave the 
-  # code in place
-  my $dbhname = blessed($syntax) ? $syntax->{Driver}{Name} : $syntax;
-  if(ref($self) && $dbhname && $dbhname eq 'DB2') {
-    return 'RowNumberOver';
-  }
-  
-  $self->{_cached_syntax} ||= $self->SUPER::_find_syntax($syntax);
-}
-
-sub select {
-  my ($self, $table, $fields, $where, $order, @rest) = @_;
-  if (ref $table eq 'SCALAR') {
-    $table = $$table;
-  }
-  elsif (not ref $table) {
-    $table = $self->_quote($table);
-  }
-  local $self->{rownum_hack_count} = 1
-    if (defined $rest[0] && $self->{limit_dialect} eq 'RowNum');
-  @rest = (-1) unless defined $rest[0];
-  die "LIMIT 0 Does Not Compute" if $rest[0] == 0;
-    # and anyway, SQL::Abstract::Limit will cause a barf if we don't first
-  local $self->{having_bind} = [];
-  my ($sql, @ret) = $self->SUPER::select(
-    $table, $self->_recurse_fields($fields), $where, $order, @rest
-  );
-  $sql .= 
-    $self->{for} ?
-    (
-      $self->{for} eq 'update' ? ' FOR UPDATE' :
-      $self->{for} eq 'shared' ? ' FOR SHARE'  :
-      ''
-    ) :
-    ''
-  ;
-  return wantarray ? ($sql, @ret, @{$self->{having_bind}}) : $sql;
-}
-
-sub insert {
-  my $self = shift;
-  my $table = shift;
-  $table = $self->_quote($table) unless ref($table);
-  $self->SUPER::insert($table, @_);
-}
-
-sub update {
-  my $self = shift;
-  my $table = shift;
-  $table = $self->_quote($table) unless ref($table);
-  $self->SUPER::update($table, @_);
-}
-
-sub delete {
-  my $self = shift;
-  my $table = shift;
-  $table = $self->_quote($table) unless ref($table);
-  $self->SUPER::delete($table, @_);
-}
-
-sub _emulate_limit {
-  my $self = shift;
-  if ($_[3] == -1) {
-    return $_[1].$self->_order_by($_[2]);
-  } else {
-    return $self->SUPER::_emulate_limit(@_);
-  }
-}
-
-sub _recurse_fields {
-  my ($self, $fields, $params) = @_;
-  my $ref = ref $fields;
-  return $self->_quote($fields) unless $ref;
-  return $$fields if $ref eq 'SCALAR';
-
-  if ($ref eq 'ARRAY') {
-    return join(', ', map {
-      $self->_recurse_fields($_)
-        .(exists $self->{rownum_hack_count} && !($params && $params->{no_rownum_hack})
-          ? ' AS col'.$self->{rownum_hack_count}++
-          : '')
-      } @$fields);
-  } elsif ($ref eq 'HASH') {
-    foreach my $func (keys %$fields) {
-      return $self->_sqlcase($func)
-        .'( '.$self->_recurse_fields($fields->{$func}).' )';
-    }
-  }
-  # Is the second check absolutely necessary?
-  elsif ( $ref eq 'REF' and ref($$fields) eq 'ARRAY' ) {
-    return $self->_bind_to_sql( $fields );
-  }
-  else {
-    Carp::croak($ref . qq{ unexpected in _recurse_fields()})
-  }
-}
-
-sub _order_by {
-  my $self = shift;
-  my $ret = '';
-  my @extra;
-  if (ref $_[0] eq 'HASH') {
-    if (defined $_[0]->{group_by}) {
-      $ret = $self->_sqlcase(' group by ')
-        .$self->_recurse_fields($_[0]->{group_by}, { no_rownum_hack => 1 });
-    }
-    if (defined $_[0]->{having}) {
-      my $frag;
-      ($frag, @extra) = $self->_recurse_where($_[0]->{having});
-      push(@{$self->{having_bind}}, @extra);
-      $ret .= $self->_sqlcase(' having ').$frag;
-    }
-    if (defined $_[0]->{order_by}) {
-      $ret .= $self->_order_by($_[0]->{order_by});
-    }
-    if (grep { $_ =~ /^-(desc|asc)/i } keys %{$_[0]}) {
-      return $self->SUPER::_order_by($_[0]);
-    }
-  } elsif (ref $_[0] eq 'SCALAR') {
-    $ret = $self->_sqlcase(' order by ').${ $_[0] };
-  } elsif (ref $_[0] eq 'ARRAY' && @{$_[0]}) {
-    my @order = @{+shift};
-    $ret = $self->_sqlcase(' order by ')
-          .join(', ', map {
-                        my $r = $self->_order_by($_, @_);
-                        $r =~ s/^ ?ORDER BY //i;
-                        $r;
-                      } @order);
-  } else {
-    $ret = $self->SUPER::_order_by(@_);
-  }
-  return $ret;
-}
-
-sub _order_directions {
-  my ($self, $order) = @_;
-  $order = $order->{order_by} if ref $order eq 'HASH';
-  return $self->SUPER::_order_directions($order);
-}
-
-sub _table {
-  my ($self, $from) = @_;
-  if (ref $from eq 'ARRAY') {
-    return $self->_recurse_from(@$from);
-  } elsif (ref $from eq 'HASH') {
-    return $self->_make_as($from);
-  } else {
-    return $from; # would love to quote here but _table ends up getting called
-                  # twice during an ->select without a limit clause due to
-                  # the way S::A::Limit->select works. should maybe consider
-                  # bypassing this and doing S::A::select($self, ...) in
-                  # our select method above. meantime, quoting shims have
-                  # been added to select/insert/update/delete here
-  }
-}
-
-sub _recurse_from {
-  my ($self, $from, @join) = @_;
-  my @sqlf;
-  push(@sqlf, $self->_make_as($from));
-  foreach my $j (@join) {
-    my ($to, $on) = @$j;
-
-    # check whether a join type exists
-    my $join_clause = '';
-    my $to_jt = ref($to) eq 'ARRAY' ? $to->[0] : $to;
-    if (ref($to_jt) eq 'HASH' and exists($to_jt->{-join_type})) {
-      $join_clause = ' '.uc($to_jt->{-join_type}).' JOIN ';
-    } else {
-      $join_clause = ' JOIN ';
-    }
-    push(@sqlf, $join_clause);
-
-    if (ref $to eq 'ARRAY') {
-      push(@sqlf, '(', $self->_recurse_from(@$to), ')');
-    } else {
-      push(@sqlf, $self->_make_as($to));
-    }
-    push(@sqlf, ' ON ', $self->_join_condition($on));
-  }
-  return join('', @sqlf);
-}
-
-sub _bind_to_sql {
-  my $self = shift;
-  my $arr  = shift;
-  my $sql = shift @$$arr;
-  $sql =~ s/\?/$self->_quote((shift @$$arr)->[1])/eg;
-  return $sql
-}
-
-sub _make_as {
-  my ($self, $from) = @_;
-  return join(' ', map { (ref $_ eq 'SCALAR' ? $$_ 
-                        : ref $_ eq 'REF'    ? $self->_bind_to_sql($_) 
-                        : $self->_quote($_)) 
-                       } reverse each %{$self->_skip_options($from)});
-}
-
-sub _skip_options {
-  my ($self, $hash) = @_;
-  my $clean_hash = {};
-  $clean_hash->{$_} = $hash->{$_}
-    for grep {!/^-/} keys %$hash;
-  return $clean_hash;
-}
-
-sub _join_condition {
-  my ($self, $cond) = @_;
-  if (ref $cond eq 'HASH') {
-    my %j;
-    for (keys %$cond) {
-      my $v = $cond->{$_};
-      if (ref $v) {
-        # XXX no throw_exception() in this package and croak() fails with strange results
-        Carp::croak(ref($v) . qq{ reference arguments are not supported in JOINS - try using \"..." instead'})
-            if ref($v) ne 'SCALAR';
-        $j{$_} = $v;
-      }
-      else {
-        my $x = '= '.$self->_quote($v); $j{$_} = \$x;
-      }
-    };
-    return scalar($self->_recurse_where(\%j));
-  } elsif (ref $cond eq 'ARRAY') {
-    return join(' OR ', map { $self->_join_condition($_) } @$cond);
-  } else {
-    die "Can't handle this yet!";
-  }
-}
-
-sub _quote {
-  my ($self, $label) = @_;
-  return '' unless defined $label;
-  return "*" if $label eq '*';
-  return $label unless $self->{quote_char};
-  if(ref $self->{quote_char} eq "ARRAY"){
-    return $self->{quote_char}->[0] . $label . $self->{quote_char}->[1]
-      if !defined $self->{name_sep};
-    my $sep = $self->{name_sep};
-    return join($self->{name_sep},
-        map { $self->{quote_char}->[0] . $_ . $self->{quote_char}->[1]  }
-       split(/\Q$sep\E/,$label));
-  }
-  return $self->SUPER::_quote($label);
-}
-
-sub limit_dialect {
-    my $self = shift;
-    $self->{limit_dialect} = shift if @_;
-    return $self->{limit_dialect};
-}
-
-sub quote_char {
-    my $self = shift;
-    $self->{quote_char} = shift if @_;
-    return $self->{quote_char};
-}
-
-sub name_sep {
-    my $self = shift;
-    $self->{name_sep} = shift if @_;
-    return $self->{name_sep};
-}
-
-} # End of BEGIN block
-
 =head1 NAME
 
 DBIx::Class::Storage::DBI - DBI storage handler
@@ -471,6 +154,10 @@
 
 =over
 
+=item a scalar
+
+This contains one SQL statement to execute.
+
 =item an array reference
 
 This contains SQL statements to execute in order.  Each element contains
@@ -928,35 +615,56 @@
   my @info = @{$self->_dbi_connect_info || []};
   $self->_dbh($self->_connect(@info));
 
+  $self->_conn_pid($$);
+  $self->_conn_tid(threads->tid) if $INC{'threads.pm'};
+
+  $self->_determine_driver;
+
   # Always set the transaction depth on connect, since
   #  there is no transaction in progress by definition
   $self->{transaction_depth} = $self->_dbh_autocommit ? 0 : 1;
 
-  if(ref $self eq 'DBIx::Class::Storage::DBI') {
-    my $driver = $self->_dbh->{Driver}->{Name};
+  my $connection_do = $self->on_connect_do;
+  $self->_do_connection_actions($connection_do) if $connection_do;
+}
+
+sub _determine_driver {
+  my ($self) = @_;
+
+  if (ref $self eq 'DBIx::Class::Storage::DBI') {
+    my $driver;
+
+    if ($self->_dbh) { # we are connected
+      $driver = $self->_dbh->{Driver}{Name};
+    } else {
+      # try to use dsn to not require being connected, the driver may still
+      # force a connection in _rebless to determine version
+      ($driver) = $self->_dbi_connect_info->[0] =~ /dbi:([^:]+):/i;
+    }
+
     if ($self->load_optional_class("DBIx::Class::Storage::DBI::${driver}")) {
       bless $self, "DBIx::Class::Storage::DBI::${driver}";
       $self->_rebless();
     }
   }
-
-  $self->_conn_pid($$);
-  $self->_conn_tid(threads->tid) if $INC{'threads.pm'};
-
-  my $connection_do = $self->on_connect_do;
-  $self->_do_connection_actions($connection_do) if ref($connection_do);
 }
 
 sub _do_connection_actions {
   my $self = shift;
   my $connection_do = shift;
 
-  if (ref $connection_do eq 'ARRAY') {
+  if (!ref $connection_do) {
+    $self->_do_query($connection_do);
+  }
+  elsif (ref $connection_do eq 'ARRAY') {
     $self->_do_query($_) foreach @$connection_do;
   }
   elsif (ref $connection_do eq 'CODE') {
     $connection_do->($self);
   }
+  else {
+    $self->throw_exception (sprintf ("Don't know how to process conection actions of type '%s'", ref $connection_do) );
+  }
 
   return $self;
 }
@@ -1286,20 +994,22 @@
   my $ident = $source->from; 
   my $bind_attributes = $self->source_bind_attributes($source);
 
+  my $updated_cols = {};
+
   $self->ensure_connected;
   foreach my $col ( $source->columns ) {
     if ( !defined $to_insert->{$col} ) {
       my $col_info = $source->column_info($col);
 
       if ( $col_info->{auto_nextval} ) {
-        $to_insert->{$col} = $self->_sequence_fetch( 'nextval', $col_info->{sequence} || $self->_dbh_get_autoinc_seq($self->dbh, $source) );
+        $updated_cols->{$col} = $to_insert->{$col} = $self->_sequence_fetch( 'nextval', $col_info->{sequence} || $self->_dbh_get_autoinc_seq($self->dbh, $source) );
       }
     }
   }
 
   $self->_execute('insert' => [], $source, $bind_attributes, $to_insert);
 
-  return $to_insert;
+  return $updated_cols;
 }
 
 ## Still not quite perfect, and EXPERIMENTAL
@@ -1319,14 +1029,8 @@
 #  @bind = map { ref $_ ? ''.$_ : $_ } @bind; # stringify args
 
   ## This must be an arrayref, else nothing works!
-  
   my $tuple_status = [];
-  
-  ##use Data::Dumper;
-  ##print STDERR Dumper( $data, $sql, [@bind] );
 
-  my $time = time();
-
   ## Get the bind_attributes, if any exist
   my $bind_attributes = $self->source_bind_attributes($source);
 
@@ -1348,7 +1052,27 @@
     $sth->bind_param_array( $placeholder_index, [@data], $attributes );
     $placeholder_index++;
   }
-  my $rv = $sth->execute_array({ArrayTupleStatus => $tuple_status});
+  my $rv = eval { $sth->execute_array({ArrayTupleStatus => $tuple_status}) };
+  if (my $err = $@) {
+    my $i = 0;
+    ++$i while $i <= $#$tuple_status && !ref $tuple_status->[$i];
+
+    $self->throw_exception($sth->errstr || "Unexpected populate error: $err")
+      if ($i > $#$tuple_status);
+
+    require Data::Dumper;
+    local $Data::Dumper::Terse = 1;
+    local $Data::Dumper::Indent = 1;
+    local $Data::Dumper::Useqq = 1;
+    local $Data::Dumper::Quotekeys = 0;
+
+    $self->throw_exception(sprintf "%s for populate slice:\n%s",
+      $tuple_status->[$i][1],
+      Data::Dumper::Dumper(
+        { map { $cols->[$_] => $data->[$i][$_] } (0 .. $#$cols) }
+      ),
+    );
+  }
   $self->throw_exception($sth->errstr) if !$rv;
 
   $self->_query_end( $sql, @bind );
@@ -1373,6 +1097,97 @@
   return $self->_execute('delete' => [], $source, $bind_attrs, @_);
 }
 
+# We were sent here because the $rs contains a complex search
+# which will require a subquery to select the correct rows
+# (i.e. joined or limited resultsets)
+#
+# Genarating a single PK column subquery is trivial and supported
+# by all RDBMS. However if we have a multicolumn PK, things get ugly.
+# Look at _multipk_update_delete()
+sub subq_update_delete {
+  my $self = shift;
+  my ($rs, $op, $values) = @_;
+
+  my $rsrc = $rs->result_source;
+
+  # we already check this, but double check naively just in case. Should be removed soon
+  my $sel = $rs->_resolved_attrs->{select};
+  $sel = [ $sel ] unless ref $sel eq 'ARRAY';
+  my @pcols = $rsrc->primary_columns;
+  if (@$sel != @pcols) {
+    $self->throw_exception (
+      'Subquery update/delete can not be called on resultsets selecting a'
+     .' number of columns different than the number of primary keys'
+    );
+  }
+
+  if (@pcols == 1) {
+    return $self->$op (
+      $rsrc,
+      $op eq 'update' ? $values : (),
+      { $pcols[0] => { -in => $rs->as_query } },
+    );
+  }
+
+  else {
+    return $self->_multipk_update_delete (@_);
+  }
+}
+
+# ANSI SQL does not provide a reliable way to perform a multicol-PK
+# resultset update/delete involving subqueries. So by default resort
+# to simple (and inefficient) delete_all style per-row opearations,
+# while allowing specific storages to override this with a faster
+# implementation.
+#
+sub _multipk_update_delete {
+  return shift->_per_row_update_delete (@_);
+}
+
+# This is the default loop used to delete/update rows for multi PK
+# resultsets, and used by mysql exclusively (because it can't do anything
+# else).
+#
+# We do not use $row->$op style queries, because resultset update/delete
+# is not expected to cascade (this is what delete_all/update_all is for).
+#
+# There should be no race conditions as the entire operation is rolled
+# in a transaction.
+#
+sub _per_row_update_delete {
+  my $self = shift;
+  my ($rs, $op, $values) = @_;
+
+  my $rsrc = $rs->result_source;
+  my @pcols = $rsrc->primary_columns;
+
+  my $guard = $self->txn_scope_guard;
+
+  # emulate the return value of $sth->execute for non-selects
+  my $row_cnt = '0E0';
+
+  my $subrs_cur = $rs->cursor;
+  while (my @pks = $subrs_cur->next) {
+
+    my $cond;
+    for my $i (0.. $#pcols) {
+      $cond->{$pcols[$i]} = $pks[$i];
+    }
+
+    $self->$op (
+      $rsrc,
+      $op eq 'update' ? $values : (),
+      $cond,
+    );
+
+    $row_cnt++;
+  }
+
+  $guard->commit;
+
+  return $row_cnt;
+}
+
 sub _select {
   my $self = shift;
   my $sql_maker = $self->sql_maker;
@@ -1384,29 +1199,24 @@
   my ($self, $ident, $select, $condition, $attrs) = @_;
   my $order = $attrs->{order_by};
 
-  if (ref $condition eq 'SCALAR') {
-    my $unwrap = ${$condition};
-    if ($unwrap =~ s/ORDER BY (.*)$//i) {
-      $order = $1;
-      $condition = \$unwrap;
-    }
-  }
-
   my $for = delete $attrs->{for};
   my $sql_maker = $self->sql_maker;
   $sql_maker->{for} = $for;
 
-  if (exists $attrs->{group_by} || $attrs->{having}) {
+  my @in_order_attrs = qw/group_by having _virtual_order_by/;
+  if (List::Util::first { exists $attrs->{$_} } (@in_order_attrs) ) {
     $order = {
-      group_by => $attrs->{group_by},
-      having => $attrs->{having},
-      ($order ? (order_by => $order) : ())
+      ($order
+        ? (order_by => $order)
+        : ()
+      ),
+      ( map { $_ => $attrs->{$_} } (@in_order_attrs) )
     };
   }
   my $bind_attrs = {}; ## Future support
   my @args = ('select', $attrs->{bind}, $ident, $bind_attrs, $select, $condition, $order);
   if ($attrs->{software_limit} ||
-      $self->sql_maker->_default_limit_syntax eq "GenericSubQ") {
+      $sql_maker->_default_limit_syntax eq "GenericSubQ") {
         $attrs->{software_limit} = 1;
   } else {
     $self->throw_exception("rows attribute must be positive if present")
@@ -1419,6 +1229,57 @@
   return @args;
 }
 
+sub count {
+  my ($self, $source, $attrs) = @_;
+
+  my $tmp_attrs = { %$attrs };
+
+  # take off any column specs, any pagers, record_filter is cdbi, and no point of ordering a count
+  delete $tmp_attrs->{$_} for (qw/columns +columns select +select as +as rows offset page pager order_by record_filter/);
+
+  $tmp_attrs->{select} = { count => '*' };
+  $tmp_attrs->{as} = [qw/count/];
+
+  my $tmp_rs = $source->resultset_class->new($source, $tmp_attrs);
+  my ($count) = $tmp_rs->cursor->next;
+
+  # if the offset/rows attributes are still present, we did not use
+  # a subquery, so we need to make the calculations in software
+  $count -= $attrs->{offset} if $attrs->{offset};
+  $count = $attrs->{rows} if $attrs->{rows} and $attrs->{rows} < $count;
+  $count = 0 if ($count < 0);
+
+  return $count;
+}
+
+sub count_grouped {
+  my ($self, $source, $attrs) = @_;
+
+  # copy for the subquery, we need to do some adjustments to it too
+  my $sub_attrs = { %$attrs };
+
+  # these can not go in the subquery, and there is no point of ordering it
+  delete $sub_attrs->{$_} for qw/prefetch collapse select +select as +as columns +columns order_by/;
+
+  # if we prefetch, we group_by primary keys only as this is what we would get out of the rs via ->next/->all
+  # simply deleting group_by suffices, as the code below will re-fill it
+  # Note: we check $attrs, as $sub_attrs has collapse deleted
+  if (ref $attrs->{collapse} and keys %{$attrs->{collapse}} ) {
+    delete $sub_attrs->{group_by};
+  }
+
+  $sub_attrs->{columns} = $sub_attrs->{group_by} ||= [ map { "$attrs->{alias}.$_" } ($source->primary_columns) ];
+
+  $attrs->{from} = [{
+    count_subq => $source->resultset_class->new ($source, $sub_attrs )->as_query
+  }];
+
+  # the subquery replaces this
+  delete $attrs->{$_} for qw/where bind prefetch collapse distinct group_by having having_bind rows offset page pager/;
+
+  return $self->count ($source, $attrs);
+}
+
 sub source_bind_attributes {
   my ($self, $source) = @_;
   
@@ -1565,9 +1426,18 @@
 =cut
 
 sub _dbh_last_insert_id {
-    my ($self, $dbh, $source, $col) = @_;
-    # XXX This is a SQLite-ism as a default... is there a DBI-generic way?
-    $dbh->func('last_insert_rowid');
+    # All Storage's need to register their own _dbh_last_insert_id
+    # the old SQLite-based method was highly inappropriate
+
+    my $self = shift;
+    my $class = ref $self;
+    $self->throw_exception (<<EOE);
+
+No _dbh_last_insert_id() method found in $class.
+Since the method of obtaining the autoincrement id of the last insert
+operation varies greatly between different databases, this method must be
+individually implemented for every storage class.
+EOE
 }
 
 sub last_insert_id {
@@ -1597,7 +1467,7 @@
     return;
 }
 
-=head2 create_ddl_dir
+=head2 create_ddl_dir (EXPERIMENTAL)
 
 =over 4
 
@@ -1606,8 +1476,39 @@
 =back
 
 Creates a SQL file based on the Schema, for each of the specified
-database types, in the given directory.
+database engines in C<\@databases> in the given directory.
+(note: specify L<SQL::Translator> names, not L<DBI> driver names).
 
+Given a previous version number, this will also create a file containing
+the ALTER TABLE statements to transform the previous schema into the
+current one. Note that these statements may contain C<DROP TABLE> or
+C<DROP COLUMN> statements that can potentially destroy data.
+
+The file names are created using the C<ddl_filename> method below, please
+override this method in your schema if you would like a different file
+name format. For the ALTER file, the same format is used, replacing
+$version in the name with "$preversion-$version".
+
+See L<SQL::Translator/METHODS> for a list of values for C<\%sqlt_args>.
+The most common value for this would be C<< { add_drop_table => 1 } >>
+to have the SQL produced include a C<DROP TABLE> statement for each table
+created. For quoting purposes supply C<quote_table_names> and
+C<quote_field_names>.
+
+If no arguments are passed, then the following default values are assumed:
+
+=over 4
+
+=item databases  - ['MySQL', 'SQLite', 'PostgreSQL']
+
+=item version    - $schema->schema_version
+
+=item directory  - './'
+
+=item preversion - <none>
+
+=back
+
 By default, C<\%sqlt_args> will have
 
  { add_drop_table => 1, ignore_constraint_names => 1, ignore_index_names => 1 }
@@ -1617,13 +1518,19 @@
 
  { ignore_constraint_names => 0, # ... other options }
 
+
+Note that this feature is currently EXPERIMENTAL and may not work correctly 
+across all databases, or fully handle complex relationships.
+
+WARNING: Please check all SQL files created, before applying them.
+
 =cut
 
 sub create_ddl_dir {
   my ($self, $schema, $databases, $version, $dir, $preversion, $sqltargs) = @_;
 
   if(!$dir || !-d $dir) {
-    warn "No directory given, using ./\n";
+    carp "No directory given, using ./\n";
     $dir = "./";
   }
   $databases ||= ['MySQL', 'SQLite', 'PostgreSQL'];
@@ -1646,11 +1553,11 @@
   my $sqlt = SQL::Translator->new( $sqltargs );
 
   $sqlt->parser('SQL::Translator::Parser::DBIx::Class');
-  my $sqlt_schema = $sqlt->translate({ data => $schema }) or die $sqlt->error;
+  my $sqlt_schema = $sqlt->translate({ data => $schema })
+    or $self->throw_exception ($sqlt->error);
 
   foreach my $db (@$databases) {
     $sqlt->reset();
-    $sqlt = $self->configure_sqlt($sqlt, $db);
     $sqlt->{schema} = $sqlt_schema;
     $sqlt->producer($db);
 
@@ -1658,13 +1565,13 @@
     my $filename = $schema->ddl_filename($db, $version, $dir);
     if (-e $filename && ($version eq $schema_version )) {
       # if we are dumping the current version, overwrite the DDL
-      warn "Overwriting existing DDL file - $filename";
+      carp "Overwriting existing DDL file - $filename";
       unlink($filename);
     }
 
     my $output = $sqlt->translate;
     if(!$output) {
-      warn("Failed to translate to $db, skipping. (" . $sqlt->error . ")");
+      carp("Failed to translate to $db, skipping. (" . $sqlt->error . ")");
       next;
     }
     if(!open($file, ">$filename")) {
@@ -1680,13 +1587,13 @@
 
     my $prefilename = $schema->ddl_filename($db, $preversion, $dir);
     if(!-e $prefilename) {
-      warn("No previous schema file found ($prefilename)");
+      carp("No previous schema file found ($prefilename)");
       next;
     }
 
     my $difffile = $schema->ddl_filename($db, $version, $dir, $preversion);
     if(-e $difffile) {
-      warn("Overwriting existing diff file - $difffile");
+      carp("Overwriting existing diff file - $difffile");
       unlink($difffile);
     }
     
@@ -1695,28 +1602,37 @@
       my $t = SQL::Translator->new($sqltargs);
       $t->debug( 0 );
       $t->trace( 0 );
-      $t->parser( $db )                       or die $t->error;
-      $t = $self->configure_sqlt($t, $db);
-      my $out = $t->translate( $prefilename ) or die $t->error;
+
+      $t->parser( $db )
+        or $self->throw_exception ($t->error);
+
+      my $out = $t->translate( $prefilename )
+        or $self->throw_exception ($t->error);
+
       $source_schema = $t->schema;
-      unless ( $source_schema->name ) {
-        $source_schema->name( $prefilename );
-      }
+
+      $source_schema->name( $prefilename )
+        unless ( $source_schema->name );
     }
 
     # The "new" style of producers have sane normalization and can support 
     # diffing a SQL file against a DBIC->SQLT schema. Old style ones don't
     # And we have to diff parsed SQL against parsed SQL.
     my $dest_schema = $sqlt_schema;
-    
+
     unless ( "SQL::Translator::Producer::$db"->can('preprocess_schema') ) {
       my $t = SQL::Translator->new($sqltargs);
       $t->debug( 0 );
       $t->trace( 0 );
-      $t->parser( $db )                    or die $t->error;
-      $t = $self->configure_sqlt($t, $db);
-      my $out = $t->translate( $filename ) or die $t->error;
+
+      $t->parser( $db )
+        or $self->throw_exception ($t->error);
+
+      my $out = $t->translate( $filename )
+        or $self->throw_exception ($t->error);
+
       $dest_schema = $t->schema;
+
       $dest_schema->name( $filename )
         unless $dest_schema->name;
     }
@@ -1734,17 +1650,6 @@
   }
 }
 
-sub configure_sqlt() {
-  my $self = shift;
-  my $tr = shift;
-  my $db = shift || $self->sqlt_type;
-  if ($db eq 'PostgreSQL') {
-    $tr->quote_table_names(0);
-    $tr->quote_field_names(0);
-  }
-  return $tr;
-}
-
 =head2 deployment_statements
 
 =over 4
@@ -1754,9 +1659,10 @@
 =back
 
 Returns the statements used by L</deploy> and L<DBIx::Class::Schema/deploy>.
-The database driver name is given by C<$type>, though the value from
-L</sqlt_type> is used if it is not specified.
 
+The L<SQL::Translator> (not L<DBI>) database driver name can be explicitly
+provided in C<$type>, otherwise the result of L</sqlt_type> is used as default.
+
 C<$directory> is used to return statements from files in a previously created
 L</create_ddl_dir> directory and is optional. The filenames are constructed
 from L<DBIx::Class::Schema/ddl_filename>, the schema name and the C<$version>.
@@ -1819,11 +1725,11 @@
       $self->dbh->do($line); # shouldn't be using ->dbh ?
     };
     if ($@) {
-      warn qq{$@ (running "${line}")};
+      carp qq{$@ (running "${line}")};
     }
     $self->_query_end($line);
   };
-  my @statements = $self->deployment_statements($schema, $type, undef, $dir, { no_comments => 1, %{ $sqltargs || {} } } );
+  my @statements = $self->deployment_statements($schema, $type, undef, $dir, { %{ $sqltargs || {} }, no_comments => 1 } );
   if (@statements > 1) {
     foreach my $statement (@statements) {
       $deploy->( $statement );
@@ -1941,38 +1847,7 @@
 be with raw DBI.
 
 
-=head1 SQL METHODS
 
-The module defines a set of methods within the DBIC::SQL::Abstract
-namespace.  These build on L<SQL::Abstract::Limit> to provide the
-SQL query functions.
-
-The following methods are extended:-
-
-=over 4
-
-=item delete
-
-=item insert
-
-=item select
-
-=item update
-
-=item limit_dialect
-
-See L</connect_info> for details.
-
-=item quote_char
-
-See L</connect_info> for details.
-
-=item name_sep
-
-See L</connect_info> for details.
-
-=back
-
 =head1 AUTHORS
 
 Matt S. Trout <mst at shadowcatsystems.co.uk>


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/DBI.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/Statistics.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/Statistics.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/Statistics.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -5,7 +5,7 @@
 use base qw/Class::Accessor::Grouped/;
 use IO::File;
 
-__PACKAGE__->mk_group_accessors(simple => qw/callback debugfh/);
+__PACKAGE__->mk_group_accessors(simple => qw/callback debugfh silence/);
 
 =head1 NAME
 
@@ -56,6 +56,8 @@
 sub print {
   my ($self, $msg) = @_;
 
+  return if $self->silence;
+
   if(!defined($self->debugfh())) {
     my $fh;
     my $debug_env = $ENV{DBIX_CLASS_STORAGE_DBI_DEBUG}
@@ -75,6 +77,10 @@
   $self->debugfh->print($msg);
 }
 
+=head2 silence
+
+Turn off all output if set to true.
+
 =head2 txn_begin
 
 Called when a transaction begins.


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/Statistics.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/TxnScopeGuard.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/TxnScopeGuard.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/TxnScopeGuard.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,8 +1,8 @@
-package # Hide from pause for now - till we get it working
-  DBIx::Class::Storage::TxnScopeGuard;
+package DBIx::Class::Storage::TxnScopeGuard;
 
 use strict;
 use warnings;
+use Carp ();
 
 sub new {
   my ($class, $storage) = @_;
@@ -47,7 +47,7 @@
 
 =head1 NAME
 
-DBIx::Class::Storage::TxnScopeGuard - Experimental
+DBIx::Class::Storage::TxnScopeGuard - Scope-based transaction handling
 
 =head1 SYNOPSIS
 
@@ -70,14 +70,15 @@
 
 =head2 new
 
-Creating an instance of this class will start a new transaction. Expects a
+Creating an instance of this class will start a new transaction (by
+implicitly calling L<DBIx::Class::Storage/txn_begin>. Expects a
 L<DBIx::Class::Storage> object as its only argument.
 
 =head2 commit
 
 Commit the transaction, and stop guarding the scope. If this method is not
-called (i.e. an exception is thrown) and this object goes out of scope then
-the transaction is rolled back.
+called and this object goes out of scope (i.e. an exception is thrown) then
+the transaction is rolled back, via L<DBIx::Class::Storage/txn_rollback>
 
 =cut
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage/TxnScopeGuard.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -299,21 +299,25 @@
 
 =for comment
 
-=head2 txn_scope_guard (EXPERIMENTAL)
+=head2 txn_scope_guard
 
-An alternative way of using transactions to C<txn_do>:
+An alternative way of transaction handling based on
+L<DBIx::Class::Storage::TxnScopeGuard>:
 
- my $txn = $storage->txn_scope_guard;
+ my $txn_guard = $storage->txn_scope_guard;
 
  $row->col1("val1");
  $row->update;
 
- $txn->commit;
+ $txn_guard->commit;
 
-If a exception occurs, the transaction will be rolled back. This is still very
-experiemental, and we are not 100% sure it is working right when nested. The
-onus is on you as the user to make sure you dont forget to call
-$C<$txn->commit>.
+If an exception occurs, or the guard object otherwise leaves the scope
+before C<< $txn_guard->commit >> is called, the transaction will be rolled
+back by an explicit L</txn_rollback> call. In essence this is akin to
+using a L</txn_begin>/L</txn_commit> pair, without having to worry
+about calling L</txn_rollback> at the right places. Note that since there
+is no defined code closure, there will be no retries and other magic upon
+database disconnection. If you need such functionality see L</txn_do>.
 
 =cut
 
@@ -324,7 +328,7 @@
 =head2 sql_maker
 
 Returns a C<sql_maker> object - normally an object of class
-C<DBIC::SQL::Abstract>.
+C<DBIx::Class::SQLAHacks>.
 
 =cut
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Storage.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/UTF8Columns.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -8,13 +8,13 @@
 use DBIx::Class::StartupCheck;
 
 
-sub mk_classdata { 
+sub mk_classdata {
   shift->mk_classaccessor(@_);
 }
 
 sub mk_classaccessor {
   my $self = shift;
-  $self->mk_group_accessors('inherited', $_[0]); 
+  $self->mk_group_accessors('inherited', $_[0]);
   $self->set_inherited(@_) if @_ > 1;
 }
 
@@ -24,7 +24,7 @@
 # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
 # brain damage and presumably various other packaging systems too
 
-$VERSION = '0.08099_07';
+$VERSION = '0.08103';
 
 $VERSION = eval $VERSION; # numify for warning-free dev releases
 
@@ -207,6 +207,8 @@
 
 ank: Andres Kievsky
 
+arcanez: Justin Hunter <justin.d.hunter at gmail.com>
+
 ash: Ash Berlin <ash at cpan.org>
 
 bert: Norbert Csongradi <bert at cpan.org>
@@ -219,8 +221,6 @@
 
 caelum: Rafael Kitover <rkitover at cpan.org>
 
-captainL: Luke Saunders <luke.saunders at gmail.com>
-
 castaway: Jess Robinson
 
 claco: Christopher H. Laco
@@ -239,10 +239,16 @@
 
 dyfrgi: Michael Leuchtenburg <michael at slashhome.org>
 
+frew: Arthur Axel "fREW" Schmidt <frioux at gmail.com>
+
 gphat: Cory G Watson <gphat at cpan.org>
 
 groditi: Guillermo Roditi <groditi at cpan.org>
 
+ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari at ilmari.org>
+
+jasonmay: Jason May <jason.a.may at gmail.com>
+
 jesper: Jesper Krogh
 
 jgoulah: John Goulah <jgoulah at cpan.org>
@@ -257,6 +263,8 @@
 
 konobi: Scott McWhirter
 
+lukes: Luke Saunders <luke.saunders at gmail.com>
+
 marcus: Marcus Ramberg <mramberg at cpan.org>
 
 mattlaw: Matt Lawrence
@@ -269,6 +277,10 @@
 
 ningu: David Kamholz <dkamholz at cpan.org>
 
+Nniuq: Ron "Quinn" Straight" <quinnfazigu at gmail.org>
+
+norbi: Norbert Buchmuller <norbi at nix.hu>
+
 Numa: Dan Sully <daniel at cpan.org>
 
 oyse: Øystein Torget <oystein.torget at dnv.com>
@@ -279,6 +291,8 @@
 
 perigrin: Chris Prather <chris at prather.org>
 
+peter: Peter Collingbourne <peter at pcc.me.uk>
+
 phaylon: Robert Sedlacek <phaylon at dunkelheit.at>
 
 plu: Johannes Plunien <plu at cpan.org>
@@ -301,6 +315,8 @@
 
 semifor: Marc Mims <marc at questright.com>
 
+solomon: Jared Johnson <jaredj at nmgi.com>
+
 sszabo: Stephan Szabo <sszabo at bigpanda.com>
 
 teejay : Aaron Trevena <teejay at cpan.org>
@@ -317,10 +333,10 @@
 
 willert: Sebastian Willert <willert at cpan.org>
 
+wreis: Wallace Reis <wreis at cpan.org>
+
 zamolxes: Bogdan Lucaciu <bogdan at wiz.ro>
 
-norbi: Norbert Buchmuller <norbi at nix.hu>
-
 =head1 LICENSE
 
 You may distribute this code under the same terms as Perl itself.


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/SQL/Translator/Parser/DBIx/Class.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/SQL/Translator/Parser/DBIx/Class.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/SQL/Translator/Parser/DBIx/Class.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -13,7 +13,6 @@
 $DEBUG = 0 unless defined $DEBUG;
 
 use Exporter;
-use Data::Dumper;
 use SQL::Translator::Utils qw(debug normalize_name);
 
 use base qw(Exporter);
@@ -114,7 +113,7 @@
         my @primary = $source->primary_columns;
         my %unique_constraints = $source->unique_constraints;
         foreach my $uniq (sort keys %unique_constraints) {
-            if (!$source->compare_relationship_keys($unique_constraints{$uniq}, \@primary)) {
+            if (!$source->_compare_relationship_keys($unique_constraints{$uniq}, \@primary)) {
                 $table->add_constraint(
                             type             => 'unique',
                             name             => $uniq,
@@ -168,7 +167,7 @@
             # this is supposed to indicate a has_one/might_have...
             # where's the introspection!!?? :)
             else {
-                $fk_constraint = not $source->compare_relationship_keys(\@keys, \@primary);
+                $fk_constraint = not $source->_compare_relationship_keys(\@keys, \@primary);
             }
 
             my $cascade;
@@ -293,14 +292,14 @@
 interrogates the columns, and stuffs it all in an $sqlt_schema object.
 
 It's primary use is in deploying database layouts described as a set
-of L<DBIx::Class> classes, to a database. To do this, see the
-L<DBIx::Class::Schema/deploy> method.
+of L<DBIx::Class> classes, to a database. To do this, see
+L<DBIx::Class::Schema/deploy>.
 
 This can also be achieved by having DBIx::Class export the schema as a
 set of SQL files ready for import into your database, or passed to
 other machines that need to have your application installed but don't
-have SQL::Translator installed. To do this see the
-L<DBIx::Class::Schema/create_ddl_dir> method.
+have SQL::Translator installed. To do this see
+L<DBIx::Class::Schema/create_ddl_dir>.
 
 =head1 SEE ALSO
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/SQL/Translator/Parser/DBIx/Class.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/lib/SQL/Translator/Producer/DBIx/Class/File.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/SQL/Translator/Producer/DBIx/Class/File.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/lib/SQL/Translator/Producer/DBIx/Class/File.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -25,6 +25,7 @@
 
 use SQL::Translator::Schema::Constants;
 use SQL::Translator::Utils qw(header_comment);
+use Data::Dumper ();
 
 ## Skip all column type translation, as we want to use whatever the parser got.
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/lib/SQL/Translator/Producer/DBIx/Class/File.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/maint/benchmark_hashrefinflator.pl
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/maint/gen-pod-index.pl
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/maint/gen-schema.pl
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/maint/gen-tests.pl
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/maint/inheritance_pod.pl
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/maint/steal-svn-log.sh
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/maint/svn-log.perl
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/script/dbicadmin
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/02pod.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/03podcoverage.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/03podcoverage.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/03podcoverage.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -34,6 +34,15 @@
            qw( MULTICREATE_DEBUG )
         ],
     },
+    'DBIx::Class::ResultSource' => {
+        ignore => [qw/
+          compare_relationship_keys
+          pk_depends_on
+          resolve_condition
+          resolve_join
+          resolve_prefetch
+        /],
+    },
     'DBIx::Class::Storage' => {
         ignore => [
             qw(cursor)
@@ -99,9 +108,10 @@
     'DBIx::Class::Storage::DBI'                         => { skip => 1 },
     'DBIx::Class::Storage::DBI::DB2'                    => { skip => 1 },
     'DBIx::Class::Storage::DBI::MSSQL'                  => { skip => 1 },
-    'DBIx::Class::Storage::DBI::MultiDistinctEmulation' => { skip => 1 },
+    'DBIx::Class::Storage::DBI::Sybase::MSSQL'          => { skip => 1 },
     'DBIx::Class::Storage::DBI::ODBC400'                => { skip => 1 },
     'DBIx::Class::Storage::DBI::ODBC::DB2_400_SQL'      => { skip => 1 },
+    'DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server' => { skip => 1 },
     'DBIx::Class::Storage::DBI::Oracle'                 => { skip => 1 },
     'DBIx::Class::Storage::DBI::Pg'                     => { skip => 1 },
     'DBIx::Class::Storage::DBI::SQLite'                 => { skip => 1 },


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/03podcoverage.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/04dont_break_c3.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/04dont_break_c3.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/04dont_break_c3.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,10 +1,11 @@
-#!/usr/bin/perl -w
-#Simon Ilyushchenko, 12/05/05
-#Testing the case when we try to inject into @ISA a class that's already a parent of the target class.
 
 use strict;
 use Test::More tests => 2;
+use MRO::Compat;
 
+use lib qw(t/lib);
+use DBICTest; # do not remove even though it is not used
+
 {
 package AAA;
 
@@ -26,8 +27,8 @@
 __PACKAGE__->inject_base( __PACKAGE__, 'DBIx::Class::Core' );
 }
 
-eval { Class::C3::calculateMRO('BBB'); };
+eval { mro::get_linear_isa('BBB'); };
 ok (! $@, "Correctly skipped injecting a direct parent of class BBB");
 
-eval { Class::C3::calculateMRO('CCC'); };
+eval { mro::get_linear_isa('CCC'); };
 ok (! $@, "Correctly skipped injecting an indirect parent of class BBB");


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/04dont_break_c3.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/05components.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/100extra_source.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/100extra_source.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/100extra_source.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -12,7 +12,7 @@
     use base qw/DBIx::Class::ResultSource::Table/;
 }
 
-plan tests => 3;
+plan tests => 4;
 
 my $schema = DBICTest->init_schema();
 my $artist_source = $schema->source('Artist');
@@ -36,6 +36,12 @@
 }
 
 {
+  my $source = $schema->source('DBICTest::Artist');
+  $schema->register_source($source->source_name, $source);
+  is($warn, '', "re-registering an existing source under the same name causes no errors");
+}
+
+{
   my $new_source_name = 'Artist->preview(artist_preview)';
   $schema->register_source( $new_source_name => $new_source );
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/100extra_source.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/100populate.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/100populate.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/100populate.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,10017 +1,52 @@
 use strict;
-use warnings;  
+use warnings;
 
 use Test::More;
+use Test::Exception;
 use lib qw(t/lib);
 use DBICTest;
 
-plan tests => 21;
+plan tests => 23;
 
-# perl -le'my $letter = 'a'; for my $i (4..10000) { $letter++; print "[ $i, \"$letter\" ]," }' > tests.txt
-
 my $schema = DBICTest->init_schema();
-$schema->populate('Artist', [
-[ qw/artistid name/ ],
-[ 4, "b" ],
-[ 5, "c" ],
-[ 6, "d" ],
-[ 7, "e" ],
-[ 8, "f" ],
-[ 9, "g" ],
-[ 10, "h" ],
-[ 11, "i" ],
-[ 12, "j" ],
-[ 13, "k" ],
-[ 14, "l" ],
-[ 15, "m" ],
-[ 16, "n" ],
-[ 17, "o" ],
-[ 18, "p" ],
-[ 19, "q" ],
-[ 20, "r" ],
-[ 21, "s" ],
-[ 22, "t" ],
-[ 23, "u" ],
-[ 24, "v" ],
-[ 25, "w" ],
-[ 26, "x" ],
-[ 27, "y" ],
-[ 28, "z" ],
-[ 29, "aa" ],
-[ 30, "ab" ],
-[ 31, "ac" ],
-[ 32, "ad" ],
-[ 33, "ae" ],
-[ 34, "af" ],
-[ 35, "ag" ],
-[ 36, "ah" ],
-[ 37, "ai" ],
-[ 38, "aj" ],
-[ 39, "ak" ],
-[ 40, "al" ],
-[ 41, "am" ],
-[ 42, "an" ],
-[ 43, "ao" ],
-[ 44, "ap" ],
-[ 45, "aq" ],
-[ 46, "ar" ],
-[ 47, "as" ],
-[ 48, "at" ],
-[ 49, "au" ],
-[ 50, "av" ],
-[ 51, "aw" ],
-[ 52, "ax" ],
-[ 53, "ay" ],
-[ 54, "az" ],
-[ 55, "ba" ],
-[ 56, "bb" ],
-[ 57, "bc" ],
-[ 58, "bd" ],
-[ 59, "be" ],
-[ 60, "bf" ],
-[ 61, "bg" ],
-[ 62, "bh" ],
-[ 63, "bi" ],
-[ 64, "bj" ],
-[ 65, "bk" ],
-[ 66, "bl" ],
-[ 67, "bm" ],
-[ 68, "bn" ],
-[ 69, "bo" ],
-[ 70, "bp" ],
-[ 71, "bq" ],
-[ 72, "br" ],
-[ 73, "bs" ],
-[ 74, "bt" ],
-[ 75, "bu" ],
-[ 76, "bv" ],
-[ 77, "bw" ],
-[ 78, "bx" ],
-[ 79, "by" ],
-[ 80, "bz" ],
-[ 81, "ca" ],
-[ 82, "cb" ],
-[ 83, "cc" ],
-[ 84, "cd" ],
-[ 85, "ce" ],
-[ 86, "cf" ],
-[ 87, "cg" ],
-[ 88, "ch" ],
-[ 89, "ci" ],
-[ 90, "cj" ],
-[ 91, "ck" ],
-[ 92, "cl" ],
-[ 93, "cm" ],
-[ 94, "cn" ],
-[ 95, "co" ],
-[ 96, "cp" ],
-[ 97, "cq" ],
-[ 98, "cr" ],
-[ 99, "cs" ],
-[ 100, "ct" ],
-[ 101, "cu" ],
-[ 102, "cv" ],
-[ 103, "cw" ],
-[ 104, "cx" ],
-[ 105, "cy" ],
-[ 106, "cz" ],
-[ 107, "da" ],
-[ 108, "db" ],
-[ 109, "dc" ],
-[ 110, "dd" ],
-[ 111, "de" ],
-[ 112, "df" ],
-[ 113, "dg" ],
-[ 114, "dh" ],
-[ 115, "di" ],
-[ 116, "dj" ],
-[ 117, "dk" ],
-[ 118, "dl" ],
-[ 119, "dm" ],
-[ 120, "dn" ],
-[ 121, "do" ],
-[ 122, "dp" ],
-[ 123, "dq" ],
-[ 124, "dr" ],
-[ 125, "ds" ],
-[ 126, "dt" ],
-[ 127, "du" ],
-[ 128, "dv" ],
-[ 129, "dw" ],
-[ 130, "dx" ],
-[ 131, "dy" ],
-[ 132, "dz" ],
-[ 133, "ea" ],
-[ 134, "eb" ],
-[ 135, "ec" ],
-[ 136, "ed" ],
-[ 137, "ee" ],
-[ 138, "ef" ],
-[ 139, "eg" ],
-[ 140, "eh" ],
-[ 141, "ei" ],
-[ 142, "ej" ],
-[ 143, "ek" ],
-[ 144, "el" ],
-[ 145, "em" ],
-[ 146, "en" ],
-[ 147, "eo" ],
-[ 148, "ep" ],
-[ 149, "eq" ],
-[ 150, "er" ],
-[ 151, "es" ],
-[ 152, "et" ],
-[ 153, "eu" ],
-[ 154, "ev" ],
-[ 155, "ew" ],
-[ 156, "ex" ],
-[ 157, "ey" ],
-[ 158, "ez" ],
-[ 159, "fa" ],
-[ 160, "fb" ],
-[ 161, "fc" ],
-[ 162, "fd" ],
-[ 163, "fe" ],
-[ 164, "ff" ],
-[ 165, "fg" ],
-[ 166, "fh" ],
-[ 167, "fi" ],
-[ 168, "fj" ],
-[ 169, "fk" ],
-[ 170, "fl" ],
-[ 171, "fm" ],
-[ 172, "fn" ],
-[ 173, "fo" ],
-[ 174, "fp" ],
-[ 175, "fq" ],
-[ 176, "fr" ],
-[ 177, "fs" ],
-[ 178, "ft" ],
-[ 179, "fu" ],
-[ 180, "fv" ],
-[ 181, "fw" ],
-[ 182, "fx" ],
-[ 183, "fy" ],
-[ 184, "fz" ],
-[ 185, "ga" ],
-[ 186, "gb" ],
-[ 187, "gc" ],
-[ 188, "gd" ],
-[ 189, "ge" ],
-[ 190, "gf" ],
-[ 191, "gg" ],
-[ 192, "gh" ],
-[ 193, "gi" ],
-[ 194, "gj" ],
-[ 195, "gk" ],
-[ 196, "gl" ],
-[ 197, "gm" ],
-[ 198, "gn" ],
-[ 199, "go" ],
-[ 200, "gp" ],
-[ 201, "gq" ],
-[ 202, "gr" ],
-[ 203, "gs" ],
-[ 204, "gt" ],
-[ 205, "gu" ],
-[ 206, "gv" ],
-[ 207, "gw" ],
-[ 208, "gx" ],
-[ 209, "gy" ],
-[ 210, "gz" ],
-[ 211, "ha" ],
-[ 212, "hb" ],
-[ 213, "hc" ],
-[ 214, "hd" ],
-[ 215, "he" ],
-[ 216, "hf" ],
-[ 217, "hg" ],
-[ 218, "hh" ],
-[ 219, "hi" ],
-[ 220, "hj" ],
-[ 221, "hk" ],
-[ 222, "hl" ],
-[ 223, "hm" ],
-[ 224, "hn" ],
-[ 225, "ho" ],
-[ 226, "hp" ],
-[ 227, "hq" ],
-[ 228, "hr" ],
-[ 229, "hs" ],
-[ 230, "ht" ],
-[ 231, "hu" ],
-[ 232, "hv" ],
-[ 233, "hw" ],
-[ 234, "hx" ],
-[ 235, "hy" ],
-[ 236, "hz" ],
-[ 237, "ia" ],
-[ 238, "ib" ],
-[ 239, "ic" ],
-[ 240, "id" ],
-[ 241, "ie" ],
-[ 242, "if" ],
-[ 243, "ig" ],
-[ 244, "ih" ],
-[ 245, "ii" ],
-[ 246, "ij" ],
-[ 247, "ik" ],
-[ 248, "il" ],
-[ 249, "im" ],
-[ 250, "in" ],
-[ 251, "io" ],
-[ 252, "ip" ],
-[ 253, "iq" ],
-[ 254, "ir" ],
-[ 255, "is" ],
-[ 256, "it" ],
-[ 257, "iu" ],
-[ 258, "iv" ],
-[ 259, "iw" ],
-[ 260, "ix" ],
-[ 261, "iy" ],
-[ 262, "iz" ],
-[ 263, "ja" ],
-[ 264, "jb" ],
-[ 265, "jc" ],
-[ 266, "jd" ],
-[ 267, "je" ],
-[ 268, "jf" ],
-[ 269, "jg" ],
-[ 270, "jh" ],
-[ 271, "ji" ],
-[ 272, "jj" ],
-[ 273, "jk" ],
-[ 274, "jl" ],
-[ 275, "jm" ],
-[ 276, "jn" ],
-[ 277, "jo" ],
-[ 278, "jp" ],
-[ 279, "jq" ],
-[ 280, "jr" ],
-[ 281, "js" ],
-[ 282, "jt" ],
-[ 283, "ju" ],
-[ 284, "jv" ],
-[ 285, "jw" ],
-[ 286, "jx" ],
-[ 287, "jy" ],
-[ 288, "jz" ],
-[ 289, "ka" ],
-[ 290, "kb" ],
-[ 291, "kc" ],
-[ 292, "kd" ],
-[ 293, "ke" ],
-[ 294, "kf" ],
-[ 295, "kg" ],
-[ 296, "kh" ],
-[ 297, "ki" ],
-[ 298, "kj" ],
-[ 299, "kk" ],
-[ 300, "kl" ],
-[ 301, "km" ],
-[ 302, "kn" ],
-[ 303, "ko" ],
-[ 304, "kp" ],
-[ 305, "kq" ],
-[ 306, "kr" ],
-[ 307, "ks" ],
-[ 308, "kt" ],
-[ 309, "ku" ],
-[ 310, "kv" ],
-[ 311, "kw" ],
-[ 312, "kx" ],
-[ 313, "ky" ],
-[ 314, "kz" ],
-[ 315, "la" ],
-[ 316, "lb" ],
-[ 317, "lc" ],
-[ 318, "ld" ],
-[ 319, "le" ],
-[ 320, "lf" ],
-[ 321, "lg" ],
-[ 322, "lh" ],
-[ 323, "li" ],
-[ 324, "lj" ],
-[ 325, "lk" ],
-[ 326, "ll" ],
-[ 327, "lm" ],
-[ 328, "ln" ],
-[ 329, "lo" ],
-[ 330, "lp" ],
-[ 331, "lq" ],
-[ 332, "lr" ],
-[ 333, "ls" ],
-[ 334, "lt" ],
-[ 335, "lu" ],
-[ 336, "lv" ],
-[ 337, "lw" ],
-[ 338, "lx" ],
-[ 339, "ly" ],
-[ 340, "lz" ],
-[ 341, "ma" ],
-[ 342, "mb" ],
-[ 343, "mc" ],
-[ 344, "md" ],
-[ 345, "me" ],
-[ 346, "mf" ],
-[ 347, "mg" ],
-[ 348, "mh" ],
-[ 349, "mi" ],
-[ 350, "mj" ],
-[ 351, "mk" ],
-[ 352, "ml" ],
-[ 353, "mm" ],
-[ 354, "mn" ],
-[ 355, "mo" ],
-[ 356, "mp" ],
-[ 357, "mq" ],
-[ 358, "mr" ],
-[ 359, "ms" ],
-[ 360, "mt" ],
-[ 361, "mu" ],
-[ 362, "mv" ],
-[ 363, "mw" ],
-[ 364, "mx" ],
-[ 365, "my" ],
-[ 366, "mz" ],
-[ 367, "na" ],
-[ 368, "nb" ],
-[ 369, "nc" ],
-[ 370, "nd" ],
-[ 371, "ne" ],
-[ 372, "nf" ],
-[ 373, "ng" ],
-[ 374, "nh" ],
-[ 375, "ni" ],
-[ 376, "nj" ],
-[ 377, "nk" ],
-[ 378, "nl" ],
-[ 379, "nm" ],
-[ 380, "nn" ],
-[ 381, "no" ],
-[ 382, "np" ],
-[ 383, "nq" ],
-[ 384, "nr" ],
-[ 385, "ns" ],
-[ 386, "nt" ],
-[ 387, "nu" ],
-[ 388, "nv" ],
-[ 389, "nw" ],
-[ 390, "nx" ],
-[ 391, "ny" ],
-[ 392, "nz" ],
-[ 393, "oa" ],
-[ 394, "ob" ],
-[ 395, "oc" ],
-[ 396, "od" ],
-[ 397, "oe" ],
-[ 398, "of" ],
-[ 399, "og" ],
-[ 400, "oh" ],
-[ 401, "oi" ],
-[ 402, "oj" ],
-[ 403, "ok" ],
-[ 404, "ol" ],
-[ 405, "om" ],
-[ 406, "on" ],
-[ 407, "oo" ],
-[ 408, "op" ],
-[ 409, "oq" ],
-[ 410, "or" ],
-[ 411, "os" ],
-[ 412, "ot" ],
-[ 413, "ou" ],
-[ 414, "ov" ],
-[ 415, "ow" ],
-[ 416, "ox" ],
-[ 417, "oy" ],
-[ 418, "oz" ],
-[ 419, "pa" ],
-[ 420, "pb" ],
-[ 421, "pc" ],
-[ 422, "pd" ],
-[ 423, "pe" ],
-[ 424, "pf" ],
-[ 425, "pg" ],
-[ 426, "ph" ],
-[ 427, "pi" ],
-[ 428, "pj" ],
-[ 429, "pk" ],
-[ 430, "pl" ],
-[ 431, "pm" ],
-[ 432, "pn" ],
-[ 433, "po" ],
-[ 434, "pp" ],
-[ 435, "pq" ],
-[ 436, "pr" ],
-[ 437, "ps" ],
-[ 438, "pt" ],
-[ 439, "pu" ],
-[ 440, "pv" ],
-[ 441, "pw" ],
-[ 442, "px" ],
-[ 443, "py" ],
-[ 444, "pz" ],
-[ 445, "qa" ],
-[ 446, "qb" ],
-[ 447, "qc" ],
-[ 448, "qd" ],
-[ 449, "qe" ],
-[ 450, "qf" ],
-[ 451, "qg" ],
-[ 452, "qh" ],
-[ 453, "qi" ],
-[ 454, "qj" ],
-[ 455, "qk" ],
-[ 456, "ql" ],
-[ 457, "qm" ],
-[ 458, "qn" ],
-[ 459, "qo" ],
-[ 460, "qp" ],
-[ 461, "qq" ],
-[ 462, "qr" ],
-[ 463, "qs" ],
-[ 464, "qt" ],
-[ 465, "qu" ],
-[ 466, "qv" ],
-[ 467, "qw" ],
-[ 468, "qx" ],
-[ 469, "qy" ],
-[ 470, "qz" ],
-[ 471, "ra" ],
-[ 472, "rb" ],
-[ 473, "rc" ],
-[ 474, "rd" ],
-[ 475, "re" ],
-[ 476, "rf" ],
-[ 477, "rg" ],
-[ 478, "rh" ],
-[ 479, "ri" ],
-[ 480, "rj" ],
-[ 481, "rk" ],
-[ 482, "rl" ],
-[ 483, "rm" ],
-[ 484, "rn" ],
-[ 485, "ro" ],
-[ 486, "rp" ],
-[ 487, "rq" ],
-[ 488, "rr" ],
-[ 489, "rs" ],
-[ 490, "rt" ],
-[ 491, "ru" ],
-[ 492, "rv" ],
-[ 493, "rw" ],
-[ 494, "rx" ],
-[ 495, "ry" ],
-[ 496, "rz" ],
-[ 497, "sa" ],
-[ 498, "sb" ],
-[ 499, "sc" ],
-[ 500, "sd" ],
-[ 501, "se" ],
-[ 502, "sf" ],
-[ 503, "sg" ],
-[ 504, "sh" ],
-[ 505, "si" ],
-[ 506, "sj" ],
-[ 507, "sk" ],
-[ 508, "sl" ],
-[ 509, "sm" ],
-[ 510, "sn" ],
-[ 511, "so" ],
-[ 512, "sp" ],
-[ 513, "sq" ],
-[ 514, "sr" ],
-[ 515, "ss" ],
-[ 516, "st" ],
-[ 517, "su" ],
-[ 518, "sv" ],
-[ 519, "sw" ],
-[ 520, "sx" ],
-[ 521, "sy" ],
-[ 522, "sz" ],
-[ 523, "ta" ],
-[ 524, "tb" ],
-[ 525, "tc" ],
-[ 526, "td" ],
-[ 527, "te" ],
-[ 528, "tf" ],
-[ 529, "tg" ],
-[ 530, "th" ],
-[ 531, "ti" ],
-[ 532, "tj" ],
-[ 533, "tk" ],
-[ 534, "tl" ],
-[ 535, "tm" ],
-[ 536, "tn" ],
-[ 537, "to" ],
-[ 538, "tp" ],
-[ 539, "tq" ],
-[ 540, "tr" ],
-[ 541, "ts" ],
-[ 542, "tt" ],
-[ 543, "tu" ],
-[ 544, "tv" ],
-[ 545, "tw" ],
-[ 546, "tx" ],
-[ 547, "ty" ],
-[ 548, "tz" ],
-[ 549, "ua" ],
-[ 550, "ub" ],
-[ 551, "uc" ],
-[ 552, "ud" ],
-[ 553, "ue" ],
-[ 554, "uf" ],
-[ 555, "ug" ],
-[ 556, "uh" ],
-[ 557, "ui" ],
-[ 558, "uj" ],
-[ 559, "uk" ],
-[ 560, "ul" ],
-[ 561, "um" ],
-[ 562, "un" ],
-[ 563, "uo" ],
-[ 564, "up" ],
-[ 565, "uq" ],
-[ 566, "ur" ],
-[ 567, "us" ],
-[ 568, "ut" ],
-[ 569, "uu" ],
-[ 570, "uv" ],
-[ 571, "uw" ],
-[ 572, "ux" ],
-[ 573, "uy" ],
-[ 574, "uz" ],
-[ 575, "va" ],
-[ 576, "vb" ],
-[ 577, "vc" ],
-[ 578, "vd" ],
-[ 579, "ve" ],
-[ 580, "vf" ],
-[ 581, "vg" ],
-[ 582, "vh" ],
-[ 583, "vi" ],
-[ 584, "vj" ],
-[ 585, "vk" ],
-[ 586, "vl" ],
-[ 587, "vm" ],
-[ 588, "vn" ],
-[ 589, "vo" ],
-[ 590, "vp" ],
-[ 591, "vq" ],
-[ 592, "vr" ],
-[ 593, "vs" ],
-[ 594, "vt" ],
-[ 595, "vu" ],
-[ 596, "vv" ],
-[ 597, "vw" ],
-[ 598, "vx" ],
-[ 599, "vy" ],
-[ 600, "vz" ],
-[ 601, "wa" ],
-[ 602, "wb" ],
-[ 603, "wc" ],
-[ 604, "wd" ],
-[ 605, "we" ],
-[ 606, "wf" ],
-[ 607, "wg" ],
-[ 608, "wh" ],
-[ 609, "wi" ],
-[ 610, "wj" ],
-[ 611, "wk" ],
-[ 612, "wl" ],
-[ 613, "wm" ],
-[ 614, "wn" ],
-[ 615, "wo" ],
-[ 616, "wp" ],
-[ 617, "wq" ],
-[ 618, "wr" ],
-[ 619, "ws" ],
-[ 620, "wt" ],
-[ 621, "wu" ],
-[ 622, "wv" ],
-[ 623, "ww" ],
-[ 624, "wx" ],
-[ 625, "wy" ],
-[ 626, "wz" ],
-[ 627, "xa" ],
-[ 628, "xb" ],
-[ 629, "xc" ],
-[ 630, "xd" ],
-[ 631, "xe" ],
-[ 632, "xf" ],
-[ 633, "xg" ],
-[ 634, "xh" ],
-[ 635, "xi" ],
-[ 636, "xj" ],
-[ 637, "xk" ],
-[ 638, "xl" ],
-[ 639, "xm" ],
-[ 640, "xn" ],
-[ 641, "xo" ],
-[ 642, "xp" ],
-[ 643, "xq" ],
-[ 644, "xr" ],
-[ 645, "xs" ],
-[ 646, "xt" ],
-[ 647, "xu" ],
-[ 648, "xv" ],
-[ 649, "xw" ],
-[ 650, "xx" ],
-[ 651, "xy" ],
-[ 652, "xz" ],
-[ 653, "ya" ],
-[ 654, "yb" ],
-[ 655, "yc" ],
-[ 656, "yd" ],
-[ 657, "ye" ],
-[ 658, "yf" ],
-[ 659, "yg" ],
-[ 660, "yh" ],
-[ 661, "yi" ],
-[ 662, "yj" ],
-[ 663, "yk" ],
-[ 664, "yl" ],
-[ 665, "ym" ],
-[ 666, "yn" ],
-[ 667, "yo" ],
-[ 668, "yp" ],
-[ 669, "yq" ],
-[ 670, "yr" ],
-[ 671, "ys" ],
-[ 672, "yt" ],
-[ 673, "yu" ],
-[ 674, "yv" ],
-[ 675, "yw" ],
-[ 676, "yx" ],
-[ 677, "yy" ],
-[ 678, "yz" ],
-[ 679, "za" ],
-[ 680, "zb" ],
-[ 681, "zc" ],
-[ 682, "zd" ],
-[ 683, "ze" ],
-[ 684, "zf" ],
-[ 685, "zg" ],
-[ 686, "zh" ],
-[ 687, "zi" ],
-[ 688, "zj" ],
-[ 689, "zk" ],
-[ 690, "zl" ],
-[ 691, "zm" ],
-[ 692, "zn" ],
-[ 693, "zo" ],
-[ 694, "zp" ],
-[ 695, "zq" ],
-[ 696, "zr" ],
-[ 697, "zs" ],
-[ 698, "zt" ],
-[ 699, "zu" ],
-[ 700, "zv" ],
-[ 701, "zw" ],
-[ 702, "zx" ],
-[ 703, "zy" ],
-[ 704, "zz" ],
-[ 705, "aaa" ],
-[ 706, "aab" ],
-[ 707, "aac" ],
-[ 708, "aad" ],
-[ 709, "aae" ],
-[ 710, "aaf" ],
-[ 711, "aag" ],
-[ 712, "aah" ],
-[ 713, "aai" ],
-[ 714, "aaj" ],
-[ 715, "aak" ],
-[ 716, "aal" ],
-[ 717, "aam" ],
-[ 718, "aan" ],
-[ 719, "aao" ],
-[ 720, "aap" ],
-[ 721, "aaq" ],
-[ 722, "aar" ],
-[ 723, "aas" ],
-[ 724, "aat" ],
-[ 725, "aau" ],
-[ 726, "aav" ],
-[ 727, "aaw" ],
-[ 728, "aax" ],
-[ 729, "aay" ],
-[ 730, "aaz" ],
-[ 731, "aba" ],
-[ 732, "abb" ],
-[ 733, "abc" ],
-[ 734, "abd" ],
-[ 735, "abe" ],
-[ 736, "abf" ],
-[ 737, "abg" ],
-[ 738, "abh" ],
-[ 739, "abi" ],
-[ 740, "abj" ],
-[ 741, "abk" ],
-[ 742, "abl" ],
-[ 743, "abm" ],
-[ 744, "abn" ],
-[ 745, "abo" ],
-[ 746, "abp" ],
-[ 747, "abq" ],
-[ 748, "abr" ],
-[ 749, "abs" ],
-[ 750, "abt" ],
-[ 751, "abu" ],
-[ 752, "abv" ],
-[ 753, "abw" ],
-[ 754, "abx" ],
-[ 755, "aby" ],
-[ 756, "abz" ],
-[ 757, "aca" ],
-[ 758, "acb" ],
-[ 759, "acc" ],
-[ 760, "acd" ],
-[ 761, "ace" ],
-[ 762, "acf" ],
-[ 763, "acg" ],
-[ 764, "ach" ],
-[ 765, "aci" ],
-[ 766, "acj" ],
-[ 767, "ack" ],
-[ 768, "acl" ],
-[ 769, "acm" ],
-[ 770, "acn" ],
-[ 771, "aco" ],
-[ 772, "acp" ],
-[ 773, "acq" ],
-[ 774, "acr" ],
-[ 775, "acs" ],
-[ 776, "act" ],
-[ 777, "acu" ],
-[ 778, "acv" ],
-[ 779, "acw" ],
-[ 780, "acx" ],
-[ 781, "acy" ],
-[ 782, "acz" ],
-[ 783, "ada" ],
-[ 784, "adb" ],
-[ 785, "adc" ],
-[ 786, "add" ],
-[ 787, "ade" ],
-[ 788, "adf" ],
-[ 789, "adg" ],
-[ 790, "adh" ],
-[ 791, "adi" ],
-[ 792, "adj" ],
-[ 793, "adk" ],
-[ 794, "adl" ],
-[ 795, "adm" ],
-[ 796, "adn" ],
-[ 797, "ado" ],
-[ 798, "adp" ],
-[ 799, "adq" ],
-[ 800, "adr" ],
-[ 801, "ads" ],
-[ 802, "adt" ],
-[ 803, "adu" ],
-[ 804, "adv" ],
-[ 805, "adw" ],
-[ 806, "adx" ],
-[ 807, "ady" ],
-[ 808, "adz" ],
-[ 809, "aea" ],
-[ 810, "aeb" ],
-[ 811, "aec" ],
-[ 812, "aed" ],
-[ 813, "aee" ],
-[ 814, "aef" ],
-[ 815, "aeg" ],
-[ 816, "aeh" ],
-[ 817, "aei" ],
-[ 818, "aej" ],
-[ 819, "aek" ],
-[ 820, "ael" ],
-[ 821, "aem" ],
-[ 822, "aen" ],
-[ 823, "aeo" ],
-[ 824, "aep" ],
-[ 825, "aeq" ],
-[ 826, "aer" ],
-[ 827, "aes" ],
-[ 828, "aet" ],
-[ 829, "aeu" ],
-[ 830, "aev" ],
-[ 831, "aew" ],
-[ 832, "aex" ],
-[ 833, "aey" ],
-[ 834, "aez" ],
-[ 835, "afa" ],
-[ 836, "afb" ],
-[ 837, "afc" ],
-[ 838, "afd" ],
-[ 839, "afe" ],
-[ 840, "aff" ],
-[ 841, "afg" ],
-[ 842, "afh" ],
-[ 843, "afi" ],
-[ 844, "afj" ],
-[ 845, "afk" ],
-[ 846, "afl" ],
-[ 847, "afm" ],
-[ 848, "afn" ],
-[ 849, "afo" ],
-[ 850, "afp" ],
-[ 851, "afq" ],
-[ 852, "afr" ],
-[ 853, "afs" ],
-[ 854, "aft" ],
-[ 855, "afu" ],
-[ 856, "afv" ],
-[ 857, "afw" ],
-[ 858, "afx" ],
-[ 859, "afy" ],
-[ 860, "afz" ],
-[ 861, "aga" ],
-[ 862, "agb" ],
-[ 863, "agc" ],
-[ 864, "agd" ],
-[ 865, "age" ],
-[ 866, "agf" ],
-[ 867, "agg" ],
-[ 868, "agh" ],
-[ 869, "agi" ],
-[ 870, "agj" ],
-[ 871, "agk" ],
-[ 872, "agl" ],
-[ 873, "agm" ],
-[ 874, "agn" ],
-[ 875, "ago" ],
-[ 876, "agp" ],
-[ 877, "agq" ],
-[ 878, "agr" ],
-[ 879, "ags" ],
-[ 880, "agt" ],
-[ 881, "agu" ],
-[ 882, "agv" ],
-[ 883, "agw" ],
-[ 884, "agx" ],
-[ 885, "agy" ],
-[ 886, "agz" ],
-[ 887, "aha" ],
-[ 888, "ahb" ],
-[ 889, "ahc" ],
-[ 890, "ahd" ],
-[ 891, "ahe" ],
-[ 892, "ahf" ],
-[ 893, "ahg" ],
-[ 894, "ahh" ],
-[ 895, "ahi" ],
-[ 896, "ahj" ],
-[ 897, "ahk" ],
-[ 898, "ahl" ],
-[ 899, "ahm" ],
-[ 900, "ahn" ],
-[ 901, "aho" ],
-[ 902, "ahp" ],
-[ 903, "ahq" ],
-[ 904, "ahr" ],
-[ 905, "ahs" ],
-[ 906, "aht" ],
-[ 907, "ahu" ],
-[ 908, "ahv" ],
-[ 909, "ahw" ],
-[ 910, "ahx" ],
-[ 911, "ahy" ],
-[ 912, "ahz" ],
-[ 913, "aia" ],
-[ 914, "aib" ],
-[ 915, "aic" ],
-[ 916, "aid" ],
-[ 917, "aie" ],
-[ 918, "aif" ],
-[ 919, "aig" ],
-[ 920, "aih" ],
-[ 921, "aii" ],
-[ 922, "aij" ],
-[ 923, "aik" ],
-[ 924, "ail" ],
-[ 925, "aim" ],
-[ 926, "ain" ],
-[ 927, "aio" ],
-[ 928, "aip" ],
-[ 929, "aiq" ],
-[ 930, "air" ],
-[ 931, "ais" ],
-[ 932, "ait" ],
-[ 933, "aiu" ],
-[ 934, "aiv" ],
-[ 935, "aiw" ],
-[ 936, "aix" ],
-[ 937, "aiy" ],
-[ 938, "aiz" ],
-[ 939, "aja" ],
-[ 940, "ajb" ],
-[ 941, "ajc" ],
-[ 942, "ajd" ],
-[ 943, "aje" ],
-[ 944, "ajf" ],
-[ 945, "ajg" ],
-[ 946, "ajh" ],
-[ 947, "aji" ],
-[ 948, "ajj" ],
-[ 949, "ajk" ],
-[ 950, "ajl" ],
-[ 951, "ajm" ],
-[ 952, "ajn" ],
-[ 953, "ajo" ],
-[ 954, "ajp" ],
-[ 955, "ajq" ],
-[ 956, "ajr" ],
-[ 957, "ajs" ],
-[ 958, "ajt" ],
-[ 959, "aju" ],
-[ 960, "ajv" ],
-[ 961, "ajw" ],
-[ 962, "ajx" ],
-[ 963, "ajy" ],
-[ 964, "ajz" ],
-[ 965, "aka" ],
-[ 966, "akb" ],
-[ 967, "akc" ],
-[ 968, "akd" ],
-[ 969, "ake" ],
-[ 970, "akf" ],
-[ 971, "akg" ],
-[ 972, "akh" ],
-[ 973, "aki" ],
-[ 974, "akj" ],
-[ 975, "akk" ],
-[ 976, "akl" ],
-[ 977, "akm" ],
-[ 978, "akn" ],
-[ 979, "ako" ],
-[ 980, "akp" ],
-[ 981, "akq" ],
-[ 982, "akr" ],
-[ 983, "aks" ],
-[ 984, "akt" ],
-[ 985, "aku" ],
-[ 986, "akv" ],
-[ 987, "akw" ],
-[ 988, "akx" ],
-[ 989, "aky" ],
-[ 990, "akz" ],
-[ 991, "ala" ],
-[ 992, "alb" ],
-[ 993, "alc" ],
-[ 994, "ald" ],
-[ 995, "ale" ],
-[ 996, "alf" ],
-[ 997, "alg" ],
-[ 998, "alh" ],
-[ 999, "ali" ],
-[ 1000, "alj" ],
-[ 1001, "alk" ],
-[ 1002, "all" ],
-[ 1003, "alm" ],
-[ 1004, "aln" ],
-[ 1005, "alo" ],
-[ 1006, "alp" ],
-[ 1007, "alq" ],
-[ 1008, "alr" ],
-[ 1009, "als" ],
-[ 1010, "alt" ],
-[ 1011, "alu" ],
-[ 1012, "alv" ],
-[ 1013, "alw" ],
-[ 1014, "alx" ],
-[ 1015, "aly" ],
-[ 1016, "alz" ],
-[ 1017, "ama" ],
-[ 1018, "amb" ],
-[ 1019, "amc" ],
-[ 1020, "amd" ],
-[ 1021, "ame" ],
-[ 1022, "amf" ],
-[ 1023, "amg" ],
-[ 1024, "amh" ],
-[ 1025, "ami" ],
-[ 1026, "amj" ],
-[ 1027, "amk" ],
-[ 1028, "aml" ],
-[ 1029, "amm" ],
-[ 1030, "amn" ],
-[ 1031, "amo" ],
-[ 1032, "amp" ],
-[ 1033, "amq" ],
-[ 1034, "amr" ],
-[ 1035, "ams" ],
-[ 1036, "amt" ],
-[ 1037, "amu" ],
-[ 1038, "amv" ],
-[ 1039, "amw" ],
-[ 1040, "amx" ],
-[ 1041, "amy" ],
-[ 1042, "amz" ],
-[ 1043, "ana" ],
-[ 1044, "anb" ],
-[ 1045, "anc" ],
-[ 1046, "and" ],
-[ 1047, "ane" ],
-[ 1048, "anf" ],
-[ 1049, "ang" ],
-[ 1050, "anh" ],
-[ 1051, "ani" ],
-[ 1052, "anj" ],
-[ 1053, "ank" ],
-[ 1054, "anl" ],
-[ 1055, "anm" ],
-[ 1056, "ann" ],
-[ 1057, "ano" ],
-[ 1058, "anp" ],
-[ 1059, "anq" ],
-[ 1060, "anr" ],
-[ 1061, "ans" ],
-[ 1062, "ant" ],
-[ 1063, "anu" ],
-[ 1064, "anv" ],
-[ 1065, "anw" ],
-[ 1066, "anx" ],
-[ 1067, "any" ],
-[ 1068, "anz" ],
-[ 1069, "aoa" ],
-[ 1070, "aob" ],
-[ 1071, "aoc" ],
-[ 1072, "aod" ],
-[ 1073, "aoe" ],
-[ 1074, "aof" ],
-[ 1075, "aog" ],
-[ 1076, "aoh" ],
-[ 1077, "aoi" ],
-[ 1078, "aoj" ],
-[ 1079, "aok" ],
-[ 1080, "aol" ],
-[ 1081, "aom" ],
-[ 1082, "aon" ],
-[ 1083, "aoo" ],
-[ 1084, "aop" ],
-[ 1085, "aoq" ],
-[ 1086, "aor" ],
-[ 1087, "aos" ],
-[ 1088, "aot" ],
-[ 1089, "aou" ],
-[ 1090, "aov" ],
-[ 1091, "aow" ],
-[ 1092, "aox" ],
-[ 1093, "aoy" ],
-[ 1094, "aoz" ],
-[ 1095, "apa" ],
-[ 1096, "apb" ],
-[ 1097, "apc" ],
-[ 1098, "apd" ],
-[ 1099, "ape" ],
-[ 1100, "apf" ],
-[ 1101, "apg" ],
-[ 1102, "aph" ],
-[ 1103, "api" ],
-[ 1104, "apj" ],
-[ 1105, "apk" ],
-[ 1106, "apl" ],
-[ 1107, "apm" ],
-[ 1108, "apn" ],
-[ 1109, "apo" ],
-[ 1110, "app" ],
-[ 1111, "apq" ],
-[ 1112, "apr" ],
-[ 1113, "aps" ],
-[ 1114, "apt" ],
-[ 1115, "apu" ],
-[ 1116, "apv" ],
-[ 1117, "apw" ],
-[ 1118, "apx" ],
-[ 1119, "apy" ],
-[ 1120, "apz" ],
-[ 1121, "aqa" ],
-[ 1122, "aqb" ],
-[ 1123, "aqc" ],
-[ 1124, "aqd" ],
-[ 1125, "aqe" ],
-[ 1126, "aqf" ],
-[ 1127, "aqg" ],
-[ 1128, "aqh" ],
-[ 1129, "aqi" ],
-[ 1130, "aqj" ],
-[ 1131, "aqk" ],
-[ 1132, "aql" ],
-[ 1133, "aqm" ],
-[ 1134, "aqn" ],
-[ 1135, "aqo" ],
-[ 1136, "aqp" ],
-[ 1137, "aqq" ],
-[ 1138, "aqr" ],
-[ 1139, "aqs" ],
-[ 1140, "aqt" ],
-[ 1141, "aqu" ],
-[ 1142, "aqv" ],
-[ 1143, "aqw" ],
-[ 1144, "aqx" ],
-[ 1145, "aqy" ],
-[ 1146, "aqz" ],
-[ 1147, "ara" ],
-[ 1148, "arb" ],
-[ 1149, "arc" ],
-[ 1150, "ard" ],
-[ 1151, "are" ],
-[ 1152, "arf" ],
-[ 1153, "arg" ],
-[ 1154, "arh" ],
-[ 1155, "ari" ],
-[ 1156, "arj" ],
-[ 1157, "ark" ],
-[ 1158, "arl" ],
-[ 1159, "arm" ],
-[ 1160, "arn" ],
-[ 1161, "aro" ],
-[ 1162, "arp" ],
-[ 1163, "arq" ],
-[ 1164, "arr" ],
-[ 1165, "ars" ],
-[ 1166, "art" ],
-[ 1167, "aru" ],
-[ 1168, "arv" ],
-[ 1169, "arw" ],
-[ 1170, "arx" ],
-[ 1171, "ary" ],
-[ 1172, "arz" ],
-[ 1173, "asa" ],
-[ 1174, "asb" ],
-[ 1175, "asc" ],
-[ 1176, "asd" ],
-[ 1177, "ase" ],
-[ 1178, "asf" ],
-[ 1179, "asg" ],
-[ 1180, "ash" ],
-[ 1181, "asi" ],
-[ 1182, "asj" ],
-[ 1183, "ask" ],
-[ 1184, "asl" ],
-[ 1185, "asm" ],
-[ 1186, "asn" ],
-[ 1187, "aso" ],
-[ 1188, "asp" ],
-[ 1189, "asq" ],
-[ 1190, "asr" ],
-[ 1191, "ass" ],
-[ 1192, "ast" ],
-[ 1193, "asu" ],
-[ 1194, "asv" ],
-[ 1195, "asw" ],
-[ 1196, "asx" ],
-[ 1197, "asy" ],
-[ 1198, "asz" ],
-[ 1199, "ata" ],
-[ 1200, "atb" ],
-[ 1201, "atc" ],
-[ 1202, "atd" ],
-[ 1203, "ate" ],
-[ 1204, "atf" ],
-[ 1205, "atg" ],
-[ 1206, "ath" ],
-[ 1207, "ati" ],
-[ 1208, "atj" ],
-[ 1209, "atk" ],
-[ 1210, "atl" ],
-[ 1211, "atm" ],
-[ 1212, "atn" ],
-[ 1213, "ato" ],
-[ 1214, "atp" ],
-[ 1215, "atq" ],
-[ 1216, "atr" ],
-[ 1217, "ats" ],
-[ 1218, "att" ],
-[ 1219, "atu" ],
-[ 1220, "atv" ],
-[ 1221, "atw" ],
-[ 1222, "atx" ],
-[ 1223, "aty" ],
-[ 1224, "atz" ],
-[ 1225, "aua" ],
-[ 1226, "aub" ],
-[ 1227, "auc" ],
-[ 1228, "aud" ],
-[ 1229, "aue" ],
-[ 1230, "auf" ],
-[ 1231, "aug" ],
-[ 1232, "auh" ],
-[ 1233, "aui" ],
-[ 1234, "auj" ],
-[ 1235, "auk" ],
-[ 1236, "aul" ],
-[ 1237, "aum" ],
-[ 1238, "aun" ],
-[ 1239, "auo" ],
-[ 1240, "aup" ],
-[ 1241, "auq" ],
-[ 1242, "aur" ],
-[ 1243, "aus" ],
-[ 1244, "aut" ],
-[ 1245, "auu" ],
-[ 1246, "auv" ],
-[ 1247, "auw" ],
-[ 1248, "aux" ],
-[ 1249, "auy" ],
-[ 1250, "auz" ],
-[ 1251, "ava" ],
-[ 1252, "avb" ],
-[ 1253, "avc" ],
-[ 1254, "avd" ],
-[ 1255, "ave" ],
-[ 1256, "avf" ],
-[ 1257, "avg" ],
-[ 1258, "avh" ],
-[ 1259, "avi" ],
-[ 1260, "avj" ],
-[ 1261, "avk" ],
-[ 1262, "avl" ],
-[ 1263, "avm" ],
-[ 1264, "avn" ],
-[ 1265, "avo" ],
-[ 1266, "avp" ],
-[ 1267, "avq" ],
-[ 1268, "avr" ],
-[ 1269, "avs" ],
-[ 1270, "avt" ],
-[ 1271, "avu" ],
-[ 1272, "avv" ],
-[ 1273, "avw" ],
-[ 1274, "avx" ],
-[ 1275, "avy" ],
-[ 1276, "avz" ],
-[ 1277, "awa" ],
-[ 1278, "awb" ],
-[ 1279, "awc" ],
-[ 1280, "awd" ],
-[ 1281, "awe" ],
-[ 1282, "awf" ],
-[ 1283, "awg" ],
-[ 1284, "awh" ],
-[ 1285, "awi" ],
-[ 1286, "awj" ],
-[ 1287, "awk" ],
-[ 1288, "awl" ],
-[ 1289, "awm" ],
-[ 1290, "awn" ],
-[ 1291, "awo" ],
-[ 1292, "awp" ],
-[ 1293, "awq" ],
-[ 1294, "awr" ],
-[ 1295, "aws" ],
-[ 1296, "awt" ],
-[ 1297, "awu" ],
-[ 1298, "awv" ],
-[ 1299, "aww" ],
-[ 1300, "awx" ],
-[ 1301, "awy" ],
-[ 1302, "awz" ],
-[ 1303, "axa" ],
-[ 1304, "axb" ],
-[ 1305, "axc" ],
-[ 1306, "axd" ],
-[ 1307, "axe" ],
-[ 1308, "axf" ],
-[ 1309, "axg" ],
-[ 1310, "axh" ],
-[ 1311, "axi" ],
-[ 1312, "axj" ],
-[ 1313, "axk" ],
-[ 1314, "axl" ],
-[ 1315, "axm" ],
-[ 1316, "axn" ],
-[ 1317, "axo" ],
-[ 1318, "axp" ],
-[ 1319, "axq" ],
-[ 1320, "axr" ],
-[ 1321, "axs" ],
-[ 1322, "axt" ],
-[ 1323, "axu" ],
-[ 1324, "axv" ],
-[ 1325, "axw" ],
-[ 1326, "axx" ],
-[ 1327, "axy" ],
-[ 1328, "axz" ],
-[ 1329, "aya" ],
-[ 1330, "ayb" ],
-[ 1331, "ayc" ],
-[ 1332, "ayd" ],
-[ 1333, "aye" ],
-[ 1334, "ayf" ],
-[ 1335, "ayg" ],
-[ 1336, "ayh" ],
-[ 1337, "ayi" ],
-[ 1338, "ayj" ],
-[ 1339, "ayk" ],
-[ 1340, "ayl" ],
-[ 1341, "aym" ],
-[ 1342, "ayn" ],
-[ 1343, "ayo" ],
-[ 1344, "ayp" ],
-[ 1345, "ayq" ],
-[ 1346, "ayr" ],
-[ 1347, "ays" ],
-[ 1348, "ayt" ],
-[ 1349, "ayu" ],
-[ 1350, "ayv" ],
-[ 1351, "ayw" ],
-[ 1352, "ayx" ],
-[ 1353, "ayy" ],
-[ 1354, "ayz" ],
-[ 1355, "aza" ],
-[ 1356, "azb" ],
-[ 1357, "azc" ],
-[ 1358, "azd" ],
-[ 1359, "aze" ],
-[ 1360, "azf" ],
-[ 1361, "azg" ],
-[ 1362, "azh" ],
-[ 1363, "azi" ],
-[ 1364, "azj" ],
-[ 1365, "azk" ],
-[ 1366, "azl" ],
-[ 1367, "azm" ],
-[ 1368, "azn" ],
-[ 1369, "azo" ],
-[ 1370, "azp" ],
-[ 1371, "azq" ],
-[ 1372, "azr" ],
-[ 1373, "azs" ],
-[ 1374, "azt" ],
-[ 1375, "azu" ],
-[ 1376, "azv" ],
-[ 1377, "azw" ],
-[ 1378, "azx" ],
-[ 1379, "azy" ],
-[ 1380, "azz" ],
-[ 1381, "baa" ],
-[ 1382, "bab" ],
-[ 1383, "bac" ],
-[ 1384, "bad" ],
-[ 1385, "bae" ],
-[ 1386, "baf" ],
-[ 1387, "bag" ],
-[ 1388, "bah" ],
-[ 1389, "bai" ],
-[ 1390, "baj" ],
-[ 1391, "bak" ],
-[ 1392, "bal" ],
-[ 1393, "bam" ],
-[ 1394, "ban" ],
-[ 1395, "bao" ],
-[ 1396, "bap" ],
-[ 1397, "baq" ],
-[ 1398, "bar" ],
-[ 1399, "bas" ],
-[ 1400, "bat" ],
-[ 1401, "bau" ],
-[ 1402, "bav" ],
-[ 1403, "baw" ],
-[ 1404, "bax" ],
-[ 1405, "bay" ],
-[ 1406, "baz" ],
-[ 1407, "bba" ],
-[ 1408, "bbb" ],
-[ 1409, "bbc" ],
-[ 1410, "bbd" ],
-[ 1411, "bbe" ],
-[ 1412, "bbf" ],
-[ 1413, "bbg" ],
-[ 1414, "bbh" ],
-[ 1415, "bbi" ],
-[ 1416, "bbj" ],
-[ 1417, "bbk" ],
-[ 1418, "bbl" ],
-[ 1419, "bbm" ],
-[ 1420, "bbn" ],
-[ 1421, "bbo" ],
-[ 1422, "bbp" ],
-[ 1423, "bbq" ],
-[ 1424, "bbr" ],
-[ 1425, "bbs" ],
-[ 1426, "bbt" ],
-[ 1427, "bbu" ],
-[ 1428, "bbv" ],
-[ 1429, "bbw" ],
-[ 1430, "bbx" ],
-[ 1431, "bby" ],
-[ 1432, "bbz" ],
-[ 1433, "bca" ],
-[ 1434, "bcb" ],
-[ 1435, "bcc" ],
-[ 1436, "bcd" ],
-[ 1437, "bce" ],
-[ 1438, "bcf" ],
-[ 1439, "bcg" ],
-[ 1440, "bch" ],
-[ 1441, "bci" ],
-[ 1442, "bcj" ],
-[ 1443, "bck" ],
-[ 1444, "bcl" ],
-[ 1445, "bcm" ],
-[ 1446, "bcn" ],
-[ 1447, "bco" ],
-[ 1448, "bcp" ],
-[ 1449, "bcq" ],
-[ 1450, "bcr" ],
-[ 1451, "bcs" ],
-[ 1452, "bct" ],
-[ 1453, "bcu" ],
-[ 1454, "bcv" ],
-[ 1455, "bcw" ],
-[ 1456, "bcx" ],
-[ 1457, "bcy" ],
-[ 1458, "bcz" ],
-[ 1459, "bda" ],
-[ 1460, "bdb" ],
-[ 1461, "bdc" ],
-[ 1462, "bdd" ],
-[ 1463, "bde" ],
-[ 1464, "bdf" ],
-[ 1465, "bdg" ],
-[ 1466, "bdh" ],
-[ 1467, "bdi" ],
-[ 1468, "bdj" ],
-[ 1469, "bdk" ],
-[ 1470, "bdl" ],
-[ 1471, "bdm" ],
-[ 1472, "bdn" ],
-[ 1473, "bdo" ],
-[ 1474, "bdp" ],
-[ 1475, "bdq" ],
-[ 1476, "bdr" ],
-[ 1477, "bds" ],
-[ 1478, "bdt" ],
-[ 1479, "bdu" ],
-[ 1480, "bdv" ],
-[ 1481, "bdw" ],
-[ 1482, "bdx" ],
-[ 1483, "bdy" ],
-[ 1484, "bdz" ],
-[ 1485, "bea" ],
-[ 1486, "beb" ],
-[ 1487, "bec" ],
-[ 1488, "bed" ],
-[ 1489, "bee" ],
-[ 1490, "bef" ],
-[ 1491, "beg" ],
-[ 1492, "beh" ],
-[ 1493, "bei" ],
-[ 1494, "bej" ],
-[ 1495, "bek" ],
-[ 1496, "bel" ],
-[ 1497, "bem" ],
-[ 1498, "ben" ],
-[ 1499, "beo" ],
-[ 1500, "bep" ],
-[ 1501, "beq" ],
-[ 1502, "ber" ],
-[ 1503, "bes" ],
-[ 1504, "bet" ],
-[ 1505, "beu" ],
-[ 1506, "bev" ],
-[ 1507, "bew" ],
-[ 1508, "bex" ],
-[ 1509, "bey" ],
-[ 1510, "bez" ],
-[ 1511, "bfa" ],
-[ 1512, "bfb" ],
-[ 1513, "bfc" ],
-[ 1514, "bfd" ],
-[ 1515, "bfe" ],
-[ 1516, "bff" ],
-[ 1517, "bfg" ],
-[ 1518, "bfh" ],
-[ 1519, "bfi" ],
-[ 1520, "bfj" ],
-[ 1521, "bfk" ],
-[ 1522, "bfl" ],
-[ 1523, "bfm" ],
-[ 1524, "bfn" ],
-[ 1525, "bfo" ],
-[ 1526, "bfp" ],
-[ 1527, "bfq" ],
-[ 1528, "bfr" ],
-[ 1529, "bfs" ],
-[ 1530, "bft" ],
-[ 1531, "bfu" ],
-[ 1532, "bfv" ],
-[ 1533, "bfw" ],
-[ 1534, "bfx" ],
-[ 1535, "bfy" ],
-[ 1536, "bfz" ],
-[ 1537, "bga" ],
-[ 1538, "bgb" ],
-[ 1539, "bgc" ],
-[ 1540, "bgd" ],
-[ 1541, "bge" ],
-[ 1542, "bgf" ],
-[ 1543, "bgg" ],
-[ 1544, "bgh" ],
-[ 1545, "bgi" ],
-[ 1546, "bgj" ],
-[ 1547, "bgk" ],
-[ 1548, "bgl" ],
-[ 1549, "bgm" ],
-[ 1550, "bgn" ],
-[ 1551, "bgo" ],
-[ 1552, "bgp" ],
-[ 1553, "bgq" ],
-[ 1554, "bgr" ],
-[ 1555, "bgs" ],
-[ 1556, "bgt" ],
-[ 1557, "bgu" ],
-[ 1558, "bgv" ],
-[ 1559, "bgw" ],
-[ 1560, "bgx" ],
-[ 1561, "bgy" ],
-[ 1562, "bgz" ],
-[ 1563, "bha" ],
-[ 1564, "bhb" ],
-[ 1565, "bhc" ],
-[ 1566, "bhd" ],
-[ 1567, "bhe" ],
-[ 1568, "bhf" ],
-[ 1569, "bhg" ],
-[ 1570, "bhh" ],
-[ 1571, "bhi" ],
-[ 1572, "bhj" ],
-[ 1573, "bhk" ],
-[ 1574, "bhl" ],
-[ 1575, "bhm" ],
-[ 1576, "bhn" ],
-[ 1577, "bho" ],
-[ 1578, "bhp" ],
-[ 1579, "bhq" ],
-[ 1580, "bhr" ],
-[ 1581, "bhs" ],
-[ 1582, "bht" ],
-[ 1583, "bhu" ],
-[ 1584, "bhv" ],
-[ 1585, "bhw" ],
-[ 1586, "bhx" ],
-[ 1587, "bhy" ],
-[ 1588, "bhz" ],
-[ 1589, "bia" ],
-[ 1590, "bib" ],
-[ 1591, "bic" ],
-[ 1592, "bid" ],
-[ 1593, "bie" ],
-[ 1594, "bif" ],
-[ 1595, "big" ],
-[ 1596, "bih" ],
-[ 1597, "bii" ],
-[ 1598, "bij" ],
-[ 1599, "bik" ],
-[ 1600, "bil" ],
-[ 1601, "bim" ],
-[ 1602, "bin" ],
-[ 1603, "bio" ],
-[ 1604, "bip" ],
-[ 1605, "biq" ],
-[ 1606, "bir" ],
-[ 1607, "bis" ],
-[ 1608, "bit" ],
-[ 1609, "biu" ],
-[ 1610, "biv" ],
-[ 1611, "biw" ],
-[ 1612, "bix" ],
-[ 1613, "biy" ],
-[ 1614, "biz" ],
-[ 1615, "bja" ],
-[ 1616, "bjb" ],
-[ 1617, "bjc" ],
-[ 1618, "bjd" ],
-[ 1619, "bje" ],
-[ 1620, "bjf" ],
-[ 1621, "bjg" ],
-[ 1622, "bjh" ],
-[ 1623, "bji" ],
-[ 1624, "bjj" ],
-[ 1625, "bjk" ],
-[ 1626, "bjl" ],
-[ 1627, "bjm" ],
-[ 1628, "bjn" ],
-[ 1629, "bjo" ],
-[ 1630, "bjp" ],
-[ 1631, "bjq" ],
-[ 1632, "bjr" ],
-[ 1633, "bjs" ],
-[ 1634, "bjt" ],
-[ 1635, "bju" ],
-[ 1636, "bjv" ],
-[ 1637, "bjw" ],
-[ 1638, "bjx" ],
-[ 1639, "bjy" ],
-[ 1640, "bjz" ],
-[ 1641, "bka" ],
-[ 1642, "bkb" ],
-[ 1643, "bkc" ],
-[ 1644, "bkd" ],
-[ 1645, "bke" ],
-[ 1646, "bkf" ],
-[ 1647, "bkg" ],
-[ 1648, "bkh" ],
-[ 1649, "bki" ],
-[ 1650, "bkj" ],
-[ 1651, "bkk" ],
-[ 1652, "bkl" ],
-[ 1653, "bkm" ],
-[ 1654, "bkn" ],
-[ 1655, "bko" ],
-[ 1656, "bkp" ],
-[ 1657, "bkq" ],
-[ 1658, "bkr" ],
-[ 1659, "bks" ],
-[ 1660, "bkt" ],
-[ 1661, "bku" ],
-[ 1662, "bkv" ],
-[ 1663, "bkw" ],
-[ 1664, "bkx" ],
-[ 1665, "bky" ],
-[ 1666, "bkz" ],
-[ 1667, "bla" ],
-[ 1668, "blb" ],
-[ 1669, "blc" ],
-[ 1670, "bld" ],
-[ 1671, "ble" ],
-[ 1672, "blf" ],
-[ 1673, "blg" ],
-[ 1674, "blh" ],
-[ 1675, "bli" ],
-[ 1676, "blj" ],
-[ 1677, "blk" ],
-[ 1678, "bll" ],
-[ 1679, "blm" ],
-[ 1680, "bln" ],
-[ 1681, "blo" ],
-[ 1682, "blp" ],
-[ 1683, "blq" ],
-[ 1684, "blr" ],
-[ 1685, "bls" ],
-[ 1686, "blt" ],
-[ 1687, "blu" ],
-[ 1688, "blv" ],
-[ 1689, "blw" ],
-[ 1690, "blx" ],
-[ 1691, "bly" ],
-[ 1692, "blz" ],
-[ 1693, "bma" ],
-[ 1694, "bmb" ],
-[ 1695, "bmc" ],
-[ 1696, "bmd" ],
-[ 1697, "bme" ],
-[ 1698, "bmf" ],
-[ 1699, "bmg" ],
-[ 1700, "bmh" ],
-[ 1701, "bmi" ],
-[ 1702, "bmj" ],
-[ 1703, "bmk" ],
-[ 1704, "bml" ],
-[ 1705, "bmm" ],
-[ 1706, "bmn" ],
-[ 1707, "bmo" ],
-[ 1708, "bmp" ],
-[ 1709, "bmq" ],
-[ 1710, "bmr" ],
-[ 1711, "bms" ],
-[ 1712, "bmt" ],
-[ 1713, "bmu" ],
-[ 1714, "bmv" ],
-[ 1715, "bmw" ],
-[ 1716, "bmx" ],
-[ 1717, "bmy" ],
-[ 1718, "bmz" ],
-[ 1719, "bna" ],
-[ 1720, "bnb" ],
-[ 1721, "bnc" ],
-[ 1722, "bnd" ],
-[ 1723, "bne" ],
-[ 1724, "bnf" ],
-[ 1725, "bng" ],
-[ 1726, "bnh" ],
-[ 1727, "bni" ],
-[ 1728, "bnj" ],
-[ 1729, "bnk" ],
-[ 1730, "bnl" ],
-[ 1731, "bnm" ],
-[ 1732, "bnn" ],
-[ 1733, "bno" ],
-[ 1734, "bnp" ],
-[ 1735, "bnq" ],
-[ 1736, "bnr" ],
-[ 1737, "bns" ],
-[ 1738, "bnt" ],
-[ 1739, "bnu" ],
-[ 1740, "bnv" ],
-[ 1741, "bnw" ],
-[ 1742, "bnx" ],
-[ 1743, "bny" ],
-[ 1744, "bnz" ],
-[ 1745, "boa" ],
-[ 1746, "bob" ],
-[ 1747, "boc" ],
-[ 1748, "bod" ],
-[ 1749, "boe" ],
-[ 1750, "bof" ],
-[ 1751, "bog" ],
-[ 1752, "boh" ],
-[ 1753, "boi" ],
-[ 1754, "boj" ],
-[ 1755, "bok" ],
-[ 1756, "bol" ],
-[ 1757, "bom" ],
-[ 1758, "bon" ],
-[ 1759, "boo" ],
-[ 1760, "bop" ],
-[ 1761, "boq" ],
-[ 1762, "bor" ],
-[ 1763, "bos" ],
-[ 1764, "bot" ],
-[ 1765, "bou" ],
-[ 1766, "bov" ],
-[ 1767, "bow" ],
-[ 1768, "box" ],
-[ 1769, "boy" ],
-[ 1770, "boz" ],
-[ 1771, "bpa" ],
-[ 1772, "bpb" ],
-[ 1773, "bpc" ],
-[ 1774, "bpd" ],
-[ 1775, "bpe" ],
-[ 1776, "bpf" ],
-[ 1777, "bpg" ],
-[ 1778, "bph" ],
-[ 1779, "bpi" ],
-[ 1780, "bpj" ],
-[ 1781, "bpk" ],
-[ 1782, "bpl" ],
-[ 1783, "bpm" ],
-[ 1784, "bpn" ],
-[ 1785, "bpo" ],
-[ 1786, "bpp" ],
-[ 1787, "bpq" ],
-[ 1788, "bpr" ],
-[ 1789, "bps" ],
-[ 1790, "bpt" ],
-[ 1791, "bpu" ],
-[ 1792, "bpv" ],
-[ 1793, "bpw" ],
-[ 1794, "bpx" ],
-[ 1795, "bpy" ],
-[ 1796, "bpz" ],
-[ 1797, "bqa" ],
-[ 1798, "bqb" ],
-[ 1799, "bqc" ],
-[ 1800, "bqd" ],
-[ 1801, "bqe" ],
-[ 1802, "bqf" ],
-[ 1803, "bqg" ],
-[ 1804, "bqh" ],
-[ 1805, "bqi" ],
-[ 1806, "bqj" ],
-[ 1807, "bqk" ],
-[ 1808, "bql" ],
-[ 1809, "bqm" ],
-[ 1810, "bqn" ],
-[ 1811, "bqo" ],
-[ 1812, "bqp" ],
-[ 1813, "bqq" ],
-[ 1814, "bqr" ],
-[ 1815, "bqs" ],
-[ 1816, "bqt" ],
-[ 1817, "bqu" ],
-[ 1818, "bqv" ],
-[ 1819, "bqw" ],
-[ 1820, "bqx" ],
-[ 1821, "bqy" ],
-[ 1822, "bqz" ],
-[ 1823, "bra" ],
-[ 1824, "brb" ],
-[ 1825, "brc" ],
-[ 1826, "brd" ],
-[ 1827, "bre" ],
-[ 1828, "brf" ],
-[ 1829, "brg" ],
-[ 1830, "brh" ],
-[ 1831, "bri" ],
-[ 1832, "brj" ],
-[ 1833, "brk" ],
-[ 1834, "brl" ],
-[ 1835, "brm" ],
-[ 1836, "brn" ],
-[ 1837, "bro" ],
-[ 1838, "brp" ],
-[ 1839, "brq" ],
-[ 1840, "brr" ],
-[ 1841, "brs" ],
-[ 1842, "brt" ],
-[ 1843, "bru" ],
-[ 1844, "brv" ],
-[ 1845, "brw" ],
-[ 1846, "brx" ],
-[ 1847, "bry" ],
-[ 1848, "brz" ],
-[ 1849, "bsa" ],
-[ 1850, "bsb" ],
-[ 1851, "bsc" ],
-[ 1852, "bsd" ],
-[ 1853, "bse" ],
-[ 1854, "bsf" ],
-[ 1855, "bsg" ],
-[ 1856, "bsh" ],
-[ 1857, "bsi" ],
-[ 1858, "bsj" ],
-[ 1859, "bsk" ],
-[ 1860, "bsl" ],
-[ 1861, "bsm" ],
-[ 1862, "bsn" ],
-[ 1863, "bso" ],
-[ 1864, "bsp" ],
-[ 1865, "bsq" ],
-[ 1866, "bsr" ],
-[ 1867, "bss" ],
-[ 1868, "bst" ],
-[ 1869, "bsu" ],
-[ 1870, "bsv" ],
-[ 1871, "bsw" ],
-[ 1872, "bsx" ],
-[ 1873, "bsy" ],
-[ 1874, "bsz" ],
-[ 1875, "bta" ],
-[ 1876, "btb" ],
-[ 1877, "btc" ],
-[ 1878, "btd" ],
-[ 1879, "bte" ],
-[ 1880, "btf" ],
-[ 1881, "btg" ],
-[ 1882, "bth" ],
-[ 1883, "bti" ],
-[ 1884, "btj" ],
-[ 1885, "btk" ],
-[ 1886, "btl" ],
-[ 1887, "btm" ],
-[ 1888, "btn" ],
-[ 1889, "bto" ],
-[ 1890, "btp" ],
-[ 1891, "btq" ],
-[ 1892, "btr" ],
-[ 1893, "bts" ],
-[ 1894, "btt" ],
-[ 1895, "btu" ],
-[ 1896, "btv" ],
-[ 1897, "btw" ],
-[ 1898, "btx" ],
-[ 1899, "bty" ],
-[ 1900, "btz" ],
-[ 1901, "bua" ],
-[ 1902, "bub" ],
-[ 1903, "buc" ],
-[ 1904, "bud" ],
-[ 1905, "bue" ],
-[ 1906, "buf" ],
-[ 1907, "bug" ],
-[ 1908, "buh" ],
-[ 1909, "bui" ],
-[ 1910, "buj" ],
-[ 1911, "buk" ],
-[ 1912, "bul" ],
-[ 1913, "bum" ],
-[ 1914, "bun" ],
-[ 1915, "buo" ],
-[ 1916, "bup" ],
-[ 1917, "buq" ],
-[ 1918, "bur" ],
-[ 1919, "bus" ],
-[ 1920, "but" ],
-[ 1921, "buu" ],
-[ 1922, "buv" ],
-[ 1923, "buw" ],
-[ 1924, "bux" ],
-[ 1925, "buy" ],
-[ 1926, "buz" ],
-[ 1927, "bva" ],
-[ 1928, "bvb" ],
-[ 1929, "bvc" ],
-[ 1930, "bvd" ],
-[ 1931, "bve" ],
-[ 1932, "bvf" ],
-[ 1933, "bvg" ],
-[ 1934, "bvh" ],
-[ 1935, "bvi" ],
-[ 1936, "bvj" ],
-[ 1937, "bvk" ],
-[ 1938, "bvl" ],
-[ 1939, "bvm" ],
-[ 1940, "bvn" ],
-[ 1941, "bvo" ],
-[ 1942, "bvp" ],
-[ 1943, "bvq" ],
-[ 1944, "bvr" ],
-[ 1945, "bvs" ],
-[ 1946, "bvt" ],
-[ 1947, "bvu" ],
-[ 1948, "bvv" ],
-[ 1949, "bvw" ],
-[ 1950, "bvx" ],
-[ 1951, "bvy" ],
-[ 1952, "bvz" ],
-[ 1953, "bwa" ],
-[ 1954, "bwb" ],
-[ 1955, "bwc" ],
-[ 1956, "bwd" ],
-[ 1957, "bwe" ],
-[ 1958, "bwf" ],
-[ 1959, "bwg" ],
-[ 1960, "bwh" ],
-[ 1961, "bwi" ],
-[ 1962, "bwj" ],
-[ 1963, "bwk" ],
-[ 1964, "bwl" ],
-[ 1965, "bwm" ],
-[ 1966, "bwn" ],
-[ 1967, "bwo" ],
-[ 1968, "bwp" ],
-[ 1969, "bwq" ],
-[ 1970, "bwr" ],
-[ 1971, "bws" ],
-[ 1972, "bwt" ],
-[ 1973, "bwu" ],
-[ 1974, "bwv" ],
-[ 1975, "bww" ],
-[ 1976, "bwx" ],
-[ 1977, "bwy" ],
-[ 1978, "bwz" ],
-[ 1979, "bxa" ],
-[ 1980, "bxb" ],
-[ 1981, "bxc" ],
-[ 1982, "bxd" ],
-[ 1983, "bxe" ],
-[ 1984, "bxf" ],
-[ 1985, "bxg" ],
-[ 1986, "bxh" ],
-[ 1987, "bxi" ],
-[ 1988, "bxj" ],
-[ 1989, "bxk" ],
-[ 1990, "bxl" ],
-[ 1991, "bxm" ],
-[ 1992, "bxn" ],
-[ 1993, "bxo" ],
-[ 1994, "bxp" ],
-[ 1995, "bxq" ],
-[ 1996, "bxr" ],
-[ 1997, "bxs" ],
-[ 1998, "bxt" ],
-[ 1999, "bxu" ],
-[ 2000, "bxv" ],
-[ 2001, "bxw" ],
-[ 2002, "bxx" ],
-[ 2003, "bxy" ],
-[ 2004, "bxz" ],
-[ 2005, "bya" ],
-[ 2006, "byb" ],
-[ 2007, "byc" ],
-[ 2008, "byd" ],
-[ 2009, "bye" ],
-[ 2010, "byf" ],
-[ 2011, "byg" ],
-[ 2012, "byh" ],
-[ 2013, "byi" ],
-[ 2014, "byj" ],
-[ 2015, "byk" ],
-[ 2016, "byl" ],
-[ 2017, "bym" ],
-[ 2018, "byn" ],
-[ 2019, "byo" ],
-[ 2020, "byp" ],
-[ 2021, "byq" ],
-[ 2022, "byr" ],
-[ 2023, "bys" ],
-[ 2024, "byt" ],
-[ 2025, "byu" ],
-[ 2026, "byv" ],
-[ 2027, "byw" ],
-[ 2028, "byx" ],
-[ 2029, "byy" ],
-[ 2030, "byz" ],
-[ 2031, "bza" ],
-[ 2032, "bzb" ],
-[ 2033, "bzc" ],
-[ 2034, "bzd" ],
-[ 2035, "bze" ],
-[ 2036, "bzf" ],
-[ 2037, "bzg" ],
-[ 2038, "bzh" ],
-[ 2039, "bzi" ],
-[ 2040, "bzj" ],
-[ 2041, "bzk" ],
-[ 2042, "bzl" ],
-[ 2043, "bzm" ],
-[ 2044, "bzn" ],
-[ 2045, "bzo" ],
-[ 2046, "bzp" ],
-[ 2047, "bzq" ],
-[ 2048, "bzr" ],
-[ 2049, "bzs" ],
-[ 2050, "bzt" ],
-[ 2051, "bzu" ],
-[ 2052, "bzv" ],
-[ 2053, "bzw" ],
-[ 2054, "bzx" ],
-[ 2055, "bzy" ],
-[ 2056, "bzz" ],
-[ 2057, "caa" ],
-[ 2058, "cab" ],
-[ 2059, "cac" ],
-[ 2060, "cad" ],
-[ 2061, "cae" ],
-[ 2062, "caf" ],
-[ 2063, "cag" ],
-[ 2064, "cah" ],
-[ 2065, "cai" ],
-[ 2066, "caj" ],
-[ 2067, "cak" ],
-[ 2068, "cal" ],
-[ 2069, "cam" ],
-[ 2070, "can" ],
-[ 2071, "cao" ],
-[ 2072, "cap" ],
-[ 2073, "caq" ],
-[ 2074, "car" ],
-[ 2075, "cas" ],
-[ 2076, "cat" ],
-[ 2077, "cau" ],
-[ 2078, "cav" ],
-[ 2079, "caw" ],
-[ 2080, "cax" ],
-[ 2081, "cay" ],
-[ 2082, "caz" ],
-[ 2083, "cba" ],
-[ 2084, "cbb" ],
-[ 2085, "cbc" ],
-[ 2086, "cbd" ],
-[ 2087, "cbe" ],
-[ 2088, "cbf" ],
-[ 2089, "cbg" ],
-[ 2090, "cbh" ],
-[ 2091, "cbi" ],
-[ 2092, "cbj" ],
-[ 2093, "cbk" ],
-[ 2094, "cbl" ],
-[ 2095, "cbm" ],
-[ 2096, "cbn" ],
-[ 2097, "cbo" ],
-[ 2098, "cbp" ],
-[ 2099, "cbq" ],
-[ 2100, "cbr" ],
-[ 2101, "cbs" ],
-[ 2102, "cbt" ],
-[ 2103, "cbu" ],
-[ 2104, "cbv" ],
-[ 2105, "cbw" ],
-[ 2106, "cbx" ],
-[ 2107, "cby" ],
-[ 2108, "cbz" ],
-[ 2109, "cca" ],
-[ 2110, "ccb" ],
-[ 2111, "ccc" ],
-[ 2112, "ccd" ],
-[ 2113, "cce" ],
-[ 2114, "ccf" ],
-[ 2115, "ccg" ],
-[ 2116, "cch" ],
-[ 2117, "cci" ],
-[ 2118, "ccj" ],
-[ 2119, "cck" ],
-[ 2120, "ccl" ],
-[ 2121, "ccm" ],
-[ 2122, "ccn" ],
-[ 2123, "cco" ],
-[ 2124, "ccp" ],
-[ 2125, "ccq" ],
-[ 2126, "ccr" ],
-[ 2127, "ccs" ],
-[ 2128, "cct" ],
-[ 2129, "ccu" ],
-[ 2130, "ccv" ],
-[ 2131, "ccw" ],
-[ 2132, "ccx" ],
-[ 2133, "ccy" ],
-[ 2134, "ccz" ],
-[ 2135, "cda" ],
-[ 2136, "cdb" ],
-[ 2137, "cdc" ],
-[ 2138, "cdd" ],
-[ 2139, "cde" ],
-[ 2140, "cdf" ],
-[ 2141, "cdg" ],
-[ 2142, "cdh" ],
-[ 2143, "cdi" ],
-[ 2144, "cdj" ],
-[ 2145, "cdk" ],
-[ 2146, "cdl" ],
-[ 2147, "cdm" ],
-[ 2148, "cdn" ],
-[ 2149, "cdo" ],
-[ 2150, "cdp" ],
-[ 2151, "cdq" ],
-[ 2152, "cdr" ],
-[ 2153, "cds" ],
-[ 2154, "cdt" ],
-[ 2155, "cdu" ],
-[ 2156, "cdv" ],
-[ 2157, "cdw" ],
-[ 2158, "cdx" ],
-[ 2159, "cdy" ],
-[ 2160, "cdz" ],
-[ 2161, "cea" ],
-[ 2162, "ceb" ],
-[ 2163, "cec" ],
-[ 2164, "ced" ],
-[ 2165, "cee" ],
-[ 2166, "cef" ],
-[ 2167, "ceg" ],
-[ 2168, "ceh" ],
-[ 2169, "cei" ],
-[ 2170, "cej" ],
-[ 2171, "cek" ],
-[ 2172, "cel" ],
-[ 2173, "cem" ],
-[ 2174, "cen" ],
-[ 2175, "ceo" ],
-[ 2176, "cep" ],
-[ 2177, "ceq" ],
-[ 2178, "cer" ],
-[ 2179, "ces" ],
-[ 2180, "cet" ],
-[ 2181, "ceu" ],
-[ 2182, "cev" ],
-[ 2183, "cew" ],
-[ 2184, "cex" ],
-[ 2185, "cey" ],
-[ 2186, "cez" ],
-[ 2187, "cfa" ],
-[ 2188, "cfb" ],
-[ 2189, "cfc" ],
-[ 2190, "cfd" ],
-[ 2191, "cfe" ],
-[ 2192, "cff" ],
-[ 2193, "cfg" ],
-[ 2194, "cfh" ],
-[ 2195, "cfi" ],
-[ 2196, "cfj" ],
-[ 2197, "cfk" ],
-[ 2198, "cfl" ],
-[ 2199, "cfm" ],
-[ 2200, "cfn" ],
-[ 2201, "cfo" ],
-[ 2202, "cfp" ],
-[ 2203, "cfq" ],
-[ 2204, "cfr" ],
-[ 2205, "cfs" ],
-[ 2206, "cft" ],
-[ 2207, "cfu" ],
-[ 2208, "cfv" ],
-[ 2209, "cfw" ],
-[ 2210, "cfx" ],
-[ 2211, "cfy" ],
-[ 2212, "cfz" ],
-[ 2213, "cga" ],
-[ 2214, "cgb" ],
-[ 2215, "cgc" ],
-[ 2216, "cgd" ],
-[ 2217, "cge" ],
-[ 2218, "cgf" ],
-[ 2219, "cgg" ],
-[ 2220, "cgh" ],
-[ 2221, "cgi" ],
-[ 2222, "cgj" ],
-[ 2223, "cgk" ],
-[ 2224, "cgl" ],
-[ 2225, "cgm" ],
-[ 2226, "cgn" ],
-[ 2227, "cgo" ],
-[ 2228, "cgp" ],
-[ 2229, "cgq" ],
-[ 2230, "cgr" ],
-[ 2231, "cgs" ],
-[ 2232, "cgt" ],
-[ 2233, "cgu" ],
-[ 2234, "cgv" ],
-[ 2235, "cgw" ],
-[ 2236, "cgx" ],
-[ 2237, "cgy" ],
-[ 2238, "cgz" ],
-[ 2239, "cha" ],
-[ 2240, "chb" ],
-[ 2241, "chc" ],
-[ 2242, "chd" ],
-[ 2243, "che" ],
-[ 2244, "chf" ],
-[ 2245, "chg" ],
-[ 2246, "chh" ],
-[ 2247, "chi" ],
-[ 2248, "chj" ],
-[ 2249, "chk" ],
-[ 2250, "chl" ],
-[ 2251, "chm" ],
-[ 2252, "chn" ],
-[ 2253, "cho" ],
-[ 2254, "chp" ],
-[ 2255, "chq" ],
-[ 2256, "chr" ],
-[ 2257, "chs" ],
-[ 2258, "cht" ],
-[ 2259, "chu" ],
-[ 2260, "chv" ],
-[ 2261, "chw" ],
-[ 2262, "chx" ],
-[ 2263, "chy" ],
-[ 2264, "chz" ],
-[ 2265, "cia" ],
-[ 2266, "cib" ],
-[ 2267, "cic" ],
-[ 2268, "cid" ],
-[ 2269, "cie" ],
-[ 2270, "cif" ],
-[ 2271, "cig" ],
-[ 2272, "cih" ],
-[ 2273, "cii" ],
-[ 2274, "cij" ],
-[ 2275, "cik" ],
-[ 2276, "cil" ],
-[ 2277, "cim" ],
-[ 2278, "cin" ],
-[ 2279, "cio" ],
-[ 2280, "cip" ],
-[ 2281, "ciq" ],
-[ 2282, "cir" ],
-[ 2283, "cis" ],
-[ 2284, "cit" ],
-[ 2285, "ciu" ],
-[ 2286, "civ" ],
-[ 2287, "ciw" ],
-[ 2288, "cix" ],
-[ 2289, "ciy" ],
-[ 2290, "ciz" ],
-[ 2291, "cja" ],
-[ 2292, "cjb" ],
-[ 2293, "cjc" ],
-[ 2294, "cjd" ],
-[ 2295, "cje" ],
-[ 2296, "cjf" ],
-[ 2297, "cjg" ],
-[ 2298, "cjh" ],
-[ 2299, "cji" ],
-[ 2300, "cjj" ],
-[ 2301, "cjk" ],
-[ 2302, "cjl" ],
-[ 2303, "cjm" ],
-[ 2304, "cjn" ],
-[ 2305, "cjo" ],
-[ 2306, "cjp" ],
-[ 2307, "cjq" ],
-[ 2308, "cjr" ],
-[ 2309, "cjs" ],
-[ 2310, "cjt" ],
-[ 2311, "cju" ],
-[ 2312, "cjv" ],
-[ 2313, "cjw" ],
-[ 2314, "cjx" ],
-[ 2315, "cjy" ],
-[ 2316, "cjz" ],
-[ 2317, "cka" ],
-[ 2318, "ckb" ],
-[ 2319, "ckc" ],
-[ 2320, "ckd" ],
-[ 2321, "cke" ],
-[ 2322, "ckf" ],
-[ 2323, "ckg" ],
-[ 2324, "ckh" ],
-[ 2325, "cki" ],
-[ 2326, "ckj" ],
-[ 2327, "ckk" ],
-[ 2328, "ckl" ],
-[ 2329, "ckm" ],
-[ 2330, "ckn" ],
-[ 2331, "cko" ],
-[ 2332, "ckp" ],
-[ 2333, "ckq" ],
-[ 2334, "ckr" ],
-[ 2335, "cks" ],
-[ 2336, "ckt" ],
-[ 2337, "cku" ],
-[ 2338, "ckv" ],
-[ 2339, "ckw" ],
-[ 2340, "ckx" ],
-[ 2341, "cky" ],
-[ 2342, "ckz" ],
-[ 2343, "cla" ],
-[ 2344, "clb" ],
-[ 2345, "clc" ],
-[ 2346, "cld" ],
-[ 2347, "cle" ],
-[ 2348, "clf" ],
-[ 2349, "clg" ],
-[ 2350, "clh" ],
-[ 2351, "cli" ],
-[ 2352, "clj" ],
-[ 2353, "clk" ],
-[ 2354, "cll" ],
-[ 2355, "clm" ],
-[ 2356, "cln" ],
-[ 2357, "clo" ],
-[ 2358, "clp" ],
-[ 2359, "clq" ],
-[ 2360, "clr" ],
-[ 2361, "cls" ],
-[ 2362, "clt" ],
-[ 2363, "clu" ],
-[ 2364, "clv" ],
-[ 2365, "clw" ],
-[ 2366, "clx" ],
-[ 2367, "cly" ],
-[ 2368, "clz" ],
-[ 2369, "cma" ],
-[ 2370, "cmb" ],
-[ 2371, "cmc" ],
-[ 2372, "cmd" ],
-[ 2373, "cme" ],
-[ 2374, "cmf" ],
-[ 2375, "cmg" ],
-[ 2376, "cmh" ],
-[ 2377, "cmi" ],
-[ 2378, "cmj" ],
-[ 2379, "cmk" ],
-[ 2380, "cml" ],
-[ 2381, "cmm" ],
-[ 2382, "cmn" ],
-[ 2383, "cmo" ],
-[ 2384, "cmp" ],
-[ 2385, "cmq" ],
-[ 2386, "cmr" ],
-[ 2387, "cms" ],
-[ 2388, "cmt" ],
-[ 2389, "cmu" ],
-[ 2390, "cmv" ],
-[ 2391, "cmw" ],
-[ 2392, "cmx" ],
-[ 2393, "cmy" ],
-[ 2394, "cmz" ],
-[ 2395, "cna" ],
-[ 2396, "cnb" ],
-[ 2397, "cnc" ],
-[ 2398, "cnd" ],
-[ 2399, "cne" ],
-[ 2400, "cnf" ],
-[ 2401, "cng" ],
-[ 2402, "cnh" ],
-[ 2403, "cni" ],
-[ 2404, "cnj" ],
-[ 2405, "cnk" ],
-[ 2406, "cnl" ],
-[ 2407, "cnm" ],
-[ 2408, "cnn" ],
-[ 2409, "cno" ],
-[ 2410, "cnp" ],
-[ 2411, "cnq" ],
-[ 2412, "cnr" ],
-[ 2413, "cns" ],
-[ 2414, "cnt" ],
-[ 2415, "cnu" ],
-[ 2416, "cnv" ],
-[ 2417, "cnw" ],
-[ 2418, "cnx" ],
-[ 2419, "cny" ],
-[ 2420, "cnz" ],
-[ 2421, "coa" ],
-[ 2422, "cob" ],
-[ 2423, "coc" ],
-[ 2424, "cod" ],
-[ 2425, "coe" ],
-[ 2426, "cof" ],
-[ 2427, "cog" ],
-[ 2428, "coh" ],
-[ 2429, "coi" ],
-[ 2430, "coj" ],
-[ 2431, "cok" ],
-[ 2432, "col" ],
-[ 2433, "com" ],
-[ 2434, "con" ],
-[ 2435, "coo" ],
-[ 2436, "cop" ],
-[ 2437, "coq" ],
-[ 2438, "cor" ],
-[ 2439, "cos" ],
-[ 2440, "cot" ],
-[ 2441, "cou" ],
-[ 2442, "cov" ],
-[ 2443, "cow" ],
-[ 2444, "cox" ],
-[ 2445, "coy" ],
-[ 2446, "coz" ],
-[ 2447, "cpa" ],
-[ 2448, "cpb" ],
-[ 2449, "cpc" ],
-[ 2450, "cpd" ],
-[ 2451, "cpe" ],
-[ 2452, "cpf" ],
-[ 2453, "cpg" ],
-[ 2454, "cph" ],
-[ 2455, "cpi" ],
-[ 2456, "cpj" ],
-[ 2457, "cpk" ],
-[ 2458, "cpl" ],
-[ 2459, "cpm" ],
-[ 2460, "cpn" ],
-[ 2461, "cpo" ],
-[ 2462, "cpp" ],
-[ 2463, "cpq" ],
-[ 2464, "cpr" ],
-[ 2465, "cps" ],
-[ 2466, "cpt" ],
-[ 2467, "cpu" ],
-[ 2468, "cpv" ],
-[ 2469, "cpw" ],
-[ 2470, "cpx" ],
-[ 2471, "cpy" ],
-[ 2472, "cpz" ],
-[ 2473, "cqa" ],
-[ 2474, "cqb" ],
-[ 2475, "cqc" ],
-[ 2476, "cqd" ],
-[ 2477, "cqe" ],
-[ 2478, "cqf" ],
-[ 2479, "cqg" ],
-[ 2480, "cqh" ],
-[ 2481, "cqi" ],
-[ 2482, "cqj" ],
-[ 2483, "cqk" ],
-[ 2484, "cql" ],
-[ 2485, "cqm" ],
-[ 2486, "cqn" ],
-[ 2487, "cqo" ],
-[ 2488, "cqp" ],
-[ 2489, "cqq" ],
-[ 2490, "cqr" ],
-[ 2491, "cqs" ],
-[ 2492, "cqt" ],
-[ 2493, "cqu" ],
-[ 2494, "cqv" ],
-[ 2495, "cqw" ],
-[ 2496, "cqx" ],
-[ 2497, "cqy" ],
-[ 2498, "cqz" ],
-[ 2499, "cra" ],
-[ 2500, "crb" ],
-[ 2501, "crc" ],
-[ 2502, "crd" ],
-[ 2503, "cre" ],
-[ 2504, "crf" ],
-[ 2505, "crg" ],
-[ 2506, "crh" ],
-[ 2507, "cri" ],
-[ 2508, "crj" ],
-[ 2509, "crk" ],
-[ 2510, "crl" ],
-[ 2511, "crm" ],
-[ 2512, "crn" ],
-[ 2513, "cro" ],
-[ 2514, "crp" ],
-[ 2515, "crq" ],
-[ 2516, "crr" ],
-[ 2517, "crs" ],
-[ 2518, "crt" ],
-[ 2519, "cru" ],
-[ 2520, "crv" ],
-[ 2521, "crw" ],
-[ 2522, "crx" ],
-[ 2523, "cry" ],
-[ 2524, "crz" ],
-[ 2525, "csa" ],
-[ 2526, "csb" ],
-[ 2527, "csc" ],
-[ 2528, "csd" ],
-[ 2529, "cse" ],
-[ 2530, "csf" ],
-[ 2531, "csg" ],
-[ 2532, "csh" ],
-[ 2533, "csi" ],
-[ 2534, "csj" ],
-[ 2535, "csk" ],
-[ 2536, "csl" ],
-[ 2537, "csm" ],
-[ 2538, "csn" ],
-[ 2539, "cso" ],
-[ 2540, "csp" ],
-[ 2541, "csq" ],
-[ 2542, "csr" ],
-[ 2543, "css" ],
-[ 2544, "cst" ],
-[ 2545, "csu" ],
-[ 2546, "csv" ],
-[ 2547, "csw" ],
-[ 2548, "csx" ],
-[ 2549, "csy" ],
-[ 2550, "csz" ],
-[ 2551, "cta" ],
-[ 2552, "ctb" ],
-[ 2553, "ctc" ],
-[ 2554, "ctd" ],
-[ 2555, "cte" ],
-[ 2556, "ctf" ],
-[ 2557, "ctg" ],
-[ 2558, "cth" ],
-[ 2559, "cti" ],
-[ 2560, "ctj" ],
-[ 2561, "ctk" ],
-[ 2562, "ctl" ],
-[ 2563, "ctm" ],
-[ 2564, "ctn" ],
-[ 2565, "cto" ],
-[ 2566, "ctp" ],
-[ 2567, "ctq" ],
-[ 2568, "ctr" ],
-[ 2569, "cts" ],
-[ 2570, "ctt" ],
-[ 2571, "ctu" ],
-[ 2572, "ctv" ],
-[ 2573, "ctw" ],
-[ 2574, "ctx" ],
-[ 2575, "cty" ],
-[ 2576, "ctz" ],
-[ 2577, "cua" ],
-[ 2578, "cub" ],
-[ 2579, "cuc" ],
-[ 2580, "cud" ],
-[ 2581, "cue" ],
-[ 2582, "cuf" ],
-[ 2583, "cug" ],
-[ 2584, "cuh" ],
-[ 2585, "cui" ],
-[ 2586, "cuj" ],
-[ 2587, "cuk" ],
-[ 2588, "cul" ],
-[ 2589, "cum" ],
-[ 2590, "cun" ],
-[ 2591, "cuo" ],
-[ 2592, "cup" ],
-[ 2593, "cuq" ],
-[ 2594, "cur" ],
-[ 2595, "cus" ],
-[ 2596, "cut" ],
-[ 2597, "cuu" ],
-[ 2598, "cuv" ],
-[ 2599, "cuw" ],
-[ 2600, "cux" ],
-[ 2601, "cuy" ],
-[ 2602, "cuz" ],
-[ 2603, "cva" ],
-[ 2604, "cvb" ],
-[ 2605, "cvc" ],
-[ 2606, "cvd" ],
-[ 2607, "cve" ],
-[ 2608, "cvf" ],
-[ 2609, "cvg" ],
-[ 2610, "cvh" ],
-[ 2611, "cvi" ],
-[ 2612, "cvj" ],
-[ 2613, "cvk" ],
-[ 2614, "cvl" ],
-[ 2615, "cvm" ],
-[ 2616, "cvn" ],
-[ 2617, "cvo" ],
-[ 2618, "cvp" ],
-[ 2619, "cvq" ],
-[ 2620, "cvr" ],
-[ 2621, "cvs" ],
-[ 2622, "cvt" ],
-[ 2623, "cvu" ],
-[ 2624, "cvv" ],
-[ 2625, "cvw" ],
-[ 2626, "cvx" ],
-[ 2627, "cvy" ],
-[ 2628, "cvz" ],
-[ 2629, "cwa" ],
-[ 2630, "cwb" ],
-[ 2631, "cwc" ],
-[ 2632, "cwd" ],
-[ 2633, "cwe" ],
-[ 2634, "cwf" ],
-[ 2635, "cwg" ],
-[ 2636, "cwh" ],
-[ 2637, "cwi" ],
-[ 2638, "cwj" ],
-[ 2639, "cwk" ],
-[ 2640, "cwl" ],
-[ 2641, "cwm" ],
-[ 2642, "cwn" ],
-[ 2643, "cwo" ],
-[ 2644, "cwp" ],
-[ 2645, "cwq" ],
-[ 2646, "cwr" ],
-[ 2647, "cws" ],
-[ 2648, "cwt" ],
-[ 2649, "cwu" ],
-[ 2650, "cwv" ],
-[ 2651, "cww" ],
-[ 2652, "cwx" ],
-[ 2653, "cwy" ],
-[ 2654, "cwz" ],
-[ 2655, "cxa" ],
-[ 2656, "cxb" ],
-[ 2657, "cxc" ],
-[ 2658, "cxd" ],
-[ 2659, "cxe" ],
-[ 2660, "cxf" ],
-[ 2661, "cxg" ],
-[ 2662, "cxh" ],
-[ 2663, "cxi" ],
-[ 2664, "cxj" ],
-[ 2665, "cxk" ],
-[ 2666, "cxl" ],
-[ 2667, "cxm" ],
-[ 2668, "cxn" ],
-[ 2669, "cxo" ],
-[ 2670, "cxp" ],
-[ 2671, "cxq" ],
-[ 2672, "cxr" ],
-[ 2673, "cxs" ],
-[ 2674, "cxt" ],
-[ 2675, "cxu" ],
-[ 2676, "cxv" ],
-[ 2677, "cxw" ],
-[ 2678, "cxx" ],
-[ 2679, "cxy" ],
-[ 2680, "cxz" ],
-[ 2681, "cya" ],
-[ 2682, "cyb" ],
-[ 2683, "cyc" ],
-[ 2684, "cyd" ],
-[ 2685, "cye" ],
-[ 2686, "cyf" ],
-[ 2687, "cyg" ],
-[ 2688, "cyh" ],
-[ 2689, "cyi" ],
-[ 2690, "cyj" ],
-[ 2691, "cyk" ],
-[ 2692, "cyl" ],
-[ 2693, "cym" ],
-[ 2694, "cyn" ],
-[ 2695, "cyo" ],
-[ 2696, "cyp" ],
-[ 2697, "cyq" ],
-[ 2698, "cyr" ],
-[ 2699, "cys" ],
-[ 2700, "cyt" ],
-[ 2701, "cyu" ],
-[ 2702, "cyv" ],
-[ 2703, "cyw" ],
-[ 2704, "cyx" ],
-[ 2705, "cyy" ],
-[ 2706, "cyz" ],
-[ 2707, "cza" ],
-[ 2708, "czb" ],
-[ 2709, "czc" ],
-[ 2710, "czd" ],
-[ 2711, "cze" ],
-[ 2712, "czf" ],
-[ 2713, "czg" ],
-[ 2714, "czh" ],
-[ 2715, "czi" ],
-[ 2716, "czj" ],
-[ 2717, "czk" ],
-[ 2718, "czl" ],
-[ 2719, "czm" ],
-[ 2720, "czn" ],
-[ 2721, "czo" ],
-[ 2722, "czp" ],
-[ 2723, "czq" ],
-[ 2724, "czr" ],
-[ 2725, "czs" ],
-[ 2726, "czt" ],
-[ 2727, "czu" ],
-[ 2728, "czv" ],
-[ 2729, "czw" ],
-[ 2730, "czx" ],
-[ 2731, "czy" ],
-[ 2732, "czz" ],
-[ 2733, "daa" ],
-[ 2734, "dab" ],
-[ 2735, "dac" ],
-[ 2736, "dad" ],
-[ 2737, "dae" ],
-[ 2738, "daf" ],
-[ 2739, "dag" ],
-[ 2740, "dah" ],
-[ 2741, "dai" ],
-[ 2742, "daj" ],
-[ 2743, "dak" ],
-[ 2744, "dal" ],
-[ 2745, "dam" ],
-[ 2746, "dan" ],
-[ 2747, "dao" ],
-[ 2748, "dap" ],
-[ 2749, "daq" ],
-[ 2750, "dar" ],
-[ 2751, "das" ],
-[ 2752, "dat" ],
-[ 2753, "dau" ],
-[ 2754, "dav" ],
-[ 2755, "daw" ],
-[ 2756, "dax" ],
-[ 2757, "day" ],
-[ 2758, "daz" ],
-[ 2759, "dba" ],
-[ 2760, "dbb" ],
-[ 2761, "dbc" ],
-[ 2762, "dbd" ],
-[ 2763, "dbe" ],
-[ 2764, "dbf" ],
-[ 2765, "dbg" ],
-[ 2766, "dbh" ],
-[ 2767, "dbi" ],
-[ 2768, "dbj" ],
-[ 2769, "dbk" ],
-[ 2770, "dbl" ],
-[ 2771, "dbm" ],
-[ 2772, "dbn" ],
-[ 2773, "dbo" ],
-[ 2774, "dbp" ],
-[ 2775, "dbq" ],
-[ 2776, "dbr" ],
-[ 2777, "dbs" ],
-[ 2778, "dbt" ],
-[ 2779, "dbu" ],
-[ 2780, "dbv" ],
-[ 2781, "dbw" ],
-[ 2782, "dbx" ],
-[ 2783, "dby" ],
-[ 2784, "dbz" ],
-[ 2785, "dca" ],
-[ 2786, "dcb" ],
-[ 2787, "dcc" ],
-[ 2788, "dcd" ],
-[ 2789, "dce" ],
-[ 2790, "dcf" ],
-[ 2791, "dcg" ],
-[ 2792, "dch" ],
-[ 2793, "dci" ],
-[ 2794, "dcj" ],
-[ 2795, "dck" ],
-[ 2796, "dcl" ],
-[ 2797, "dcm" ],
-[ 2798, "dcn" ],
-[ 2799, "dco" ],
-[ 2800, "dcp" ],
-[ 2801, "dcq" ],
-[ 2802, "dcr" ],
-[ 2803, "dcs" ],
-[ 2804, "dct" ],
-[ 2805, "dcu" ],
-[ 2806, "dcv" ],
-[ 2807, "dcw" ],
-[ 2808, "dcx" ],
-[ 2809, "dcy" ],
-[ 2810, "dcz" ],
-[ 2811, "dda" ],
-[ 2812, "ddb" ],
-[ 2813, "ddc" ],
-[ 2814, "ddd" ],
-[ 2815, "dde" ],
-[ 2816, "ddf" ],
-[ 2817, "ddg" ],
-[ 2818, "ddh" ],
-[ 2819, "ddi" ],
-[ 2820, "ddj" ],
-[ 2821, "ddk" ],
-[ 2822, "ddl" ],
-[ 2823, "ddm" ],
-[ 2824, "ddn" ],
-[ 2825, "ddo" ],
-[ 2826, "ddp" ],
-[ 2827, "ddq" ],
-[ 2828, "ddr" ],
-[ 2829, "dds" ],
-[ 2830, "ddt" ],
-[ 2831, "ddu" ],
-[ 2832, "ddv" ],
-[ 2833, "ddw" ],
-[ 2834, "ddx" ],
-[ 2835, "ddy" ],
-[ 2836, "ddz" ],
-[ 2837, "dea" ],
-[ 2838, "deb" ],
-[ 2839, "dec" ],
-[ 2840, "ded" ],
-[ 2841, "dee" ],
-[ 2842, "def" ],
-[ 2843, "deg" ],
-[ 2844, "deh" ],
-[ 2845, "dei" ],
-[ 2846, "dej" ],
-[ 2847, "dek" ],
-[ 2848, "del" ],
-[ 2849, "dem" ],
-[ 2850, "den" ],
-[ 2851, "deo" ],
-[ 2852, "dep" ],
-[ 2853, "deq" ],
-[ 2854, "der" ],
-[ 2855, "des" ],
-[ 2856, "det" ],
-[ 2857, "deu" ],
-[ 2858, "dev" ],
-[ 2859, "dew" ],
-[ 2860, "dex" ],
-[ 2861, "dey" ],
-[ 2862, "dez" ],
-[ 2863, "dfa" ],
-[ 2864, "dfb" ],
-[ 2865, "dfc" ],
-[ 2866, "dfd" ],
-[ 2867, "dfe" ],
-[ 2868, "dff" ],
-[ 2869, "dfg" ],
-[ 2870, "dfh" ],
-[ 2871, "dfi" ],
-[ 2872, "dfj" ],
-[ 2873, "dfk" ],
-[ 2874, "dfl" ],
-[ 2875, "dfm" ],
-[ 2876, "dfn" ],
-[ 2877, "dfo" ],
-[ 2878, "dfp" ],
-[ 2879, "dfq" ],
-[ 2880, "dfr" ],
-[ 2881, "dfs" ],
-[ 2882, "dft" ],
-[ 2883, "dfu" ],
-[ 2884, "dfv" ],
-[ 2885, "dfw" ],
-[ 2886, "dfx" ],
-[ 2887, "dfy" ],
-[ 2888, "dfz" ],
-[ 2889, "dga" ],
-[ 2890, "dgb" ],
-[ 2891, "dgc" ],
-[ 2892, "dgd" ],
-[ 2893, "dge" ],
-[ 2894, "dgf" ],
-[ 2895, "dgg" ],
-[ 2896, "dgh" ],
-[ 2897, "dgi" ],
-[ 2898, "dgj" ],
-[ 2899, "dgk" ],
-[ 2900, "dgl" ],
-[ 2901, "dgm" ],
-[ 2902, "dgn" ],
-[ 2903, "dgo" ],
-[ 2904, "dgp" ],
-[ 2905, "dgq" ],
-[ 2906, "dgr" ],
-[ 2907, "dgs" ],
-[ 2908, "dgt" ],
-[ 2909, "dgu" ],
-[ 2910, "dgv" ],
-[ 2911, "dgw" ],
-[ 2912, "dgx" ],
-[ 2913, "dgy" ],
-[ 2914, "dgz" ],
-[ 2915, "dha" ],
-[ 2916, "dhb" ],
-[ 2917, "dhc" ],
-[ 2918, "dhd" ],
-[ 2919, "dhe" ],
-[ 2920, "dhf" ],
-[ 2921, "dhg" ],
-[ 2922, "dhh" ],
-[ 2923, "dhi" ],
-[ 2924, "dhj" ],
-[ 2925, "dhk" ],
-[ 2926, "dhl" ],
-[ 2927, "dhm" ],
-[ 2928, "dhn" ],
-[ 2929, "dho" ],
-[ 2930, "dhp" ],
-[ 2931, "dhq" ],
-[ 2932, "dhr" ],
-[ 2933, "dhs" ],
-[ 2934, "dht" ],
-[ 2935, "dhu" ],
-[ 2936, "dhv" ],
-[ 2937, "dhw" ],
-[ 2938, "dhx" ],
-[ 2939, "dhy" ],
-[ 2940, "dhz" ],
-[ 2941, "dia" ],
-[ 2942, "dib" ],
-[ 2943, "dic" ],
-[ 2944, "did" ],
-[ 2945, "die" ],
-[ 2946, "dif" ],
-[ 2947, "dig" ],
-[ 2948, "dih" ],
-[ 2949, "dii" ],
-[ 2950, "dij" ],
-[ 2951, "dik" ],
-[ 2952, "dil" ],
-[ 2953, "dim" ],
-[ 2954, "din" ],
-[ 2955, "dio" ],
-[ 2956, "dip" ],
-[ 2957, "diq" ],
-[ 2958, "dir" ],
-[ 2959, "dis" ],
-[ 2960, "dit" ],
-[ 2961, "diu" ],
-[ 2962, "div" ],
-[ 2963, "diw" ],
-[ 2964, "dix" ],
-[ 2965, "diy" ],
-[ 2966, "diz" ],
-[ 2967, "dja" ],
-[ 2968, "djb" ],
-[ 2969, "djc" ],
-[ 2970, "djd" ],
-[ 2971, "dje" ],
-[ 2972, "djf" ],
-[ 2973, "djg" ],
-[ 2974, "djh" ],
-[ 2975, "dji" ],
-[ 2976, "djj" ],
-[ 2977, "djk" ],
-[ 2978, "djl" ],
-[ 2979, "djm" ],
-[ 2980, "djn" ],
-[ 2981, "djo" ],
-[ 2982, "djp" ],
-[ 2983, "djq" ],
-[ 2984, "djr" ],
-[ 2985, "djs" ],
-[ 2986, "djt" ],
-[ 2987, "dju" ],
-[ 2988, "djv" ],
-[ 2989, "djw" ],
-[ 2990, "djx" ],
-[ 2991, "djy" ],
-[ 2992, "djz" ],
-[ 2993, "dka" ],
-[ 2994, "dkb" ],
-[ 2995, "dkc" ],
-[ 2996, "dkd" ],
-[ 2997, "dke" ],
-[ 2998, "dkf" ],
-[ 2999, "dkg" ],
-[ 3000, "dkh" ],
-[ 3001, "dki" ],
-[ 3002, "dkj" ],
-[ 3003, "dkk" ],
-[ 3004, "dkl" ],
-[ 3005, "dkm" ],
-[ 3006, "dkn" ],
-[ 3007, "dko" ],
-[ 3008, "dkp" ],
-[ 3009, "dkq" ],
-[ 3010, "dkr" ],
-[ 3011, "dks" ],
-[ 3012, "dkt" ],
-[ 3013, "dku" ],
-[ 3014, "dkv" ],
-[ 3015, "dkw" ],
-[ 3016, "dkx" ],
-[ 3017, "dky" ],
-[ 3018, "dkz" ],
-[ 3019, "dla" ],
-[ 3020, "dlb" ],
-[ 3021, "dlc" ],
-[ 3022, "dld" ],
-[ 3023, "dle" ],
-[ 3024, "dlf" ],
-[ 3025, "dlg" ],
-[ 3026, "dlh" ],
-[ 3027, "dli" ],
-[ 3028, "dlj" ],
-[ 3029, "dlk" ],
-[ 3030, "dll" ],
-[ 3031, "dlm" ],
-[ 3032, "dln" ],
-[ 3033, "dlo" ],
-[ 3034, "dlp" ],
-[ 3035, "dlq" ],
-[ 3036, "dlr" ],
-[ 3037, "dls" ],
-[ 3038, "dlt" ],
-[ 3039, "dlu" ],
-[ 3040, "dlv" ],
-[ 3041, "dlw" ],
-[ 3042, "dlx" ],
-[ 3043, "dly" ],
-[ 3044, "dlz" ],
-[ 3045, "dma" ],
-[ 3046, "dmb" ],
-[ 3047, "dmc" ],
-[ 3048, "dmd" ],
-[ 3049, "dme" ],
-[ 3050, "dmf" ],
-[ 3051, "dmg" ],
-[ 3052, "dmh" ],
-[ 3053, "dmi" ],
-[ 3054, "dmj" ],
-[ 3055, "dmk" ],
-[ 3056, "dml" ],
-[ 3057, "dmm" ],
-[ 3058, "dmn" ],
-[ 3059, "dmo" ],
-[ 3060, "dmp" ],
-[ 3061, "dmq" ],
-[ 3062, "dmr" ],
-[ 3063, "dms" ],
-[ 3064, "dmt" ],
-[ 3065, "dmu" ],
-[ 3066, "dmv" ],
-[ 3067, "dmw" ],
-[ 3068, "dmx" ],
-[ 3069, "dmy" ],
-[ 3070, "dmz" ],
-[ 3071, "dna" ],
-[ 3072, "dnb" ],
-[ 3073, "dnc" ],
-[ 3074, "dnd" ],
-[ 3075, "dne" ],
-[ 3076, "dnf" ],
-[ 3077, "dng" ],
-[ 3078, "dnh" ],
-[ 3079, "dni" ],
-[ 3080, "dnj" ],
-[ 3081, "dnk" ],
-[ 3082, "dnl" ],
-[ 3083, "dnm" ],
-[ 3084, "dnn" ],
-[ 3085, "dno" ],
-[ 3086, "dnp" ],
-[ 3087, "dnq" ],
-[ 3088, "dnr" ],
-[ 3089, "dns" ],
-[ 3090, "dnt" ],
-[ 3091, "dnu" ],
-[ 3092, "dnv" ],
-[ 3093, "dnw" ],
-[ 3094, "dnx" ],
-[ 3095, "dny" ],
-[ 3096, "dnz" ],
-[ 3097, "doa" ],
-[ 3098, "dob" ],
-[ 3099, "doc" ],
-[ 3100, "dod" ],
-[ 3101, "doe" ],
-[ 3102, "dof" ],
-[ 3103, "dog" ],
-[ 3104, "doh" ],
-[ 3105, "doi" ],
-[ 3106, "doj" ],
-[ 3107, "dok" ],
-[ 3108, "dol" ],
-[ 3109, "dom" ],
-[ 3110, "don" ],
-[ 3111, "doo" ],
-[ 3112, "dop" ],
-[ 3113, "doq" ],
-[ 3114, "dor" ],
-[ 3115, "dos" ],
-[ 3116, "dot" ],
-[ 3117, "dou" ],
-[ 3118, "dov" ],
-[ 3119, "dow" ],
-[ 3120, "dox" ],
-[ 3121, "doy" ],
-[ 3122, "doz" ],
-[ 3123, "dpa" ],
-[ 3124, "dpb" ],
-[ 3125, "dpc" ],
-[ 3126, "dpd" ],
-[ 3127, "dpe" ],
-[ 3128, "dpf" ],
-[ 3129, "dpg" ],
-[ 3130, "dph" ],
-[ 3131, "dpi" ],
-[ 3132, "dpj" ],
-[ 3133, "dpk" ],
-[ 3134, "dpl" ],
-[ 3135, "dpm" ],
-[ 3136, "dpn" ],
-[ 3137, "dpo" ],
-[ 3138, "dpp" ],
-[ 3139, "dpq" ],
-[ 3140, "dpr" ],
-[ 3141, "dps" ],
-[ 3142, "dpt" ],
-[ 3143, "dpu" ],
-[ 3144, "dpv" ],
-[ 3145, "dpw" ],
-[ 3146, "dpx" ],
-[ 3147, "dpy" ],
-[ 3148, "dpz" ],
-[ 3149, "dqa" ],
-[ 3150, "dqb" ],
-[ 3151, "dqc" ],
-[ 3152, "dqd" ],
-[ 3153, "dqe" ],
-[ 3154, "dqf" ],
-[ 3155, "dqg" ],
-[ 3156, "dqh" ],
-[ 3157, "dqi" ],
-[ 3158, "dqj" ],
-[ 3159, "dqk" ],
-[ 3160, "dql" ],
-[ 3161, "dqm" ],
-[ 3162, "dqn" ],
-[ 3163, "dqo" ],
-[ 3164, "dqp" ],
-[ 3165, "dqq" ],
-[ 3166, "dqr" ],
-[ 3167, "dqs" ],
-[ 3168, "dqt" ],
-[ 3169, "dqu" ],
-[ 3170, "dqv" ],
-[ 3171, "dqw" ],
-[ 3172, "dqx" ],
-[ 3173, "dqy" ],
-[ 3174, "dqz" ],
-[ 3175, "dra" ],
-[ 3176, "drb" ],
-[ 3177, "drc" ],
-[ 3178, "drd" ],
-[ 3179, "dre" ],
-[ 3180, "drf" ],
-[ 3181, "drg" ],
-[ 3182, "drh" ],
-[ 3183, "dri" ],
-[ 3184, "drj" ],
-[ 3185, "drk" ],
-[ 3186, "drl" ],
-[ 3187, "drm" ],
-[ 3188, "drn" ],
-[ 3189, "dro" ],
-[ 3190, "drp" ],
-[ 3191, "drq" ],
-[ 3192, "drr" ],
-[ 3193, "drs" ],
-[ 3194, "drt" ],
-[ 3195, "dru" ],
-[ 3196, "drv" ],
-[ 3197, "drw" ],
-[ 3198, "drx" ],
-[ 3199, "dry" ],
-[ 3200, "drz" ],
-[ 3201, "dsa" ],
-[ 3202, "dsb" ],
-[ 3203, "dsc" ],
-[ 3204, "dsd" ],
-[ 3205, "dse" ],
-[ 3206, "dsf" ],
-[ 3207, "dsg" ],
-[ 3208, "dsh" ],
-[ 3209, "dsi" ],
-[ 3210, "dsj" ],
-[ 3211, "dsk" ],
-[ 3212, "dsl" ],
-[ 3213, "dsm" ],
-[ 3214, "dsn" ],
-[ 3215, "dso" ],
-[ 3216, "dsp" ],
-[ 3217, "dsq" ],
-[ 3218, "dsr" ],
-[ 3219, "dss" ],
-[ 3220, "dst" ],
-[ 3221, "dsu" ],
-[ 3222, "dsv" ],
-[ 3223, "dsw" ],
-[ 3224, "dsx" ],
-[ 3225, "dsy" ],
-[ 3226, "dsz" ],
-[ 3227, "dta" ],
-[ 3228, "dtb" ],
-[ 3229, "dtc" ],
-[ 3230, "dtd" ],
-[ 3231, "dte" ],
-[ 3232, "dtf" ],
-[ 3233, "dtg" ],
-[ 3234, "dth" ],
-[ 3235, "dti" ],
-[ 3236, "dtj" ],
-[ 3237, "dtk" ],
-[ 3238, "dtl" ],
-[ 3239, "dtm" ],
-[ 3240, "dtn" ],
-[ 3241, "dto" ],
-[ 3242, "dtp" ],
-[ 3243, "dtq" ],
-[ 3244, "dtr" ],
-[ 3245, "dts" ],
-[ 3246, "dtt" ],
-[ 3247, "dtu" ],
-[ 3248, "dtv" ],
-[ 3249, "dtw" ],
-[ 3250, "dtx" ],
-[ 3251, "dty" ],
-[ 3252, "dtz" ],
-[ 3253, "dua" ],
-[ 3254, "dub" ],
-[ 3255, "duc" ],
-[ 3256, "dud" ],
-[ 3257, "due" ],
-[ 3258, "duf" ],
-[ 3259, "dug" ],
-[ 3260, "duh" ],
-[ 3261, "dui" ],
-[ 3262, "duj" ],
-[ 3263, "duk" ],
-[ 3264, "dul" ],
-[ 3265, "dum" ],
-[ 3266, "dun" ],
-[ 3267, "duo" ],
-[ 3268, "dup" ],
-[ 3269, "duq" ],
-[ 3270, "dur" ],
-[ 3271, "dus" ],
-[ 3272, "dut" ],
-[ 3273, "duu" ],
-[ 3274, "duv" ],
-[ 3275, "duw" ],
-[ 3276, "dux" ],
-[ 3277, "duy" ],
-[ 3278, "duz" ],
-[ 3279, "dva" ],
-[ 3280, "dvb" ],
-[ 3281, "dvc" ],
-[ 3282, "dvd" ],
-[ 3283, "dve" ],
-[ 3284, "dvf" ],
-[ 3285, "dvg" ],
-[ 3286, "dvh" ],
-[ 3287, "dvi" ],
-[ 3288, "dvj" ],
-[ 3289, "dvk" ],
-[ 3290, "dvl" ],
-[ 3291, "dvm" ],
-[ 3292, "dvn" ],
-[ 3293, "dvo" ],
-[ 3294, "dvp" ],
-[ 3295, "dvq" ],
-[ 3296, "dvr" ],
-[ 3297, "dvs" ],
-[ 3298, "dvt" ],
-[ 3299, "dvu" ],
-[ 3300, "dvv" ],
-[ 3301, "dvw" ],
-[ 3302, "dvx" ],
-[ 3303, "dvy" ],
-[ 3304, "dvz" ],
-[ 3305, "dwa" ],
-[ 3306, "dwb" ],
-[ 3307, "dwc" ],
-[ 3308, "dwd" ],
-[ 3309, "dwe" ],
-[ 3310, "dwf" ],
-[ 3311, "dwg" ],
-[ 3312, "dwh" ],
-[ 3313, "dwi" ],
-[ 3314, "dwj" ],
-[ 3315, "dwk" ],
-[ 3316, "dwl" ],
-[ 3317, "dwm" ],
-[ 3318, "dwn" ],
-[ 3319, "dwo" ],
-[ 3320, "dwp" ],
-[ 3321, "dwq" ],
-[ 3322, "dwr" ],
-[ 3323, "dws" ],
-[ 3324, "dwt" ],
-[ 3325, "dwu" ],
-[ 3326, "dwv" ],
-[ 3327, "dww" ],
-[ 3328, "dwx" ],
-[ 3329, "dwy" ],
-[ 3330, "dwz" ],
-[ 3331, "dxa" ],
-[ 3332, "dxb" ],
-[ 3333, "dxc" ],
-[ 3334, "dxd" ],
-[ 3335, "dxe" ],
-[ 3336, "dxf" ],
-[ 3337, "dxg" ],
-[ 3338, "dxh" ],
-[ 3339, "dxi" ],
-[ 3340, "dxj" ],
-[ 3341, "dxk" ],
-[ 3342, "dxl" ],
-[ 3343, "dxm" ],
-[ 3344, "dxn" ],
-[ 3345, "dxo" ],
-[ 3346, "dxp" ],
-[ 3347, "dxq" ],
-[ 3348, "dxr" ],
-[ 3349, "dxs" ],
-[ 3350, "dxt" ],
-[ 3351, "dxu" ],
-[ 3352, "dxv" ],
-[ 3353, "dxw" ],
-[ 3354, "dxx" ],
-[ 3355, "dxy" ],
-[ 3356, "dxz" ],
-[ 3357, "dya" ],
-[ 3358, "dyb" ],
-[ 3359, "dyc" ],
-[ 3360, "dyd" ],
-[ 3361, "dye" ],
-[ 3362, "dyf" ],
-[ 3363, "dyg" ],
-[ 3364, "dyh" ],
-[ 3365, "dyi" ],
-[ 3366, "dyj" ],
-[ 3367, "dyk" ],
-[ 3368, "dyl" ],
-[ 3369, "dym" ],
-[ 3370, "dyn" ],
-[ 3371, "dyo" ],
-[ 3372, "dyp" ],
-[ 3373, "dyq" ],
-[ 3374, "dyr" ],
-[ 3375, "dys" ],
-[ 3376, "dyt" ],
-[ 3377, "dyu" ],
-[ 3378, "dyv" ],
-[ 3379, "dyw" ],
-[ 3380, "dyx" ],
-[ 3381, "dyy" ],
-[ 3382, "dyz" ],
-[ 3383, "dza" ],
-[ 3384, "dzb" ],
-[ 3385, "dzc" ],
-[ 3386, "dzd" ],
-[ 3387, "dze" ],
-[ 3388, "dzf" ],
-[ 3389, "dzg" ],
-[ 3390, "dzh" ],
-[ 3391, "dzi" ],
-[ 3392, "dzj" ],
-[ 3393, "dzk" ],
-[ 3394, "dzl" ],
-[ 3395, "dzm" ],
-[ 3396, "dzn" ],
-[ 3397, "dzo" ],
-[ 3398, "dzp" ],
-[ 3399, "dzq" ],
-[ 3400, "dzr" ],
-[ 3401, "dzs" ],
-[ 3402, "dzt" ],
-[ 3403, "dzu" ],
-[ 3404, "dzv" ],
-[ 3405, "dzw" ],
-[ 3406, "dzx" ],
-[ 3407, "dzy" ],
-[ 3408, "dzz" ],
-[ 3409, "eaa" ],
-[ 3410, "eab" ],
-[ 3411, "eac" ],
-[ 3412, "ead" ],
-[ 3413, "eae" ],
-[ 3414, "eaf" ],
-[ 3415, "eag" ],
-[ 3416, "eah" ],
-[ 3417, "eai" ],
-[ 3418, "eaj" ],
-[ 3419, "eak" ],
-[ 3420, "eal" ],
-[ 3421, "eam" ],
-[ 3422, "ean" ],
-[ 3423, "eao" ],
-[ 3424, "eap" ],
-[ 3425, "eaq" ],
-[ 3426, "ear" ],
-[ 3427, "eas" ],
-[ 3428, "eat" ],
-[ 3429, "eau" ],
-[ 3430, "eav" ],
-[ 3431, "eaw" ],
-[ 3432, "eax" ],
-[ 3433, "eay" ],
-[ 3434, "eaz" ],
-[ 3435, "eba" ],
-[ 3436, "ebb" ],
-[ 3437, "ebc" ],
-[ 3438, "ebd" ],
-[ 3439, "ebe" ],
-[ 3440, "ebf" ],
-[ 3441, "ebg" ],
-[ 3442, "ebh" ],
-[ 3443, "ebi" ],
-[ 3444, "ebj" ],
-[ 3445, "ebk" ],
-[ 3446, "ebl" ],
-[ 3447, "ebm" ],
-[ 3448, "ebn" ],
-[ 3449, "ebo" ],
-[ 3450, "ebp" ],
-[ 3451, "ebq" ],
-[ 3452, "ebr" ],
-[ 3453, "ebs" ],
-[ 3454, "ebt" ],
-[ 3455, "ebu" ],
-[ 3456, "ebv" ],
-[ 3457, "ebw" ],
-[ 3458, "ebx" ],
-[ 3459, "eby" ],
-[ 3460, "ebz" ],
-[ 3461, "eca" ],
-[ 3462, "ecb" ],
-[ 3463, "ecc" ],
-[ 3464, "ecd" ],
-[ 3465, "ece" ],
-[ 3466, "ecf" ],
-[ 3467, "ecg" ],
-[ 3468, "ech" ],
-[ 3469, "eci" ],
-[ 3470, "ecj" ],
-[ 3471, "eck" ],
-[ 3472, "ecl" ],
-[ 3473, "ecm" ],
-[ 3474, "ecn" ],
-[ 3475, "eco" ],
-[ 3476, "ecp" ],
-[ 3477, "ecq" ],
-[ 3478, "ecr" ],
-[ 3479, "ecs" ],
-[ 3480, "ect" ],
-[ 3481, "ecu" ],
-[ 3482, "ecv" ],
-[ 3483, "ecw" ],
-[ 3484, "ecx" ],
-[ 3485, "ecy" ],
-[ 3486, "ecz" ],
-[ 3487, "eda" ],
-[ 3488, "edb" ],
-[ 3489, "edc" ],
-[ 3490, "edd" ],
-[ 3491, "ede" ],
-[ 3492, "edf" ],
-[ 3493, "edg" ],
-[ 3494, "edh" ],
-[ 3495, "edi" ],
-[ 3496, "edj" ],
-[ 3497, "edk" ],
-[ 3498, "edl" ],
-[ 3499, "edm" ],
-[ 3500, "edn" ],
-[ 3501, "edo" ],
-[ 3502, "edp" ],
-[ 3503, "edq" ],
-[ 3504, "edr" ],
-[ 3505, "eds" ],
-[ 3506, "edt" ],
-[ 3507, "edu" ],
-[ 3508, "edv" ],
-[ 3509, "edw" ],
-[ 3510, "edx" ],
-[ 3511, "edy" ],
-[ 3512, "edz" ],
-[ 3513, "eea" ],
-[ 3514, "eeb" ],
-[ 3515, "eec" ],
-[ 3516, "eed" ],
-[ 3517, "eee" ],
-[ 3518, "eef" ],
-[ 3519, "eeg" ],
-[ 3520, "eeh" ],
-[ 3521, "eei" ],
-[ 3522, "eej" ],
-[ 3523, "eek" ],
-[ 3524, "eel" ],
-[ 3525, "eem" ],
-[ 3526, "een" ],
-[ 3527, "eeo" ],
-[ 3528, "eep" ],
-[ 3529, "eeq" ],
-[ 3530, "eer" ],
-[ 3531, "ees" ],
-[ 3532, "eet" ],
-[ 3533, "eeu" ],
-[ 3534, "eev" ],
-[ 3535, "eew" ],
-[ 3536, "eex" ],
-[ 3537, "eey" ],
-[ 3538, "eez" ],
-[ 3539, "efa" ],
-[ 3540, "efb" ],
-[ 3541, "efc" ],
-[ 3542, "efd" ],
-[ 3543, "efe" ],
-[ 3544, "eff" ],
-[ 3545, "efg" ],
-[ 3546, "efh" ],
-[ 3547, "efi" ],
-[ 3548, "efj" ],
-[ 3549, "efk" ],
-[ 3550, "efl" ],
-[ 3551, "efm" ],
-[ 3552, "efn" ],
-[ 3553, "efo" ],
-[ 3554, "efp" ],
-[ 3555, "efq" ],
-[ 3556, "efr" ],
-[ 3557, "efs" ],
-[ 3558, "eft" ],
-[ 3559, "efu" ],
-[ 3560, "efv" ],
-[ 3561, "efw" ],
-[ 3562, "efx" ],
-[ 3563, "efy" ],
-[ 3564, "efz" ],
-[ 3565, "ega" ],
-[ 3566, "egb" ],
-[ 3567, "egc" ],
-[ 3568, "egd" ],
-[ 3569, "ege" ],
-[ 3570, "egf" ],
-[ 3571, "egg" ],
-[ 3572, "egh" ],
-[ 3573, "egi" ],
-[ 3574, "egj" ],
-[ 3575, "egk" ],
-[ 3576, "egl" ],
-[ 3577, "egm" ],
-[ 3578, "egn" ],
-[ 3579, "ego" ],
-[ 3580, "egp" ],
-[ 3581, "egq" ],
-[ 3582, "egr" ],
-[ 3583, "egs" ],
-[ 3584, "egt" ],
-[ 3585, "egu" ],
-[ 3586, "egv" ],
-[ 3587, "egw" ],
-[ 3588, "egx" ],
-[ 3589, "egy" ],
-[ 3590, "egz" ],
-[ 3591, "eha" ],
-[ 3592, "ehb" ],
-[ 3593, "ehc" ],
-[ 3594, "ehd" ],
-[ 3595, "ehe" ],
-[ 3596, "ehf" ],
-[ 3597, "ehg" ],
-[ 3598, "ehh" ],
-[ 3599, "ehi" ],
-[ 3600, "ehj" ],
-[ 3601, "ehk" ],
-[ 3602, "ehl" ],
-[ 3603, "ehm" ],
-[ 3604, "ehn" ],
-[ 3605, "eho" ],
-[ 3606, "ehp" ],
-[ 3607, "ehq" ],
-[ 3608, "ehr" ],
-[ 3609, "ehs" ],
-[ 3610, "eht" ],
-[ 3611, "ehu" ],
-[ 3612, "ehv" ],
-[ 3613, "ehw" ],
-[ 3614, "ehx" ],
-[ 3615, "ehy" ],
-[ 3616, "ehz" ],
-[ 3617, "eia" ],
-[ 3618, "eib" ],
-[ 3619, "eic" ],
-[ 3620, "eid" ],
-[ 3621, "eie" ],
-[ 3622, "eif" ],
-[ 3623, "eig" ],
-[ 3624, "eih" ],
-[ 3625, "eii" ],
-[ 3626, "eij" ],
-[ 3627, "eik" ],
-[ 3628, "eil" ],
-[ 3629, "eim" ],
-[ 3630, "ein" ],
-[ 3631, "eio" ],
-[ 3632, "eip" ],
-[ 3633, "eiq" ],
-[ 3634, "eir" ],
-[ 3635, "eis" ],
-[ 3636, "eit" ],
-[ 3637, "eiu" ],
-[ 3638, "eiv" ],
-[ 3639, "eiw" ],
-[ 3640, "eix" ],
-[ 3641, "eiy" ],
-[ 3642, "eiz" ],
-[ 3643, "eja" ],
-[ 3644, "ejb" ],
-[ 3645, "ejc" ],
-[ 3646, "ejd" ],
-[ 3647, "eje" ],
-[ 3648, "ejf" ],
-[ 3649, "ejg" ],
-[ 3650, "ejh" ],
-[ 3651, "eji" ],
-[ 3652, "ejj" ],
-[ 3653, "ejk" ],
-[ 3654, "ejl" ],
-[ 3655, "ejm" ],
-[ 3656, "ejn" ],
-[ 3657, "ejo" ],
-[ 3658, "ejp" ],
-[ 3659, "ejq" ],
-[ 3660, "ejr" ],
-[ 3661, "ejs" ],
-[ 3662, "ejt" ],
-[ 3663, "eju" ],
-[ 3664, "ejv" ],
-[ 3665, "ejw" ],
-[ 3666, "ejx" ],
-[ 3667, "ejy" ],
-[ 3668, "ejz" ],
-[ 3669, "eka" ],
-[ 3670, "ekb" ],
-[ 3671, "ekc" ],
-[ 3672, "ekd" ],
-[ 3673, "eke" ],
-[ 3674, "ekf" ],
-[ 3675, "ekg" ],
-[ 3676, "ekh" ],
-[ 3677, "eki" ],
-[ 3678, "ekj" ],
-[ 3679, "ekk" ],
-[ 3680, "ekl" ],
-[ 3681, "ekm" ],
-[ 3682, "ekn" ],
-[ 3683, "eko" ],
-[ 3684, "ekp" ],
-[ 3685, "ekq" ],
-[ 3686, "ekr" ],
-[ 3687, "eks" ],
-[ 3688, "ekt" ],
-[ 3689, "eku" ],
-[ 3690, "ekv" ],
-[ 3691, "ekw" ],
-[ 3692, "ekx" ],
-[ 3693, "eky" ],
-[ 3694, "ekz" ],
-[ 3695, "ela" ],
-[ 3696, "elb" ],
-[ 3697, "elc" ],
-[ 3698, "eld" ],
-[ 3699, "ele" ],
-[ 3700, "elf" ],
-[ 3701, "elg" ],
-[ 3702, "elh" ],
-[ 3703, "eli" ],
-[ 3704, "elj" ],
-[ 3705, "elk" ],
-[ 3706, "ell" ],
-[ 3707, "elm" ],
-[ 3708, "eln" ],
-[ 3709, "elo" ],
-[ 3710, "elp" ],
-[ 3711, "elq" ],
-[ 3712, "elr" ],
-[ 3713, "els" ],
-[ 3714, "elt" ],
-[ 3715, "elu" ],
-[ 3716, "elv" ],
-[ 3717, "elw" ],
-[ 3718, "elx" ],
-[ 3719, "ely" ],
-[ 3720, "elz" ],
-[ 3721, "ema" ],
-[ 3722, "emb" ],
-[ 3723, "emc" ],
-[ 3724, "emd" ],
-[ 3725, "eme" ],
-[ 3726, "emf" ],
-[ 3727, "emg" ],
-[ 3728, "emh" ],
-[ 3729, "emi" ],
-[ 3730, "emj" ],
-[ 3731, "emk" ],
-[ 3732, "eml" ],
-[ 3733, "emm" ],
-[ 3734, "emn" ],
-[ 3735, "emo" ],
-[ 3736, "emp" ],
-[ 3737, "emq" ],
-[ 3738, "emr" ],
-[ 3739, "ems" ],
-[ 3740, "emt" ],
-[ 3741, "emu" ],
-[ 3742, "emv" ],
-[ 3743, "emw" ],
-[ 3744, "emx" ],
-[ 3745, "emy" ],
-[ 3746, "emz" ],
-[ 3747, "ena" ],
-[ 3748, "enb" ],
-[ 3749, "enc" ],
-[ 3750, "end" ],
-[ 3751, "ene" ],
-[ 3752, "enf" ],
-[ 3753, "eng" ],
-[ 3754, "enh" ],
-[ 3755, "eni" ],
-[ 3756, "enj" ],
-[ 3757, "enk" ],
-[ 3758, "enl" ],
-[ 3759, "enm" ],
-[ 3760, "enn" ],
-[ 3761, "eno" ],
-[ 3762, "enp" ],
-[ 3763, "enq" ],
-[ 3764, "enr" ],
-[ 3765, "ens" ],
-[ 3766, "ent" ],
-[ 3767, "enu" ],
-[ 3768, "env" ],
-[ 3769, "enw" ],
-[ 3770, "enx" ],
-[ 3771, "eny" ],
-[ 3772, "enz" ],
-[ 3773, "eoa" ],
-[ 3774, "eob" ],
-[ 3775, "eoc" ],
-[ 3776, "eod" ],
-[ 3777, "eoe" ],
-[ 3778, "eof" ],
-[ 3779, "eog" ],
-[ 3780, "eoh" ],
-[ 3781, "eoi" ],
-[ 3782, "eoj" ],
-[ 3783, "eok" ],
-[ 3784, "eol" ],
-[ 3785, "eom" ],
-[ 3786, "eon" ],
-[ 3787, "eoo" ],
-[ 3788, "eop" ],
-[ 3789, "eoq" ],
-[ 3790, "eor" ],
-[ 3791, "eos" ],
-[ 3792, "eot" ],
-[ 3793, "eou" ],
-[ 3794, "eov" ],
-[ 3795, "eow" ],
-[ 3796, "eox" ],
-[ 3797, "eoy" ],
-[ 3798, "eoz" ],
-[ 3799, "epa" ],
-[ 3800, "epb" ],
-[ 3801, "epc" ],
-[ 3802, "epd" ],
-[ 3803, "epe" ],
-[ 3804, "epf" ],
-[ 3805, "epg" ],
-[ 3806, "eph" ],
-[ 3807, "epi" ],
-[ 3808, "epj" ],
-[ 3809, "epk" ],
-[ 3810, "epl" ],
-[ 3811, "epm" ],
-[ 3812, "epn" ],
-[ 3813, "epo" ],
-[ 3814, "epp" ],
-[ 3815, "epq" ],
-[ 3816, "epr" ],
-[ 3817, "eps" ],
-[ 3818, "ept" ],
-[ 3819, "epu" ],
-[ 3820, "epv" ],
-[ 3821, "epw" ],
-[ 3822, "epx" ],
-[ 3823, "epy" ],
-[ 3824, "epz" ],
-[ 3825, "eqa" ],
-[ 3826, "eqb" ],
-[ 3827, "eqc" ],
-[ 3828, "eqd" ],
-[ 3829, "eqe" ],
-[ 3830, "eqf" ],
-[ 3831, "eqg" ],
-[ 3832, "eqh" ],
-[ 3833, "eqi" ],
-[ 3834, "eqj" ],
-[ 3835, "eqk" ],
-[ 3836, "eql" ],
-[ 3837, "eqm" ],
-[ 3838, "eqn" ],
-[ 3839, "eqo" ],
-[ 3840, "eqp" ],
-[ 3841, "eqq" ],
-[ 3842, "eqr" ],
-[ 3843, "eqs" ],
-[ 3844, "eqt" ],
-[ 3845, "equ" ],
-[ 3846, "eqv" ],
-[ 3847, "eqw" ],
-[ 3848, "eqx" ],
-[ 3849, "eqy" ],
-[ 3850, "eqz" ],
-[ 3851, "era" ],
-[ 3852, "erb" ],
-[ 3853, "erc" ],
-[ 3854, "erd" ],
-[ 3855, "ere" ],
-[ 3856, "erf" ],
-[ 3857, "erg" ],
-[ 3858, "erh" ],
-[ 3859, "eri" ],
-[ 3860, "erj" ],
-[ 3861, "erk" ],
-[ 3862, "erl" ],
-[ 3863, "erm" ],
-[ 3864, "ern" ],
-[ 3865, "ero" ],
-[ 3866, "erp" ],
-[ 3867, "erq" ],
-[ 3868, "err" ],
-[ 3869, "ers" ],
-[ 3870, "ert" ],
-[ 3871, "eru" ],
-[ 3872, "erv" ],
-[ 3873, "erw" ],
-[ 3874, "erx" ],
-[ 3875, "ery" ],
-[ 3876, "erz" ],
-[ 3877, "esa" ],
-[ 3878, "esb" ],
-[ 3879, "esc" ],
-[ 3880, "esd" ],
-[ 3881, "ese" ],
-[ 3882, "esf" ],
-[ 3883, "esg" ],
-[ 3884, "esh" ],
-[ 3885, "esi" ],
-[ 3886, "esj" ],
-[ 3887, "esk" ],
-[ 3888, "esl" ],
-[ 3889, "esm" ],
-[ 3890, "esn" ],
-[ 3891, "eso" ],
-[ 3892, "esp" ],
-[ 3893, "esq" ],
-[ 3894, "esr" ],
-[ 3895, "ess" ],
-[ 3896, "est" ],
-[ 3897, "esu" ],
-[ 3898, "esv" ],
-[ 3899, "esw" ],
-[ 3900, "esx" ],
-[ 3901, "esy" ],
-[ 3902, "esz" ],
-[ 3903, "eta" ],
-[ 3904, "etb" ],
-[ 3905, "etc" ],
-[ 3906, "etd" ],
-[ 3907, "ete" ],
-[ 3908, "etf" ],
-[ 3909, "etg" ],
-[ 3910, "eth" ],
-[ 3911, "eti" ],
-[ 3912, "etj" ],
-[ 3913, "etk" ],
-[ 3914, "etl" ],
-[ 3915, "etm" ],
-[ 3916, "etn" ],
-[ 3917, "eto" ],
-[ 3918, "etp" ],
-[ 3919, "etq" ],
-[ 3920, "etr" ],
-[ 3921, "ets" ],
-[ 3922, "ett" ],
-[ 3923, "etu" ],
-[ 3924, "etv" ],
-[ 3925, "etw" ],
-[ 3926, "etx" ],
-[ 3927, "ety" ],
-[ 3928, "etz" ],
-[ 3929, "eua" ],
-[ 3930, "eub" ],
-[ 3931, "euc" ],
-[ 3932, "eud" ],
-[ 3933, "eue" ],
-[ 3934, "euf" ],
-[ 3935, "eug" ],
-[ 3936, "euh" ],
-[ 3937, "eui" ],
-[ 3938, "euj" ],
-[ 3939, "euk" ],
-[ 3940, "eul" ],
-[ 3941, "eum" ],
-[ 3942, "eun" ],
-[ 3943, "euo" ],
-[ 3944, "eup" ],
-[ 3945, "euq" ],
-[ 3946, "eur" ],
-[ 3947, "eus" ],
-[ 3948, "eut" ],
-[ 3949, "euu" ],
-[ 3950, "euv" ],
-[ 3951, "euw" ],
-[ 3952, "eux" ],
-[ 3953, "euy" ],
-[ 3954, "euz" ],
-[ 3955, "eva" ],
-[ 3956, "evb" ],
-[ 3957, "evc" ],
-[ 3958, "evd" ],
-[ 3959, "eve" ],
-[ 3960, "evf" ],
-[ 3961, "evg" ],
-[ 3962, "evh" ],
-[ 3963, "evi" ],
-[ 3964, "evj" ],
-[ 3965, "evk" ],
-[ 3966, "evl" ],
-[ 3967, "evm" ],
-[ 3968, "evn" ],
-[ 3969, "evo" ],
-[ 3970, "evp" ],
-[ 3971, "evq" ],
-[ 3972, "evr" ],
-[ 3973, "evs" ],
-[ 3974, "evt" ],
-[ 3975, "evu" ],
-[ 3976, "evv" ],
-[ 3977, "evw" ],
-[ 3978, "evx" ],
-[ 3979, "evy" ],
-[ 3980, "evz" ],
-[ 3981, "ewa" ],
-[ 3982, "ewb" ],
-[ 3983, "ewc" ],
-[ 3984, "ewd" ],
-[ 3985, "ewe" ],
-[ 3986, "ewf" ],
-[ 3987, "ewg" ],
-[ 3988, "ewh" ],
-[ 3989, "ewi" ],
-[ 3990, "ewj" ],
-[ 3991, "ewk" ],
-[ 3992, "ewl" ],
-[ 3993, "ewm" ],
-[ 3994, "ewn" ],
-[ 3995, "ewo" ],
-[ 3996, "ewp" ],
-[ 3997, "ewq" ],
-[ 3998, "ewr" ],
-[ 3999, "ews" ],
-[ 4000, "ewt" ],
-[ 4001, "ewu" ],
-[ 4002, "ewv" ],
-[ 4003, "eww" ],
-[ 4004, "ewx" ],
-[ 4005, "ewy" ],
-[ 4006, "ewz" ],
-[ 4007, "exa" ],
-[ 4008, "exb" ],
-[ 4009, "exc" ],
-[ 4010, "exd" ],
-[ 4011, "exe" ],
-[ 4012, "exf" ],
-[ 4013, "exg" ],
-[ 4014, "exh" ],
-[ 4015, "exi" ],
-[ 4016, "exj" ],
-[ 4017, "exk" ],
-[ 4018, "exl" ],
-[ 4019, "exm" ],
-[ 4020, "exn" ],
-[ 4021, "exo" ],
-[ 4022, "exp" ],
-[ 4023, "exq" ],
-[ 4024, "exr" ],
-[ 4025, "exs" ],
-[ 4026, "ext" ],
-[ 4027, "exu" ],
-[ 4028, "exv" ],
-[ 4029, "exw" ],
-[ 4030, "exx" ],
-[ 4031, "exy" ],
-[ 4032, "exz" ],
-[ 4033, "eya" ],
-[ 4034, "eyb" ],
-[ 4035, "eyc" ],
-[ 4036, "eyd" ],
-[ 4037, "eye" ],
-[ 4038, "eyf" ],
-[ 4039, "eyg" ],
-[ 4040, "eyh" ],
-[ 4041, "eyi" ],
-[ 4042, "eyj" ],
-[ 4043, "eyk" ],
-[ 4044, "eyl" ],
-[ 4045, "eym" ],
-[ 4046, "eyn" ],
-[ 4047, "eyo" ],
-[ 4048, "eyp" ],
-[ 4049, "eyq" ],
-[ 4050, "eyr" ],
-[ 4051, "eys" ],
-[ 4052, "eyt" ],
-[ 4053, "eyu" ],
-[ 4054, "eyv" ],
-[ 4055, "eyw" ],
-[ 4056, "eyx" ],
-[ 4057, "eyy" ],
-[ 4058, "eyz" ],
-[ 4059, "eza" ],
-[ 4060, "ezb" ],
-[ 4061, "ezc" ],
-[ 4062, "ezd" ],
-[ 4063, "eze" ],
-[ 4064, "ezf" ],
-[ 4065, "ezg" ],
-[ 4066, "ezh" ],
-[ 4067, "ezi" ],
-[ 4068, "ezj" ],
-[ 4069, "ezk" ],
-[ 4070, "ezl" ],
-[ 4071, "ezm" ],
-[ 4072, "ezn" ],
-[ 4073, "ezo" ],
-[ 4074, "ezp" ],
-[ 4075, "ezq" ],
-[ 4076, "ezr" ],
-[ 4077, "ezs" ],
-[ 4078, "ezt" ],
-[ 4079, "ezu" ],
-[ 4080, "ezv" ],
-[ 4081, "ezw" ],
-[ 4082, "ezx" ],
-[ 4083, "ezy" ],
-[ 4084, "ezz" ],
-[ 4085, "faa" ],
-[ 4086, "fab" ],
-[ 4087, "fac" ],
-[ 4088, "fad" ],
-[ 4089, "fae" ],
-[ 4090, "faf" ],
-[ 4091, "fag" ],
-[ 4092, "fah" ],
-[ 4093, "fai" ],
-[ 4094, "faj" ],
-[ 4095, "fak" ],
-[ 4096, "fal" ],
-[ 4097, "fam" ],
-[ 4098, "fan" ],
-[ 4099, "fao" ],
-[ 4100, "fap" ],
-[ 4101, "faq" ],
-[ 4102, "far" ],
-[ 4103, "fas" ],
-[ 4104, "fat" ],
-[ 4105, "fau" ],
-[ 4106, "fav" ],
-[ 4107, "faw" ],
-[ 4108, "fax" ],
-[ 4109, "fay" ],
-[ 4110, "faz" ],
-[ 4111, "fba" ],
-[ 4112, "fbb" ],
-[ 4113, "fbc" ],
-[ 4114, "fbd" ],
-[ 4115, "fbe" ],
-[ 4116, "fbf" ],
-[ 4117, "fbg" ],
-[ 4118, "fbh" ],
-[ 4119, "fbi" ],
-[ 4120, "fbj" ],
-[ 4121, "fbk" ],
-[ 4122, "fbl" ],
-[ 4123, "fbm" ],
-[ 4124, "fbn" ],
-[ 4125, "fbo" ],
-[ 4126, "fbp" ],
-[ 4127, "fbq" ],
-[ 4128, "fbr" ],
-[ 4129, "fbs" ],
-[ 4130, "fbt" ],
-[ 4131, "fbu" ],
-[ 4132, "fbv" ],
-[ 4133, "fbw" ],
-[ 4134, "fbx" ],
-[ 4135, "fby" ],
-[ 4136, "fbz" ],
-[ 4137, "fca" ],
-[ 4138, "fcb" ],
-[ 4139, "fcc" ],
-[ 4140, "fcd" ],
-[ 4141, "fce" ],
-[ 4142, "fcf" ],
-[ 4143, "fcg" ],
-[ 4144, "fch" ],
-[ 4145, "fci" ],
-[ 4146, "fcj" ],
-[ 4147, "fck" ],
-[ 4148, "fcl" ],
-[ 4149, "fcm" ],
-[ 4150, "fcn" ],
-[ 4151, "fco" ],
-[ 4152, "fcp" ],
-[ 4153, "fcq" ],
-[ 4154, "fcr" ],
-[ 4155, "fcs" ],
-[ 4156, "fct" ],
-[ 4157, "fcu" ],
-[ 4158, "fcv" ],
-[ 4159, "fcw" ],
-[ 4160, "fcx" ],
-[ 4161, "fcy" ],
-[ 4162, "fcz" ],
-[ 4163, "fda" ],
-[ 4164, "fdb" ],
-[ 4165, "fdc" ],
-[ 4166, "fdd" ],
-[ 4167, "fde" ],
-[ 4168, "fdf" ],
-[ 4169, "fdg" ],
-[ 4170, "fdh" ],
-[ 4171, "fdi" ],
-[ 4172, "fdj" ],
-[ 4173, "fdk" ],
-[ 4174, "fdl" ],
-[ 4175, "fdm" ],
-[ 4176, "fdn" ],
-[ 4177, "fdo" ],
-[ 4178, "fdp" ],
-[ 4179, "fdq" ],
-[ 4180, "fdr" ],
-[ 4181, "fds" ],
-[ 4182, "fdt" ],
-[ 4183, "fdu" ],
-[ 4184, "fdv" ],
-[ 4185, "fdw" ],
-[ 4186, "fdx" ],
-[ 4187, "fdy" ],
-[ 4188, "fdz" ],
-[ 4189, "fea" ],
-[ 4190, "feb" ],
-[ 4191, "fec" ],
-[ 4192, "fed" ],
-[ 4193, "fee" ],
-[ 4194, "fef" ],
-[ 4195, "feg" ],
-[ 4196, "feh" ],
-[ 4197, "fei" ],
-[ 4198, "fej" ],
-[ 4199, "fek" ],
-[ 4200, "fel" ],
-[ 4201, "fem" ],
-[ 4202, "fen" ],
-[ 4203, "feo" ],
-[ 4204, "fep" ],
-[ 4205, "feq" ],
-[ 4206, "fer" ],
-[ 4207, "fes" ],
-[ 4208, "fet" ],
-[ 4209, "feu" ],
-[ 4210, "fev" ],
-[ 4211, "few" ],
-[ 4212, "fex" ],
-[ 4213, "fey" ],
-[ 4214, "fez" ],
-[ 4215, "ffa" ],
-[ 4216, "ffb" ],
-[ 4217, "ffc" ],
-[ 4218, "ffd" ],
-[ 4219, "ffe" ],
-[ 4220, "fff" ],
-[ 4221, "ffg" ],
-[ 4222, "ffh" ],
-[ 4223, "ffi" ],
-[ 4224, "ffj" ],
-[ 4225, "ffk" ],
-[ 4226, "ffl" ],
-[ 4227, "ffm" ],
-[ 4228, "ffn" ],
-[ 4229, "ffo" ],
-[ 4230, "ffp" ],
-[ 4231, "ffq" ],
-[ 4232, "ffr" ],
-[ 4233, "ffs" ],
-[ 4234, "fft" ],
-[ 4235, "ffu" ],
-[ 4236, "ffv" ],
-[ 4237, "ffw" ],
-[ 4238, "ffx" ],
-[ 4239, "ffy" ],
-[ 4240, "ffz" ],
-[ 4241, "fga" ],
-[ 4242, "fgb" ],
-[ 4243, "fgc" ],
-[ 4244, "fgd" ],
-[ 4245, "fge" ],
-[ 4246, "fgf" ],
-[ 4247, "fgg" ],
-[ 4248, "fgh" ],
-[ 4249, "fgi" ],
-[ 4250, "fgj" ],
-[ 4251, "fgk" ],
-[ 4252, "fgl" ],
-[ 4253, "fgm" ],
-[ 4254, "fgn" ],
-[ 4255, "fgo" ],
-[ 4256, "fgp" ],
-[ 4257, "fgq" ],
-[ 4258, "fgr" ],
-[ 4259, "fgs" ],
-[ 4260, "fgt" ],
-[ 4261, "fgu" ],
-[ 4262, "fgv" ],
-[ 4263, "fgw" ],
-[ 4264, "fgx" ],
-[ 4265, "fgy" ],
-[ 4266, "fgz" ],
-[ 4267, "fha" ],
-[ 4268, "fhb" ],
-[ 4269, "fhc" ],
-[ 4270, "fhd" ],
-[ 4271, "fhe" ],
-[ 4272, "fhf" ],
-[ 4273, "fhg" ],
-[ 4274, "fhh" ],
-[ 4275, "fhi" ],
-[ 4276, "fhj" ],
-[ 4277, "fhk" ],
-[ 4278, "fhl" ],
-[ 4279, "fhm" ],
-[ 4280, "fhn" ],
-[ 4281, "fho" ],
-[ 4282, "fhp" ],
-[ 4283, "fhq" ],
-[ 4284, "fhr" ],
-[ 4285, "fhs" ],
-[ 4286, "fht" ],
-[ 4287, "fhu" ],
-[ 4288, "fhv" ],
-[ 4289, "fhw" ],
-[ 4290, "fhx" ],
-[ 4291, "fhy" ],
-[ 4292, "fhz" ],
-[ 4293, "fia" ],
-[ 4294, "fib" ],
-[ 4295, "fic" ],
-[ 4296, "fid" ],
-[ 4297, "fie" ],
-[ 4298, "fif" ],
-[ 4299, "fig" ],
-[ 4300, "fih" ],
-[ 4301, "fii" ],
-[ 4302, "fij" ],
-[ 4303, "fik" ],
-[ 4304, "fil" ],
-[ 4305, "fim" ],
-[ 4306, "fin" ],
-[ 4307, "fio" ],
-[ 4308, "fip" ],
-[ 4309, "fiq" ],
-[ 4310, "fir" ],
-[ 4311, "fis" ],
-[ 4312, "fit" ],
-[ 4313, "fiu" ],
-[ 4314, "fiv" ],
-[ 4315, "fiw" ],
-[ 4316, "fix" ],
-[ 4317, "fiy" ],
-[ 4318, "fiz" ],
-[ 4319, "fja" ],
-[ 4320, "fjb" ],
-[ 4321, "fjc" ],
-[ 4322, "fjd" ],
-[ 4323, "fje" ],
-[ 4324, "fjf" ],
-[ 4325, "fjg" ],
-[ 4326, "fjh" ],
-[ 4327, "fji" ],
-[ 4328, "fjj" ],
-[ 4329, "fjk" ],
-[ 4330, "fjl" ],
-[ 4331, "fjm" ],
-[ 4332, "fjn" ],
-[ 4333, "fjo" ],
-[ 4334, "fjp" ],
-[ 4335, "fjq" ],
-[ 4336, "fjr" ],
-[ 4337, "fjs" ],
-[ 4338, "fjt" ],
-[ 4339, "fju" ],
-[ 4340, "fjv" ],
-[ 4341, "fjw" ],
-[ 4342, "fjx" ],
-[ 4343, "fjy" ],
-[ 4344, "fjz" ],
-[ 4345, "fka" ],
-[ 4346, "fkb" ],
-[ 4347, "fkc" ],
-[ 4348, "fkd" ],
-[ 4349, "fke" ],
-[ 4350, "fkf" ],
-[ 4351, "fkg" ],
-[ 4352, "fkh" ],
-[ 4353, "fki" ],
-[ 4354, "fkj" ],
-[ 4355, "fkk" ],
-[ 4356, "fkl" ],
-[ 4357, "fkm" ],
-[ 4358, "fkn" ],
-[ 4359, "fko" ],
-[ 4360, "fkp" ],
-[ 4361, "fkq" ],
-[ 4362, "fkr" ],
-[ 4363, "fks" ],
-[ 4364, "fkt" ],
-[ 4365, "fku" ],
-[ 4366, "fkv" ],
-[ 4367, "fkw" ],
-[ 4368, "fkx" ],
-[ 4369, "fky" ],
-[ 4370, "fkz" ],
-[ 4371, "fla" ],
-[ 4372, "flb" ],
-[ 4373, "flc" ],
-[ 4374, "fld" ],
-[ 4375, "fle" ],
-[ 4376, "flf" ],
-[ 4377, "flg" ],
-[ 4378, "flh" ],
-[ 4379, "fli" ],
-[ 4380, "flj" ],
-[ 4381, "flk" ],
-[ 4382, "fll" ],
-[ 4383, "flm" ],
-[ 4384, "fln" ],
-[ 4385, "flo" ],
-[ 4386, "flp" ],
-[ 4387, "flq" ],
-[ 4388, "flr" ],
-[ 4389, "fls" ],
-[ 4390, "flt" ],
-[ 4391, "flu" ],
-[ 4392, "flv" ],
-[ 4393, "flw" ],
-[ 4394, "flx" ],
-[ 4395, "fly" ],
-[ 4396, "flz" ],
-[ 4397, "fma" ],
-[ 4398, "fmb" ],
-[ 4399, "fmc" ],
-[ 4400, "fmd" ],
-[ 4401, "fme" ],
-[ 4402, "fmf" ],
-[ 4403, "fmg" ],
-[ 4404, "fmh" ],
-[ 4405, "fmi" ],
-[ 4406, "fmj" ],
-[ 4407, "fmk" ],
-[ 4408, "fml" ],
-[ 4409, "fmm" ],
-[ 4410, "fmn" ],
-[ 4411, "fmo" ],
-[ 4412, "fmp" ],
-[ 4413, "fmq" ],
-[ 4414, "fmr" ],
-[ 4415, "fms" ],
-[ 4416, "fmt" ],
-[ 4417, "fmu" ],
-[ 4418, "fmv" ],
-[ 4419, "fmw" ],
-[ 4420, "fmx" ],
-[ 4421, "fmy" ],
-[ 4422, "fmz" ],
-[ 4423, "fna" ],
-[ 4424, "fnb" ],
-[ 4425, "fnc" ],
-[ 4426, "fnd" ],
-[ 4427, "fne" ],
-[ 4428, "fnf" ],
-[ 4429, "fng" ],
-[ 4430, "fnh" ],
-[ 4431, "fni" ],
-[ 4432, "fnj" ],
-[ 4433, "fnk" ],
-[ 4434, "fnl" ],
-[ 4435, "fnm" ],
-[ 4436, "fnn" ],
-[ 4437, "fno" ],
-[ 4438, "fnp" ],
-[ 4439, "fnq" ],
-[ 4440, "fnr" ],
-[ 4441, "fns" ],
-[ 4442, "fnt" ],
-[ 4443, "fnu" ],
-[ 4444, "fnv" ],
-[ 4445, "fnw" ],
-[ 4446, "fnx" ],
-[ 4447, "fny" ],
-[ 4448, "fnz" ],
-[ 4449, "foa" ],
-[ 4450, "fob" ],
-[ 4451, "foc" ],
-[ 4452, "fod" ],
-[ 4453, "foe" ],
-[ 4454, "fof" ],
-[ 4455, "fog" ],
-[ 4456, "foh" ],
-[ 4457, "foi" ],
-[ 4458, "foj" ],
-[ 4459, "fok" ],
-[ 4460, "fol" ],
-[ 4461, "fom" ],
-[ 4462, "fon" ],
-[ 4463, "foo" ],
-[ 4464, "fop" ],
-[ 4465, "foq" ],
-[ 4466, "for" ],
-[ 4467, "fos" ],
-[ 4468, "fot" ],
-[ 4469, "fou" ],
-[ 4470, "fov" ],
-[ 4471, "fow" ],
-[ 4472, "fox" ],
-[ 4473, "foy" ],
-[ 4474, "foz" ],
-[ 4475, "fpa" ],
-[ 4476, "fpb" ],
-[ 4477, "fpc" ],
-[ 4478, "fpd" ],
-[ 4479, "fpe" ],
-[ 4480, "fpf" ],
-[ 4481, "fpg" ],
-[ 4482, "fph" ],
-[ 4483, "fpi" ],
-[ 4484, "fpj" ],
-[ 4485, "fpk" ],
-[ 4486, "fpl" ],
-[ 4487, "fpm" ],
-[ 4488, "fpn" ],
-[ 4489, "fpo" ],
-[ 4490, "fpp" ],
-[ 4491, "fpq" ],
-[ 4492, "fpr" ],
-[ 4493, "fps" ],
-[ 4494, "fpt" ],
-[ 4495, "fpu" ],
-[ 4496, "fpv" ],
-[ 4497, "fpw" ],
-[ 4498, "fpx" ],
-[ 4499, "fpy" ],
-[ 4500, "fpz" ],
-[ 4501, "fqa" ],
-[ 4502, "fqb" ],
-[ 4503, "fqc" ],
-[ 4504, "fqd" ],
-[ 4505, "fqe" ],
-[ 4506, "fqf" ],
-[ 4507, "fqg" ],
-[ 4508, "fqh" ],
-[ 4509, "fqi" ],
-[ 4510, "fqj" ],
-[ 4511, "fqk" ],
-[ 4512, "fql" ],
-[ 4513, "fqm" ],
-[ 4514, "fqn" ],
-[ 4515, "fqo" ],
-[ 4516, "fqp" ],
-[ 4517, "fqq" ],
-[ 4518, "fqr" ],
-[ 4519, "fqs" ],
-[ 4520, "fqt" ],
-[ 4521, "fqu" ],
-[ 4522, "fqv" ],
-[ 4523, "fqw" ],
-[ 4524, "fqx" ],
-[ 4525, "fqy" ],
-[ 4526, "fqz" ],
-[ 4527, "fra" ],
-[ 4528, "frb" ],
-[ 4529, "frc" ],
-[ 4530, "frd" ],
-[ 4531, "fre" ],
-[ 4532, "frf" ],
-[ 4533, "frg" ],
-[ 4534, "frh" ],
-[ 4535, "fri" ],
-[ 4536, "frj" ],
-[ 4537, "frk" ],
-[ 4538, "frl" ],
-[ 4539, "frm" ],
-[ 4540, "frn" ],
-[ 4541, "fro" ],
-[ 4542, "frp" ],
-[ 4543, "frq" ],
-[ 4544, "frr" ],
-[ 4545, "frs" ],
-[ 4546, "frt" ],
-[ 4547, "fru" ],
-[ 4548, "frv" ],
-[ 4549, "frw" ],
-[ 4550, "frx" ],
-[ 4551, "fry" ],
-[ 4552, "frz" ],
-[ 4553, "fsa" ],
-[ 4554, "fsb" ],
-[ 4555, "fsc" ],
-[ 4556, "fsd" ],
-[ 4557, "fse" ],
-[ 4558, "fsf" ],
-[ 4559, "fsg" ],
-[ 4560, "fsh" ],
-[ 4561, "fsi" ],
-[ 4562, "fsj" ],
-[ 4563, "fsk" ],
-[ 4564, "fsl" ],
-[ 4565, "fsm" ],
-[ 4566, "fsn" ],
-[ 4567, "fso" ],
-[ 4568, "fsp" ],
-[ 4569, "fsq" ],
-[ 4570, "fsr" ],
-[ 4571, "fss" ],
-[ 4572, "fst" ],
-[ 4573, "fsu" ],
-[ 4574, "fsv" ],
-[ 4575, "fsw" ],
-[ 4576, "fsx" ],
-[ 4577, "fsy" ],
-[ 4578, "fsz" ],
-[ 4579, "fta" ],
-[ 4580, "ftb" ],
-[ 4581, "ftc" ],
-[ 4582, "ftd" ],
-[ 4583, "fte" ],
-[ 4584, "ftf" ],
-[ 4585, "ftg" ],
-[ 4586, "fth" ],
-[ 4587, "fti" ],
-[ 4588, "ftj" ],
-[ 4589, "ftk" ],
-[ 4590, "ftl" ],
-[ 4591, "ftm" ],
-[ 4592, "ftn" ],
-[ 4593, "fto" ],
-[ 4594, "ftp" ],
-[ 4595, "ftq" ],
-[ 4596, "ftr" ],
-[ 4597, "fts" ],
-[ 4598, "ftt" ],
-[ 4599, "ftu" ],
-[ 4600, "ftv" ],
-[ 4601, "ftw" ],
-[ 4602, "ftx" ],
-[ 4603, "fty" ],
-[ 4604, "ftz" ],
-[ 4605, "fua" ],
-[ 4606, "fub" ],
-[ 4607, "fuc" ],
-[ 4608, "fud" ],
-[ 4609, "fue" ],
-[ 4610, "fuf" ],
-[ 4611, "fug" ],
-[ 4612, "fuh" ],
-[ 4613, "fui" ],
-[ 4614, "fuj" ],
-[ 4615, "fuk" ],
-[ 4616, "ful" ],
-[ 4617, "fum" ],
-[ 4618, "fun" ],
-[ 4619, "fuo" ],
-[ 4620, "fup" ],
-[ 4621, "fuq" ],
-[ 4622, "fur" ],
-[ 4623, "fus" ],
-[ 4624, "fut" ],
-[ 4625, "fuu" ],
-[ 4626, "fuv" ],
-[ 4627, "fuw" ],
-[ 4628, "fux" ],
-[ 4629, "fuy" ],
-[ 4630, "fuz" ],
-[ 4631, "fva" ],
-[ 4632, "fvb" ],
-[ 4633, "fvc" ],
-[ 4634, "fvd" ],
-[ 4635, "fve" ],
-[ 4636, "fvf" ],
-[ 4637, "fvg" ],
-[ 4638, "fvh" ],
-[ 4639, "fvi" ],
-[ 4640, "fvj" ],
-[ 4641, "fvk" ],
-[ 4642, "fvl" ],
-[ 4643, "fvm" ],
-[ 4644, "fvn" ],
-[ 4645, "fvo" ],
-[ 4646, "fvp" ],
-[ 4647, "fvq" ],
-[ 4648, "fvr" ],
-[ 4649, "fvs" ],
-[ 4650, "fvt" ],
-[ 4651, "fvu" ],
-[ 4652, "fvv" ],
-[ 4653, "fvw" ],
-[ 4654, "fvx" ],
-[ 4655, "fvy" ],
-[ 4656, "fvz" ],
-[ 4657, "fwa" ],
-[ 4658, "fwb" ],
-[ 4659, "fwc" ],
-[ 4660, "fwd" ],
-[ 4661, "fwe" ],
-[ 4662, "fwf" ],
-[ 4663, "fwg" ],
-[ 4664, "fwh" ],
-[ 4665, "fwi" ],
-[ 4666, "fwj" ],
-[ 4667, "fwk" ],
-[ 4668, "fwl" ],
-[ 4669, "fwm" ],
-[ 4670, "fwn" ],
-[ 4671, "fwo" ],
-[ 4672, "fwp" ],
-[ 4673, "fwq" ],
-[ 4674, "fwr" ],
-[ 4675, "fws" ],
-[ 4676, "fwt" ],
-[ 4677, "fwu" ],
-[ 4678, "fwv" ],
-[ 4679, "fww" ],
-[ 4680, "fwx" ],
-[ 4681, "fwy" ],
-[ 4682, "fwz" ],
-[ 4683, "fxa" ],
-[ 4684, "fxb" ],
-[ 4685, "fxc" ],
-[ 4686, "fxd" ],
-[ 4687, "fxe" ],
-[ 4688, "fxf" ],
-[ 4689, "fxg" ],
-[ 4690, "fxh" ],
-[ 4691, "fxi" ],
-[ 4692, "fxj" ],
-[ 4693, "fxk" ],
-[ 4694, "fxl" ],
-[ 4695, "fxm" ],
-[ 4696, "fxn" ],
-[ 4697, "fxo" ],
-[ 4698, "fxp" ],
-[ 4699, "fxq" ],
-[ 4700, "fxr" ],
-[ 4701, "fxs" ],
-[ 4702, "fxt" ],
-[ 4703, "fxu" ],
-[ 4704, "fxv" ],
-[ 4705, "fxw" ],
-[ 4706, "fxx" ],
-[ 4707, "fxy" ],
-[ 4708, "fxz" ],
-[ 4709, "fya" ],
-[ 4710, "fyb" ],
-[ 4711, "fyc" ],
-[ 4712, "fyd" ],
-[ 4713, "fye" ],
-[ 4714, "fyf" ],
-[ 4715, "fyg" ],
-[ 4716, "fyh" ],
-[ 4717, "fyi" ],
-[ 4718, "fyj" ],
-[ 4719, "fyk" ],
-[ 4720, "fyl" ],
-[ 4721, "fym" ],
-[ 4722, "fyn" ],
-[ 4723, "fyo" ],
-[ 4724, "fyp" ],
-[ 4725, "fyq" ],
-[ 4726, "fyr" ],
-[ 4727, "fys" ],
-[ 4728, "fyt" ],
-[ 4729, "fyu" ],
-[ 4730, "fyv" ],
-[ 4731, "fyw" ],
-[ 4732, "fyx" ],
-[ 4733, "fyy" ],
-[ 4734, "fyz" ],
-[ 4735, "fza" ],
-[ 4736, "fzb" ],
-[ 4737, "fzc" ],
-[ 4738, "fzd" ],
-[ 4739, "fze" ],
-[ 4740, "fzf" ],
-[ 4741, "fzg" ],
-[ 4742, "fzh" ],
-[ 4743, "fzi" ],
-[ 4744, "fzj" ],
-[ 4745, "fzk" ],
-[ 4746, "fzl" ],
-[ 4747, "fzm" ],
-[ 4748, "fzn" ],
-[ 4749, "fzo" ],
-[ 4750, "fzp" ],
-[ 4751, "fzq" ],
-[ 4752, "fzr" ],
-[ 4753, "fzs" ],
-[ 4754, "fzt" ],
-[ 4755, "fzu" ],
-[ 4756, "fzv" ],
-[ 4757, "fzw" ],
-[ 4758, "fzx" ],
-[ 4759, "fzy" ],
-[ 4760, "fzz" ],
-[ 4761, "gaa" ],
-[ 4762, "gab" ],
-[ 4763, "gac" ],
-[ 4764, "gad" ],
-[ 4765, "gae" ],
-[ 4766, "gaf" ],
-[ 4767, "gag" ],
-[ 4768, "gah" ],
-[ 4769, "gai" ],
-[ 4770, "gaj" ],
-[ 4771, "gak" ],
-[ 4772, "gal" ],
-[ 4773, "gam" ],
-[ 4774, "gan" ],
-[ 4775, "gao" ],
-[ 4776, "gap" ],
-[ 4777, "gaq" ],
-[ 4778, "gar" ],
-[ 4779, "gas" ],
-[ 4780, "gat" ],
-[ 4781, "gau" ],
-[ 4782, "gav" ],
-[ 4783, "gaw" ],
-[ 4784, "gax" ],
-[ 4785, "gay" ],
-[ 4786, "gaz" ],
-[ 4787, "gba" ],
-[ 4788, "gbb" ],
-[ 4789, "gbc" ],
-[ 4790, "gbd" ],
-[ 4791, "gbe" ],
-[ 4792, "gbf" ],
-[ 4793, "gbg" ],
-[ 4794, "gbh" ],
-[ 4795, "gbi" ],
-[ 4796, "gbj" ],
-[ 4797, "gbk" ],
-[ 4798, "gbl" ],
-[ 4799, "gbm" ],
-[ 4800, "gbn" ],
-[ 4801, "gbo" ],
-[ 4802, "gbp" ],
-[ 4803, "gbq" ],
-[ 4804, "gbr" ],
-[ 4805, "gbs" ],
-[ 4806, "gbt" ],
-[ 4807, "gbu" ],
-[ 4808, "gbv" ],
-[ 4809, "gbw" ],
-[ 4810, "gbx" ],
-[ 4811, "gby" ],
-[ 4812, "gbz" ],
-[ 4813, "gca" ],
-[ 4814, "gcb" ],
-[ 4815, "gcc" ],
-[ 4816, "gcd" ],
-[ 4817, "gce" ],
-[ 4818, "gcf" ],
-[ 4819, "gcg" ],
-[ 4820, "gch" ],
-[ 4821, "gci" ],
-[ 4822, "gcj" ],
-[ 4823, "gck" ],
-[ 4824, "gcl" ],
-[ 4825, "gcm" ],
-[ 4826, "gcn" ],
-[ 4827, "gco" ],
-[ 4828, "gcp" ],
-[ 4829, "gcq" ],
-[ 4830, "gcr" ],
-[ 4831, "gcs" ],
-[ 4832, "gct" ],
-[ 4833, "gcu" ],
-[ 4834, "gcv" ],
-[ 4835, "gcw" ],
-[ 4836, "gcx" ],
-[ 4837, "gcy" ],
-[ 4838, "gcz" ],
-[ 4839, "gda" ],
-[ 4840, "gdb" ],
-[ 4841, "gdc" ],
-[ 4842, "gdd" ],
-[ 4843, "gde" ],
-[ 4844, "gdf" ],
-[ 4845, "gdg" ],
-[ 4846, "gdh" ],
-[ 4847, "gdi" ],
-[ 4848, "gdj" ],
-[ 4849, "gdk" ],
-[ 4850, "gdl" ],
-[ 4851, "gdm" ],
-[ 4852, "gdn" ],
-[ 4853, "gdo" ],
-[ 4854, "gdp" ],
-[ 4855, "gdq" ],
-[ 4856, "gdr" ],
-[ 4857, "gds" ],
-[ 4858, "gdt" ],
-[ 4859, "gdu" ],
-[ 4860, "gdv" ],
-[ 4861, "gdw" ],
-[ 4862, "gdx" ],
-[ 4863, "gdy" ],
-[ 4864, "gdz" ],
-[ 4865, "gea" ],
-[ 4866, "geb" ],
-[ 4867, "gec" ],
-[ 4868, "ged" ],
-[ 4869, "gee" ],
-[ 4870, "gef" ],
-[ 4871, "geg" ],
-[ 4872, "geh" ],
-[ 4873, "gei" ],
-[ 4874, "gej" ],
-[ 4875, "gek" ],
-[ 4876, "gel" ],
-[ 4877, "gem" ],
-[ 4878, "gen" ],
-[ 4879, "geo" ],
-[ 4880, "gep" ],
-[ 4881, "geq" ],
-[ 4882, "ger" ],
-[ 4883, "ges" ],
-[ 4884, "get" ],
-[ 4885, "geu" ],
-[ 4886, "gev" ],
-[ 4887, "gew" ],
-[ 4888, "gex" ],
-[ 4889, "gey" ],
-[ 4890, "gez" ],
-[ 4891, "gfa" ],
-[ 4892, "gfb" ],
-[ 4893, "gfc" ],
-[ 4894, "gfd" ],
-[ 4895, "gfe" ],
-[ 4896, "gff" ],
-[ 4897, "gfg" ],
-[ 4898, "gfh" ],
-[ 4899, "gfi" ],
-[ 4900, "gfj" ],
-[ 4901, "gfk" ],
-[ 4902, "gfl" ],
-[ 4903, "gfm" ],
-[ 4904, "gfn" ],
-[ 4905, "gfo" ],
-[ 4906, "gfp" ],
-[ 4907, "gfq" ],
-[ 4908, "gfr" ],
-[ 4909, "gfs" ],
-[ 4910, "gft" ],
-[ 4911, "gfu" ],
-[ 4912, "gfv" ],
-[ 4913, "gfw" ],
-[ 4914, "gfx" ],
-[ 4915, "gfy" ],
-[ 4916, "gfz" ],
-[ 4917, "gga" ],
-[ 4918, "ggb" ],
-[ 4919, "ggc" ],
-[ 4920, "ggd" ],
-[ 4921, "gge" ],
-[ 4922, "ggf" ],
-[ 4923, "ggg" ],
-[ 4924, "ggh" ],
-[ 4925, "ggi" ],
-[ 4926, "ggj" ],
-[ 4927, "ggk" ],
-[ 4928, "ggl" ],
-[ 4929, "ggm" ],
-[ 4930, "ggn" ],
-[ 4931, "ggo" ],
-[ 4932, "ggp" ],
-[ 4933, "ggq" ],
-[ 4934, "ggr" ],
-[ 4935, "ggs" ],
-[ 4936, "ggt" ],
-[ 4937, "ggu" ],
-[ 4938, "ggv" ],
-[ 4939, "ggw" ],
-[ 4940, "ggx" ],
-[ 4941, "ggy" ],
-[ 4942, "ggz" ],
-[ 4943, "gha" ],
-[ 4944, "ghb" ],
-[ 4945, "ghc" ],
-[ 4946, "ghd" ],
-[ 4947, "ghe" ],
-[ 4948, "ghf" ],
-[ 4949, "ghg" ],
-[ 4950, "ghh" ],
-[ 4951, "ghi" ],
-[ 4952, "ghj" ],
-[ 4953, "ghk" ],
-[ 4954, "ghl" ],
-[ 4955, "ghm" ],
-[ 4956, "ghn" ],
-[ 4957, "gho" ],
-[ 4958, "ghp" ],
-[ 4959, "ghq" ],
-[ 4960, "ghr" ],
-[ 4961, "ghs" ],
-[ 4962, "ght" ],
-[ 4963, "ghu" ],
-[ 4964, "ghv" ],
-[ 4965, "ghw" ],
-[ 4966, "ghx" ],
-[ 4967, "ghy" ],
-[ 4968, "ghz" ],
-[ 4969, "gia" ],
-[ 4970, "gib" ],
-[ 4971, "gic" ],
-[ 4972, "gid" ],
-[ 4973, "gie" ],
-[ 4974, "gif" ],
-[ 4975, "gig" ],
-[ 4976, "gih" ],
-[ 4977, "gii" ],
-[ 4978, "gij" ],
-[ 4979, "gik" ],
-[ 4980, "gil" ],
-[ 4981, "gim" ],
-[ 4982, "gin" ],
-[ 4983, "gio" ],
-[ 4984, "gip" ],
-[ 4985, "giq" ],
-[ 4986, "gir" ],
-[ 4987, "gis" ],
-[ 4988, "git" ],
-[ 4989, "giu" ],
-[ 4990, "giv" ],
-[ 4991, "giw" ],
-[ 4992, "gix" ],
-[ 4993, "giy" ],
-[ 4994, "giz" ],
-[ 4995, "gja" ],
-[ 4996, "gjb" ],
-[ 4997, "gjc" ],
-[ 4998, "gjd" ],
-[ 4999, "gje" ],
-[ 5000, "gjf" ],
-[ 5001, "gjg" ],
-[ 5002, "gjh" ],
-[ 5003, "gji" ],
-[ 5004, "gjj" ],
-[ 5005, "gjk" ],
-[ 5006, "gjl" ],
-[ 5007, "gjm" ],
-[ 5008, "gjn" ],
-[ 5009, "gjo" ],
-[ 5010, "gjp" ],
-[ 5011, "gjq" ],
-[ 5012, "gjr" ],
-[ 5013, "gjs" ],
-[ 5014, "gjt" ],
-[ 5015, "gju" ],
-[ 5016, "gjv" ],
-[ 5017, "gjw" ],
-[ 5018, "gjx" ],
-[ 5019, "gjy" ],
-[ 5020, "gjz" ],
-[ 5021, "gka" ],
-[ 5022, "gkb" ],
-[ 5023, "gkc" ],
-[ 5024, "gkd" ],
-[ 5025, "gke" ],
-[ 5026, "gkf" ],
-[ 5027, "gkg" ],
-[ 5028, "gkh" ],
-[ 5029, "gki" ],
-[ 5030, "gkj" ],
-[ 5031, "gkk" ],
-[ 5032, "gkl" ],
-[ 5033, "gkm" ],
-[ 5034, "gkn" ],
-[ 5035, "gko" ],
-[ 5036, "gkp" ],
-[ 5037, "gkq" ],
-[ 5038, "gkr" ],
-[ 5039, "gks" ],
-[ 5040, "gkt" ],
-[ 5041, "gku" ],
-[ 5042, "gkv" ],
-[ 5043, "gkw" ],
-[ 5044, "gkx" ],
-[ 5045, "gky" ],
-[ 5046, "gkz" ],
-[ 5047, "gla" ],
-[ 5048, "glb" ],
-[ 5049, "glc" ],
-[ 5050, "gld" ],
-[ 5051, "gle" ],
-[ 5052, "glf" ],
-[ 5053, "glg" ],
-[ 5054, "glh" ],
-[ 5055, "gli" ],
-[ 5056, "glj" ],
-[ 5057, "glk" ],
-[ 5058, "gll" ],
-[ 5059, "glm" ],
-[ 5060, "gln" ],
-[ 5061, "glo" ],
-[ 5062, "glp" ],
-[ 5063, "glq" ],
-[ 5064, "glr" ],
-[ 5065, "gls" ],
-[ 5066, "glt" ],
-[ 5067, "glu" ],
-[ 5068, "glv" ],
-[ 5069, "glw" ],
-[ 5070, "glx" ],
-[ 5071, "gly" ],
-[ 5072, "glz" ],
-[ 5073, "gma" ],
-[ 5074, "gmb" ],
-[ 5075, "gmc" ],
-[ 5076, "gmd" ],
-[ 5077, "gme" ],
-[ 5078, "gmf" ],
-[ 5079, "gmg" ],
-[ 5080, "gmh" ],
-[ 5081, "gmi" ],
-[ 5082, "gmj" ],
-[ 5083, "gmk" ],
-[ 5084, "gml" ],
-[ 5085, "gmm" ],
-[ 5086, "gmn" ],
-[ 5087, "gmo" ],
-[ 5088, "gmp" ],
-[ 5089, "gmq" ],
-[ 5090, "gmr" ],
-[ 5091, "gms" ],
-[ 5092, "gmt" ],
-[ 5093, "gmu" ],
-[ 5094, "gmv" ],
-[ 5095, "gmw" ],
-[ 5096, "gmx" ],
-[ 5097, "gmy" ],
-[ 5098, "gmz" ],
-[ 5099, "gna" ],
-[ 5100, "gnb" ],
-[ 5101, "gnc" ],
-[ 5102, "gnd" ],
-[ 5103, "gne" ],
-[ 5104, "gnf" ],
-[ 5105, "gng" ],
-[ 5106, "gnh" ],
-[ 5107, "gni" ],
-[ 5108, "gnj" ],
-[ 5109, "gnk" ],
-[ 5110, "gnl" ],
-[ 5111, "gnm" ],
-[ 5112, "gnn" ],
-[ 5113, "gno" ],
-[ 5114, "gnp" ],
-[ 5115, "gnq" ],
-[ 5116, "gnr" ],
-[ 5117, "gns" ],
-[ 5118, "gnt" ],
-[ 5119, "gnu" ],
-[ 5120, "gnv" ],
-[ 5121, "gnw" ],
-[ 5122, "gnx" ],
-[ 5123, "gny" ],
-[ 5124, "gnz" ],
-[ 5125, "goa" ],
-[ 5126, "gob" ],
-[ 5127, "goc" ],
-[ 5128, "god" ],
-[ 5129, "goe" ],
-[ 5130, "gof" ],
-[ 5131, "gog" ],
-[ 5132, "goh" ],
-[ 5133, "goi" ],
-[ 5134, "goj" ],
-[ 5135, "gok" ],
-[ 5136, "gol" ],
-[ 5137, "gom" ],
-[ 5138, "gon" ],
-[ 5139, "goo" ],
-[ 5140, "gop" ],
-[ 5141, "goq" ],
-[ 5142, "gor" ],
-[ 5143, "gos" ],
-[ 5144, "got" ],
-[ 5145, "gou" ],
-[ 5146, "gov" ],
-[ 5147, "gow" ],
-[ 5148, "gox" ],
-[ 5149, "goy" ],
-[ 5150, "goz" ],
-[ 5151, "gpa" ],
-[ 5152, "gpb" ],
-[ 5153, "gpc" ],
-[ 5154, "gpd" ],
-[ 5155, "gpe" ],
-[ 5156, "gpf" ],
-[ 5157, "gpg" ],
-[ 5158, "gph" ],
-[ 5159, "gpi" ],
-[ 5160, "gpj" ],
-[ 5161, "gpk" ],
-[ 5162, "gpl" ],
-[ 5163, "gpm" ],
-[ 5164, "gpn" ],
-[ 5165, "gpo" ],
-[ 5166, "gpp" ],
-[ 5167, "gpq" ],
-[ 5168, "gpr" ],
-[ 5169, "gps" ],
-[ 5170, "gpt" ],
-[ 5171, "gpu" ],
-[ 5172, "gpv" ],
-[ 5173, "gpw" ],
-[ 5174, "gpx" ],
-[ 5175, "gpy" ],
-[ 5176, "gpz" ],
-[ 5177, "gqa" ],
-[ 5178, "gqb" ],
-[ 5179, "gqc" ],
-[ 5180, "gqd" ],
-[ 5181, "gqe" ],
-[ 5182, "gqf" ],
-[ 5183, "gqg" ],
-[ 5184, "gqh" ],
-[ 5185, "gqi" ],
-[ 5186, "gqj" ],
-[ 5187, "gqk" ],
-[ 5188, "gql" ],
-[ 5189, "gqm" ],
-[ 5190, "gqn" ],
-[ 5191, "gqo" ],
-[ 5192, "gqp" ],
-[ 5193, "gqq" ],
-[ 5194, "gqr" ],
-[ 5195, "gqs" ],
-[ 5196, "gqt" ],
-[ 5197, "gqu" ],
-[ 5198, "gqv" ],
-[ 5199, "gqw" ],
-[ 5200, "gqx" ],
-[ 5201, "gqy" ],
-[ 5202, "gqz" ],
-[ 5203, "gra" ],
-[ 5204, "grb" ],
-[ 5205, "grc" ],
-[ 5206, "grd" ],
-[ 5207, "gre" ],
-[ 5208, "grf" ],
-[ 5209, "grg" ],
-[ 5210, "grh" ],
-[ 5211, "gri" ],
-[ 5212, "grj" ],
-[ 5213, "grk" ],
-[ 5214, "grl" ],
-[ 5215, "grm" ],
-[ 5216, "grn" ],
-[ 5217, "gro" ],
-[ 5218, "grp" ],
-[ 5219, "grq" ],
-[ 5220, "grr" ],
-[ 5221, "grs" ],
-[ 5222, "grt" ],
-[ 5223, "gru" ],
-[ 5224, "grv" ],
-[ 5225, "grw" ],
-[ 5226, "grx" ],
-[ 5227, "gry" ],
-[ 5228, "grz" ],
-[ 5229, "gsa" ],
-[ 5230, "gsb" ],
-[ 5231, "gsc" ],
-[ 5232, "gsd" ],
-[ 5233, "gse" ],
-[ 5234, "gsf" ],
-[ 5235, "gsg" ],
-[ 5236, "gsh" ],
-[ 5237, "gsi" ],
-[ 5238, "gsj" ],
-[ 5239, "gsk" ],
-[ 5240, "gsl" ],
-[ 5241, "gsm" ],
-[ 5242, "gsn" ],
-[ 5243, "gso" ],
-[ 5244, "gsp" ],
-[ 5245, "gsq" ],
-[ 5246, "gsr" ],
-[ 5247, "gss" ],
-[ 5248, "gst" ],
-[ 5249, "gsu" ],
-[ 5250, "gsv" ],
-[ 5251, "gsw" ],
-[ 5252, "gsx" ],
-[ 5253, "gsy" ],
-[ 5254, "gsz" ],
-[ 5255, "gta" ],
-[ 5256, "gtb" ],
-[ 5257, "gtc" ],
-[ 5258, "gtd" ],
-[ 5259, "gte" ],
-[ 5260, "gtf" ],
-[ 5261, "gtg" ],
-[ 5262, "gth" ],
-[ 5263, "gti" ],
-[ 5264, "gtj" ],
-[ 5265, "gtk" ],
-[ 5266, "gtl" ],
-[ 5267, "gtm" ],
-[ 5268, "gtn" ],
-[ 5269, "gto" ],
-[ 5270, "gtp" ],
-[ 5271, "gtq" ],
-[ 5272, "gtr" ],
-[ 5273, "gts" ],
-[ 5274, "gtt" ],
-[ 5275, "gtu" ],
-[ 5276, "gtv" ],
-[ 5277, "gtw" ],
-[ 5278, "gtx" ],
-[ 5279, "gty" ],
-[ 5280, "gtz" ],
-[ 5281, "gua" ],
-[ 5282, "gub" ],
-[ 5283, "guc" ],
-[ 5284, "gud" ],
-[ 5285, "gue" ],
-[ 5286, "guf" ],
-[ 5287, "gug" ],
-[ 5288, "guh" ],
-[ 5289, "gui" ],
-[ 5290, "guj" ],
-[ 5291, "guk" ],
-[ 5292, "gul" ],
-[ 5293, "gum" ],
-[ 5294, "gun" ],
-[ 5295, "guo" ],
-[ 5296, "gup" ],
-[ 5297, "guq" ],
-[ 5298, "gur" ],
-[ 5299, "gus" ],
-[ 5300, "gut" ],
-[ 5301, "guu" ],
-[ 5302, "guv" ],
-[ 5303, "guw" ],
-[ 5304, "gux" ],
-[ 5305, "guy" ],
-[ 5306, "guz" ],
-[ 5307, "gva" ],
-[ 5308, "gvb" ],
-[ 5309, "gvc" ],
-[ 5310, "gvd" ],
-[ 5311, "gve" ],
-[ 5312, "gvf" ],
-[ 5313, "gvg" ],
-[ 5314, "gvh" ],
-[ 5315, "gvi" ],
-[ 5316, "gvj" ],
-[ 5317, "gvk" ],
-[ 5318, "gvl" ],
-[ 5319, "gvm" ],
-[ 5320, "gvn" ],
-[ 5321, "gvo" ],
-[ 5322, "gvp" ],
-[ 5323, "gvq" ],
-[ 5324, "gvr" ],
-[ 5325, "gvs" ],
-[ 5326, "gvt" ],
-[ 5327, "gvu" ],
-[ 5328, "gvv" ],
-[ 5329, "gvw" ],
-[ 5330, "gvx" ],
-[ 5331, "gvy" ],
-[ 5332, "gvz" ],
-[ 5333, "gwa" ],
-[ 5334, "gwb" ],
-[ 5335, "gwc" ],
-[ 5336, "gwd" ],
-[ 5337, "gwe" ],
-[ 5338, "gwf" ],
-[ 5339, "gwg" ],
-[ 5340, "gwh" ],
-[ 5341, "gwi" ],
-[ 5342, "gwj" ],
-[ 5343, "gwk" ],
-[ 5344, "gwl" ],
-[ 5345, "gwm" ],
-[ 5346, "gwn" ],
-[ 5347, "gwo" ],
-[ 5348, "gwp" ],
-[ 5349, "gwq" ],
-[ 5350, "gwr" ],
-[ 5351, "gws" ],
-[ 5352, "gwt" ],
-[ 5353, "gwu" ],
-[ 5354, "gwv" ],
-[ 5355, "gww" ],
-[ 5356, "gwx" ],
-[ 5357, "gwy" ],
-[ 5358, "gwz" ],
-[ 5359, "gxa" ],
-[ 5360, "gxb" ],
-[ 5361, "gxc" ],
-[ 5362, "gxd" ],
-[ 5363, "gxe" ],
-[ 5364, "gxf" ],
-[ 5365, "gxg" ],
-[ 5366, "gxh" ],
-[ 5367, "gxi" ],
-[ 5368, "gxj" ],
-[ 5369, "gxk" ],
-[ 5370, "gxl" ],
-[ 5371, "gxm" ],
-[ 5372, "gxn" ],
-[ 5373, "gxo" ],
-[ 5374, "gxp" ],
-[ 5375, "gxq" ],
-[ 5376, "gxr" ],
-[ 5377, "gxs" ],
-[ 5378, "gxt" ],
-[ 5379, "gxu" ],
-[ 5380, "gxv" ],
-[ 5381, "gxw" ],
-[ 5382, "gxx" ],
-[ 5383, "gxy" ],
-[ 5384, "gxz" ],
-[ 5385, "gya" ],
-[ 5386, "gyb" ],
-[ 5387, "gyc" ],
-[ 5388, "gyd" ],
-[ 5389, "gye" ],
-[ 5390, "gyf" ],
-[ 5391, "gyg" ],
-[ 5392, "gyh" ],
-[ 5393, "gyi" ],
-[ 5394, "gyj" ],
-[ 5395, "gyk" ],
-[ 5396, "gyl" ],
-[ 5397, "gym" ],
-[ 5398, "gyn" ],
-[ 5399, "gyo" ],
-[ 5400, "gyp" ],
-[ 5401, "gyq" ],
-[ 5402, "gyr" ],
-[ 5403, "gys" ],
-[ 5404, "gyt" ],
-[ 5405, "gyu" ],
-[ 5406, "gyv" ],
-[ 5407, "gyw" ],
-[ 5408, "gyx" ],
-[ 5409, "gyy" ],
-[ 5410, "gyz" ],
-[ 5411, "gza" ],
-[ 5412, "gzb" ],
-[ 5413, "gzc" ],
-[ 5414, "gzd" ],
-[ 5415, "gze" ],
-[ 5416, "gzf" ],
-[ 5417, "gzg" ],
-[ 5418, "gzh" ],
-[ 5419, "gzi" ],
-[ 5420, "gzj" ],
-[ 5421, "gzk" ],
-[ 5422, "gzl" ],
-[ 5423, "gzm" ],
-[ 5424, "gzn" ],
-[ 5425, "gzo" ],
-[ 5426, "gzp" ],
-[ 5427, "gzq" ],
-[ 5428, "gzr" ],
-[ 5429, "gzs" ],
-[ 5430, "gzt" ],
-[ 5431, "gzu" ],
-[ 5432, "gzv" ],
-[ 5433, "gzw" ],
-[ 5434, "gzx" ],
-[ 5435, "gzy" ],
-[ 5436, "gzz" ],
-[ 5437, "haa" ],
-[ 5438, "hab" ],
-[ 5439, "hac" ],
-[ 5440, "had" ],
-[ 5441, "hae" ],
-[ 5442, "haf" ],
-[ 5443, "hag" ],
-[ 5444, "hah" ],
-[ 5445, "hai" ],
-[ 5446, "haj" ],
-[ 5447, "hak" ],
-[ 5448, "hal" ],
-[ 5449, "ham" ],
-[ 5450, "han" ],
-[ 5451, "hao" ],
-[ 5452, "hap" ],
-[ 5453, "haq" ],
-[ 5454, "har" ],
-[ 5455, "has" ],
-[ 5456, "hat" ],
-[ 5457, "hau" ],
-[ 5458, "hav" ],
-[ 5459, "haw" ],
-[ 5460, "hax" ],
-[ 5461, "hay" ],
-[ 5462, "haz" ],
-[ 5463, "hba" ],
-[ 5464, "hbb" ],
-[ 5465, "hbc" ],
-[ 5466, "hbd" ],
-[ 5467, "hbe" ],
-[ 5468, "hbf" ],
-[ 5469, "hbg" ],
-[ 5470, "hbh" ],
-[ 5471, "hbi" ],
-[ 5472, "hbj" ],
-[ 5473, "hbk" ],
-[ 5474, "hbl" ],
-[ 5475, "hbm" ],
-[ 5476, "hbn" ],
-[ 5477, "hbo" ],
-[ 5478, "hbp" ],
-[ 5479, "hbq" ],
-[ 5480, "hbr" ],
-[ 5481, "hbs" ],
-[ 5482, "hbt" ],
-[ 5483, "hbu" ],
-[ 5484, "hbv" ],
-[ 5485, "hbw" ],
-[ 5486, "hbx" ],
-[ 5487, "hby" ],
-[ 5488, "hbz" ],
-[ 5489, "hca" ],
-[ 5490, "hcb" ],
-[ 5491, "hcc" ],
-[ 5492, "hcd" ],
-[ 5493, "hce" ],
-[ 5494, "hcf" ],
-[ 5495, "hcg" ],
-[ 5496, "hch" ],
-[ 5497, "hci" ],
-[ 5498, "hcj" ],
-[ 5499, "hck" ],
-[ 5500, "hcl" ],
-[ 5501, "hcm" ],
-[ 5502, "hcn" ],
-[ 5503, "hco" ],
-[ 5504, "hcp" ],
-[ 5505, "hcq" ],
-[ 5506, "hcr" ],
-[ 5507, "hcs" ],
-[ 5508, "hct" ],
-[ 5509, "hcu" ],
-[ 5510, "hcv" ],
-[ 5511, "hcw" ],
-[ 5512, "hcx" ],
-[ 5513, "hcy" ],
-[ 5514, "hcz" ],
-[ 5515, "hda" ],
-[ 5516, "hdb" ],
-[ 5517, "hdc" ],
-[ 5518, "hdd" ],
-[ 5519, "hde" ],
-[ 5520, "hdf" ],
-[ 5521, "hdg" ],
-[ 5522, "hdh" ],
-[ 5523, "hdi" ],
-[ 5524, "hdj" ],
-[ 5525, "hdk" ],
-[ 5526, "hdl" ],
-[ 5527, "hdm" ],
-[ 5528, "hdn" ],
-[ 5529, "hdo" ],
-[ 5530, "hdp" ],
-[ 5531, "hdq" ],
-[ 5532, "hdr" ],
-[ 5533, "hds" ],
-[ 5534, "hdt" ],
-[ 5535, "hdu" ],
-[ 5536, "hdv" ],
-[ 5537, "hdw" ],
-[ 5538, "hdx" ],
-[ 5539, "hdy" ],
-[ 5540, "hdz" ],
-[ 5541, "hea" ],
-[ 5542, "heb" ],
-[ 5543, "hec" ],
-[ 5544, "hed" ],
-[ 5545, "hee" ],
-[ 5546, "hef" ],
-[ 5547, "heg" ],
-[ 5548, "heh" ],
-[ 5549, "hei" ],
-[ 5550, "hej" ],
-[ 5551, "hek" ],
-[ 5552, "hel" ],
-[ 5553, "hem" ],
-[ 5554, "hen" ],
-[ 5555, "heo" ],
-[ 5556, "hep" ],
-[ 5557, "heq" ],
-[ 5558, "her" ],
-[ 5559, "hes" ],
-[ 5560, "het" ],
-[ 5561, "heu" ],
-[ 5562, "hev" ],
-[ 5563, "hew" ],
-[ 5564, "hex" ],
-[ 5565, "hey" ],
-[ 5566, "hez" ],
-[ 5567, "hfa" ],
-[ 5568, "hfb" ],
-[ 5569, "hfc" ],
-[ 5570, "hfd" ],
-[ 5571, "hfe" ],
-[ 5572, "hff" ],
-[ 5573, "hfg" ],
-[ 5574, "hfh" ],
-[ 5575, "hfi" ],
-[ 5576, "hfj" ],
-[ 5577, "hfk" ],
-[ 5578, "hfl" ],
-[ 5579, "hfm" ],
-[ 5580, "hfn" ],
-[ 5581, "hfo" ],
-[ 5582, "hfp" ],
-[ 5583, "hfq" ],
-[ 5584, "hfr" ],
-[ 5585, "hfs" ],
-[ 5586, "hft" ],
-[ 5587, "hfu" ],
-[ 5588, "hfv" ],
-[ 5589, "hfw" ],
-[ 5590, "hfx" ],
-[ 5591, "hfy" ],
-[ 5592, "hfz" ],
-[ 5593, "hga" ],
-[ 5594, "hgb" ],
-[ 5595, "hgc" ],
-[ 5596, "hgd" ],
-[ 5597, "hge" ],
-[ 5598, "hgf" ],
-[ 5599, "hgg" ],
-[ 5600, "hgh" ],
-[ 5601, "hgi" ],
-[ 5602, "hgj" ],
-[ 5603, "hgk" ],
-[ 5604, "hgl" ],
-[ 5605, "hgm" ],
-[ 5606, "hgn" ],
-[ 5607, "hgo" ],
-[ 5608, "hgp" ],
-[ 5609, "hgq" ],
-[ 5610, "hgr" ],
-[ 5611, "hgs" ],
-[ 5612, "hgt" ],
-[ 5613, "hgu" ],
-[ 5614, "hgv" ],
-[ 5615, "hgw" ],
-[ 5616, "hgx" ],
-[ 5617, "hgy" ],
-[ 5618, "hgz" ],
-[ 5619, "hha" ],
-[ 5620, "hhb" ],
-[ 5621, "hhc" ],
-[ 5622, "hhd" ],
-[ 5623, "hhe" ],
-[ 5624, "hhf" ],
-[ 5625, "hhg" ],
-[ 5626, "hhh" ],
-[ 5627, "hhi" ],
-[ 5628, "hhj" ],
-[ 5629, "hhk" ],
-[ 5630, "hhl" ],
-[ 5631, "hhm" ],
-[ 5632, "hhn" ],
-[ 5633, "hho" ],
-[ 5634, "hhp" ],
-[ 5635, "hhq" ],
-[ 5636, "hhr" ],
-[ 5637, "hhs" ],
-[ 5638, "hht" ],
-[ 5639, "hhu" ],
-[ 5640, "hhv" ],
-[ 5641, "hhw" ],
-[ 5642, "hhx" ],
-[ 5643, "hhy" ],
-[ 5644, "hhz" ],
-[ 5645, "hia" ],
-[ 5646, "hib" ],
-[ 5647, "hic" ],
-[ 5648, "hid" ],
-[ 5649, "hie" ],
-[ 5650, "hif" ],
-[ 5651, "hig" ],
-[ 5652, "hih" ],
-[ 5653, "hii" ],
-[ 5654, "hij" ],
-[ 5655, "hik" ],
-[ 5656, "hil" ],
-[ 5657, "him" ],
-[ 5658, "hin" ],
-[ 5659, "hio" ],
-[ 5660, "hip" ],
-[ 5661, "hiq" ],
-[ 5662, "hir" ],
-[ 5663, "his" ],
-[ 5664, "hit" ],
-[ 5665, "hiu" ],
-[ 5666, "hiv" ],
-[ 5667, "hiw" ],
-[ 5668, "hix" ],
-[ 5669, "hiy" ],
-[ 5670, "hiz" ],
-[ 5671, "hja" ],
-[ 5672, "hjb" ],
-[ 5673, "hjc" ],
-[ 5674, "hjd" ],
-[ 5675, "hje" ],
-[ 5676, "hjf" ],
-[ 5677, "hjg" ],
-[ 5678, "hjh" ],
-[ 5679, "hji" ],
-[ 5680, "hjj" ],
-[ 5681, "hjk" ],
-[ 5682, "hjl" ],
-[ 5683, "hjm" ],
-[ 5684, "hjn" ],
-[ 5685, "hjo" ],
-[ 5686, "hjp" ],
-[ 5687, "hjq" ],
-[ 5688, "hjr" ],
-[ 5689, "hjs" ],
-[ 5690, "hjt" ],
-[ 5691, "hju" ],
-[ 5692, "hjv" ],
-[ 5693, "hjw" ],
-[ 5694, "hjx" ],
-[ 5695, "hjy" ],
-[ 5696, "hjz" ],
-[ 5697, "hka" ],
-[ 5698, "hkb" ],
-[ 5699, "hkc" ],
-[ 5700, "hkd" ],
-[ 5701, "hke" ],
-[ 5702, "hkf" ],
-[ 5703, "hkg" ],
-[ 5704, "hkh" ],
-[ 5705, "hki" ],
-[ 5706, "hkj" ],
-[ 5707, "hkk" ],
-[ 5708, "hkl" ],
-[ 5709, "hkm" ],
-[ 5710, "hkn" ],
-[ 5711, "hko" ],
-[ 5712, "hkp" ],
-[ 5713, "hkq" ],
-[ 5714, "hkr" ],
-[ 5715, "hks" ],
-[ 5716, "hkt" ],
-[ 5717, "hku" ],
-[ 5718, "hkv" ],
-[ 5719, "hkw" ],
-[ 5720, "hkx" ],
-[ 5721, "hky" ],
-[ 5722, "hkz" ],
-[ 5723, "hla" ],
-[ 5724, "hlb" ],
-[ 5725, "hlc" ],
-[ 5726, "hld" ],
-[ 5727, "hle" ],
-[ 5728, "hlf" ],
-[ 5729, "hlg" ],
-[ 5730, "hlh" ],
-[ 5731, "hli" ],
-[ 5732, "hlj" ],
-[ 5733, "hlk" ],
-[ 5734, "hll" ],
-[ 5735, "hlm" ],
-[ 5736, "hln" ],
-[ 5737, "hlo" ],
-[ 5738, "hlp" ],
-[ 5739, "hlq" ],
-[ 5740, "hlr" ],
-[ 5741, "hls" ],
-[ 5742, "hlt" ],
-[ 5743, "hlu" ],
-[ 5744, "hlv" ],
-[ 5745, "hlw" ],
-[ 5746, "hlx" ],
-[ 5747, "hly" ],
-[ 5748, "hlz" ],
-[ 5749, "hma" ],
-[ 5750, "hmb" ],
-[ 5751, "hmc" ],
-[ 5752, "hmd" ],
-[ 5753, "hme" ],
-[ 5754, "hmf" ],
-[ 5755, "hmg" ],
-[ 5756, "hmh" ],
-[ 5757, "hmi" ],
-[ 5758, "hmj" ],
-[ 5759, "hmk" ],
-[ 5760, "hml" ],
-[ 5761, "hmm" ],
-[ 5762, "hmn" ],
-[ 5763, "hmo" ],
-[ 5764, "hmp" ],
-[ 5765, "hmq" ],
-[ 5766, "hmr" ],
-[ 5767, "hms" ],
-[ 5768, "hmt" ],
-[ 5769, "hmu" ],
-[ 5770, "hmv" ],
-[ 5771, "hmw" ],
-[ 5772, "hmx" ],
-[ 5773, "hmy" ],
-[ 5774, "hmz" ],
-[ 5775, "hna" ],
-[ 5776, "hnb" ],
-[ 5777, "hnc" ],
-[ 5778, "hnd" ],
-[ 5779, "hne" ],
-[ 5780, "hnf" ],
-[ 5781, "hng" ],
-[ 5782, "hnh" ],
-[ 5783, "hni" ],
-[ 5784, "hnj" ],
-[ 5785, "hnk" ],
-[ 5786, "hnl" ],
-[ 5787, "hnm" ],
-[ 5788, "hnn" ],
-[ 5789, "hno" ],
-[ 5790, "hnp" ],
-[ 5791, "hnq" ],
-[ 5792, "hnr" ],
-[ 5793, "hns" ],
-[ 5794, "hnt" ],
-[ 5795, "hnu" ],
-[ 5796, "hnv" ],
-[ 5797, "hnw" ],
-[ 5798, "hnx" ],
-[ 5799, "hny" ],
-[ 5800, "hnz" ],
-[ 5801, "hoa" ],
-[ 5802, "hob" ],
-[ 5803, "hoc" ],
-[ 5804, "hod" ],
-[ 5805, "hoe" ],
-[ 5806, "hof" ],
-[ 5807, "hog" ],
-[ 5808, "hoh" ],
-[ 5809, "hoi" ],
-[ 5810, "hoj" ],
-[ 5811, "hok" ],
-[ 5812, "hol" ],
-[ 5813, "hom" ],
-[ 5814, "hon" ],
-[ 5815, "hoo" ],
-[ 5816, "hop" ],
-[ 5817, "hoq" ],
-[ 5818, "hor" ],
-[ 5819, "hos" ],
-[ 5820, "hot" ],
-[ 5821, "hou" ],
-[ 5822, "hov" ],
-[ 5823, "how" ],
-[ 5824, "hox" ],
-[ 5825, "hoy" ],
-[ 5826, "hoz" ],
-[ 5827, "hpa" ],
-[ 5828, "hpb" ],
-[ 5829, "hpc" ],
-[ 5830, "hpd" ],
-[ 5831, "hpe" ],
-[ 5832, "hpf" ],
-[ 5833, "hpg" ],
-[ 5834, "hph" ],
-[ 5835, "hpi" ],
-[ 5836, "hpj" ],
-[ 5837, "hpk" ],
-[ 5838, "hpl" ],
-[ 5839, "hpm" ],
-[ 5840, "hpn" ],
-[ 5841, "hpo" ],
-[ 5842, "hpp" ],
-[ 5843, "hpq" ],
-[ 5844, "hpr" ],
-[ 5845, "hps" ],
-[ 5846, "hpt" ],
-[ 5847, "hpu" ],
-[ 5848, "hpv" ],
-[ 5849, "hpw" ],
-[ 5850, "hpx" ],
-[ 5851, "hpy" ],
-[ 5852, "hpz" ],
-[ 5853, "hqa" ],
-[ 5854, "hqb" ],
-[ 5855, "hqc" ],
-[ 5856, "hqd" ],
-[ 5857, "hqe" ],
-[ 5858, "hqf" ],
-[ 5859, "hqg" ],
-[ 5860, "hqh" ],
-[ 5861, "hqi" ],
-[ 5862, "hqj" ],
-[ 5863, "hqk" ],
-[ 5864, "hql" ],
-[ 5865, "hqm" ],
-[ 5866, "hqn" ],
-[ 5867, "hqo" ],
-[ 5868, "hqp" ],
-[ 5869, "hqq" ],
-[ 5870, "hqr" ],
-[ 5871, "hqs" ],
-[ 5872, "hqt" ],
-[ 5873, "hqu" ],
-[ 5874, "hqv" ],
-[ 5875, "hqw" ],
-[ 5876, "hqx" ],
-[ 5877, "hqy" ],
-[ 5878, "hqz" ],
-[ 5879, "hra" ],
-[ 5880, "hrb" ],
-[ 5881, "hrc" ],
-[ 5882, "hrd" ],
-[ 5883, "hre" ],
-[ 5884, "hrf" ],
-[ 5885, "hrg" ],
-[ 5886, "hrh" ],
-[ 5887, "hri" ],
-[ 5888, "hrj" ],
-[ 5889, "hrk" ],
-[ 5890, "hrl" ],
-[ 5891, "hrm" ],
-[ 5892, "hrn" ],
-[ 5893, "hro" ],
-[ 5894, "hrp" ],
-[ 5895, "hrq" ],
-[ 5896, "hrr" ],
-[ 5897, "hrs" ],
-[ 5898, "hrt" ],
-[ 5899, "hru" ],
-[ 5900, "hrv" ],
-[ 5901, "hrw" ],
-[ 5902, "hrx" ],
-[ 5903, "hry" ],
-[ 5904, "hrz" ],
-[ 5905, "hsa" ],
-[ 5906, "hsb" ],
-[ 5907, "hsc" ],
-[ 5908, "hsd" ],
-[ 5909, "hse" ],
-[ 5910, "hsf" ],
-[ 5911, "hsg" ],
-[ 5912, "hsh" ],
-[ 5913, "hsi" ],
-[ 5914, "hsj" ],
-[ 5915, "hsk" ],
-[ 5916, "hsl" ],
-[ 5917, "hsm" ],
-[ 5918, "hsn" ],
-[ 5919, "hso" ],
-[ 5920, "hsp" ],
-[ 5921, "hsq" ],
-[ 5922, "hsr" ],
-[ 5923, "hss" ],
-[ 5924, "hst" ],
-[ 5925, "hsu" ],
-[ 5926, "hsv" ],
-[ 5927, "hsw" ],
-[ 5928, "hsx" ],
-[ 5929, "hsy" ],
-[ 5930, "hsz" ],
-[ 5931, "hta" ],
-[ 5932, "htb" ],
-[ 5933, "htc" ],
-[ 5934, "htd" ],
-[ 5935, "hte" ],
-[ 5936, "htf" ],
-[ 5937, "htg" ],
-[ 5938, "hth" ],
-[ 5939, "hti" ],
-[ 5940, "htj" ],
-[ 5941, "htk" ],
-[ 5942, "htl" ],
-[ 5943, "htm" ],
-[ 5944, "htn" ],
-[ 5945, "hto" ],
-[ 5946, "htp" ],
-[ 5947, "htq" ],
-[ 5948, "htr" ],
-[ 5949, "hts" ],
-[ 5950, "htt" ],
-[ 5951, "htu" ],
-[ 5952, "htv" ],
-[ 5953, "htw" ],
-[ 5954, "htx" ],
-[ 5955, "hty" ],
-[ 5956, "htz" ],
-[ 5957, "hua" ],
-[ 5958, "hub" ],
-[ 5959, "huc" ],
-[ 5960, "hud" ],
-[ 5961, "hue" ],
-[ 5962, "huf" ],
-[ 5963, "hug" ],
-[ 5964, "huh" ],
-[ 5965, "hui" ],
-[ 5966, "huj" ],
-[ 5967, "huk" ],
-[ 5968, "hul" ],
-[ 5969, "hum" ],
-[ 5970, "hun" ],
-[ 5971, "huo" ],
-[ 5972, "hup" ],
-[ 5973, "huq" ],
-[ 5974, "hur" ],
-[ 5975, "hus" ],
-[ 5976, "hut" ],
-[ 5977, "huu" ],
-[ 5978, "huv" ],
-[ 5979, "huw" ],
-[ 5980, "hux" ],
-[ 5981, "huy" ],
-[ 5982, "huz" ],
-[ 5983, "hva" ],
-[ 5984, "hvb" ],
-[ 5985, "hvc" ],
-[ 5986, "hvd" ],
-[ 5987, "hve" ],
-[ 5988, "hvf" ],
-[ 5989, "hvg" ],
-[ 5990, "hvh" ],
-[ 5991, "hvi" ],
-[ 5992, "hvj" ],
-[ 5993, "hvk" ],
-[ 5994, "hvl" ],
-[ 5995, "hvm" ],
-[ 5996, "hvn" ],
-[ 5997, "hvo" ],
-[ 5998, "hvp" ],
-[ 5999, "hvq" ],
-[ 6000, "hvr" ],
-[ 6001, "hvs" ],
-[ 6002, "hvt" ],
-[ 6003, "hvu" ],
-[ 6004, "hvv" ],
-[ 6005, "hvw" ],
-[ 6006, "hvx" ],
-[ 6007, "hvy" ],
-[ 6008, "hvz" ],
-[ 6009, "hwa" ],
-[ 6010, "hwb" ],
-[ 6011, "hwc" ],
-[ 6012, "hwd" ],
-[ 6013, "hwe" ],
-[ 6014, "hwf" ],
-[ 6015, "hwg" ],
-[ 6016, "hwh" ],
-[ 6017, "hwi" ],
-[ 6018, "hwj" ],
-[ 6019, "hwk" ],
-[ 6020, "hwl" ],
-[ 6021, "hwm" ],
-[ 6022, "hwn" ],
-[ 6023, "hwo" ],
-[ 6024, "hwp" ],
-[ 6025, "hwq" ],
-[ 6026, "hwr" ],
-[ 6027, "hws" ],
-[ 6028, "hwt" ],
-[ 6029, "hwu" ],
-[ 6030, "hwv" ],
-[ 6031, "hww" ],
-[ 6032, "hwx" ],
-[ 6033, "hwy" ],
-[ 6034, "hwz" ],
-[ 6035, "hxa" ],
-[ 6036, "hxb" ],
-[ 6037, "hxc" ],
-[ 6038, "hxd" ],
-[ 6039, "hxe" ],
-[ 6040, "hxf" ],
-[ 6041, "hxg" ],
-[ 6042, "hxh" ],
-[ 6043, "hxi" ],
-[ 6044, "hxj" ],
-[ 6045, "hxk" ],
-[ 6046, "hxl" ],
-[ 6047, "hxm" ],
-[ 6048, "hxn" ],
-[ 6049, "hxo" ],
-[ 6050, "hxp" ],
-[ 6051, "hxq" ],
-[ 6052, "hxr" ],
-[ 6053, "hxs" ],
-[ 6054, "hxt" ],
-[ 6055, "hxu" ],
-[ 6056, "hxv" ],
-[ 6057, "hxw" ],
-[ 6058, "hxx" ],
-[ 6059, "hxy" ],
-[ 6060, "hxz" ],
-[ 6061, "hya" ],
-[ 6062, "hyb" ],
-[ 6063, "hyc" ],
-[ 6064, "hyd" ],
-[ 6065, "hye" ],
-[ 6066, "hyf" ],
-[ 6067, "hyg" ],
-[ 6068, "hyh" ],
-[ 6069, "hyi" ],
-[ 6070, "hyj" ],
-[ 6071, "hyk" ],
-[ 6072, "hyl" ],
-[ 6073, "hym" ],
-[ 6074, "hyn" ],
-[ 6075, "hyo" ],
-[ 6076, "hyp" ],
-[ 6077, "hyq" ],
-[ 6078, "hyr" ],
-[ 6079, "hys" ],
-[ 6080, "hyt" ],
-[ 6081, "hyu" ],
-[ 6082, "hyv" ],
-[ 6083, "hyw" ],
-[ 6084, "hyx" ],
-[ 6085, "hyy" ],
-[ 6086, "hyz" ],
-[ 6087, "hza" ],
-[ 6088, "hzb" ],
-[ 6089, "hzc" ],
-[ 6090, "hzd" ],
-[ 6091, "hze" ],
-[ 6092, "hzf" ],
-[ 6093, "hzg" ],
-[ 6094, "hzh" ],
-[ 6095, "hzi" ],
-[ 6096, "hzj" ],
-[ 6097, "hzk" ],
-[ 6098, "hzl" ],
-[ 6099, "hzm" ],
-[ 6100, "hzn" ],
-[ 6101, "hzo" ],
-[ 6102, "hzp" ],
-[ 6103, "hzq" ],
-[ 6104, "hzr" ],
-[ 6105, "hzs" ],
-[ 6106, "hzt" ],
-[ 6107, "hzu" ],
-[ 6108, "hzv" ],
-[ 6109, "hzw" ],
-[ 6110, "hzx" ],
-[ 6111, "hzy" ],
-[ 6112, "hzz" ],
-[ 6113, "iaa" ],
-[ 6114, "iab" ],
-[ 6115, "iac" ],
-[ 6116, "iad" ],
-[ 6117, "iae" ],
-[ 6118, "iaf" ],
-[ 6119, "iag" ],
-[ 6120, "iah" ],
-[ 6121, "iai" ],
-[ 6122, "iaj" ],
-[ 6123, "iak" ],
-[ 6124, "ial" ],
-[ 6125, "iam" ],
-[ 6126, "ian" ],
-[ 6127, "iao" ],
-[ 6128, "iap" ],
-[ 6129, "iaq" ],
-[ 6130, "iar" ],
-[ 6131, "ias" ],
-[ 6132, "iat" ],
-[ 6133, "iau" ],
-[ 6134, "iav" ],
-[ 6135, "iaw" ],
-[ 6136, "iax" ],
-[ 6137, "iay" ],
-[ 6138, "iaz" ],
-[ 6139, "iba" ],
-[ 6140, "ibb" ],
-[ 6141, "ibc" ],
-[ 6142, "ibd" ],
-[ 6143, "ibe" ],
-[ 6144, "ibf" ],
-[ 6145, "ibg" ],
-[ 6146, "ibh" ],
-[ 6147, "ibi" ],
-[ 6148, "ibj" ],
-[ 6149, "ibk" ],
-[ 6150, "ibl" ],
-[ 6151, "ibm" ],
-[ 6152, "ibn" ],
-[ 6153, "ibo" ],
-[ 6154, "ibp" ],
-[ 6155, "ibq" ],
-[ 6156, "ibr" ],
-[ 6157, "ibs" ],
-[ 6158, "ibt" ],
-[ 6159, "ibu" ],
-[ 6160, "ibv" ],
-[ 6161, "ibw" ],
-[ 6162, "ibx" ],
-[ 6163, "iby" ],
-[ 6164, "ibz" ],
-[ 6165, "ica" ],
-[ 6166, "icb" ],
-[ 6167, "icc" ],
-[ 6168, "icd" ],
-[ 6169, "ice" ],
-[ 6170, "icf" ],
-[ 6171, "icg" ],
-[ 6172, "ich" ],
-[ 6173, "ici" ],
-[ 6174, "icj" ],
-[ 6175, "ick" ],
-[ 6176, "icl" ],
-[ 6177, "icm" ],
-[ 6178, "icn" ],
-[ 6179, "ico" ],
-[ 6180, "icp" ],
-[ 6181, "icq" ],
-[ 6182, "icr" ],
-[ 6183, "ics" ],
-[ 6184, "ict" ],
-[ 6185, "icu" ],
-[ 6186, "icv" ],
-[ 6187, "icw" ],
-[ 6188, "icx" ],
-[ 6189, "icy" ],
-[ 6190, "icz" ],
-[ 6191, "ida" ],
-[ 6192, "idb" ],
-[ 6193, "idc" ],
-[ 6194, "idd" ],
-[ 6195, "ide" ],
-[ 6196, "idf" ],
-[ 6197, "idg" ],
-[ 6198, "idh" ],
-[ 6199, "idi" ],
-[ 6200, "idj" ],
-[ 6201, "idk" ],
-[ 6202, "idl" ],
-[ 6203, "idm" ],
-[ 6204, "idn" ],
-[ 6205, "ido" ],
-[ 6206, "idp" ],
-[ 6207, "idq" ],
-[ 6208, "idr" ],
-[ 6209, "ids" ],
-[ 6210, "idt" ],
-[ 6211, "idu" ],
-[ 6212, "idv" ],
-[ 6213, "idw" ],
-[ 6214, "idx" ],
-[ 6215, "idy" ],
-[ 6216, "idz" ],
-[ 6217, "iea" ],
-[ 6218, "ieb" ],
-[ 6219, "iec" ],
-[ 6220, "ied" ],
-[ 6221, "iee" ],
-[ 6222, "ief" ],
-[ 6223, "ieg" ],
-[ 6224, "ieh" ],
-[ 6225, "iei" ],
-[ 6226, "iej" ],
-[ 6227, "iek" ],
-[ 6228, "iel" ],
-[ 6229, "iem" ],
-[ 6230, "ien" ],
-[ 6231, "ieo" ],
-[ 6232, "iep" ],
-[ 6233, "ieq" ],
-[ 6234, "ier" ],
-[ 6235, "ies" ],
-[ 6236, "iet" ],
-[ 6237, "ieu" ],
-[ 6238, "iev" ],
-[ 6239, "iew" ],
-[ 6240, "iex" ],
-[ 6241, "iey" ],
-[ 6242, "iez" ],
-[ 6243, "ifa" ],
-[ 6244, "ifb" ],
-[ 6245, "ifc" ],
-[ 6246, "ifd" ],
-[ 6247, "ife" ],
-[ 6248, "iff" ],
-[ 6249, "ifg" ],
-[ 6250, "ifh" ],
-[ 6251, "ifi" ],
-[ 6252, "ifj" ],
-[ 6253, "ifk" ],
-[ 6254, "ifl" ],
-[ 6255, "ifm" ],
-[ 6256, "ifn" ],
-[ 6257, "ifo" ],
-[ 6258, "ifp" ],
-[ 6259, "ifq" ],
-[ 6260, "ifr" ],
-[ 6261, "ifs" ],
-[ 6262, "ift" ],
-[ 6263, "ifu" ],
-[ 6264, "ifv" ],
-[ 6265, "ifw" ],
-[ 6266, "ifx" ],
-[ 6267, "ify" ],
-[ 6268, "ifz" ],
-[ 6269, "iga" ],
-[ 6270, "igb" ],
-[ 6271, "igc" ],
-[ 6272, "igd" ],
-[ 6273, "ige" ],
-[ 6274, "igf" ],
-[ 6275, "igg" ],
-[ 6276, "igh" ],
-[ 6277, "igi" ],
-[ 6278, "igj" ],
-[ 6279, "igk" ],
-[ 6280, "igl" ],
-[ 6281, "igm" ],
-[ 6282, "ign" ],
-[ 6283, "igo" ],
-[ 6284, "igp" ],
-[ 6285, "igq" ],
-[ 6286, "igr" ],
-[ 6287, "igs" ],
-[ 6288, "igt" ],
-[ 6289, "igu" ],
-[ 6290, "igv" ],
-[ 6291, "igw" ],
-[ 6292, "igx" ],
-[ 6293, "igy" ],
-[ 6294, "igz" ],
-[ 6295, "iha" ],
-[ 6296, "ihb" ],
-[ 6297, "ihc" ],
-[ 6298, "ihd" ],
-[ 6299, "ihe" ],
-[ 6300, "ihf" ],
-[ 6301, "ihg" ],
-[ 6302, "ihh" ],
-[ 6303, "ihi" ],
-[ 6304, "ihj" ],
-[ 6305, "ihk" ],
-[ 6306, "ihl" ],
-[ 6307, "ihm" ],
-[ 6308, "ihn" ],
-[ 6309, "iho" ],
-[ 6310, "ihp" ],
-[ 6311, "ihq" ],
-[ 6312, "ihr" ],
-[ 6313, "ihs" ],
-[ 6314, "iht" ],
-[ 6315, "ihu" ],
-[ 6316, "ihv" ],
-[ 6317, "ihw" ],
-[ 6318, "ihx" ],
-[ 6319, "ihy" ],
-[ 6320, "ihz" ],
-[ 6321, "iia" ],
-[ 6322, "iib" ],
-[ 6323, "iic" ],
-[ 6324, "iid" ],
-[ 6325, "iie" ],
-[ 6326, "iif" ],
-[ 6327, "iig" ],
-[ 6328, "iih" ],
-[ 6329, "iii" ],
-[ 6330, "iij" ],
-[ 6331, "iik" ],
-[ 6332, "iil" ],
-[ 6333, "iim" ],
-[ 6334, "iin" ],
-[ 6335, "iio" ],
-[ 6336, "iip" ],
-[ 6337, "iiq" ],
-[ 6338, "iir" ],
-[ 6339, "iis" ],
-[ 6340, "iit" ],
-[ 6341, "iiu" ],
-[ 6342, "iiv" ],
-[ 6343, "iiw" ],
-[ 6344, "iix" ],
-[ 6345, "iiy" ],
-[ 6346, "iiz" ],
-[ 6347, "ija" ],
-[ 6348, "ijb" ],
-[ 6349, "ijc" ],
-[ 6350, "ijd" ],
-[ 6351, "ije" ],
-[ 6352, "ijf" ],
-[ 6353, "ijg" ],
-[ 6354, "ijh" ],
-[ 6355, "iji" ],
-[ 6356, "ijj" ],
-[ 6357, "ijk" ],
-[ 6358, "ijl" ],
-[ 6359, "ijm" ],
-[ 6360, "ijn" ],
-[ 6361, "ijo" ],
-[ 6362, "ijp" ],
-[ 6363, "ijq" ],
-[ 6364, "ijr" ],
-[ 6365, "ijs" ],
-[ 6366, "ijt" ],
-[ 6367, "iju" ],
-[ 6368, "ijv" ],
-[ 6369, "ijw" ],
-[ 6370, "ijx" ],
-[ 6371, "ijy" ],
-[ 6372, "ijz" ],
-[ 6373, "ika" ],
-[ 6374, "ikb" ],
-[ 6375, "ikc" ],
-[ 6376, "ikd" ],
-[ 6377, "ike" ],
-[ 6378, "ikf" ],
-[ 6379, "ikg" ],
-[ 6380, "ikh" ],
-[ 6381, "iki" ],
-[ 6382, "ikj" ],
-[ 6383, "ikk" ],
-[ 6384, "ikl" ],
-[ 6385, "ikm" ],
-[ 6386, "ikn" ],
-[ 6387, "iko" ],
-[ 6388, "ikp" ],
-[ 6389, "ikq" ],
-[ 6390, "ikr" ],
-[ 6391, "iks" ],
-[ 6392, "ikt" ],
-[ 6393, "iku" ],
-[ 6394, "ikv" ],
-[ 6395, "ikw" ],
-[ 6396, "ikx" ],
-[ 6397, "iky" ],
-[ 6398, "ikz" ],
-[ 6399, "ila" ],
-[ 6400, "ilb" ],
-[ 6401, "ilc" ],
-[ 6402, "ild" ],
-[ 6403, "ile" ],
-[ 6404, "ilf" ],
-[ 6405, "ilg" ],
-[ 6406, "ilh" ],
-[ 6407, "ili" ],
-[ 6408, "ilj" ],
-[ 6409, "ilk" ],
-[ 6410, "ill" ],
-[ 6411, "ilm" ],
-[ 6412, "iln" ],
-[ 6413, "ilo" ],
-[ 6414, "ilp" ],
-[ 6415, "ilq" ],
-[ 6416, "ilr" ],
-[ 6417, "ils" ],
-[ 6418, "ilt" ],
-[ 6419, "ilu" ],
-[ 6420, "ilv" ],
-[ 6421, "ilw" ],
-[ 6422, "ilx" ],
-[ 6423, "ily" ],
-[ 6424, "ilz" ],
-[ 6425, "ima" ],
-[ 6426, "imb" ],
-[ 6427, "imc" ],
-[ 6428, "imd" ],
-[ 6429, "ime" ],
-[ 6430, "imf" ],
-[ 6431, "img" ],
-[ 6432, "imh" ],
-[ 6433, "imi" ],
-[ 6434, "imj" ],
-[ 6435, "imk" ],
-[ 6436, "iml" ],
-[ 6437, "imm" ],
-[ 6438, "imn" ],
-[ 6439, "imo" ],
-[ 6440, "imp" ],
-[ 6441, "imq" ],
-[ 6442, "imr" ],
-[ 6443, "ims" ],
-[ 6444, "imt" ],
-[ 6445, "imu" ],
-[ 6446, "imv" ],
-[ 6447, "imw" ],
-[ 6448, "imx" ],
-[ 6449, "imy" ],
-[ 6450, "imz" ],
-[ 6451, "ina" ],
-[ 6452, "inb" ],
-[ 6453, "inc" ],
-[ 6454, "ind" ],
-[ 6455, "ine" ],
-[ 6456, "inf" ],
-[ 6457, "ing" ],
-[ 6458, "inh" ],
-[ 6459, "ini" ],
-[ 6460, "inj" ],
-[ 6461, "ink" ],
-[ 6462, "inl" ],
-[ 6463, "inm" ],
-[ 6464, "inn" ],
-[ 6465, "ino" ],
-[ 6466, "inp" ],
-[ 6467, "inq" ],
-[ 6468, "inr" ],
-[ 6469, "ins" ],
-[ 6470, "int" ],
-[ 6471, "inu" ],
-[ 6472, "inv" ],
-[ 6473, "inw" ],
-[ 6474, "inx" ],
-[ 6475, "iny" ],
-[ 6476, "inz" ],
-[ 6477, "ioa" ],
-[ 6478, "iob" ],
-[ 6479, "ioc" ],
-[ 6480, "iod" ],
-[ 6481, "ioe" ],
-[ 6482, "iof" ],
-[ 6483, "iog" ],
-[ 6484, "ioh" ],
-[ 6485, "ioi" ],
-[ 6486, "ioj" ],
-[ 6487, "iok" ],
-[ 6488, "iol" ],
-[ 6489, "iom" ],
-[ 6490, "ion" ],
-[ 6491, "ioo" ],
-[ 6492, "iop" ],
-[ 6493, "ioq" ],
-[ 6494, "ior" ],
-[ 6495, "ios" ],
-[ 6496, "iot" ],
-[ 6497, "iou" ],
-[ 6498, "iov" ],
-[ 6499, "iow" ],
-[ 6500, "iox" ],
-[ 6501, "ioy" ],
-[ 6502, "ioz" ],
-[ 6503, "ipa" ],
-[ 6504, "ipb" ],
-[ 6505, "ipc" ],
-[ 6506, "ipd" ],
-[ 6507, "ipe" ],
-[ 6508, "ipf" ],
-[ 6509, "ipg" ],
-[ 6510, "iph" ],
-[ 6511, "ipi" ],
-[ 6512, "ipj" ],
-[ 6513, "ipk" ],
-[ 6514, "ipl" ],
-[ 6515, "ipm" ],
-[ 6516, "ipn" ],
-[ 6517, "ipo" ],
-[ 6518, "ipp" ],
-[ 6519, "ipq" ],
-[ 6520, "ipr" ],
-[ 6521, "ips" ],
-[ 6522, "ipt" ],
-[ 6523, "ipu" ],
-[ 6524, "ipv" ],
-[ 6525, "ipw" ],
-[ 6526, "ipx" ],
-[ 6527, "ipy" ],
-[ 6528, "ipz" ],
-[ 6529, "iqa" ],
-[ 6530, "iqb" ],
-[ 6531, "iqc" ],
-[ 6532, "iqd" ],
-[ 6533, "iqe" ],
-[ 6534, "iqf" ],
-[ 6535, "iqg" ],
-[ 6536, "iqh" ],
-[ 6537, "iqi" ],
-[ 6538, "iqj" ],
-[ 6539, "iqk" ],
-[ 6540, "iql" ],
-[ 6541, "iqm" ],
-[ 6542, "iqn" ],
-[ 6543, "iqo" ],
-[ 6544, "iqp" ],
-[ 6545, "iqq" ],
-[ 6546, "iqr" ],
-[ 6547, "iqs" ],
-[ 6548, "iqt" ],
-[ 6549, "iqu" ],
-[ 6550, "iqv" ],
-[ 6551, "iqw" ],
-[ 6552, "iqx" ],
-[ 6553, "iqy" ],
-[ 6554, "iqz" ],
-[ 6555, "ira" ],
-[ 6556, "irb" ],
-[ 6557, "irc" ],
-[ 6558, "ird" ],
-[ 6559, "ire" ],
-[ 6560, "irf" ],
-[ 6561, "irg" ],
-[ 6562, "irh" ],
-[ 6563, "iri" ],
-[ 6564, "irj" ],
-[ 6565, "irk" ],
-[ 6566, "irl" ],
-[ 6567, "irm" ],
-[ 6568, "irn" ],
-[ 6569, "iro" ],
-[ 6570, "irp" ],
-[ 6571, "irq" ],
-[ 6572, "irr" ],
-[ 6573, "irs" ],
-[ 6574, "irt" ],
-[ 6575, "iru" ],
-[ 6576, "irv" ],
-[ 6577, "irw" ],
-[ 6578, "irx" ],
-[ 6579, "iry" ],
-[ 6580, "irz" ],
-[ 6581, "isa" ],
-[ 6582, "isb" ],
-[ 6583, "isc" ],
-[ 6584, "isd" ],
-[ 6585, "ise" ],
-[ 6586, "isf" ],
-[ 6587, "isg" ],
-[ 6588, "ish" ],
-[ 6589, "isi" ],
-[ 6590, "isj" ],
-[ 6591, "isk" ],
-[ 6592, "isl" ],
-[ 6593, "ism" ],
-[ 6594, "isn" ],
-[ 6595, "iso" ],
-[ 6596, "isp" ],
-[ 6597, "isq" ],
-[ 6598, "isr" ],
-[ 6599, "iss" ],
-[ 6600, "ist" ],
-[ 6601, "isu" ],
-[ 6602, "isv" ],
-[ 6603, "isw" ],
-[ 6604, "isx" ],
-[ 6605, "isy" ],
-[ 6606, "isz" ],
-[ 6607, "ita" ],
-[ 6608, "itb" ],
-[ 6609, "itc" ],
-[ 6610, "itd" ],
-[ 6611, "ite" ],
-[ 6612, "itf" ],
-[ 6613, "itg" ],
-[ 6614, "ith" ],
-[ 6615, "iti" ],
-[ 6616, "itj" ],
-[ 6617, "itk" ],
-[ 6618, "itl" ],
-[ 6619, "itm" ],
-[ 6620, "itn" ],
-[ 6621, "ito" ],
-[ 6622, "itp" ],
-[ 6623, "itq" ],
-[ 6624, "itr" ],
-[ 6625, "its" ],
-[ 6626, "itt" ],
-[ 6627, "itu" ],
-[ 6628, "itv" ],
-[ 6629, "itw" ],
-[ 6630, "itx" ],
-[ 6631, "ity" ],
-[ 6632, "itz" ],
-[ 6633, "iua" ],
-[ 6634, "iub" ],
-[ 6635, "iuc" ],
-[ 6636, "iud" ],
-[ 6637, "iue" ],
-[ 6638, "iuf" ],
-[ 6639, "iug" ],
-[ 6640, "iuh" ],
-[ 6641, "iui" ],
-[ 6642, "iuj" ],
-[ 6643, "iuk" ],
-[ 6644, "iul" ],
-[ 6645, "ium" ],
-[ 6646, "iun" ],
-[ 6647, "iuo" ],
-[ 6648, "iup" ],
-[ 6649, "iuq" ],
-[ 6650, "iur" ],
-[ 6651, "ius" ],
-[ 6652, "iut" ],
-[ 6653, "iuu" ],
-[ 6654, "iuv" ],
-[ 6655, "iuw" ],
-[ 6656, "iux" ],
-[ 6657, "iuy" ],
-[ 6658, "iuz" ],
-[ 6659, "iva" ],
-[ 6660, "ivb" ],
-[ 6661, "ivc" ],
-[ 6662, "ivd" ],
-[ 6663, "ive" ],
-[ 6664, "ivf" ],
-[ 6665, "ivg" ],
-[ 6666, "ivh" ],
-[ 6667, "ivi" ],
-[ 6668, "ivj" ],
-[ 6669, "ivk" ],
-[ 6670, "ivl" ],
-[ 6671, "ivm" ],
-[ 6672, "ivn" ],
-[ 6673, "ivo" ],
-[ 6674, "ivp" ],
-[ 6675, "ivq" ],
-[ 6676, "ivr" ],
-[ 6677, "ivs" ],
-[ 6678, "ivt" ],
-[ 6679, "ivu" ],
-[ 6680, "ivv" ],
-[ 6681, "ivw" ],
-[ 6682, "ivx" ],
-[ 6683, "ivy" ],
-[ 6684, "ivz" ],
-[ 6685, "iwa" ],
-[ 6686, "iwb" ],
-[ 6687, "iwc" ],
-[ 6688, "iwd" ],
-[ 6689, "iwe" ],
-[ 6690, "iwf" ],
-[ 6691, "iwg" ],
-[ 6692, "iwh" ],
-[ 6693, "iwi" ],
-[ 6694, "iwj" ],
-[ 6695, "iwk" ],
-[ 6696, "iwl" ],
-[ 6697, "iwm" ],
-[ 6698, "iwn" ],
-[ 6699, "iwo" ],
-[ 6700, "iwp" ],
-[ 6701, "iwq" ],
-[ 6702, "iwr" ],
-[ 6703, "iws" ],
-[ 6704, "iwt" ],
-[ 6705, "iwu" ],
-[ 6706, "iwv" ],
-[ 6707, "iww" ],
-[ 6708, "iwx" ],
-[ 6709, "iwy" ],
-[ 6710, "iwz" ],
-[ 6711, "ixa" ],
-[ 6712, "ixb" ],
-[ 6713, "ixc" ],
-[ 6714, "ixd" ],
-[ 6715, "ixe" ],
-[ 6716, "ixf" ],
-[ 6717, "ixg" ],
-[ 6718, "ixh" ],
-[ 6719, "ixi" ],
-[ 6720, "ixj" ],
-[ 6721, "ixk" ],
-[ 6722, "ixl" ],
-[ 6723, "ixm" ],
-[ 6724, "ixn" ],
-[ 6725, "ixo" ],
-[ 6726, "ixp" ],
-[ 6727, "ixq" ],
-[ 6728, "ixr" ],
-[ 6729, "ixs" ],
-[ 6730, "ixt" ],
-[ 6731, "ixu" ],
-[ 6732, "ixv" ],
-[ 6733, "ixw" ],
-[ 6734, "ixx" ],
-[ 6735, "ixy" ],
-[ 6736, "ixz" ],
-[ 6737, "iya" ],
-[ 6738, "iyb" ],
-[ 6739, "iyc" ],
-[ 6740, "iyd" ],
-[ 6741, "iye" ],
-[ 6742, "iyf" ],
-[ 6743, "iyg" ],
-[ 6744, "iyh" ],
-[ 6745, "iyi" ],
-[ 6746, "iyj" ],
-[ 6747, "iyk" ],
-[ 6748, "iyl" ],
-[ 6749, "iym" ],
-[ 6750, "iyn" ],
-[ 6751, "iyo" ],
-[ 6752, "iyp" ],
-[ 6753, "iyq" ],
-[ 6754, "iyr" ],
-[ 6755, "iys" ],
-[ 6756, "iyt" ],
-[ 6757, "iyu" ],
-[ 6758, "iyv" ],
-[ 6759, "iyw" ],
-[ 6760, "iyx" ],
-[ 6761, "iyy" ],
-[ 6762, "iyz" ],
-[ 6763, "iza" ],
-[ 6764, "izb" ],
-[ 6765, "izc" ],
-[ 6766, "izd" ],
-[ 6767, "ize" ],
-[ 6768, "izf" ],
-[ 6769, "izg" ],
-[ 6770, "izh" ],
-[ 6771, "izi" ],
-[ 6772, "izj" ],
-[ 6773, "izk" ],
-[ 6774, "izl" ],
-[ 6775, "izm" ],
-[ 6776, "izn" ],
-[ 6777, "izo" ],
-[ 6778, "izp" ],
-[ 6779, "izq" ],
-[ 6780, "izr" ],
-[ 6781, "izs" ],
-[ 6782, "izt" ],
-[ 6783, "izu" ],
-[ 6784, "izv" ],
-[ 6785, "izw" ],
-[ 6786, "izx" ],
-[ 6787, "izy" ],
-[ 6788, "izz" ],
-[ 6789, "jaa" ],
-[ 6790, "jab" ],
-[ 6791, "jac" ],
-[ 6792, "jad" ],
-[ 6793, "jae" ],
-[ 6794, "jaf" ],
-[ 6795, "jag" ],
-[ 6796, "jah" ],
-[ 6797, "jai" ],
-[ 6798, "jaj" ],
-[ 6799, "jak" ],
-[ 6800, "jal" ],
-[ 6801, "jam" ],
-[ 6802, "jan" ],
-[ 6803, "jao" ],
-[ 6804, "jap" ],
-[ 6805, "jaq" ],
-[ 6806, "jar" ],
-[ 6807, "jas" ],
-[ 6808, "jat" ],
-[ 6809, "jau" ],
-[ 6810, "jav" ],
-[ 6811, "jaw" ],
-[ 6812, "jax" ],
-[ 6813, "jay" ],
-[ 6814, "jaz" ],
-[ 6815, "jba" ],
-[ 6816, "jbb" ],
-[ 6817, "jbc" ],
-[ 6818, "jbd" ],
-[ 6819, "jbe" ],
-[ 6820, "jbf" ],
-[ 6821, "jbg" ],
-[ 6822, "jbh" ],
-[ 6823, "jbi" ],
-[ 6824, "jbj" ],
-[ 6825, "jbk" ],
-[ 6826, "jbl" ],
-[ 6827, "jbm" ],
-[ 6828, "jbn" ],
-[ 6829, "jbo" ],
-[ 6830, "jbp" ],
-[ 6831, "jbq" ],
-[ 6832, "jbr" ],
-[ 6833, "jbs" ],
-[ 6834, "jbt" ],
-[ 6835, "jbu" ],
-[ 6836, "jbv" ],
-[ 6837, "jbw" ],
-[ 6838, "jbx" ],
-[ 6839, "jby" ],
-[ 6840, "jbz" ],
-[ 6841, "jca" ],
-[ 6842, "jcb" ],
-[ 6843, "jcc" ],
-[ 6844, "jcd" ],
-[ 6845, "jce" ],
-[ 6846, "jcf" ],
-[ 6847, "jcg" ],
-[ 6848, "jch" ],
-[ 6849, "jci" ],
-[ 6850, "jcj" ],
-[ 6851, "jck" ],
-[ 6852, "jcl" ],
-[ 6853, "jcm" ],
-[ 6854, "jcn" ],
-[ 6855, "jco" ],
-[ 6856, "jcp" ],
-[ 6857, "jcq" ],
-[ 6858, "jcr" ],
-[ 6859, "jcs" ],
-[ 6860, "jct" ],
-[ 6861, "jcu" ],
-[ 6862, "jcv" ],
-[ 6863, "jcw" ],
-[ 6864, "jcx" ],
-[ 6865, "jcy" ],
-[ 6866, "jcz" ],
-[ 6867, "jda" ],
-[ 6868, "jdb" ],
-[ 6869, "jdc" ],
-[ 6870, "jdd" ],
-[ 6871, "jde" ],
-[ 6872, "jdf" ],
-[ 6873, "jdg" ],
-[ 6874, "jdh" ],
-[ 6875, "jdi" ],
-[ 6876, "jdj" ],
-[ 6877, "jdk" ],
-[ 6878, "jdl" ],
-[ 6879, "jdm" ],
-[ 6880, "jdn" ],
-[ 6881, "jdo" ],
-[ 6882, "jdp" ],
-[ 6883, "jdq" ],
-[ 6884, "jdr" ],
-[ 6885, "jds" ],
-[ 6886, "jdt" ],
-[ 6887, "jdu" ],
-[ 6888, "jdv" ],
-[ 6889, "jdw" ],
-[ 6890, "jdx" ],
-[ 6891, "jdy" ],
-[ 6892, "jdz" ],
-[ 6893, "jea" ],
-[ 6894, "jeb" ],
-[ 6895, "jec" ],
-[ 6896, "jed" ],
-[ 6897, "jee" ],
-[ 6898, "jef" ],
-[ 6899, "jeg" ],
-[ 6900, "jeh" ],
-[ 6901, "jei" ],
-[ 6902, "jej" ],
-[ 6903, "jek" ],
-[ 6904, "jel" ],
-[ 6905, "jem" ],
-[ 6906, "jen" ],
-[ 6907, "jeo" ],
-[ 6908, "jep" ],
-[ 6909, "jeq" ],
-[ 6910, "jer" ],
-[ 6911, "jes" ],
-[ 6912, "jet" ],
-[ 6913, "jeu" ],
-[ 6914, "jev" ],
-[ 6915, "jew" ],
-[ 6916, "jex" ],
-[ 6917, "jey" ],
-[ 6918, "jez" ],
-[ 6919, "jfa" ],
-[ 6920, "jfb" ],
-[ 6921, "jfc" ],
-[ 6922, "jfd" ],
-[ 6923, "jfe" ],
-[ 6924, "jff" ],
-[ 6925, "jfg" ],
-[ 6926, "jfh" ],
-[ 6927, "jfi" ],
-[ 6928, "jfj" ],
-[ 6929, "jfk" ],
-[ 6930, "jfl" ],
-[ 6931, "jfm" ],
-[ 6932, "jfn" ],
-[ 6933, "jfo" ],
-[ 6934, "jfp" ],
-[ 6935, "jfq" ],
-[ 6936, "jfr" ],
-[ 6937, "jfs" ],
-[ 6938, "jft" ],
-[ 6939, "jfu" ],
-[ 6940, "jfv" ],
-[ 6941, "jfw" ],
-[ 6942, "jfx" ],
-[ 6943, "jfy" ],
-[ 6944, "jfz" ],
-[ 6945, "jga" ],
-[ 6946, "jgb" ],
-[ 6947, "jgc" ],
-[ 6948, "jgd" ],
-[ 6949, "jge" ],
-[ 6950, "jgf" ],
-[ 6951, "jgg" ],
-[ 6952, "jgh" ],
-[ 6953, "jgi" ],
-[ 6954, "jgj" ],
-[ 6955, "jgk" ],
-[ 6956, "jgl" ],
-[ 6957, "jgm" ],
-[ 6958, "jgn" ],
-[ 6959, "jgo" ],
-[ 6960, "jgp" ],
-[ 6961, "jgq" ],
-[ 6962, "jgr" ],
-[ 6963, "jgs" ],
-[ 6964, "jgt" ],
-[ 6965, "jgu" ],
-[ 6966, "jgv" ],
-[ 6967, "jgw" ],
-[ 6968, "jgx" ],
-[ 6969, "jgy" ],
-[ 6970, "jgz" ],
-[ 6971, "jha" ],
-[ 6972, "jhb" ],
-[ 6973, "jhc" ],
-[ 6974, "jhd" ],
-[ 6975, "jhe" ],
-[ 6976, "jhf" ],
-[ 6977, "jhg" ],
-[ 6978, "jhh" ],
-[ 6979, "jhi" ],
-[ 6980, "jhj" ],
-[ 6981, "jhk" ],
-[ 6982, "jhl" ],
-[ 6983, "jhm" ],
-[ 6984, "jhn" ],
-[ 6985, "jho" ],
-[ 6986, "jhp" ],
-[ 6987, "jhq" ],
-[ 6988, "jhr" ],
-[ 6989, "jhs" ],
-[ 6990, "jht" ],
-[ 6991, "jhu" ],
-[ 6992, "jhv" ],
-[ 6993, "jhw" ],
-[ 6994, "jhx" ],
-[ 6995, "jhy" ],
-[ 6996, "jhz" ],
-[ 6997, "jia" ],
-[ 6998, "jib" ],
-[ 6999, "jic" ],
-[ 7000, "jid" ],
-[ 7001, "jie" ],
-[ 7002, "jif" ],
-[ 7003, "jig" ],
-[ 7004, "jih" ],
-[ 7005, "jii" ],
-[ 7006, "jij" ],
-[ 7007, "jik" ],
-[ 7008, "jil" ],
-[ 7009, "jim" ],
-[ 7010, "jin" ],
-[ 7011, "jio" ],
-[ 7012, "jip" ],
-[ 7013, "jiq" ],
-[ 7014, "jir" ],
-[ 7015, "jis" ],
-[ 7016, "jit" ],
-[ 7017, "jiu" ],
-[ 7018, "jiv" ],
-[ 7019, "jiw" ],
-[ 7020, "jix" ],
-[ 7021, "jiy" ],
-[ 7022, "jiz" ],
-[ 7023, "jja" ],
-[ 7024, "jjb" ],
-[ 7025, "jjc" ],
-[ 7026, "jjd" ],
-[ 7027, "jje" ],
-[ 7028, "jjf" ],
-[ 7029, "jjg" ],
-[ 7030, "jjh" ],
-[ 7031, "jji" ],
-[ 7032, "jjj" ],
-[ 7033, "jjk" ],
-[ 7034, "jjl" ],
-[ 7035, "jjm" ],
-[ 7036, "jjn" ],
-[ 7037, "jjo" ],
-[ 7038, "jjp" ],
-[ 7039, "jjq" ],
-[ 7040, "jjr" ],
-[ 7041, "jjs" ],
-[ 7042, "jjt" ],
-[ 7043, "jju" ],
-[ 7044, "jjv" ],
-[ 7045, "jjw" ],
-[ 7046, "jjx" ],
-[ 7047, "jjy" ],
-[ 7048, "jjz" ],
-[ 7049, "jka" ],
-[ 7050, "jkb" ],
-[ 7051, "jkc" ],
-[ 7052, "jkd" ],
-[ 7053, "jke" ],
-[ 7054, "jkf" ],
-[ 7055, "jkg" ],
-[ 7056, "jkh" ],
-[ 7057, "jki" ],
-[ 7058, "jkj" ],
-[ 7059, "jkk" ],
-[ 7060, "jkl" ],
-[ 7061, "jkm" ],
-[ 7062, "jkn" ],
-[ 7063, "jko" ],
-[ 7064, "jkp" ],
-[ 7065, "jkq" ],
-[ 7066, "jkr" ],
-[ 7067, "jks" ],
-[ 7068, "jkt" ],
-[ 7069, "jku" ],
-[ 7070, "jkv" ],
-[ 7071, "jkw" ],
-[ 7072, "jkx" ],
-[ 7073, "jky" ],
-[ 7074, "jkz" ],
-[ 7075, "jla" ],
-[ 7076, "jlb" ],
-[ 7077, "jlc" ],
-[ 7078, "jld" ],
-[ 7079, "jle" ],
-[ 7080, "jlf" ],
-[ 7081, "jlg" ],
-[ 7082, "jlh" ],
-[ 7083, "jli" ],
-[ 7084, "jlj" ],
-[ 7085, "jlk" ],
-[ 7086, "jll" ],
-[ 7087, "jlm" ],
-[ 7088, "jln" ],
-[ 7089, "jlo" ],
-[ 7090, "jlp" ],
-[ 7091, "jlq" ],
-[ 7092, "jlr" ],
-[ 7093, "jls" ],
-[ 7094, "jlt" ],
-[ 7095, "jlu" ],
-[ 7096, "jlv" ],
-[ 7097, "jlw" ],
-[ 7098, "jlx" ],
-[ 7099, "jly" ],
-[ 7100, "jlz" ],
-[ 7101, "jma" ],
-[ 7102, "jmb" ],
-[ 7103, "jmc" ],
-[ 7104, "jmd" ],
-[ 7105, "jme" ],
-[ 7106, "jmf" ],
-[ 7107, "jmg" ],
-[ 7108, "jmh" ],
-[ 7109, "jmi" ],
-[ 7110, "jmj" ],
-[ 7111, "jmk" ],
-[ 7112, "jml" ],
-[ 7113, "jmm" ],
-[ 7114, "jmn" ],
-[ 7115, "jmo" ],
-[ 7116, "jmp" ],
-[ 7117, "jmq" ],
-[ 7118, "jmr" ],
-[ 7119, "jms" ],
-[ 7120, "jmt" ],
-[ 7121, "jmu" ],
-[ 7122, "jmv" ],
-[ 7123, "jmw" ],
-[ 7124, "jmx" ],
-[ 7125, "jmy" ],
-[ 7126, "jmz" ],
-[ 7127, "jna" ],
-[ 7128, "jnb" ],
-[ 7129, "jnc" ],
-[ 7130, "jnd" ],
-[ 7131, "jne" ],
-[ 7132, "jnf" ],
-[ 7133, "jng" ],
-[ 7134, "jnh" ],
-[ 7135, "jni" ],
-[ 7136, "jnj" ],
-[ 7137, "jnk" ],
-[ 7138, "jnl" ],
-[ 7139, "jnm" ],
-[ 7140, "jnn" ],
-[ 7141, "jno" ],
-[ 7142, "jnp" ],
-[ 7143, "jnq" ],
-[ 7144, "jnr" ],
-[ 7145, "jns" ],
-[ 7146, "jnt" ],
-[ 7147, "jnu" ],
-[ 7148, "jnv" ],
-[ 7149, "jnw" ],
-[ 7150, "jnx" ],
-[ 7151, "jny" ],
-[ 7152, "jnz" ],
-[ 7153, "joa" ],
-[ 7154, "job" ],
-[ 7155, "joc" ],
-[ 7156, "jod" ],
-[ 7157, "joe" ],
-[ 7158, "jof" ],
-[ 7159, "jog" ],
-[ 7160, "joh" ],
-[ 7161, "joi" ],
-[ 7162, "joj" ],
-[ 7163, "jok" ],
-[ 7164, "jol" ],
-[ 7165, "jom" ],
-[ 7166, "jon" ],
-[ 7167, "joo" ],
-[ 7168, "jop" ],
-[ 7169, "joq" ],
-[ 7170, "jor" ],
-[ 7171, "jos" ],
-[ 7172, "jot" ],
-[ 7173, "jou" ],
-[ 7174, "jov" ],
-[ 7175, "jow" ],
-[ 7176, "jox" ],
-[ 7177, "joy" ],
-[ 7178, "joz" ],
-[ 7179, "jpa" ],
-[ 7180, "jpb" ],
-[ 7181, "jpc" ],
-[ 7182, "jpd" ],
-[ 7183, "jpe" ],
-[ 7184, "jpf" ],
-[ 7185, "jpg" ],
-[ 7186, "jph" ],
-[ 7187, "jpi" ],
-[ 7188, "jpj" ],
-[ 7189, "jpk" ],
-[ 7190, "jpl" ],
-[ 7191, "jpm" ],
-[ 7192, "jpn" ],
-[ 7193, "jpo" ],
-[ 7194, "jpp" ],
-[ 7195, "jpq" ],
-[ 7196, "jpr" ],
-[ 7197, "jps" ],
-[ 7198, "jpt" ],
-[ 7199, "jpu" ],
-[ 7200, "jpv" ],
-[ 7201, "jpw" ],
-[ 7202, "jpx" ],
-[ 7203, "jpy" ],
-[ 7204, "jpz" ],
-[ 7205, "jqa" ],
-[ 7206, "jqb" ],
-[ 7207, "jqc" ],
-[ 7208, "jqd" ],
-[ 7209, "jqe" ],
-[ 7210, "jqf" ],
-[ 7211, "jqg" ],
-[ 7212, "jqh" ],
-[ 7213, "jqi" ],
-[ 7214, "jqj" ],
-[ 7215, "jqk" ],
-[ 7216, "jql" ],
-[ 7217, "jqm" ],
-[ 7218, "jqn" ],
-[ 7219, "jqo" ],
-[ 7220, "jqp" ],
-[ 7221, "jqq" ],
-[ 7222, "jqr" ],
-[ 7223, "jqs" ],
-[ 7224, "jqt" ],
-[ 7225, "jqu" ],
-[ 7226, "jqv" ],
-[ 7227, "jqw" ],
-[ 7228, "jqx" ],
-[ 7229, "jqy" ],
-[ 7230, "jqz" ],
-[ 7231, "jra" ],
-[ 7232, "jrb" ],
-[ 7233, "jrc" ],
-[ 7234, "jrd" ],
-[ 7235, "jre" ],
-[ 7236, "jrf" ],
-[ 7237, "jrg" ],
-[ 7238, "jrh" ],
-[ 7239, "jri" ],
-[ 7240, "jrj" ],
-[ 7241, "jrk" ],
-[ 7242, "jrl" ],
-[ 7243, "jrm" ],
-[ 7244, "jrn" ],
-[ 7245, "jro" ],
-[ 7246, "jrp" ],
-[ 7247, "jrq" ],
-[ 7248, "jrr" ],
-[ 7249, "jrs" ],
-[ 7250, "jrt" ],
-[ 7251, "jru" ],
-[ 7252, "jrv" ],
-[ 7253, "jrw" ],
-[ 7254, "jrx" ],
-[ 7255, "jry" ],
-[ 7256, "jrz" ],
-[ 7257, "jsa" ],
-[ 7258, "jsb" ],
-[ 7259, "jsc" ],
-[ 7260, "jsd" ],
-[ 7261, "jse" ],
-[ 7262, "jsf" ],
-[ 7263, "jsg" ],
-[ 7264, "jsh" ],
-[ 7265, "jsi" ],
-[ 7266, "jsj" ],
-[ 7267, "jsk" ],
-[ 7268, "jsl" ],
-[ 7269, "jsm" ],
-[ 7270, "jsn" ],
-[ 7271, "jso" ],
-[ 7272, "jsp" ],
-[ 7273, "jsq" ],
-[ 7274, "jsr" ],
-[ 7275, "jss" ],
-[ 7276, "jst" ],
-[ 7277, "jsu" ],
-[ 7278, "jsv" ],
-[ 7279, "jsw" ],
-[ 7280, "jsx" ],
-[ 7281, "jsy" ],
-[ 7282, "jsz" ],
-[ 7283, "jta" ],
-[ 7284, "jtb" ],
-[ 7285, "jtc" ],
-[ 7286, "jtd" ],
-[ 7287, "jte" ],
-[ 7288, "jtf" ],
-[ 7289, "jtg" ],
-[ 7290, "jth" ],
-[ 7291, "jti" ],
-[ 7292, "jtj" ],
-[ 7293, "jtk" ],
-[ 7294, "jtl" ],
-[ 7295, "jtm" ],
-[ 7296, "jtn" ],
-[ 7297, "jto" ],
-[ 7298, "jtp" ],
-[ 7299, "jtq" ],
-[ 7300, "jtr" ],
-[ 7301, "jts" ],
-[ 7302, "jtt" ],
-[ 7303, "jtu" ],
-[ 7304, "jtv" ],
-[ 7305, "jtw" ],
-[ 7306, "jtx" ],
-[ 7307, "jty" ],
-[ 7308, "jtz" ],
-[ 7309, "jua" ],
-[ 7310, "jub" ],
-[ 7311, "juc" ],
-[ 7312, "jud" ],
-[ 7313, "jue" ],
-[ 7314, "juf" ],
-[ 7315, "jug" ],
-[ 7316, "juh" ],
-[ 7317, "jui" ],
-[ 7318, "juj" ],
-[ 7319, "juk" ],
-[ 7320, "jul" ],
-[ 7321, "jum" ],
-[ 7322, "jun" ],
-[ 7323, "juo" ],
-[ 7324, "jup" ],
-[ 7325, "juq" ],
-[ 7326, "jur" ],
-[ 7327, "jus" ],
-[ 7328, "jut" ],
-[ 7329, "juu" ],
-[ 7330, "juv" ],
-[ 7331, "juw" ],
-[ 7332, "jux" ],
-[ 7333, "juy" ],
-[ 7334, "juz" ],
-[ 7335, "jva" ],
-[ 7336, "jvb" ],
-[ 7337, "jvc" ],
-[ 7338, "jvd" ],
-[ 7339, "jve" ],
-[ 7340, "jvf" ],
-[ 7341, "jvg" ],
-[ 7342, "jvh" ],
-[ 7343, "jvi" ],
-[ 7344, "jvj" ],
-[ 7345, "jvk" ],
-[ 7346, "jvl" ],
-[ 7347, "jvm" ],
-[ 7348, "jvn" ],
-[ 7349, "jvo" ],
-[ 7350, "jvp" ],
-[ 7351, "jvq" ],
-[ 7352, "jvr" ],
-[ 7353, "jvs" ],
-[ 7354, "jvt" ],
-[ 7355, "jvu" ],
-[ 7356, "jvv" ],
-[ 7357, "jvw" ],
-[ 7358, "jvx" ],
-[ 7359, "jvy" ],
-[ 7360, "jvz" ],
-[ 7361, "jwa" ],
-[ 7362, "jwb" ],
-[ 7363, "jwc" ],
-[ 7364, "jwd" ],
-[ 7365, "jwe" ],
-[ 7366, "jwf" ],
-[ 7367, "jwg" ],
-[ 7368, "jwh" ],
-[ 7369, "jwi" ],
-[ 7370, "jwj" ],
-[ 7371, "jwk" ],
-[ 7372, "jwl" ],
-[ 7373, "jwm" ],
-[ 7374, "jwn" ],
-[ 7375, "jwo" ],
-[ 7376, "jwp" ],
-[ 7377, "jwq" ],
-[ 7378, "jwr" ],
-[ 7379, "jws" ],
-[ 7380, "jwt" ],
-[ 7381, "jwu" ],
-[ 7382, "jwv" ],
-[ 7383, "jww" ],
-[ 7384, "jwx" ],
-[ 7385, "jwy" ],
-[ 7386, "jwz" ],
-[ 7387, "jxa" ],
-[ 7388, "jxb" ],
-[ 7389, "jxc" ],
-[ 7390, "jxd" ],
-[ 7391, "jxe" ],
-[ 7392, "jxf" ],
-[ 7393, "jxg" ],
-[ 7394, "jxh" ],
-[ 7395, "jxi" ],
-[ 7396, "jxj" ],
-[ 7397, "jxk" ],
-[ 7398, "jxl" ],
-[ 7399, "jxm" ],
-[ 7400, "jxn" ],
-[ 7401, "jxo" ],
-[ 7402, "jxp" ],
-[ 7403, "jxq" ],
-[ 7404, "jxr" ],
-[ 7405, "jxs" ],
-[ 7406, "jxt" ],
-[ 7407, "jxu" ],
-[ 7408, "jxv" ],
-[ 7409, "jxw" ],
-[ 7410, "jxx" ],
-[ 7411, "jxy" ],
-[ 7412, "jxz" ],
-[ 7413, "jya" ],
-[ 7414, "jyb" ],
-[ 7415, "jyc" ],
-[ 7416, "jyd" ],
-[ 7417, "jye" ],
-[ 7418, "jyf" ],
-[ 7419, "jyg" ],
-[ 7420, "jyh" ],
-[ 7421, "jyi" ],
-[ 7422, "jyj" ],
-[ 7423, "jyk" ],
-[ 7424, "jyl" ],
-[ 7425, "jym" ],
-[ 7426, "jyn" ],
-[ 7427, "jyo" ],
-[ 7428, "jyp" ],
-[ 7429, "jyq" ],
-[ 7430, "jyr" ],
-[ 7431, "jys" ],
-[ 7432, "jyt" ],
-[ 7433, "jyu" ],
-[ 7434, "jyv" ],
-[ 7435, "jyw" ],
-[ 7436, "jyx" ],
-[ 7437, "jyy" ],
-[ 7438, "jyz" ],
-[ 7439, "jza" ],
-[ 7440, "jzb" ],
-[ 7441, "jzc" ],
-[ 7442, "jzd" ],
-[ 7443, "jze" ],
-[ 7444, "jzf" ],
-[ 7445, "jzg" ],
-[ 7446, "jzh" ],
-[ 7447, "jzi" ],
-[ 7448, "jzj" ],
-[ 7449, "jzk" ],
-[ 7450, "jzl" ],
-[ 7451, "jzm" ],
-[ 7452, "jzn" ],
-[ 7453, "jzo" ],
-[ 7454, "jzp" ],
-[ 7455, "jzq" ],
-[ 7456, "jzr" ],
-[ 7457, "jzs" ],
-[ 7458, "jzt" ],
-[ 7459, "jzu" ],
-[ 7460, "jzv" ],
-[ 7461, "jzw" ],
-[ 7462, "jzx" ],
-[ 7463, "jzy" ],
-[ 7464, "jzz" ],
-[ 7465, "kaa" ],
-[ 7466, "kab" ],
-[ 7467, "kac" ],
-[ 7468, "kad" ],
-[ 7469, "kae" ],
-[ 7470, "kaf" ],
-[ 7471, "kag" ],
-[ 7472, "kah" ],
-[ 7473, "kai" ],
-[ 7474, "kaj" ],
-[ 7475, "kak" ],
-[ 7476, "kal" ],
-[ 7477, "kam" ],
-[ 7478, "kan" ],
-[ 7479, "kao" ],
-[ 7480, "kap" ],
-[ 7481, "kaq" ],
-[ 7482, "kar" ],
-[ 7483, "kas" ],
-[ 7484, "kat" ],
-[ 7485, "kau" ],
-[ 7486, "kav" ],
-[ 7487, "kaw" ],
-[ 7488, "kax" ],
-[ 7489, "kay" ],
-[ 7490, "kaz" ],
-[ 7491, "kba" ],
-[ 7492, "kbb" ],
-[ 7493, "kbc" ],
-[ 7494, "kbd" ],
-[ 7495, "kbe" ],
-[ 7496, "kbf" ],
-[ 7497, "kbg" ],
-[ 7498, "kbh" ],
-[ 7499, "kbi" ],
-[ 7500, "kbj" ],
-[ 7501, "kbk" ],
-[ 7502, "kbl" ],
-[ 7503, "kbm" ],
-[ 7504, "kbn" ],
-[ 7505, "kbo" ],
-[ 7506, "kbp" ],
-[ 7507, "kbq" ],
-[ 7508, "kbr" ],
-[ 7509, "kbs" ],
-[ 7510, "kbt" ],
-[ 7511, "kbu" ],
-[ 7512, "kbv" ],
-[ 7513, "kbw" ],
-[ 7514, "kbx" ],
-[ 7515, "kby" ],
-[ 7516, "kbz" ],
-[ 7517, "kca" ],
-[ 7518, "kcb" ],
-[ 7519, "kcc" ],
-[ 7520, "kcd" ],
-[ 7521, "kce" ],
-[ 7522, "kcf" ],
-[ 7523, "kcg" ],
-[ 7524, "kch" ],
-[ 7525, "kci" ],
-[ 7526, "kcj" ],
-[ 7527, "kck" ],
-[ 7528, "kcl" ],
-[ 7529, "kcm" ],
-[ 7530, "kcn" ],
-[ 7531, "kco" ],
-[ 7532, "kcp" ],
-[ 7533, "kcq" ],
-[ 7534, "kcr" ],
-[ 7535, "kcs" ],
-[ 7536, "kct" ],
-[ 7537, "kcu" ],
-[ 7538, "kcv" ],
-[ 7539, "kcw" ],
-[ 7540, "kcx" ],
-[ 7541, "kcy" ],
-[ 7542, "kcz" ],
-[ 7543, "kda" ],
-[ 7544, "kdb" ],
-[ 7545, "kdc" ],
-[ 7546, "kdd" ],
-[ 7547, "kde" ],
-[ 7548, "kdf" ],
-[ 7549, "kdg" ],
-[ 7550, "kdh" ],
-[ 7551, "kdi" ],
-[ 7552, "kdj" ],
-[ 7553, "kdk" ],
-[ 7554, "kdl" ],
-[ 7555, "kdm" ],
-[ 7556, "kdn" ],
-[ 7557, "kdo" ],
-[ 7558, "kdp" ],
-[ 7559, "kdq" ],
-[ 7560, "kdr" ],
-[ 7561, "kds" ],
-[ 7562, "kdt" ],
-[ 7563, "kdu" ],
-[ 7564, "kdv" ],
-[ 7565, "kdw" ],
-[ 7566, "kdx" ],
-[ 7567, "kdy" ],
-[ 7568, "kdz" ],
-[ 7569, "kea" ],
-[ 7570, "keb" ],
-[ 7571, "kec" ],
-[ 7572, "ked" ],
-[ 7573, "kee" ],
-[ 7574, "kef" ],
-[ 7575, "keg" ],
-[ 7576, "keh" ],
-[ 7577, "kei" ],
-[ 7578, "kej" ],
-[ 7579, "kek" ],
-[ 7580, "kel" ],
-[ 7581, "kem" ],
-[ 7582, "ken" ],
-[ 7583, "keo" ],
-[ 7584, "kep" ],
-[ 7585, "keq" ],
-[ 7586, "ker" ],
-[ 7587, "kes" ],
-[ 7588, "ket" ],
-[ 7589, "keu" ],
-[ 7590, "kev" ],
-[ 7591, "kew" ],
-[ 7592, "kex" ],
-[ 7593, "key" ],
-[ 7594, "kez" ],
-[ 7595, "kfa" ],
-[ 7596, "kfb" ],
-[ 7597, "kfc" ],
-[ 7598, "kfd" ],
-[ 7599, "kfe" ],
-[ 7600, "kff" ],
-[ 7601, "kfg" ],
-[ 7602, "kfh" ],
-[ 7603, "kfi" ],
-[ 7604, "kfj" ],
-[ 7605, "kfk" ],
-[ 7606, "kfl" ],
-[ 7607, "kfm" ],
-[ 7608, "kfn" ],
-[ 7609, "kfo" ],
-[ 7610, "kfp" ],
-[ 7611, "kfq" ],
-[ 7612, "kfr" ],
-[ 7613, "kfs" ],
-[ 7614, "kft" ],
-[ 7615, "kfu" ],
-[ 7616, "kfv" ],
-[ 7617, "kfw" ],
-[ 7618, "kfx" ],
-[ 7619, "kfy" ],
-[ 7620, "kfz" ],
-[ 7621, "kga" ],
-[ 7622, "kgb" ],
-[ 7623, "kgc" ],
-[ 7624, "kgd" ],
-[ 7625, "kge" ],
-[ 7626, "kgf" ],
-[ 7627, "kgg" ],
-[ 7628, "kgh" ],
-[ 7629, "kgi" ],
-[ 7630, "kgj" ],
-[ 7631, "kgk" ],
-[ 7632, "kgl" ],
-[ 7633, "kgm" ],
-[ 7634, "kgn" ],
-[ 7635, "kgo" ],
-[ 7636, "kgp" ],
-[ 7637, "kgq" ],
-[ 7638, "kgr" ],
-[ 7639, "kgs" ],
-[ 7640, "kgt" ],
-[ 7641, "kgu" ],
-[ 7642, "kgv" ],
-[ 7643, "kgw" ],
-[ 7644, "kgx" ],
-[ 7645, "kgy" ],
-[ 7646, "kgz" ],
-[ 7647, "kha" ],
-[ 7648, "khb" ],
-[ 7649, "khc" ],
-[ 7650, "khd" ],
-[ 7651, "khe" ],
-[ 7652, "khf" ],
-[ 7653, "khg" ],
-[ 7654, "khh" ],
-[ 7655, "khi" ],
-[ 7656, "khj" ],
-[ 7657, "khk" ],
-[ 7658, "khl" ],
-[ 7659, "khm" ],
-[ 7660, "khn" ],
-[ 7661, "kho" ],
-[ 7662, "khp" ],
-[ 7663, "khq" ],
-[ 7664, "khr" ],
-[ 7665, "khs" ],
-[ 7666, "kht" ],
-[ 7667, "khu" ],
-[ 7668, "khv" ],
-[ 7669, "khw" ],
-[ 7670, "khx" ],
-[ 7671, "khy" ],
-[ 7672, "khz" ],
-[ 7673, "kia" ],
-[ 7674, "kib" ],
-[ 7675, "kic" ],
-[ 7676, "kid" ],
-[ 7677, "kie" ],
-[ 7678, "kif" ],
-[ 7679, "kig" ],
-[ 7680, "kih" ],
-[ 7681, "kii" ],
-[ 7682, "kij" ],
-[ 7683, "kik" ],
-[ 7684, "kil" ],
-[ 7685, "kim" ],
-[ 7686, "kin" ],
-[ 7687, "kio" ],
-[ 7688, "kip" ],
-[ 7689, "kiq" ],
-[ 7690, "kir" ],
-[ 7691, "kis" ],
-[ 7692, "kit" ],
-[ 7693, "kiu" ],
-[ 7694, "kiv" ],
-[ 7695, "kiw" ],
-[ 7696, "kix" ],
-[ 7697, "kiy" ],
-[ 7698, "kiz" ],
-[ 7699, "kja" ],
-[ 7700, "kjb" ],
-[ 7701, "kjc" ],
-[ 7702, "kjd" ],
-[ 7703, "kje" ],
-[ 7704, "kjf" ],
-[ 7705, "kjg" ],
-[ 7706, "kjh" ],
-[ 7707, "kji" ],
-[ 7708, "kjj" ],
-[ 7709, "kjk" ],
-[ 7710, "kjl" ],
-[ 7711, "kjm" ],
-[ 7712, "kjn" ],
-[ 7713, "kjo" ],
-[ 7714, "kjp" ],
-[ 7715, "kjq" ],
-[ 7716, "kjr" ],
-[ 7717, "kjs" ],
-[ 7718, "kjt" ],
-[ 7719, "kju" ],
-[ 7720, "kjv" ],
-[ 7721, "kjw" ],
-[ 7722, "kjx" ],
-[ 7723, "kjy" ],
-[ 7724, "kjz" ],
-[ 7725, "kka" ],
-[ 7726, "kkb" ],
-[ 7727, "kkc" ],
-[ 7728, "kkd" ],
-[ 7729, "kke" ],
-[ 7730, "kkf" ],
-[ 7731, "kkg" ],
-[ 7732, "kkh" ],
-[ 7733, "kki" ],
-[ 7734, "kkj" ],
-[ 7735, "kkk" ],
-[ 7736, "kkl" ],
-[ 7737, "kkm" ],
-[ 7738, "kkn" ],
-[ 7739, "kko" ],
-[ 7740, "kkp" ],
-[ 7741, "kkq" ],
-[ 7742, "kkr" ],
-[ 7743, "kks" ],
-[ 7744, "kkt" ],
-[ 7745, "kku" ],
-[ 7746, "kkv" ],
-[ 7747, "kkw" ],
-[ 7748, "kkx" ],
-[ 7749, "kky" ],
-[ 7750, "kkz" ],
-[ 7751, "kla" ],
-[ 7752, "klb" ],
-[ 7753, "klc" ],
-[ 7754, "kld" ],
-[ 7755, "kle" ],
-[ 7756, "klf" ],
-[ 7757, "klg" ],
-[ 7758, "klh" ],
-[ 7759, "kli" ],
-[ 7760, "klj" ],
-[ 7761, "klk" ],
-[ 7762, "kll" ],
-[ 7763, "klm" ],
-[ 7764, "kln" ],
-[ 7765, "klo" ],
-[ 7766, "klp" ],
-[ 7767, "klq" ],
-[ 7768, "klr" ],
-[ 7769, "kls" ],
-[ 7770, "klt" ],
-[ 7771, "klu" ],
-[ 7772, "klv" ],
-[ 7773, "klw" ],
-[ 7774, "klx" ],
-[ 7775, "kly" ],
-[ 7776, "klz" ],
-[ 7777, "kma" ],
-[ 7778, "kmb" ],
-[ 7779, "kmc" ],
-[ 7780, "kmd" ],
-[ 7781, "kme" ],
-[ 7782, "kmf" ],
-[ 7783, "kmg" ],
-[ 7784, "kmh" ],
-[ 7785, "kmi" ],
-[ 7786, "kmj" ],
-[ 7787, "kmk" ],
-[ 7788, "kml" ],
-[ 7789, "kmm" ],
-[ 7790, "kmn" ],
-[ 7791, "kmo" ],
-[ 7792, "kmp" ],
-[ 7793, "kmq" ],
-[ 7794, "kmr" ],
-[ 7795, "kms" ],
-[ 7796, "kmt" ],
-[ 7797, "kmu" ],
-[ 7798, "kmv" ],
-[ 7799, "kmw" ],
-[ 7800, "kmx" ],
-[ 7801, "kmy" ],
-[ 7802, "kmz" ],
-[ 7803, "kna" ],
-[ 7804, "knb" ],
-[ 7805, "knc" ],
-[ 7806, "knd" ],
-[ 7807, "kne" ],
-[ 7808, "knf" ],
-[ 7809, "kng" ],
-[ 7810, "knh" ],
-[ 7811, "kni" ],
-[ 7812, "knj" ],
-[ 7813, "knk" ],
-[ 7814, "knl" ],
-[ 7815, "knm" ],
-[ 7816, "knn" ],
-[ 7817, "kno" ],
-[ 7818, "knp" ],
-[ 7819, "knq" ],
-[ 7820, "knr" ],
-[ 7821, "kns" ],
-[ 7822, "knt" ],
-[ 7823, "knu" ],
-[ 7824, "knv" ],
-[ 7825, "knw" ],
-[ 7826, "knx" ],
-[ 7827, "kny" ],
-[ 7828, "knz" ],
-[ 7829, "koa" ],
-[ 7830, "kob" ],
-[ 7831, "koc" ],
-[ 7832, "kod" ],
-[ 7833, "koe" ],
-[ 7834, "kof" ],
-[ 7835, "kog" ],
-[ 7836, "koh" ],
-[ 7837, "koi" ],
-[ 7838, "koj" ],
-[ 7839, "kok" ],
-[ 7840, "kol" ],
-[ 7841, "kom" ],
-[ 7842, "kon" ],
-[ 7843, "koo" ],
-[ 7844, "kop" ],
-[ 7845, "koq" ],
-[ 7846, "kor" ],
-[ 7847, "kos" ],
-[ 7848, "kot" ],
-[ 7849, "kou" ],
-[ 7850, "kov" ],
-[ 7851, "kow" ],
-[ 7852, "kox" ],
-[ 7853, "koy" ],
-[ 7854, "koz" ],
-[ 7855, "kpa" ],
-[ 7856, "kpb" ],
-[ 7857, "kpc" ],
-[ 7858, "kpd" ],
-[ 7859, "kpe" ],
-[ 7860, "kpf" ],
-[ 7861, "kpg" ],
-[ 7862, "kph" ],
-[ 7863, "kpi" ],
-[ 7864, "kpj" ],
-[ 7865, "kpk" ],
-[ 7866, "kpl" ],
-[ 7867, "kpm" ],
-[ 7868, "kpn" ],
-[ 7869, "kpo" ],
-[ 7870, "kpp" ],
-[ 7871, "kpq" ],
-[ 7872, "kpr" ],
-[ 7873, "kps" ],
-[ 7874, "kpt" ],
-[ 7875, "kpu" ],
-[ 7876, "kpv" ],
-[ 7877, "kpw" ],
-[ 7878, "kpx" ],
-[ 7879, "kpy" ],
-[ 7880, "kpz" ],
-[ 7881, "kqa" ],
-[ 7882, "kqb" ],
-[ 7883, "kqc" ],
-[ 7884, "kqd" ],
-[ 7885, "kqe" ],
-[ 7886, "kqf" ],
-[ 7887, "kqg" ],
-[ 7888, "kqh" ],
-[ 7889, "kqi" ],
-[ 7890, "kqj" ],
-[ 7891, "kqk" ],
-[ 7892, "kql" ],
-[ 7893, "kqm" ],
-[ 7894, "kqn" ],
-[ 7895, "kqo" ],
-[ 7896, "kqp" ],
-[ 7897, "kqq" ],
-[ 7898, "kqr" ],
-[ 7899, "kqs" ],
-[ 7900, "kqt" ],
-[ 7901, "kqu" ],
-[ 7902, "kqv" ],
-[ 7903, "kqw" ],
-[ 7904, "kqx" ],
-[ 7905, "kqy" ],
-[ 7906, "kqz" ],
-[ 7907, "kra" ],
-[ 7908, "krb" ],
-[ 7909, "krc" ],
-[ 7910, "krd" ],
-[ 7911, "kre" ],
-[ 7912, "krf" ],
-[ 7913, "krg" ],
-[ 7914, "krh" ],
-[ 7915, "kri" ],
-[ 7916, "krj" ],
-[ 7917, "krk" ],
-[ 7918, "krl" ],
-[ 7919, "krm" ],
-[ 7920, "krn" ],
-[ 7921, "kro" ],
-[ 7922, "krp" ],
-[ 7923, "krq" ],
-[ 7924, "krr" ],
-[ 7925, "krs" ],
-[ 7926, "krt" ],
-[ 7927, "kru" ],
-[ 7928, "krv" ],
-[ 7929, "krw" ],
-[ 7930, "krx" ],
-[ 7931, "kry" ],
-[ 7932, "krz" ],
-[ 7933, "ksa" ],
-[ 7934, "ksb" ],
-[ 7935, "ksc" ],
-[ 7936, "ksd" ],
-[ 7937, "kse" ],
-[ 7938, "ksf" ],
-[ 7939, "ksg" ],
-[ 7940, "ksh" ],
-[ 7941, "ksi" ],
-[ 7942, "ksj" ],
-[ 7943, "ksk" ],
-[ 7944, "ksl" ],
-[ 7945, "ksm" ],
-[ 7946, "ksn" ],
-[ 7947, "kso" ],
-[ 7948, "ksp" ],
-[ 7949, "ksq" ],
-[ 7950, "ksr" ],
-[ 7951, "kss" ],
-[ 7952, "kst" ],
-[ 7953, "ksu" ],
-[ 7954, "ksv" ],
-[ 7955, "ksw" ],
-[ 7956, "ksx" ],
-[ 7957, "ksy" ],
-[ 7958, "ksz" ],
-[ 7959, "kta" ],
-[ 7960, "ktb" ],
-[ 7961, "ktc" ],
-[ 7962, "ktd" ],
-[ 7963, "kte" ],
-[ 7964, "ktf" ],
-[ 7965, "ktg" ],
-[ 7966, "kth" ],
-[ 7967, "kti" ],
-[ 7968, "ktj" ],
-[ 7969, "ktk" ],
-[ 7970, "ktl" ],
-[ 7971, "ktm" ],
-[ 7972, "ktn" ],
-[ 7973, "kto" ],
-[ 7974, "ktp" ],
-[ 7975, "ktq" ],
-[ 7976, "ktr" ],
-[ 7977, "kts" ],
-[ 7978, "ktt" ],
-[ 7979, "ktu" ],
-[ 7980, "ktv" ],
-[ 7981, "ktw" ],
-[ 7982, "ktx" ],
-[ 7983, "kty" ],
-[ 7984, "ktz" ],
-[ 7985, "kua" ],
-[ 7986, "kub" ],
-[ 7987, "kuc" ],
-[ 7988, "kud" ],
-[ 7989, "kue" ],
-[ 7990, "kuf" ],
-[ 7991, "kug" ],
-[ 7992, "kuh" ],
-[ 7993, "kui" ],
-[ 7994, "kuj" ],
-[ 7995, "kuk" ],
-[ 7996, "kul" ],
-[ 7997, "kum" ],
-[ 7998, "kun" ],
-[ 7999, "kuo" ],
-[ 8000, "kup" ],
-[ 8001, "kuq" ],
-[ 8002, "kur" ],
-[ 8003, "kus" ],
-[ 8004, "kut" ],
-[ 8005, "kuu" ],
-[ 8006, "kuv" ],
-[ 8007, "kuw" ],
-[ 8008, "kux" ],
-[ 8009, "kuy" ],
-[ 8010, "kuz" ],
-[ 8011, "kva" ],
-[ 8012, "kvb" ],
-[ 8013, "kvc" ],
-[ 8014, "kvd" ],
-[ 8015, "kve" ],
-[ 8016, "kvf" ],
-[ 8017, "kvg" ],
-[ 8018, "kvh" ],
-[ 8019, "kvi" ],
-[ 8020, "kvj" ],
-[ 8021, "kvk" ],
-[ 8022, "kvl" ],
-[ 8023, "kvm" ],
-[ 8024, "kvn" ],
-[ 8025, "kvo" ],
-[ 8026, "kvp" ],
-[ 8027, "kvq" ],
-[ 8028, "kvr" ],
-[ 8029, "kvs" ],
-[ 8030, "kvt" ],
-[ 8031, "kvu" ],
-[ 8032, "kvv" ],
-[ 8033, "kvw" ],
-[ 8034, "kvx" ],
-[ 8035, "kvy" ],
-[ 8036, "kvz" ],
-[ 8037, "kwa" ],
-[ 8038, "kwb" ],
-[ 8039, "kwc" ],
-[ 8040, "kwd" ],
-[ 8041, "kwe" ],
-[ 8042, "kwf" ],
-[ 8043, "kwg" ],
-[ 8044, "kwh" ],
-[ 8045, "kwi" ],
-[ 8046, "kwj" ],
-[ 8047, "kwk" ],
-[ 8048, "kwl" ],
-[ 8049, "kwm" ],
-[ 8050, "kwn" ],
-[ 8051, "kwo" ],
-[ 8052, "kwp" ],
-[ 8053, "kwq" ],
-[ 8054, "kwr" ],
-[ 8055, "kws" ],
-[ 8056, "kwt" ],
-[ 8057, "kwu" ],
-[ 8058, "kwv" ],
-[ 8059, "kww" ],
-[ 8060, "kwx" ],
-[ 8061, "kwy" ],
-[ 8062, "kwz" ],
-[ 8063, "kxa" ],
-[ 8064, "kxb" ],
-[ 8065, "kxc" ],
-[ 8066, "kxd" ],
-[ 8067, "kxe" ],
-[ 8068, "kxf" ],
-[ 8069, "kxg" ],
-[ 8070, "kxh" ],
-[ 8071, "kxi" ],
-[ 8072, "kxj" ],
-[ 8073, "kxk" ],
-[ 8074, "kxl" ],
-[ 8075, "kxm" ],
-[ 8076, "kxn" ],
-[ 8077, "kxo" ],
-[ 8078, "kxp" ],
-[ 8079, "kxq" ],
-[ 8080, "kxr" ],
-[ 8081, "kxs" ],
-[ 8082, "kxt" ],
-[ 8083, "kxu" ],
-[ 8084, "kxv" ],
-[ 8085, "kxw" ],
-[ 8086, "kxx" ],
-[ 8087, "kxy" ],
-[ 8088, "kxz" ],
-[ 8089, "kya" ],
-[ 8090, "kyb" ],
-[ 8091, "kyc" ],
-[ 8092, "kyd" ],
-[ 8093, "kye" ],
-[ 8094, "kyf" ],
-[ 8095, "kyg" ],
-[ 8096, "kyh" ],
-[ 8097, "kyi" ],
-[ 8098, "kyj" ],
-[ 8099, "kyk" ],
-[ 8100, "kyl" ],
-[ 8101, "kym" ],
-[ 8102, "kyn" ],
-[ 8103, "kyo" ],
-[ 8104, "kyp" ],
-[ 8105, "kyq" ],
-[ 8106, "kyr" ],
-[ 8107, "kys" ],
-[ 8108, "kyt" ],
-[ 8109, "kyu" ],
-[ 8110, "kyv" ],
-[ 8111, "kyw" ],
-[ 8112, "kyx" ],
-[ 8113, "kyy" ],
-[ 8114, "kyz" ],
-[ 8115, "kza" ],
-[ 8116, "kzb" ],
-[ 8117, "kzc" ],
-[ 8118, "kzd" ],
-[ 8119, "kze" ],
-[ 8120, "kzf" ],
-[ 8121, "kzg" ],
-[ 8122, "kzh" ],
-[ 8123, "kzi" ],
-[ 8124, "kzj" ],
-[ 8125, "kzk" ],
-[ 8126, "kzl" ],
-[ 8127, "kzm" ],
-[ 8128, "kzn" ],
-[ 8129, "kzo" ],
-[ 8130, "kzp" ],
-[ 8131, "kzq" ],
-[ 8132, "kzr" ],
-[ 8133, "kzs" ],
-[ 8134, "kzt" ],
-[ 8135, "kzu" ],
-[ 8136, "kzv" ],
-[ 8137, "kzw" ],
-[ 8138, "kzx" ],
-[ 8139, "kzy" ],
-[ 8140, "kzz" ],
-[ 8141, "laa" ],
-[ 8142, "lab" ],
-[ 8143, "lac" ],
-[ 8144, "lad" ],
-[ 8145, "lae" ],
-[ 8146, "laf" ],
-[ 8147, "lag" ],
-[ 8148, "lah" ],
-[ 8149, "lai" ],
-[ 8150, "laj" ],
-[ 8151, "lak" ],
-[ 8152, "lal" ],
-[ 8153, "lam" ],
-[ 8154, "lan" ],
-[ 8155, "lao" ],
-[ 8156, "lap" ],
-[ 8157, "laq" ],
-[ 8158, "lar" ],
-[ 8159, "las" ],
-[ 8160, "lat" ],
-[ 8161, "lau" ],
-[ 8162, "lav" ],
-[ 8163, "law" ],
-[ 8164, "lax" ],
-[ 8165, "lay" ],
-[ 8166, "laz" ],
-[ 8167, "lba" ],
-[ 8168, "lbb" ],
-[ 8169, "lbc" ],
-[ 8170, "lbd" ],
-[ 8171, "lbe" ],
-[ 8172, "lbf" ],
-[ 8173, "lbg" ],
-[ 8174, "lbh" ],
-[ 8175, "lbi" ],
-[ 8176, "lbj" ],
-[ 8177, "lbk" ],
-[ 8178, "lbl" ],
-[ 8179, "lbm" ],
-[ 8180, "lbn" ],
-[ 8181, "lbo" ],
-[ 8182, "lbp" ],
-[ 8183, "lbq" ],
-[ 8184, "lbr" ],
-[ 8185, "lbs" ],
-[ 8186, "lbt" ],
-[ 8187, "lbu" ],
-[ 8188, "lbv" ],
-[ 8189, "lbw" ],
-[ 8190, "lbx" ],
-[ 8191, "lby" ],
-[ 8192, "lbz" ],
-[ 8193, "lca" ],
-[ 8194, "lcb" ],
-[ 8195, "lcc" ],
-[ 8196, "lcd" ],
-[ 8197, "lce" ],
-[ 8198, "lcf" ],
-[ 8199, "lcg" ],
-[ 8200, "lch" ],
-[ 8201, "lci" ],
-[ 8202, "lcj" ],
-[ 8203, "lck" ],
-[ 8204, "lcl" ],
-[ 8205, "lcm" ],
-[ 8206, "lcn" ],
-[ 8207, "lco" ],
-[ 8208, "lcp" ],
-[ 8209, "lcq" ],
-[ 8210, "lcr" ],
-[ 8211, "lcs" ],
-[ 8212, "lct" ],
-[ 8213, "lcu" ],
-[ 8214, "lcv" ],
-[ 8215, "lcw" ],
-[ 8216, "lcx" ],
-[ 8217, "lcy" ],
-[ 8218, "lcz" ],
-[ 8219, "lda" ],
-[ 8220, "ldb" ],
-[ 8221, "ldc" ],
-[ 8222, "ldd" ],
-[ 8223, "lde" ],
-[ 8224, "ldf" ],
-[ 8225, "ldg" ],
-[ 8226, "ldh" ],
-[ 8227, "ldi" ],
-[ 8228, "ldj" ],
-[ 8229, "ldk" ],
-[ 8230, "ldl" ],
-[ 8231, "ldm" ],
-[ 8232, "ldn" ],
-[ 8233, "ldo" ],
-[ 8234, "ldp" ],
-[ 8235, "ldq" ],
-[ 8236, "ldr" ],
-[ 8237, "lds" ],
-[ 8238, "ldt" ],
-[ 8239, "ldu" ],
-[ 8240, "ldv" ],
-[ 8241, "ldw" ],
-[ 8242, "ldx" ],
-[ 8243, "ldy" ],
-[ 8244, "ldz" ],
-[ 8245, "lea" ],
-[ 8246, "leb" ],
-[ 8247, "lec" ],
-[ 8248, "led" ],
-[ 8249, "lee" ],
-[ 8250, "lef" ],
-[ 8251, "leg" ],
-[ 8252, "leh" ],
-[ 8253, "lei" ],
-[ 8254, "lej" ],
-[ 8255, "lek" ],
-[ 8256, "lel" ],
-[ 8257, "lem" ],
-[ 8258, "len" ],
-[ 8259, "leo" ],
-[ 8260, "lep" ],
-[ 8261, "leq" ],
-[ 8262, "ler" ],
-[ 8263, "les" ],
-[ 8264, "let" ],
-[ 8265, "leu" ],
-[ 8266, "lev" ],
-[ 8267, "lew" ],
-[ 8268, "lex" ],
-[ 8269, "ley" ],
-[ 8270, "lez" ],
-[ 8271, "lfa" ],
-[ 8272, "lfb" ],
-[ 8273, "lfc" ],
-[ 8274, "lfd" ],
-[ 8275, "lfe" ],
-[ 8276, "lff" ],
-[ 8277, "lfg" ],
-[ 8278, "lfh" ],
-[ 8279, "lfi" ],
-[ 8280, "lfj" ],
-[ 8281, "lfk" ],
-[ 8282, "lfl" ],
-[ 8283, "lfm" ],
-[ 8284, "lfn" ],
-[ 8285, "lfo" ],
-[ 8286, "lfp" ],
-[ 8287, "lfq" ],
-[ 8288, "lfr" ],
-[ 8289, "lfs" ],
-[ 8290, "lft" ],
-[ 8291, "lfu" ],
-[ 8292, "lfv" ],
-[ 8293, "lfw" ],
-[ 8294, "lfx" ],
-[ 8295, "lfy" ],
-[ 8296, "lfz" ],
-[ 8297, "lga" ],
-[ 8298, "lgb" ],
-[ 8299, "lgc" ],
-[ 8300, "lgd" ],
-[ 8301, "lge" ],
-[ 8302, "lgf" ],
-[ 8303, "lgg" ],
-[ 8304, "lgh" ],
-[ 8305, "lgi" ],
-[ 8306, "lgj" ],
-[ 8307, "lgk" ],
-[ 8308, "lgl" ],
-[ 8309, "lgm" ],
-[ 8310, "lgn" ],
-[ 8311, "lgo" ],
-[ 8312, "lgp" ],
-[ 8313, "lgq" ],
-[ 8314, "lgr" ],
-[ 8315, "lgs" ],
-[ 8316, "lgt" ],
-[ 8317, "lgu" ],
-[ 8318, "lgv" ],
-[ 8319, "lgw" ],
-[ 8320, "lgx" ],
-[ 8321, "lgy" ],
-[ 8322, "lgz" ],
-[ 8323, "lha" ],
-[ 8324, "lhb" ],
-[ 8325, "lhc" ],
-[ 8326, "lhd" ],
-[ 8327, "lhe" ],
-[ 8328, "lhf" ],
-[ 8329, "lhg" ],
-[ 8330, "lhh" ],
-[ 8331, "lhi" ],
-[ 8332, "lhj" ],
-[ 8333, "lhk" ],
-[ 8334, "lhl" ],
-[ 8335, "lhm" ],
-[ 8336, "lhn" ],
-[ 8337, "lho" ],
-[ 8338, "lhp" ],
-[ 8339, "lhq" ],
-[ 8340, "lhr" ],
-[ 8341, "lhs" ],
-[ 8342, "lht" ],
-[ 8343, "lhu" ],
-[ 8344, "lhv" ],
-[ 8345, "lhw" ],
-[ 8346, "lhx" ],
-[ 8347, "lhy" ],
-[ 8348, "lhz" ],
-[ 8349, "lia" ],
-[ 8350, "lib" ],
-[ 8351, "lic" ],
-[ 8352, "lid" ],
-[ 8353, "lie" ],
-[ 8354, "lif" ],
-[ 8355, "lig" ],
-[ 8356, "lih" ],
-[ 8357, "lii" ],
-[ 8358, "lij" ],
-[ 8359, "lik" ],
-[ 8360, "lil" ],
-[ 8361, "lim" ],
-[ 8362, "lin" ],
-[ 8363, "lio" ],
-[ 8364, "lip" ],
-[ 8365, "liq" ],
-[ 8366, "lir" ],
-[ 8367, "lis" ],
-[ 8368, "lit" ],
-[ 8369, "liu" ],
-[ 8370, "liv" ],
-[ 8371, "liw" ],
-[ 8372, "lix" ],
-[ 8373, "liy" ],
-[ 8374, "liz" ],
-[ 8375, "lja" ],
-[ 8376, "ljb" ],
-[ 8377, "ljc" ],
-[ 8378, "ljd" ],
-[ 8379, "lje" ],
-[ 8380, "ljf" ],
-[ 8381, "ljg" ],
-[ 8382, "ljh" ],
-[ 8383, "lji" ],
-[ 8384, "ljj" ],
-[ 8385, "ljk" ],
-[ 8386, "ljl" ],
-[ 8387, "ljm" ],
-[ 8388, "ljn" ],
-[ 8389, "ljo" ],
-[ 8390, "ljp" ],
-[ 8391, "ljq" ],
-[ 8392, "ljr" ],
-[ 8393, "ljs" ],
-[ 8394, "ljt" ],
-[ 8395, "lju" ],
-[ 8396, "ljv" ],
-[ 8397, "ljw" ],
-[ 8398, "ljx" ],
-[ 8399, "ljy" ],
-[ 8400, "ljz" ],
-[ 8401, "lka" ],
-[ 8402, "lkb" ],
-[ 8403, "lkc" ],
-[ 8404, "lkd" ],
-[ 8405, "lke" ],
-[ 8406, "lkf" ],
-[ 8407, "lkg" ],
-[ 8408, "lkh" ],
-[ 8409, "lki" ],
-[ 8410, "lkj" ],
-[ 8411, "lkk" ],
-[ 8412, "lkl" ],
-[ 8413, "lkm" ],
-[ 8414, "lkn" ],
-[ 8415, "lko" ],
-[ 8416, "lkp" ],
-[ 8417, "lkq" ],
-[ 8418, "lkr" ],
-[ 8419, "lks" ],
-[ 8420, "lkt" ],
-[ 8421, "lku" ],
-[ 8422, "lkv" ],
-[ 8423, "lkw" ],
-[ 8424, "lkx" ],
-[ 8425, "lky" ],
-[ 8426, "lkz" ],
-[ 8427, "lla" ],
-[ 8428, "llb" ],
-[ 8429, "llc" ],
-[ 8430, "lld" ],
-[ 8431, "lle" ],
-[ 8432, "llf" ],
-[ 8433, "llg" ],
-[ 8434, "llh" ],
-[ 8435, "lli" ],
-[ 8436, "llj" ],
-[ 8437, "llk" ],
-[ 8438, "lll" ],
-[ 8439, "llm" ],
-[ 8440, "lln" ],
-[ 8441, "llo" ],
-[ 8442, "llp" ],
-[ 8443, "llq" ],
-[ 8444, "llr" ],
-[ 8445, "lls" ],
-[ 8446, "llt" ],
-[ 8447, "llu" ],
-[ 8448, "llv" ],
-[ 8449, "llw" ],
-[ 8450, "llx" ],
-[ 8451, "lly" ],
-[ 8452, "llz" ],
-[ 8453, "lma" ],
-[ 8454, "lmb" ],
-[ 8455, "lmc" ],
-[ 8456, "lmd" ],
-[ 8457, "lme" ],
-[ 8458, "lmf" ],
-[ 8459, "lmg" ],
-[ 8460, "lmh" ],
-[ 8461, "lmi" ],
-[ 8462, "lmj" ],
-[ 8463, "lmk" ],
-[ 8464, "lml" ],
-[ 8465, "lmm" ],
-[ 8466, "lmn" ],
-[ 8467, "lmo" ],
-[ 8468, "lmp" ],
-[ 8469, "lmq" ],
-[ 8470, "lmr" ],
-[ 8471, "lms" ],
-[ 8472, "lmt" ],
-[ 8473, "lmu" ],
-[ 8474, "lmv" ],
-[ 8475, "lmw" ],
-[ 8476, "lmx" ],
-[ 8477, "lmy" ],
-[ 8478, "lmz" ],
-[ 8479, "lna" ],
-[ 8480, "lnb" ],
-[ 8481, "lnc" ],
-[ 8482, "lnd" ],
-[ 8483, "lne" ],
-[ 8484, "lnf" ],
-[ 8485, "lng" ],
-[ 8486, "lnh" ],
-[ 8487, "lni" ],
-[ 8488, "lnj" ],
-[ 8489, "lnk" ],
-[ 8490, "lnl" ],
-[ 8491, "lnm" ],
-[ 8492, "lnn" ],
-[ 8493, "lno" ],
-[ 8494, "lnp" ],
-[ 8495, "lnq" ],
-[ 8496, "lnr" ],
-[ 8497, "lns" ],
-[ 8498, "lnt" ],
-[ 8499, "lnu" ],
-[ 8500, "lnv" ],
-[ 8501, "lnw" ],
-[ 8502, "lnx" ],
-[ 8503, "lny" ],
-[ 8504, "lnz" ],
-[ 8505, "loa" ],
-[ 8506, "lob" ],
-[ 8507, "loc" ],
-[ 8508, "lod" ],
-[ 8509, "loe" ],
-[ 8510, "lof" ],
-[ 8511, "log" ],
-[ 8512, "loh" ],
-[ 8513, "loi" ],
-[ 8514, "loj" ],
-[ 8515, "lok" ],
-[ 8516, "lol" ],
-[ 8517, "lom" ],
-[ 8518, "lon" ],
-[ 8519, "loo" ],
-[ 8520, "lop" ],
-[ 8521, "loq" ],
-[ 8522, "lor" ],
-[ 8523, "los" ],
-[ 8524, "lot" ],
-[ 8525, "lou" ],
-[ 8526, "lov" ],
-[ 8527, "low" ],
-[ 8528, "lox" ],
-[ 8529, "loy" ],
-[ 8530, "loz" ],
-[ 8531, "lpa" ],
-[ 8532, "lpb" ],
-[ 8533, "lpc" ],
-[ 8534, "lpd" ],
-[ 8535, "lpe" ],
-[ 8536, "lpf" ],
-[ 8537, "lpg" ],
-[ 8538, "lph" ],
-[ 8539, "lpi" ],
-[ 8540, "lpj" ],
-[ 8541, "lpk" ],
-[ 8542, "lpl" ],
-[ 8543, "lpm" ],
-[ 8544, "lpn" ],
-[ 8545, "lpo" ],
-[ 8546, "lpp" ],
-[ 8547, "lpq" ],
-[ 8548, "lpr" ],
-[ 8549, "lps" ],
-[ 8550, "lpt" ],
-[ 8551, "lpu" ],
-[ 8552, "lpv" ],
-[ 8553, "lpw" ],
-[ 8554, "lpx" ],
-[ 8555, "lpy" ],
-[ 8556, "lpz" ],
-[ 8557, "lqa" ],
-[ 8558, "lqb" ],
-[ 8559, "lqc" ],
-[ 8560, "lqd" ],
-[ 8561, "lqe" ],
-[ 8562, "lqf" ],
-[ 8563, "lqg" ],
-[ 8564, "lqh" ],
-[ 8565, "lqi" ],
-[ 8566, "lqj" ],
-[ 8567, "lqk" ],
-[ 8568, "lql" ],
-[ 8569, "lqm" ],
-[ 8570, "lqn" ],
-[ 8571, "lqo" ],
-[ 8572, "lqp" ],
-[ 8573, "lqq" ],
-[ 8574, "lqr" ],
-[ 8575, "lqs" ],
-[ 8576, "lqt" ],
-[ 8577, "lqu" ],
-[ 8578, "lqv" ],
-[ 8579, "lqw" ],
-[ 8580, "lqx" ],
-[ 8581, "lqy" ],
-[ 8582, "lqz" ],
-[ 8583, "lra" ],
-[ 8584, "lrb" ],
-[ 8585, "lrc" ],
-[ 8586, "lrd" ],
-[ 8587, "lre" ],
-[ 8588, "lrf" ],
-[ 8589, "lrg" ],
-[ 8590, "lrh" ],
-[ 8591, "lri" ],
-[ 8592, "lrj" ],
-[ 8593, "lrk" ],
-[ 8594, "lrl" ],
-[ 8595, "lrm" ],
-[ 8596, "lrn" ],
-[ 8597, "lro" ],
-[ 8598, "lrp" ],
-[ 8599, "lrq" ],
-[ 8600, "lrr" ],
-[ 8601, "lrs" ],
-[ 8602, "lrt" ],
-[ 8603, "lru" ],
-[ 8604, "lrv" ],
-[ 8605, "lrw" ],
-[ 8606, "lrx" ],
-[ 8607, "lry" ],
-[ 8608, "lrz" ],
-[ 8609, "lsa" ],
-[ 8610, "lsb" ],
-[ 8611, "lsc" ],
-[ 8612, "lsd" ],
-[ 8613, "lse" ],
-[ 8614, "lsf" ],
-[ 8615, "lsg" ],
-[ 8616, "lsh" ],
-[ 8617, "lsi" ],
-[ 8618, "lsj" ],
-[ 8619, "lsk" ],
-[ 8620, "lsl" ],
-[ 8621, "lsm" ],
-[ 8622, "lsn" ],
-[ 8623, "lso" ],
-[ 8624, "lsp" ],
-[ 8625, "lsq" ],
-[ 8626, "lsr" ],
-[ 8627, "lss" ],
-[ 8628, "lst" ],
-[ 8629, "lsu" ],
-[ 8630, "lsv" ],
-[ 8631, "lsw" ],
-[ 8632, "lsx" ],
-[ 8633, "lsy" ],
-[ 8634, "lsz" ],
-[ 8635, "lta" ],
-[ 8636, "ltb" ],
-[ 8637, "ltc" ],
-[ 8638, "ltd" ],
-[ 8639, "lte" ],
-[ 8640, "ltf" ],
-[ 8641, "ltg" ],
-[ 8642, "lth" ],
-[ 8643, "lti" ],
-[ 8644, "ltj" ],
-[ 8645, "ltk" ],
-[ 8646, "ltl" ],
-[ 8647, "ltm" ],
-[ 8648, "ltn" ],
-[ 8649, "lto" ],
-[ 8650, "ltp" ],
-[ 8651, "ltq" ],
-[ 8652, "ltr" ],
-[ 8653, "lts" ],
-[ 8654, "ltt" ],
-[ 8655, "ltu" ],
-[ 8656, "ltv" ],
-[ 8657, "ltw" ],
-[ 8658, "ltx" ],
-[ 8659, "lty" ],
-[ 8660, "ltz" ],
-[ 8661, "lua" ],
-[ 8662, "lub" ],
-[ 8663, "luc" ],
-[ 8664, "lud" ],
-[ 8665, "lue" ],
-[ 8666, "luf" ],
-[ 8667, "lug" ],
-[ 8668, "luh" ],
-[ 8669, "lui" ],
-[ 8670, "luj" ],
-[ 8671, "luk" ],
-[ 8672, "lul" ],
-[ 8673, "lum" ],
-[ 8674, "lun" ],
-[ 8675, "luo" ],
-[ 8676, "lup" ],
-[ 8677, "luq" ],
-[ 8678, "lur" ],
-[ 8679, "lus" ],
-[ 8680, "lut" ],
-[ 8681, "luu" ],
-[ 8682, "luv" ],
-[ 8683, "luw" ],
-[ 8684, "lux" ],
-[ 8685, "luy" ],
-[ 8686, "luz" ],
-[ 8687, "lva" ],
-[ 8688, "lvb" ],
-[ 8689, "lvc" ],
-[ 8690, "lvd" ],
-[ 8691, "lve" ],
-[ 8692, "lvf" ],
-[ 8693, "lvg" ],
-[ 8694, "lvh" ],
-[ 8695, "lvi" ],
-[ 8696, "lvj" ],
-[ 8697, "lvk" ],
-[ 8698, "lvl" ],
-[ 8699, "lvm" ],
-[ 8700, "lvn" ],
-[ 8701, "lvo" ],
-[ 8702, "lvp" ],
-[ 8703, "lvq" ],
-[ 8704, "lvr" ],
-[ 8705, "lvs" ],
-[ 8706, "lvt" ],
-[ 8707, "lvu" ],
-[ 8708, "lvv" ],
-[ 8709, "lvw" ],
-[ 8710, "lvx" ],
-[ 8711, "lvy" ],
-[ 8712, "lvz" ],
-[ 8713, "lwa" ],
-[ 8714, "lwb" ],
-[ 8715, "lwc" ],
-[ 8716, "lwd" ],
-[ 8717, "lwe" ],
-[ 8718, "lwf" ],
-[ 8719, "lwg" ],
-[ 8720, "lwh" ],
-[ 8721, "lwi" ],
-[ 8722, "lwj" ],
-[ 8723, "lwk" ],
-[ 8724, "lwl" ],
-[ 8725, "lwm" ],
-[ 8726, "lwn" ],
-[ 8727, "lwo" ],
-[ 8728, "lwp" ],
-[ 8729, "lwq" ],
-[ 8730, "lwr" ],
-[ 8731, "lws" ],
-[ 8732, "lwt" ],
-[ 8733, "lwu" ],
-[ 8734, "lwv" ],
-[ 8735, "lww" ],
-[ 8736, "lwx" ],
-[ 8737, "lwy" ],
-[ 8738, "lwz" ],
-[ 8739, "lxa" ],
-[ 8740, "lxb" ],
-[ 8741, "lxc" ],
-[ 8742, "lxd" ],
-[ 8743, "lxe" ],
-[ 8744, "lxf" ],
-[ 8745, "lxg" ],
-[ 8746, "lxh" ],
-[ 8747, "lxi" ],
-[ 8748, "lxj" ],
-[ 8749, "lxk" ],
-[ 8750, "lxl" ],
-[ 8751, "lxm" ],
-[ 8752, "lxn" ],
-[ 8753, "lxo" ],
-[ 8754, "lxp" ],
-[ 8755, "lxq" ],
-[ 8756, "lxr" ],
-[ 8757, "lxs" ],
-[ 8758, "lxt" ],
-[ 8759, "lxu" ],
-[ 8760, "lxv" ],
-[ 8761, "lxw" ],
-[ 8762, "lxx" ],
-[ 8763, "lxy" ],
-[ 8764, "lxz" ],
-[ 8765, "lya" ],
-[ 8766, "lyb" ],
-[ 8767, "lyc" ],
-[ 8768, "lyd" ],
-[ 8769, "lye" ],
-[ 8770, "lyf" ],
-[ 8771, "lyg" ],
-[ 8772, "lyh" ],
-[ 8773, "lyi" ],
-[ 8774, "lyj" ],
-[ 8775, "lyk" ],
-[ 8776, "lyl" ],
-[ 8777, "lym" ],
-[ 8778, "lyn" ],
-[ 8779, "lyo" ],
-[ 8780, "lyp" ],
-[ 8781, "lyq" ],
-[ 8782, "lyr" ],
-[ 8783, "lys" ],
-[ 8784, "lyt" ],
-[ 8785, "lyu" ],
-[ 8786, "lyv" ],
-[ 8787, "lyw" ],
-[ 8788, "lyx" ],
-[ 8789, "lyy" ],
-[ 8790, "lyz" ],
-[ 8791, "lza" ],
-[ 8792, "lzb" ],
-[ 8793, "lzc" ],
-[ 8794, "lzd" ],
-[ 8795, "lze" ],
-[ 8796, "lzf" ],
-[ 8797, "lzg" ],
-[ 8798, "lzh" ],
-[ 8799, "lzi" ],
-[ 8800, "lzj" ],
-[ 8801, "lzk" ],
-[ 8802, "lzl" ],
-[ 8803, "lzm" ],
-[ 8804, "lzn" ],
-[ 8805, "lzo" ],
-[ 8806, "lzp" ],
-[ 8807, "lzq" ],
-[ 8808, "lzr" ],
-[ 8809, "lzs" ],
-[ 8810, "lzt" ],
-[ 8811, "lzu" ],
-[ 8812, "lzv" ],
-[ 8813, "lzw" ],
-[ 8814, "lzx" ],
-[ 8815, "lzy" ],
-[ 8816, "lzz" ],
-[ 8817, "maa" ],
-[ 8818, "mab" ],
-[ 8819, "mac" ],
-[ 8820, "mad" ],
-[ 8821, "mae" ],
-[ 8822, "maf" ],
-[ 8823, "mag" ],
-[ 8824, "mah" ],
-[ 8825, "mai" ],
-[ 8826, "maj" ],
-[ 8827, "mak" ],
-[ 8828, "mal" ],
-[ 8829, "mam" ],
-[ 8830, "man" ],
-[ 8831, "mao" ],
-[ 8832, "map" ],
-[ 8833, "maq" ],
-[ 8834, "mar" ],
-[ 8835, "mas" ],
-[ 8836, "mat" ],
-[ 8837, "mau" ],
-[ 8838, "mav" ],
-[ 8839, "maw" ],
-[ 8840, "max" ],
-[ 8841, "may" ],
-[ 8842, "maz" ],
-[ 8843, "mba" ],
-[ 8844, "mbb" ],
-[ 8845, "mbc" ],
-[ 8846, "mbd" ],
-[ 8847, "mbe" ],
-[ 8848, "mbf" ],
-[ 8849, "mbg" ],
-[ 8850, "mbh" ],
-[ 8851, "mbi" ],
-[ 8852, "mbj" ],
-[ 8853, "mbk" ],
-[ 8854, "mbl" ],
-[ 8855, "mbm" ],
-[ 8856, "mbn" ],
-[ 8857, "mbo" ],
-[ 8858, "mbp" ],
-[ 8859, "mbq" ],
-[ 8860, "mbr" ],
-[ 8861, "mbs" ],
-[ 8862, "mbt" ],
-[ 8863, "mbu" ],
-[ 8864, "mbv" ],
-[ 8865, "mbw" ],
-[ 8866, "mbx" ],
-[ 8867, "mby" ],
-[ 8868, "mbz" ],
-[ 8869, "mca" ],
-[ 8870, "mcb" ],
-[ 8871, "mcc" ],
-[ 8872, "mcd" ],
-[ 8873, "mce" ],
-[ 8874, "mcf" ],
-[ 8875, "mcg" ],
-[ 8876, "mch" ],
-[ 8877, "mci" ],
-[ 8878, "mcj" ],
-[ 8879, "mck" ],
-[ 8880, "mcl" ],
-[ 8881, "mcm" ],
-[ 8882, "mcn" ],
-[ 8883, "mco" ],
-[ 8884, "mcp" ],
-[ 8885, "mcq" ],
-[ 8886, "mcr" ],
-[ 8887, "mcs" ],
-[ 8888, "mct" ],
-[ 8889, "mcu" ],
-[ 8890, "mcv" ],
-[ 8891, "mcw" ],
-[ 8892, "mcx" ],
-[ 8893, "mcy" ],
-[ 8894, "mcz" ],
-[ 8895, "mda" ],
-[ 8896, "mdb" ],
-[ 8897, "mdc" ],
-[ 8898, "mdd" ],
-[ 8899, "mde" ],
-[ 8900, "mdf" ],
-[ 8901, "mdg" ],
-[ 8902, "mdh" ],
-[ 8903, "mdi" ],
-[ 8904, "mdj" ],
-[ 8905, "mdk" ],
-[ 8906, "mdl" ],
-[ 8907, "mdm" ],
-[ 8908, "mdn" ],
-[ 8909, "mdo" ],
-[ 8910, "mdp" ],
-[ 8911, "mdq" ],
-[ 8912, "mdr" ],
-[ 8913, "mds" ],
-[ 8914, "mdt" ],
-[ 8915, "mdu" ],
-[ 8916, "mdv" ],
-[ 8917, "mdw" ],
-[ 8918, "mdx" ],
-[ 8919, "mdy" ],
-[ 8920, "mdz" ],
-[ 8921, "mea" ],
-[ 8922, "meb" ],
-[ 8923, "mec" ],
-[ 8924, "med" ],
-[ 8925, "mee" ],
-[ 8926, "mef" ],
-[ 8927, "meg" ],
-[ 8928, "meh" ],
-[ 8929, "mei" ],
-[ 8930, "mej" ],
-[ 8931, "mek" ],
-[ 8932, "mel" ],
-[ 8933, "mem" ],
-[ 8934, "men" ],
-[ 8935, "meo" ],
-[ 8936, "mep" ],
-[ 8937, "meq" ],
-[ 8938, "mer" ],
-[ 8939, "mes" ],
-[ 8940, "met" ],
-[ 8941, "meu" ],
-[ 8942, "mev" ],
-[ 8943, "mew" ],
-[ 8944, "mex" ],
-[ 8945, "mey" ],
-[ 8946, "mez" ],
-[ 8947, "mfa" ],
-[ 8948, "mfb" ],
-[ 8949, "mfc" ],
-[ 8950, "mfd" ],
-[ 8951, "mfe" ],
-[ 8952, "mff" ],
-[ 8953, "mfg" ],
-[ 8954, "mfh" ],
-[ 8955, "mfi" ],
-[ 8956, "mfj" ],
-[ 8957, "mfk" ],
-[ 8958, "mfl" ],
-[ 8959, "mfm" ],
-[ 8960, "mfn" ],
-[ 8961, "mfo" ],
-[ 8962, "mfp" ],
-[ 8963, "mfq" ],
-[ 8964, "mfr" ],
-[ 8965, "mfs" ],
-[ 8966, "mft" ],
-[ 8967, "mfu" ],
-[ 8968, "mfv" ],
-[ 8969, "mfw" ],
-[ 8970, "mfx" ],
-[ 8971, "mfy" ],
-[ 8972, "mfz" ],
-[ 8973, "mga" ],
-[ 8974, "mgb" ],
-[ 8975, "mgc" ],
-[ 8976, "mgd" ],
-[ 8977, "mge" ],
-[ 8978, "mgf" ],
-[ 8979, "mgg" ],
-[ 8980, "mgh" ],
-[ 8981, "mgi" ],
-[ 8982, "mgj" ],
-[ 8983, "mgk" ],
-[ 8984, "mgl" ],
-[ 8985, "mgm" ],
-[ 8986, "mgn" ],
-[ 8987, "mgo" ],
-[ 8988, "mgp" ],
-[ 8989, "mgq" ],
-[ 8990, "mgr" ],
-[ 8991, "mgs" ],
-[ 8992, "mgt" ],
-[ 8993, "mgu" ],
-[ 8994, "mgv" ],
-[ 8995, "mgw" ],
-[ 8996, "mgx" ],
-[ 8997, "mgy" ],
-[ 8998, "mgz" ],
-[ 8999, "mha" ],
-[ 9000, "mhb" ],
-[ 9001, "mhc" ],
-[ 9002, "mhd" ],
-[ 9003, "mhe" ],
-[ 9004, "mhf" ],
-[ 9005, "mhg" ],
-[ 9006, "mhh" ],
-[ 9007, "mhi" ],
-[ 9008, "mhj" ],
-[ 9009, "mhk" ],
-[ 9010, "mhl" ],
-[ 9011, "mhm" ],
-[ 9012, "mhn" ],
-[ 9013, "mho" ],
-[ 9014, "mhp" ],
-[ 9015, "mhq" ],
-[ 9016, "mhr" ],
-[ 9017, "mhs" ],
-[ 9018, "mht" ],
-[ 9019, "mhu" ],
-[ 9020, "mhv" ],
-[ 9021, "mhw" ],
-[ 9022, "mhx" ],
-[ 9023, "mhy" ],
-[ 9024, "mhz" ],
-[ 9025, "mia" ],
-[ 9026, "mib" ],
-[ 9027, "mic" ],
-[ 9028, "mid" ],
-[ 9029, "mie" ],
-[ 9030, "mif" ],
-[ 9031, "mig" ],
-[ 9032, "mih" ],
-[ 9033, "mii" ],
-[ 9034, "mij" ],
-[ 9035, "mik" ],
-[ 9036, "mil" ],
-[ 9037, "mim" ],
-[ 9038, "min" ],
-[ 9039, "mio" ],
-[ 9040, "mip" ],
-[ 9041, "miq" ],
-[ 9042, "mir" ],
-[ 9043, "mis" ],
-[ 9044, "mit" ],
-[ 9045, "miu" ],
-[ 9046, "miv" ],
-[ 9047, "miw" ],
-[ 9048, "mix" ],
-[ 9049, "miy" ],
-[ 9050, "miz" ],
-[ 9051, "mja" ],
-[ 9052, "mjb" ],
-[ 9053, "mjc" ],
-[ 9054, "mjd" ],
-[ 9055, "mje" ],
-[ 9056, "mjf" ],
-[ 9057, "mjg" ],
-[ 9058, "mjh" ],
-[ 9059, "mji" ],
-[ 9060, "mjj" ],
-[ 9061, "mjk" ],
-[ 9062, "mjl" ],
-[ 9063, "mjm" ],
-[ 9064, "mjn" ],
-[ 9065, "mjo" ],
-[ 9066, "mjp" ],
-[ 9067, "mjq" ],
-[ 9068, "mjr" ],
-[ 9069, "mjs" ],
-[ 9070, "mjt" ],
-[ 9071, "mju" ],
-[ 9072, "mjv" ],
-[ 9073, "mjw" ],
-[ 9074, "mjx" ],
-[ 9075, "mjy" ],
-[ 9076, "mjz" ],
-[ 9077, "mka" ],
-[ 9078, "mkb" ],
-[ 9079, "mkc" ],
-[ 9080, "mkd" ],
-[ 9081, "mke" ],
-[ 9082, "mkf" ],
-[ 9083, "mkg" ],
-[ 9084, "mkh" ],
-[ 9085, "mki" ],
-[ 9086, "mkj" ],
-[ 9087, "mkk" ],
-[ 9088, "mkl" ],
-[ 9089, "mkm" ],
-[ 9090, "mkn" ],
-[ 9091, "mko" ],
-[ 9092, "mkp" ],
-[ 9093, "mkq" ],
-[ 9094, "mkr" ],
-[ 9095, "mks" ],
-[ 9096, "mkt" ],
-[ 9097, "mku" ],
-[ 9098, "mkv" ],
-[ 9099, "mkw" ],
-[ 9100, "mkx" ],
-[ 9101, "mky" ],
-[ 9102, "mkz" ],
-[ 9103, "mla" ],
-[ 9104, "mlb" ],
-[ 9105, "mlc" ],
-[ 9106, "mld" ],
-[ 9107, "mle" ],
-[ 9108, "mlf" ],
-[ 9109, "mlg" ],
-[ 9110, "mlh" ],
-[ 9111, "mli" ],
-[ 9112, "mlj" ],
-[ 9113, "mlk" ],
-[ 9114, "mll" ],
-[ 9115, "mlm" ],
-[ 9116, "mln" ],
-[ 9117, "mlo" ],
-[ 9118, "mlp" ],
-[ 9119, "mlq" ],
-[ 9120, "mlr" ],
-[ 9121, "mls" ],
-[ 9122, "mlt" ],
-[ 9123, "mlu" ],
-[ 9124, "mlv" ],
-[ 9125, "mlw" ],
-[ 9126, "mlx" ],
-[ 9127, "mly" ],
-[ 9128, "mlz" ],
-[ 9129, "mma" ],
-[ 9130, "mmb" ],
-[ 9131, "mmc" ],
-[ 9132, "mmd" ],
-[ 9133, "mme" ],
-[ 9134, "mmf" ],
-[ 9135, "mmg" ],
-[ 9136, "mmh" ],
-[ 9137, "mmi" ],
-[ 9138, "mmj" ],
-[ 9139, "mmk" ],
-[ 9140, "mml" ],
-[ 9141, "mmm" ],
-[ 9142, "mmn" ],
-[ 9143, "mmo" ],
-[ 9144, "mmp" ],
-[ 9145, "mmq" ],
-[ 9146, "mmr" ],
-[ 9147, "mms" ],
-[ 9148, "mmt" ],
-[ 9149, "mmu" ],
-[ 9150, "mmv" ],
-[ 9151, "mmw" ],
-[ 9152, "mmx" ],
-[ 9153, "mmy" ],
-[ 9154, "mmz" ],
-[ 9155, "mna" ],
-[ 9156, "mnb" ],
-[ 9157, "mnc" ],
-[ 9158, "mnd" ],
-[ 9159, "mne" ],
-[ 9160, "mnf" ],
-[ 9161, "mng" ],
-[ 9162, "mnh" ],
-[ 9163, "mni" ],
-[ 9164, "mnj" ],
-[ 9165, "mnk" ],
-[ 9166, "mnl" ],
-[ 9167, "mnm" ],
-[ 9168, "mnn" ],
-[ 9169, "mno" ],
-[ 9170, "mnp" ],
-[ 9171, "mnq" ],
-[ 9172, "mnr" ],
-[ 9173, "mns" ],
-[ 9174, "mnt" ],
-[ 9175, "mnu" ],
-[ 9176, "mnv" ],
-[ 9177, "mnw" ],
-[ 9178, "mnx" ],
-[ 9179, "mny" ],
-[ 9180, "mnz" ],
-[ 9181, "moa" ],
-[ 9182, "mob" ],
-[ 9183, "moc" ],
-[ 9184, "mod" ],
-[ 9185, "moe" ],
-[ 9186, "mof" ],
-[ 9187, "mog" ],
-[ 9188, "moh" ],
-[ 9189, "moi" ],
-[ 9190, "moj" ],
-[ 9191, "mok" ],
-[ 9192, "mol" ],
-[ 9193, "mom" ],
-[ 9194, "mon" ],
-[ 9195, "moo" ],
-[ 9196, "mop" ],
-[ 9197, "moq" ],
-[ 9198, "mor" ],
-[ 9199, "mos" ],
-[ 9200, "mot" ],
-[ 9201, "mou" ],
-[ 9202, "mov" ],
-[ 9203, "mow" ],
-[ 9204, "mox" ],
-[ 9205, "moy" ],
-[ 9206, "moz" ],
-[ 9207, "mpa" ],
-[ 9208, "mpb" ],
-[ 9209, "mpc" ],
-[ 9210, "mpd" ],
-[ 9211, "mpe" ],
-[ 9212, "mpf" ],
-[ 9213, "mpg" ],
-[ 9214, "mph" ],
-[ 9215, "mpi" ],
-[ 9216, "mpj" ],
-[ 9217, "mpk" ],
-[ 9218, "mpl" ],
-[ 9219, "mpm" ],
-[ 9220, "mpn" ],
-[ 9221, "mpo" ],
-[ 9222, "mpp" ],
-[ 9223, "mpq" ],
-[ 9224, "mpr" ],
-[ 9225, "mps" ],
-[ 9226, "mpt" ],
-[ 9227, "mpu" ],
-[ 9228, "mpv" ],
-[ 9229, "mpw" ],
-[ 9230, "mpx" ],
-[ 9231, "mpy" ],
-[ 9232, "mpz" ],
-[ 9233, "mqa" ],
-[ 9234, "mqb" ],
-[ 9235, "mqc" ],
-[ 9236, "mqd" ],
-[ 9237, "mqe" ],
-[ 9238, "mqf" ],
-[ 9239, "mqg" ],
-[ 9240, "mqh" ],
-[ 9241, "mqi" ],
-[ 9242, "mqj" ],
-[ 9243, "mqk" ],
-[ 9244, "mql" ],
-[ 9245, "mqm" ],
-[ 9246, "mqn" ],
-[ 9247, "mqo" ],
-[ 9248, "mqp" ],
-[ 9249, "mqq" ],
-[ 9250, "mqr" ],
-[ 9251, "mqs" ],
-[ 9252, "mqt" ],
-[ 9253, "mqu" ],
-[ 9254, "mqv" ],
-[ 9255, "mqw" ],
-[ 9256, "mqx" ],
-[ 9257, "mqy" ],
-[ 9258, "mqz" ],
-[ 9259, "mra" ],
-[ 9260, "mrb" ],
-[ 9261, "mrc" ],
-[ 9262, "mrd" ],
-[ 9263, "mre" ],
-[ 9264, "mrf" ],
-[ 9265, "mrg" ],
-[ 9266, "mrh" ],
-[ 9267, "mri" ],
-[ 9268, "mrj" ],
-[ 9269, "mrk" ],
-[ 9270, "mrl" ],
-[ 9271, "mrm" ],
-[ 9272, "mrn" ],
-[ 9273, "mro" ],
-[ 9274, "mrp" ],
-[ 9275, "mrq" ],
-[ 9276, "mrr" ],
-[ 9277, "mrs" ],
-[ 9278, "mrt" ],
-[ 9279, "mru" ],
-[ 9280, "mrv" ],
-[ 9281, "mrw" ],
-[ 9282, "mrx" ],
-[ 9283, "mry" ],
-[ 9284, "mrz" ],
-[ 9285, "msa" ],
-[ 9286, "msb" ],
-[ 9287, "msc" ],
-[ 9288, "msd" ],
-[ 9289, "mse" ],
-[ 9290, "msf" ],
-[ 9291, "msg" ],
-[ 9292, "msh" ],
-[ 9293, "msi" ],
-[ 9294, "msj" ],
-[ 9295, "msk" ],
-[ 9296, "msl" ],
-[ 9297, "msm" ],
-[ 9298, "msn" ],
-[ 9299, "mso" ],
-[ 9300, "msp" ],
-[ 9301, "msq" ],
-[ 9302, "msr" ],
-[ 9303, "mss" ],
-[ 9304, "mst" ],
-[ 9305, "msu" ],
-[ 9306, "msv" ],
-[ 9307, "msw" ],
-[ 9308, "msx" ],
-[ 9309, "msy" ],
-[ 9310, "msz" ],
-[ 9311, "mta" ],
-[ 9312, "mtb" ],
-[ 9313, "mtc" ],
-[ 9314, "mtd" ],
-[ 9315, "mte" ],
-[ 9316, "mtf" ],
-[ 9317, "mtg" ],
-[ 9318, "mth" ],
-[ 9319, "mti" ],
-[ 9320, "mtj" ],
-[ 9321, "mtk" ],
-[ 9322, "mtl" ],
-[ 9323, "mtm" ],
-[ 9324, "mtn" ],
-[ 9325, "mto" ],
-[ 9326, "mtp" ],
-[ 9327, "mtq" ],
-[ 9328, "mtr" ],
-[ 9329, "mts" ],
-[ 9330, "mtt" ],
-[ 9331, "mtu" ],
-[ 9332, "mtv" ],
-[ 9333, "mtw" ],
-[ 9334, "mtx" ],
-[ 9335, "mty" ],
-[ 9336, "mtz" ],
-[ 9337, "mua" ],
-[ 9338, "mub" ],
-[ 9339, "muc" ],
-[ 9340, "mud" ],
-[ 9341, "mue" ],
-[ 9342, "muf" ],
-[ 9343, "mug" ],
-[ 9344, "muh" ],
-[ 9345, "mui" ],
-[ 9346, "muj" ],
-[ 9347, "muk" ],
-[ 9348, "mul" ],
-[ 9349, "mum" ],
-[ 9350, "mun" ],
-[ 9351, "muo" ],
-[ 9352, "mup" ],
-[ 9353, "muq" ],
-[ 9354, "mur" ],
-[ 9355, "mus" ],
-[ 9356, "mut" ],
-[ 9357, "muu" ],
-[ 9358, "muv" ],
-[ 9359, "muw" ],
-[ 9360, "mux" ],
-[ 9361, "muy" ],
-[ 9362, "muz" ],
-[ 9363, "mva" ],
-[ 9364, "mvb" ],
-[ 9365, "mvc" ],
-[ 9366, "mvd" ],
-[ 9367, "mve" ],
-[ 9368, "mvf" ],
-[ 9369, "mvg" ],
-[ 9370, "mvh" ],
-[ 9371, "mvi" ],
-[ 9372, "mvj" ],
-[ 9373, "mvk" ],
-[ 9374, "mvl" ],
-[ 9375, "mvm" ],
-[ 9376, "mvn" ],
-[ 9377, "mvo" ],
-[ 9378, "mvp" ],
-[ 9379, "mvq" ],
-[ 9380, "mvr" ],
-[ 9381, "mvs" ],
-[ 9382, "mvt" ],
-[ 9383, "mvu" ],
-[ 9384, "mvv" ],
-[ 9385, "mvw" ],
-[ 9386, "mvx" ],
-[ 9387, "mvy" ],
-[ 9388, "mvz" ],
-[ 9389, "mwa" ],
-[ 9390, "mwb" ],
-[ 9391, "mwc" ],
-[ 9392, "mwd" ],
-[ 9393, "mwe" ],
-[ 9394, "mwf" ],
-[ 9395, "mwg" ],
-[ 9396, "mwh" ],
-[ 9397, "mwi" ],
-[ 9398, "mwj" ],
-[ 9399, "mwk" ],
-[ 9400, "mwl" ],
-[ 9401, "mwm" ],
-[ 9402, "mwn" ],
-[ 9403, "mwo" ],
-[ 9404, "mwp" ],
-[ 9405, "mwq" ],
-[ 9406, "mwr" ],
-[ 9407, "mws" ],
-[ 9408, "mwt" ],
-[ 9409, "mwu" ],
-[ 9410, "mwv" ],
-[ 9411, "mww" ],
-[ 9412, "mwx" ],
-[ 9413, "mwy" ],
-[ 9414, "mwz" ],
-[ 9415, "mxa" ],
-[ 9416, "mxb" ],
-[ 9417, "mxc" ],
-[ 9418, "mxd" ],
-[ 9419, "mxe" ],
-[ 9420, "mxf" ],
-[ 9421, "mxg" ],
-[ 9422, "mxh" ],
-[ 9423, "mxi" ],
-[ 9424, "mxj" ],
-[ 9425, "mxk" ],
-[ 9426, "mxl" ],
-[ 9427, "mxm" ],
-[ 9428, "mxn" ],
-[ 9429, "mxo" ],
-[ 9430, "mxp" ],
-[ 9431, "mxq" ],
-[ 9432, "mxr" ],
-[ 9433, "mxs" ],
-[ 9434, "mxt" ],
-[ 9435, "mxu" ],
-[ 9436, "mxv" ],
-[ 9437, "mxw" ],
-[ 9438, "mxx" ],
-[ 9439, "mxy" ],
-[ 9440, "mxz" ],
-[ 9441, "mya" ],
-[ 9442, "myb" ],
-[ 9443, "myc" ],
-[ 9444, "myd" ],
-[ 9445, "mye" ],
-[ 9446, "myf" ],
-[ 9447, "myg" ],
-[ 9448, "myh" ],
-[ 9449, "myi" ],
-[ 9450, "myj" ],
-[ 9451, "myk" ],
-[ 9452, "myl" ],
-[ 9453, "mym" ],
-[ 9454, "myn" ],
-[ 9455, "myo" ],
-[ 9456, "myp" ],
-[ 9457, "myq" ],
-[ 9458, "myr" ],
-[ 9459, "mys" ],
-[ 9460, "myt" ],
-[ 9461, "myu" ],
-[ 9462, "myv" ],
-[ 9463, "myw" ],
-[ 9464, "myx" ],
-[ 9465, "myy" ],
-[ 9466, "myz" ],
-[ 9467, "mza" ],
-[ 9468, "mzb" ],
-[ 9469, "mzc" ],
-[ 9470, "mzd" ],
-[ 9471, "mze" ],
-[ 9472, "mzf" ],
-[ 9473, "mzg" ],
-[ 9474, "mzh" ],
-[ 9475, "mzi" ],
-[ 9476, "mzj" ],
-[ 9477, "mzk" ],
-[ 9478, "mzl" ],
-[ 9479, "mzm" ],
-[ 9480, "mzn" ],
-[ 9481, "mzo" ],
-[ 9482, "mzp" ],
-[ 9483, "mzq" ],
-[ 9484, "mzr" ],
-[ 9485, "mzs" ],
-[ 9486, "mzt" ],
-[ 9487, "mzu" ],
-[ 9488, "mzv" ],
-[ 9489, "mzw" ],
-[ 9490, "mzx" ],
-[ 9491, "mzy" ],
-[ 9492, "mzz" ],
-[ 9493, "naa" ],
-[ 9494, "nab" ],
-[ 9495, "nac" ],
-[ 9496, "nad" ],
-[ 9497, "nae" ],
-[ 9498, "naf" ],
-[ 9499, "nag" ],
-[ 9500, "nah" ],
-[ 9501, "nai" ],
-[ 9502, "naj" ],
-[ 9503, "nak" ],
-[ 9504, "nal" ],
-[ 9505, "nam" ],
-[ 9506, "nan" ],
-[ 9507, "nao" ],
-[ 9508, "nap" ],
-[ 9509, "naq" ],
-[ 9510, "nar" ],
-[ 9511, "nas" ],
-[ 9512, "nat" ],
-[ 9513, "nau" ],
-[ 9514, "nav" ],
-[ 9515, "naw" ],
-[ 9516, "nax" ],
-[ 9517, "nay" ],
-[ 9518, "naz" ],
-[ 9519, "nba" ],
-[ 9520, "nbb" ],
-[ 9521, "nbc" ],
-[ 9522, "nbd" ],
-[ 9523, "nbe" ],
-[ 9524, "nbf" ],
-[ 9525, "nbg" ],
-[ 9526, "nbh" ],
-[ 9527, "nbi" ],
-[ 9528, "nbj" ],
-[ 9529, "nbk" ],
-[ 9530, "nbl" ],
-[ 9531, "nbm" ],
-[ 9532, "nbn" ],
-[ 9533, "nbo" ],
-[ 9534, "nbp" ],
-[ 9535, "nbq" ],
-[ 9536, "nbr" ],
-[ 9537, "nbs" ],
-[ 9538, "nbt" ],
-[ 9539, "nbu" ],
-[ 9540, "nbv" ],
-[ 9541, "nbw" ],
-[ 9542, "nbx" ],
-[ 9543, "nby" ],
-[ 9544, "nbz" ],
-[ 9545, "nca" ],
-[ 9546, "ncb" ],
-[ 9547, "ncc" ],
-[ 9548, "ncd" ],
-[ 9549, "nce" ],
-[ 9550, "ncf" ],
-[ 9551, "ncg" ],
-[ 9552, "nch" ],
-[ 9553, "nci" ],
-[ 9554, "ncj" ],
-[ 9555, "nck" ],
-[ 9556, "ncl" ],
-[ 9557, "ncm" ],
-[ 9558, "ncn" ],
-[ 9559, "nco" ],
-[ 9560, "ncp" ],
-[ 9561, "ncq" ],
-[ 9562, "ncr" ],
-[ 9563, "ncs" ],
-[ 9564, "nct" ],
-[ 9565, "ncu" ],
-[ 9566, "ncv" ],
-[ 9567, "ncw" ],
-[ 9568, "ncx" ],
-[ 9569, "ncy" ],
-[ 9570, "ncz" ],
-[ 9571, "nda" ],
-[ 9572, "ndb" ],
-[ 9573, "ndc" ],
-[ 9574, "ndd" ],
-[ 9575, "nde" ],
-[ 9576, "ndf" ],
-[ 9577, "ndg" ],
-[ 9578, "ndh" ],
-[ 9579, "ndi" ],
-[ 9580, "ndj" ],
-[ 9581, "ndk" ],
-[ 9582, "ndl" ],
-[ 9583, "ndm" ],
-[ 9584, "ndn" ],
-[ 9585, "ndo" ],
-[ 9586, "ndp" ],
-[ 9587, "ndq" ],
-[ 9588, "ndr" ],
-[ 9589, "nds" ],
-[ 9590, "ndt" ],
-[ 9591, "ndu" ],
-[ 9592, "ndv" ],
-[ 9593, "ndw" ],
-[ 9594, "ndx" ],
-[ 9595, "ndy" ],
-[ 9596, "ndz" ],
-[ 9597, "nea" ],
-[ 9598, "neb" ],
-[ 9599, "nec" ],
-[ 9600, "ned" ],
-[ 9601, "nee" ],
-[ 9602, "nef" ],
-[ 9603, "neg" ],
-[ 9604, "neh" ],
-[ 9605, "nei" ],
-[ 9606, "nej" ],
-[ 9607, "nek" ],
-[ 9608, "nel" ],
-[ 9609, "nem" ],
-[ 9610, "nen" ],
-[ 9611, "neo" ],
-[ 9612, "nep" ],
-[ 9613, "neq" ],
-[ 9614, "ner" ],
-[ 9615, "nes" ],
-[ 9616, "net" ],
-[ 9617, "neu" ],
-[ 9618, "nev" ],
-[ 9619, "new" ],
-[ 9620, "nex" ],
-[ 9621, "ney" ],
-[ 9622, "nez" ],
-[ 9623, "nfa" ],
-[ 9624, "nfb" ],
-[ 9625, "nfc" ],
-[ 9626, "nfd" ],
-[ 9627, "nfe" ],
-[ 9628, "nff" ],
-[ 9629, "nfg" ],
-[ 9630, "nfh" ],
-[ 9631, "nfi" ],
-[ 9632, "nfj" ],
-[ 9633, "nfk" ],
-[ 9634, "nfl" ],
-[ 9635, "nfm" ],
-[ 9636, "nfn" ],
-[ 9637, "nfo" ],
-[ 9638, "nfp" ],
-[ 9639, "nfq" ],
-[ 9640, "nfr" ],
-[ 9641, "nfs" ],
-[ 9642, "nft" ],
-[ 9643, "nfu" ],
-[ 9644, "nfv" ],
-[ 9645, "nfw" ],
-[ 9646, "nfx" ],
-[ 9647, "nfy" ],
-[ 9648, "nfz" ],
-[ 9649, "nga" ],
-[ 9650, "ngb" ],
-[ 9651, "ngc" ],
-[ 9652, "ngd" ],
-[ 9653, "nge" ],
-[ 9654, "ngf" ],
-[ 9655, "ngg" ],
-[ 9656, "ngh" ],
-[ 9657, "ngi" ],
-[ 9658, "ngj" ],
-[ 9659, "ngk" ],
-[ 9660, "ngl" ],
-[ 9661, "ngm" ],
-[ 9662, "ngn" ],
-[ 9663, "ngo" ],
-[ 9664, "ngp" ],
-[ 9665, "ngq" ],
-[ 9666, "ngr" ],
-[ 9667, "ngs" ],
-[ 9668, "ngt" ],
-[ 9669, "ngu" ],
-[ 9670, "ngv" ],
-[ 9671, "ngw" ],
-[ 9672, "ngx" ],
-[ 9673, "ngy" ],
-[ 9674, "ngz" ],
-[ 9675, "nha" ],
-[ 9676, "nhb" ],
-[ 9677, "nhc" ],
-[ 9678, "nhd" ],
-[ 9679, "nhe" ],
-[ 9680, "nhf" ],
-[ 9681, "nhg" ],
-[ 9682, "nhh" ],
-[ 9683, "nhi" ],
-[ 9684, "nhj" ],
-[ 9685, "nhk" ],
-[ 9686, "nhl" ],
-[ 9687, "nhm" ],
-[ 9688, "nhn" ],
-[ 9689, "nho" ],
-[ 9690, "nhp" ],
-[ 9691, "nhq" ],
-[ 9692, "nhr" ],
-[ 9693, "nhs" ],
-[ 9694, "nht" ],
-[ 9695, "nhu" ],
-[ 9696, "nhv" ],
-[ 9697, "nhw" ],
-[ 9698, "nhx" ],
-[ 9699, "nhy" ],
-[ 9700, "nhz" ],
-[ 9701, "nia" ],
-[ 9702, "nib" ],
-[ 9703, "nic" ],
-[ 9704, "nid" ],
-[ 9705, "nie" ],
-[ 9706, "nif" ],
-[ 9707, "nig" ],
-[ 9708, "nih" ],
-[ 9709, "nii" ],
-[ 9710, "nij" ],
-[ 9711, "nik" ],
-[ 9712, "nil" ],
-[ 9713, "nim" ],
-[ 9714, "nin" ],
-[ 9715, "nio" ],
-[ 9716, "nip" ],
-[ 9717, "niq" ],
-[ 9718, "nir" ],
-[ 9719, "nis" ],
-[ 9720, "nit" ],
-[ 9721, "niu" ],
-[ 9722, "niv" ],
-[ 9723, "niw" ],
-[ 9724, "nix" ],
-[ 9725, "niy" ],
-[ 9726, "niz" ],
-[ 9727, "nja" ],
-[ 9728, "njb" ],
-[ 9729, "njc" ],
-[ 9730, "njd" ],
-[ 9731, "nje" ],
-[ 9732, "njf" ],
-[ 9733, "njg" ],
-[ 9734, "njh" ],
-[ 9735, "nji" ],
-[ 9736, "njj" ],
-[ 9737, "njk" ],
-[ 9738, "njl" ],
-[ 9739, "njm" ],
-[ 9740, "njn" ],
-[ 9741, "njo" ],
-[ 9742, "njp" ],
-[ 9743, "njq" ],
-[ 9744, "njr" ],
-[ 9745, "njs" ],
-[ 9746, "njt" ],
-[ 9747, "nju" ],
-[ 9748, "njv" ],
-[ 9749, "njw" ],
-[ 9750, "njx" ],
-[ 9751, "njy" ],
-[ 9752, "njz" ],
-[ 9753, "nka" ],
-[ 9754, "nkb" ],
-[ 9755, "nkc" ],
-[ 9756, "nkd" ],
-[ 9757, "nke" ],
-[ 9758, "nkf" ],
-[ 9759, "nkg" ],
-[ 9760, "nkh" ],
-[ 9761, "nki" ],
-[ 9762, "nkj" ],
-[ 9763, "nkk" ],
-[ 9764, "nkl" ],
-[ 9765, "nkm" ],
-[ 9766, "nkn" ],
-[ 9767, "nko" ],
-[ 9768, "nkp" ],
-[ 9769, "nkq" ],
-[ 9770, "nkr" ],
-[ 9771, "nks" ],
-[ 9772, "nkt" ],
-[ 9773, "nku" ],
-[ 9774, "nkv" ],
-[ 9775, "nkw" ],
-[ 9776, "nkx" ],
-[ 9777, "nky" ],
-[ 9778, "nkz" ],
-[ 9779, "nla" ],
-[ 9780, "nlb" ],
-[ 9781, "nlc" ],
-[ 9782, "nld" ],
-[ 9783, "nle" ],
-[ 9784, "nlf" ],
-[ 9785, "nlg" ],
-[ 9786, "nlh" ],
-[ 9787, "nli" ],
-[ 9788, "nlj" ],
-[ 9789, "nlk" ],
-[ 9790, "nll" ],
-[ 9791, "nlm" ],
-[ 9792, "nln" ],
-[ 9793, "nlo" ],
-[ 9794, "nlp" ],
-[ 9795, "nlq" ],
-[ 9796, "nlr" ],
-[ 9797, "nls" ],
-[ 9798, "nlt" ],
-[ 9799, "nlu" ],
-[ 9800, "nlv" ],
-[ 9801, "nlw" ],
-[ 9802, "nlx" ],
-[ 9803, "nly" ],
-[ 9804, "nlz" ],
-[ 9805, "nma" ],
-[ 9806, "nmb" ],
-[ 9807, "nmc" ],
-[ 9808, "nmd" ],
-[ 9809, "nme" ],
-[ 9810, "nmf" ],
-[ 9811, "nmg" ],
-[ 9812, "nmh" ],
-[ 9813, "nmi" ],
-[ 9814, "nmj" ],
-[ 9815, "nmk" ],
-[ 9816, "nml" ],
-[ 9817, "nmm" ],
-[ 9818, "nmn" ],
-[ 9819, "nmo" ],
-[ 9820, "nmp" ],
-[ 9821, "nmq" ],
-[ 9822, "nmr" ],
-[ 9823, "nms" ],
-[ 9824, "nmt" ],
-[ 9825, "nmu" ],
-[ 9826, "nmv" ],
-[ 9827, "nmw" ],
-[ 9828, "nmx" ],
-[ 9829, "nmy" ],
-[ 9830, "nmz" ],
-[ 9831, "nna" ],
-[ 9832, "nnb" ],
-[ 9833, "nnc" ],
-[ 9834, "nnd" ],
-[ 9835, "nne" ],
-[ 9836, "nnf" ],
-[ 9837, "nng" ],
-[ 9838, "nnh" ],
-[ 9839, "nni" ],
-[ 9840, "nnj" ],
-[ 9841, "nnk" ],
-[ 9842, "nnl" ],
-[ 9843, "nnm" ],
-[ 9844, "nnn" ],
-[ 9845, "nno" ],
-[ 9846, "nnp" ],
-[ 9847, "nnq" ],
-[ 9848, "nnr" ],
-[ 9849, "nns" ],
-[ 9850, "nnt" ],
-[ 9851, "nnu" ],
-[ 9852, "nnv" ],
-[ 9853, "nnw" ],
-[ 9854, "nnx" ],
-[ 9855, "nny" ],
-[ 9856, "nnz" ],
-[ 9857, "noa" ],
-[ 9858, "nob" ],
-[ 9859, "noc" ],
-[ 9860, "nod" ],
-[ 9861, "noe" ],
-[ 9862, "nof" ],
-[ 9863, "nog" ],
-[ 9864, "noh" ],
-[ 9865, "noi" ],
-[ 9866, "noj" ],
-[ 9867, "nok" ],
-[ 9868, "nol" ],
-[ 9869, "nom" ],
-[ 9870, "non" ],
-[ 9871, "noo" ],
-[ 9872, "nop" ],
-[ 9873, "noq" ],
-[ 9874, "nor" ],
-[ 9875, "nos" ],
-[ 9876, "not" ],
-[ 9877, "nou" ],
-[ 9878, "nov" ],
-[ 9879, "now" ],
-[ 9880, "nox" ],
-[ 9881, "noy" ],
-[ 9882, "noz" ],
-[ 9883, "npa" ],
-[ 9884, "npb" ],
-[ 9885, "npc" ],
-[ 9886, "npd" ],
-[ 9887, "npe" ],
-[ 9888, "npf" ],
-[ 9889, "npg" ],
-[ 9890, "nph" ],
-[ 9891, "npi" ],
-[ 9892, "npj" ],
-[ 9893, "npk" ],
-[ 9894, "npl" ],
-[ 9895, "npm" ],
-[ 9896, "npn" ],
-[ 9897, "npo" ],
-[ 9898, "npp" ],
-[ 9899, "npq" ],
-[ 9900, "npr" ],
-[ 9901, "nps" ],
-[ 9902, "npt" ],
-[ 9903, "npu" ],
-[ 9904, "npv" ],
-[ 9905, "npw" ],
-[ 9906, "npx" ],
-[ 9907, "npy" ],
-[ 9908, "npz" ],
-[ 9909, "nqa" ],
-[ 9910, "nqb" ],
-[ 9911, "nqc" ],
-[ 9912, "nqd" ],
-[ 9913, "nqe" ],
-[ 9914, "nqf" ],
-[ 9915, "nqg" ],
-[ 9916, "nqh" ],
-[ 9917, "nqi" ],
-[ 9918, "nqj" ],
-[ 9919, "nqk" ],
-[ 9920, "nql" ],
-[ 9921, "nqm" ],
-[ 9922, "nqn" ],
-[ 9923, "nqo" ],
-[ 9924, "nqp" ],
-[ 9925, "nqq" ],
-[ 9926, "nqr" ],
-[ 9927, "nqs" ],
-[ 9928, "nqt" ],
-[ 9929, "nqu" ],
-[ 9930, "nqv" ],
-[ 9931, "nqw" ],
-[ 9932, "nqx" ],
-[ 9933, "nqy" ],
-[ 9934, "nqz" ],
-[ 9935, "nra" ],
-[ 9936, "nrb" ],
-[ 9937, "nrc" ],
-[ 9938, "nrd" ],
-[ 9939, "nre" ],
-[ 9940, "nrf" ],
-[ 9941, "nrg" ],
-[ 9942, "nrh" ],
-[ 9943, "nri" ],
-[ 9944, "nrj" ],
-[ 9945, "nrk" ],
-[ 9946, "nrl" ],
-[ 9947, "nrm" ],
-[ 9948, "nrn" ],
-[ 9949, "nro" ],
-[ 9950, "nrp" ],
-[ 9951, "nrq" ],
-[ 9952, "nrr" ],
-[ 9953, "nrs" ],
-[ 9954, "nrt" ],
-[ 9955, "nru" ],
-[ 9956, "nrv" ],
-[ 9957, "nrw" ],
-[ 9958, "nrx" ],
-[ 9959, "nry" ],
-[ 9960, "nrz" ],
-[ 9961, "nsa" ],
-[ 9962, "nsb" ],
-[ 9963, "nsc" ],
-[ 9964, "nsd" ],
-[ 9965, "nse" ],
-[ 9966, "nsf" ],
-[ 9967, "nsg" ],
-[ 9968, "nsh" ],
-[ 9969, "nsi" ],
-[ 9970, "nsj" ],
-[ 9971, "nsk" ],
-[ 9972, "nsl" ],
-[ 9973, "nsm" ],
-[ 9974, "nsn" ],
-[ 9975, "nso" ],
-[ 9976, "nsp" ],
-[ 9977, "nsq" ],
-[ 9978, "nsr" ],
-[ 9979, "nss" ],
-[ 9980, "nst" ],
-[ 9981, "nsu" ],
-[ 9982, "nsv" ],
-[ 9983, "nsw" ],
-[ 9984, "nsx" ],
-[ 9985, "nsy" ],
-[ 9986, "nsz" ],
-[ 9987, "nta" ],
-[ 9988, "ntb" ],
-[ 9989, "ntc" ],
-[ 9990, "ntd" ],
-[ 9991, "nte" ],
-[ 9992, "ntf" ],
-[ 9993, "ntg" ],
-[ 9994, "nth" ],
-[ 9995, "nti" ],
-[ 9996, "ntj" ],
-[ 9997, "ntk" ],
-[ 9998, "ntl" ],
-[ 9999, "ntm" ],
-[ 10000, "ntn" ],
-    ]);
 
+# The map below generates stuff like:
+#   [ qw/artistid name/ ],
+#   [ 4, "b" ],
+#   [ 5, "c" ],
+#   ...
+#   [ 9999, "ntm" ],
+#   [ 10000, "ntn" ],
 
+my $start_id = 'populateXaaaaaa';
+my $rows = 10;
+my $offset = 3;
+
+$schema->populate('Artist', [ [ qw/artistid name/ ], map { [ ($_ + $offset) => $start_id++ ] } ( 1 .. $rows ) ] );
+is (
+    $schema->resultset ('Artist')->search ({ name => { -like => 'populateX%' } })->count,
+    $rows,
+    'populate created correct number of rows with massive AoA bulk insert',
+);
+
+my $artist = $schema->resultset ('Artist')
+              ->search ({ 'cds.title' => { '!=', undef } }, { join => 'cds' })
+                ->first;
+my $ex_title = $artist->cds->first->title;
+
+throws_ok ( sub {
+  my $i = 600;
+  $schema->populate('CD', [
+    map {
+      {
+        artist => $artist->id,
+        title => $_,
+        year => 2009,
+      }
+    } ('Huey', 'Dewey', $ex_title, 'Louie')
+  ])
+}, qr/columns .+ are not unique for populate slice.+$ex_title/ms, 'Readable exception thrown for failed populate');
+
 ## make sure populate honors fields/orders in list context
 ## schema order
 my @links = $schema->populate('Link', [


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/100populate.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/101populate_rs.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/102load_classes.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/103many_to_many_warning.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/103many_to_many_warning.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/103many_to_many_warning.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -5,42 +5,38 @@
 use lib qw(t/lib);
 use Data::Dumper;
 
-plan ( ($] >= 5.009000 and $] < 5.010001)
-  ? (skip_all => 'warnings::register broken under 5.10: http://rt.perl.org/rt3/Public/Bug/Display.html?id=62522')
-  : (tests => 4)
-);
+plan tests => 4;
+my $exp_warn = qr/The many-to-many relationship 'bars' is trying to create/;
 
 {
   my @w; 
-  local $SIG{__WARN__} = sub { push @w, @_ };
+  local $SIG{__WARN__} = sub { $_[0] =~ $exp_warn ? push @w, $_[0] : warn $_[0] };
   my $code = gen_code ( suffix => 1 );
   eval "$code";
   ok (! $@, 'Eval code without warnings suppression')
     || diag $@;
 
-  ok ( (grep { $_ =~ /The many-to-many relationship bars is trying to create/ } @w), "Warning triggered without relevant 'no warnings'");
+  ok (@w, "Warning triggered without DBIC_OVERWRITE_HELPER_METHODS_OK");
 }
 
 {
   my @w; 
-  local $SIG{__WARN__} = sub { push @w, @_ };
+  local $SIG{__WARN__} = sub { $_[0] =~ $exp_warn ? push @w, $_[0] : warn $_[0] };
 
-  my $code = gen_code ( suffix => 2, no_warn => 1 );
+  my $code = gen_code ( suffix => 2 );
+
+  local $ENV{DBIC_OVERWRITE_HELPER_METHODS_OK} = 1;
   eval "$code";
   ok (! $@, 'Eval code with warnings suppression')
     || diag $@;
 
-  ok ( (not grep { $_ =~ /The many-to-many relationship bars is trying to create/ } @w), "No warning triggered with relevant 'no warnings'");
+  ok (! @w, "No warning triggered with DBIC_OVERWRITE_HELPER_METHODS_OK");
 }
 
 sub gen_code {
 
   my $args = { @_ };
   my $suffix = $args->{suffix};
-  my $no_warn = ( $args->{no_warn}
-    ? "no warnings 'DBIx::Class::Relationship::ManyToMany';"
-    : '',
-  );
 
   return <<EOF;
 use strict;
@@ -95,7 +91,6 @@
     },
   );
 
-  ${no_warn}
   __PACKAGE__->set_primary_key('barid');
   __PACKAGE__->has_many('foo_to_bar' => 'DBICTest::Schema::FooToBar${suffix}' => 'foo');
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/103many_to_many_warning.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/104view.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/18inserterror.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/19quotes.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/19quotes.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/19quotes.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -19,12 +19,12 @@
 use_ok('DBIC::DebugObj');
 my $schema = DBICTest->init_schema();
 
-diag('Testing against ' . join(' ', map { $schema->storage->dbh->get_info($_) } qw/17 18/));
+#diag('Testing against ' . join(' ', map { $schema->storage->dbh->get_info($_) } qw/17 18/));
 
 $schema->storage->sql_maker->quote_char('`');
 $schema->storage->sql_maker->name_sep('.');
 
-my ($sql, @bind) = ('');
+my ($sql, @bind);
 $schema->storage->debugobj(DBIC::DebugObj->new(\$sql, \@bind));
 $schema->storage->debug(1);
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/19quotes.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/19quotes_newstyle.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/19quotes_newstyle.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/19quotes_newstyle.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -19,7 +19,7 @@
 
 my $schema = DBICTest->init_schema();
 
-diag('Testing against ' . join(' ', map { $schema->storage->dbh->get_info($_) } qw/17 18/));
+#diag('Testing against ' . join(' ', map { $schema->storage->dbh->get_info($_) } qw/17 18/));
 
 my $dsn = $schema->storage->_dbi_connect_info->[0];
 $schema->connection(
@@ -30,7 +30,7 @@
   { quote_char => '`', name_sep => '.' },
 );
 
-my ($sql, @bind) = ('');
+my ($sql, @bind);
 $schema->storage->debugobj(DBIC::DebugObj->new(\$sql, \@bind)),
 $schema->storage->debug(1);
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/19quotes_newstyle.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/20setuperrors.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/26dumper.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/30dbicplain.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/31stats.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/32connect_code_ref.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/33storage_reconnect.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/33storage_reconnect.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/33storage_reconnect.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -21,12 +21,11 @@
 
 # Disconnect the dbh, and be sneaky about it
 # Also test if DBD::SQLite finaly knows how to ->disconnect properly
-TODO: {
-    local $TODO = 'SQLite is evil/braindead. Once this test starts passing, remove the related atrocity from DBIx::Class::Storage::DBI::SQLite';
-    my $w;
-    local $SIG{__WARN__} = sub { $w = shift };
-    $schema->storage->_dbh->disconnect;
-    ok ($w !~ /active statement handles/, 'SQLite can disconnect properly \o/');
+{
+  my $w;
+  local $SIG{__WARN__} = sub { $w = shift };
+  $schema->storage->_dbh->disconnect;
+  ok ($w !~ /active statement handles/, 'SQLite can disconnect properly');
 }
 
 # Try the operation again - What should happen here is:


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/33storage_reconnect.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/34exception_action.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/35disable_sth_caching.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/36datetime.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_1.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_1.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_1.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -4,7 +4,8 @@
 use warnings;
 use Test::More;
 
-unshift(@INC, './t/lib');
+use lib qw(t/lib);
+use DBICTest; # do not remove even though it is not used
 
 plan tests => 8;
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_1.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_2.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_2.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_2.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -4,7 +4,8 @@
 use warnings;
 use Test::More;
 
-unshift(@INC, './t/lib');
+use lib qw(t/lib);
+use DBICTest; # do not remove even though it is not used
 
 plan tests => 6;
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_2.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_3.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_3.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_3.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -4,7 +4,8 @@
 use warnings;
 use Test::More;
 
-unshift(@INC, './t/lib');
+use lib qw(t/lib);
+use DBICTest; # do not remove even though it is not used
 
 plan tests => 7;
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_3.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_4.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_4.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_4.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -4,7 +4,8 @@
 use warnings;
 use Test::More;
 
-unshift(@INC, './t/lib');
+use lib qw(t/lib);
+use DBICTest; # do not remove even though it is not used
 
 plan tests => 6;
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_4.t
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_exception.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_2.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_exception.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_exception.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,21 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More;
+
+use lib qw(t/lib);
+use DBICTest; # do not remove even though it is not used
+
+plan tests => 1;
+
+eval {
+    package DBICNSTest;
+    use base qw/DBIx::Class::Schema/;
+    __PACKAGE__->load_namespaces(
+        result_namespace => 'Bogus',
+        resultset_namespace => 'RSet',
+    );
+};
+
+like ($@, qr/are you sure this is a real Result Class/, 'Clear exception thrown');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_exception.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_rt41083.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_rt41083.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_rt41083.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,41 +2,66 @@
 
 use strict;
 use warnings;
-use Test::More;
 
 use lib 't/lib';
+use DBICTest; # do not remove even though it is not used 
+use Test::More tests => 8;
 
-plan tests => 4;
-
 sub _chk_warning {
-	defined $_[0]? 
-		$_[0] !~ qr/We found ResultSet class '([^']+)' for '([^']+)', but it seems that you had already set '([^']+)' to use '([^']+)' instead/ :
-		1
+  defined $_[0]?
+    $_[0] !~ qr/We found ResultSet class '([^']+)' for '([^']+)', but it seems that you had already set '([^']+)' to use '([^']+)' instead/ :
+    1
 }
 
-my $warnings;
-eval {
+sub _chk_extra_sources_warning {
+  my $p = qr/already has a source, use register_extra_source for additional sources/;
+  defined $_[0]? $_[0] !~ /$p/ : 1;
+}
+
+sub _verify_sources {
+  my @monikers = @_;
+  is_deeply (
+    [ sort DBICNSTest::RtBug41083->sources ],
+    \@monikers,
+    'List of resultsource registrations',
+  );
+}
+
+{
+  my $warnings;
+  eval {
     local $SIG{__WARN__} = sub { $warnings .= shift };
     package DBICNSTest::RtBug41083;
     use base 'DBIx::Class::Schema';
     __PACKAGE__->load_namespaces(
-	result_namespace => 'Schema_A',
-	resultset_namespace => 'ResultSet_A',
-	default_resultset_class => 'ResultSet'
+      result_namespace => 'Schema_A',
+      resultset_namespace => 'ResultSet_A',
+      default_resultset_class => 'ResultSet'
     );
-};
-ok(!$@) or diag $@;
-ok(_chk_warning($warnings), 'expected no complaint');
+  };
 
-eval {
+  ok(!$@) or diag $@;
+  ok(_chk_warning($warnings), 'expected no resultset complaint');
+  ok(_chk_extra_sources_warning($warnings), 'expected no extra sources complaint') or diag($warnings);
+
+  _verify_sources (qw/A A::Sub/);
+}
+
+{
+  my $warnings;
+  eval {
     local $SIG{__WARN__} = sub { $warnings .= shift };
     package DBICNSTest::RtBug41083;
     use base 'DBIx::Class::Schema';
     __PACKAGE__->load_namespaces(
-	result_namespace => 'Schema',
-	resultset_namespace => 'ResultSet',
-	default_resultset_class => 'ResultSet'
+      result_namespace => 'Schema',
+      resultset_namespace => 'ResultSet',
+      default_resultset_class => 'ResultSet'
     );
-};
-ok(!$@) or diag $@;
-ok(_chk_warning($warnings), 'expected no complaint') or diag $warnings;
+  };
+  ok(!$@) or diag $@;
+  ok(_chk_warning($warnings), 'expected no resultset complaint') or diag $warnings;
+  ok(_chk_extra_sources_warning($warnings), 'expected no extra sources complaint') or diag($warnings);
+
+  _verify_sources (qw/A A::Sub Foo Foo::Sub/);
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/39load_namespaces_rt41083.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/40resultsetmanager.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/41orrible.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/41orrible.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/41orrible.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,14 +2,15 @@
 use warnings;
 
 use Test::More;
-use DBIx::Class::Storage::DBI::Oracle::WhereJoins;
+use DBIx::Class::SQLAHacks::OracleJoins;
 
 use lib qw(t/lib);
+use DBICTest; # do not remove even though it is not used
 use DBIC::SqlMakerTest;
 
 plan tests => 4;
 
-my $sa = new DBIC::SQL::Abstract::Oracle;
+my $sa = new DBIx::Class::SQLAHacks::OracleJoins;
 
 $sa->limit_dialect('RowNum');
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/41orrible.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/42toplimit.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/42toplimit.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/42toplimit.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,26 +1,138 @@
-use strict;
-use warnings;
-
-use Test::More;
-use DBIx::Class::Storage::DBI;
-
-plan tests => 1;
-
-my $sa = new DBIC::SQL::Abstract;
-
-$sa->limit_dialect( 'Top' );
-
-is(
-    $sa->select( 'rubbish', [ 'foo.id', 'bar.id' ], undef, { order_by => 'artistid' }, 1, 3 ),
-    'SELECT * FROM
-(
-    SELECT TOP 1 * FROM
-    (
-        SELECT TOP 4  foo.id, bar.id FROM rubbish ORDER BY artistid ASC
-    ) AS foo
-    ORDER BY artistid DESC
-) AS bar
-ORDER BY artistid ASC
-',
-    "make sure limit_dialect( 'Top' ) is working okay"
-);
+use strict;
+use warnings;
+
+use Test::More;
+use lib qw(t/lib);
+use DBICTest;
+use DBIC::SqlMakerTest;
+
+my $schema = DBICTest->init_schema;
+
+# Trick the sqlite DB to use Top limit emulation
+# We could test all of this via $sq->$op directly,
+# but some conditions needs a $rsrc
+delete $schema->storage->_sql_maker->{_cached_syntax};
+$schema->storage->_sql_maker->limit_dialect ('Top');
+
+my $rs = $schema->resultset ('FourKeys')->search ({}, { rows => 1, offset => 3 });
+
+sub test_order {
+  my $args = shift;
+
+  my $req_order = $args->{order_req}
+    ? "ORDER BY $args->{order_req}"
+    : ''
+  ;
+
+  is_same_sql_bind(
+    $rs->search ({}, {order_by => $args->{order_by}})->as_query,
+    "(
+      SELECT * FROM (
+        SELECT TOP 1 * FROM (
+          SELECT TOP 4 me.foo, me.bar, me.hello, me.goodbye, me.sensors, me.read_count FROM fourkeys me ORDER BY $args->{order_inner}
+        ) foo ORDER BY $args->{order_outer}
+      ) bar
+      $req_order
+    )",
+    [],
+  );
+}
+
+my @tests = (
+  {
+    order_by => \ 'foo DESC',
+    order_req => 'foo DESC',
+    order_inner => 'foo DESC',
+    order_outer => 'foo ASC' 
+  },
+  {
+    order_by => { -asc => 'foo'  },
+    order_req => 'foo ASC',
+    order_inner => 'foo ASC',
+    order_outer => 'foo DESC',
+  },
+  {
+    order_by => 'foo',
+    order_req => 'foo',
+    order_inner => 'foo ASC',
+    order_outer => 'foo DESC',
+  },
+  {
+    order_by => [ qw{ foo bar}   ],
+    order_req => 'foo, bar',
+    order_inner => 'foo ASC,bar ASC',
+    order_outer => 'foo DESC, bar DESC',
+  },
+  {
+    order_by => { -desc => 'foo' },
+    order_req => 'foo DESC',
+    order_inner => 'foo DESC',
+    order_outer => 'foo ASC',
+  },
+  {
+    order_by => ['foo', { -desc => 'bar' } ],
+    order_req => 'foo, bar DESC',
+    order_inner => 'foo ASC, bar DESC',
+    order_outer => 'foo DESC, bar ASC',
+  },
+  {
+    order_by => { -asc => [qw{ foo bar }] },
+    order_req => 'foo ASC, bar ASC',
+    order_inner => 'foo ASC, bar ASC',
+    order_outer => 'foo DESC, bar DESC',
+  },
+  {
+    order_by => [
+      { -asc => 'foo' },
+      { -desc => [qw{bar}] },
+      { -asc  => [qw{hello sensors}]},
+    ],
+    order_req => 'foo ASC, bar DESC, hello ASC, sensors ASC',
+    order_inner => 'foo ASC, bar DESC, hello ASC, sensors ASC',
+    order_outer => 'foo DESC, bar ASC, hello DESC, sensors DESC',
+  },
+  {
+    order_by => undef,
+    order_req => undef,
+    order_inner => 'foo ASC, bar ASC, hello ASC, goodbye ASC',
+    order_outer => 'foo DESC, bar DESC, hello DESC, goodbye DESC',
+  },
+  {
+    order_by => '',
+    order_req => undef,
+    order_inner => 'foo ASC, bar ASC, hello ASC, goodbye ASC',
+    order_outer => 'foo DESC, bar DESC, hello DESC, goodbye DESC',
+  },
+  {
+    order_by => {},
+    order_req => undef,
+    order_inner => 'foo ASC, bar ASC, hello ASC, goodbye ASC',
+    order_outer => 'foo DESC, bar DESC, hello DESC, goodbye DESC',
+  },
+  {
+    order_by => [],
+    order_req => undef,
+    order_inner => 'foo ASC, bar ASC, hello ASC, goodbye ASC',
+    order_outer => 'foo DESC, bar DESC, hello DESC, goodbye DESC',
+  },
+);
+
+plan (tests => scalar @tests + 1);
+
+test_order ($_) for @tests;
+
+is_same_sql_bind (
+  $rs->search ({}, { group_by => 'bar', order_by => 'bar' })->as_query,
+  '(
+    SELECT * FROM
+    (
+      SELECT TOP 1 * FROM
+      (
+        SELECT TOP 4  me.foo, me.bar, me.hello, me.goodbye, me.sensors, me.read_count FROM fourkeys me GROUP BY bar ORDER BY bar ASC
+      ) AS foo
+      ORDER BY bar DESC
+    ) AS bar
+    ORDER BY bar
+  )',
+  [],
+);


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/42toplimit.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/46where_attribute.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/46where_attribute.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/46where_attribute.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,74 +1,74 @@
-use strict;
-use warnings;
-
-use Test::More;
-use Data::Dumper;
-use lib qw(t/lib);
-use DBICTest;
-my $schema = DBICTest->init_schema();
-
-plan tests => 16;
-
-# select from a class with resultset_attributes
-my $resultset = $schema->resultset('BooksInLibrary');
-is($resultset, 3, "select from a class with resultset_attributes okay");
-
-# now test out selects through a resultset
-my $owner = $schema->resultset('Owners')->find({name => "Newton"});
-my $programming_perl = $owner->books->find_or_create({ title => "Programming Perl" });
-is($programming_perl->id, 1, 'select from a resultset with find_or_create for existing entry ok');
-
-# and inserts?
-my $see_spot;
-$see_spot = eval { $owner->books->find_or_create({ title => "See Spot Run" }) };
-if ($@) { print $@ }
-ok(!$@, 'find_or_create on resultset with attribute for non-existent entry did not throw');
-ok(defined $see_spot, 'successfully did insert on resultset with attribute for non-existent entry');
-
-my $see_spot_rs = $owner->books->search({ title => "See Spot Run" });
-eval { $see_spot_rs->delete(); };
-if ($@) { print $@ }
-ok(!$@, 'delete on resultset with attribute did not throw');
-is($see_spot_rs->count(), 0, 'delete on resultset with attributes succeeded');
-
-# many_to_many tests
-my $collection = $schema->resultset('Collection')->search({collectionid => 1});
-my $pointy_objects = $collection->search_related('collection_object')->search_related('object', { type => "pointy"});
-my $pointy_count = $pointy_objects->count();
-is($pointy_count, 2, 'many_to_many explicit query through linking table with query starting from resultset count correct');
-
-$collection = $schema->resultset('Collection')->find(1);
-$pointy_objects = $collection->search_related('collection_object')->search_related('object', { type => "pointy"});
-$pointy_count = $pointy_objects->count();
-is($pointy_count, 2, 'many_to_many explicit query through linking table with query starting from row count correct');
-
-# use where on many_to_many query
-$collection = $schema->resultset('Collection')->find(1);
-$pointy_objects = $collection->search_related('collection_object')->search_related('object', {}, { where => { 'object.type' => 'pointy' } });
-is($pointy_objects->count(), 2, 'many_to_many explicit query through linking table with where starting from row count correct');
-
-$collection = $schema->resultset('Collection')->find(1);
-$pointy_objects = $collection->pointy_objects();
-$pointy_count = $pointy_objects->count();
-is($pointy_count, 2, 'many_to_many resultset with where in resultset attrs count correct');
-
-# add_to_$rel on many_to_many with where containing a required field
-eval {$collection->add_to_pointy_objects({ value => "Nail" }) };
-if ($@) { print $@ }
-ok( !$@, 'many_to_many add_to_$rel($hash) with where in relationship attrs did not throw');
-is($pointy_objects->count, $pointy_count+1, 'many_to_many add_to_$rel($hash) with where in relationship attrs count correct');
-$pointy_count = $pointy_objects->count();
-
-my $pen = $schema->resultset('TypedObject')->create({ value => "Pen", type => "pointy"});
-eval {$collection->add_to_pointy_objects($pen)};
-if ($@) { print $@ }
-ok( !$@, 'many_to_many add_to_$rel($object) with where in relationship attrs did not throw');
-is($pointy_objects->count, $pointy_count+1, 'many_to_many add_to_$rel($object) with where in relationship attrs count correct');
-$pointy_count = $pointy_objects->count();
-
-my $round_objects = $collection->round_objects();
-my $round_count = $round_objects->count();
-eval {$collection->add_to_objects({ value => "Wheel", type => "round" })};
-if ($@) { print $@ }
-ok( !$@, 'many_to_many add_to_$rel($hash) did not throw');
-is($round_objects->count, $round_count+1, 'many_to_many add_to_$rel($hash) count correct');
+use strict;
+use warnings;
+
+use Test::More;
+use Data::Dumper;
+use lib qw(t/lib);
+use DBICTest;
+my $schema = DBICTest->init_schema();
+
+plan tests => 16;
+
+# select from a class with resultset_attributes
+my $resultset = $schema->resultset('BooksInLibrary');
+is($resultset, 3, "select from a class with resultset_attributes okay");
+
+# now test out selects through a resultset
+my $owner = $schema->resultset('Owners')->find({name => "Newton"});
+my $programming_perl = $owner->books->find_or_create({ title => "Programming Perl" });
+is($programming_perl->id, 1, 'select from a resultset with find_or_create for existing entry ok');
+
+# and inserts?
+my $see_spot;
+$see_spot = eval { $owner->books->find_or_create({ title => "See Spot Run" }) };
+if ($@) { print $@ }
+ok(!$@, 'find_or_create on resultset with attribute for non-existent entry did not throw');
+ok(defined $see_spot, 'successfully did insert on resultset with attribute for non-existent entry');
+
+my $see_spot_rs = $owner->books->search({ title => "See Spot Run" });
+eval { $see_spot_rs->delete(); };
+if ($@) { print $@ }
+ok(!$@, 'delete on resultset with attribute did not throw');
+is($see_spot_rs->count(), 0, 'delete on resultset with attributes succeeded');
+
+# many_to_many tests
+my $collection = $schema->resultset('Collection')->search({collectionid => 1});
+my $pointy_objects = $collection->search_related('collection_object')->search_related('object', { type => "pointy"});
+my $pointy_count = $pointy_objects->count();
+is($pointy_count, 2, 'many_to_many explicit query through linking table with query starting from resultset count correct');
+
+$collection = $schema->resultset('Collection')->find(1);
+$pointy_objects = $collection->search_related('collection_object')->search_related('object', { type => "pointy"});
+$pointy_count = $pointy_objects->count();
+is($pointy_count, 2, 'many_to_many explicit query through linking table with query starting from row count correct');
+
+# use where on many_to_many query
+$collection = $schema->resultset('Collection')->find(1);
+$pointy_objects = $collection->search_related('collection_object')->search_related('object', {}, { where => { 'object.type' => 'pointy' } });
+is($pointy_objects->count(), 2, 'many_to_many explicit query through linking table with where starting from row count correct');
+
+$collection = $schema->resultset('Collection')->find(1);
+$pointy_objects = $collection->pointy_objects();
+$pointy_count = $pointy_objects->count();
+is($pointy_count, 2, 'many_to_many resultset with where in resultset attrs count correct');
+
+# add_to_$rel on many_to_many with where containing a required field
+eval {$collection->add_to_pointy_objects({ value => "Nail" }) };
+if ($@) { print $@ }
+ok( !$@, 'many_to_many add_to_$rel($hash) with where in relationship attrs did not throw');
+is($pointy_objects->count, $pointy_count+1, 'many_to_many add_to_$rel($hash) with where in relationship attrs count correct');
+$pointy_count = $pointy_objects->count();
+
+my $pen = $schema->resultset('TypedObject')->create({ value => "Pen", type => "pointy"});
+eval {$collection->add_to_pointy_objects($pen)};
+if ($@) { print $@ }
+ok( !$@, 'many_to_many add_to_$rel($object) with where in relationship attrs did not throw');
+is($pointy_objects->count, $pointy_count+1, 'many_to_many add_to_$rel($object) with where in relationship attrs count correct');
+$pointy_count = $pointy_objects->count();
+
+my $round_objects = $collection->round_objects();
+my $round_count = $round_objects->count();
+eval {$collection->add_to_objects({ value => "Wheel", type => "round" })};
+if ($@) { print $@ }
+ok( !$@, 'many_to_many add_to_$rel($hash) did not throw');
+is($round_objects->count, $round_count+1, 'many_to_many add_to_$rel($hash) count correct');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/46where_attribute.t
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: DBIx-Class/0.08/branches/sybase_noquote/t/47bind_attribute.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/47bind_attribute.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/47bind_attribute.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,86 +0,0 @@
-use strict;
-use warnings;
-
-use Test::More;
-use lib qw(t/lib);
-use DBICTest;
-
-my $schema = DBICTest->init_schema;
-
-BEGIN {
-    eval "use DBD::SQLite";
-    plan $@
-        ? ( skip_all => 'needs DBD::SQLite for testing' )
-        : ( tests => 7 );
-}
-
-### $schema->storage->debug(1);
-
-my $where_bind = {
-    where => \'name like ?',
-    bind  => [ 'Cat%' ],
-};
-
-my $rs;
-
-TODO: {
-    local $TODO = 'bind args order needs fixing (semifor)';
-
-    # First, the simple cases...
-    $rs = $schema->resultset('Artist')->search(
-            { artistid => 1 },
-            $where_bind,
-    );
-
-    is ( $rs->count, 1, 'where/bind combined' );
-
-    $rs= $schema->resultset('Artist')->search({}, $where_bind)
-        ->search({ artistid => 1});
-
-    is ( $rs->count, 1, 'where/bind first' );
-            
-    $rs = $schema->resultset('Artist')->search({ artistid => 1})
-        ->search({}, $where_bind);
-
-    is ( $rs->count, 1, 'where/bind last' );
-}
-
-# More complex cases, based primarily on the Cookbook
-# "Arbitrary SQL through a custom ResultSource" technique,
-# which seems to be the only place the bind attribute is
-# documented.  Breaking this technique probably breaks existing
-# application code.
-my $source = DBICTest::Artist->result_source_instance;
-my $new_source = $source->new($source);
-$new_source->source_name('Complex');
-
-$new_source->name(\<<'');
-( select a.*, cd.cdid as cdid, cd.title as title, cd.year as year 
-  from artist a
-  join cd on cd.artist=a.artistid
-  where cd.year=?)
-
-$schema->register_extra_source('Complex' => $new_source);
-
-$rs = $schema->resultset('Complex')->search({}, { bind => [ 1999 ] });
-is ( $rs->count, 1, 'cookbook arbitrary sql example' );
-
-$rs = $schema->resultset('Complex')->search({ 'artistid' => 1 }, { bind => [ 1999 ] });
-is ( $rs->count, 1, '...coobook + search condition' );
-
-$rs = $schema->resultset('Complex')->search({}, { bind => [ 1999 ] })
-    ->search({ 'artistid' => 1 });
-is ( $rs->count, 1, '...cookbook (bind first) + chained search' );
-
-TODO: {
-    # not sure what causes an uninit warning here, please remove when the TODO starts to pass,
-    # so the real reason for the warning can be found and fixed
-    local $SIG{__WARN__} = sub { warn @_ unless $_[0] =~ /uninitialized/ };
-
-    local $TODO = 'bind args order needs fixing (semifor)';
-    $rs = $schema->resultset('Complex')->search({}, { bind => [ 1999 ] })
-        ->search({ 'artistid' => 1 }, {
-            where => \'title like ?',
-            bind => [ 'Spoon%' ] });
-    is ( $rs->count, 1, '...cookbook + chained search with extra bind' );
-}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/50fork.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/51threads.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/51threadtxn.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/52cycle.t
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: DBIx-Class/0.08/branches/sybase_noquote/t/53delete_chained.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/53delete_chained.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/53delete_chained.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,45 +0,0 @@
-use Test::More;
-use strict;
-use warnings;
-use lib qw(t/lib);
-use DBICTest;
-
-plan tests => 9;
-
-# This set of tests attempts to do a delete on a chained resultset, which
-# would lead to SQL DELETE with a JOIN, which is not supported by the 
-# SQL generator right now.
-# So it currently checks that these operations fail with a warning.
-# When the SQL generator is fixed this test will need fixing up appropriately.
-
-my $schema = DBICTest->init_schema();
-my $total_tracks = $schema->resultset('Track')->count;
-cmp_ok($total_tracks, '>', 0, 'need track records');
-
-# test that delete_related w/o conditions deletes all related records only
-{
-  my $w;
-  local $SIG{__WARN__} = sub { $w = shift };
-
-  my $artist = $schema->resultset("Artist")->find(3);
-  my $artist_tracks = $artist->cds->search_related('tracks')->count;
-  cmp_ok($artist_tracks, '<', $total_tracks, 'need more tracks than just related tracks');
-
-  ok(!eval{$artist->cds->search_related('tracks')->delete});
-  cmp_ok($schema->resultset('Track')->count, '==', $total_tracks, 'No tracks should be deleted');
-  like ($w, qr/Currently \$rs->delete\(\) does not generate proper SQL/, 'Delete join warning');
-}
-
-# test that delete_related w/conditions deletes just the matched related records only
-{
-  my $w;
-  local $SIG{__WARN__} = sub { $w = shift };
-
-  my $artist2 = $schema->resultset("Artist")->find(2);
-  my $artist2_tracks = $artist2->search_related('cds')->search_related('tracks')->count;
-  cmp_ok($artist2_tracks, '<', $total_tracks, 'need more tracks than related tracks');
-  
-  ok(!eval{$artist2->search_related('cds')->search_related('tracks')->delete});
-  cmp_ok($schema->resultset('Track')->count, '==', $total_tracks, 'No tracks should be deleted');
-  like ($w, qr/Currently \$rs->delete\(\) does not generate proper SQL/, 'Delete join warning');
-}

Deleted: DBIx-Class/0.08/branches/sybase_noquote/t/53delete_related.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/53delete_related.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/53delete_related.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,30 +0,0 @@
-use Test::More;
-use strict;
-use warnings;
-use lib qw(t/lib);
-use DBICTest;
-
-plan tests => 7;
-
-my $schema = DBICTest->init_schema();
-my $total_cds = $schema->resultset('CD')->count;
-cmp_ok($total_cds, '>', 0, 'need cd records');
-
-# test that delete_related w/o conditions deletes all related records only
-my $artist = $schema->resultset("Artist")->find(3);
-my $artist_cds = $artist->cds->count;
-cmp_ok($artist_cds, '<', $total_cds, 'need more cds than just related cds');
-
-ok($artist->delete_related('cds'));
-cmp_ok($schema->resultset('CD')->count, '==', ($total_cds - $artist_cds), 'wrong number of cds were deleted');
-
-$total_cds -= $artist_cds;
-
-# test that delete_related w/conditions deletes just the matched related records only
-my $artist2 = $schema->resultset("Artist")->find(2);
-my $artist2_cds = $artist2->search_related('cds')->count;
-cmp_ok($artist2_cds, '<', $total_cds, 'need more cds than related cds');
-
-ok($artist2->delete_related('cds', {title => {like => '%'}}));
-cmp_ok($schema->resultset('CD')->count, '==', ($total_cds - $artist2_cds), 'wrong number of cds were deleted');
-


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/54taint.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/55storage_stress.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/60core.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/60core.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/60core.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -5,30 +5,18 @@
 use Test::Exception;
 use lib qw(t/lib);
 use DBICTest;
+use DBIC::SqlMakerTest;
 
 my $schema = DBICTest->init_schema();
 
-plan tests => 95;
+plan tests => 106;
 
 eval { require DateTime::Format::MySQL };
 my $NO_DTFM = $@ ? 1 : 0;
 
-# figure out if we've got a version of sqlite that is older than 3.2.6, in
-# which case COUNT(DISTINCT()) doesn't work
-my $is_broken_sqlite = 0;
-my ($sqlite_major_ver,$sqlite_minor_ver,$sqlite_patch_ver) =
-    split /\./, $schema->storage->dbh->get_info(18);
-if( $schema->storage->dbh->get_info(17) eq 'SQLite' &&
-    ( ($sqlite_major_ver < 3) ||
-      ($sqlite_major_ver == 3 && $sqlite_minor_ver < 2) ||
-      ($sqlite_major_ver == 3 && $sqlite_minor_ver == 2 && $sqlite_patch_ver < 6) ) ) {
-    $is_broken_sqlite = 1;
-}
-
-
 my @art = $schema->resultset("Artist")->search({ }, { order_by => 'name DESC'});
 
-cmp_ok(@art, '==', 3, "Three artists returned");
+is(@art, 3, "Three artists returned");
 
 my $art = $art[0];
 
@@ -39,7 +27,7 @@
 is($art->name, 'We Are In Rehab', "Accessor update ok");
 
 my %dirty = $art->get_dirty_columns();
-cmp_ok(scalar(keys(%dirty)), '==', 1, '1 dirty column');
+is(scalar(keys(%dirty)), 1, '1 dirty column');
 ok(grep($_ eq 'name', keys(%dirty)), 'name is dirty');
 
 is($art->get_column("name"), 'We Are In Rehab', 'And via get_column');
@@ -47,7 +35,7 @@
 ok($art->update, 'Update run');
 
 my %not_dirty = $art->get_dirty_columns();
-cmp_ok(scalar(keys(%not_dirty)), '==', 0, 'Nothing is dirty');
+is(scalar(keys(%not_dirty)), 0, 'Nothing is dirty');
 
 eval {
   my $ret = $art->make_column_dirty('name2');
@@ -55,7 +43,7 @@
 ok(defined($@), 'Failed to make non-existent column dirty');
 $art->make_column_dirty('name');
 my %fake_dirty = $art->get_dirty_columns();
-cmp_ok(scalar(keys(%fake_dirty)), '==', 1, '1 fake dirty column');
+is(scalar(keys(%fake_dirty)), 1, '1 fake dirty column');
 ok(grep($_ eq 'name', keys(%fake_dirty)), 'name is fake dirty');
 
 my $record_jp = $schema->resultset("Artist")->search(undef, { join => 'cds' })->search(undef, { prefetch => 'cds' })->next;
@@ -68,15 +56,15 @@
 
 @art = $schema->resultset("Artist")->search({ name => 'We Are In Rehab' });
 
-cmp_ok(@art, '==', 1, "Changed artist returned by search");
+is(@art, 1, "Changed artist returned by search");
 
-cmp_ok($art[0]->artistid, '==', 3,'Correct artist too');
+is($art[0]->artistid, 3,'Correct artist too');
 
 lives_ok (sub { $art->delete }, 'Cascading delete on Ordered has_many works' );  # real test in ordered.t
 
 @art = $schema->resultset("Artist")->search({ });
 
-cmp_ok(@art, '==', 2, 'And then there were two');
+is(@art, 2, 'And then there were two');
 
 ok(!$art->in_storage, "It knows it's dead");
 
@@ -90,15 +78,15 @@
 
 @art = $schema->resultset("Artist")->search({ });
 
-cmp_ok(@art, '==', 3, 'And now there are three again');
+is(@art, 3, 'And now there are three again');
 
 my $new = $schema->resultset("Artist")->create({ artistid => 4 });
 
-cmp_ok($new->artistid, '==', 4, 'Create produced record ok');
+is($new->artistid, 4, 'Create produced record ok');
 
 @art = $schema->resultset("Artist")->search({ });
 
-cmp_ok(@art, '==', 4, "Oh my god! There's four of them!");
+is(@art, 4, "Oh my god! There's four of them!");
 
 $new->set_column('name' => 'Man With A Fork');
 
@@ -152,7 +140,7 @@
 my $cd = $schema->resultset("CD")->find(1);
 my %cols = $cd->get_columns;
 
-cmp_ok(keys %cols, '==', 6, 'get_columns number of columns ok');
+is(keys %cols, 6, 'get_columns number of columns ok');
 
 is($cols{title}, 'Spoonful of bees', 'get_columns values ok');
 
@@ -234,32 +222,53 @@
 
 my( $or_rs ) = $schema->resultset("CD")->search_rs($search, { join => 'tags',
                                                   order_by => 'cdid' });
+is($or_rs->all, 5, 'Joined search with OR returned correct number of rows');
+is($or_rs->count, 5, 'Search count with OR ok');
 
-cmp_ok($or_rs->count, '==', 5, 'Search with OR ok');
+my $collapsed_or_rs = $or_rs->search ({}, { distinct => 1 }); # induce collapse
+is ($collapsed_or_rs->all, 4, 'Collapsed joined search with OR returned correct number of rows');
+is ($collapsed_or_rs->count, 4, 'Collapsed search count with OR ok');
 
-my $distinct_rs = $schema->resultset("CD")->search($search, { join => 'tags', distinct => 1 });
-cmp_ok($distinct_rs->all, '==', 4, 'DISTINCT search with OR ok');
+my $pref_or_rs = $collapsed_or_rs->search ({}, { prefetch => [qw/tags/] });
+is_same_sql_bind (
+  $pref_or_rs->as_query,
+  '(SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track, tags.tagid, tags.cd, tags.tag FROM cd me LEFT JOIN tags tags ON tags.cd = me.cdid WHERE ( ( tags.tag = ? OR tags.tag = ? ) ) GROUP BY me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track, tags.tagid, tags.cd, tags.tag ORDER BY cdid, tags.cd, tags.tag)',
+  [
+    [ 'tags.tag' => 'Cheesy' ],
+    [ 'tags.tag' => 'Blue' ],
+  ],
+  'Prefetch + distinct resulted in correct group_by',
+);
+is ($pref_or_rs->all, 4, 'Prefetched grouped search with OR returned correct number of rows');
+is ($pref_or_rs->count, 4, 'Prefetched grouped count with OR ok');
 
-SKIP: {
-  skip "SQLite < 3.2.6 doesn't understand COUNT(DISTINCT())", 2
-    if $is_broken_sqlite;
 
-  my $tcount = $schema->resultset("Track")->search(
+{
+  my $tcount = $schema->resultset('Track')->search(
     {},
-    {       
-       select => {count => {distinct => ['position', 'title']}},
-	   as => ['count']
+    {
+      select => [ qw/position title/ ],
+      distinct => 1,
     }
   );
-  cmp_ok($tcount->next->get_column('count'), '==', 13, 'multiple column COUNT DISTINCT ok');
+  is($tcount->count, 13, 'multiple column COUNT DISTINCT ok');
 
-  $tcount = $schema->resultset("Track")->search(
+  $tcount = $schema->resultset('Track')->search(
     {},
-    {       
-       columns => {count => {count => {distinct => ['position', 'title']}}},
+    {
+      columns => [ qw/position title/ ],
+      distinct => 1,
     }
   );
-  cmp_ok($tcount->next->get_column('count'), '==', 13, 'multiple column COUNT DISTINCT using column syntax ok');
+  is($tcount->count, 13, 'multiple column COUNT DISTINCT ok');
+
+  $tcount = $schema->resultset('Track')->search(
+    {},
+    {
+       group_by => [ qw/position title/ ]
+    }
+  );
+  is($tcount->count, 13, 'multiple column COUNT DISTINCT using column syntax ok');  
 }
 
 my $tag_rs = $schema->resultset('Tag')->search(
@@ -267,17 +276,17 @@
 
 my $rel_rs = $tag_rs->search_related('cd');
 
-cmp_ok($rel_rs->count, '==', 5, 'Related search ok');
+is($rel_rs->count, 5, 'Related search ok');
 
-cmp_ok($or_rs->next->cdid, '==', $rel_rs->next->cdid, 'Related object ok');
+is($or_rs->next->cdid, $rel_rs->next->cdid, 'Related object ok');
 $or_rs->reset;
 $rel_rs->reset;
 
 my $tag = $schema->resultset('Tag')->search(
                [ { 'me.tag' => 'Blue' } ], { cols=>[qw/tagid/] } )->next;
 
-cmp_ok($tag->has_column_loaded('tagid'), '==', 1, 'Has tagid loaded');
-cmp_ok($tag->has_column_loaded('tag'), '==', 0, 'Has not tag  loaded');
+ok($tag->has_column_loaded('tagid'), 'Has tagid loaded');
+ok(!$tag->has_column_loaded('tag'), 'Has not tag loaded');
 
 ok($schema->storage(), 'Storage available');
 
@@ -309,7 +318,7 @@
   ok($schema->source('SourceNameArtists'), 'SourceNameArtists result source exists');
 
   my @artsn = $schema->resultset('SourceNameArtists')->search({}, { order_by => 'name DESC' });
-  cmp_ok(@artsn, '==', 4, "Four artists returned");
+  is(@artsn, 4, "Four artists returned");
   
   # make sure subclasses that don't set source_name are ok
   ok($schema->source('ArtistSubclass'), 'ArtistSubclass exists');
@@ -323,8 +332,8 @@
 {
   my $art_del = $schema->resultset("Artist")->find({ artistid => 1 });
   lives_ok (sub { $art_del->delete }, 'Cascading delete on Ordered has_many works' );  # real test in ordered.t
-  cmp_ok( $schema->resultset("CD")->search({artist => 1}), '==', 0, 'Cascading through has_many top level.');
-  cmp_ok( $schema->resultset("CD_to_Producer")->search({cd => 1}), '==', 0, 'Cascading through has_many children.');
+  is( $schema->resultset("CD")->search({artist => 1}), 0, 'Cascading through has_many top level.');
+  is( $schema->resultset("CD_to_Producer")->search({cd => 1}), 0, 'Cascading through has_many children.');
 }
 
 # test column_info
@@ -404,3 +413,12 @@
   $en_row->insert;
   is($en_row->encoded, 'amliw', 'insert does not encode again');
 }
+
+# make sure we got rid of the compat shims
+SKIP: {
+    skip "Remove in 0.09", 5 if $DBIx::Class::VERSION < 0.09;
+
+    for (qw/compare_relationship_keys pk_depends_on resolve_condition resolve_join resolve_prefetch/) {
+      ok (! DBIx::Class::ResultSource->can ($_), "$_ no longer provided by DBIx::Class::ResultSource");
+    }
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/60core.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/61findnot.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/63register_class.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/63register_class.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/63register_class.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,19 +1,14 @@
 use strict;
 use warnings;  
 
-use Test::More tests => 3;
+use Test::More tests => 2;
 use lib qw(t/lib);
 use DBICTest;
 use DBICTest::Schema;
 use DBICTest::Schema::Artist;
 
 DBICTest::Schema::Artist->source_name('MyArtist');
-{
-    my $w;
-    local $SIG{__WARN__} = sub { $w = shift };
-    DBICTest::Schema->register_class('FooA', 'DBICTest::Schema::Artist');
-    like ($w, qr/use register_extra_source/, 'Complain about using register_class on an already-registered class');
-}
+DBICTest::Schema->register_class('FooA', 'DBICTest::Schema::Artist');
 
 my $schema = DBICTest->init_schema();
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/63register_class.t
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/63register_source.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/63register_source.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/63register_source.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,18 @@
+use strict;
+use warnings;
+
+use Test::Exception tests => 1;
+use lib qw(t/lib);
+use DBICTest;
+use DBICTest::Schema;
+use DBIx::Class::ResultSource::Table;
+
+my $schema = DBICTest->init_schema();
+
+my $foo = DBIx::Class::ResultSource::Table->new({ name => "foo" });
+my $bar = DBIx::Class::ResultSource::Table->new({ name => "bar" });
+
+lives_ok {
+    $schema->register_source(foo => $foo);
+    $schema->register_source(bar => $bar);
+} 'multiple classless sources can be registered';


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/63register_source.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/64db.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/64db.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/64db.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -64,7 +64,12 @@
       'rank' => {
           'data_type' => 'integer',
           'is_nullable' => 0,
+          'default_value' => '13',
       },
+      'charfield' => {
+          'data_type' => 'char',
+          'is_nullable' => 1,
+      },
     },
     'Correctly retrieve column info (mixed null and non-null columns)'
   );


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/64db.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/65multipk.t
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: DBIx-Class/0.08/branches/sybase_noquote/t/66relationship.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/66relationship.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/66relationship.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,286 +0,0 @@
-use strict;
-use warnings;
-
-use Test::More;
-use Test::Exception;
-use lib qw(t/lib);
-use DBICTest;
-
-my $schema = DBICTest->init_schema();
-
-plan tests => 70;
-
-# has_a test
-my $cd = $schema->resultset("CD")->find(4);
-my ($artist) = ($INC{'DBICTest/HelperRels'}
-                  ? $cd->artist
-                  : $cd->search_related('artist'));
-is($artist->name, 'Random Boy Band', 'has_a search_related ok');
-
-# has_many test with an order_by clause defined
-$artist = $schema->resultset("Artist")->find(1);
-my @cds = ($INC{'DBICTest/HelperRels'}
-             ? $artist->cds
-             : $artist->search_related('cds'));
-is( $cds[1]->title, 'Spoonful of bees', 'has_many search_related with order_by ok' );
-
-# search_related with additional abstract query
- at cds = ($INC{'DBICTest/HelperRels'}
-          ? $artist->cds({ title => { like => '%of%' } })
-          : $artist->search_related('cds', { title => { like => '%of%' } } )
-       );
-is( $cds[1]->title, 'Forkful of bees', 'search_related with abstract query ok' );
-
-# creating a related object
-if ($INC{'DBICTest/HelperRels.pm'}) {
-  $artist->add_to_cds({ title => 'Big Flop', year => 2005 });
-} else {
-  $artist->create_related( 'cds', {
-      title => 'Big Flop',
-      year => 2005,
-  } );
-}
-
-my $big_flop_cd = ($artist->search_related('cds'))[3];
-is( $big_flop_cd->title, 'Big Flop', 'create_related ok' );
-
-{ # make sure we are not making pointless select queries when a FK IS NULL
-  my $queries = 0;
-  $schema->storage->debugcb(sub { $queries++; });
-  $schema->storage->debug(1);
-  $big_flop_cd->genre; #should not trigger a select query
-  is($queries, 0, 'No SELECT made for belongs_to if key IS NULL');
-  $big_flop_cd->genre_inefficient; #should trigger a select query
-  is($queries, 1, 'SELECT made for belongs_to if key IS NULL when undef_on_null_fk disabled');
-  $schema->storage->debug(0);
-  $schema->storage->debugcb(undef);
-}
-
-my( $rs_from_list ) = $artist->search_related_rs('cds');
-is( ref($rs_from_list), 'DBIx::Class::ResultSet', 'search_related_rs in list context returns rs' );
-
-( $rs_from_list ) = $artist->cds_rs();
-is( ref($rs_from_list), 'DBIx::Class::ResultSet', 'relation_rs in list context returns rs' );
-
-# count_related
-is( $artist->count_related('cds'), 4, 'count_related ok' );
-
-# set_from_related
-my $track = $schema->resultset("Track")->create( {
-  trackid => 1,
-  cd => 3,
-  position => 98,
-  title => 'Hidden Track'
-} );
-$track->set_from_related( cd => $cd );
-
-is($track->disc->cdid, 4, 'set_from_related ok, including alternative accessor' );
-
-$track->set_from_related( cd => undef );
-
-ok( !defined($track->cd), 'set_from_related with undef ok');
-
-TODO: {
-    local $TODO = 'accessing $object->rel and set_from_related';
-    my $track = $schema->resultset("Track")->new( {} );
-    $track->cd;
-    $track->set_from_related( cd => $cd ); 
-    ok ($track->cd, 'set_from_related ok after using the accessor' );
-};
-
-# update_from_related, the same as set_from_related, but it calls update afterwards
-$track = $schema->resultset("Track")->create( {
-  trackid => 2,
-  cd => 3,
-  title => 'Hidden Track 2'
-} );
-$track->update_from_related( cd => $cd );
-
-my $t_cd = ($schema->resultset("Track")->search( cd => 4, title => 'Hidden Track 2' ))[0]->cd;
-
-is( $t_cd->cdid, 4, 'update_from_related ok' );
-
-# find_or_create_related with an existing record
-$cd = $artist->find_or_create_related( 'cds', { title => 'Big Flop' } );
-is( $cd->year, 2005, 'find_or_create_related on existing record ok' );
-
-# find_or_create_related creating a new record
-$cd = $artist->find_or_create_related( 'cds', {
-  title => 'Greatest Hits',
-  year => 2006,
-} );
-is( $cd->title, 'Greatest Hits', 'find_or_create_related new record ok' );
-
- at cds = $artist->search_related('cds');
-is( ($artist->search_related('cds'))[4]->title, 'Greatest Hits', 'find_or_create_related new record search ok' );
-
-$artist->delete_related( cds => { title => 'Greatest Hits' });
-cmp_ok( $schema->resultset("CD")->search( title => 'Greatest Hits' ), '==', 0, 'delete_related ok' );
-
-# find_or_new_related with an existing record
-$cd = $artist->find_or_new_related( 'cds', { title => 'Big Flop' } );
-is( $cd->year, 2005, 'find_or_new_related on existing record ok' );
-ok( $cd->in_storage, 'find_or_new_related on existing record: is in_storage' );
-
-# find_or_new_related instantiating a new record
-$cd = $artist->find_or_new_related( 'cds', {
-  title => 'Greatest Hits 2: Louder Than Ever',
-  year => 2007,
-} );
-is( $cd->title, 'Greatest Hits 2: Louder Than Ever', 'find_or_new_related new record ok' );
-ok( ! $cd->in_storage, 'find_or_new_related on a new record: not in_storage' );
-
-$cd->artist(undef);
-my $newartist = $cd->find_or_new_related( 'artist', {
-  name => 'Random Boy Band Two',
-  artistid => 200,
-} );
-is($newartist->name, 'Random Boy Band Two', 'find_or_new_related new artist record with id');
-is($newartist->id, 200, 'find_or_new_related new artist id set');
-
-lives_ok( 
-    sub { 
-        my $new_bookmark = $schema->resultset("Bookmark")->new_result( {} );
-        my $new_related_link = $new_bookmark->new_related( 'link', {} );
-    },
-    'No back rel'
-);
-
-
-TODO: {
-  local $TODO = "relationship checking needs fixing";
-  # try to add a bogus relationship using the wrong cols
-  eval {
-      DBICTest::Schema::Artist->add_relationship(
-          tracks => 'DBICTest::Schema::Track',
-          { 'foreign.cd' => 'self.cdid' }
-      );
-  };
-  like($@, qr/Unknown column/, 'failed when creating a rel with invalid key, ok');
-}
-  
-# another bogus relationship using no join condition
-eval {
-    DBICTest::Schema::Artist->add_relationship( tracks => 'DBICTest::Track' );
-};
-like($@, qr/join condition/, 'failed when creating a rel without join condition, ok');
-
-# many_to_many helper tests
-$cd = $schema->resultset("CD")->find(1);
-my @producers = $cd->producers();
-is( $producers[0]->name, 'Matt S Trout', 'many_to_many ok' );
-is( $cd->producers_sorted->next->name, 'Bob The Builder',
-    'sorted many_to_many ok' );
-is( $cd->producers_sorted(producerid => 3)->next->name, 'Fred The Phenotype',
-    'sorted many_to_many with search condition ok' );
-
-$cd = $schema->resultset('CD')->find(2);
-my $prod_rs = $cd->producers();
-my $prod_before_count = $schema->resultset('Producer')->count;
-is( $prod_rs->count, 0, "CD doesn't yet have any producers" );
-my $prod = $schema->resultset('Producer')->find(1);
-$cd->add_to_producers($prod);
-is( $prod_rs->count(), 1, 'many_to_many add_to_$rel($obj) count ok' );
-is( $prod_rs->first->name, 'Matt S Trout',
-    'many_to_many add_to_$rel($obj) ok' );
-$cd->remove_from_producers($prod);
-is( $schema->resultset('Producer')->find(1)->name, 'Matt S Trout',
-    "producer object exists after remove of link" );
-is( $prod_rs->count, 0, 'many_to_many remove_from_$rel($obj) ok' );
-$cd->add_to_producers({ name => 'Testy McProducer' });
-is( $schema->resultset('Producer')->count, $prod_before_count+1,
-    'add_to_$rel($hash) inserted a new producer' );
-is( $prod_rs->count(), 1, 'many_to_many add_to_$rel($hash) count ok' );
-is( $prod_rs->first->name, 'Testy McProducer',
-    'many_to_many add_to_$rel($hash) ok' );
-$cd->add_to_producers({ name => 'Jack Black' });
-is( $prod_rs->count(), 2, 'many_to_many add_to_$rel($hash) count ok' );
-$cd->set_producers($schema->resultset('Producer')->all);
-is( $cd->producers->count(), $prod_before_count+2, 
-    'many_to_many set_$rel(@objs) count ok' );
-$cd->set_producers($schema->resultset('Producer')->find(1));
-is( $cd->producers->count(), 1, 'many_to_many set_$rel($obj) count ok' );
-$cd->set_producers([$schema->resultset('Producer')->all]);
-is( $cd->producers->count(), $prod_before_count+2, 
-    'many_to_many set_$rel(\@objs) count ok' );
-$cd->set_producers([$schema->resultset('Producer')->find(1)]);
-is( $cd->producers->count(), 1, 'many_to_many set_$rel([$obj]) count ok' );
-
-eval { $cd->remove_from_producers({ fake => 'hash' }); };
-like( $@, qr/needs an object/, 'remove_from_$rel($hash) dies correctly' );
-
-eval { $cd->add_to_producers(); };
-like( $@, qr/needs an object or hashref/,
-      'add_to_$rel(undef) dies correctly' );
-
-# many_to_many stresstest
-my $twokey = $schema->resultset('TwoKeys')->find(1,1);
-my $fourkey = $schema->resultset('FourKeys')->find(1,2,3,4);
-
-is( $twokey->fourkeys->count, 0, 'twokey has no fourkeys' );
-$twokey->add_to_fourkeys($fourkey, { autopilot => 'engaged' });
-my $got_fourkey = $twokey->fourkeys({ sensors => 'online' })->first;
-is( $twokey->fourkeys->count, 1, 'twokey has one fourkey' );
-is( $got_fourkey->$_, $fourkey->$_,
-    'fourkeys row has the correct value for column '.$_ )
-  for (qw(foo bar hello goodbye sensors));
-$twokey->remove_from_fourkeys($fourkey);
-is( $twokey->fourkeys->count, 0, 'twokey has no fourkeys' );
-is( $twokey->fourkeys_to_twokeys->count, 0,
-    'twokey has no links to fourkey' );
-
-my $undef_artist_cd = $schema->resultset("CD")->new_result({ 'title' => 'badgers', 'year' => 2007 });
-is($undef_artist_cd->has_column_loaded('artist'), '', 'FK not loaded');
-is($undef_artist_cd->search_related('artist')->count, 0, '0=1 search when FK does not exist and object not yet in db');
-eval{ 
-     $undef_artist_cd->related_resultset('artist')->new({name => 'foo'});
-};
-is( $@, '', "Object created on a resultset related to not yet inserted object");
-lives_ok{
-  $schema->resultset('Artwork')->new_result({})->cd;
-} 'undef_on_null_fk does not choke on empty conds';
-
-my $def_artist_cd = $schema->resultset("CD")->new_result({ 'title' => 'badgers', 'year' => 2007, artist => undef });
-is($def_artist_cd->has_column_loaded('artist'), 1, 'FK loaded');
-is($def_artist_cd->search_related('artist')->count, 0, 'closed search on null FK');
-
-# test undirected many-to-many relationship (e.g. "related artists")
-my $undir_maps = $schema->resultset("Artist")->find(1)->artist_undirected_maps;
-is($undir_maps->count, 1, 'found 1 undirected map for artist 1');
-
-$undir_maps = $schema->resultset("Artist")->find(2)->artist_undirected_maps;
-is($undir_maps->count, 1, 'found 1 undirected map for artist 2');
-
-my $mapped_rs = $undir_maps->search_related('mapped_artists');
-
-my @art = $mapped_rs->all;
-
-cmp_ok(@art, '==', 2, "Both artist returned from map");
-
-my $searched = $mapped_rs->search({'mapped_artists.artistid' => {'!=', undef}});
-
-cmp_ok($searched->count, '==', 2, "Both artist returned from map after adding another condition");
-
-# check join through cascaded has_many relationships
-$artist = $schema->resultset("Artist")->find(1);
-my $trackset = $artist->cds->search_related('tracks');
-# LEFT join means we also see the trackless additional album...
-cmp_ok($trackset->count, '==', 11, "Correct number of tracks for artist");
-
-# now see about updating eveything that belongs to artist 2 to artist 3
-$artist = $schema->resultset("Artist")->find(2);
-my $nartist = $schema->resultset("Artist")->find(3);
-cmp_ok($artist->cds->count, '==', 1, "Correct orig #cds for artist");
-cmp_ok($nartist->cds->count, '==', 1, "Correct orig #cds for artist");
-$artist->cds->update({artist => $nartist->id});
-cmp_ok($artist->cds->count, '==', 0, "Correct new #cds for artist");
-cmp_ok($nartist->cds->count, '==', 2, "Correct new #cds for artist");
-
-# check if is_foreign_key_constraint attr is set
-my $rs_normal = $schema->source('Track');
-my $relinfo = $rs_normal->relationship_info ('cd');
-cmp_ok($relinfo->{attrs}{is_foreign_key_constraint}, '==', 1, "is_foreign_key_constraint defined for belongs_to relationships.");
-
-my $rs_overridden = $schema->source('ForceForeign');
-my $relinfo_with_attr = $rs_overridden->relationship_info ('cd_3');
-cmp_ok($relinfo_with_attr->{attrs}{is_foreign_key_constraint}, '==', 0, "is_foreign_key_constraint defined for belongs_to relationships with attr.");

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/67pager.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/67pager.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/67pager.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -21,6 +21,8 @@
 
 is( $it->count, 3, "count on paged rs ok" );
 
+is( $it->pager->total_entries, 5, "total_entries ok" );
+
 is( $it->next->title, "Caterwaulin' Blues", "iterator->next ok" );
 
 $it->next;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/67pager.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/68inflate.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/68inflate_resultclass_hashrefinflator.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/68inflate_serialize.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/69update.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/70auto.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/71mysql.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/71mysql.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/71mysql.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,6 +2,7 @@
 use warnings;  
 
 use Test::More;
+use Test::Exception;
 use lib qw(t/lib);
 use DBICTest;
 use DBI::Const::GetInfoType;
@@ -13,7 +14,7 @@
 plan skip_all => 'Set $ENV{DBICTEST_MYSQL_DSN}, _USER and _PASS to run this test'
   unless ($dsn && $user);
 
-plan tests => 10;
+plan tests => 23;
 
 my $schema = DBICTest::Schema->connect($dsn, $user, $pass);
 
@@ -23,6 +24,26 @@
 
 $dbh->do("CREATE TABLE artist (artistid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), rank INTEGER NOT NULL DEFAULT '13', charfield CHAR(10));");
 
+$dbh->do("DROP TABLE IF EXISTS cd;");
+
+$dbh->do("CREATE TABLE cd (cdid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, artist INTEGER, title TEXT, year INTEGER, genreid INTEGER, single_track INTEGER);");
+
+$dbh->do("DROP TABLE IF EXISTS producer;");
+
+$dbh->do("CREATE TABLE producer (producerid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name TEXT);");
+
+$dbh->do("DROP TABLE IF EXISTS cd_to_producer;");
+
+$dbh->do("CREATE TABLE cd_to_producer (cd INTEGER,producer INTEGER);");
+
+$dbh->do("DROP TABLE IF EXISTS owners;");
+
+$dbh->do("CREATE TABLE owners (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL);");
+
+$dbh->do("DROP TABLE IF EXISTS books;");
+
+$dbh->do("CREATE TABLE books (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, source VARCHAR(100) NOT NULL, owner integer NOT NULL, title varchar(100) NOT NULL,  price integer);");
+
 #'dbi:mysql:host=localhost;database=dbic_test', 'dbic_test', '');
 
 # This is in Core now, but it's here just to test that it doesn't break
@@ -41,7 +62,7 @@
       offset => 2,
       order_by => 'artistid' }
 );
-is( $it->count, 3, "LIMIT count ok" );
+is( $it->count, 3, "LIMIT count ok" );  # ask for 3 rows out of 7 artists
 is( $it->next->name, "Artist 2", "iterator->next ok" );
 $it->next;
 $it->next;
@@ -74,7 +95,72 @@
     },
 };
 
+$schema->populate ('Owners', [
+  [qw/id  name  /],
+  [qw/1   wiggle/],
+  [qw/2   woggle/],
+  [qw/3   boggle/],
+]);
+
+$schema->populate ('BooksInLibrary', [
+  [qw/source  owner title   /],
+  [qw/Library 1     secrets1/],
+  [qw/Eatery  1     secrets2/],
+  [qw/Library 2     secrets3/],
+]);
+
+#
+# try a distinct + prefetch on tables with identically named columns 
+# (mysql doesn't seem to like subqueries with equally named columns)
+#
+
 SKIP: {
+  # try a ->has_many direction (due to a 'multi' accessor the select/group_by group is collapsed)
+  my $owners = $schema->resultset ('Owners')->search (
+    { 'books.id' => { '!=', undef }},
+    { prefetch => 'books', distinct => 1 }
+  );
+  my $owners2 = $schema->resultset ('Owners')->search ({ id => { -in => $owners->get_column ('me.id')->as_query }});
+  for ($owners, $owners2) {
+    lives_ok { is ($_->all, 2, 'Prefetched grouped search returns correct number of rows') }
+      || skip ('No test due to exception', 1);
+    lives_ok { is ($_->count, 2, 'Prefetched grouped search returns correct count') }
+      || skip ('No test due to exception', 1);
+  }
+
+  TODO: {
+    # try a ->prefetch direction (no select collapse)
+    my $books = $schema->resultset ('BooksInLibrary')->search (
+      { 'owner.name' => 'wiggle' },
+      { prefetch => 'owner', distinct => 1 }
+    );
+
+    local $TODO = 'MySQL is crazy - there seems to be no way to make this work';
+    # error thrown is:
+    # Duplicate column name 'id' [for Statement "
+    #   SELECT COUNT( * )
+    #     FROM (
+    #       SELECT me.id, me.source, me.owner, me.title, me.price, owner.id, owner.name
+    #         FROM books me
+    #         JOIN owners owner ON owner.id = me.owner 
+    #       WHERE ( ( owner.name = ? AND source = ? ) ) 
+    #       GROUP BY me.id, me.source, me.owner, me.title, me.price, owner.id, owner.name
+    #     ) count_subq
+    # " with ParamValues: 0='wiggle', 1='Library']
+    #
+    # go fucking figure
+
+    my $books2 = $schema->resultset ('BooksInLibrary')->search ({ id => { -in => $books->get_column ('me.id')->as_query }});
+    for ($books, $books2) {
+      lives_ok { is ($_->all, 1, 'Prefetched grouped search returns correct number of rows') }
+        || skip ('No test due to exception', 1);
+      lives_ok { is ($_->count, 1, 'Prefetched grouped search returns correct count') }
+        || skip ('No test due to exception', 1);
+    }
+  }
+}
+
+SKIP: {
     my $mysql_version = $dbh->get_info( $GetInfoType{SQL_DBMS_VER} );
     skip "Cannot determine MySQL server version", 1 if !$mysql_version;
 
@@ -108,7 +194,7 @@
     => 'Created an artist resultset of undef';
     
     TODO: {
-    	$TODO = "need to fix the row count =1 when select * from table where pk IS NULL problem";
+    	local $TODO = "need to fix the row count =1 when select * from table where pk IS NULL problem";
 	    is $artist2_rs->count, 0
 	    => 'got no rows';    	
     }
@@ -119,8 +205,13 @@
     => 'Nothing Found!';
 }
     
+my $cd = $schema->resultset ('CD')->create ({});
 
+my $producer = $schema->resultset ('Producer')->create ({});
+
+lives_ok { $cd->set_producers ([ $producer ]) } 'set_relationship doesnt die';
+
 # clean up our mess
 END {
     #$dbh->do("DROP TABLE artist") if $dbh;
-}
\ No newline at end of file
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/71mysql.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/72pg.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/72pg.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/72pg.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -15,10 +15,15 @@
 
   __PACKAGE__->load_components(qw/Core/);
   __PACKAGE__->table('testschema.casecheck');
-  __PACKAGE__->add_columns(qw/id name NAME uc_name/);
+  __PACKAGE__->add_columns(qw/id name NAME uc_name storecolumn/);
   __PACKAGE__->column_info_from_storage(1);
   __PACKAGE__->set_primary_key('id');
 
+  sub store_column {
+    my ($self, $name, $value) = @_;
+    $value = '#'.$value if($name eq "storecolumn");
+    $self->maybe::next::method($name, $value);
+  }
 }
 
 {
@@ -45,7 +50,7 @@
     unless ($dsn && $user);
 
 
-plan tests => 37;
+plan tests => 39;
 
 DBICTest::Schema->load_classes( 'Casecheck', 'ArrayTest' );
 my $schema = DBICTest::Schema->connect($dsn, $user, $pass);
@@ -67,16 +72,25 @@
 $schema->source("SequenceTest")->name("testschema.sequence_test");
 {
     local $SIG{__WARN__} = sub {};
+    _cleanup ($dbh);
+
     $dbh->do("CREATE SCHEMA testschema;");
     $dbh->do("CREATE TABLE testschema.artist (artistid serial PRIMARY KEY, name VARCHAR(100), rank INTEGER NOT NULL DEFAULT '13', charfield CHAR(10), arrayfield INTEGER[]);");
     $dbh->do("CREATE TABLE testschema.sequence_test (pkid1 integer, pkid2 integer, nonpkid integer, name VARCHAR(100), CONSTRAINT pk PRIMARY KEY(pkid1, pkid2));");
     $dbh->do("CREATE SEQUENCE pkid1_seq START 1 MAXVALUE 999999 MINVALUE 0");
     $dbh->do("CREATE SEQUENCE pkid2_seq START 10 MAXVALUE 999999 MINVALUE 0");
     $dbh->do("CREATE SEQUENCE nonpkid_seq START 20 MAXVALUE 999999 MINVALUE 0");
-    ok ( $dbh->do('CREATE TABLE testschema.casecheck (id serial PRIMARY KEY, "name" VARCHAR(1), "NAME" VARCHAR(2), "UC_NAME" VARCHAR(3));'), 'Creation of casecheck table');
+    ok ( $dbh->do('CREATE TABLE testschema.casecheck (id serial PRIMARY KEY, "name" VARCHAR(1), "NAME" VARCHAR(2), "UC_NAME" VARCHAR(3), "storecolumn" VARCHAR(10));'), 'Creation of casecheck table');
     ok ( $dbh->do('CREATE TABLE testschema.array_test (id serial PRIMARY KEY, arrayfield INTEGER[]);'), 'Creation of array_test table');
 }
 
+# store_column is called once for create() for non sequence columns
+
+ok(my $storecolumn = $schema->resultset('Casecheck')->create({'storecolumn' => 'a'}));
+
+is($storecolumn->storecolumn, '#a'); # was '##a'
+
+
 # This is in Core now, but it's here just to test that it doesn't break
 $schema->class('Artist')->load_components('PK::Auto');
 
@@ -150,7 +164,7 @@
   my $count;
   lives_ok {
     $count = $schema->resultset('ArrayTest')->search({
-      arrayfield => \[ '= ?' => [arrayfield => [3, 4]] ],   #TODO anything less ugly than this?
+      arrayfield => \[ '= ?' => [arrayfield => [3, 4]] ],   #Todo anything less ugly than this?
     })->count;
   } 'comparing arrayref to pg array data does not blow up';
   is($count, 1, 'comparing arrayref to pg array data gives correct result');
@@ -243,30 +257,30 @@
     });
 }
 
-SKIP: {
-  skip "Oracle Auto-PK tests are broken", 16;
-
-  # test auto increment using sequences WITHOUT triggers
-  for (1..5) {
+for (1..5) {
     my $st = $schema->resultset('SequenceTest')->create({ name => 'foo' });
     is($st->pkid1, $_, "Oracle Auto-PK without trigger: First primary key");
     is($st->pkid2, $_ + 9, "Oracle Auto-PK without trigger: Second primary key");
     is($st->nonpkid, $_ + 19, "Oracle Auto-PK without trigger: Non-primary key");
-  }
-  my $st = $schema->resultset('SequenceTest')->create({ name => 'foo', pkid1 => 55 });
-  is($st->pkid1, 55, "Oracle Auto-PK without trigger: First primary key set manually");
 }
+my $st = $schema->resultset('SequenceTest')->create({ name => 'foo', pkid1 => 55 });
+is($st->pkid1, 55, "Oracle Auto-PK without trigger: First primary key set manually");
 
-END {
-    if($dbh) {
-        $dbh->do("DROP TABLE testschema.artist;");
-        $dbh->do("DROP TABLE testschema.casecheck;");
-        $dbh->do("DROP TABLE testschema.sequence_test;");
-        $dbh->do("DROP TABLE testschema.array_test;");
-        $dbh->do("DROP SEQUENCE pkid1_seq");
-        $dbh->do("DROP SEQUENCE pkid2_seq");
-        $dbh->do("DROP SEQUENCE nonpkid_seq");
-        $dbh->do("DROP SCHEMA testschema;");
-    }
+sub _cleanup {
+  my $dbh = shift or return;
+
+  for my $stat (
+    'DROP TABLE testschema.artist',
+    'DROP TABLE testschema.casecheck',
+    'DROP TABLE testschema.sequence_test',
+    'DROP TABLE testschema.array_test',
+    'DROP SEQUENCE pkid1_seq',
+    'DROP SEQUENCE pkid2_seq',
+    'DROP SEQUENCE nonpkid_seq',
+    'DROP SCHEMA testschema',
+  ) {
+    eval { $dbh->do ($stat) };
+  }
 }
 
+END { _cleanup($dbh) }


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/72pg.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/73oracle.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/73oracle.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/73oracle.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -28,6 +28,7 @@
 use strict;
 use warnings;  
 
+use Test::Exception;
 use Test::More;
 use lib qw(t/lib);
 use DBICTest;
@@ -39,7 +40,7 @@
   ' as well as following sequences: \'pkid1_seq\', \'pkid2_seq\' and \'nonpkid_seq\''
   unless ($dsn && $user && $pass);
 
-plan tests => 24;
+plan tests => 34;
 
 DBICTest::Schema->load_classes('ArtistFQN');
 my $schema = DBICTest::Schema->connect($dsn, $user, $pass);
@@ -63,7 +64,7 @@
 $dbh->do("CREATE TABLE artist (artistid NUMBER(12), name VARCHAR(255), rank NUMBER(38), charfield VARCHAR2(10))");
 $dbh->do("CREATE TABLE sequence_test (pkid1 NUMBER(12), pkid2 NUMBER(12), nonpkid NUMBER(12), name VARCHAR(255))");
 $dbh->do("CREATE TABLE cd (cdid NUMBER(12), artist NUMBER(12), title VARCHAR(255), year VARCHAR(4))");
-$dbh->do("CREATE TABLE track (trackid NUMBER(12), cd NUMBER(12), position NUMBER(12), title VARCHAR(255), last_updated_on DATE)");
+$dbh->do("CREATE TABLE track (trackid NUMBER(12), cd NUMBER(12), position NUMBER(12), title VARCHAR(255), last_updated_on DATE, last_updated_at DATE)");
 
 $dbh->do("ALTER TABLE artist ADD (CONSTRAINT artist_pk PRIMARY KEY (artistid))");
 $dbh->do("ALTER TABLE sequence_test ADD (CONSTRAINT sequence_test_constraint PRIMARY KEY (pkid1, pkid2))");
@@ -80,6 +81,23 @@
   END;
 });
 
+{
+    # Swiped from t/bindtype_columns.t to avoid creating my own Resultset.
+
+    local $SIG{__WARN__} = sub {};
+    eval { $dbh->do('DROP TABLE bindtype_test') };
+
+    $dbh->do(qq[
+        CREATE TABLE bindtype_test 
+        (
+            id              integer      NOT NULL   PRIMARY KEY,
+            bytea           integer      NULL,
+            blob            blob         NULL,
+            clob            clob         NULL
+        )
+    ],{ RaiseError => 1, PrintError => 1 });
+}
+
 # This is in Core now, but it's here just to test that it doesn't break
 $schema->class('Artist')->load_components('PK::Auto');
 # These are compat shims for PK::Auto...
@@ -106,16 +124,33 @@
 
 # check count distinct with multiple columns
 my $other_track = $schema->resultset('Track')->create({ trackid => 2, cd => 1, position => 1, title => 'Track2' });
+
 my $tcount = $schema->resultset('Track')->search(
-    {},
-    {
-        select => [{count => {distinct => ['position', 'title']}}],
-        as => ['count']
-    }
-  );
+  {},
+  {
+    select => [ qw/position title/ ],
+    distinct => 1,
+  }
+);
+is($tcount->count, 2, 'multiple column COUNT DISTINCT ok');
 
-is($tcount->next->get_column('count'), 2, "multiple column select distinct ok");
+$tcount = $schema->resultset('Track')->search(
+  {},
+  {
+    columns => [ qw/position title/ ],
+    distinct => 1,
+  }
+);
+is($tcount->count, 2, 'multiple column COUNT DISTINCT ok');
 
+$tcount = $schema->resultset('Track')->search(
+  {},
+  { 
+     group_by => [ qw/position title/ ]
+  }
+);
+is($tcount->count, 2, 'multiple column COUNT DISTINCT using column syntax ok');
+
 # test LIMIT support
 for (1..6) {
     $schema->resultset('Artist')->create({ name => 'Artist ' . $_ });
@@ -147,6 +182,28 @@
 my $st = $schema->resultset('SequenceTest')->create({ name => 'foo', pkid1 => 55 });
 is($st->pkid1, 55, "Oracle Auto-PK without trigger: First primary key set manually");
 
+{
+	my %binstr = ( 'small' => join('', map { chr($_) } ( 1 .. 127 )) );
+	$binstr{'large'} = $binstr{'small'} x 1024;
+
+	my $maxloblen = length $binstr{'large'};
+	note "Localizing LongReadLen to $maxloblen to avoid truncation of test data";
+	local $dbh->{'LongReadLen'} = $maxloblen;
+
+	my $rs = $schema->resultset('BindType');
+	my $id = 0;
+
+	foreach my $type (qw( blob clob )) {
+		foreach my $size (qw( small large )) {
+			$id++;
+
+			lives_ok { $rs->create( { 'id' => $id, $type => $binstr{$size} } ) }
+				"inserted $size $type without dying";
+			ok($rs->find($id)->$type eq $binstr{$size}, "verified inserted $size $type" );
+		}
+	}
+}
+
 # clean up our mess
 END {
     if($schema && ($dbh = $schema->storage->dbh)) {
@@ -158,6 +215,7 @@
         $dbh->do("DROP TABLE sequence_test");
         $dbh->do("DROP TABLE cd");
         $dbh->do("DROP TABLE track");
+        $dbh->do("DROP TABLE bindtype_test");
     }
 }
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/73oracle.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/73oracle_inflate.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/73oracle_inflate.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/73oracle_inflate.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -17,12 +17,14 @@
         plan skip_all => 'needs DateTime and DateTime::Format::Oracle for testing';
     }
     else {
-        plan tests => 4;
+        plan tests => 7;
     }
 }
 
 # DateTime::Format::Oracle needs this set
 $ENV{NLS_DATE_FORMAT} = 'DD-MON-YY';
+$ENV{NLS_TIMESTAMP_FORMAT} = 'YYYY-MM-DD HH24:MI:SSXFF';
+$ENV{NLS_LANG} = 'AMERICAN_AMERICA.WE8ISO8859P1';
 
 my $schema = DBICTest::Schema->connect($dsn, $user, $pass);
 
@@ -30,16 +32,20 @@
 my $col_metadata = $schema->class('Track')->column_info('last_updated_on');
 $schema->class('Track')->add_column( 'last_updated_on' => {
     data_type => 'date' });
+$schema->class('Track')->add_column( 'last_updated_at' => {
+    data_type => 'timestamp' });
 
 my $dbh = $schema->storage->dbh;
 
+#$dbh->do("alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SSXFF'");
+
 eval {
   $dbh->do("DROP TABLE track");
 };
-$dbh->do("CREATE TABLE track (trackid NUMBER(12), cd NUMBER(12), position NUMBER(12), title VARCHAR(255), last_updated_on DATE)");
+$dbh->do("CREATE TABLE track (trackid NUMBER(12), cd NUMBER(12), position NUMBER(12), title VARCHAR(255), last_updated_on DATE, last_updated_at TIMESTAMP)");
 
 # insert a row to play with
-my $new = $schema->resultset('Track')->create({ trackid => 1, cd => 1, position => 1, title => 'Track1', last_updated_on => '06-MAY-07' });
+my $new = $schema->resultset('Track')->create({ trackid => 1, cd => 1, position => 1, title => 'Track1', last_updated_on => '06-MAY-07', last_updated_at => '2009-05-03 21:17:18.5' });
 is($new->trackid, 1, "insert sucessful");
 
 my $track = $schema->resultset('Track')->find( 1 );
@@ -48,11 +54,18 @@
 
 is( $track->last_updated_on->month, 5, "DateTime methods work on inflated column");
 
+#note '$track->last_updated_at => ', $track->last_updated_at;
+is( ref($track->last_updated_at), 'DateTime', "last_updated_at inflated ok");
+
+is( $track->last_updated_at->nanosecond, 500_000_000, "DateTime methods work with nanosecond precision");
+
 my $dt = DateTime->now();
 $track->last_updated_on($dt);
+$track->last_updated_at($dt);
 $track->update;
 
 is( $track->last_updated_on->month, $dt->month, "deflate ok");
+is( int $track->last_updated_at->nanosecond, int $dt->nanosecond, "deflate ok with nanosecond precision");
 
 # clean up our mess
 END {


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/73oracle_inflate.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/745db2.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/745db2.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/745db2.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -12,7 +12,7 @@
 plan skip_all => 'Set $ENV{DBICTEST_DB2_DSN}, _USER and _PASS to run this test'
   unless ($dsn && $user);
 
-plan tests => 6;
+plan tests => 9;
 
 my $schema = DBICTest::Schema->connect($dsn, $user, $pass);
 
@@ -25,25 +25,37 @@
 # This is in core, just testing that it still loads ok
 $schema->class('Artist')->load_components('PK::Auto');
 
+my $ars = $schema->resultset('Artist');
+
 # test primary key handling
-my $new = $schema->resultset('Artist')->create({ name => 'foo' });
+my $new = $ars->create({ name => 'foo' });
 ok($new->artistid, "Auto-PK worked");
 
-# test LIMIT support
+my $init_count = $ars->count;
 for (1..6) {
-    $schema->resultset('Artist')->create({ name => 'Artist ' . $_ });
+    $ars->create({ name => 'Artist ' . $_ });
 }
-my $it = $schema->resultset('Artist')->search( {},
-    { rows => 3,
-      order_by => 'artistid'
-      }
+is ($ars->count, $init_count + 6, 'Simple count works');
+
+# test LIMIT support
+my $it = $ars->search( {},
+  {
+    rows => 3,
+    order_by => 'artistid'
+  }
 );
 is( $it->count, 3, "LIMIT count ok" );
+
+my @all = $it->all;
+is (@all, 3, 'Number of ->all objects matches count');
+
+$it->reset;
 is( $it->next->name, "foo", "iterator->next ok" );
-$it->next;
+is( $it->next->name, "Artist 1", "iterator->next ok" );
 is( $it->next->name, "Artist 2", "iterator->next ok" );
-is( $it->next, undef, "next past end of resultset ok" );
+is( $it->next, undef, "next past end of resultset ok" );  # this can not succeed if @all > 3
 
+
 my $test_type_info = {
     'artistid' => {
         'data_type' => 'INTEGER',


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/745db2.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/746db2_400.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/746mssql.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/746mssql.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/746mssql.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -10,11 +10,21 @@
 plan skip_all => 'Set $ENV{DBICTEST_MSSQL_ODBC_DSN}, _USER and _PASS to run this test'
   unless ($dsn && $user);
 
-plan tests => 12;
+plan tests => 13;
 
 my $schema = DBICTest::Schema->connect($dsn, $user, $pass, {AutoCommit => 1});
 
-$schema->storage->ensure_connected;
+{
+  no warnings 'redefine';
+  my $connect_count = 0;
+  my $orig_connect = \&DBI::connect;
+  local *DBI::connect = sub { $connect_count++; goto &$orig_connect };
+
+  $schema->storage->ensure_connected;
+
+  is( $connect_count, 1, 'only one connection made');
+}
+
 isa_ok( $schema->storage, 'DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server' );
 
 $schema->storage->dbh_do (sub {


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/746mssql.t
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/746sybase.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/746sybase.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/746sybase.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,82 @@
+use strict;
+use warnings;  
+
+use Test::More;
+use lib qw(t/lib);
+use DBICTest;
+
+my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_SYBASE_${_}" } qw/DSN USER PASS/};
+
+plan skip_all => 'Set $ENV{DBICTEST_SYBASE_DSN}, _USER and _PASS to run this test'
+  unless ($dsn && $user);
+
+plan tests => 12;
+
+my $schema = DBICTest::Schema->connect($dsn, $user, $pass, {AutoCommit => 1});
+
+$schema->storage->ensure_connected;
+isa_ok( $schema->storage, 'DBIx::Class::Storage::DBI::Sybase' );
+
+$schema->storage->dbh_do (sub {
+    my ($storage, $dbh) = @_;
+    eval { $dbh->do("DROP TABLE artist") };
+    $dbh->do(<<'SQL');
+
+CREATE TABLE artist (
+   artistid INT IDENTITY NOT NULL,
+   name VARCHAR(100),
+   rank INT DEFAULT 13 NOT NULL,
+   charfield CHAR(10) NULL,
+   primary key(artistid)
+)
+
+SQL
+
+});
+
+my %seen_id;
+
+# fresh $schema so we start unconnected
+$schema = DBICTest::Schema->connect($dsn, $user, $pass, {AutoCommit => 1});
+
+# test primary key handling
+my $new = $schema->resultset('Artist')->create({ name => 'foo' });
+ok($new->artistid > 0, "Auto-PK worked");
+
+$seen_id{$new->artistid}++;
+
+# test LIMIT support
+for (1..6) {
+    $new = $schema->resultset('Artist')->create({ name => 'Artist ' . $_ });
+    is ( $seen_id{$new->artistid}, undef, "id for Artist $_ is unique" );
+    $seen_id{$new->artistid}++;
+}
+
+my $it;
+
+$it = $schema->resultset('Artist')->search( {}, {
+    rows => 3,
+    order_by => 'artistid',
+});
+
+TODO: {
+    local $TODO = 'Sybase is very very fucked in the limit department';
+
+    is( $it->count, 3, "LIMIT count ok" );
+}
+
+# The iterator still works correctly with rows => 3, even though the sql is
+# fucked, very interesting.
+
+is( $it->next->name, "foo", "iterator->next ok" );
+$it->next;
+is( $it->next->name, "Artist 2", "iterator->next ok" );
+is( $it->next, undef, "next past end of resultset ok" );
+
+
+# clean up our mess
+END {
+    my $dbh = eval { $schema->storage->_dbh };
+    $dbh->do('DROP TABLE artist') if $dbh;
+}
+


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/746sybase.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/74mssql.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/74mssql.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/74mssql.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -7,23 +7,18 @@
 
 my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MSSQL_${_}" } qw/DSN USER PASS/};
 
-#warn "$dsn $user $pass";
-
 plan skip_all => 'Set $ENV{DBICTEST_MSSQL_DSN}, _USER and _PASS to run this test'
   unless ($dsn);
 
-plan tests => 5;
+plan tests => 6;
 
-my $storage_type = '::DBI::MSSQL';
-$storage_type = '::DBI::Sybase::MSSQL' if $dsn =~ /^dbi:Sybase:/;
-# Add more for others in the future when they exist (ODBC? ADO? JDBC?)
-
 my $schema = DBICTest::Schema->clone;
-$schema->storage_type($storage_type);
 $schema->connection($dsn, $user, $pass);
 
 my $dbh = $schema->storage->dbh;
 
+isa_ok($schema->storage, 'DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server');
+
 $dbh->do("IF OBJECT_ID('artist', 'U') IS NOT NULL
     DROP TABLE artist");
 $dbh->do("IF OBJECT_ID('cd', 'U') IS NOT NULL


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/74mssql.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/75limit.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/76joins.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/76joins.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/76joins.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -17,23 +17,11 @@
     eval "use DBD::SQLite";
     plan $@
         ? ( skip_all => 'needs DBD::SQLite for testing' )
-        : ( tests => 18 );
+        : ( tests => 33 );
 }
 
-# figure out if we've got a version of sqlite that is older than 3.2.6, in
-# which case COUNT(DISTINCT()) doesn't work
-my $is_broken_sqlite = 0;
-my ($sqlite_major_ver,$sqlite_minor_ver,$sqlite_patch_ver) =
-    split /\./, $schema->storage->dbh->get_info(18);
-if( $schema->storage->dbh->get_info(17) eq 'SQLite' &&
-    ( ($sqlite_major_ver < 3) ||
-      ($sqlite_major_ver == 3 && $sqlite_minor_ver < 2) ||
-      ($sqlite_major_ver == 3 && $sqlite_minor_ver == 2 && $sqlite_patch_ver < 6) ) ) {
-    $is_broken_sqlite = 1;
-}
-
 # test the abstract join => SQL generator
-my $sa = new DBIC::SQL::Abstract;
+my $sa = new DBIx::Class::SQLAHacks;
 
 my @j = (
     { child => 'person' },
@@ -44,9 +32,9 @@
           . 'child.father_id ) JOIN person mother ON ( mother.person_id '
           . '= child.mother_id )'
           ;
-is_same_sql_bind(
-  $sa->_recurse_from(@j), [],
-  $match, [],
+is_same_sql(
+  $sa->_recurse_from(@j),
+  $match,
   'join 1 ok'
 );
 
@@ -64,9 +52,9 @@
        . ' father.person_id = child.father_id )) ON ( mother.person_id = '
        . 'child.mother_id )'
        ;
-is_same_sql_bind(
-  $sa->_recurse_from(@j2), [],
-  $match, [],
+is_same_sql(
+  $sa->_recurse_from(@j2),
+  $match,
   'join 2 ok'
 );
 
@@ -81,9 +69,9 @@
           . '= child.mother_id )'
           ;
 
-is_same_sql_bind(
-  $sa->_recurse_from(@j3), [],
-  $match, [],
+is_same_sql(
+  $sa->_recurse_from(@j3),
+  $match,
   'join 3 (inner join) ok'
 );
 
@@ -101,9 +89,9 @@
        . ' father.person_id = child.father_id )) ON ( mother.person_id = '
        . 'child.mother_id )'
        ;
-is_same_sql_bind(
-  $sa->_recurse_from(@j4), [],
-  $match, [],
+is_same_sql(
+  $sa->_recurse_from(@j4),
+  $match,
   'join 4 (nested joins + join types) ok'
 );
 
@@ -116,9 +104,9 @@
           . 'child.father_id ) JOIN person mother ON ( mother.person_id '
           . '= child.mother_id )'
           ;
-is_same_sql_bind(
-  $sa->_recurse_from(@j5), [],
-  $match, [],
+is_same_sql(
+  $sa->_recurse_from(@j5),
+  $match,
   'join 5 (SCALAR reference for ON statement) ok'
 );
 
@@ -127,7 +115,7 @@
     [ { father => 'person' }, { 'father.person_id' => { '!=', '42' } }, ],
     [ { mother => 'person' }, { 'mother.person_id' => 'child.mother_id' } ],
 );
-$match = qr/^HASH reference arguments are not supported in JOINS - try using "\.\.\." instead/;
+$match = qr/HASH reference arguments are not supported in JOINS/;
 eval { $sa->_recurse_from(@j6) };
 like( $@, $match, 'join 6 (HASH reference for ON statement dies) ok' );
 
@@ -140,7 +128,7 @@
                          ] ] }
          );
 
-cmp_ok( $rs + 0, '==', 1, "Single record in resultset");
+is( $rs + 0, 1, "Single record in resultset");
 
 is($rs->first->title, 'Forkful of bees', 'Correct record returned');
 
@@ -148,7 +136,7 @@
            { 'year' => 2001, 'artist.name' => 'Caterwauler McCrae' },
            { join => 'artist' });
 
-cmp_ok( $rs + 0, '==', 1, "Single record in resultset");
+is( $rs + 0, 1, "Single record in resultset");
 
 is($rs->first->title, 'Forkful of bees', 'Correct record returned');
 
@@ -157,7 +145,7 @@
              'liner_notes.notes' => 'Kill Yourself!' },
            { join => [ qw/artist liner_notes/ ] });
 
-cmp_ok( $rs + 0, '==', 1, "Single record in resultset");
+is( $rs + 0, 1, "Single record in resultset");
 
 is($rs->first->title, 'Come Be Depressed With Us', 'Correct record returned');
 
@@ -166,7 +154,7 @@
     { 'artist' => 1 },
     { join => [qw/artist/], order_by => 'artist.name' }
 );
-cmp_ok( scalar $rs->all, '==', scalar $rs->slice(0, $rs->count - 1), 'slice() with join has same count as all()' );
+is( scalar $rs->all, scalar $rs->slice(0, $rs->count - 1), 'slice() with join has same count as all()' );
 
 ok(!$rs->slice($rs->count+1000, $rs->count+1002)->count,
   'Slicing beyond end of rs returns a zero count');
@@ -175,32 +163,83 @@
         { 'liner_notes.notes' => 'Kill Yourself!' },
         { join => { 'cds' => 'liner_notes' } });
 
-cmp_ok( $rs->count, '==', 1, "Single record in resultset");
+is( $rs->count, 1, "Single record in resultset");
 
 is($rs->first->name, 'We Are Goth', 'Correct record returned');
 
-# test for warnings on delete of joined resultset
-$rs = $schema->resultset("CD")->search(
-    { 'artist.name' => 'Caterwauler McCrae' },
-    { join => [qw/artist/]}
-);
-my $tst_delete_warning;
-eval {
-    local $SIG{__WARN__} = sub { $tst_delete_warning = shift };
-    $rs->delete();
-};
 
-ok( ($@ || $tst_delete_warning), 'fail/warning on attempt to delete a join-ed resultset');
+{
+    $schema->populate('Artist', [
+        [ qw/artistid name/ ],
+        [ 4, 'Another Boy Band' ],
+    ]);
+    $schema->populate('CD', [
+        [ qw/cdid artist title year/ ],
+        [ 6, 2, "Greatest Hits", 2001 ],
+        [ 7, 4, "Greatest Hits", 2005 ],
+        [ 8, 4, "BoyBandBlues", 2008 ],
+    ]);
+    $schema->populate('TwoKeys', [
+        [ qw/artist cd/ ],
+        [ 2, 4 ],
+        [ 2, 6 ],
+        [ 4, 7 ],
+        [ 4, 8 ],
+    ]);
+    
+    sub cd_count {
+        return $schema->resultset("CD")->count;
+    }
+    sub tk_count {
+        return $schema->resultset("TwoKeys")->count;
+    }
 
-# test for warnings on update of joined resultset
-$rs = $schema->resultset("CD")->search(
-    { 'artist.name' => 'Random Boy Band' },
-    { join => [qw/artist/]}
-);
-my $tst_update_warning;
-eval {
-    local $SIG{__WARN__} = sub { $tst_update_warning = shift };
-    $rs->update({ 'artist' => 1 });
-};
+    is(cd_count(), 8, '8 rows in table cd');
+    is(tk_count(), 7, '7 rows in table twokeys');
+ 
+    sub artist1 {
+        return $schema->resultset("CD")->search(
+            { 'artist.name' => 'Caterwauler McCrae' },
+            { join => [qw/artist/]}
+        );
+    }
+    sub artist2 {
+        return $schema->resultset("CD")->search(
+            { 'artist.name' => 'Random Boy Band' },
+            { join => [qw/artist/]}
+        );
+    }
 
-ok( ($@ || $tst_update_warning), 'fail/warning on attempt to update a join-ed resultset');
+    is( artist1()->count, 3, '3 Caterwauler McCrae CDs' );
+    ok( artist1()->delete, 'Successfully deleted 3 CDs' );
+    is( artist1()->count, 0, '0 Caterwauler McCrae CDs' );
+    is( artist2()->count, 2, '3 Random Boy Band CDs' );
+    ok( artist2()->update( { 'artist' => 1 } ) );
+    is( artist2()->count, 0, '0 Random Boy Band CDs' );
+    is( artist1()->count, 2, '2 Caterwauler McCrae CDs' );
+
+    # test update on multi-column-pk
+    sub tk1 {
+        return $schema->resultset("TwoKeys")->search(
+            {
+                'artist.name' => { like => '%Boy Band' },
+                'cd.title'    => 'Greatest Hits',
+            },
+            { join => [qw/artist cd/] }
+        );
+    }
+    sub tk2 {
+        return $schema->resultset("TwoKeys")->search(
+            { 'artist.name' => 'Caterwauler McCrae' },
+            { join => [qw/artist/]}
+        );
+    }
+    is( tk2()->count, 2, 'TwoKeys count == 2' );
+    is( tk1()->count, 2, 'TwoKeys count == 2' );
+    ok( tk1()->update( { artist => 1 } ) );
+    is( tk1()->count, 0, 'TwoKeys count == 0' );
+    is( tk2()->count, 4, '2 Caterwauler McCrae CDs' );
+    ok( tk2()->delete, 'Successfully deleted 4 CDs' );
+    is(cd_count(), 5, '5 rows in table cd');
+    is(tk_count(), 3, '3 rows in table twokeys');
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/76joins.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/76select.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/76select.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/76select.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -5,10 +5,11 @@
 use Test::Exception;
 use lib qw(t/lib);
 use DBICTest;
+use DBIC::SqlMakerTest;
 
 my $schema = DBICTest->init_schema();
 
-plan tests => 12;
+plan tests => 24;
 
 my $rs = $schema->resultset('CD')->search({},
     {
@@ -28,6 +29,16 @@
 lives_ok(sub { $rs->first->get_column('count') }, 'multiple +select/+as columns, 1st rscolumn present');
 lives_ok(sub { $rs->first->get_column('addedtitle') }, 'multiple +select/+as columns, 2nd rscolumn present');
 
+# Tests a regression in ResultSetColumn wrt +select
+$rs = $schema->resultset('CD')->search(undef,
+    {
+        '+select'   => [ \'COUNT(*) AS year_count' ],
+		order_by => 'year_count'
+	}
+);
+my @counts = $rs->get_column('cdid')->all;
+ok(scalar(@counts), 'got rows from ->all using +select');
+
 $rs = $schema->resultset('CD')->search({},
     {
         '+select'   => [ \ 'COUNT(*)', 'title' ],
@@ -63,3 +74,124 @@
 is ($subsel->next->title, $cds->next->title, 'Second CD title match');
 
 is($schema->resultset('CD')->current_source_alias, "me", '$rs->current_source_alias returns "me"');
+
+
+
+$rs = $schema->resultset('CD')->search({},
+    {
+        'join' => 'artist',
+        'columns' => ['cdid', 'title', 'artist.name'],
+    }
+);
+
+is_same_sql_bind (
+  $rs->as_query,
+  '(SELECT me.cdid, me.title, artist.name FROM cd me  JOIN artist artist ON artist.artistid = me.artist)',
+  [],
+  'Use of columns attribute results in proper sql'
+);
+
+lives_ok(sub {
+  $rs->first->get_column('cdid')
+}, 'columns 1st rscolumn present');
+
+lives_ok(sub {
+  $rs->first->get_column('title')
+}, 'columns 2nd rscolumn present');
+
+lives_ok(sub {
+  $rs->first->artist->get_column('name') 
+}, 'columns 3rd rscolumn present'); 
+
+
+
+$rs = $schema->resultset('CD')->search({},
+    {  
+        'join' => 'artist',
+        '+columns' => ['cdid', 'title', 'artist.name'],
+    }
+);
+
+is_same_sql_bind (
+  $rs->as_query,
+  '(SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track, me.cdid, me.title, artist.name FROM cd me  JOIN artist artist ON artist.artistid = me.artist)',
+  [],
+  'Use of columns attribute results in proper sql'
+);
+
+lives_ok(sub {
+  $rs->first->get_column('cdid') 
+}, 'columns 1st rscolumn present');
+
+lives_ok(sub {
+  $rs->first->get_column('title')
+}, 'columns 2nd rscolumn present');
+
+lives_ok(sub {
+  $rs->first->artist->get_column('name')
+}, 'columns 3rd rscolumn present');
+
+
+$rs = $schema->resultset('CD')->search({'tracks.position' => { -in => [2] } },
+  {
+    join => 'tracks',
+    columns => [qw/me.cdid me.title/],
+    '+select' => ['tracks.position'],
+    '+as' => ['track_position'],
+
+    # get a hashref of CD1 only (the first with a second track)
+    result_class => 'DBIx::Class::ResultClass::HashRefInflator',
+    order_by => 'cdid',
+    rows => 1,
+  }
+);
+
+is_deeply (
+  $rs->single,
+  {
+    cdid => 1,
+    track_position => 2,
+    title => 'Spoonful of bees',
+  },
+  'limited prefetch via column works on a multi-relationship',
+);
+
+my $sub_rs = $rs->search ({},
+  {
+    columns => [qw/artist tracks.trackid/],    # columns should not be merged but override $rs columns
+    '+select' => ['tracks.title'],
+    '+as' => ['tracks.title'],
+  }
+);
+
+is_deeply (
+  $sub_rs->single,
+  {
+    artist => 1,
+    track_position => 2,
+    tracks =>
+      {
+        trackid => 17,
+        title => 'Apiary',
+      },
+  },
+  'columns/select/as fold properly on sub-searches',
+);
+
+TODO: {
+  local $TODO = "Multi-collapsing still doesn't work right - HRI should be getting an arrayref, not an individual hash";
+  is_deeply (
+    $sub_rs->single,
+    {
+      artist => 1,
+      track_position => 2,
+      tracks => [
+        {
+          trackid => 17,
+          title => 'Apiary',
+        },
+      ],
+    },
+    'columns/select/as fold properly on sub-searches',
+  );
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/76select.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/77join_count.t
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: DBIx-Class/0.08/branches/sybase_noquote/t/77prefetch.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/77prefetch.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/77prefetch.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,485 +0,0 @@
-use strict;
-use warnings;  
-
-use Test::More;
-use Test::Exception;
-use lib qw(t/lib);
-use DBICTest;
-use Data::Dumper;
-
-my $schema = DBICTest->init_schema();
-
-my $orig_debug = $schema->storage->debug;
-
-use IO::File;
-
-BEGIN {
-    eval "use DBD::SQLite";
-    plan $@
-        ? ( skip_all => 'needs DBD::SQLite for testing' )
-        : ( tests => 74 );
-}
-
-# figure out if we've got a version of sqlite that is older than 3.2.6, in
-# which case COUNT(DISTINCT()) doesn't work
-my $is_broken_sqlite = 0;
-my ($sqlite_major_ver,$sqlite_minor_ver,$sqlite_patch_ver) =
-    split /\./, $schema->storage->dbh->get_info(18);
-if( $schema->storage->dbh->get_info(17) eq 'SQLite' &&
-    ( ($sqlite_major_ver < 3) ||
-      ($sqlite_major_ver == 3 && $sqlite_minor_ver < 2) ||
-      ($sqlite_major_ver == 3 && $sqlite_minor_ver == 2 && $sqlite_patch_ver < 6) ) ) {
-    $is_broken_sqlite = 1;
-}
-
-# bug in 0.07000 caused attr (join/prefetch) to be modifed by search
-# so we check the search & attr arrays are not modified
-my $search = { 'artist.name' => 'Caterwauler McCrae' };
-my $attr = { prefetch => [ qw/artist liner_notes/ ],
-             order_by => 'me.cdid' };
-my $search_str = Dumper($search);
-my $attr_str = Dumper($attr);
-
-my $rs = $schema->resultset("CD")->search($search, $attr);
-
-is(Dumper($search), $search_str, 'Search hash untouched after search()');
-is(Dumper($attr), $attr_str, 'Attribute hash untouched after search()');
-cmp_ok($rs + 0, '==', 3, 'Correct number of records returned');
-
-# A search() with prefetch seems to pollute an already joined resultset
-# in a way that offsets future joins (adapted from a test case by Debolaz)
-{
-  my ($cd_rs, $attrs);
-
-  # test a real-life case - rs is obtained by an implicit m2m join
-  $cd_rs = $schema->resultset ('Producer')->first->cds;
-  $attrs = Dumper $cd_rs->{attrs};
-
-  $cd_rs->search ({})->all;
-  is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after a simple search');
-
-  lives_ok (sub {
-    $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all;
-    is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after search with prefetch');
-  }, 'first prefetching search ok');
-
-  lives_ok (sub {
-    $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all;
-    is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after another search with prefetch')
-  }, 'second prefetching search ok');
-
-
-  # test a regular rs with an empty seen_join injected - it should still work!
-  $cd_rs = $schema->resultset ('CD');
-  $cd_rs->{attrs}{seen_join}  = {};
-  $attrs = Dumper $cd_rs->{attrs};
-
-  $cd_rs->search ({})->all;
-  is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after a simple search');
-
-  lives_ok (sub {
-    $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all;
-    is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after search with prefetch');
-  }, 'first prefetching search ok');
-
-  lives_ok (sub {
-    $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all;
-    is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after another search with prefetch')
-  }, 'second prefetching search ok');
-}
-
-
-my $queries = 0;
-$schema->storage->debugcb(sub { $queries++; });
-$schema->storage->debug(1);
-
-my @cd = $rs->all;
-
-is($cd[0]->title, 'Spoonful of bees', 'First record returned ok');
-
-ok(!defined $cd[0]->liner_notes, 'No prefetch for NULL LEFT join');
-
-is($cd[1]->{_relationship_data}{liner_notes}->notes, 'Buy Whiskey!', 'Prefetch for present LEFT JOIN');
-
-is(ref $cd[1]->liner_notes, 'DBICTest::LinerNotes', 'Prefetch returns correct class');
-
-is($cd[2]->{_inflated_column}{artist}->name, 'Caterwauler McCrae', 'Prefetch on parent object ok');
-
-is($queries, 1, 'prefetch ran only 1 select statement');
-
-$schema->storage->debug($orig_debug);
-$schema->storage->debugobj->callback(undef);
-
-# test for partial prefetch via columns attr
-my $cd = $schema->resultset('CD')->find(1,
-    {
-      columns => [qw/title artist artist.name/], 
-      join => { 'artist' => {} }
-    }
-);
-ok(eval { $cd->artist->name eq 'Caterwauler McCrae' }, 'single related column prefetched');
-
-# start test for nested prefetch SELECT count
-$queries = 0;
-$schema->storage->debugcb(sub { $queries++ });
-$schema->storage->debug(1);
-
-$rs = $schema->resultset('Tag')->search(
-  {},
-  {
-    prefetch => { cd => 'artist' }
-  }
-);
-
-my $tag = $rs->first;
-
-is( $tag->cd->title, 'Spoonful of bees', 'step 1 ok for nested prefetch' );
-
-is( $tag->cd->artist->name, 'Caterwauler McCrae', 'step 2 ok for nested prefetch');
-
-# count the SELECTs
-#$selects++ if /SELECT(?!.*WHERE 1=0.*)/;
-is($queries, 1, 'nested prefetch ran exactly 1 select statement (excluding column_info)');
-
-$queries = 0;
-
-is($tag->search_related('cd')->search_related('artist')->first->name,
-   'Caterwauler McCrae',
-   'chained belongs_to->belongs_to search_related ok');
-
-is($queries, 0, 'chained search_related after belontgs_to->belongs_to prefetch ran no queries');
-
-$queries = 0;
-
-$cd = $schema->resultset('CD')->find(1, { prefetch => 'artist' });
-
-is($cd->{_inflated_column}{artist}->name, 'Caterwauler McCrae', 'artist prefetched correctly on find');
-
-is($queries, 1, 'find with prefetch ran exactly 1 select statement (excluding column_info)');
-
-$queries = 0;
-
-$schema->storage->debugcb(sub { $queries++; });
-
-$cd = $schema->resultset('CD')->find(1, { prefetch => { cd_to_producer => 'producer' } });
-
-is($cd->producers->first->name, 'Matt S Trout', 'many_to_many accessor ok');
-
-is($queries, 1, 'many_to_many accessor with nested prefetch ran exactly 1 query');
-
-$queries = 0;
-
-my $producers = $cd->search_related('cd_to_producer')->search_related('producer');
-
-is($producers->first->name, 'Matt S Trout', 'chained many_to_many search_related ok');
-
-is($queries, 0, 'chained search_related after many_to_many prefetch ran no queries');
-
-$schema->storage->debug($orig_debug);
-$schema->storage->debugobj->callback(undef);
-
-$rs = $schema->resultset('Tag')->search(
-  {},
-  {
-    join => { cd => 'artist' },
-    prefetch => { cd => 'artist' }
-  }
-);
-
-cmp_ok( $rs->count, '>=', 0, 'nested prefetch does not duplicate joins' );
-
-my ($artist) = $schema->resultset("Artist")->search({ 'cds.year' => 2001 },
-                 { order_by => 'artistid DESC', join => 'cds' });
-
-is($artist->name, 'Random Boy Band', "Join search by object ok");
-
-my @cds = $schema->resultset("CD")->search({ 'liner_notes.notes' => 'Buy Merch!' },
-                               { join => 'liner_notes' });
-
-cmp_ok(scalar @cds, '==', 1, "Single CD retrieved via might_have");
-
-is($cds[0]->title, "Generic Manufactured Singles", "Correct CD retrieved");
-
-my @artists = $schema->resultset("Artist")->search({ 'tags.tag' => 'Shiny' },
-                                       { join => { 'cds' => 'tags' } });
-
-cmp_ok( @artists, '==', 2, "two-join search ok" );
-
-$rs = $schema->resultset("CD")->search(
-  {},
-  { group_by => [qw/ title me.cdid /] }
-);
-
-SKIP: {
-    skip "SQLite < 3.2.6 doesn't understand COUNT(DISTINCT())", 1
-        if $is_broken_sqlite;
-    cmp_ok( $rs->count, '==', 5, "count() ok after group_by on main pk" );
-}
-
-cmp_ok( scalar $rs->all, '==', 5, "all() returns same count as count() after group_by on main pk" );
-
-$rs = $schema->resultset("CD")->search(
-  {},
-  { join => [qw/ artist /], group_by => [qw/ artist.name /] }
-);
-
-SKIP: {
-    skip "SQLite < 3.2.6 doesn't understand COUNT(DISTINCT())", 1
-        if $is_broken_sqlite;
-    cmp_ok( $rs->count, '==', 3, "count() ok after group_by on related column" );
-}
-
-$rs = $schema->resultset("Artist")->search(
-  {},
-      { join => [qw/ cds /], group_by => [qw/ me.name /], having =>{ 'MAX(cds.cdid)'=> \'< 5' } }
-);
-
-cmp_ok( $rs->all, '==', 2, "results ok after group_by on related column with a having" );
-
-$rs = $rs->search( undef, {  having =>{ 'count(*)'=> \'> 2' }});
-
-cmp_ok( $rs->all, '==', 1, "count() ok after group_by on related column with a having" );
-
-$rs = $schema->resultset("Artist")->search(
-        { 'cds.title' => 'Spoonful of bees',
-          'cds_2.title' => 'Forkful of bees' },
-        { join => [ 'cds', 'cds' ] });
-
-SKIP: {
-    skip "SQLite < 3.2.6 doesn't understand COUNT(DISTINCT())", 1
-        if $is_broken_sqlite;
-    cmp_ok($rs->count, '==', 1, "single artist returned from multi-join");
-}
-
-is($rs->next->name, 'Caterwauler McCrae', "Correct artist returned");
-
-$cd = $schema->resultset('Artist')->first->create_related('cds',
-    {
-    title   => 'Unproduced Single',
-    year    => 2007
-});
-
-my $left_join = $schema->resultset('CD')->search(
-    { 'me.cdid' => $cd->cdid },
-    { prefetch => { cd_to_producer => 'producer' } }
-);
-
-cmp_ok($left_join, '==', 1, 'prefetch with no join record present');
-
-$queries = 0;
-$schema->storage->debugcb(sub { $queries++ });
-$schema->storage->debug(1);
-
-my $tree_like =
-     $schema->resultset('TreeLike')->find(5,
-       { join     => { parent => { parent => 'parent' } },
-         prefetch => { parent => { parent => 'parent' } } });
-
-is($tree_like->name, 'quux', 'Bottom of tree ok');
-$tree_like = $tree_like->parent;
-is($tree_like->name, 'baz', 'First level up ok');
-$tree_like = $tree_like->parent;
-is($tree_like->name, 'bar', 'Second level up ok');
-$tree_like = $tree_like->parent;
-is($tree_like->name, 'foo', 'Third level up ok');
-
-$schema->storage->debug($orig_debug);
-$schema->storage->debugobj->callback(undef);
-
-cmp_ok($queries, '==', 1, 'Only one query run');
-
-$tree_like = $schema->resultset('TreeLike')->search({'me.id' => 2});
-$tree_like = $tree_like->search_related('children')->search_related('children')->search_related('children')->first;
-is($tree_like->name, 'quux', 'Tree search_related ok');
-
-$tree_like = $schema->resultset('TreeLike')->search_related('children',
-    { 'children.id' => 3, 'children_2.id' => 4 },
-    { prefetch => { children => 'children' } }
-  )->first;
-is(eval { $tree_like->children->first->children->first->name }, 'quux',
-   'Tree search_related with prefetch ok');
-
-$tree_like = eval { $schema->resultset('TreeLike')->search(
-    { 'children.id' => 3, 'children_2.id' => 6 }, 
-    { join => [qw/children children/] }
-  )->search_related('children', { 'children_4.id' => 7 }, { prefetch => 'children' }
-  )->first->children->first; };
-is(eval { $tree_like->name }, 'fong', 'Tree with multiple has_many joins ok');
-
-# test that collapsed joins don't get a _2 appended to the alias
-
-my $sql = '';
-$schema->storage->debugcb(sub { $sql = $_[1] });
-$schema->storage->debug(1);
-
-eval {
-  my $row = $schema->resultset('Artist')->search_related('cds', undef, {
-    join => 'tracks',
-    prefetch => 'tracks',
-  })->search_related('tracks')->first;
-};
-
-like( $sql, qr/^SELECT tracks_2\.trackid/, "join not collapsed for search_related" );
-
-$schema->storage->debug($orig_debug);
-$schema->storage->debugobj->callback(undef);
-
-$rs = $schema->resultset('Artist');
-$rs->create({ artistid => 4, name => 'Unknown singer-songwriter' });
-$rs->create({ artistid => 5, name => 'Emo 4ever' });
- at artists = $rs->search(undef, { prefetch => 'cds', order_by => 'artistid' });
-is(scalar @artists, 5, 'has_many prefetch with adjacent empty rows ok');
-
-# -------------
-#
-# Tests for multilevel has_many prefetch
-
-# artist resultsets - with and without prefetch
-my $art_rs = $schema->resultset('Artist');
-my $art_rs_pr = $art_rs->search(
-    {},
-    {
-        join     => [ { cds => ['tracks'] } ],
-        prefetch => [ { cds => ['tracks'] } ],
-        cache    => 1 # last test needs this
-    }
-);
-
-# This test does the same operation twice - once on a
-# set of items fetched from the db with no prefetch of has_many rels
-# The second prefetches 2 levels of has_many
-# We check things are the same by comparing the name or title
-# we build everything into a hash structure and compare the one
-# from each rs to see what differs
-
-sub make_hash_struc {
-    my $rs = shift;
-
-    my $struc = {};
-    foreach my $art ( $rs->all ) {
-        foreach my $cd ( $art->cds ) {
-            foreach my $track ( $cd->tracks ) {
-                $struc->{ $art->name }{ $cd->title }{ $track->title }++;
-            }
-        }
-    }
-    return $struc;
-}
-
-$queries = 0;
-$schema->storage->debugcb(sub { $queries++ });
-$schema->storage->debug(1);
-
-my $prefetch_result = make_hash_struc($art_rs_pr);
-
-is($queries, 1, 'nested prefetch across has_many->has_many ran exactly 1 query');
-
-my $nonpre_result   = make_hash_struc($art_rs);
-
-is_deeply( $prefetch_result, $nonpre_result,
-    'Compare 2 level prefetch result to non-prefetch result' );
-
-$queries = 0;
-
-is($art_rs_pr->search_related('cds')->search_related('tracks')->first->title,
-   'Fowlin',
-   'chained has_many->has_many search_related ok'
-  );
-
-is($queries, 0, 'chained search_related after has_many->has_many prefetch ran no queries');
-
-# once the following TODO is complete, remove the 2 warning tests immediately after the TODO block
-# (the TODO block itself contains tests ensuring that the warns are removed)
-TODO: {
-    local $TODO = 'Prefetch of multiple has_many rels at the same level (currently warn to protect the clueless git)';
-
-    #( 1 -> M + M )
-    my $cd_rs = $schema->resultset('CD')->search ({ 'me.title' => 'Forkful of bees' });
-    my $pr_cd_rs = $cd_rs->search ({}, {
-        prefetch => [qw/tracks tags/],
-    });
-
-    my $tracks_rs = $cd_rs->first->tracks;
-    my $tracks_count = $tracks_rs->count;
-
-    my ($pr_tracks_rs, $pr_tracks_count);
-
-    $queries = 0;
-    $schema->storage->debugcb(sub { $queries++ });
-    $schema->storage->debug(1);
-
-    my $o_mm_warn;
-    {
-        local $SIG{__WARN__} = sub { $o_mm_warn = shift };
-        $pr_tracks_rs = $pr_cd_rs->first->tracks;
-    };
-    $pr_tracks_count = $pr_tracks_rs->count;
-
-    ok(! $o_mm_warn, 'no warning on attempt to prefetch several same level has_many\'s (1 -> M + M)');
-
-    is($queries, 1, 'prefetch one->(has_many,has_many) ran exactly 1 query');
-    is($pr_tracks_count, $tracks_count, 'equal count of prefetched relations over several same level has_many\'s (1 -> M + M)');
-
-    for ($pr_tracks_rs, $tracks_rs) {
-        $_->result_class ('DBIx::Class::ResultClass::HashRefInflator');
-    }
-
-    is_deeply ([$pr_tracks_rs->all], [$tracks_rs->all], 'same structure returned with and without prefetch over several same level has_many\'s (1 -> M + M)');
-
-    #( M -> 1 -> M + M )
-    my $note_rs = $schema->resultset('LinerNotes')->search ({ notes => 'Buy Whiskey!' });
-    my $pr_note_rs = $note_rs->search ({}, {
-        prefetch => {
-            cd => [qw/tags tracks/]
-        },
-    });
-
-    my $tags_rs = $note_rs->first->cd->tags;
-    my $tags_count = $tags_rs->count;
-
-    my ($pr_tags_rs, $pr_tags_count);
-
-    $queries = 0;
-    $schema->storage->debugcb(sub { $queries++ });
-    $schema->storage->debug(1);
-
-    my $m_o_mm_warn;
-    {
-        local $SIG{__WARN__} = sub { $m_o_mm_warn = shift };
-        $pr_tags_rs = $pr_note_rs->first->cd->tags;
-    };
-    $pr_tags_count = $pr_tags_rs->count;
-
-    ok(! $m_o_mm_warn, 'no warning on attempt to prefetch several same level has_many\'s (M -> 1 -> M + M)');
-
-    is($queries, 1, 'prefetch one->(has_many,has_many) ran exactly 1 query');
-
-    is($pr_tags_count, $tags_count, 'equal count of prefetched relations over several same level has_many\'s (M -> 1 -> M + M)');
-
-    for ($pr_tags_rs, $tags_rs) {
-        $_->result_class ('DBIx::Class::ResultClass::HashRefInflator');
-    }
-
-    is_deeply ([$pr_tags_rs->all], [$tags_rs->all], 'same structure returned with and without prefetch over several same level has_many\'s (M -> 1 -> M + M)');
-};
-
-# remove this closure once the TODO above is working
-my $w;
-{
-    local $SIG{__WARN__} = sub { $w = shift };
-
-    my $rs = $schema->resultset('CD')->search ({ 'me.title' => 'Forkful of bees' }, { prefetch => [qw/tracks tags/] });
-    for (qw/all count next first/) {
-        undef $w;
-        my @stuff = $rs->search()->$_;
-        like ($w, qr/will currently disrupt both the functionality of .rs->count\(\), and the amount of objects retrievable via .rs->next\(\)/,
-            "warning on ->$_ attempt prefetching several same level has_manys (1 -> M + M)");
-    }
-    my $rs2 = $schema->resultset('LinerNotes')->search ({ notes => 'Buy Whiskey!' }, { prefetch => { cd => [qw/tags tracks/] } });
-    for (qw/all count next first/) {
-        undef $w;
-        my @stuff = $rs2->search()->$_;
-        like ($w, qr/will currently disrupt both the functionality of .rs->count\(\), and the amount of objects retrievable via .rs->next\(\)/,
-            "warning on ->$_ attempt prefetching several same level has_manys (M -> 1 -> M + M)");
-    }
-}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/78self_referencial.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/79aliasing.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/80unique.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/80unique.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/80unique.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -7,7 +7,7 @@
 
 my $schema = DBICTest->init_schema();
 
-plan tests => 45;
+plan tests => 49;
 
 # Check the defined unique constraints
 is_deeply(
@@ -183,3 +183,30 @@
   ok($cd->in_storage, 'find correctly grepped the key across a relationship');
   is($cd->cdid, 1, 'cdid is correct');
 }
+
+# Test update_or_new
+{
+    my $cd1 = $schema->resultset('CD')->update_or_new(
+      {
+        artist => $artistid,
+        title  => "SuperHits $$",
+        year   => 2007,
+      },
+      { key => 'cd_artist_title' }
+    );
+
+    ok(!$cd1->in_storage, 'CD is not in storage yet after update_or_new');
+    $cd1->insert;
+    ok($cd1->in_storage, 'CD got added to strage after update_or_new && insert');
+
+    my $cd2 = $schema->resultset('CD')->update_or_new(
+      {
+        artist => $artistid,
+        title  => "SuperHits $$",
+        year   => 2008,
+      },
+      { key => 'cd_artist_title' }
+    );
+    ok($cd2->in_storage, 'Updating year using update_or_new was successful');
+    is($cd2->id, $cd1->id, 'Got the same CD using update_or_new');
+}
\ No newline at end of file


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/80unique.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/81transactions.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/81transactions.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/81transactions.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -272,7 +272,7 @@
 
   ok(!$artist_rs->find({name => 'Death Cab for Cutie'}), "Artist not created");
 
-  eval {
+  lives_ok (sub {
     my $w;
     local $SIG{__WARN__} = sub { $w = shift };
 
@@ -281,32 +281,27 @@
     outer($schema, 0);
 
     like ($w, qr/A DBIx::Class::Storage::TxnScopeGuard went out of scope without explicit commit or an error/, 'Out of scope warning detected');
-  };
+    ok(!$artist_rs->find({name => 'Death Cab for Cutie'}), "Artist not created");
+  }, 'rollback successful withot exception');
 
-  local $TODO = "Work out how this should work";
-  is($@, "Not sure what we want here, but something", "Rollback okay");
-
-  ok(!$artist_rs->find({name => 'Death Cab for Cutie'}), "Artist not created");
-
   sub outer {
     my ($schema) = @_;
-   
+
     my $guard = $schema->txn_scope_guard;
     $schema->resultset('Artist')->create({
       name => 'Death Cab for Cutie',
     });
     inner(@_);
-    $guard->commit;
   }
 
   sub inner {
     my ($schema, $fatal) = @_;
-    my $guard = $schema->txn_scope_guard;
 
+    my $inner_guard = $schema->txn_scope_guard;
+    is($schema->storage->transaction_depth, 2, "Correct transaction depth");
+
     my $artist = $artist_rs->find({ name => 'Death Cab for Cutie' });
 
-    is($schema->storage->transaction_depth, 2, "Correct transaction depth");
-    undef $@;
     eval {
       $artist->cds->create({ 
         title => 'Plans',
@@ -320,6 +315,7 @@
       die $@;
     }
 
-    # See what happens if we dont $guard->commit;
+    # inner guard should commit without consequences
+    $inner_guard->commit;
   }
 }


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/81transactions.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/82cascade_copy.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/82cascade_copy.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/82cascade_copy.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -11,15 +11,8 @@
 my $artist = $schema->resultset('Artist')->find(1);
 my $artist_cds = $artist->search_related('cds');
 
-my $cover_band;
+my $cover_band = $artist->copy;
 
-{
-  no warnings qw(redefine once);
-  local *DBICTest::Artist::result_source_instance = \&DBICTest::Schema::Artist::result_source_instance;
-
-  $cover_band = $artist->copy;
-}
-
 my $cover_cds = $cover_band->search_related('cds');
 cmp_ok($cover_band->id, '!=', $artist->id, 'ok got new column id...');
 is($cover_cds->count, $artist_cds->count, 'duplicated rows count ok');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/82cascade_copy.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/83cache.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/83cache.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/83cache.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -83,7 +83,7 @@
 $rs->reset();
 
 # make sure artist contains a related resultset for cds
-is( ref $artist->{related_resultsets}->{cds}, 'DBIx::Class::ResultSet', 'artist has a related_resultset for cds' );
+isa_ok( $artist->{related_resultsets}{cds}, 'DBIx::Class::ResultSet', 'artist has a related_resultset for cds' );
 
 # check if $artist->cds->get_cache is populated
 is( scalar @{$artist->cds->get_cache}, 3, 'cache for artist->cds contains correct number of records');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/83cache.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/84serialize.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/85utf8.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/86might_have.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/86sqlt.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/87ordered.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/88result_set_column.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/89dbicadmin.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/89dbicadmin.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/89dbicadmin.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -21,7 +21,6 @@
 
 plan tests => $tests_per_run * @json_backends;
 
-use JSON::Any;
 for my $js (@json_backends) {
 
     eval {JSON::Any->import ($js) };


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/89dbicadmin.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/89inflate_datetime.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/89inflate_datetime.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/89inflate_datetime.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -5,13 +5,21 @@
 use lib qw(t/lib);
 use DBICTest;
 
+{
+  local $SIG{__WARN__} = sub { warn @_ if $_[0] !~ /extra \=\> .+? has been deprecated/ };
+  DBICTest::Schema->load_classes('EventTZDeprecated');
+  DBICTest::Schema->load_classes('EventTZPg');
+}
+
 my $schema = DBICTest->init_schema();
 
-eval { require DateTime::Format::MySQL };
-plan skip_all => "Need DateTime::Format::MySQL for inflation tests" if $@;
+plan tests => 53;
 
-plan tests => 32;
+SKIP: {
+  eval { require DateTime::Format::MySQL };
+  skip "Need DateTime::Format::MySQL for inflation tests", 50  if $@;
 
+
 # inflation test
 my $event = $schema->resultset("Event")->find(1);
 
@@ -52,75 +60,78 @@
 
 
 # Test "timezone" parameter
-my $event_tz = $schema->resultset('EventTZ')->create({
-    starts_at => DateTime->new(year=>2007, month=>12, day=>31, time_zone => "America/Chicago" ),
-    created_on => DateTime->new(year=>2006, month=>1, day=>31,
-        hour => 13, minute => 34, second => 56, time_zone => "America/New_York" ),
-});
 
-is ($event_tz->starts_at->day_name, "Montag", 'Locale de_DE loaded: day_name');
-is ($event_tz->starts_at->month_name, "Dezember", 'Locale de_DE loaded: month_name');
-is ($event_tz->created_on->day_name, "Tuesday", 'Default locale loaded: day_name');
-is ($event_tz->created_on->month_name, "January", 'Default locale loaded: month_name');
+foreach my $tbl (qw/EventTZ EventTZDeprecated/) {
+  my $event_tz = $schema->resultset($tbl)->create({
+      starts_at => DateTime->new(year=>2007, month=>12, day=>31, time_zone => "America/Chicago" ),
+      created_on => DateTime->new(year=>2006, month=>1, day=>31,
+          hour => 13, minute => 34, second => 56, time_zone => "America/New_York" ),
+  });
 
-my $starts_at = $event_tz->starts_at;
-is("$starts_at", '2007-12-31T00:00:00', 'Correct date/time using timezone');
+  is ($event_tz->starts_at->day_name, "Montag", 'Locale de_DE loaded: day_name');
+  is ($event_tz->starts_at->month_name, "Dezember", 'Locale de_DE loaded: month_name');
+  is ($event_tz->created_on->day_name, "Tuesday", 'Default locale loaded: day_name');
+  is ($event_tz->created_on->month_name, "January", 'Default locale loaded: month_name');
 
-my $created_on = $event_tz->created_on;
-is("$created_on", '2006-01-31T12:34:56', 'Correct timestamp using timezone');
-is($event_tz->created_on->time_zone->name, "America/Chicago", "Correct timezone");
+  my $starts_at = $event_tz->starts_at;
+  is("$starts_at", '2007-12-31T00:00:00', 'Correct date/time using timezone');
 
-my $loaded_event = $schema->resultset('EventTZ')->find( $event_tz->id );
+  my $created_on = $event_tz->created_on;
+  is("$created_on", '2006-01-31T12:34:56', 'Correct timestamp using timezone');
+  is($event_tz->created_on->time_zone->name, "America/Chicago", "Correct timezone");
 
-isa_ok($loaded_event->starts_at, 'DateTime', 'DateTime returned');
-$starts_at = $loaded_event->starts_at;
-is("$starts_at", '2007-12-31T00:00:00', 'Loaded correct date/time using timezone');
-is($starts_at->time_zone->name, 'America/Chicago', 'Correct timezone');
+  my $loaded_event = $schema->resultset($tbl)->find( $event_tz->id );
 
-isa_ok($loaded_event->created_on, 'DateTime', 'DateTime returned');
-$created_on = $loaded_event->created_on;
-is("$created_on", '2006-01-31T12:34:56', 'Loaded correct timestamp using timezone');
-is($created_on->time_zone->name, 'America/Chicago', 'Correct timezone');
+  isa_ok($loaded_event->starts_at, 'DateTime', 'DateTime returned');
+  $starts_at = $loaded_event->starts_at;
+  is("$starts_at", '2007-12-31T00:00:00', 'Loaded correct date/time using timezone');
+  is($starts_at->time_zone->name, 'America/Chicago', 'Correct timezone');
 
-# Test floating timezone warning
-# We expect one warning
-SKIP: {
-    skip "ENV{DBIC_FLOATING_TZ_OK} was set, skipping", 1 if $ENV{DBIC_FLOATING_TZ_OK};
-    local $SIG{__WARN__} = sub {
-        like(
-            shift,
-            qr/You're using a floating timezone, please see the documentation of DBIx::Class::InflateColumn::DateTime for an explanation/,
-            'Floating timezone warning'
-        );
-    };
-    my $event_tz_floating = $schema->resultset('EventTZ')->create({
-        starts_at => DateTime->new(year=>2007, month=>12, day=>31, ),
-        created_on => DateTime->new(year=>2006, month=>1, day=>31,
-            hour => 13, minute => 34, second => 56, ),
-    });
-    delete $SIG{__WARN__};
-};
+  isa_ok($loaded_event->created_on, 'DateTime', 'DateTime returned');
+  $created_on = $loaded_event->created_on;
+  is("$created_on", '2006-01-31T12:34:56', 'Loaded correct timestamp using timezone');
+  is($created_on->time_zone->name, 'America/Chicago', 'Correct timezone');
 
-# This should fail to set
-my $prev_str = "$created_on";
-$loaded_event->update({ created_on => '0000-00-00' });
-is("$created_on", $prev_str, "Don't update invalid dates");
+  # Test floating timezone warning
+  # We expect one warning
+  SKIP: {
+      skip "ENV{DBIC_FLOATING_TZ_OK} was set, skipping", 1 if $ENV{DBIC_FLOATING_TZ_OK};
+      local $SIG{__WARN__} = sub {
+          like(
+              shift,
+              qr/You're using a floating timezone, please see the documentation of DBIx::Class::InflateColumn::DateTime for an explanation/,
+              'Floating timezone warning'
+          );
+      };
+      my $event_tz_floating = $schema->resultset($tbl)->create({
+          starts_at => DateTime->new(year=>2007, month=>12, day=>31, ),
+          created_on => DateTime->new(year=>2006, month=>1, day=>31,
+              hour => 13, minute => 34, second => 56, ),
+      });
+      delete $SIG{__WARN__};
+  };
 
-my $invalid = $schema->resultset('Event')->create({
-    starts_at  => '0000-00-00',
-    created_on => $created_on
-});
+  # This should fail to set
+  my $prev_str = "$created_on";
+  $loaded_event->update({ created_on => '0000-00-00' });
+  is("$created_on", $prev_str, "Don't update invalid dates");
 
-is( $invalid->get_column('starts_at'), '0000-00-00', "Invalid date stored" );
-is( $invalid->starts_at, undef, "Inflate to undef" );
+  my $invalid = $schema->resultset('Event')->create({
+      starts_at  => '0000-00-00',
+      created_on => $created_on
+  });
 
-$invalid->created_on('0000-00-00');
-$invalid->update;
+  is( $invalid->get_column('starts_at'), '0000-00-00', "Invalid date stored" );
+  is( $invalid->starts_at, undef, "Inflate to undef" );
 
-{
-    local $@;
-    eval { $invalid->created_on };
-    like( $@, qr/invalid date format/i, "Invalid date format exception");
+  $invalid->created_on('0000-00-00');
+  $invalid->update;
+
+  {
+      local $@;
+      eval { $invalid->created_on };
+      like( $@, qr/invalid date format/i, "Invalid date format exception");
+  }
 }
 
 ## varchar field using inflate_date => 1
@@ -134,3 +145,18 @@
 ## skip inflation field
 my $skip_inflation = $event->skip_inflation;
 is ("$skip_inflation", '2006-04-21 18:04:06', 'Correct date/time');
+
+} # Skip if no MySQL DT::Formatter
+
+SKIP: {
+  eval { require DateTime::Format::Pg };
+  skip ('Need DateTime::Format::Pg for timestamp inflation tests', 3) if $@;
+
+  my $event = $schema->resultset("EventTZPg")->find(1);
+  $event->update({created_on => '2009-01-15 17:00:00+00'});
+  $event->discard_changes;
+  isa_ok($event->created_on, "DateTime") or diag $event->created_on;
+  is($event->created_on->time_zone->name, "America/Chicago", "Timezone changed");
+  # Time zone difference -> -6hours
+  is($event->created_on->iso8601, "2009-01-15T11:00:00", "Time with TZ correct");
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/89inflate_datetime.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/90ensure_class_loaded.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/90join_torture.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/90join_torture.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/90join_torture.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -45,9 +45,9 @@
 cmp_ok(scalar @cds, '==', 1, "condition based on inherited join okay");
 
 my $rs3 = $rs2->search_related('cds');
+
 cmp_ok(scalar($rs3->all), '==', 45, "All cds for artist returned");
 
-
 cmp_ok($rs3->count, '==', 45, "All cds for artist returned via count");
 
 my $rs4 = $schema->resultset("CD")->search({ 'artist.artistid' => '1' }, { join => ['tracks', 'artist'], prefetch => 'artist' });


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/90join_torture.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/91debug.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/91debug.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/91debug.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -51,22 +51,21 @@
 
 # test trace output correctness for bind params
 {
-    my ($sql, @bind) = ('');
-    $schema->storage->debugcb( sub { $sql = $_[1] } );
+    my ($sql, @bind);
+    $schema->storage->debugobj(DBIC::DebugObj->new(\$sql, \@bind));
 
     my @cds = $schema->resultset('CD')->search( { artist => 1, cdid => { -between => [ 1, 3 ] }, } );
     is_same_sql_bind(
-        $sql, [],
-        "SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE ( artist = ? AND cdid BETWEEN ? AND ? ): '1', '1', '3'", [],
+        $sql, \@bind,
+        "SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE ( artist = ? AND (cdid BETWEEN ? AND ?) ): '1', '1', '3'",
+        [qw/'1' '1' '3'/],
         'got correct SQL with all bind parameters (debugcb)'
     );
 
-    $schema->storage->debugcb(undef);
-    $schema->storage->debugobj(DBIC::DebugObj->new(\$sql, \@bind));
     @cds = $schema->resultset('CD')->search( { artist => 1, cdid => { -between => [ 1, 3 ] }, } );
     is_same_sql_bind(
         $sql, \@bind,
-        "SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE ( artist = ? AND cdid BETWEEN ? AND ? )", ["'1'", "'1'", "'3'"],
+        "SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE ( artist = ? AND (cdid BETWEEN ? AND ?) )", ["'1'", "'1'", "'3'"],
         'got correct SQL with all bind parameters (debugobj)'
     );
 }


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/91debug.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/91merge_attr.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/92storage.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/92storage_on_connect_do.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/92storage_on_connect_do.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/92storage_on_connect_do.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 10;
+use Test::More tests => 12;
 
 use lib qw(t/lib);
 use base 'DBICTest';
@@ -11,7 +11,23 @@
     no_connect  => 1,
     no_deploy   => 1,
 );
+
 ok $schema->connection(
+  DBICTest->_database,
+  {
+    on_connect_do => 'CREATE TABLE TEST_empty (id INTEGER)',
+  },
+), 'connection()';
+
+is_deeply (
+  $schema->storage->dbh->selectall_arrayref('SELECT * FROM TEST_empty'),
+  [],
+  'string version on_connect_do() worked'
+);
+
+$schema->storage->disconnect;
+
+ok $schema->connection(
     DBICTest->_database,
     {
         on_connect_do       => [
@@ -24,10 +40,11 @@
     },
 ), 'connection()';
 
-is_deeply
+is_deeply (
   $schema->storage->dbh->selectall_arrayref('SELECT * FROM TEST_empty'),
   [ [ 2 ], [ 3 ], [ 7 ] ],
-  'on_connect_do() worked';
+  'on_connect_do() worked'
+);
 eval { $schema->storage->dbh->do('SELECT 1 FROM TEST_nonexistent'); };
 ok $@, 'Searching for nonexistent table dies';
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/92storage_on_connect_do.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/93nobindvars.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/93nobindvars.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/93nobindvars.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -57,7 +57,7 @@
       offset => 2,
       order_by => 'artistid' }
 );
-is( $it->count, 3, "LIMIT count ok" );
+is( $it->count, 3, "LIMIT count ok" );  # ask for 3 rows out of 7 artists
 is( $it->next->name, "Artist 2", "iterator->next ok" );
 $it->next;
 $it->next;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/93nobindvars.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/93single_accessor_object.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/93storage_replication.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/93storage_replication.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/93storage_replication.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -4,12 +4,15 @@
 use Test::More;
 use Test::Exception;
 use DBICTest;
+use List::Util 'first';
+use Scalar::Util 'reftype';
+use IO::Handle;
 
 BEGIN {
     eval "use DBIx::Class::Storage::DBI::Replicated; use Test::Moose";
     plan $@
         ? ( skip_all => "Deps not installed: $@" )
-        : ( tests => 79 );
+        : ( tests => 90 );
 }
 
 use_ok 'DBIx::Class::Storage::DBI::Replicated::Pool';
@@ -49,10 +52,10 @@
     ## Initialize the object
     
 	sub new {
-	    my $class = shift @_;
+	    my ($class, $schema_method) = (shift, shift);
 	    my $self = $class->SUPER::new(@_);
 	
-	    $self->schema( $self->init_schema );
+	    $self->schema( $self->init_schema($schema_method) );
 	    return $self;
 	}
     
@@ -62,30 +65,71 @@
         # current SQLT SQLite producer does not handle DROP TABLE IF EXISTS, trap warnings here
         local $SIG{__WARN__} = sub { warn @_ unless $_[0] =~ /no such table.+DROP TABLE/ };
 
-        my $class = shift @_;
+        my ($class, $schema_method) = @_;
 
-        my $schema = DBICTest->init_schema(
-            sqlite_use_file => 1,
-            storage_type=>{
-            	'::DBI::Replicated' => {
-            		balancer_type=>'::Random',
-                    balancer_args=>{
-                    	auto_validate_every=>100,
-                    },
-            	}
-            },
-            deploy_args=>{
-                   add_drop_table => 1,
-            },
-        );
+        my $method = "get_schema_$schema_method";
+        my $schema = $class->$method;
 
         return $schema;
     }
-    
+
+    sub get_schema_by_storage_type {
+      DBICTest->init_schema(
+        sqlite_use_file => 1,
+        storage_type=>{
+          '::DBI::Replicated' => {
+            balancer_type=>'::Random',
+            balancer_args=>{
+              auto_validate_every=>100,
+	      master_read_weight => 1
+            },
+          }
+        },
+        deploy_args=>{
+          add_drop_table => 1,
+        },
+      );
+    }
+
+    sub get_schema_by_connect_info {
+      DBICTest->init_schema(
+        sqlite_use_file => 1,
+        storage_type=> '::DBI::Replicated',
+        balancer_type=>'::Random',
+        balancer_args=> {
+          auto_validate_every=>100,
+	  master_read_weight => 1
+        },
+        deploy_args=>{
+          add_drop_table => 1,
+        },
+      );
+    }
+
     sub generate_replicant_connect_info {}
     sub replicate {}
     sub cleanup {}
 
+    ## --------------------------------------------------------------------- ##
+    ## Add a connect_info option to test option merging.
+    ## --------------------------------------------------------------------- ##
+    {
+    package DBIx::Class::Storage::DBI::Replicated;
+
+    use Moose;
+
+    __PACKAGE__->meta->make_mutable;
+
+    around connect_info => sub {
+      my ($next, $self, $info) = @_;
+      $info->[3]{master_option} = 1;
+      $self->$next($info);
+    };
+
+    __PACKAGE__->meta->make_immutable;
+
+    no Moose;
+    }
   
     ## --------------------------------------------------------------------- ##
     ## Subclass for when you are using SQLite for testing, this provides a fake
@@ -124,9 +168,20 @@
             "dbi:SQLite:${_}";
         } @{$self->slave_paths};
         
-        return map { [$_,'','',{AutoCommit=>1}] } @dsn;
+        my @connect_infos = map { [$_,'','',{AutoCommit=>1}] } @dsn;
+
+    # try a hashref too
+        my $c = $connect_infos[0];
+        $connect_infos[0] = {
+          dsn => $c->[0],
+          user => $c->[1],
+          password => $c->[2],
+          %{ $c->[3] }
+        };
+
+        @connect_infos
     }
-    
+
     ## Do a 'good enough' replication by copying the master dbfile over each of
     ## the slave dbfiles.  If the master is SQLite we do this, otherwise we
     ## just do a one second pause to let the slaves catch up.
@@ -185,15 +240,23 @@
     'DBIx::Class::DBI::Replicated::TestReplication::Custom' :
     'DBIx::Class::DBI::Replicated::TestReplication::SQLite';
 
-ok my $replicated = $replicated_class->new
-    => 'Created a replication object';
-    
-isa_ok $replicated->schema
-    => 'DBIx::Class::Schema';
-    
-isa_ok $replicated->schema->storage
-    => 'DBIx::Class::Storage::DBI::Replicated';
+my $replicated;
 
+for my $method (qw/by_connect_info by_storage_type/) {
+  ok $replicated = $replicated_class->new($method)
+      => "Created a replication object $method";
+      
+  isa_ok $replicated->schema
+      => 'DBIx::Class::Schema';
+      
+  isa_ok $replicated->schema->storage
+      => 'DBIx::Class::Storage::DBI::Replicated';
+
+  isa_ok $replicated->schema->storage->balancer
+      => 'DBIx::Class::Storage::DBI::Replicated::Balancer::Random'
+      => 'configured balancer_type';
+}
+
 ok $replicated->schema->storage->meta
     => 'has a meta object';
     
@@ -211,10 +274,38 @@
 
 ok my @replicated_storages = $replicated->schema->storage->connect_replicants(@replicant_connects)
     => 'Created some storages suitable for replicants';
-    
+
+ok my @all_storages = $replicated->schema->storage->all_storages
+    => '->all_storages';
+
+is scalar @all_storages,
+    3
+    => 'correct number of ->all_storages';
+
+is ((grep $_->isa('DBIx::Class::Storage::DBI'), @all_storages),
+    3
+    => '->all_storages are correct type');
+
+my @all_storage_opts =
+  grep { (reftype($_)||'') eq 'HASH' }
+    map @{ $_->_connect_info }, @all_storages;
+
+is ((grep $_->{master_option}, @all_storage_opts),
+    3
+    => 'connect_info was merged from master to replicants');
+ 
+my @replicant_names = keys %{ $replicated->schema->storage->replicants };
+
+## Silence warning about not supporting the is_replicating method if using the
+## sqlite dbs.
+$replicated->schema->storage->debugobj->silence(1)
+  if first { m{^t/} } @replicant_names;
+   
 isa_ok $replicated->schema->storage->balancer->current_replicant
-    => 'DBIx::Class::Storage::DBI';
-    
+    => 'DBIx::Class::Storage::DBI'; 
+
+$replicated->schema->storage->debugobj->silence(0);
+
 ok $replicated->schema->storage->pool->has_replicants
     => 'does have replicants';     
 
@@ -227,8 +318,6 @@
 does_ok $replicated_storages[1]
     => 'DBIx::Class::Storage::DBI::Replicated::Replicant';
     
-my @replicant_names = keys %{$replicated->schema->storage->replicants};
-
 does_ok $replicated->schema->storage->replicants->{$replicant_names[0]}
     => 'DBIx::Class::Storage::DBI::Replicated::Replicant';
 
@@ -249,8 +338,16 @@
 $replicated->replicate;
 $replicated->schema->storage->replicants->{$replicant_names[0]}->active(1);
 $replicated->schema->storage->replicants->{$replicant_names[1]}->active(1);
+
+## Silence warning about not supporting the is_replicating method if using the
+## sqlite dbs.
+$replicated->schema->storage->debugobj->silence(1)
+  if first { m{^t/} } @replicant_names;
+ 
 $replicated->schema->storage->pool->validate_replicants;
 
+$replicated->schema->storage->debugobj->silence(0);
+
 ## Make sure we can read the data.
 
 ok my $artist1 = $replicated->schema->resultset('Artist')->find(4)
@@ -262,6 +359,28 @@
 is $artist1->name, 'Ozric Tentacles'
     => 'Found expected name for first result';
 
+## Check that master_read_weight is honored
+{
+    no warnings 'once';
+
+    # turn off redefined warning
+    local $SIG{__WARN__} = sub {};
+
+    local
+    *DBIx::Class::Storage::DBI::Replicated::Balancer::Random::_random_number =
+	sub { 999 };
+
+    $replicated->schema->storage->balancer->increment_storage;
+
+    is $replicated->schema->storage->balancer->current_replicant,
+       $replicated->schema->storage->master
+       => 'master_read_weight is honored';
+
+    ## turn it off for the duration of the test
+    $replicated->schema->storage->balancer->master_read_weight(0);
+    $replicated->schema->storage->balancer->increment_storage;
+}
+
 ## Add some new rows that only the master will have  This is because
 ## we overload any type of write operation so that is must hit the master
 ## database.
@@ -350,14 +469,34 @@
 
 $replicated->schema->storage->replicants->{$replicant_names[0]}->active(0);
 $replicated->schema->storage->replicants->{$replicant_names[1]}->active(0);
-    
-ok $replicated->schema->resultset('Artist')->find(2)
-    => 'Fallback to master';
 
+{
+    ## catch the fallback to master warning
+    open my $debugfh, '>', \my $fallback_warning;
+    my $oldfh = $replicated->schema->storage->debugfh;
+    $replicated->schema->storage->debugfh($debugfh);
+
+    ok $replicated->schema->resultset('Artist')->find(2)
+	=> 'Fallback to master';
+
+    like $fallback_warning, qr/falling back to master/
+	=> 'emits falling back to master warning';
+
+    $replicated->schema->storage->debugfh($oldfh);
+}
+
 $replicated->schema->storage->replicants->{$replicant_names[0]}->active(1);
 $replicated->schema->storage->replicants->{$replicant_names[1]}->active(1);
+
+## Silence warning about not supporting the is_replicating method if using the
+## sqlite dbs.
+$replicated->schema->storage->debugobj->silence(1)
+  if first { m{^t/} } @replicant_names;
+ 
 $replicated->schema->storage->pool->validate_replicants;
 
+$replicated->schema->storage->debugobj->silence(0);
+
 ok $replicated->schema->resultset('Artist')->find(2)
     => 'Returned to replicates';
     
@@ -578,11 +717,4 @@
 ## Delete the old database files
 $replicated->cleanup;
 
-use Data::Dump qw/dump/;
-#warn dump $replicated->schema->storage->read_handler;
-
-
-
-
-
-
+# vim: sw=4 sts=4 :


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/93storage_replication.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/94pk_mutation.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/94versioning.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/94versioning.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/94versioning.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -33,6 +33,8 @@
 };
 
 use lib qw(t/lib);
+use DBICTest; # do not remove even though it is not used
+
 use_ok('DBICVersionOrig');
 
 my $schema_orig = DBICVersion::Schema->connect($dsn, $user, $pass, { ignore_version => 1 });
@@ -83,7 +85,7 @@
   # should overwrite files and warn about it
   my @w;
   local $SIG{__WARN__} = sub { 
-    if ($_[0] =~ /^Overwriting/) {
+    if ($_[0] =~ /Overwriting existing/) {
       push @w, $_[0];
     }
     else {
@@ -93,8 +95,8 @@
   $schema_upgrade->create_ddl_dir('MySQL', '2.0', $ddl_dir, '1.0');
 
   is (2, @w, 'A warning generated for both the DDL and the diff');
-  like ($w[0], qr/^Overwriting existing DDL file - $fn->{v2}/, 'New version DDL overwrite warning');
-  like ($w[1], qr/^Overwriting existing diff file - $fn->{trans}/, 'Upgrade diff overwrite warning');
+  like ($w[0], qr/Overwriting existing DDL file - $fn->{v2}/, 'New version DDL overwrite warning');
+  like ($w[1], qr/Overwriting existing diff file - $fn->{trans}/, 'Upgrade diff overwrite warning');
 }
 
 {


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/94versioning.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/95sql_maker.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/95sql_maker.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/95sql_maker.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,16 +2,12 @@
 use warnings;
 
 use Test::More;
+use Test::Exception;
 
 use lib qw(t/lib);
 use DBIC::SqlMakerTest;
 
-BEGIN {
-    eval "use DBD::SQLite";
-    plan $@
-        ? ( skip_all => 'needs DBD::SQLite for testing' )
-        : ( tests => 3 );
-}
+plan tests => 4;
 
 use_ok('DBICTest');
 
@@ -52,3 +48,9 @@
     'sql_maker passes arrayrefs in update'
   );
 }
+
+# Make sure the carp/croak override in SQLA works (via SQLAHacks)
+my $file = __FILE__;
+throws_ok (sub {
+  $schema->resultset ('Artist')->search ({}, { order_by => { -asc => 'stuff', -desc => 'staff' } } )->as_query;
+}, qr/$file/, 'Exception correctly croak()ed');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/95sql_maker.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/95sql_maker_quote.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/96_is_deteministic_value.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/96file_column.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create/cd_single.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create/multilev_might_have_PKeqFK.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -362,16 +362,16 @@
 
 	});
 	
-	ok( $cd_result && ref $cd_result eq 'DBICTest::CD', "Got Good CD Class");
+	isa_ok( $cd_result, 'DBICTest::CD', "Got Good CD Class");
 	ok( $cd_result->title eq "TestOneCD1", "Got Expected Title");
 	
 	my $tracks = $cd_result->tracks;
 	
-	ok( ref $tracks eq "DBIx::Class::ResultSet", "Got Expected Tracks ResultSet");
+	isa_ok( $tracks, 'DBIx::Class::ResultSet', 'Got Expected Tracks ResultSet');
 	
 	foreach my $track ($tracks->all)
 	{
-		ok( $track && ref $track eq 'DBICTest::Track', 'Got Expected Track Class');
+		isa_ok( $track, 'DBICTest::Track', 'Got Expected Track Class');
 	}
 }, 'First create_related pass');
 
@@ -391,17 +391,17 @@
 
 	});
 	
-	ok( $cd_result && ref $cd_result eq 'DBICTest::CD', "Got Good CD Class");
+	isa_ok( $cd_result, 'DBICTest::CD', "Got Good CD Class");
 	ok( $cd_result->title eq "TestOneCD2", "Got Expected Title");
   ok( $cd_result->notes eq 'I can haz liner notes?', 'Liner notes');
 	
 	my $tracks = $cd_result->tracks;
 	
-	ok( ref $tracks eq "DBIx::Class::ResultSet", "Got Expected Tracks ResultSet");
+	isa_ok( $tracks, 'DBIx::Class::ResultSet', "Got Expected Tracks ResultSet");
 	
 	foreach my $track ($tracks->all)
 	{
-		ok( $track && ref $track eq 'DBICTest::Track', 'Got Expected Track Class');
+		isa_ok( $track, 'DBICTest::Track', 'Got Expected Track Class');
 	}
 }, 'second create_related with same arguments');
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create_new.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/96multi_create_torture.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/97result_class.t
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: DBIx-Class/0.08/branches/sybase_noquote/t/98rows_prefetch.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/98rows_prefetch.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/98rows_prefetch.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,42 +0,0 @@
-# Test to ensure we get a consistent result set wether or not we use the
-# prefetch option in combination rows (LIMIT).
-use strict;
-use warnings;
-
-use Test::More;
-use lib qw(t/lib);
-use DBICTest;
-
-plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 2);
-
-my $schema = DBICTest->init_schema();
-my $no_prefetch = $schema->resultset('Artist')->search(
-	undef,
-	{ rows => 3 }
-);
-
-my $use_prefetch = $schema->resultset('Artist')->search(
-	undef,
-	{
-		prefetch => 'cds',
-		rows     => 3
-	}
-);
-
-my $no_prefetch_count  = 0;
-my $use_prefetch_count = 0;
-
-is($no_prefetch->count, $use_prefetch->count, '$no_prefetch->count == $use_prefetch->count');
-
-TODO: {
-	local $TODO = "This is a difficult bug to fix, workaround is not to use prefetch with rows";
-	$no_prefetch_count++  while $no_prefetch->next;
-	$use_prefetch_count++ while $use_prefetch->next;
-	is(
-		$no_prefetch_count,
-		$use_prefetch_count,
-		"manual row count confirms consistency"
-		. " (\$no_prefetch_count == $no_prefetch_count, "
-		. " \$use_prefetch_count == $use_prefetch_count)"
-	);
-}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/98savepoints.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/99dbic_sqlt_parser.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/99dbic_sqlt_parser.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/99dbic_sqlt_parser.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -7,9 +7,9 @@
 
 
 BEGIN {
-    eval "use DBD::mysql; use SQL::Translator 0.09003;";
+    eval "use SQL::Translator 0.09003;";
     if ($@) {
-        plan skip_all => 'needs DBD::mysql and SQL::Translator 0.09003 for testing';
+        plan skip_all => 'needs SQL::Translator 0.09003 for testing';
     }
 }
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/99dbic_sqlt_parser.t
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: DBIx-Class/0.08/branches/sybase_noquote/t/99rh_perl_perf_bug.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/99rh_perl_perf_bug.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/99rh_perl_perf_bug.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,121 +0,0 @@
-#!/usr/bin/perl
-use strict;
-use warnings;
-use Test::More;
-use lib qw(t/lib);
-
-# This is a rather unusual test.
-# It does not test any aspect of DBIx::Class, but instead tests the
-# perl installation this is being run under to see if it is:-
-#  1. Potentially affected by a RH perl build bug
-#  2. If so we do a performance test for the effect of
-#     that bug.
-#
-# You can skip these tests by setting the DBIC_NO_WARN_BAD_PERL env
-# variable
-#
-# If these tests fail then please read the section titled
-# Perl Performance Issues on Red Hat Systems in
-# L<DBIx::Class::Manual::Troubleshooting>
-
-plan skip_all =>
-  'Skipping RH perl performance bug tests as DBIC_NO_WARN_BAD_PERL set'
-  if ( $ENV{DBIC_NO_WARN_BAD_PERL} );
-
-plan skip_all => 'Skipping as AUTOMATED_TESTING is set'
-  if ( $ENV{AUTOMATED_TESTING} );
-
-eval "use Benchmark ':all'";
-plan skip_all => 'needs Benchmark for testing' if $@;
-
-plan tests => 3;
-
-ok( 1, 'Dummy - prevents next test timing out' );
-
-# we do a benchmark test filling an array with blessed/overloaded references,
-# against an array filled with array refs.
-# On a sane system the ratio between these operation sets is 1 - 1.5,
-# whereas a bugged system gives a ratio of around 8
-# we therefore consider there to be a problem if the ratio is >= 2
-
-my $results = timethese(
-    -1,    # run for 1 CPU second each
-    {
-        no_bless => sub {
-            my %h;
-            for ( my $i = 0 ; $i < 10000 ; $i++ ) {
-                $h{$i} = [];
-            }
-        },
-        bless_overload => sub {
-            use overload q(<) => sub { };
-            my %h;
-            for ( my $i = 0 ; $i < 10000 ; $i++ ) {
-                $h{$i} = bless [] => 'main';
-            }
-        },
-    },
-);
-
-my $ratio = $results->{no_bless}->iters / $results->{bless_overload}->iters;
-
-ok( ( $ratio < 2 ), 'Overload/bless performance acceptable' )
-  || diag(
-    "\n",
-    "This perl has a substantial slow down when handling large numbers\n",
-    "of blessed/overloaded objects.  This can severely adversely affect\n",
-    "the performance of DBIx::Class programs.  Please read the section\n",
-    "in the Troubleshooting POD documentation entitled\n",
-    "'Perl Performance Issues on Red Hat Systems'\n",
-    "As this is an extremely serious condition, the only way to skip\n",
-    "over this test is to --force the installation, or to edit the test\n",
-    "file " . __FILE__ . "\n",
-  );
-
-# We will only check for the difference in bless handling (whether the
-# bless applies to the reference or the referent) if we have seen a
-# performance issue...
-
-SKIP: {
-    skip "Not checking for bless handling as performance is OK", 1
-      if ( $ratio < 2 );
-
-    {
-        package    # don't want this in PAUSE
-          TestRHBug;
-        use overload bool => sub { 0 }
-    }
-
-    sub _has_bug_34925 {
-        my %thing;
-        my $r1 = \%thing;
-        my $r2 = \%thing;
-        bless $r1 => 'TestRHBug';
-        return !!$r2;
-    }
-
-    sub _possibly_has_bad_overload_performance {
-        return $] < 5.008009 && !_has_bug_34925();
-    }
-
-    # If this next one fails then you almost certainly have a RH derived
-    # perl with the performance bug
-    # if this test fails, look at the section titled
-    # "Perl Performance Issues on Red Hat Systems" in
-    # L<DBIx::Class::Manual::Troubleshooting>
-    # Basically you may suffer severe performance issues when running
-    # DBIx::Class (and many other) modules.  Look at getting a fixed
-    # version of the perl interpreter for your system.
-    #
-    ok( !_possibly_has_bad_overload_performance(),
-        'Checking whether bless applies to reference not object' )
-      || diag(
-        "\n",
-        "This perl is probably derived from a buggy Red Hat perl build\n",
-        "Please read the section in the Troubleshooting POD documentation\n",
-        "entitled 'Perl Performance Issues on Red Hat Systems'\n",
-        "As this is an extremely serious condition, the only way to skip\n",
-        "over this test is to --force the installation, or to edit the test\n",
-        "file " . __FILE__ . "\n",
-      );
-}

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/bind/attribute.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/47bind_attribute.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/bind/attribute.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/bind/attribute.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,96 @@
+use strict;
+use warnings;
+
+use Test::More;
+use lib qw(t/lib);
+use DBIC::SqlMakerTest;
+
+use_ok('DBICTest');
+
+my $schema = DBICTest->init_schema;
+
+BEGIN {
+    eval "use DBD::SQLite";
+    plan $@
+        ? ( skip_all => 'needs DBD::SQLite for testing' )
+        : ( tests => 9 );
+}
+
+my $where_bind = {
+    where => \'name like ?',
+    bind  => [ 'Cat%' ],
+};
+
+my $rs;
+
+TODO: {
+    local $TODO = 'bind args order needs fixing (semifor)';
+
+    # First, the simple cases...
+    $rs = $schema->resultset('Artist')->search(
+            { artistid => 1 },
+            $where_bind,
+    );
+
+    is ( $rs->count, 1, 'where/bind combined' );
+
+    $rs= $schema->resultset('Artist')->search({}, $where_bind)
+        ->search({ artistid => 1});
+
+    is ( $rs->count, 1, 'where/bind first' );
+            
+    $rs = $schema->resultset('Artist')->search({ artistid => 1})
+        ->search({}, $where_bind);
+
+    is ( $rs->count, 1, 'where/bind last' );
+}
+
+# More complex cases, based primarily on the Cookbook
+# "Arbitrary SQL through a custom ResultSource" technique,
+# which seems to be the only place the bind attribute is
+# documented.  Breaking this technique probably breaks existing
+# application code.
+my $source = DBICTest::Artist->result_source_instance;
+my $new_source = $source->new($source);
+$new_source->source_name('Complex');
+
+$new_source->name(\<<'');
+( SELECT a.*, cd.cdid AS cdid, cd.title AS title, cd.year AS year 
+  FROM artist a
+  JOIN cd ON cd.artist = a.artistid
+  WHERE cd.year = ?)
+
+$schema->register_extra_source('Complex' => $new_source);
+
+$rs = $schema->resultset('Complex')->search({}, { bind => [ 1999 ] });
+is ( $rs->count, 1, 'cookbook arbitrary sql example' );
+
+$rs = $schema->resultset('Complex')->search({ 'artistid' => 1 }, { bind => [ 1999 ] });
+is ( $rs->count, 1, '...coobook + search condition' );
+
+$rs = $schema->resultset('Complex')->search({}, { bind => [ 1999 ] })
+    ->search({ 'artistid' => 1 });
+is ( $rs->count, 1, '...cookbook (bind first) + chained search' );
+
+{
+  $rs = $schema->resultset('Complex')->search({}, { bind => [ 1999 ] })->search({}, { where => \"title LIKE ?", bind => [ 'Spoon%' ] });
+  is_same_sql_bind(
+    $rs->as_query,
+    "(SELECT me.artistid, me.name, me.rank, me.charfield FROM (SELECT a.*, cd.cdid AS cdid, cd.title AS title, cd.year AS year FROM artist a JOIN cd ON cd.artist = a.artistid WHERE cd.year = ?) WHERE title LIKE ?)",
+    [
+      [ '!!dummy' => '1999' ], 
+      [ '!!dummy' => 'Spoon%' ]
+    ],
+    'got correct SQL'
+);
+
+}
+
+TODO: {
+    local $TODO = 'bind args order needs fixing (semifor)';
+    $rs = $schema->resultset('Complex')->search({}, { bind => [ 1999 ] })
+        ->search({ 'artistid' => 1 }, {
+            where => \'title like ?',
+            bind => [ 'Spoon%' ] });
+    is ( $rs->count, 1, '...cookbook + chained search with extra bind' );
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/bind/attribute.t
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/bind/bindtype_columns.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/bindtype_columns.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/bind/bindtype_columns.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/bind/bindtype_columns.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,88 @@
+use strict;
+use warnings;  
+
+use Test::More;
+use lib qw(t/lib);
+use DBICTest;
+
+my ($dsn, $dbuser, $dbpass) = @ENV{map { "DBICTEST_PG_${_}" } qw/DSN USER PASS/};
+
+plan skip_all => 'Set $ENV{DBICTEST_PG_DSN}, _USER and _PASS to run this test'
+  unless ($dsn && $dbuser);
+  
+plan tests => 6;
+
+my $schema = DBICTest::Schema->connection($dsn, $dbuser, $dbpass, { AutoCommit => 1 });
+
+my $dbh = $schema->storage->dbh;
+
+{
+    local $SIG{__WARN__} = sub {};
+    $dbh->do('DROP TABLE IF EXISTS bindtype_test');
+
+    # the blob/clob are for reference only, will be useful when we switch to SQLT and can test Oracle along the way
+    $dbh->do(qq[
+        CREATE TABLE bindtype_test 
+        (
+            id              serial       NOT NULL   PRIMARY KEY,
+            bytea           bytea        NULL,
+            blob            bytea        NULL,
+            clob            text         NULL
+        );
+    ],{ RaiseError => 1, PrintError => 1 });
+}
+
+my $big_long_string	= "\x00\x01\x02 abcd" x 125000;
+
+my $new;
+# test inserting a row
+{
+  $new = $schema->resultset('BindType')->create({ bytea => $big_long_string });
+
+  ok($new->id, "Created a bytea row");
+  is($new->bytea, 	$big_long_string, "Set the blob correctly.");
+}
+
+# test retrieval of the bytea column
+{
+  my $row = $schema->resultset('BindType')->find({ id => $new->id });
+  is($row->get_column('bytea'), $big_long_string, "Created the blob correctly.");
+}
+
+TODO: {
+  local $TODO =
+    'Passing bind attributes to $sth->bind_param() should be implemented (it only works in $storage->insert ATM)';
+
+  my $rs = $schema->resultset('BindType')->search({ bytea => $big_long_string });
+
+  # search on the bytea column (select)
+  {
+    my $row = $rs->first;
+    is($row ? $row->id : undef, $new->id, "Found the row searching on the bytea column.");
+  }
+
+  # search on the bytea column (update)
+  {
+    my $new_big_long_string = $big_long_string . "2";
+    $schema->txn_do(sub {
+      $rs->update({ bytea => $new_big_long_string });
+      my $row = $schema->resultset('BindType')->find({ id => $new->id });
+      is($row ? $row->get_column('bytea') : undef, $new_big_long_string,
+        "Updated the row correctly (searching on the bytea column)."
+      );
+      $schema->txn_rollback;
+    });
+  }
+
+  # search on the bytea column (delete)
+  {
+    $schema->txn_do(sub {
+      $rs->delete;
+      my $row = $schema->resultset('BindType')->find({ id => $new->id });
+      is($row, undef, "Deleted the row correctly (searching on the bytea column).");
+      $schema->txn_rollback;
+    });
+  }
+}
+
+$dbh->do("DROP TABLE bindtype_test");


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/bind/bindtype_columns.t
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/bind/order_by.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/bind/order_by.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/bind/order_by.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,106 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Exception;
+use lib qw(t/lib);
+use DBICTest;
+use DBIC::SqlMakerTest;
+
+my $schema = DBICTest->init_schema;
+
+my $rs = $schema->resultset('FourKeys');
+
+sub test_order {
+
+  TODO: {
+    my $args = shift;
+
+    local $TODO = "Not implemented" if $args->{todo};
+
+    lives_ok {
+      is_same_sql_bind(
+        $rs->search(
+            { foo => 'bar' },
+            {
+                order_by => $args->{order_by},
+                having =>
+                  [ { read_count => { '>' => 5 } }, \[ 'read_count < ?', 8 ] ]
+            }
+          )->as_query,
+        "(
+          SELECT me.foo, me.bar, me.hello, me.goodbye, me.sensors, me.read_count 
+          FROM fourkeys me 
+          WHERE ( foo = ? ) 
+          HAVING read_count > ? OR read_count < ?
+          ORDER BY $args->{order_req}
+        )",
+        [
+            [qw(foo bar)],
+            [qw(read_count 5)],
+            8,
+            $args->{bind}
+              ? @{ $args->{bind} }
+              : ()
+        ],
+      );
+    };
+    fail('Fail the unfinished is_same_sql_bind') if $@;
+  }
+}
+
+my @tests = (
+    {
+        order_by  => \'foo DESC',
+        order_req => 'foo DESC',
+        bind      => [],
+    },
+    {
+        order_by  => { -asc => 'foo' },
+        order_req => 'foo ASC',
+        bind      => [],
+    },
+    {
+        order_by  => { -desc => \[ 'colA LIKE ?', 'test' ] },
+        order_req => 'colA LIKE ? DESC',
+        bind      => [qw(test)],
+    },
+    {
+        order_by  => \[ 'colA LIKE ? DESC', 'test' ],
+        order_req => 'colA LIKE ? DESC',
+        bind      => [qw(test)],
+    },
+    {
+        order_by => [
+            { -asc  => \['colA'] },
+            { -desc => \[ 'colB LIKE ?', 'test' ] },
+            { -asc  => \[ 'colC LIKE ?', 'tost' ] }
+        ],
+        order_req => 'colA ASC, colB LIKE ? DESC, colC LIKE ? ASC',
+        bind      => [qw(test tost)],
+    },
+
+    # (mo) this would be really really nice!
+    # (ribasushi) I don't think so, not writing it - patches welcome
+    {
+        order_by => [
+            { -asc  => 'colA' },
+            { -desc => { colB => { 'LIKE' => 'test' } } },
+            { -asc  => { colC => { 'LIKE' => 'tost' } } }
+        ],
+        order_req => 'colA ASC, colB LIKE ? DESC, colC LIKE ? ASC',
+        bind      => [ [ colB => 'test' ], [ colC => 'tost' ] ],      # ???
+        todo => 1,
+    },
+    {
+        order_by  => { -desc => { colA  => { LIKE  => 'test' } } },
+        order_req => 'colA LIKE ? DESC',
+        bind      => [qw(test)],
+        todo => 1,
+    },
+);
+
+plan( tests => scalar @tests * 2 );
+
+test_order($_) for @tests;
+

Deleted: DBIx-Class/0.08/branches/sybase_noquote/t/bindtype_columns.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/bindtype_columns.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/bindtype_columns.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,88 +0,0 @@
-use strict;
-use warnings;  
-
-use Test::More;
-use lib qw(t/lib);
-use DBICTest;
-
-my ($dsn, $dbuser, $dbpass) = @ENV{map { "DBICTEST_PG_${_}" } qw/DSN USER PASS/};
-
-plan skip_all => 'Set $ENV{DBICTEST_PG_DSN}, _USER and _PASS to run this test'
-  unless ($dsn && $dbuser);
-  
-plan tests => 6;
-
-my $schema = DBICTest::Schema->connection($dsn, $dbuser, $dbpass, { AutoCommit => 1 });
-
-my $dbh = $schema->storage->dbh;
-
-{
-    local $SIG{__WARN__} = sub {};
-    $dbh->do('DROP TABLE IF EXISTS bindtype_test');
-
-    # the blob/clob are for reference only, will be useful when we switch to SQLT and can test Oracle along the way
-    $dbh->do(qq[
-        CREATE TABLE bindtype_test 
-        (
-            id              serial       NOT NULL   PRIMARY KEY,
-            bytea           bytea        NULL,
-            blob            bytea        NULL,
-            clob            text         NULL
-        );
-    ],{ RaiseError => 1, PrintError => 1 });
-}
-
-my $big_long_string	= "\x00\x01\x02 abcd" x 125000;
-
-my $new;
-# test inserting a row
-{
-  $new = $schema->resultset('BindType')->create({ bytea => $big_long_string });
-
-  ok($new->id, "Created a bytea row");
-  is($new->bytea, 	$big_long_string, "Set the blob correctly.");
-}
-
-# test retrieval of the bytea column
-{
-  my $row = $schema->resultset('BindType')->find({ id => $new->id });
-  is($row->get_column('bytea'), $big_long_string, "Created the blob correctly.");
-}
-
-TODO: {
-  local $TODO =
-    'Passing bind attributes to $sth->bind_param() should be implemented (it only works in $storage->insert ATM)';
-
-  my $rs = $schema->resultset('BindType')->search({ bytea => $big_long_string });
-
-  # search on the bytea column (select)
-  {
-    my $row = $rs->first;
-    is($row ? $row->id : undef, $new->id, "Found the row searching on the bytea column.");
-  }
-
-  # search on the bytea column (update)
-  {
-    my $new_big_long_string = $big_long_string . "2";
-    $schema->txn_do(sub {
-      $rs->update({ bytea => $new_big_long_string });
-      my $row = $schema->resultset('BindType')->find({ id => $new->id });
-      is($row ? $row->get_column('bytea') : undef, $new_big_long_string,
-        "Updated the row correctly (searching on the bytea column)."
-      );
-      $schema->txn_rollback;
-    });
-  }
-
-  # search on the bytea column (delete)
-  {
-    $schema->txn_do(sub {
-      $rs->delete;
-      my $row = $schema->resultset('BindType')->find({ id => $new->id });
-      is($row, undef, "Deleted the row correctly (searching on the bytea column).");
-      $schema->txn_rollback;
-    });
-  }
-}
-
-$dbh->do("DROP TABLE bindtype_test");

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/01-columns.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/01-columns.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/01-columns.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,6 +1,7 @@
 use strict;
 
 use Test::More;
+use lib 't/cdbi/testlib';
 
 BEGIN {
   eval "use DBIx::Class::CDBICompat;";
@@ -13,7 +14,7 @@
 #-----------------------------------------------------------------------
 package State;
 
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 
 State->table('State');
 State->columns(Essential => qw/Abbreviation Name/);
@@ -39,7 +40,7 @@
 
 package City;
 
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 
 City->table('City');
 City->columns(All => qw/Name State Population/);
@@ -56,7 +57,7 @@
 
 #-------------------------------------------------------------------------
 package CD;
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 
 CD->table('CD');
 CD->columns('All' => qw/artist title length/);


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/01-columns.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/02-Film.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/02-Film.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/02-Film.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -151,7 +151,7 @@
 
 # Multi-column search
 {
-	my @films = $blrunner->search_like(title => "Bladerunner%", rating => '15');
+	my @films = $blrunner->search (title => { -like => "Bladerunner%"}, rating => '15');
 	is @films, 1, "Only one Bladerunner is a 15";
 }
 
@@ -208,7 +208,7 @@
 is($films[0]->id, $gone->id, ' ... the correct one');
 
 # Find all films which were directed by Bob
- at films = Film->search_like('Director', 'Bob %');
+ at films = Film->search ( { 'Director' => { -like => 'Bob %' } });
 is(scalar @films, 3, ' search_like returns 3 films');
 ok(
 	eq_array(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/02-Film.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/03-subclassing.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/04-lazy.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/04-lazy.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/04-lazy.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -10,12 +10,10 @@
 
 BEGIN {
   eval "use DBIx::Class::CDBICompat;";
-  if ($@) {
-    plan (skip_all => 'Class::Trigger and DBIx::ContextualFetch required');
-    next;
-  }
-	eval "use DBD::SQLite";
-	plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 36);
+  plan $@ 
+    ? (skip_all => 'Class::Trigger and DBIx::ContextualFetch required')
+    : (tests => 36)
+  ;
 }
 
 INIT {
@@ -82,9 +80,9 @@
 ok($@, $@);
 
 
-warning_is {
+warning_like {
     Lazy->columns( TEMP => qw(that) );
-} "Declaring column that as TEMP but it already exists";
+} qr/Declaring column that as TEMP but it already exists/;
 
 # Test that create() and update() throws out columns that changed
 {
@@ -120,7 +118,7 @@
 
 # Now again for inflated values
 SKIP: {
-    skip "Requires Date::Simple", 5 unless eval "use Date::Simple; 1; ";
+    skip "Requires Date::Simple 3.03", 5 unless eval "use Date::Simple 3.03; 1; ";
     Lazy->has_a(
         orp     => 'Date::Simple',
         inflate => sub { Date::Simple->new($_[0] . '-01-01') },


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/04-lazy.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/06-hasa.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/08-inheritcols.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/09-has_many.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/11-triggers.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/12-filter.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/13-constraint.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/14-might_have.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/15-accessor.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/15-accessor.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/15-accessor.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -25,6 +25,11 @@
     sub Class::DBI::sheep { ok 0; }
 }
 
+# Install the deprecation warning intercept here for the rest of the 08 dev cycle
+local $SIG{__WARN__} = sub {
+  warn @_ unless (DBIx::Class->VERSION < 0.09 and $_[0] =~ /Query returned more than one row/);
+};
+
 sub Film::mutator_name {
     my ($class, $col) = @_;
     return "set_sheep" if lc $col eq "numexplodingsheep";
@@ -160,9 +165,6 @@
     like $@, qr/film/, "no hasa film";
 
     eval {
-        local $SIG{__WARN__} = sub {
-            warn @_ unless $_[0] =~ /Query returned more than one row/;
-        };
         ok my $f = $ac->movie, "hasa movie";
         isa_ok $f, "Film";
         is $f->id, $bt->id, " - Bad Taste";
@@ -264,5 +266,5 @@
     my $abigail = eval { Film->create({ title => "Abigail's Party" }) };
     like $@, qr/read only/, "Or create new films";
 
-    $sandl->discard_changes;
+    $_->discard_changes for ($naked, $sandl);
 }


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/15-accessor.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/16-reserved.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/18-has_a.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/19-set_sql.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/21-iterator.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/22-deflate_order.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/22-deflate_order.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/22-deflate_order.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -12,6 +12,7 @@
 eval { require Time::Piece::MySQL };
 plan skip_all => "Need Time::Piece::MySQL for this test" if $@;
 
+use lib 't/cdbi/testlib';
 eval { require 't/cdbi/testlib/Log.pm' };
 plan skip_all => "Need MySQL for this test" if $@;
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/22-deflate_order.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/22-self_referential.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/23-cascade.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/24-meta_info.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/26-mutator.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/30-pager.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/68-inflate_has_a.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/98-failure.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/DeepAbstractSearch/01_search.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/abstract/search_where.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/columns_as_hashes.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/columns_dont_override_custom_accessors.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/columns_dont_override_custom_accessors.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/columns_dont_override_custom_accessors.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,5 +1,6 @@
 use strict;
 use Test::More;
+use lib 't/cdbi/testlib';
 
 BEGIN {
   eval "use DBIx::Class::CDBICompat;";
@@ -10,7 +11,7 @@
 {
     package Thing;
 
-    use base 'DBIx::Class::Test::SQLite';
+    use base 'DBIC::Test::SQLite';
 
     Thing->columns(TEMP => qw[foo bar]);
     Thing->columns(All  => qw[thing_id yarrow flower]);


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/columns_dont_override_custom_accessors.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/construct.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/copy.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/copy.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/copy.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -15,7 +15,7 @@
     package # hide from PAUSE 
         MyFilm;
 
-    use base 'DBIx::Class::Test::SQLite';
+    use base 'DBIC::Test::SQLite';
     use strict;
 
     __PACKAGE__->set_table('Movies');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/copy.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/early_column_heisenbug.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/has_many_loads_foreign_class.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/hasa_without_loading.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/max_min_value_of.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/mk_group_accessors.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/multi_column_set.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/multi_column_set.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/multi_column_set.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,5 +1,6 @@
 use strict;
 use Test::More;
+use lib 't/cdbi/testlib';
 
 BEGIN {
   eval "use DBIx::Class::CDBICompat;";
@@ -10,7 +11,7 @@
 {
     package Thing;
 
-    use base 'DBIx::Class::Test::SQLite';
+    use base 'DBIC::Test::SQLite';
 
     Thing->columns(TEMP => qw[foo bar baz]);
     Thing->columns(All  => qw[some real stuff]);


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/multi_column_set.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/object_cache.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/retrieve_from_sql_with_limit.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/set_to_undef.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/set_to_undef.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/set_to_undef.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,5 +1,6 @@
 use strict;
 use Test::More;
+use lib 't/cdbi/testlib';
 
 BEGIN {
   eval "use DBIx::Class::CDBICompat;";
@@ -19,7 +20,7 @@
 {
     package Thing;
 
-    use base 'DBIx::Class::Test::SQLite';
+    use base 'DBIC::Test::SQLite';
 
     Thing->columns(All  => qw[thing_id this that date]);
 }


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/set_to_undef.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/set_vs_DateTime.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/set_vs_DateTime.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/set_vs_DateTime.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,6 +1,7 @@
 use strict;
 use Test::More;
 use Test::Exception;
+use lib 't/cdbi/testlib';
 
 BEGIN {
   eval "use DBIx::Class::CDBICompat;";
@@ -13,7 +14,7 @@
 {
     package Thing;
 
-    use base 'DBIx::Class::Test::SQLite';
+    use base 'DBIC::Test::SQLite';
 
     Thing->columns(All  => qw[thing_id this that date]);
 }


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/set_vs_DateTime.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/sweet/08pager.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Actor.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Actor.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Actor.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -4,7 +4,7 @@
 use strict;
 use warnings;
 
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 
 __PACKAGE__->set_table('Actor');
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Actor.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/ActorAlias.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/ActorAlias.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/ActorAlias.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -4,7 +4,7 @@
 use strict;
 use warnings;
 
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 
 __PACKAGE__->set_table( 'ActorAlias' );
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/ActorAlias.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Binary.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Blurb.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Blurb.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Blurb.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,7 +2,7 @@
     Blurb;
 
 use strict;
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 
 __PACKAGE__->set_table('Blurbs');
 __PACKAGE__->columns('Primary', 'Title');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Blurb.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/CDBase.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/CDBase.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/CDBase.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,6 +2,6 @@
     CDBase;
 
 use strict;
-use base qw(DBIx::Class::Test::SQLite);
+use base qw(DBIC::Test::SQLite);
 
 1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/CDBase.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/DBIC/Test (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Test)

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/DBIC/Test/SQLite.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/lib/DBIx/Class/Test/SQLite.pm	2009-03-03 22:26:45 UTC (rev 5682)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/DBIC/Test/SQLite.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,4 +1,5 @@
-package DBIx::Class::Test::SQLite;
+package # hide from PAUSE
+    DBIC::Test::SQLite;
 
 =head1 NAME
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/DBIC/Test/SQLite.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Director.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Director.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Director.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,7 +2,7 @@
     Director;
 
 use strict;
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 
 __PACKAGE__->set_table('Directors');
 __PACKAGE__->columns('All' => qw/ Name Birthday IsInsane /);


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Director.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Film.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Film.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Film.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     Film;
 
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 use strict;
 
 __PACKAGE__->set_table('Movies');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Film.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Lazy.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Lazy.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Lazy.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     Lazy;
 
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 use strict;
 
 __PACKAGE__->set_table("Lazy");


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Lazy.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Log.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyBase.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyBase.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyBase.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -8,9 +8,7 @@
 
 use vars qw/$dbh/;
 
-# temporary, might get switched to the new test framework someday
-my @connect = ("dbi:mysql:test", "", "", { PrintError => 0});
-
+my @connect = (@ENV{map { "DBICTEST_MYSQL_${_}" } qw/DSN USER PASS/}, { PrintError => 0});
 $dbh = DBI->connect(@connect) or die DBI->errstr;
 my @table;
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyBase.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyFilm.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyFoo.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyFoo.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyFoo.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -3,6 +3,8 @@
 
 use base 'MyBase';
 
+use Date::Simple 3.03;
+
 use strict;
 
 __PACKAGE__->set_table();


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyFoo.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyStar.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyStarLink.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/MyStarLinkMCPK.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Order.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Order.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Order.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,7 +2,7 @@
     Order;
 
 use strict;
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 
 __PACKAGE__->set_table('orders');
 __PACKAGE__->table_alias('orders');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Order.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/OtherFilm.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/OtherThing.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/OtherThing.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/OtherThing.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,5 +1,5 @@
 package OtherThing;
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 
 OtherThing->set_table("other_thing");
 OtherThing->columns(All => qw(id));


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/OtherThing.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/PgBase.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Thing.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Thing.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Thing.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,5 +1,5 @@
 package Thing;
-use base 'DBIx::Class::Test::SQLite';
+use base 'DBIC::Test::SQLite';
 
 Thing->set_table("thing");
 Thing->columns(All => qw(id that_thing));


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/cdbi/testlib/Thing.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/count/distinct.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/count/distinct.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/count/distinct.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,99 @@
+use strict;
+use warnings;  
+
+use Test::More;
+use Test::Exception;
+
+use lib qw(t/lib);
+
+use DBICTest;
+use DBIC::SqlMakerTest;
+
+my $schema = DBICTest->init_schema();
+
+eval "use DBD::SQLite";
+plan skip_all => 'needs DBD::SQLite for testing' if $@;
+plan tests => 22;
+
+# The tag Blue is assigned to cds 1 2 3 and 5
+# The tag Cheesy is assigned to cds 2 4 and 5
+#
+# This combination should make some interesting group_by's
+#
+my $rs;
+my $in_rs = $schema->resultset('Tag')->search({ tag => [ 'Blue', 'Cheesy' ] });
+
+$rs = $schema->resultset('Tag')->search({ tag => 'Blue' });
+is($rs->count, 4, 'Count without DISTINCT');
+
+$rs = $schema->resultset('Tag')->search({ tag => [ 'Blue', 'Cheesy' ] }, { group_by => 'tag' });
+is($rs->count, 2, 'Count with single column group_by');
+
+$rs = $schema->resultset('Tag')->search({ tag => [ 'Blue', 'Cheesy' ] }, { group_by => 'cd' });
+is($rs->count, 5, 'Count with another single column group_by');
+
+$rs = $schema->resultset('Tag')->search({ tag => 'Blue' }, { group_by => [ qw/tag cd/ ]});
+is($rs->count, 4, 'Count with multiple column group_by');
+
+$rs = $schema->resultset('Tag')->search({ tag => 'Blue' }, { distinct => 1 });
+is($rs->count, 4, 'Count with single column distinct');
+
+$rs = $schema->resultset('Tag')->search({ tag => { -in => $in_rs->get_column('tag')->as_query } });
+is($rs->count, 7, 'Count with IN subquery');
+
+$rs = $schema->resultset('Tag')->search({ tag => { -in => $in_rs->get_column('tag')->as_query } }, { group_by => 'tag' });
+is($rs->count, 2, 'Count with IN subquery with outside group_by');
+
+$rs = $schema->resultset('Tag')->search({ tag => { -in => $in_rs->get_column('tag')->as_query } }, { distinct => 1 });
+is($rs->count, 7, 'Count with IN subquery with outside distinct');
+
+$rs = $schema->resultset('Tag')->search({ tag => { -in => $in_rs->get_column('tag')->as_query } }, { distinct => 1, select => 'tag' }), 
+is($rs->count, 2, 'Count with IN subquery with outside distinct on a single column');
+
+$rs = $schema->resultset('Tag')->search({ tag => { -in => $in_rs->search({}, { group_by => 'tag' })->get_column('tag')->as_query } });
+is($rs->count, 7, 'Count with IN subquery with single group_by');
+
+$rs = $schema->resultset('Tag')->search({ tag => { -in => $in_rs->search({}, { group_by => 'cd' })->get_column('tag')->as_query } });
+is($rs->count, 7, 'Count with IN subquery with another single group_by');
+
+$rs = $schema->resultset('Tag')->search({ tag => { -in => $in_rs->search({}, { group_by => [ qw/tag cd/ ] })->get_column('tag')->as_query } });
+is($rs->count, 7, 'Count with IN subquery with multiple group_by');
+
+$rs = $schema->resultset('Tag')->search({ tag => \"= 'Blue'" });
+is($rs->count, 4, 'Count without DISTINCT, using literal SQL');
+
+$rs = $schema->resultset('Tag')->search({ tag => \" IN ('Blue', 'Cheesy')" }, { group_by => 'tag' });
+is($rs->count, 2, 'Count with literal SQL and single group_by');
+
+$rs = $schema->resultset('Tag')->search({ tag => \" IN ('Blue', 'Cheesy')" }, { group_by => 'cd' });
+is($rs->count, 5, 'Count with literal SQL and another single group_by');
+
+$rs = $schema->resultset('Tag')->search({ tag => \" IN ('Blue', 'Cheesy')" }, { group_by => [ qw/tag cd/ ] });
+is($rs->count, 7, 'Count with literal SQL and multiple group_by');
+
+$rs = $schema->resultset('Tag')->search({ tag => 'Blue' }, { '+select' => { max => 'tagid' }, distinct => 1 });
+is($rs->count, 4, 'Count with +select aggreggate');
+
+$rs = $schema->resultset('Tag')->search({}, { select => 'length(me.tag)', distinct => 1 });
+is($rs->count, 3, 'Count by distinct function result as select literal');
+
+eval {
+  my @warnings;
+  local $SIG{__WARN__} = sub { $_[0] =~ /The select => { distinct => ... } syntax will be deprecated/ 
+    ? push @warnings, @_
+    : warn @_
+  };
+  my $row = $schema->resultset('Tag')->search({}, { select => { distinct => 'tag' } })->first;
+  is (@warnings, 1, 'Warned about deprecated distinct') if $DBIx::Class::VERSION < 0.09;
+};
+ok ($@, 'Exception on deprecated distinct usage thrown') if $DBIx::Class::VERSION >= 0.09;
+
+throws_ok(
+  sub { my $row = $schema->resultset('Tag')->search({}, { select => { distinct => [qw/tag cd/] } })->first },
+  qr/select => { distinct => ... } syntax is not supported for multiple columns/,
+  'throw on unsupported syntax'
+);
+
+# These two rely on the database to throw an exception. This might not be the case one day. Please revise.
+dies_ok(sub { my $count = $schema->resultset('Tag')->search({}, { '+select' => \'tagid AS tag_id', distinct => 1 })->count }, 'expecting to die');
+dies_ok(sub { my $count = $schema->resultset('Tag')->search({}, { select => { length => 'tag' }, distinct => 1 })->count }, 'expecting to die');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/count/distinct.t
___________________________________________________________________
Name: svn:mergeinfo
   + 
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/count/grouped_pager.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/count/grouped_pager.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/count/grouped_pager.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,44 @@
+use strict;
+use warnings;
+
+use Test::More;
+
+use lib qw(t/lib);
+
+use DBICTest;
+
+plan tests => 7;
+
+my $schema = DBICTest->init_schema();
+
+use Data::Dumper;
+
+# add 2 extra artists
+$schema->populate ('Artist', [
+    [qw/name/],
+    [qw/ar_1/],
+    [qw/ar_2/],
+]);
+
+# add 3 extra cds to every artist
+for my $ar ($schema->resultset ('Artist')->all) {
+  for my $cdnum (1 .. 3) {
+    $ar->create_related ('cds', {
+      title => "bogon $cdnum",
+      year => 2000 + $cdnum,
+    });
+  }
+}
+
+my $cds = $schema->resultset ('CD')->search ({}, { group_by => 'artist' } );
+is ($cds->count, 5, 'Resultset collapses to 5 groups');
+
+my ($pg1, $pg2, $pg3) = map { $cds->search_rs ({}, {rows => 2, page => $_}) } (1..3);
+
+for ($pg1, $pg2, $pg3) {
+  is ($_->pager->total_entries, 5, 'Total count via pager correct');
+}
+
+is ($pg1->count, 2, 'First page has 2 groups');
+is ($pg2->count, 2, 'Second page has 2 groups');
+is ($pg3->count, 1, 'Third page has one group remaining');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/count/grouped_pager.t
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/count/in_subquery.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/count/in_subquery.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/count/in_subquery.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,26 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Data::Dumper;
+
+use Test::More;
+
+plan ( tests => 1 );
+
+use lib qw(t/lib);
+use DBICTest;
+use DBIC::SqlMakerTest;
+
+my $schema = DBICTest->init_schema();
+
+{
+    my $rs = $schema->resultset("CD")->search(
+        { 'artist.name' => 'Caterwauler McCrae' },
+        { join => [qw/artist/]}
+    );
+    my $squery = $rs->get_column('cdid')->as_query;
+    my $subsel_rs = $schema->resultset("CD")->search( { cdid => { IN => $squery } } );
+    is($subsel_rs->count, $rs->count, 'Subselect on PK got the same row count');
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/count/in_subquery.t
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/count/joined.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/count/joined.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/count/joined.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,31 @@
+use strict;
+use warnings;
+
+use Test::More;
+
+use lib qw(t/lib);
+
+use DBICTest;
+
+plan tests => 3;
+
+my $schema = DBICTest->init_schema();
+
+my $cds = $schema->resultset("CD")->search({ cdid => 1 }, { join => { cd_to_producer => 'producer' } });
+cmp_ok($cds->count, '>', 1, "extra joins explode entity count");
+
+is (
+  $cds->search({}, { prefetch => 'cd_to_producer' })->count,
+  1,
+  "Count correct with extra joins collapsed by prefetch"
+);
+
+is (
+  $cds->search({}, { distinct => 1 })->count,
+  1,
+  "Count correct with requested distinct collapse of main table"
+);
+
+
+
+


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/count/joined.t
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/count/prefetch.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/count/prefetch.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/count/prefetch.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,63 @@
+use strict;
+use warnings;
+
+use lib qw(t/lib);
+
+use Test::More;
+use DBICTest;
+use DBIC::SqlMakerTest;
+use DBIC::DebugObj;
+
+plan tests => 6;
+
+my $schema = DBICTest->init_schema();
+
+# collapsing prefetch
+{
+  my $rs = $schema->resultset("Artist")
+            ->search_related('cds',
+                { 'tracks.position' => [1,2] },
+                { prefetch => [qw/tracks artist/] },
+            );
+  is ($rs->all, 5, 'Correct number of objects');
+
+
+  my ($sql, @bind);
+  $schema->storage->debugobj(DBIC::DebugObj->new(\$sql, \@bind));
+  $schema->storage->debug(1);
+
+
+  is ($rs->count, 5, 'Correct count');
+
+  is_same_sql_bind (
+    $sql,
+    \@bind,
+    'SELECT COUNT( * ) FROM (SELECT cds.cdid FROM artist me LEFT JOIN cd cds ON cds.artist = me.artistid LEFT JOIN track tracks ON tracks.cd = cds.cdid JOIN artist artist ON artist.artistid = cds.artist WHERE tracks.position = ? OR tracks.position = ? GROUP BY cds.cdid) count_subq',
+    [ qw/'1' '2'/ ],
+  );
+}
+
+# non-collapsing prefetch (no multi prefetches)
+{
+  my $rs = $schema->resultset("CD")
+            ->search_related('tracks',
+                { position => [1,2] },
+                { prefetch => [qw/disc lyrics/] },
+            );
+  is ($rs->all, 10, 'Correct number of objects');
+
+
+  my ($sql, @bind);
+  $schema->storage->debugobj(DBIC::DebugObj->new(\$sql, \@bind));
+  $schema->storage->debug(1);
+
+
+  is ($rs->count, 10, 'Correct count');
+
+  is_same_sql_bind (
+    $sql,
+    \@bind,
+    'SELECT COUNT( * ) FROM cd me LEFT JOIN track tracks ON tracks.cd = me.cdid JOIN cd disc ON disc.cdid = tracks.cd LEFT JOIN lyrics lyrics ON lyrics.track_id = tracks.trackid WHERE ( ( position = ? OR position = ? ) )',
+    [ qw/'1' '2'/ ],
+  );
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/count/prefetch.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/dbh_do.t
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/delete/m2m.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/deleting_many_to_many.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/delete/m2m.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/delete/m2m.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,23 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;  
+
+use Test::More;
+use lib qw(t/lib);
+use DBICTest;
+
+my $schema = DBICTest->init_schema();
+
+plan tests => 5;
+
+my $cd = $schema->resultset("CD")->find(2);
+ok $cd->liner_notes;
+ok keys %{$cd->{_relationship_data}}, "_relationship_data populated";
+
+$cd->discard_changes;
+ok $cd->liner_notes, 'relationships still valid after discarding changes';
+
+ok $cd->liner_notes->delete;
+$cd->discard_changes;
+ok !$cd->liner_notes, 'discard_changes resets relationship';
\ No newline at end of file


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/delete/m2m.t
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/delete/related.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/53delete_related.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/delete/related.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/delete/related.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,61 @@
+use Test::More;
+use strict;
+use warnings;
+use lib qw(t/lib);
+use DBICTest;
+
+plan tests => 4;
+
+my $schema = DBICTest->init_schema();
+
+my $ars = $schema->resultset('Artist');
+my $cdrs = $schema->resultset('CD');
+my $cd2pr_rs = $schema->resultset('CD_to_Producer');
+
+# create some custom entries
+$ars->populate ([
+  [qw/artistid  name/],
+  [qw/71        a1/],
+  [qw/72        a2/],
+  [qw/73        a3/],
+]);
+
+$cdrs->populate ([
+  [qw/cdid artist title   year/],
+  [qw/70   71     delete0 2005/],
+  [qw/71   72     delete1 2005/],
+  [qw/72   72     delete2 2005/],
+  [qw/73   72     delete3 2006/],
+  [qw/74   72     delete4 2007/],
+  [qw/75   73     delete5 2008/],
+]);
+
+my $prod = $schema->resultset('Producer')->create ({ name => 'deleter' });
+my $prod_cd = $cdrs->find (70);
+my $cd2pr = $cd2pr_rs->create ({
+  producer => $prod,
+  cd => $prod_cd,
+});
+
+my $total_cds = $cdrs->count;
+
+# test that delete_related w/o conditions deletes all related records only
+$ars->search ({name => 'a3' })->search_related ('cds')->delete;
+is ($cdrs->count, $total_cds -= 1, 'related delete ok');
+
+my $a2_cds = $ars->search ({ name => 'a2' })->search_related ('cds');
+
+# test that related deletion w/conditions deletes just the matched related records only
+$a2_cds->search ({ year => 2005 })->delete;
+is ($cdrs->count, $total_cds -= 2, 'related + condition delete ok');
+
+# test that related deletion with limit condition works
+$a2_cds->search ({}, { rows => 1})->delete;
+is ($cdrs->count, $total_cds -= 1, 'related + limit delete ok');
+
+TODO: {
+  local $TODO = 'delete_related is based on search_related which is based on search which does not understand object arguments';
+  my $cd2pr_count = $cd2pr_rs->count;
+  $prod_cd->delete_related('cd_to_producer', { producer => $prod } );
+  is ($cd2pr_rs->count, $cd2pr_count -= 1, 'm2m link deleted succesfully');
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/delete/related.t
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: DBIx-Class/0.08/branches/sybase_noquote/t/deleting_many_to_many.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/deleting_many_to_many.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/deleting_many_to_many.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,23 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use warnings;  
-
-use Test::More;
-use lib qw(t/lib);
-use DBICTest;
-
-my $schema = DBICTest->init_schema();
-
-plan tests => 5;
-
-my $cd = $schema->resultset("CD")->find(2);
-ok $cd->liner_notes;
-ok keys %{$cd->{_relationship_data}}, "_relationship_data populated";
-
-$cd->discard_changes;
-ok $cd->liner_notes, 'relationships still valid after discarding changes';
-
-ok $cd->liner_notes->delete;
-$cd->discard_changes;
-ok !$cd->liner_notes, 'discard_changes resets relationship';
\ No newline at end of file


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/discard_changes_in_DESTROY.t
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/from_subquery.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/from_subquery.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/from_subquery.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,174 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Test::More;
+
+BEGIN {
+    eval "use SQL::Abstract 1.49";
+    plan $@
+        ? ( skip_all => "Needs SQLA 1.49+" )
+        : ( tests => 8 );
+}
+
+use lib qw(t/lib);
+use DBICTest;
+use DBIC::SqlMakerTest;
+
+my $schema = DBICTest->init_schema();
+my $art_rs = $schema->resultset('Artist');
+my $cdrs = $schema->resultset('CD');
+
+{
+  my $cdrs2 = $cdrs->search({
+    artist_id => { 'in' => $art_rs->search({}, { rows => 1 })->get_column( 'id' )->as_query },
+  });
+
+  is_same_sql_bind(
+    $cdrs2->as_query,
+    "(SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE artist_id IN ( SELECT id FROM artist me LIMIT 1 ))",
+    [],
+  );
+}
+
+{
+  my $rs = $art_rs->search(
+    {},
+    {
+      'select' => [
+        $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
+      ],
+    },
+  );
+
+  is_same_sql_bind(
+    $rs->as_query,
+    "(SELECT (SELECT id FROM cd me LIMIT 1) FROM artist me)",
+    [],
+  );
+}
+
+{
+  my $rs = $art_rs->search(
+    {},
+    {
+      '+select' => [
+        $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
+      ],
+    },
+  );
+
+  is_same_sql_bind(
+    $rs->as_query,
+    "(SELECT me.artistid, me.name, me.rank, me.charfield, (SELECT id FROM cd me LIMIT 1) FROM artist me)",
+    [],
+  );
+}
+
+# simple from
+{
+  my $rs = $cdrs->search(
+    {},
+    {
+      alias => 'cd2',
+      from => [
+        { cd2 => $cdrs->search({ id => { '>' => 20 } })->as_query },
+      ],
+    },
+  );
+
+  is_same_sql_bind(
+    $rs->as_query,
+    "(SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track FROM (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE ( id > ? ) ) cd2)",
+    [
+      [ 'id', 20 ]
+    ],
+  );
+}
+
+# nested from
+{
+  my $art_rs2 = $schema->resultset('Artist')->search({}, 
+  {
+    from => [ { 'me' => 'artist' }, 
+      [ { 'cds' => $cdrs->search({},{ 'select' => [\'me.artist as cds_artist' ]})->as_query },
+      { 'me.artistid' => 'cds_artist' } ] ]
+  });
+
+  is_same_sql_bind(
+    $art_rs2->as_query,
+    "(SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me JOIN (SELECT me.artist as cds_artist FROM cd me) cds ON me.artistid = cds_artist)",
+    []
+  );
+
+
+}
+
+# nested subquery in from
+{
+  my $rs = $cdrs->search(
+    {},
+    {
+      alias => 'cd2',
+      from => [
+        { cd2 => $cdrs->search(
+            { id => { '>' => 20 } }, 
+            { 
+                alias => 'cd3',
+                from => [ 
+                { cd3 => $cdrs->search( { id => { '<' => 40 } } )->as_query }
+                ],
+            }, )->as_query },
+      ],
+    },
+  );
+
+  is_same_sql_bind(
+    $rs->as_query,
+    "(SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track 
+      FROM 
+        (SELECT cd3.cdid,cd3.artist,cd3.title,cd3.year,cd3.genreid,cd3.single_track 
+          FROM 
+            (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track 
+              FROM cd me WHERE ( id < ? ) ) cd3
+          WHERE ( id > ? ) ) cd2)",
+    [
+      [ 'id', 40 ], 
+      [ 'id', 20 ]
+    ],
+  );
+
+}
+
+{
+  my $rs = $cdrs->search({
+    year => {
+      '=' => $cdrs->search(
+        { artistid => { '=' => \'me.artistid' } },
+        { alias => 'inner' }
+      )->get_column('year')->max_rs->as_query,
+    },
+  });
+  is_same_sql_bind(
+    $rs->as_query,
+    "(SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE year = (SELECT MAX(inner.year) FROM cd inner WHERE artistid = me.artistid))",
+    [],
+  );
+}
+
+{
+  my $rs = $cdrs->search(
+    {},
+    {
+      alias => 'cd2',
+      from => [
+        { cd2 => $cdrs->search({ title => 'Thriller' })->as_query },
+      ],
+    },
+  );
+
+  is_same_sql_bind(
+    $rs->as_query,
+    "(SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track FROM (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE ( title = ? ) ) cd2)",
+    [ [ 'title', 'Thriller' ] ],
+  );
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/from_subquery.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBIC/SqlMakerTest.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBIC/SqlMakerTest.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBIC/SqlMakerTest.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -3,145 +3,53 @@
 use strict;
 use warnings;
 
-use base qw/Test::Builder::Module Exporter/;
+use base qw/Exporter/;
 
+use Carp;
+use SQL::Abstract::Test;
+
 our @EXPORT = qw/
-  &is_same_sql_bind
-  &is_same_sql
-  &is_same_bind
-  &eq_sql
-  &eq_bind
-  &eq_sql_bind
+  is_same_sql_bind
+  is_same_sql
+  is_same_bind
 /;
+our @EXPORT_OK = qw/
+  eq_sql
+  eq_bind
+  eq_sql_bind
+/;
 
+sub is_same_sql_bind {
+  # unroll possible as_query arrayrefrefs
+  my @args;
 
-{
-  package DBIC::SqlMakerTest::SQLATest;
+  for (1,2) {
+    my $chunk = shift @_;
 
-  # replacement for SQL::Abstract::Test if not available
-
-  use strict;
-  use warnings;
-
-  use base qw/Test::Builder::Module Exporter/;
-
-  use Scalar::Util qw(looks_like_number blessed reftype);
-  use Data::Dumper;
-  use Test::Builder;
-  use Test::Deep qw(eq_deeply);
-
-  our $tb = __PACKAGE__->builder;
-
-  sub is_same_sql_bind
-  {
-    my ($sql1, $bind_ref1, $sql2, $bind_ref2, $msg) = @_;
-
-    my $same_sql = eq_sql($sql1, $sql2);
-    my $same_bind = eq_bind($bind_ref1, $bind_ref2);
-
-    $tb->ok($same_sql && $same_bind, $msg);
-
-    if (!$same_sql) {
-      _sql_differ_diag($sql1, $sql2);
+    if ( ref $chunk eq 'REF' and ref $$chunk eq 'ARRAY' ) {
+      my ($sql, @bind) = @$$chunk;
+      push @args, ($sql, \@bind);
     }
-    if (!$same_bind) {
-      _bind_differ_diag($bind_ref1, $bind_ref2);
+    else {
+      push @args, $chunk, shift @_;
     }
-  }
 
-  sub is_same_sql
-  {
-    my ($sql1, $sql2, $msg) = @_;
-
-    my $same_sql = eq_sql($sql1, $sql2);
-
-    $tb->ok($same_sql, $msg);
-
-    if (!$same_sql) {
-      _sql_differ_diag($sql1, $sql2);
-    }
   }
 
-  sub is_same_bind
-  {
-    my ($bind_ref1, $bind_ref2, $msg) = @_;
+  push @args, shift @_;
 
-    my $same_bind = eq_bind($bind_ref1, $bind_ref2);
+  croak "Unexpected argument(s) supplied to is_same_sql_bind: " . join ('; ', @_)
+    if @_;
 
-    $tb->ok($same_bind, $msg);
-
-    if (!$same_bind) {
-      _bind_differ_diag($bind_ref1, $bind_ref2);
-    }
-  }
-
-  sub _sql_differ_diag
-  {
-    my ($sql1, $sql2) = @_;
-
-    $tb->diag("SQL expressions differ\n"
-      . "     got: $sql1\n"
-      . "expected: $sql2\n"
-    );
-  }
-
-  sub _bind_differ_diag
-  {
-    my ($bind_ref1, $bind_ref2) = @_;
-
-    $tb->diag("BIND values differ\n"
-      . "     got: " . Dumper($bind_ref1)
-      . "expected: " . Dumper($bind_ref2)
-    );
-  }
-
-  sub eq_sql
-  {
-    my ($left, $right) = @_;
-
-    $left =~ s/\s+//g;
-    $right =~ s/\s+//g;
-
-    return $left eq $right;
-  }
-
-  sub eq_bind
-  {
-    my ($bind_ref1, $bind_ref2) = @_;
-
-    return eq_deeply($bind_ref1, $bind_ref2);
-  }
-
-  sub eq_sql_bind
-  {
-    my ($sql1, $bind_ref1, $sql2, $bind_ref2) = @_;
-
-    return eq_sql($sql1, $sql2) && eq_bind($bind_ref1, $bind_ref2);
-  }
+  SQL::Abstract::Test::is_same_sql_bind (@args);
 }
 
-eval "use SQL::Abstract::Test;";
-if ($@ eq '') {
-  # SQL::Abstract::Test available
+*is_same_sql = \&SQL::Abstract::Test::is_same_sql;
+*is_same_bind = \&SQL::Abstract::Test::is_same_bind;
+*eq_sql = \&SQL::Abstract::Test::eq_sql;
+*eq_bind = \&SQL::Abstract::Test::eq_bind;
+*eq_sql_bind = \&SQL::Abstract::Test::eq_sql_bind;
 
-  *is_same_sql_bind = \&SQL::Abstract::Test::is_same_sql_bind;
-  *is_same_sql = \&SQL::Abstract::Test::is_same_sql;
-  *is_same_bind = \&SQL::Abstract::Test::is_same_bind;
-  *eq_sql = \&SQL::Abstract::Test::eq_sql;
-  *eq_bind = \&SQL::Abstract::Test::eq_bind;
-  *eq_sql_bind = \&SQL::Abstract::Test::eq_sql_bind;
-} else {
-  # old SQL::Abstract
-
-  *is_same_sql_bind = \&DBIC::SqlMakerTest::SQLATest::is_same_sql_bind;
-  *is_same_sql = \&DBIC::SqlMakerTest::SQLATest::is_same_sql;
-  *is_same_bind = \&DBIC::SqlMakerTest::SQLATest::is_same_bind;
-  *eq_sql = \&DBIC::SqlMakerTest::SQLATest::eq_sql;
-  *eq_bind = \&DBIC::SqlMakerTest::SQLATest::eq_bind;
-  *eq_sql_bind = \&DBIC::SqlMakerTest::SQLATest::eq_sql_bind;
-}
-
-
 1;
 
 __END__
@@ -167,23 +75,31 @@
 
 Exports functions that can be used to compare generated SQL and bind values.
 
-If L<SQL::Abstract::Test> (packaged in L<SQL::Abstract> versions 1.50 and
-above) is available, then it is used to perform the comparisons (all functions
-are delegated to id). Otherwise uses simple string comparison for the SQL
-statements and simple L<Data::Dumper>-like recursive stringification for
-comparison of bind values.
+This is a thin wrapper around L<SQL::Abstract::Test>, which makes it easier
+to compare as_query sql/bind arrayrefrefs directly.
 
-
 =head1 FUNCTIONS
 
 =head2 is_same_sql_bind
 
   is_same_sql_bind(
-    $given_sql, \@given_bind, 
+    $given_sql, \@given_bind,
     $expected_sql, \@expected_bind,
     $test_msg
   );
 
+  is_same_sql_bind(
+    $rs->as_query
+    $expected_sql, \@expected_bind,
+    $test_msg
+  );
+
+  is_same_sql_bind(
+    \[$given_sql, @given_bind],
+    $expected_sql, \@expected_bind,
+    $test_msg
+  );
+
 Compares given and expected pairs of C<($sql, \@bind)>, and calls
 L<Test::Builder/ok> on the result, with C<$test_msg> as message.
 
@@ -245,4 +161,4 @@
 Copyright 2008 by Norbert Buchmuller.
 
 This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself. 
+it under the same terms as Perl itself.

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Bogus (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Result)

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Bogus/A.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Result/A.pm	2009-03-03 22:26:45 UTC (rev 5682)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Bogus/A.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,4 +1,4 @@
-package DBICNSTest::Result::A;
+package DBICNSTest::Bogus::A;
 use base qw/DBIx::Class/;
 __PACKAGE__->load_components(qw/PK::Auto Core/);
 __PACKAGE__->table('a');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Bogus/A.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Bogus/Bigos.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Bogus/Bigos.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Bogus/Bigos.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,3 @@
+package DBICNSTest::Bogus::Bigos;
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/OtherRslt/D.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RSBase.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RSet/A.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RSet/C.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Result/A.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Result/B.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/ResultSet/A.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/ResultSet/C.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Rslt/A.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/Rslt/B.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/ResultSet/Foo.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/ResultSet.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/ResultSet_A/A.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/Schema/Foo/Sub.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/Schema/Foo.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/Schema_A/A/Sub.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICNSTest/RtBug41083/Schema_A/A.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/AuthorCheck.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/AuthorCheck.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/AuthorCheck.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,106 @@
+package # hide from PAUSE 
+    DBICTest::AuthorCheck;
+
+use strict;
+use warnings;
+
+use Path::Class qw/file dir/;
+
+_check_author_makefile() unless $ENV{DBICTEST_NO_MAKEFILE_VERIFICATION};
+
+# Die if the author did not update his makefile
+#
+# This is pretty heavy handed, so the check is pretty solid:
+#
+# 1) Assume that this particular module is loaded from -I <$root>/t/lib
+# 2) Make sure <$root>/Makefile.PL exists
+# 3) Make sure we can stat() <$root>/Makefile.PL
+#
+# If all of the above is satisfied
+#
+# *) die if <$root>/inc does not exist
+# *) die if no stat() results for <$root>/Makefile (covers no Makefile)
+# *) die if Makefile.PL mtime > Makefile mtime
+#
+sub _check_author_makefile {
+
+  my $root = _find_co_root()
+    or return;
+
+  # not using file->stat as it invokes File::stat which in turn breaks stat(_)
+  my ($mf_pl_mtime, $mf_mtime) = ( map
+    { (stat ($root->file ($_)) )[9] }
+    qw/Makefile.PL Makefile/
+  );
+
+  return unless $mf_pl_mtime;   # something went wrong during co_root detection ?
+
+  if (
+    not -d $root->subdir ('inc') 
+      or
+    not $mf_mtime
+      or
+    $mf_mtime < $mf_pl_mtime
+  ) {
+    print STDERR <<'EOE';
+
+
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+======================== FATAL ERROR ===========================
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+We have a number of reasons to believe that this is a development
+checkout and that you, the user, did not run `perl Makefile.PL`
+before using this code. You absolutely _must_ perform this step,
+as not doing so often results in a lot of wasted time for other
+contributors trying to assit you with "it broke!" problems.
+
+If you are seeing this message unexpectedly (i.e. you are in fact
+attempting a regular installation be it through CPAN or manually,
+set the variable DBICTEST_NO_MAKEFILE_VERIFICATION to a true value
+so you can continue. Also _make_absolutely_sure_ to report this to
+either the mailing list or to the irc channel as described in
+
+http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class.pm#GETTING_HELP/SUPPORT
+
+Failure to do this will make us believe that all these checks are
+indeed foolproof and we will remove the ability to override this
+entirely.
+
+The DBIC team
+
+
+
+EOE
+
+    exit 1;
+  }
+}
+
+# Try to determine the root of a checkout/untar if possible
+# or return undef
+sub _find_co_root {
+
+    my @mod_parts = split /::/, (__PACKAGE__ . '.pm');
+    my $rel_path = file (@mod_parts);
+
+    return undef unless ($INC{$rel_path});
+
+    # a bit convoluted, but what we do here essentially is:
+    #  - get the file name of this particular module
+    #  - do 'cd ..' as many times as necessary to get to t/lib/../..
+
+    my $root = dir ($INC{$rel_path});
+    for (0 .. @mod_parts + 1) {
+        $root = $root->parent;
+    }
+
+    return (-f $root->file ('Makefile.PL') )
+      ? $root
+      : undef
+    ;
+}
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/AuthorCheck.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/BaseResult.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/BaseResult.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/BaseResult.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,14 @@
+package #hide from pause
+  DBICTest::BaseResult;
+
+use strict;
+use warnings;
+
+use base qw/DBIx::Class/;
+use DBICTest::BaseResultSet;
+
+__PACKAGE__->load_components (qw/Core/);
+__PACKAGE__->table ('bogus');
+__PACKAGE__->resultset_class ('DBICTest::BaseResultSet');
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/BaseResult.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/BaseResultSet.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/BaseResultSet.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/BaseResultSet.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,13 @@
+package #hide from pause
+  DBICTest::BaseResultSet;
+
+use strict;
+use warnings;
+
+use base qw/DBIx::Class::ResultSet/;
+
+sub hri_dump {
+  return shift->search ({}, { result_class => 'DBIx::Class::ResultClass::HashRefInflator' });
+}
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/BaseResultSet.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/ErrorComponent.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/FakeComponent.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/ForeignComponent/TestComp.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/ForeignComponent.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/OptionalComponent.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Plain/Test.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Plain.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/ResultSetManager/Foo.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/ResultSetManager.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artist.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artist.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artist.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::Artist;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('artist');
 __PACKAGE__->source_info({


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artist.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ArtistSourceName.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ArtistSubclass.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ArtistUndirectedMap.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ArtistUndirectedMap.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ArtistUndirectedMap.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::ArtistUndirectedMap;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('artist_undirected_map');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ArtistUndirectedMap.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artwork.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artwork.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artwork.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE
     DBICTest::Schema::Artwork;
 
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('cd_artwork');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artwork.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artwork_to_Artist.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artwork_to_Artist.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artwork_to_Artist.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE
     DBICTest::Schema::Artwork_to_Artist;
 
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('artwork_to_artist');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Artwork_to_Artist.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/BindType.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/BindType.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/BindType.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::BindType;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('bindtype_test');
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/BindType.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Bookmark.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Bookmark.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Bookmark.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE
     DBICTest::Schema::Bookmark;
 
-    use base 'DBIx::Class::Core';
+    use base qw/DBICTest::BaseResult/;
 
 
 use strict;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Bookmark.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/BooksInLibrary.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/BooksInLibrary.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/BooksInLibrary.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,32 +1,34 @@
-package # hide from PAUSE 
-    DBICTest::Schema::BooksInLibrary;
-
-use base qw/DBIx::Class::Core/;
-
-__PACKAGE__->table('books');
-__PACKAGE__->add_columns(
-  'id' => {
-    data_type => 'integer',
-    is_auto_increment => 1,
-  },
-  'source' => {
-    data_type => 'varchar',
-    size      => '100',
-  },
-  'owner' => {
-    data_type => 'integer',
-  },
-  'title' => {
-    data_type => 'varchar',
-    size      => '100',
-  },
-  'price' => {
-    data_type => 'integer',
-    is_nullable => 1,
-  },
-);
-__PACKAGE__->set_primary_key('id');
-
-__PACKAGE__->resultset_attributes({where => { source => "Library" } });
-
-1;
+package # hide from PAUSE 
+    DBICTest::Schema::BooksInLibrary;
+
+use base qw/DBICTest::BaseResult/;
+
+__PACKAGE__->table('books');
+__PACKAGE__->add_columns(
+  'id' => {
+    data_type => 'integer',
+    is_auto_increment => 1,
+  },
+  'source' => {
+    data_type => 'varchar',
+    size      => '100',
+  },
+  'owner' => {
+    data_type => 'integer',
+  },
+  'title' => {
+    data_type => 'varchar',
+    size      => '100',
+  },
+  'price' => {
+    data_type => 'integer',
+    is_nullable => 1,
+  },
+);
+__PACKAGE__->set_primary_key('id');
+
+__PACKAGE__->resultset_attributes({where => { source => "Library" } });
+
+__PACKAGE__->belongs_to ( owner => 'DBICTest::Schema::Owners', 'owner' );
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/BooksInLibrary.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CD.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CD.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CD.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::CD;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('cd');
 __PACKAGE__->add_columns(
@@ -38,7 +38,9 @@
 });
 
 # in case this is a single-cd it promotes a track from another cd
-__PACKAGE__->belongs_to( single_track => 'DBICTest::Schema::Track' );
+__PACKAGE__->belongs_to( single_track => 'DBICTest::Schema::Track', 'single_track', 
+    { join_type => 'left'} 
+);
 
 __PACKAGE__->has_many( tracks => 'DBICTest::Schema::Track' );
 __PACKAGE__->has_many(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CD.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CD_to_Producer.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CD_to_Producer.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CD_to_Producer.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,12 +1,13 @@
 package # hide from PAUSE 
     DBICTest::Schema::CD_to_Producer;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('cd_to_producer');
 __PACKAGE__->add_columns(
   cd => { data_type => 'integer' },
   producer => { data_type => 'integer' },
+  attribute => { data_type => 'integer', is_nullable => 1 },
 );
 __PACKAGE__->set_primary_key(qw/cd producer/);
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CD_to_Producer.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Collection.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Collection.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Collection.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,30 +1,30 @@
-package # hide from PAUSE 
-    DBICTest::Schema::Collection;
-
-use base qw/DBIx::Class::Core/;
-
-__PACKAGE__->table('collection');
-__PACKAGE__->add_columns(
-  'collectionid' => {
-    data_type => 'integer',
-    is_auto_increment => 1,
-  },
-  'name' => {
-    data_type => 'varchar',
-    size      => 100,
-  },
-);
-__PACKAGE__->set_primary_key('collectionid');
-
-__PACKAGE__->has_many( collection_object => "DBICTest::Schema::CollectionObject",
-                       { "foreign.collection" => "self.collectionid" }
-                     );
-__PACKAGE__->many_to_many( objects => collection_object => "object" );
-__PACKAGE__->many_to_many( pointy_objects => collection_object => "object",
-                           { where => { "object.type" => "pointy" } }
-                         );
-__PACKAGE__->many_to_many( round_objects => collection_object => "object",
-                           { where => { "object.type" => "round" } } 
-                         );
-
-1;
+package # hide from PAUSE 
+    DBICTest::Schema::Collection;
+
+use base qw/DBICTest::BaseResult/;
+
+__PACKAGE__->table('collection');
+__PACKAGE__->add_columns(
+  'collectionid' => {
+    data_type => 'integer',
+    is_auto_increment => 1,
+  },
+  'name' => {
+    data_type => 'varchar',
+    size      => 100,
+  },
+);
+__PACKAGE__->set_primary_key('collectionid');
+
+__PACKAGE__->has_many( collection_object => "DBICTest::Schema::CollectionObject",
+                       { "foreign.collection" => "self.collectionid" }
+                     );
+__PACKAGE__->many_to_many( objects => collection_object => "object" );
+__PACKAGE__->many_to_many( pointy_objects => collection_object => "object",
+                           { where => { "object.type" => "pointy" } }
+                         );
+__PACKAGE__->many_to_many( round_objects => collection_object => "object",
+                           { where => { "object.type" => "round" } } 
+                         );
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Collection.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CollectionObject.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CollectionObject.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CollectionObject.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,24 +1,24 @@
-package # hide from PAUSE 
-    DBICTest::Schema::CollectionObject;
-
-use base qw/DBIx::Class::Core/;
-
-__PACKAGE__->table('collection_object');
-__PACKAGE__->add_columns(
-  'collection' => {
-    data_type => 'integer',
-  },
-  'object' => {
-    data_type => 'integer',
-  },
-);
-__PACKAGE__->set_primary_key(qw/collection object/);
-
-__PACKAGE__->belongs_to( collection => "DBICTest::Schema::Collection",
-                         { "foreign.collectionid" => "self.collection" }
-                       );
-__PACKAGE__->belongs_to( object => "DBICTest::Schema::TypedObject",
-                         { "foreign.objectid" => "self.object" }
-                       );
-
-1;
+package # hide from PAUSE 
+    DBICTest::Schema::CollectionObject;
+
+use base qw/DBICTest::BaseResult/;
+
+__PACKAGE__->table('collection_object');
+__PACKAGE__->add_columns(
+  'collection' => {
+    data_type => 'integer',
+  },
+  'object' => {
+    data_type => 'integer',
+  },
+);
+__PACKAGE__->set_primary_key(qw/collection object/);
+
+__PACKAGE__->belongs_to( collection => "DBICTest::Schema::Collection",
+                         { "foreign.collectionid" => "self.collection" }
+                       );
+__PACKAGE__->belongs_to( object => "DBICTest::Schema::TypedObject",
+                         { "foreign.objectid" => "self.object" }
+                       );
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/CollectionObject.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Dummy.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Dummy.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Dummy.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE
     DBICTest::Schema::Dummy;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 use strict;
 use warnings;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Dummy.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Employee.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Employee.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Employee.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::Employee;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->load_components(qw( Ordered ));
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Employee.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Encoded.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Encoded.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Encoded.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE
     DBICTest::Schema::Encoded;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 use strict;
 use warnings;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Encoded.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Event.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Event.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Event.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,7 +2,7 @@
 
 use strict;
 use warnings;
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Event.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZ.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZ.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZ.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,7 +2,7 @@
 
 use strict;
 use warnings;
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
 
@@ -10,8 +10,8 @@
 
 __PACKAGE__->add_columns(
   id => { data_type => 'integer', is_auto_increment => 1 },
-  starts_at => { data_type => 'datetime', extra => { timezone => "America/Chicago", locale => 'de_DE' } },
-  created_on => { data_type => 'timestamp', extra => { timezone => "America/Chicago", floating_tz_ok => 1 } },
+  starts_at => { data_type => 'datetime', timezone => "America/Chicago", locale => 'de_DE' },
+  created_on => { data_type => 'timestamp', timezone => "America/Chicago", floating_tz_ok => 1 },
 );
 
 __PACKAGE__->set_primary_key('id');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZ.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZDeprecated.pm (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZ.pm)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZDeprecated.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZDeprecated.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,19 @@
+package DBICTest::Schema::EventTZDeprecated;
+
+use strict;
+use warnings;
+use base qw/DBICTest::BaseResult/;
+
+__PACKAGE__->load_components(qw/InflateColumn::DateTime/);
+
+__PACKAGE__->table('event');
+
+__PACKAGE__->add_columns(
+  id => { data_type => 'integer', is_auto_increment => 1 },
+  starts_at => { data_type => 'datetime', extra => { timezone => "America/Chicago", locale => 'de_DE' } },
+  created_on => { data_type => 'timestamp', extra => { timezone => "America/Chicago", floating_tz_ok => 1 } },
+);
+
+__PACKAGE__->set_primary_key('id');
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZDeprecated.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZPg.pm (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZ.pm)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZPg.pm	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZPg.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,24 @@
+package DBICTest::Schema::EventTZPg;
+
+use strict;
+use warnings;
+use base qw/DBICTest::BaseResult/;
+
+__PACKAGE__->load_components(qw/InflateColumn::DateTime/);
+
+__PACKAGE__->table('event');
+
+__PACKAGE__->add_columns(
+  id => { data_type => 'integer', is_auto_increment => 1 },
+  starts_at => { data_type => 'datetime', timezone => "America/Chicago", locale => 'de_DE' },
+  created_on => { data_type => 'timestamp with time zone', timezone => "America/Chicago" },
+);
+
+__PACKAGE__->set_primary_key('id');
+
+sub _datetime_parser {
+  require DateTime::Format::Pg;
+  DateTime::Format::Pg->new();
+}
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/EventTZPg.pm
___________________________________________________________________
Name: svn:mergeinfo
   + 
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FileColumn.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FileColumn.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FileColumn.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -3,7 +3,7 @@
 
 use strict;
 use warnings;
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 use File::Temp qw/tempdir/;
 
 __PACKAGE__->load_components(qw/InflateColumn::File/);


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FileColumn.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ForceForeign.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ForceForeign.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ForceForeign.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE
     DBICTest::Schema::ForceForeign;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('forceforeign');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/ForceForeign.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FourKeys.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FourKeys.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FourKeys.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::FourKeys;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('fourkeys');
 __PACKAGE__->add_columns(
@@ -9,7 +9,8 @@
   'bar' => { data_type => 'integer' },
   'hello' => { data_type => 'integer' },
   'goodbye' => { data_type => 'integer' },
-  'sensors' => { data_type => 'character' },
+  'sensors' => { data_type => 'character', size => 10 },
+  'read_count' => { data_type => 'integer', is_nullable => 1 },
 );
 __PACKAGE__->set_primary_key(qw/foo bar hello goodbye/);
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FourKeys.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FourKeys_to_TwoKeys.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FourKeys_to_TwoKeys.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FourKeys_to_TwoKeys.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::FourKeys_to_TwoKeys;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('fourkeys_to_twokeys');
 __PACKAGE__->add_columns(
@@ -12,6 +12,7 @@
   't_artist' => { data_type => 'integer' },
   't_cd' => { data_type => 'integer' },
   'autopilot' => { data_type => 'character' },
+  'pilot_sequence' => { data_type => 'integer', is_nullable => 1 },
 );
 __PACKAGE__->set_primary_key(
   qw/f_foo f_bar f_hello f_goodbye t_artist t_cd/


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/FourKeys_to_TwoKeys.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Genre.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Genre.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Genre.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,7 +2,7 @@
 
 use strict;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('genre');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Genre.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Image.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Image.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Image.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::Image;
 
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('images');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Image.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/LinerNotes.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/LinerNotes.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/LinerNotes.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::LinerNotes;
 
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('liner_notes');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/LinerNotes.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Link.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Link.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Link.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE
     DBICTest::Schema::Link;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 use strict;
 use warnings;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Link.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/LyricVersion.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/LyricVersion.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/LyricVersion.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE
     DBICTest::Schema::LyricVersion;
 
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('lyric_versions');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/LyricVersion.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Lyrics.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Lyrics.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Lyrics.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::Lyrics;
 
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('lyrics');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Lyrics.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/NoPrimaryKey.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/NoPrimaryKey.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/NoPrimaryKey.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::NoPrimaryKey;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('noprimarykey');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/NoPrimaryKey.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/NoSuchClass.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/OneKey.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/OneKey.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/OneKey.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::OneKey;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('onekey');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/OneKey.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Owners.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Owners.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Owners.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,21 +1,21 @@
-package # hide from PAUSE 
-    DBICTest::Schema::Owners;
-
-use base qw/DBIx::Class::Core/;
-
-__PACKAGE__->table('owners');
-__PACKAGE__->add_columns(
-  'ownerid' => {
-    data_type => 'integer',
-    is_auto_increment => 1,
-  },
-  'name' => {
-    data_type => 'varchar',
-    size      => '100',
-  },
-);
-__PACKAGE__->set_primary_key('ownerid');
-
-__PACKAGE__->has_many(books => "DBICTest::Schema::BooksInLibrary", "owner");
-
-1;
+package # hide from PAUSE 
+    DBICTest::Schema::Owners;
+
+use base qw/DBICTest::BaseResult/;
+
+__PACKAGE__->table('owners');
+__PACKAGE__->add_columns(
+  'id' => {
+    data_type => 'integer',
+    is_auto_increment => 1,
+  },
+  'name' => {
+    data_type => 'varchar',
+    size      => '100',
+  },
+);
+__PACKAGE__->set_primary_key('id');
+
+__PACKAGE__->has_many(books => "DBICTest::Schema::BooksInLibrary", "owner");
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Owners.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Producer.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Producer.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Producer.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::Producer;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('producer');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Producer.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SelfRef.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SelfRef.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SelfRef.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,21 +1,21 @@
-package # hide from PAUSE 
-    DBICTest::Schema::SelfRef;
-
-use base 'DBIx::Class::Core';
-
-__PACKAGE__->table('self_ref');
-__PACKAGE__->add_columns(
-  'id' => {
-    data_type => 'integer',
-    is_auto_increment => 1,
-  },
-  'name' => {
-    data_type => 'varchar',
-    size      => 100,
-  },
-);
-__PACKAGE__->set_primary_key('id');
-
-__PACKAGE__->has_many( aliases => 'DBICTest::Schema::SelfRefAlias' => 'self_ref' );
-
-1;
+package # hide from PAUSE 
+    DBICTest::Schema::SelfRef;
+
+use base qw/DBICTest::BaseResult/;
+
+__PACKAGE__->table('self_ref');
+__PACKAGE__->add_columns(
+  'id' => {
+    data_type => 'integer',
+    is_auto_increment => 1,
+  },
+  'name' => {
+    data_type => 'varchar',
+    size      => 100,
+  },
+);
+__PACKAGE__->set_primary_key('id');
+
+__PACKAGE__->has_many( aliases => 'DBICTest::Schema::SelfRefAlias' => 'self_ref' );
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SelfRef.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SelfRefAlias.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SelfRefAlias.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SelfRefAlias.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,20 +1,20 @@
-package # hide from PAUSE 
-    DBICTest::Schema::SelfRefAlias;
-
-use base 'DBIx::Class::Core';
-
-__PACKAGE__->table('self_ref_alias');
-__PACKAGE__->add_columns(
-  'self_ref' => {
-    data_type => 'integer',
-  },
-  'alias' => {
-    data_type => 'integer',
-  },
-);
-__PACKAGE__->set_primary_key(qw/self_ref alias/);
-
-__PACKAGE__->belongs_to( self_ref => 'DBICTest::Schema::SelfRef' );
-__PACKAGE__->belongs_to( alias => 'DBICTest::Schema::SelfRef' );
-
-1;
+package # hide from PAUSE 
+    DBICTest::Schema::SelfRefAlias;
+
+use base qw/DBICTest::BaseResult/;
+
+__PACKAGE__->table('self_ref_alias');
+__PACKAGE__->add_columns(
+  'self_ref' => {
+    data_type => 'integer',
+  },
+  'alias' => {
+    data_type => 'integer',
+  },
+);
+__PACKAGE__->set_primary_key(qw/self_ref alias/);
+
+__PACKAGE__->belongs_to( self_ref => 'DBICTest::Schema::SelfRef' );
+__PACKAGE__->belongs_to( alias => 'DBICTest::Schema::SelfRef' );
+
+1;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SelfRefAlias.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SequenceTest.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SequenceTest.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SequenceTest.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::SequenceTest;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('sequence_test');
 __PACKAGE__->source_info({


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/SequenceTest.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Serialized.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Serialized.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Serialized.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::Serialized;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('serialized');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Serialized.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Tag.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Tag.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Tag.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::Tag;
 
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('tags');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Tag.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Track.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Track.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Track.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::Track;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 __PACKAGE__->load_components(qw/InflateColumn::DateTime Ordered/);
 
 __PACKAGE__->table('track');
@@ -26,6 +26,10 @@
     accessor => 'updated_date',
     is_nullable => 1
   },
+  last_updated_at => {
+    data_type => 'datetime',
+    is_nullable => 1
+  },
 );
 __PACKAGE__->set_primary_key('trackid');
 


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Track.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TreeLike.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TreeLike.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TreeLike.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::TreeLike;
 
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('treelike');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TreeLike.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TwoKeyTreeLike.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TwoKeyTreeLike.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TwoKeyTreeLike.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::TwoKeyTreeLike;
 
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('twokeytreelike');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TwoKeyTreeLike.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TwoKeys.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TwoKeys.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TwoKeys.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE
     DBICTest::Schema::TwoKeys;
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('twokeys');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TwoKeys.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TypedObject.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TypedObject.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TypedObject.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,7 +1,7 @@
 package # hide from PAUSE 
     DBICTest::Schema::TypedObject;
 
-use base qw/DBIx::Class::Core/;
+use base qw/DBICTest::BaseResult/;
 
 __PACKAGE__->table('typed_object');
 __PACKAGE__->add_columns(


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/TypedObject.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Year1999CDs.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Year1999CDs.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Year1999CDs.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,7 +2,7 @@
     DBICTest::Schema::Year1999CDs;
 ## Used in 104view.t
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 use DBIx::Class::ResultSource::View;
 
 __PACKAGE__->table_class('DBIx::Class::ResultSource::View');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Year1999CDs.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Year2000CDs.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Year2000CDs.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Year2000CDs.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -2,7 +2,7 @@
     DBICTest::Schema::Year2000CDs;
 ## Used in 104view.t
 
-use base 'DBIx::Class::Core';
+use base qw/DBICTest::BaseResult/;
 use DBIx::Class::ResultSource::View;
 
 __PACKAGE__->table_class('DBIx::Class::ResultSource::View');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema/Year2000CDs.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Schema.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Stats.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/SyntaxErrorComponent1.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/SyntaxErrorComponent2.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/SyntaxErrorComponent3.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Taint/Classes/Auto.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Taint/Classes/Manual.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest/Taint/Namespaces/Result/Test.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest.pm	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest.pm	2009-06-05 00:05:19 UTC (rev 6514)
@@ -3,6 +3,7 @@
 
 use strict;
 use warnings;
+use DBICTest::AuthorCheck;
 use DBICTest::Schema;
 
 =head1 NAME
@@ -74,7 +75,7 @@
     my $dbuser = $ENV{"DBICTEST_DBUSER"} || '';
     my $dbpass = $ENV{"DBICTEST_DBPASS"} || '';
 
-    my @connect_info = ($dsn, $dbuser, $dbpass, { AutoCommit => 1 });
+    my @connect_info = ($dsn, $dbuser, $dbpass, { AutoCommit => 1, %args });
 
     return @connect_info;
 }
@@ -309,7 +310,7 @@
     ]);
 
     $schema->populate('Owners', [
-        [ qw/ownerid name/ ],
+        [ qw/id name/ ],
         [ 1, "Newton" ],
         [ 2, "Waltham" ],
     ]);


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICTest.pm
___________________________________________________________________
Name: svn:executable
   - *
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICVersionNew.pm
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/DBICVersionOrig.pm
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/lib/sqlite.sql
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/lib/sqlite.sql	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/lib/sqlite.sql	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,6 +1,6 @@
 -- 
 -- Created by SQL::Translator::Producer::SQLite
--- Created on Sun Feb 22 00:15:06 2009
+-- Created on Thu May 28 10:10:00 2009
 -- 
 
 
@@ -82,6 +82,8 @@
   price integer
 );
 
+CREATE INDEX books_idx_owner_books ON books (owner);
+
 --
 -- Table: cd
 --
@@ -108,6 +110,7 @@
 CREATE TABLE cd_to_producer (
   cd integer NOT NULL,
   producer integer NOT NULL,
+  attribute integer,
   PRIMARY KEY (cd, producer)
 );
 
@@ -194,7 +197,8 @@
   bar integer NOT NULL,
   hello integer NOT NULL,
   goodbye integer NOT NULL,
-  sensors character NOT NULL,
+  sensors character(10) NOT NULL,
+  read_count integer,
   PRIMARY KEY (foo, bar, hello, goodbye)
 );
 
@@ -209,6 +213,7 @@
   t_artist integer NOT NULL,
   t_cd integer NOT NULL,
   autopilot character NOT NULL,
+  pilot_sequence integer,
   PRIMARY KEY (f_foo, f_bar, f_hello, f_goodbye, t_artist, t_cd)
 );
 
@@ -302,7 +307,7 @@
 -- Table: owners
 --
 CREATE TABLE owners (
-  ownerid INTEGER PRIMARY KEY NOT NULL,
+  id INTEGER PRIMARY KEY NOT NULL,
   name varchar(100) NOT NULL
 );
 
@@ -375,7 +380,8 @@
   cd integer NOT NULL,
   position integer NOT NULL,
   title varchar(100) NOT NULL,
-  last_updated_on datetime
+  last_updated_on datetime,
+  last_updated_at datetime
 );
 
 CREATE INDEX track_idx_cd_track ON track (cd);


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/lib/sqlite.sql
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/ordered/cascade_delete.t
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/attrs_untouched.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/attrs_untouched.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/attrs_untouched.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,34 @@
+use warnings;  
+
+use Test::More;
+use Test::Exception;
+use lib qw(t/lib);
+use DBICTest;
+use Data::Dumper;
+
+my $schema = DBICTest->init_schema();
+
+my $orig_debug = $schema->storage->debug;
+
+use IO::File;
+
+BEGIN {
+    eval "use DBD::SQLite";
+    plan $@
+        ? ( skip_all => 'needs DBD::SQLite for testing' )
+        : ( tests => 3 );
+}
+
+# bug in 0.07000 caused attr (join/prefetch) to be modifed by search
+# so we check the search & attr arrays are not modified
+my $search = { 'artist.name' => 'Caterwauler McCrae' };
+my $attr = { prefetch => [ qw/artist liner_notes/ ],
+             order_by => 'me.cdid' };
+my $search_str = Dumper($search);
+my $attr_str = Dumper($attr);
+
+my $rs = $schema->resultset("CD")->search($search, $attr);
+
+is(Dumper($search), $search_str, 'Search hash untouched after search()');
+is(Dumper($attr), $attr_str, 'Attribute hash untouched after search()');
+cmp_ok($rs + 0, '==', 3, 'Correct number of records returned');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/attrs_untouched.t
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/diamond.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/diamond.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/diamond.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,107 @@
+# Test if prefetch and join in diamond relationship fetching the correct rows
+use strict;
+use warnings;
+
+use Test::More;
+use lib qw(t/lib);
+use DBICTest;
+
+my $schema = DBICTest->init_schema();
+
+$schema->populate('Artwork', [
+    [ qw/cd_id/ ],
+    [ 1 ],
+]);
+
+$schema->populate('Artwork_to_Artist', [
+    [ qw/artwork_cd_id artist_id/ ],
+    [ 1, 2 ],
+]);
+
+my $ars = $schema->resultset ('Artwork');
+
+# The relationship diagram here is:
+#
+#  $ars --> artwork_to_artist
+#   |              |
+#   |              |
+#   V              V
+#   cd  ------>  artist
+#
+# The current artwork belongs to a cd by artist1
+# but the artwork itself is painted by artist2
+#
+# What we try is all possible permutations of join/prefetch 
+# combinations in both directions, while always expecting to
+# arrive at the specific artist at the end of each path.
+
+
+my $cd_paths = {
+  'no cd' => [],
+  'cd' => ['cd'],
+  'cd->artist1' => [{'cd' => 'artist'}]
+};
+my $a2a_paths = {
+  'no a2a' => [],
+  'a2a' => ['artwork_to_artist'],
+  'a2a->artist2' => [{'artwork_to_artist' => 'artist'}]
+};
+
+my %tests;
+
+foreach my $cd_path (keys %$cd_paths) {
+
+  foreach my $a2a_path (keys %$a2a_paths) {
+
+
+    $tests{sprintf "join %s, %s", $cd_path, $a2a_path} = $ars->search({}, {
+      'join' => [
+        @{ $cd_paths->{$cd_path} },
+        @{ $a2a_paths->{$a2a_path} },
+      ],
+      'prefetch' => [
+      ],
+    });
+
+
+    $tests{sprintf "prefetch %s, %s", $cd_path, $a2a_path} = $ars->search({}, {
+      'join' => [
+      ],
+      'prefetch' => [
+        @{ $cd_paths->{$cd_path} },
+        @{ $a2a_paths->{$a2a_path} },
+      ],
+    });
+
+
+    $tests{sprintf "join %s, prefetch %s", $cd_path, $a2a_path} = $ars->search({}, {
+      'join' => [
+        @{ $cd_paths->{$cd_path} },
+      ],
+      'prefetch' => [
+        @{ $a2a_paths->{$a2a_path} },
+      ],
+    });
+
+
+    $tests{sprintf "join %s, prefetch %s", $a2a_path, $cd_path} = $ars->search({}, {
+      'join' => [
+        @{ $a2a_paths->{$a2a_path} },
+      ],
+      'prefetch' => [
+        @{ $cd_paths->{$cd_path} },
+      ],
+    });
+
+  }
+}
+
+plan tests => (scalar (keys %tests) * 3);
+
+foreach my $name (keys %tests) {
+  foreach my $artwork ($tests{$name}->all()) {
+    is($artwork->id, 1, $name . ', correct artwork');
+    is($artwork->cd->artist->artistid, 1, $name . ', correct artist_id over cd');
+    is($artwork->artwork_to_artist->first->artist->artistid, 2, $name . ', correct artist_id over A2A');
+  }
+}
\ No newline at end of file


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/diamond.t
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/multiple_hasmany.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/multiple_hasmany.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/multiple_hasmany.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,150 @@
+use strict;
+use warnings;  
+
+use Test::More;
+use Test::Exception;
+use lib qw(t/lib);
+use DBICTest;
+use Data::Dumper;
+
+plan tests => 10;
+
+my $schema = DBICTest->init_schema();
+
+use IO::File;
+
+# once the following TODO is complete, remove the 2 warning tests immediately
+# after the TODO block
+# (the TODO block itself contains tests ensuring that the warns are removed)
+TODO: {
+    local $TODO = 'Prefetch of multiple has_many rels at the same level (currently warn to protect the clueless git)';
+
+    #( 1 -> M + M )
+    my $cd_rs = $schema->resultset('CD')->search ({ 'me.title' => 'Forkful of bees' });
+    my $pr_cd_rs = $cd_rs->search ({}, {
+        prefetch => [qw/tracks tags/],
+    });
+
+    my $tracks_rs = $cd_rs->first->tracks;
+    my $tracks_count = $tracks_rs->count;
+
+    my ($pr_tracks_rs, $pr_tracks_count);
+
+    my $queries = 0;
+    $schema->storage->debugcb(sub { $queries++ });
+    $schema->storage->debug(1);
+
+    my $o_mm_warn;
+    {
+        local $SIG{__WARN__} = sub { $o_mm_warn = shift };
+        $pr_tracks_rs = $pr_cd_rs->first->tracks;
+    };
+    $pr_tracks_count = $pr_tracks_rs->count;
+
+    ok(! $o_mm_warn, 'no warning on attempt to prefetch several same level has_many\'s (1 -> M + M)');
+
+    is($queries, 1, 'prefetch one->(has_many,has_many) ran exactly 1 query');
+    is($pr_tracks_count, $tracks_count, 'equal count of prefetched relations over several same level has_many\'s (1 -> M + M)');
+
+    for ($pr_tracks_rs, $tracks_rs) {
+        $_->result_class ('DBIx::Class::ResultClass::HashRefInflator');
+    }
+
+    is_deeply ([$pr_tracks_rs->all], [$tracks_rs->all], 'same structure returned with and without prefetch over several same level has_many\'s (1 -> M + M)');
+
+    #( M -> 1 -> M + M )
+    my $note_rs = $schema->resultset('LinerNotes')->search ({ notes => 'Buy Whiskey!' });
+    my $pr_note_rs = $note_rs->search ({}, {
+        prefetch => {
+            cd => [qw/tags tracks/]
+        },
+    });
+
+    my $tags_rs = $note_rs->first->cd->tags;
+    my $tags_count = $tags_rs->count;
+
+    my ($pr_tags_rs, $pr_tags_count);
+
+    $queries = 0;
+    $schema->storage->debugcb(sub { $queries++ });
+    $schema->storage->debug(1);
+
+    my $m_o_mm_warn;
+    {
+        local $SIG{__WARN__} = sub { $m_o_mm_warn = shift };
+        $pr_tags_rs = $pr_note_rs->first->cd->tags;
+    };
+    $pr_tags_count = $pr_tags_rs->count;
+
+    ok(! $m_o_mm_warn, 'no warning on attempt to prefetch several same level has_many\'s (M -> 1 -> M + M)');
+
+    is($queries, 1, 'prefetch one->(has_many,has_many) ran exactly 1 query');
+
+    is($pr_tags_count, $tags_count, 'equal count of prefetched relations over several same level has_many\'s (M -> 1 -> M + M)');
+
+    for ($pr_tags_rs, $tags_rs) {
+        $_->result_class ('DBIx::Class::ResultClass::HashRefInflator');
+    }
+
+    is_deeply ([$pr_tags_rs->all], [$tags_rs->all], 'same structure returned with and without prefetch over several same level has_many\'s (M -> 1 -> M + M)');
+}
+
+# remove this closure once the TODO above is working
+{
+    my $warn_re = qr/will explode the number of row objects retrievable via/;
+
+    my (@w, @dummy);
+    local $SIG{__WARN__} = sub { $_[0] =~ $warn_re ? push @w, @_ : warn @_ };
+
+    my $rs = $schema->resultset('CD')->search ({ 'me.title' => 'Forkful of bees' }, { prefetch => [qw/tracks tags/] });
+    @w = ();
+    @dummy = $rs->first;
+    is (@w, 1, 'warning on attempt prefetching several same level has_manys (1 -> M + M)');
+
+    my $rs2 = $schema->resultset('LinerNotes')->search ({ notes => 'Buy Whiskey!' }, { prefetch => { cd => [qw/tags tracks/] } });
+    @w = ();
+    @dummy = $rs2->first;
+    is (@w, 1, 'warning on attempt prefetching several same level has_manys (M -> 1 -> M + M)');
+}
+
+__END__
+The solution is to rewrite ResultSet->_collapse_result() and
+ResultSource->resolve_prefetch() to focus on the final results from the collapse
+of the data. Right now, the code doesn't treat the columns from the various
+tables as grouped entities. While there is a concept of hierarchy (so that
+prefetching down relationships does work as expected), there is no idea of what
+the final product should look like and how the various columns in the row would
+play together. So, the actual prefetch datastructure from the search would be
+very useful in working through this problem. We already have access to the PKs
+and sundry for those. So, when collapsing the search result, we know we are
+looking for 1 cd object. We also know we're looking for tracks and tags records
+-independently- of each other. So, we can grab the data for tracks and data for
+tags separately, uniqueing on the PK as appropriate. Then, when we're done with
+the given cd object's datastream, we know we're good. This should work for all
+the various scenarios.
+
+My reccommendation is the row's data is preprocessed first, breaking it up into
+the data for each of the component tables. (This could be done in the single
+table case, too, but probably isn't necessary.) So, starting with something
+like:
+  my $row = {
+    t1.col1 => 1,
+    t1.col2 => 2,
+    t2.col1 => 3,
+    t2.col2 => 4,
+    t3.col1 => 5,
+    t3.col2 => 6,
+  };
+it is massaged to look something like:
+  my $row_massaged = {
+    t1 => { col1 => 1, col2 => 2 },
+    t2 => { col1 => 3, col2 => 4 },
+    t3 => { col1 => 5, col2 => 6 },
+  };
+At this point, find the stuff that's different is easy enough to do and slotting
+things into the right spot is, likewise, pretty straightforward. Instead of
+storing things in a AoH, store them in a HoH keyed on the PKs of the the table,
+then convert to an AoH after all collapsing is done.
+
+This implies that the collapse attribute can probably disappear or, at the
+least, be turned into a boolean (which is how it's used in every other place).


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/multiple_hasmany.t
___________________________________________________________________
Name: svn:eol-style
   + native

Added: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/pollute_already_joined.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/pollute_already_joined.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/pollute_already_joined.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,63 @@
+use strict;
+use warnings;  
+
+use Test::More;
+use Test::Exception;
+use lib qw(t/lib);
+use DBICTest;
+use Data::Dumper;
+
+my $schema = DBICTest->init_schema();
+
+my $orig_debug = $schema->storage->debug;
+
+use IO::File;
+
+BEGIN {
+    eval "use DBD::SQLite";
+    plan $@
+        ? ( skip_all => 'needs DBD::SQLite for testing' )
+        : ( tests => 10 );
+}
+
+# A search() with prefetch seems to pollute an already joined resultset
+# in a way that offsets future joins (adapted from a test case by Debolaz)
+{
+  my ($cd_rs, $attrs);
+
+  # test a real-life case - rs is obtained by an implicit m2m join
+  $cd_rs = $schema->resultset ('Producer')->first->cds;
+  $attrs = Dumper $cd_rs->{attrs};
+
+  $cd_rs->search ({})->all;
+  is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after a simple search');
+
+  lives_ok (sub {
+    $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all;
+    is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after search with prefetch');
+  }, 'first prefetching search ok');
+
+  lives_ok (sub {
+    $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all;
+    is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after another search with prefetch')
+  }, 'second prefetching search ok');
+
+
+  # test a regular rs with an empty seen_join injected - it should still work!
+  $cd_rs = $schema->resultset ('CD');
+  $cd_rs->{attrs}{seen_join}  = {};
+  $attrs = Dumper $cd_rs->{attrs};
+
+  $cd_rs->search ({})->all;
+  is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after a simple search');
+
+  lives_ok (sub {
+    $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all;
+    is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after search with prefetch');
+  }, 'first prefetching search ok');
+
+  lives_ok (sub {
+    $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all;
+    is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after another search with prefetch')
+  }, 'second prefetching search ok');
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/pollute_already_joined.t
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/rows_bug.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/98rows_prefetch.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/rows_bug.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/rows_bug.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,83 @@
+# Test to ensure we get a consistent result set wether or not we use the
+# prefetch option in combination rows (LIMIT).
+use strict;
+use warnings;
+
+use Test::More;
+use lib qw(t/lib);
+use DBICTest;
+
+plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 2);
+
+my $schema = DBICTest->init_schema();
+my $no_prefetch = $schema->resultset('Artist')->search(
+  undef,
+  { rows => 3 }
+);
+
+my $use_prefetch = $schema->resultset('Artist')->search(
+  undef,
+  {
+    prefetch => 'cds',
+    rows     => 3
+  }
+);
+
+my $no_prefetch_count  = 0;
+my $use_prefetch_count = 0;
+
+is($no_prefetch->count, $use_prefetch->count, '$no_prefetch->count == $use_prefetch->count');
+
+TODO: {
+  local $TODO = "This is a difficult bug to fix, workaround is not to use prefetch with rows";
+  $no_prefetch_count++  while $no_prefetch->next;
+  $use_prefetch_count++ while $use_prefetch->next;
+  is(
+    $no_prefetch_count,
+    $use_prefetch_count,
+    "manual row count confirms consistency"
+    . " (\$no_prefetch_count == $no_prefetch_count, "
+    . " \$use_prefetch_count == $use_prefetch_count)"
+  );
+}
+
+__END__
+The fix is to, when using prefetch, take the query and put it into a subquery
+joined to the tables we're prefetching from. This might result in the same
+table being joined once in the main subquery and once in the main query. This
+may actually resolve other, unknown edgecase bugs. It is also the right way
+to do prefetching. Optimizations can come later.
+
+This means that:
+  $foo_rs->search(
+    { ... },
+    {
+      prefetch => 'bar',
+      ...
+    },
+  );
+
+becomes:
+  my $temp = $foo_rs->search(
+    { ... },
+    {
+      join => 'bar',
+      ...
+    },
+  );
+  $foo_rs->storage->schema->resultset('foo')->search(
+    undef,
+    {
+      from => [
+        { me => $temp->as_query },
+      ],
+      prefetch => 'bar',
+    },
+  );
+
+Problem:
+  * The prefetch->join change needs to happen ONLY IF there are conditions
+    that depend on bar being joined.
+  * How will this work when the $rs is further searched on? Those clauses
+    need to be added to the subquery, not the outer one. This is particularly
+    true if rows is added in the attribute later per the Pager.


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/rows_bug.t
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/standard.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/77prefetch.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/standard.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/standard.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,316 @@
+use strict;
+use warnings;  
+
+use Test::More;
+use Test::Exception;
+use lib qw(t/lib);
+use DBICTest;
+use Data::Dumper;
+
+my $schema = DBICTest->init_schema();
+
+my $orig_debug = $schema->storage->debug;
+
+use IO::File;
+
+BEGIN {
+    eval "use DBD::SQLite";
+    plan $@
+        ? ( skip_all => 'needs DBD::SQLite for testing' )
+        : ( tests => 45 );
+}
+
+my $queries = 0;
+$schema->storage->debugcb(sub { $queries++; });
+$schema->storage->debug(1);
+
+my $search = { 'artist.name' => 'Caterwauler McCrae' };
+my $attr = { prefetch => [ qw/artist liner_notes/ ],
+             order_by => 'me.cdid' };
+my $search_str = Dumper($search);
+my $attr_str = Dumper($attr);
+
+my $rs = $schema->resultset("CD")->search($search, $attr);
+my @cd = $rs->all;
+
+is($cd[0]->title, 'Spoonful of bees', 'First record returned ok');
+
+ok(!defined $cd[0]->liner_notes, 'No prefetch for NULL LEFT join');
+
+is($cd[1]->{_relationship_data}{liner_notes}->notes, 'Buy Whiskey!', 'Prefetch for present LEFT JOIN');
+
+is(ref $cd[1]->liner_notes, 'DBICTest::LinerNotes', 'Prefetch returns correct class');
+
+is($cd[2]->{_inflated_column}{artist}->name, 'Caterwauler McCrae', 'Prefetch on parent object ok');
+
+is($queries, 1, 'prefetch ran only 1 select statement');
+
+$schema->storage->debug($orig_debug);
+$schema->storage->debugobj->callback(undef);
+
+# test for partial prefetch via columns attr
+my $cd = $schema->resultset('CD')->find(1,
+    {
+      columns => [qw/title artist artist.name/], 
+      join => { 'artist' => {} }
+    }
+);
+ok(eval { $cd->artist->name eq 'Caterwauler McCrae' }, 'single related column prefetched');
+
+# start test for nested prefetch SELECT count
+$queries = 0;
+$schema->storage->debugcb(sub { $queries++ });
+$schema->storage->debug(1);
+
+$rs = $schema->resultset('Tag')->search(
+  {},
+  {
+    prefetch => { cd => 'artist' }
+  }
+);
+
+my $tag = $rs->first;
+
+is( $tag->cd->title, 'Spoonful of bees', 'step 1 ok for nested prefetch' );
+
+is( $tag->cd->artist->name, 'Caterwauler McCrae', 'step 2 ok for nested prefetch');
+
+# count the SELECTs
+#$selects++ if /SELECT(?!.*WHERE 1=0.*)/;
+is($queries, 1, 'nested prefetch ran exactly 1 select statement (excluding column_info)');
+
+$queries = 0;
+
+is($tag->search_related('cd')->search_related('artist')->first->name,
+   'Caterwauler McCrae',
+   'chained belongs_to->belongs_to search_related ok');
+
+is($queries, 0, 'chained search_related after belontgs_to->belongs_to prefetch ran no queries');
+
+$queries = 0;
+
+$cd = $schema->resultset('CD')->find(1, { prefetch => 'artist' });
+
+is($cd->{_inflated_column}{artist}->name, 'Caterwauler McCrae', 'artist prefetched correctly on find');
+
+is($queries, 1, 'find with prefetch ran exactly 1 select statement (excluding column_info)');
+
+$queries = 0;
+
+$schema->storage->debugcb(sub { $queries++; });
+
+$cd = $schema->resultset('CD')->find(1, { prefetch => { cd_to_producer => 'producer' } });
+
+is($cd->producers->first->name, 'Matt S Trout', 'many_to_many accessor ok');
+
+is($queries, 1, 'many_to_many accessor with nested prefetch ran exactly 1 query');
+
+$queries = 0;
+
+my $producers = $cd->search_related('cd_to_producer')->search_related('producer');
+
+is($producers->first->name, 'Matt S Trout', 'chained many_to_many search_related ok');
+
+is($queries, 0, 'chained search_related after many_to_many prefetch ran no queries');
+
+$schema->storage->debug($orig_debug);
+$schema->storage->debugobj->callback(undef);
+
+$rs = $schema->resultset('Tag')->search(
+  {},
+  {
+    join => { cd => 'artist' },
+    prefetch => { cd => 'artist' }
+  }
+);
+
+cmp_ok( $rs->count, '>=', 0, 'nested prefetch does not duplicate joins' );
+
+my ($artist) = $schema->resultset("Artist")->search({ 'cds.year' => 2001 },
+                 { order_by => 'artistid DESC', join => 'cds' });
+
+is($artist->name, 'Random Boy Band', "Join search by object ok");
+
+my @cds = $schema->resultset("CD")->search({ 'liner_notes.notes' => 'Buy Merch!' },
+                               { join => 'liner_notes' });
+
+cmp_ok(scalar @cds, '==', 1, "Single CD retrieved via might_have");
+
+is($cds[0]->title, "Generic Manufactured Singles", "Correct CD retrieved");
+
+my @artists = $schema->resultset("Artist")->search({ 'tags.tag' => 'Shiny' },
+                                       { join => { 'cds' => 'tags' } });
+
+cmp_ok( @artists, '==', 2, "two-join search ok" );
+
+$rs = $schema->resultset("CD")->search(
+  {},
+  { group_by => [qw/ title me.cdid /] }
+);
+
+cmp_ok( $rs->count, '==', 5, "count() ok after group_by on main pk" );
+
+cmp_ok( scalar $rs->all, '==', 5, "all() returns same count as count() after group_by on main pk" );
+
+$rs = $schema->resultset("CD")->search(
+  {},
+  { join => [qw/ artist /], group_by => [qw/ artist.name /] }
+);
+
+cmp_ok( $rs->count, '==', 3, "count() ok after group_by on related column" );
+
+$rs = $schema->resultset("Artist")->search(
+  {},
+      { join => [qw/ cds /], group_by => [qw/ me.name /], having =>{ 'MAX(cds.cdid)'=> \'< 5' } }
+);
+
+cmp_ok( $rs->all, '==', 2, "results ok after group_by on related column with a having" );
+
+$rs = $rs->search( undef, {  having =>{ 'count(*)'=> \'> 2' }});
+
+cmp_ok( $rs->all, '==', 1, "count() ok after group_by on related column with a having" );
+
+$rs = $schema->resultset("Artist")->search(
+        { 'cds.title' => 'Spoonful of bees',
+          'cds_2.title' => 'Forkful of bees' },
+        { join => [ 'cds', 'cds' ] });
+
+cmp_ok($rs->count, '==', 1, "single artist returned from multi-join");
+
+is($rs->next->name, 'Caterwauler McCrae', "Correct artist returned");
+
+$cd = $schema->resultset('Artist')->first->create_related('cds',
+    {
+    title   => 'Unproduced Single',
+    year    => 2007
+});
+
+my $left_join = $schema->resultset('CD')->search(
+    { 'me.cdid' => $cd->cdid },
+    { prefetch => { cd_to_producer => 'producer' } }
+);
+
+cmp_ok($left_join, '==', 1, 'prefetch with no join record present');
+
+$queries = 0;
+$schema->storage->debugcb(sub { $queries++ });
+$schema->storage->debug(1);
+
+my $tree_like =
+     $schema->resultset('TreeLike')->find(5,
+       { join     => { parent => { parent => 'parent' } },
+         prefetch => { parent => { parent => 'parent' } } });
+
+is($tree_like->name, 'quux', 'Bottom of tree ok');
+$tree_like = $tree_like->parent;
+is($tree_like->name, 'baz', 'First level up ok');
+$tree_like = $tree_like->parent;
+is($tree_like->name, 'bar', 'Second level up ok');
+$tree_like = $tree_like->parent;
+is($tree_like->name, 'foo', 'Third level up ok');
+
+$schema->storage->debug($orig_debug);
+$schema->storage->debugobj->callback(undef);
+
+cmp_ok($queries, '==', 1, 'Only one query run');
+
+$tree_like = $schema->resultset('TreeLike')->search({'me.id' => 2});
+$tree_like = $tree_like->search_related('children')->search_related('children')->search_related('children')->first;
+is($tree_like->name, 'quux', 'Tree search_related ok');
+
+$tree_like = $schema->resultset('TreeLike')->search_related('children',
+    { 'children.id' => 3, 'children_2.id' => 4 },
+    { prefetch => { children => 'children' } }
+  )->first;
+is(eval { $tree_like->children->first->children->first->name }, 'quux',
+   'Tree search_related with prefetch ok');
+
+$tree_like = eval { $schema->resultset('TreeLike')->search(
+    { 'children.id' => 3, 'children_2.id' => 6 }, 
+    { join => [qw/children children/] }
+  )->search_related('children', { 'children_4.id' => 7 }, { prefetch => 'children' }
+  )->first->children->first; };
+is(eval { $tree_like->name }, 'fong', 'Tree with multiple has_many joins ok');
+
+# test that collapsed joins don't get a _2 appended to the alias
+
+my $sql = '';
+$schema->storage->debugcb(sub { $sql = $_[1] });
+$schema->storage->debug(1);
+
+eval {
+  my $row = $schema->resultset('Artist')->search_related('cds', undef, {
+    join => 'tracks',
+    prefetch => 'tracks',
+  })->search_related('tracks')->first;
+};
+
+like( $sql, qr/^SELECT tracks_2\.trackid/, "join not collapsed for search_related" );
+
+$schema->storage->debug($orig_debug);
+$schema->storage->debugobj->callback(undef);
+
+$rs = $schema->resultset('Artist');
+$rs->create({ artistid => 4, name => 'Unknown singer-songwriter' });
+$rs->create({ artistid => 5, name => 'Emo 4ever' });
+ at artists = $rs->search(undef, { prefetch => 'cds', order_by => 'artistid' });
+is(scalar @artists, 5, 'has_many prefetch with adjacent empty rows ok');
+
+# -------------
+#
+# Tests for multilevel has_many prefetch
+
+# artist resultsets - with and without prefetch
+my $art_rs = $schema->resultset('Artist');
+my $art_rs_pr = $art_rs->search(
+    {},
+    {
+        join     => [ { cds => ['tracks'] } ],
+        prefetch => [ { cds => ['tracks'] } ],
+        cache    => 1 # last test needs this
+    }
+);
+
+# This test does the same operation twice - once on a
+# set of items fetched from the db with no prefetch of has_many rels
+# The second prefetches 2 levels of has_many
+# We check things are the same by comparing the name or title
+# we build everything into a hash structure and compare the one
+# from each rs to see what differs
+
+sub make_hash_struc {
+    my $rs = shift;
+
+    my $struc = {};
+    foreach my $art ( $rs->all ) {
+        foreach my $cd ( $art->cds ) {
+            foreach my $track ( $cd->tracks ) {
+                $struc->{ $art->name }{ $cd->title }{ $track->title }++;
+            }
+        }
+    }
+    return $struc;
+}
+
+$queries = 0;
+$schema->storage->debugcb(sub { $queries++ });
+$schema->storage->debug(1);
+
+my $prefetch_result = make_hash_struc($art_rs_pr);
+
+is($queries, 1, 'nested prefetch across has_many->has_many ran exactly 1 query');
+
+my $nonpre_result   = make_hash_struc($art_rs);
+
+is_deeply( $prefetch_result, $nonpre_result,
+    'Compare 2 level prefetch result to non-prefetch result' );
+
+$queries = 0;
+
+is($art_rs_pr->search_related('cds')->search_related('tracks')->first->title,
+   'Fowlin',
+   'chained has_many->has_many search_related ok'
+  );
+
+is($queries, 0, 'chained search_related after has_many->has_many prefetch ran no queries');
+


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/prefetch/standard.t
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/relationship/after_update.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/relationship_after_update.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/relationship/after_update.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/relationship/after_update.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;  
+
+use Test::More;
+use lib qw(t/lib);
+use DBICTest;
+
+my $schema = DBICTest->init_schema();
+
+plan tests => 2;
+
+my $bookmark = $schema->resultset("Bookmark")->find(1);
+my $link = $bookmark->link;
+my $link_id = $link->id;
+
+my $new_link = $schema->resultset("Link")->new({
+    id      => 42,
+    url     => "http://monstersarereal.com",
+    title   => "monstersarereal.com"
+});
+
+# Changing a relationship by id rather than by object would cause
+# old related_resultsets to be used.
+$bookmark->link($new_link->id);
+is $bookmark->link->id, $new_link->id;
+
+$bookmark->update;
+is $bookmark->link->id, $new_link->id;


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/relationship/after_update.t
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/relationship/core.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/66relationship.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/relationship/core.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/relationship/core.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,311 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Exception;
+use lib qw(t/lib);
+use DBICTest;
+
+my $schema = DBICTest->init_schema();
+
+plan tests => 78;
+
+# has_a test
+my $cd = $schema->resultset("CD")->find(4);
+my ($artist) = ($INC{'DBICTest/HelperRels'}
+                  ? $cd->artist
+                  : $cd->search_related('artist'));
+is($artist->name, 'Random Boy Band', 'has_a search_related ok');
+
+# has_many test with an order_by clause defined
+$artist = $schema->resultset("Artist")->find(1);
+my @cds = ($INC{'DBICTest/HelperRels'}
+             ? $artist->cds
+             : $artist->search_related('cds'));
+is( $cds[1]->title, 'Spoonful of bees', 'has_many search_related with order_by ok' );
+
+# search_related with additional abstract query
+ at cds = ($INC{'DBICTest/HelperRels'}
+          ? $artist->cds({ title => { like => '%of%' } })
+          : $artist->search_related('cds', { title => { like => '%of%' } } )
+       );
+is( $cds[1]->title, 'Forkful of bees', 'search_related with abstract query ok' );
+
+# creating a related object
+if ($INC{'DBICTest/HelperRels.pm'}) {
+  $artist->add_to_cds({ title => 'Big Flop', year => 2005 });
+} else {
+  my $big_flop = $artist->create_related( 'cds', {
+      title => 'Big Flop',
+      year => 2005,
+  } );
+
+ SKIP:{
+    skip "Can't fix right now", 1 if $DBIx::Class::VERSION < 0.09;
+    lives_ok { $big_flop->genre} "Don't throw exception when col is not loaded after insert";
+  };
+}
+
+my $big_flop_cd = ($artist->search_related('cds'))[3];
+is( $big_flop_cd->title, 'Big Flop', 'create_related ok' );
+
+{ # make sure we are not making pointless select queries when a FK IS NULL
+  my $queries = 0;
+  $schema->storage->debugcb(sub { $queries++; });
+  $schema->storage->debug(1);
+  $big_flop_cd->genre; #should not trigger a select query
+  is($queries, 0, 'No SELECT made for belongs_to if key IS NULL');
+  $big_flop_cd->genre_inefficient; #should trigger a select query
+  is($queries, 1, 'SELECT made for belongs_to if key IS NULL when undef_on_null_fk disabled');
+  $schema->storage->debug(0);
+  $schema->storage->debugcb(undef);
+}
+
+my( $rs_from_list ) = $artist->search_related_rs('cds');
+isa_ok( $rs_from_list, 'DBIx::Class::ResultSet', 'search_related_rs in list context returns rs' );
+
+( $rs_from_list ) = $artist->cds_rs();
+isa_ok( $rs_from_list, 'DBIx::Class::ResultSet', 'relation_rs in list context returns rs' );
+
+# count_related
+is( $artist->count_related('cds'), 4, 'count_related ok' );
+
+# set_from_related
+my $track = $schema->resultset("Track")->create( {
+  trackid => 1,
+  cd => 3,
+  position => 98,
+  title => 'Hidden Track'
+} );
+$track->set_from_related( cd => $cd );
+
+is($track->disc->cdid, 4, 'set_from_related ok, including alternative accessor' );
+
+$track->set_from_related( cd => undef );
+
+ok( !defined($track->cd), 'set_from_related with undef ok');
+
+TODO: {
+    local $TODO = 'accessing $object->rel and set_from_related';
+    my $track = $schema->resultset("Track")->new( {} );
+    $track->cd;
+    $track->set_from_related( cd => $cd ); 
+    ok ($track->cd, 'set_from_related ok after using the accessor' );
+};
+
+# update_from_related, the same as set_from_related, but it calls update afterwards
+$track = $schema->resultset("Track")->create( {
+  trackid => 2,
+  cd => 3,
+  title => 'Hidden Track 2'
+} );
+$track->update_from_related( cd => $cd );
+
+my $t_cd = ($schema->resultset("Track")->search( cd => 4, title => 'Hidden Track 2' ))[0]->cd;
+
+is( $t_cd->cdid, 4, 'update_from_related ok' );
+
+# find_or_create_related with an existing record
+$cd = $artist->find_or_create_related( 'cds', { title => 'Big Flop' } );
+is( $cd->year, 2005, 'find_or_create_related on existing record ok' );
+
+# find_or_create_related creating a new record
+$cd = $artist->find_or_create_related( 'cds', {
+  title => 'Greatest Hits',
+  year => 2006,
+} );
+is( $cd->title, 'Greatest Hits', 'find_or_create_related new record ok' );
+
+ at cds = $artist->search_related('cds');
+is( ($artist->search_related('cds'))[4]->title, 'Greatest Hits', 'find_or_create_related new record search ok' );
+
+$artist->delete_related( cds => { title => 'Greatest Hits' });
+cmp_ok( $schema->resultset("CD")->search( title => 'Greatest Hits' ), '==', 0, 'delete_related ok' );
+
+# find_or_new_related with an existing record
+$cd = $artist->find_or_new_related( 'cds', { title => 'Big Flop' } );
+is( $cd->year, 2005, 'find_or_new_related on existing record ok' );
+ok( $cd->in_storage, 'find_or_new_related on existing record: is in_storage' );
+
+# find_or_new_related instantiating a new record
+$cd = $artist->find_or_new_related( 'cds', {
+  title => 'Greatest Hits 2: Louder Than Ever',
+  year => 2007,
+} );
+is( $cd->title, 'Greatest Hits 2: Louder Than Ever', 'find_or_new_related new record ok' );
+ok( ! $cd->in_storage, 'find_or_new_related on a new record: not in_storage' );
+
+$cd->artist(undef);
+my $newartist = $cd->find_or_new_related( 'artist', {
+  name => 'Random Boy Band Two',
+  artistid => 200,
+} );
+is($newartist->name, 'Random Boy Band Two', 'find_or_new_related new artist record with id');
+is($newartist->id, 200, 'find_or_new_related new artist id set');
+
+lives_ok( 
+    sub { 
+        my $new_bookmark = $schema->resultset("Bookmark")->new_result( {} );
+        my $new_related_link = $new_bookmark->new_related( 'link', {} );
+    },
+    'No back rel'
+);
+
+
+TODO: {
+  local $TODO = "relationship checking needs fixing";
+  # try to add a bogus relationship using the wrong cols
+  eval {
+      DBICTest::Schema::Artist->add_relationship(
+          tracks => 'DBICTest::Schema::Track',
+          { 'foreign.cd' => 'self.cdid' }
+      );
+  };
+  like($@, qr/Unknown column/, 'failed when creating a rel with invalid key, ok');
+}
+  
+# another bogus relationship using no join condition
+eval {
+    DBICTest::Schema::Artist->add_relationship( tracks => 'DBICTest::Track' );
+};
+like($@, qr/join condition/, 'failed when creating a rel without join condition, ok');
+
+# many_to_many helper tests
+$cd = $schema->resultset("CD")->find(1);
+my @producers = $cd->producers();
+is( $producers[0]->name, 'Matt S Trout', 'many_to_many ok' );
+is( $cd->producers_sorted->next->name, 'Bob The Builder',
+    'sorted many_to_many ok' );
+is( $cd->producers_sorted(producerid => 3)->next->name, 'Fred The Phenotype',
+    'sorted many_to_many with search condition ok' );
+
+$cd = $schema->resultset('CD')->find(2);
+my $prod_rs = $cd->producers();
+my $prod_before_count = $schema->resultset('Producer')->count;
+is( $prod_rs->count, 0, "CD doesn't yet have any producers" );
+my $prod = $schema->resultset('Producer')->find(1);
+$cd->add_to_producers($prod);
+is( $prod_rs->count(), 1, 'many_to_many add_to_$rel($obj) count ok' );
+is( $prod_rs->first->name, 'Matt S Trout',
+    'many_to_many add_to_$rel($obj) ok' );
+$cd->remove_from_producers($prod);
+$cd->add_to_producers($prod, {attribute => 1});
+is( $prod_rs->count(), 1, 'many_to_many add_to_$rel($obj, $link_vals) count ok' );
+is( $cd->cd_to_producer->first->attribute, 1, 'many_to_many $link_vals ok');
+$cd->remove_from_producers($prod);
+$cd->set_producers([$prod], {attribute => 2});
+is( $prod_rs->count(), 1, 'many_to_many set_$rel($obj, $link_vals) count ok' );
+is( $cd->cd_to_producer->first->attribute, 2, 'many_to_many $link_vals ok');
+$cd->remove_from_producers($prod);
+is( $schema->resultset('Producer')->find(1)->name, 'Matt S Trout',
+    "producer object exists after remove of link" );
+is( $prod_rs->count, 0, 'many_to_many remove_from_$rel($obj) ok' );
+$cd->add_to_producers({ name => 'Testy McProducer' });
+is( $schema->resultset('Producer')->count, $prod_before_count+1,
+    'add_to_$rel($hash) inserted a new producer' );
+is( $prod_rs->count(), 1, 'many_to_many add_to_$rel($hash) count ok' );
+is( $prod_rs->first->name, 'Testy McProducer',
+    'many_to_many add_to_$rel($hash) ok' );
+$cd->add_to_producers({ name => 'Jack Black' });
+is( $prod_rs->count(), 2, 'many_to_many add_to_$rel($hash) count ok' );
+$cd->set_producers($schema->resultset('Producer')->all);
+is( $cd->producers->count(), $prod_before_count+2, 
+    'many_to_many set_$rel(@objs) count ok' );
+$cd->set_producers($schema->resultset('Producer')->find(1));
+is( $cd->producers->count(), 1, 'many_to_many set_$rel($obj) count ok' );
+$cd->set_producers([$schema->resultset('Producer')->all]);
+is( $cd->producers->count(), $prod_before_count+2, 
+    'many_to_many set_$rel(\@objs) count ok' );
+$cd->set_producers([$schema->resultset('Producer')->find(1)]);
+is( $cd->producers->count(), 1, 'many_to_many set_$rel([$obj]) count ok' );
+
+eval { $cd->remove_from_producers({ fake => 'hash' }); };
+like( $@, qr/needs an object/, 'remove_from_$rel($hash) dies correctly' );
+
+eval { $cd->add_to_producers(); };
+like( $@, qr/needs an object or hashref/,
+      'add_to_$rel(undef) dies correctly' );
+
+# many_to_many stresstest
+my $twokey = $schema->resultset('TwoKeys')->find(1,1);
+my $fourkey = $schema->resultset('FourKeys')->find(1,2,3,4);
+
+is( $twokey->fourkeys->count, 0, 'twokey has no fourkeys' );
+$twokey->add_to_fourkeys($fourkey, { autopilot => 'engaged' });
+my $got_fourkey = $twokey->fourkeys({ sensors => 'online' })->first;
+is( $twokey->fourkeys->count, 1, 'twokey has one fourkey' );
+is( $got_fourkey->$_, $fourkey->$_,
+    'fourkeys row has the correct value for column '.$_ )
+  for (qw(foo bar hello goodbye sensors));
+$twokey->remove_from_fourkeys($fourkey);
+is( $twokey->fourkeys->count, 0, 'twokey has no fourkeys' );
+is( $twokey->fourkeys_to_twokeys->count, 0,
+    'twokey has no links to fourkey' );
+
+
+my $undef_artist_cd = $schema->resultset("CD")->new_result({ 'title' => 'badgers', 'year' => 2007 });
+is($undef_artist_cd->has_column_loaded('artist'), '', 'FK not loaded');
+is($undef_artist_cd->search_related('artist')->count, 0, '0=1 search when FK does not exist and object not yet in db');
+eval{ 
+     $undef_artist_cd->related_resultset('artist')->new({name => 'foo'});
+};
+is( $@, '', "Object created on a resultset related to not yet inserted object");
+lives_ok{
+  $schema->resultset('Artwork')->new_result({})->cd;
+} 'undef_on_null_fk does not choke on empty conds';
+
+my $def_artist_cd = $schema->resultset("CD")->new_result({ 'title' => 'badgers', 'year' => 2007, artist => undef });
+is($def_artist_cd->has_column_loaded('artist'), 1, 'FK loaded');
+is($def_artist_cd->search_related('artist')->count, 0, 'closed search on null FK');
+
+# test undirected many-to-many relationship (e.g. "related artists")
+my $undir_maps = $schema->resultset("Artist")->find(1)->artist_undirected_maps;
+is($undir_maps->count, 1, 'found 1 undirected map for artist 1');
+
+$undir_maps = $schema->resultset("Artist")->find(2)->artist_undirected_maps;
+is($undir_maps->count, 1, 'found 1 undirected map for artist 2');
+
+my $mapped_rs = $undir_maps->search_related('mapped_artists');
+
+my @art = $mapped_rs->all;
+
+cmp_ok(@art, '==', 2, "Both artist returned from map");
+
+my $searched = $mapped_rs->search({'mapped_artists.artistid' => {'!=', undef}});
+
+cmp_ok($searched->count, '==', 2, "Both artist returned from map after adding another condition");
+
+# check join through cascaded has_many relationships
+$artist = $schema->resultset("Artist")->find(1);
+my $trackset = $artist->cds->search_related('tracks');
+# LEFT join means we also see the trackless additional album...
+cmp_ok($trackset->count, '==', 11, "Correct number of tracks for artist");
+
+# now see about updating eveything that belongs to artist 2 to artist 3
+$artist = $schema->resultset("Artist")->find(2);
+my $nartist = $schema->resultset("Artist")->find(3);
+cmp_ok($artist->cds->count, '==', 1, "Correct orig #cds for artist");
+cmp_ok($nartist->cds->count, '==', 1, "Correct orig #cds for artist");
+$artist->cds->update({artist => $nartist->id});
+cmp_ok($artist->cds->count, '==', 0, "Correct new #cds for artist");
+cmp_ok($nartist->cds->count, '==', 2, "Correct new #cds for artist");
+
+# check if is_foreign_key_constraint attr is set
+my $rs_normal = $schema->source('Track');
+my $relinfo = $rs_normal->relationship_info ('cd');
+cmp_ok($relinfo->{attrs}{is_foreign_key_constraint}, '==', 1, "is_foreign_key_constraint defined for belongs_to relationships.");
+
+my $rs_overridden = $schema->source('ForceForeign');
+my $relinfo_with_attr = $rs_overridden->relationship_info ('cd_3');
+cmp_ok($relinfo_with_attr->{attrs}{is_foreign_key_constraint}, '==', 0, "is_foreign_key_constraint defined for belongs_to relationships with attr.");
+
+# check that relationships below left join relationships are forced to left joins 
+# when traversing multiple belongs_to
+my $cds = $schema->resultset("CD")->search({ 'me.cdid' => 5 }, { join => { single_track => 'cd' } });
+is($cds->count, 1, "subjoins under left joins force_left (string)");
+
+$cds = $schema->resultset("CD")->search({ 'me.cdid' => 5 }, { join => { single_track => ['cd'] } });
+is($cds->count, 1, "subjoins under left joins force_left (arrayref)");
+
+$cds = $schema->resultset("CD")->search({ 'me.cdid' => 5 }, { join => { single_track => { cd => {} } } });
+is($cds->count, 1, "subjoins under left joins force_left (hashref)");


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/relationship/core.t
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/relationship/doesnt_exist.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/relationship_doesnt_exist.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/relationship/doesnt_exist.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/relationship/doesnt_exist.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;  
+
+use Test::More;
+use lib qw(t/lib);
+use DBICTest;
+
+my $schema = DBICTest->init_schema();
+
+plan tests => 3;
+
+my $bookmark = $schema->resultset("Bookmark")->find(1);
+my $link = $bookmark->link;
+my $link_id = $link->id;
+ok $link->id;
+
+$link->delete;
+is $schema->resultset("Link")->search(id => $link_id)->count, 0,
+    "link $link_id was deleted";
+
+# Get a fresh object with nothing cached
+$bookmark = $schema->resultset("Bookmark")->find($bookmark->id);
+
+# This would create a new link row if none existed
+$bookmark->link;
+
+is $schema->resultset("Link")->search(id => $link_id)->count, 0,
+    'accessor did not create a link object where there was none';


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/relationship/doesnt_exist.t
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: DBIx-Class/0.08/branches/sybase_noquote/t/relationship_after_update.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/relationship_after_update.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/relationship_after_update.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,30 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use warnings;  
-
-use Test::More;
-use lib qw(t/lib);
-use DBICTest;
-
-my $schema = DBICTest->init_schema();
-
-plan tests => 2;
-
-my $bookmark = $schema->resultset("Bookmark")->find(1);
-my $link = $bookmark->link;
-my $link_id = $link->id;
-
-my $new_link = $schema->resultset("Link")->new({
-    id      => 42,
-    url     => "http://monstersarereal.com",
-    title   => "monstersarereal.com"
-});
-
-# Changing a relationship by id rather than by object would cause
-# old related_resultsets to be used.
-$bookmark->link($new_link->id);
-is $bookmark->link->id, $new_link->id;
-
-$bookmark->update;
-is $bookmark->link->id, $new_link->id;

Deleted: DBIx-Class/0.08/branches/sybase_noquote/t/relationship_doesnt_exist.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/relationship_doesnt_exist.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/relationship_doesnt_exist.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,30 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use warnings;  
-
-use Test::More;
-use lib qw(t/lib);
-use DBICTest;
-
-my $schema = DBICTest->init_schema();
-
-plan tests => 3;
-
-my $bookmark = $schema->resultset("Bookmark")->find(1);
-my $link = $bookmark->link;
-my $link_id = $link->id;
-ok $link->id;
-
-$link->delete;
-is $schema->resultset("Link")->search(id => $link_id)->count, 0,
-    "link $link_id was deleted";
-
-# Get a fresh object with nothing cached
-$bookmark = $schema->resultset("Bookmark")->find($bookmark->id);
-
-# This would create a new link row if none existed
-$bookmark->link;
-
-is $schema->resultset("Link")->search(id => $link_id)->count, 0,
-    'accessor did not create a link object where there was none';

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/resultset/as_query.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/resultset/as_query.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/resultset/as_query.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -7,7 +7,7 @@
 
 use Test::More;
 
-plan ( tests => 4 );
+plan ( tests => 5 );
 
 use lib qw(t/lib);
 use DBICTest;
@@ -18,11 +18,8 @@
 my $cdrs = $schema->resultset('CD');
 
 {
-  my $arr = $art_rs->as_query;
-  my ($query, @bind) = @{$$arr};
-
   is_same_sql_bind(
-    $query, \@bind,
+    $art_rs->as_query,
     "(SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me)", [],
   );
 }
@@ -30,11 +27,8 @@
 $art_rs = $art_rs->search({ name => 'Billy Joel' });
 
 {
-  my $arr = $art_rs->as_query;
-  my ($query, @bind) = @{$$arr};
-
   is_same_sql_bind(
-    $query, \@bind,
+    $art_rs->as_query,
     "(SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me WHERE ( name = ? ))",
     [ [ name => 'Billy Joel' ] ],
   );
@@ -43,11 +37,8 @@
 $art_rs = $art_rs->search({ rank => 2 });
 
 {
-  my $arr = $art_rs->as_query;
-  my ($query, @bind) = @{$$arr};
-
   is_same_sql_bind(
-    $query, \@bind,
+    $art_rs->as_query,
     "(SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me WHERE ( ( ( rank = ? ) AND ( name = ? ) ) ) )",
     [ [ rank => 2 ], [ name => 'Billy Joel' ] ],
   );
@@ -56,14 +47,18 @@
 my $rscol = $art_rs->get_column( 'charfield' );
 
 {
-  my $arr = $rscol->as_query;
-  my ($query, @bind) = @{$$arr};
-
   is_same_sql_bind(
-    $query, \@bind,
+    $rscol->as_query,
     "(SELECT me.charfield FROM artist me WHERE ( ( ( rank = ? ) AND ( name = ? ) ) ) )",
     [ [ rank => 2 ], [ name => 'Billy Joel' ] ],
   );
 }
 
-__END__
+{
+  my $rs = $schema->resultset("CD")->search(
+    { 'artist.name' => 'Caterwauler McCrae' },
+    { join => [qw/artist/]}
+  );
+  my $subsel_rs = $schema->resultset("CD")->search( { cdid => { IN => $rs->get_column('cdid')->as_query } } );
+  is($subsel_rs->count, $rs->count, 'Subselect on PK got the same row count');
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/resultset/as_query.t
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/resultset/update_delete.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/53delete_related.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/resultset/update_delete.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/resultset/update_delete.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,95 @@
+use strict;
+use warnings;
+
+use lib qw(t/lib);
+use Test::More;
+use Test::Exception;
+use DBICTest;
+
+#plan tests => 5;
+plan 'no_plan';
+
+my $schema = DBICTest->init_schema();
+
+my $tkfks = $schema->resultset('FourKeys_to_TwoKeys');
+
+my ($fa, $fb) = $tkfks->related_resultset ('fourkeys')->populate ([
+  [qw/foo bar hello goodbye sensors read_count/],
+  [qw/1   1   1     1       a       10         /],
+  [qw/2   2   2     2       b       20         /],
+]);
+
+# This is already provided by DBICTest
+#my ($ta, $tb) = $tkfk->related_resultset ('twokeys')->populate ([
+#  [qw/artist  cd /],
+#  [qw/1       1  /],
+#  [qw/2       2  /],
+#]);
+my ($ta, $tb) = $schema->resultset ('TwoKeys')
+                  ->search ( [ { artist => 1, cd => 1 }, { artist => 2, cd => 2 } ])
+                    ->all;
+
+my $tkfk_cnt = $tkfks->count;
+
+my $non_void_ctx = $tkfks->populate ([
+  { autopilot => 'a', fourkeys =>  $fa, twokeys => $ta, pilot_sequence => 10 },
+  { autopilot => 'b', fourkeys =>  $fb, twokeys => $tb, pilot_sequence => 20 },
+  { autopilot => 'x', fourkeys =>  $fa, twokeys => $tb, pilot_sequence => 30 },
+  { autopilot => 'y', fourkeys =>  $fb, twokeys => $ta, pilot_sequence => 40 },
+]);
+is ($tkfks->count, $tkfk_cnt += 4, 'FourKeys_to_TwoKeys populated succesfully');
+
+#
+# Make sure the forced group by works (i.e. the joining does not cause double-updates)
+#
+
+# create a resultset matching $fa and $fb only
+my $fks = $schema->resultset ('FourKeys')
+                  ->search ({ map { $_ => [1, 2] } qw/foo bar hello goodbye/}, { join => 'fourkeys_to_twokeys' });
+
+is ($fks->count, 4, 'Joined FourKey count correct (2x2)');
+$fks->update ({ read_count => \ 'read_count + 1' });
+$_->discard_changes for ($fa, $fb);
+
+is ($fa->read_count, 11, 'Update ran only once on joined resultset');
+is ($fb->read_count, 21, 'Update ran only once on joined resultset');
+
+
+#
+# Make sure multicolumn in or the equivalen functions correctly
+#
+
+my $sub_rs = $tkfks->search (
+  [
+    { map { $_ => 1 } qw/artist.artistid cd.cdid fourkeys.foo fourkeys.bar fourkeys.hello fourkeys.goodbye/ },
+    { map { $_ => 2 } qw/artist.artistid cd.cdid fourkeys.foo fourkeys.bar fourkeys.hello fourkeys.goodbye/ },
+  ],
+  {
+    join => [ 'fourkeys', { twokeys => [qw/artist cd/] } ],
+  },
+);
+
+is ($sub_rs->count, 2, 'Only two rows from fourkeys match');
+
+# attempts to delete a grouped rs should fail miserably
+throws_ok (
+  sub { $sub_rs->search ({}, { distinct => 1 })->delete },
+  qr/attempted a delete operation on a resultset which does group_by/,
+  'Grouped rs update/delete not allowed',
+);
+
+# grouping on PKs only should pass
+$sub_rs->search ({}, { group_by => [ reverse $sub_rs->result_source->primary_columns ] })     # reverse to make sure the comaprison works
+          ->update ({ pilot_sequence => \ 'pilot_sequence + 1' });
+
+is_deeply (
+  [ $tkfks->search ({ autopilot => [qw/a b x y/]}, { order_by => 'autopilot' })
+            ->get_column ('pilot_sequence')->all 
+  ],
+  [qw/11 21 30 40/],
+  'Only two rows incremented',
+);
+
+$sub_rs->delete;
+
+is ($tkfks->count, $tkfk_cnt -= 2, 'Only two rows deleted');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/resultset/update_delete.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/resultset_class.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/resultset_class.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/resultset_class.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -11,7 +11,7 @@
 
 use DBICTest;
 
-is(DBICTest::Schema->source('Artist')->resultset_class, 'DBIx::Class::ResultSet', 'default resultset class');
+is(DBICTest::Schema->source('Artist')->resultset_class, 'DBICTest::BaseResultSet', 'default resultset class');
 ok(!Class::Inspector->loaded('DBICNSTest::ResultSet::A'), 'custom resultset class not loaded');
 DBICTest::Schema->source('Artist')->resultset_class('DBICNSTest::ResultSet::A');
 ok(Class::Inspector->loaded('DBICNSTest::ResultSet::A'), 'custom resultset class loaded automatically');


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/resultset_class.t
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/resultset_overload.t
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: DBIx-Class/0.08/branches/sybase_noquote/t/search/subquery.t
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/search/subquery.t	2009-06-04 23:39:23 UTC (rev 6513)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/search/subquery.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -1,13 +1,12 @@
 #!/usr/bin/perl
 
 use strict;
-use warnings FATAL => 'all';
+use warnings;
 
 use Data::Dumper;
 
 use Test::More;
 
-plan ( tests => 7 );
 
 use lib qw(t/lib);
 use DBICTest;
@@ -17,103 +16,70 @@
 my $art_rs = $schema->resultset('Artist');
 my $cdrs = $schema->resultset('CD');
 
-{
-  my $cdrs2 = $cdrs->search({
-    artist_id => { 'in' => $art_rs->search({}, { rows => 1 })->get_column( 'id' )->as_query },
-  });
+my @tests = (
+  {
+    rs => $cdrs,
+    search => {
+      artist_id => { 'in' => $art_rs->search({}, { rows => 1 })->get_column( 'id' )->as_query },
+    },
+    sqlbind => \[
+      "( SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE artist_id IN ( SELECT id FROM artist me LIMIT 1 ) )",
+    ],
+  },
 
-  my $arr = $cdrs2->as_query;
-  my ($query, @bind) = @{$$arr};
-  is_same_sql_bind(
-    $query, \@bind,
-    "SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE artist_id IN ( SELECT id FROM artist me LIMIT 1 )",
-    [],
-  );
-}
-
-{
-  my $rs = $art_rs->search(
-    {},
-    {
+  {
+    rs => $art_rs,
+    attrs => {
       'select' => [
         $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
       ],
     },
-  );
+    sqlbind => \[
+      "( SELECT (SELECT id FROM cd me LIMIT 1) FROM artist me )",
+    ],
+  },
 
-  my $arr = $rs->as_query;
-  my ($query, @bind) = @{$$arr};
-  is_same_sql_bind(
-    $query, \@bind,
-    "SELECT (SELECT id FROM cd me LIMIT 1) FROM artist me",
-    [],
-  );
-}
-
-{
-  my $rs = $art_rs->search(
-    {},
-    {
+  {
+    rs => $art_rs,
+    attrs => {
       '+select' => [
         $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
       ],
     },
-  );
+    sqlbind => \[
+      "( SELECT me.artistid, me.name, me.rank, me.charfield, (SELECT id FROM cd me LIMIT 1) FROM artist me )",
+    ],
+  },
 
-  my $arr = $rs->as_query;
-  my ($query, @bind) = @{$$arr};
-  is_same_sql_bind(
-    $query, \@bind,
-    "SELECT me.artistid, me.name, me.rank, me.charfield, (SELECT id FROM cd me LIMIT 1) FROM artist me",
-    [],
-  );
-}
-
-# simple from
-{
-  my $rs = $cdrs->search(
-    {},
-    {
+  {
+    rs => $cdrs,
+    attrs => {
       alias => 'cd2',
       from => [
         { cd2 => $cdrs->search({ id => { '>' => 20 } })->as_query },
       ],
     },
-  );
+    sqlbind => \[
+      "( SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track FROM (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE id > ?) cd2 )",
+      [ 'id', 20 ]
+    ],
+  },
 
-  my $arr = $rs->as_query;
-  my ($query, @bind) = @{$$arr};
-  is_same_sql_bind(
-    $query, \@bind,
-    "SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track FROM (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE id > 20) cd2",
-    [],
-  );
-}
-
-# nested from
-{
-  my $art_rs2 = $schema->resultset('Artist')->search({}, 
   {
-    from => [ { 'me' => 'artist' }, 
-      [ { 'cds' => $cdrs->search({},{ 'select' => [\'me.artist as cds_artist' ]})->as_query },
-      { 'me.artistid' => 'cds_artist' } ] ]
-  });
+    rs => $art_rs,
+    attrs => {
+      from => [ { 'me' => 'artist' }, 
+        [ { 'cds' => $cdrs->search({},{ 'select' => [\'me.artist as cds_artist' ]})->as_query },
+        { 'me.artistid' => 'cds_artist' } ] ]
+    },
+    sqlbind => \[
+      "( SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me JOIN (SELECT me.artist as cds_artist FROM cd me) cds ON me.artistid = cds_artist )"
+    ],
+  },
 
-  my $arr = $art_rs2->as_query;
-  my ($query, @bind) = @{$$arr};
-  is_same_sql_bind(
-    $query, \@bind,
-    "SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me JOIN (SELECT me.artist as cds_artist FROM cd me) cds ON me.artistid = cds_artist", []
-  );
-
-
-}
-
-# nested subquery in from
-{
-  my $rs = $cdrs->search(
-    {},
-    {
+  {
+    rs => $cdrs,
+    attrs => {
       alias => 'cd2',
       from => [
         { cd2 => $cdrs->search(
@@ -126,40 +92,62 @@
             }, )->as_query },
       ],
     },
-  );
+    sqlbind => \[
+      "( SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track
+        FROM
+          (SELECT cd3.cdid,cd3.artist,cd3.title,cd3.year,cd3.genreid,cd3.single_track
+            FROM
+              (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track
+                FROM cd me WHERE id < ?) cd3
+            WHERE id > ?) cd2
+      )",
+      [ 'id', 40 ],
+      [ 'id', 20 ]
+    ],
+  },
 
-  my $arr = $rs->as_query;
-  my ($query, @bind) = @{$$arr};
-  is_same_sql_bind(
-    $query, \@bind,
-    "SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track 
-      FROM 
-        (SELECT cd3.cdid,cd3.artist,cd3.title,cd3.year,cd3.genreid,cd3.single_track 
-          FROM 
-            (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track 
-              FROM cd me WHERE id < 40) cd3
-          WHERE id > 20) cd2",
-    [],
-  );
+  {
+    rs => $cdrs,
+    search => {
+      year => {
+        '=' => $cdrs->search(
+          { artistid => { '=' => \'me.artistid' } },
+          { alias => 'inner' }
+        )->get_column('year')->max_rs->as_query,
+      },
+    },
+    sqlbind => \[
+      "( SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE year = (SELECT MAX(inner.year) FROM cd inner WHERE artistid = me.artistid) )",
+    ],
+  },
 
-}
-
-{
-  my $rs = $cdrs->search({
-    year => {
-      '=' => $cdrs->search(
-        { artistid => { '=' => \'me.artistid' } },
-        { alias => 'inner' }
-      )->get_column('year')->max_rs->as_query,
+  {
+    rs => $cdrs,
+    attrs => {
+      alias => 'cd2',
+      from => [
+        { cd2 => $cdrs->search({ title => 'Thriller' })->as_query },
+      ],
     },
-  });
-  my $arr = $rs->as_query;
-  my ($query, @bind) = @{$$arr};
-  is_same_sql_bind(
-    $query, \@bind,
-    "SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE year = (SELECT MAX(inner.year) FROM cd inner WHERE artistid = me.artistid)",
-    [],
-  );
-}
+    sqlbind => \[
+      "(SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track FROM (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE title = ?) cd2)",
+      [ 'title',
+        'Thriller'
+      ]
+    ],
+  },
+);
 
-__END__
+
+plan tests => @tests * 2;
+
+for my $i (0 .. $#tests) {
+  my $t = $tests[$i];
+  for my $p (1, 2) {  # repeat everything twice, make sure we do not clobber search arguments
+    is_same_sql_bind (
+      $t->{rs}->search ($t->{search}, $t->{attrs})->as_query,
+      $t->{sqlbind},
+      sprintf 'Testcase %d, pass %d', $i+1, $p,
+    );
+  }
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/search/subquery.t
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: DBIx-Class/0.08/branches/sybase_noquote/t/zzzzzzz_perl_perf_bug.t (from rev 5682, DBIx-Class/0.08/branches/sybase_noquote/t/99rh_perl_perf_bug.t)
===================================================================
--- DBIx-Class/0.08/branches/sybase_noquote/t/zzzzzzz_perl_perf_bug.t	                        (rev 0)
+++ DBIx-Class/0.08/branches/sybase_noquote/t/zzzzzzz_perl_perf_bug.t	2009-06-05 00:05:19 UTC (rev 6514)
@@ -0,0 +1,121 @@
+use strict;
+use warnings;
+use Test::More;
+use lib qw(t/lib);
+use DBICTest; # do not remove even though it is not used
+
+# This is a rather unusual test.
+# It does not test any aspect of DBIx::Class, but instead tests the
+# perl installation this is being run under to see if it is:-
+#  1. Potentially affected by a RH perl build bug
+#  2. If so we do a performance test for the effect of
+#     that bug.
+#
+# You can skip these tests by setting the DBIC_NO_WARN_BAD_PERL env
+# variable
+#
+# If these tests fail then please read the section titled
+# Perl Performance Issues on Red Hat Systems in
+# L<DBIx::Class::Manual::Troubleshooting>
+
+plan skip_all =>
+  'Skipping RH perl performance bug tests as DBIC_NO_WARN_BAD_PERL set'
+  if ( $ENV{DBIC_NO_WARN_BAD_PERL} );
+
+plan skip_all => 'Skipping as AUTOMATED_TESTING is set'
+  if ( $ENV{AUTOMATED_TESTING} );
+
+eval "use Benchmark ':all'";
+plan skip_all => 'needs Benchmark for testing' if $@;
+
+plan tests => 3;
+
+ok( 1, 'Dummy - prevents next test timing out' );
+
+# we do a benchmark test filling an array with blessed/overloaded references,
+# against an array filled with array refs.
+# On a sane system the ratio between these operation sets is 1 - 1.5,
+# whereas a bugged system gives a ratio of around 8
+# we therefore consider there to be a problem if the ratio is >= 2
+
+my $results = timethese(
+    -1,    # run for 1 CPU second each
+    {
+        no_bless => sub {
+            my %h;
+            for ( my $i = 0 ; $i < 10000 ; $i++ ) {
+                $h{$i} = [];
+            }
+        },
+        bless_overload => sub {
+            use overload q(<) => sub { };
+            my %h;
+            for ( my $i = 0 ; $i < 10000 ; $i++ ) {
+                $h{$i} = bless [] => 'main';
+            }
+        },
+    },
+);
+
+my $ratio = $results->{no_bless}->iters / $results->{bless_overload}->iters;
+
+ok( ( $ratio < 2 ), 'Overload/bless performance acceptable' )
+  || diag(
+    "\n",
+    "This perl has a substantial slow down when handling large numbers\n",
+    "of blessed/overloaded objects.  This can severely adversely affect\n",
+    "the performance of DBIx::Class programs.  Please read the section\n",
+    "in the Troubleshooting POD documentation entitled\n",
+    "'Perl Performance Issues on Red Hat Systems'\n",
+    "As this is an extremely serious condition, the only way to skip\n",
+    "over this test is to --force the installation, or to edit the test\n",
+    "file " . __FILE__ . "\n",
+  );
+
+# We will only check for the difference in bless handling (whether the
+# bless applies to the reference or the referent) if we have seen a
+# performance issue...
+
+SKIP: {
+    skip "Not checking for bless handling as performance is OK", 1
+      if ( $ratio < 2 );
+
+    {
+        package    # don't want this in PAUSE
+          TestRHBug;
+        use overload bool => sub { 0 }
+    }
+
+    sub _has_bug_34925 {
+        my %thing;
+        my $r1 = \%thing;
+        my $r2 = \%thing;
+        bless $r1 => 'TestRHBug';
+        return !!$r2;
+    }
+
+    sub _possibly_has_bad_overload_performance {
+        return $] < 5.008009 && !_has_bug_34925();
+    }
+
+    # If this next one fails then you almost certainly have a RH derived
+    # perl with the performance bug
+    # if this test fails, look at the section titled
+    # "Perl Performance Issues on Red Hat Systems" in
+    # L<DBIx::Class::Manual::Troubleshooting>
+    # Basically you may suffer severe performance issues when running
+    # DBIx::Class (and many other) modules.  Look at getting a fixed
+    # version of the perl interpreter for your system.
+    #
+    ok( !_possibly_has_bad_overload_performance(),
+        'Checking whether bless applies to reference not object' )
+      || diag(
+        "\n",
+        "This perl is probably derived from a buggy Red Hat perl build\n",
+        "Please read the section in the Troubleshooting POD documentation\n",
+        "entitled 'Perl Performance Issues on Red Hat Systems'\n",
+        "As this is an extremely serious condition, the only way to skip\n",
+        "over this test is to --force the installation, or to edit the test\n",
+        "file " . __FILE__ . "\n",
+      );
+}


Property changes on: DBIx-Class/0.08/branches/sybase_noquote/t/zzzzzzz_perl_perf_bug.t
___________________________________________________________________
Name: svn:eol-style
   + native




More information about the Bast-commits mailing list