Merge 'trunk' into 'sybase_support'
Peter Rabbitson [Sun, 20 Sep 2009 22:51:43 +0000 (22:51 +0000)]
r7694@Thesaurus (orig r7683):  ribasushi | 2009-09-18 12:36:42 +0200
 r6389@Thesaurus (orig r6388):  caelum | 2009-05-23 22:48:06 +0200
 recreating Sybase branch
 r6395@Thesaurus (orig r6394):  caelum | 2009-05-24 01:47:32 +0200
 try not to fuck mssql with the sybase crap
 r6488@Thesaurus (orig r6487):  caelum | 2009-06-03 17:31:24 +0200
 resolve conflict
 r6490@Thesaurus (orig r6489):  caelum | 2009-06-03 18:25:36 +0200
 add missing files to sybase branch
 r6492@Thesaurus (orig r6491):  caelum | 2009-06-04 01:51:39 +0200
 fix Sybase DT stuff and storage bases
 r6493@Thesaurus (orig r6492):  caelum | 2009-06-04 02:10:45 +0200
 fix base for mssql (can't be a sybase anymore)
 r6494@Thesaurus (orig r6493):  caelum | 2009-06-04 02:20:37 +0200
 test sybase SMALLDATETIME inflation
 r6495@Thesaurus (orig r6494):  caelum | 2009-06-04 04:52:31 +0200
 update Sybase docs
 r6501@Thesaurus (orig r6500):  caelum | 2009-06-04 14:50:49 +0200
 sybase limit count without offset now works
 r6504@Thesaurus (orig r6503):  caelum | 2009-06-04 18:03:01 +0200
 use TOP for sybase limit count thanks to refactored count
 r6505@Thesaurus (orig r6504):  caelum | 2009-06-04 18:41:54 +0200
 back to counting rows for Sybase LIMIT counts
 r6506@Thesaurus (orig r6505):  caelum | 2009-06-04 19:07:48 +0200
 minor sybase count fix
 r6512@Thesaurus (orig r6511):  caelum | 2009-06-05 01:02:48 +0200
 test sybase group_by count, works
 r6513@Thesaurus (orig r6512):  caelum | 2009-06-05 01:28:18 +0200
 set date format on _rebless correctly
 r6516@Thesaurus (orig r6515):  caelum | 2009-06-05 02:24:46 +0200
 manually merged in sybase_noquote branch
 r6518@Thesaurus (orig r6517):  caelum | 2009-06-05 06:34:25 +0200
 shit doesn't work yet
 r6520@Thesaurus (orig r6519):  caelum | 2009-06-05 16:55:41 +0200
 update sybase types which shouldn't be quoted
 r6525@Thesaurus (orig r6524):  caelum | 2009-06-06 04:40:51 +0200
 tweaks to sybase types
 r6527@Thesaurus (orig r6526):  caelum | 2009-06-06 05:36:03 +0200
 temporary sybase noquote hack
 r6595@Thesaurus (orig r6594):  caelum | 2009-06-10 13:46:37 +0200
 Sybase::NoBindVars now correctly quotes
 r6596@Thesaurus (orig r6595):  caelum | 2009-06-10 14:04:19 +0200
 cache rsrc in NoBindVars, use name_sep
 r6597@Thesaurus (orig r6596):  caelum | 2009-06-10 14:35:52 +0200
 Sybase count by first pk, if available
 r6599@Thesaurus (orig r6598):  caelum | 2009-06-10 15:00:42 +0200
 cache rsrc in NoBindVars correctly
 r6600@Thesaurus (orig r6599):  caelum | 2009-06-10 15:27:41 +0200
 handle unknown rsrc in NoBindVars and Sybase::NoBindVars
 r6605@Thesaurus (orig r6604):  caelum | 2009-06-10 18:17:31 +0200
 cache rsrc properly in NoBindVars, return undef if no rsrc
 r6658@Thesaurus (orig r6657):  caelum | 2009-06-13 05:57:40 +0200
 switch to DateTime::Format::Sybase
 r6700@Thesaurus (orig r6699):  caelum | 2009-06-17 16:25:28 +0200
 rename and document dt setup method, will be an on_connect_call at later merge point
 r6701@Thesaurus (orig r6700):  caelum | 2009-06-17 16:30:08 +0200
 more dt docs reorg
 r6715@Thesaurus (orig r6714):  caelum | 2009-06-19 01:28:17 +0200
 todo tests for text/image columns in sybase
 r6716@Thesaurus (orig r6715):  caelum | 2009-06-19 01:46:56 +0200
 added connect_call_blob_setup for Sybase
 r6724@Thesaurus (orig r6723):  caelum | 2009-06-19 17:12:20 +0200
 cleanups
 r6771@Thesaurus (orig r6770):  caelum | 2009-06-23 16:42:32 +0200
 minor changes
 r6788@Thesaurus (orig r6787):  caelum | 2009-06-25 05:31:06 +0200
 fixup POD, comment out count
 r6811@Thesaurus (orig r6810):  caelum | 2009-06-28 02:14:56 +0200
 prototype blob implementation
 r6857@Thesaurus (orig r6856):  caelum | 2009-06-29 23:45:19 +0200
 branch pushed, removing
 r6868@Thesaurus (orig r6867):  caelum | 2009-06-30 03:39:51 +0200
 merge on_connect_call updates
 r6877@Thesaurus (orig r6876):  caelum | 2009-06-30 12:46:43 +0200
 code cleanups
 r6957@Thesaurus (orig r6956):  caelum | 2009-07-03 02:32:48 +0200
 minor changes
 r6959@Thesaurus (orig r6958):  caelum | 2009-07-03 05:04:12 +0200
 fix sybase mro
 r7001@Thesaurus (orig r7000):  caelum | 2009-07-07 13:34:23 +0200
 fix sybase rebless to NoBindVars
 r7021@Thesaurus (orig r7020):  caelum | 2009-07-10 12:52:13 +0200
 fix NoBindVars
 r7053@Thesaurus (orig r7052):  caelum | 2009-07-15 01:39:02 +0200
 set maxConnect in DSN and add docs
 r7065@Thesaurus (orig r7064):  caelum | 2009-07-17 09:39:54 +0200
 make insertion of blobs into tables with identity columns work, other minor fixes
 r7070@Thesaurus (orig r7069):  caelum | 2009-07-17 23:30:13 +0200
 some compatibility updated for older DBD::Sybase versions, some initial work on _select_args for blobs
 r7072@Thesaurus (orig r7071):  caelum | 2009-07-19 23:57:11 +0200
 mangling _select_args turned out to be unnecessary
 r7073@Thesaurus (orig r7072):  caelum | 2009-07-20 01:02:19 +0200
 minor cleanups
 r7074@Thesaurus (orig r7073):  caelum | 2009-07-20 15:47:48 +0200
 blob update now works
 r7076@Thesaurus (orig r7075):  caelum | 2009-07-20 19:06:46 +0200
 change the (incorrect) version check to a check for FreeTDS
 r7077@Thesaurus (orig r7076):  caelum | 2009-07-20 19:13:25 +0200
 better check for FreeTDS thanks to arcanez
 r7089@Thesaurus (orig r7086):  caelum | 2009-07-22 07:09:21 +0200
 minor cleanups
 r7091@Thesaurus (orig r7088):  caelum | 2009-07-22 17:05:37 +0200
 remove unnecessary test Result class
 r7092@Thesaurus (orig r7089):  caelum | 2009-07-23 00:47:14 +0200
 fix doc for how to check for FreeTDS
 r7095@Thesaurus (orig r7092):  caelum | 2009-07-23 14:35:53 +0200
 doc tweak
 r7115@Thesaurus (orig r7112):  caelum | 2009-07-24 09:58:24 +0200
 add support for IDENTITY_INSERT
 r7117@Thesaurus (orig r7114):  caelum | 2009-07-24 16:19:08 +0200
 savepoint support
 r7120@Thesaurus (orig r7117):  caelum | 2009-07-24 20:35:37 +0200
 fix race condition in last_insert_id with placeholders
 r7121@Thesaurus (orig r7118):  caelum | 2009-07-24 21:22:25 +0200
 code cleanup
 r7124@Thesaurus (orig r7121):  caelum | 2009-07-25 16:19:58 +0200
 use _resolve_column_info in NoBindVars
 r7125@Thesaurus (orig r7122):  caelum | 2009-07-25 21:23:49 +0200
 make insert work as a nested transaction too
 r7126@Thesaurus (orig r7123):  caelum | 2009-07-25 22:52:17 +0200
 add money type support
 r7128@Thesaurus (orig r7125):  caelum | 2009-07-27 03:48:35 +0200
 better FreeTDS support
 r7130@Thesaurus (orig r7127):  caelum | 2009-07-28 06:23:54 +0200
 minor refactoring, cleanups, doc updates
 r7131@Thesaurus (orig r7128):  caelum | 2009-07-28 09:32:45 +0200
 forgot to set mro in dbi::cursor
 r7141@Thesaurus (orig r7138):  caelum | 2009-07-30 10:21:20 +0200
 better test for "smalldatetime" in Sybase
 r7146@Thesaurus (orig r7143):  caelum | 2009-07-30 15:37:18 +0200
 update sqlite test schema
 r7207@Thesaurus (orig r7204):  caelum | 2009-08-04 23:40:16 +0200
 update Changes
 r7222@Thesaurus (orig r7219):  caelum | 2009-08-05 11:02:26 +0200
 fix a couple minor issues after pull from trunk
 r7260@Thesaurus (orig r7257):  caelum | 2009-08-07 14:45:18 +0200
 add note about where to get Schema::Loader
 r7273@Thesaurus (orig r7270):  ribasushi | 2009-08-09 01:19:49 +0200
 Changes and minor code rewrap
 r7285@Thesaurus (orig r7282):  ribasushi | 2009-08-10 08:08:06 +0200
 pesky whitespace
 r7286@Thesaurus (orig r7283):  ribasushi | 2009-08-10 08:11:46 +0200
 privatize dormant method - it may be useful for sybase at *some* point
 r7287@Thesaurus (orig r7284):  ribasushi | 2009-08-10 08:19:55 +0200
 Whoops
 r7289@Thesaurus (orig r7286):  caelum | 2009-08-10 08:44:51 +0200
 document placeholders_with_type_conversion_supported and add a redispatch to reblessed storage in DBI::update
 r7290@Thesaurus (orig r7287):  caelum | 2009-08-10 10:07:45 +0200
 fix and test redispatch to reblessed storage insert/update
 r7292@Thesaurus (orig r7289):  caelum | 2009-08-10 10:32:37 +0200
 rename get_connected_schema to get_schema in sybase test
 r7345@Thesaurus (orig r7342):  ribasushi | 2009-08-18 22:45:06 +0200
 Fix Changes
 r7367@Thesaurus (orig r7364):  ribasushi | 2009-08-23 10:00:34 +0200
 Minaor speedup
 r7368@Thesaurus (orig r7365):  ribasushi | 2009-08-23 10:01:10 +0200
 Generalize and hide placeholder support check
 r7369@Thesaurus (orig r7366):  ribasushi | 2009-08-23 10:04:26 +0200
 Rename the common sybase driver
 r7373@Thesaurus (orig r7370):  caelum | 2009-08-24 13:21:51 +0200
 make insert only use a txn if needed, add connect_call_unsafe_insert
 r7374@Thesaurus (orig r7371):  caelum | 2009-08-24 14:42:57 +0200
 add test for IDENTITY_INSERT
 r7378@Thesaurus (orig r7375):  caelum | 2009-08-24 15:51:48 +0200
 use debugobj->callback instead of local *_query_start in test to capture query
 r7379@Thesaurus (orig r7376):  caelum | 2009-08-24 17:19:46 +0200
 remove duplicate oracle method and fix an mssql method call
 r7417@Thesaurus (orig r7414):  caelum | 2009-08-29 07:23:45 +0200
 update link to Schema::Loader branch
 r7427@Thesaurus (orig r7424):  caelum | 2009-08-29 09:31:41 +0200
 switch to ::DBI::AutoCast
 r7428@Thesaurus (orig r7425):  ribasushi | 2009-08-29 13:36:22 +0200
 Cleanup:
 Added commented method signatures for easier debugging
 privatize transform_unbound_value as _prep_bind_value
 Remove \@_ splice's in lieu of of simple shifts
 Exposed TYPE_MAPPING used by native_data_type via our
 Removed use of txn_do - internal code uses the scope guard
 Renamed some variables, whitespace cleanup, the works
 r7429@Thesaurus (orig r7426):  ribasushi | 2009-08-29 13:40:48 +0200
 Varname was absolutely correct
 r7430@Thesaurus (orig r7427):  caelum | 2009-08-29 14:09:13 +0200
 minor changes for tests to pass again
 r7431@Thesaurus (orig r7428):  caelum | 2009-08-29 21:08:51 +0200
 fix inserts with active cursors
 r7432@Thesaurus (orig r7429):  caelum | 2009-08-29 22:53:02 +0200
 remove extra connection
 r7434@Thesaurus (orig r7431):  caelum | 2009-08-30 00:02:20 +0200
 test correlated subquery
 r7442@Thesaurus (orig r7439):  ribasushi | 2009-08-30 09:07:00 +0200
 Put the ocmment back
 r7443@Thesaurus (orig r7440):  ribasushi | 2009-08-30 09:15:41 +0200
 Change should_quote_value to interpolate_unquoted to make it harder to stop quoting by accident (it's easier to return a undef by accident than a 1)
 r7446@Thesaurus (orig r7443):  caelum | 2009-08-30 18:19:46 +0200
 added txn_scope_guards for blob operations
 r7447@Thesaurus (orig r7444):  ribasushi | 2009-08-30 18:56:43 +0200
 Rename insert_txn to unsafe_insert
 r7512@Thesaurus (orig r7509):  ribasushi | 2009-09-03 20:24:14 +0200
 Minor cleanups
 r7575@Thesaurus (orig r7572):  caelum | 2009-09-05 07:23:57 +0200
 pending review by mpeppler
 r7593@Thesaurus (orig r7590):  ribasushi | 2009-09-07 09:10:05 +0200
 Release 0.08111 tag
 r7594@Thesaurus (orig r7591):  ribasushi | 2009-09-07 09:14:33 +0200
 Whoops this should not have committed
 r7602@Thesaurus (orig r7599):  caelum | 2009-09-07 21:31:38 +0200
 fix _insert_dbh code to only connect when needed, doc update
 r7607@Thesaurus (orig r7604):  caelum | 2009-09-09 02:15:54 +0200
 remove unsafe_insert
 r7608@Thesaurus (orig r7605):  ribasushi | 2009-09-09 09:14:20 +0200
 Localisation ain't free, we don't do it unless we have to
 r7609@Thesaurus (orig r7606):  ribasushi | 2009-09-09 09:40:29 +0200
 Much simpler
 r7610@Thesaurus (orig r7607):  ribasushi | 2009-09-09 10:38:41 +0200
 Reduce amount of perl-golf :)
 r7611@Thesaurus (orig r7608):  ribasushi | 2009-09-09 10:41:15 +0200
 This should not have worked - I guess we lack tests?
 r7614@Thesaurus (orig r7611):  caelum | 2009-09-09 12:08:36 +0200
 test multi-row blob update
 r7619@Thesaurus (orig r7616):  caelum | 2009-09-09 18:01:15 +0200
 remove Sub::Name hack for method dispatch, pass $next instead
 r7620@Thesaurus (orig r7617):  caelum | 2009-09-10 02:16:03 +0200
 do blob update over _insert_dbh
 r7661@Thesaurus (orig r7650):  caelum | 2009-09-13 10:27:44 +0200
 change _insert_dbh to _insert_storage
 r7663@Thesaurus (orig r7652):  caelum | 2009-09-13 11:52:20 +0200
 make sure _init doesn't loop, steal insert_bulk from mssql, add some insert_bulk tests
 r7664@Thesaurus (orig r7653):  caelum | 2009-09-13 13:27:51 +0200
 allow subclassing of methods proxied to _writer_storage
 r7666@Thesaurus (orig r7655):  caelum | 2009-09-14 15:09:21 +0200
 sybase bulk API support stuff (no blobs yet, coming soon...)
 r7667@Thesaurus (orig r7656):  caelum | 2009-09-14 15:33:14 +0200
 add another test for sybase bulk stuff (passes)
 r7668@Thesaurus (orig r7657):  caelum | 2009-09-14 15:44:06 +0200
 minor change (fix inverted boolean for warning)
 r7669@Thesaurus (orig r7658):  caelum | 2009-09-14 15:48:52 +0200
 remove @args from DBI::sth, use full arg list
 r7676@Thesaurus (orig r7665):  caelum | 2009-09-16 15:06:35 +0200
 use execute_array for insert_bulk, test insert_bulk with blobs, clean up blob tests a bit
 r7680@Thesaurus (orig r7669):  ribasushi | 2009-09-16 19:36:19 +0200
 Remove branched changes
 r7682@Thesaurus (orig r7671):  caelum | 2009-09-17 03:03:34 +0200
 I'll rewrite this bit tomorrow to be less retarded
 r7684@Thesaurus (orig r7673):  caelum | 2009-09-18 04:03:15 +0200
 fix yesterday's stuff, identity_update works, blob updates are better
 r7686@Thesaurus (orig r7675):  caelum | 2009-09-18 04:22:38 +0200
 column no longer necessary in test
 r7688@Thesaurus (orig r7677):  caelum | 2009-09-18 08:33:14 +0200
 fix freetds
 r7691@Thesaurus (orig r7680):  ribasushi | 2009-09-18 12:25:42 +0200
  r7678@Thesaurus (orig r7667):  ribasushi | 2009-09-16 19:31:14 +0200
  New subbranch
  r7679@Thesaurus (orig r7668):  ribasushi | 2009-09-16 19:34:29 +0200
  Caelum's work so far
  r7690@Thesaurus (orig r7679):  caelum | 2009-09-18 11:10:16 +0200
  support for blobs in insert_bulk fallback

 r7692@Thesaurus (orig r7681):  ribasushi | 2009-09-18 12:28:09 +0200
 Rollback all bulk insert code before merge

r7699@Thesaurus (orig r7688):  ribasushi | 2009-09-18 14:12:05 +0200
Cleanup exception handling
r7700@Thesaurus (orig r7689):  ribasushi | 2009-09-18 14:22:02 +0200
duh
r7701@Thesaurus (orig r7690):  ribasushi | 2009-09-18 14:25:06 +0200
Minor cleanup of RSC with has_many joins
r7702@Thesaurus (orig r7691):  ribasushi | 2009-09-18 14:32:15 +0200
Changes and dev notes in makefile
r7705@Thesaurus (orig r7694):  ribasushi | 2009-09-18 14:52:26 +0200
Nothing says the grouping column can not be nullable
r7706@Thesaurus (orig r7695):  ribasushi | 2009-09-18 14:53:33 +0200
Changes
r7707@Thesaurus (orig r7696):  ribasushi | 2009-09-18 20:09:04 +0200
This code belogs in Storage::DBI
r7708@Thesaurus (orig r7697):  ribasushi | 2009-09-18 20:38:26 +0200
Clear up some legacy cruft and straighten inheritance
r7710@Thesaurus (orig r7699):  ribasushi | 2009-09-21 00:25:20 +0200
Backout sybase changes
r7713@Thesaurus (orig r7702):  ribasushi | 2009-09-21 00:46:32 +0200
Missed a part of the revert

29 files changed:
Changes
Makefile.PL
lib/DBIx/Class.pm
lib/DBIx/Class/Componentised.pm
lib/DBIx/Class/Cursor.pm
lib/DBIx/Class/Ordered.pm
lib/DBIx/Class/ResultSet.pm
lib/DBIx/Class/ResultSetColumn.pm
lib/DBIx/Class/ResultSource.pm
lib/DBIx/Class/Row.pm
lib/DBIx/Class/Schema/Versioned.pm
lib/DBIx/Class/Storage.pm
lib/DBIx/Class/Storage/DBI.pm
lib/DBIx/Class/Storage/DBI/AutoCast.pm
lib/DBIx/Class/Storage/DBI/Cursor.pm
lib/DBIx/Class/Storage/DBI/NoBindVars.pm
lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm
lib/DBIx/Class/Storage/DBI/Oracle.pm
lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm
lib/DBIx/Class/Storage/DBI/Replicated.pm
lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm
lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server/NoBindVars.pm
lib/DBIx/Class/Storage/Statistics.pm
t/05components.t
t/746sybase.t
t/86sqlt.t
t/94versioning.t
t/99dbic_sqlt_parser.t
t/lib/sqlite.sql

diff --git a/Changes b/Changes
index ce6d3e5..a62fe75 100644 (file)
--- a/Changes
+++ b/Changes
@@ -12,8 +12,12 @@ Revision history for DBIx::Class
         - Make sure to turn off IDENTITY_INSERT after insert() on MSSQL
           tables that needed it
         - More informative exception on failing _resolve_relationship
+        - Allow undef/NULL as the sole grouping value in Ordered
         - Fix unreported rollback exceptions in TxnScopeGuard
         - Fix overly-eager left-join chain enforcing code
+        - Warn about using distinct with an existing group_by
+        - Warn about attempting to $rs->get_column a non-unique column
+          when has_many joins are added to resultset
 
 0.08111 2009-09-06 21:58:00 (UTC)
         - The hashref to connection_info now accepts a 'dbh_maker'
@@ -56,7 +60,7 @@ Revision history for DBIx::Class
         - Support for MSSQL 'money' type
         - Support for 'smalldatetime' type used in MSSQL and Sybase for
           InflateColumn::DateTime
-        - support for Postgres 'timestamp without timezone' type in
+        - Support for Postgres 'timestamp without timezone' type in
           InflateColumn::DateTime (RT#48389)
         - Added new MySQL specific on_connect_call macro 'set_strict_mode'
           (also known as make_mysql_not_suck_as_much)
index 2c3a6d8..27ce1ef 100644 (file)
@@ -54,14 +54,18 @@ my %replication_requires = (
   'Hash::Merge',              => '0.11',
 );
 
-# when changing also adjust $DBIx::Class::minimum_sqlt_version
-my $sqlt_recommends = '0.11002';
-
+#************************************************************************#
+# Make *ABSOLUTELY SURE* that nothing on this list is a real require,    #
+# since every module listed in %force_requires_if_author is deleted      #
+# from the final META.yml (thus will never make it as a CPAN dependency) #
+#************************************************************************#
 my %force_requires_if_author = (
   %replication_requires,
 
+  # when changing also adjust $DBIx::Class::Storage::DBI::minimum_sqlt_version
+  'SQL::Translator'           => '0.11002',
+
 #  'Module::Install::Pod::Inherit' => '0.01',
-  'SQL::Translator'           => $sqlt_recommends,
 
   # when changing also adjust version in t/02pod.t
   'Test::Pod'                 => '1.26',
@@ -111,6 +115,11 @@ my %force_requires_if_author = (
     ) : ()
   ,
 );
+#************************************************************************#
+# Make *ABSOLUTELY SURE* that nothing on the list aboveis a real require,#
+# since every module listed in %force_requires_if_author is deleted      #
+# from the final META.yml (thus will never make it as a CPAN dependency) #
+#************************************************************************#
 
 
 install_script (qw|
index 5d7a665..29b441b 100644 (file)
@@ -6,7 +6,7 @@ use warnings;
 use MRO::Compat;
 
 use vars qw($VERSION);
-use base qw/DBIx::Class::Componentised Class::Accessor::Grouped/;
+use base qw/Class::C3::Componentised Class::Accessor::Grouped/;
 use DBIx::Class::StartupCheck;
 
 sub mk_classdata {
@@ -24,15 +24,10 @@ sub component_base_class { 'DBIx::Class' }
 # Always remember to do all digits for the version even if they're 0
 # 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.08111';
 
 $VERSION = eval $VERSION; # numify for warning-free dev releases
 
-# what version of sqlt do we require if deploy() without a ddl_dir is invoked
-# when changing also adjust $sqlt_recommends in Makefile.PL
-my $minimum_sqlt_version = '0.11002';
-
 sub MODIFY_CODE_ATTRIBUTES {
   my ($class,$code,@attrs) = @_;
   $class->mk_classdata('__attr_cache' => {})
@@ -48,34 +43,6 @@ sub _attr_cache {
   return $@ ? $cache : { %$cache, %$rest };
 }
 
-# SQLT version handling
-{
-  my $_sqlt_version_ok;     # private
-  my $_sqlt_version_error;  # private
-
-  sub _sqlt_version_ok {
-    if (!defined $_sqlt_version_ok) {
-      eval "use SQL::Translator $minimum_sqlt_version";
-      if ($@) {
-        $_sqlt_version_ok = 0;
-        $_sqlt_version_error = $@;
-      }
-      else {
-        $_sqlt_version_ok = 1;
-      }
-    }
-    return $_sqlt_version_ok;
-  }
-
-  sub _sqlt_version_error {
-    shift->_sqlt_version_ok unless defined $_sqlt_version_ok;
-    return $_sqlt_version_error;
-  }
-
-  sub _sqlt_minimum_version { $minimum_sqlt_version };
-}
-
-
 1;
 
 =head1 NAME
index 7b4cb1f..7cb5d54 100644 (file)
@@ -4,31 +4,10 @@ package # hide from PAUSE
 use strict;
 use warnings;
 
-use base 'Class::C3::Componentised';
-use Carp::Clan qw/^DBIx::Class/;
-
-sub inject_base {
-  my ($class, $target, @to_inject) = @_;
-  {
-    no strict 'refs';
-    foreach my $to (reverse @to_inject) {
-      my @comps = qw(DigestColumns ResultSetManager Ordered UTF8Columns);
-           # Add components here that need to be loaded before Core
-      foreach my $first_comp (@comps) {
-        if ($to eq 'DBIx::Class::Core' &&
-            $target->isa("DBIx::Class::${first_comp}")) {
-          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";
-        }
-      }
-      unshift( @{"${target}::ISA"}, $to )
-        unless ($target eq $to || $target->isa($to));
-    }
-  }
+###
+# Keep this class for backwards compatibility
+###
 
-  $class->next::method($target, @to_inject);
-}
+use base 'Class::C3::Componentised';
 
 1;
index ded8b56..14816ab 100644 (file)
@@ -3,6 +3,8 @@ package DBIx::Class::Cursor;
 use strict;
 use warnings;
 
+use base qw/DBIx::Class/;
+
 =head1 NAME
 
 DBIx::Class::Cursor - Abstract object representing a query cursor on a
index 59162bb..6c7446f 100644 (file)
@@ -434,10 +434,7 @@ if multiple grouping columns are in use.
 sub move_to_group {
     my( $self, $to_group, $to_position ) = @_;
 
-    $self->throw_exception ('move_to_group() expects a group specification')
-        unless defined $to_group;
-
-    # if we're given a string, turn it into a hashref
+    # if we're given a single value, turn it into a hashref
     unless (ref $to_group eq 'HASH') {
         my @gcols = $self->_grouping_columns;
 
index 71fc173..78fd277 100644 (file)
@@ -7,6 +7,7 @@ use overload
         'bool'   => "_bool",
         fallback => 1;
 use Carp::Clan qw/^DBIx::Class/;
+use DBIx::Class::Exception;
 use Data::Page;
 use Storable;
 use DBIx::Class::ResultSetColumn;
@@ -2789,24 +2790,35 @@ sub _resolved_attrs {
 
   # 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($attrs->{columns}) eq 'ARRAY' ) ? @{ delete $attrs->{columns}} : (delete $attrs->{columns} || $source->columns );
+
+    my @cols = ( ref($attrs->{columns}) eq 'ARRAY' )
+      ? @{ delete $attrs->{columns}}
+      : (
+          ( delete $attrs->{columns} )
+            ||
+          $source->columns
+        )
+    ;
+
+    @colbits = map {
+      ( ref($_) eq 'HASH' )
+      ? $_
+      : {
+          (
+            /^\Q${alias}.\E(.+)$/
+              ? "$1"
+              : "$_"
+          )
+            =>
+          (
+            /\./
+              ? "$_"
+              : "${alias}.$_"
+          )
+        }
+    } @cols;
   }
+
   # add the additional columns on
   foreach ( 'include_columns', '+columns' ) {
       push @colbits, map {
@@ -3103,12 +3115,13 @@ See L<DBIx::Class::Schema/throw_exception> for details.
 
 sub throw_exception {
   my $self=shift;
+
   if (ref $self && $self->_source_handle->schema) {
     $self->_source_handle->schema->throw_exception(@_)
-  } else {
-    croak(@_);
   }
-
+  else {
+    DBIx::Class::Exception->throw(@_);
+  }
 }
 
 # XXX: FIXME: Attributes docs need clearing up
index ee1ed04..430e35b 100644 (file)
@@ -1,7 +1,12 @@
 package DBIx::Class::ResultSetColumn;
+
 use strict;
 use warnings;
+
 use base 'DBIx::Class';
+
+use Carp::Clan qw/^DBIx::Class/;
+use DBIx::Class::Exception;
 use List::Util;
 
 =head1 NAME
@@ -61,7 +66,7 @@ sub new {
   my $select = defined $as_index ? $select_list->[$as_index] : $column;
 
   # {collapse} would mean a has_many join was injected, which in turn means
-  # we need to group IF WE CAN (only if the column in question is unique)
+  # we need to group *IF WE CAN* (only if the column in question is unique)
   if (!$new_attrs->{group_by} && keys %{$orig_attrs->{collapse}}) {
 
     # scan for a constraint that would contain our column only - that'd be proof
@@ -76,9 +81,17 @@ sub new {
 
       if ($col eq $select or $fqcol eq $select) {
         $new_attrs->{group_by} = [ $select ];
+        delete $new_attrs->{distinct}; # it is ignored when group_by is present
         last;
       }
     }
+
+    if (!$new_attrs->{group_by}) {
+      carp (
+          "Attempting to retrieve non-unique column '$column' on a resultset containing "
+        . 'one-to-many joins will return duplicate results.'
+      );
+    }
   }
 
   my $new = bless { _select => $select, _as => $column, _parent_resultset => $new_parent_rs }, $class;
@@ -414,10 +427,12 @@ See L<DBIx::Class::Schema/throw_exception> for details.
 
 sub throw_exception {
   my $self=shift;
+
   if (ref $self && $self->{_parent_resultset}) {
-    $self->{_parent_resultset}->throw_exception(@_)
-  } else {
-    croak(@_);
+    $self->{_parent_resultset}->throw_exception(@_);
+  }
+  else {
+    DBIx::Class::Exception->throw(@_);
   }
 }
 
index 3982965..fa08fae 100644 (file)
@@ -5,6 +5,8 @@ use warnings;
 
 use DBIx::Class::ResultSet;
 use DBIx::Class::ResultSourceHandle;
+
+use DBIx::Class::Exception;
 use Carp::Clan qw/^DBIx::Class/;
 
 use base qw/DBIx::Class/;
@@ -1591,10 +1593,12 @@ See L<DBIx::Class::Schema/"throw_exception">.
 
 sub throw_exception {
   my $self = shift;
+
   if (defined $self->schema) {
     $self->schema->throw_exception(@_);
-  } else {
-    croak(@_);
+  }
+  else {
+    DBIx::Class::Exception->throw(@_);
   }
 }
 
index 5d6285f..f708d21 100644 (file)
@@ -4,9 +4,9 @@ use strict;
 use warnings;
 
 use base qw/DBIx::Class/;
-use Carp::Clan qw/^DBIx::Class/;
+
+use DBIx::Class::Exception;
 use Scalar::Util ();
-use Scope::Guard;
 
 ###
 ### Internal method
@@ -168,7 +168,8 @@ sub new {
     foreach my $key (keys %$attrs) {
       if (ref $attrs->{$key}) {
         ## Can we extract this lot to use with update(_or .. ) ?
-        confess "Can't do multi-create without result source" unless $source;
+        $new->throw_exception("Can't do multi-create without result source")
+          unless $source;
         my $info = $source->relationship_info($key);
         if ($info && $info->{attrs}{accessor}
           && $info->{attrs}{accessor} eq 'single')
@@ -1330,10 +1331,12 @@ See L<DBIx::Class::Schema/throw_exception>.
 
 sub throw_exception {
   my $self=shift;
+
   if (ref $self && ref $self->result_source && $self->result_source->schema) {
-    $self->result_source->schema->throw_exception(@_);
-  } else {
-    croak(@_);
+    $self->result_source->schema->throw_exception(@_)
+  }
+  else {
+    DBIx::Class::Exception->throw(@_);
   }
 }
 
index 50cae7e..3e7f517 100644 (file)
@@ -520,11 +520,11 @@ sub _create_db_to_schema_diff {
     return;
   }
 
-  $self->throw_exception($self->_sqlt_version_error)
-    if (not $self->_sqlt_version_ok);
+  $self->throw_exception($self->storage->_sqlt_version_error)
+    if (not $self->storage->_sqlt_version_ok);
 
-  my $db_tr = SQL::Translator->new({ 
-                                    add_drop_table => 1, 
+  my $db_tr = SQL::Translator->new({
+                                    add_drop_table => 1,
                                     parser => 'DBI',
                                     parser_args => { dbh => $self->storage->dbh }
                                    });
index e5c7d45..c9f4383 100644 (file)
@@ -6,8 +6,8 @@ use warnings;
 use base qw/DBIx::Class/;
 use mro 'c3';
 
-use Scalar::Util qw/weaken/;
-use Carp::Clan qw/^DBIx::Class/;
+use DBIx::Class::Exception;
+use Scalar::Util();
 use IO::File;
 use DBIx::Class::Storage::TxnScopeGuard;
 
@@ -83,7 +83,7 @@ storage object, such as during L<DBIx::Class::Schema/clone>.
 sub set_schema {
   my ($self, $schema) = @_;
   $self->schema($schema);
-  weaken($self->{schema}) if ref $self->{schema};
+  Scalar::Util::weaken($self->{schema}) if ref $self->{schema};
 }
 
 =head2 connected
@@ -120,8 +120,12 @@ Throws an exception - croaks.
 sub throw_exception {
   my $self = shift;
 
-  $self->schema->throw_exception(@_) if $self->schema;
-  croak @_;
+  if ($self->schema) {
+    $self->schema->throw_exception(@_);
+  }
+  else {
+    DBIx::Class::Exception->throw(@_);
+  }
 }
 
 =head2 txn_do
index 7ebea34..89cf5a3 100644 (file)
@@ -14,6 +14,11 @@ use DBIx::Class::Storage::Statistics;
 use Scalar::Util();
 use List::Util();
 
+# what version of sqlt do we require if deploy() without a ddl_dir is invoked
+# when changing also adjust the corresponding author_require in Makefile.PL
+my $minimum_sqlt_version = '0.11002';
+
+
 __PACKAGE__->mk_group_accessors('simple' =>
   qw/_connect_info _dbi_connect_info _dbh _sql_maker _sql_maker_opts _conn_pid
      _conn_tid transaction_depth _dbh_autocommit _driver_determined savepoints/
@@ -681,7 +686,8 @@ sub disconnect {
 
     $self->_do_connection_actions(disconnect_call_ => $_) for @actions;
 
-    $self->_dbh->rollback unless $self->_dbh_autocommit;
+    $self->_dbh_rollback unless $self->_dbh_autocommit;
+
     $self->_dbh->disconnect;
     $self->_dbh(undef);
     $self->{_dbh_gen}++;
@@ -835,7 +841,9 @@ sub sql_maker {
   return $self->_sql_maker;
 }
 
+# nothing to do by default
 sub _rebless {}
+sub _init {}
 
 sub _populate_dbh {
   my ($self) = @_;
@@ -902,6 +910,8 @@ sub _determine_driver {
 
     $self->_driver_determined(1);
 
+    $self->_init; # run driver-specific initializations
+
     $self->_run_connection_actions
         if $started_unconnected && defined $self->_dbh;
   }
@@ -997,6 +1007,8 @@ sub _connect {
             $weak_self->throw_exception("DBI Exception: $_[0]");
           }
           else {
+            # the handler may be invoked by something totally out of
+            # the scope of DBIC
             croak ("DBI Exception: $_[0]");
           }
       };
@@ -1106,27 +1118,36 @@ sub txn_begin {
   if($self->{transaction_depth} == 0) {
     $self->debugobj->txn_begin()
       if $self->debug;
-
-    # being here implies we have AutoCommit => 1
-    # if the user is utilizing txn_do - good for
-    # him, otherwise we need to ensure that the
-    # $dbh is healthy on BEGIN
-    my $dbh_method = $self->{_in_dbh_do} ? '_dbh' : 'dbh';
-    $self->$dbh_method->begin_work;
-
-  } elsif ($self->auto_savepoint) {
+    $self->_dbh_begin_work;
+  }
+  elsif ($self->auto_savepoint) {
     $self->svp_begin;
   }
   $self->{transaction_depth}++;
 }
 
+sub _dbh_begin_work {
+  my $self = shift;
+
+  # if the user is utilizing txn_do - good for him, otherwise we need to
+  # ensure that the $dbh is healthy on BEGIN.
+  # We do this via ->dbh_do instead of ->dbh, so that the ->dbh "ping"
+  # will be replaced by a failure of begin_work itself (which will be
+  # then retried on reconnect)
+  if ($self->{_in_dbh_do}) {
+    $self->_dbh->begin_work;
+  } else {
+    $self->dbh_do(sub { $_[1]->begin_work });
+  }
+}
+
 sub txn_commit {
   my $self = shift;
   if ($self->{transaction_depth} == 1) {
     my $dbh = $self->_dbh;
     $self->debugobj->txn_commit()
       if ($self->debug);
-    $dbh->commit;
+    $self->_dbh_commit;
     $self->{transaction_depth} = 0
       if $self->_dbh_autocommit;
   }
@@ -1137,6 +1158,11 @@ sub txn_commit {
   }
 }
 
+sub _dbh_commit {
+  my $self = shift;
+  $self->_dbh->commit;
+}
+
 sub txn_rollback {
   my $self = shift;
   my $dbh = $self->_dbh;
@@ -1146,7 +1172,7 @@ sub txn_rollback {
         if ($self->debug);
       $self->{transaction_depth} = 0
         if $self->_dbh_autocommit;
-      $dbh->rollback;
+      $self->_dbh_rollback;
     }
     elsif($self->{transaction_depth} > 1) {
       $self->{transaction_depth}--;
@@ -1169,6 +1195,11 @@ sub txn_rollback {
   }
 }
 
+sub _dbh_rollback {
+  my $self = shift;
+  $self->_dbh->rollback;
+}
+
 # This used to be the top-half of _execute.  It was split out to make it
 #  easier to override in NoBindVars without duping the rest.  It takes up
 #  all of _execute's args, and emits $sql, @bind.
@@ -1375,12 +1406,17 @@ sub insert_bulk {
 }
 
 sub update {
-  my $self = shift @_;
-  my $source = shift @_;
-  $self->_determine_driver;
+  my ($self, $source, @args) = @_; 
+
+# redispatch to update method of storage we reblessed into, if necessary
+  if (not $self->_driver_determined) {
+    $self->_determine_driver;
+    goto $self->can('update');
+  }
+
   my $bind_attributes = $self->source_bind_attributes($source);
 
-  return $self->_execute('update' => [], $source, $bind_attributes, @_);
+  return $self->_execute('update' => [], $source, $bind_attributes, @args);
 }
 
 
@@ -2154,6 +2190,36 @@ sub _native_data_type {
   return undef
 }
 
+# Check if placeholders are supported at all
+sub _placeholders_supported {
+  my $self = shift;
+  my $dbh  = $self->_get_dbh;
+
+  # some drivers provide a $dbh attribute (e.g. Sybase and $dbh->{syb_dynamic_supported})
+  # but it is inaccurate more often than not
+  eval {
+    local $dbh->{PrintError} = 0;
+    local $dbh->{RaiseError} = 1;
+    $dbh->do('select ?', {}, 1);
+  };
+  return $@ ? 0 : 1;
+}
+
+# Check if placeholders bound to non-string types throw exceptions
+#
+sub _typeless_placeholders_supported {
+  my $self = shift;
+  my $dbh  = $self->_get_dbh;
+
+  eval {
+    local $dbh->{PrintError} = 0;
+    local $dbh->{RaiseError} = 1;
+    # this specifically tests a bind that is NOT a string
+    $dbh->do('select 1 where 1 = ?', {}, 1);
+  };
+  return $@ ? 0 : 1;
+}
+
 =head2 sqlt_type
 
 Returns the database driver name.
@@ -2545,6 +2611,33 @@ sub lag_behind_master {
     return;
 }
 
+# SQLT version handling 
+{
+  my $_sqlt_version_ok;     # private 
+  my $_sqlt_version_error;  # private 
+
+  sub _sqlt_version_ok {
+    if (!defined $_sqlt_version_ok) {
+      eval "use SQL::Translator $minimum_sqlt_version";
+      if ($@) {
+        $_sqlt_version_ok = 0;
+        $_sqlt_version_error = $@;
+      }
+      else {
+        $_sqlt_version_ok = 1;
+      }
+    }
+    return $_sqlt_version_ok;
+  }
+
+  sub _sqlt_version_error {
+    shift->_sqlt_version_ok unless defined $_sqlt_version_ok;
+    return $_sqlt_version_error;
+  }
+
+  sub _sqlt_minimum_version { $minimum_sqlt_version };
+}
+
 sub DESTROY {
   my $self = shift;
 
index 3391cfb..850015b 100644 (file)
@@ -61,7 +61,7 @@ sub _prep_for_execute {
 }
 
 
-=head1 AUTHORS
+=head1 AUTHOR
 
 See L<DBIx::Class/CONTRIBUTORS>
 
index 3d5da26..875a3cb 100644 (file)
@@ -5,6 +5,10 @@ use warnings;
 
 use base qw/DBIx::Class::Cursor/;
 
+__PACKAGE__->mk_group_accessors('simple' =>
+    qw/sth/
+);
+
 =head1 NAME
 
 DBIx::Class::Storage::DBI::Cursor - Object representing a query cursor on a
@@ -73,24 +77,24 @@ sub _dbh_next {
       && $self->{attrs}{rows}
         && $self->{pos} >= $self->{attrs}{rows}
   ) {
-    $self->{sth}->finish if $self->{sth}->{Active};
-    delete $self->{sth};
+    $self->sth->finish if $self->sth->{Active};
+    $self->sth(undef);
     $self->{done} = 1;
   }
   return if $self->{done};
-  unless ($self->{sth}) {
-    $self->{sth} = ($storage->_select(@{$self->{args}}))[1];
+  unless ($self->sth) {
+    $self->sth(($storage->_select(@{$self->{args}}))[1]);
     if ($self->{attrs}{software_limit}) {
       if (my $offset = $self->{attrs}{offset}) {
-        $self->{sth}->fetch for 1 .. $offset;
+        $self->sth->fetch for 1 .. $offset;
       }
     }
   }
-  my @row = $self->{sth}->fetchrow_array;
+  my @row = $self->sth->fetchrow_array;
   if (@row) {
     $self->{pos}++;
   } else {
-    delete $self->{sth};
+    $self->sth(undef);
     $self->{done} = 1;
   }
   return @row;
@@ -120,8 +124,8 @@ sub _dbh_all {
   my ($storage, $dbh, $self) = @_;
 
   $self->_check_dbh_gen;
-  $self->{sth}->finish if $self->{sth}->{Active};
-  delete $self->{sth};
+  $self->sth->finish if $self->sth && $self->sth->{Active};
+  $self->sth(undef);
   my ($rv, $sth) = $storage->_select(@{$self->{args}});
   return @{$sth->fetchall_arrayref};
 }
@@ -146,7 +150,7 @@ sub reset {
   my ($self) = @_;
 
   # No need to care about failures here
-  eval { $self->{sth}->finish if $self->{sth} && $self->{sth}->{Active} };
+  eval { $self->sth->finish if $self->sth && $self->sth->{Active} };
   $self->_soft_reset;
   return undef;
 }
@@ -154,7 +158,7 @@ sub reset {
 sub _soft_reset {
   my ($self) = @_;
 
-  delete $self->{sth};
+  $self->sth(undef);
   delete $self->{done};
   $self->{pos} = 0;
 }
@@ -173,7 +177,7 @@ sub DESTROY {
 
   # None of the reasons this would die matter if we're in DESTROY anyways
   local $@;
-  eval { $self->{sth}->finish if $self->{sth} && $self->{sth}->{Active} };
+  eval { $self->sth->finish if $self->sth && $self->sth->{Active} };
 }
 
 1;
index 95f1cac..9f84702 100644 (file)
@@ -40,24 +40,32 @@ Manually subs in the values for the usual C<?> placeholders.
 sub _prep_for_execute {
   my $self = shift;
 
-  my ($op, $extra_bind, $ident) = @_;
-
   my ($sql, $bind) = $self->next::method(@_);
 
-  # stringify args, quote via $dbh, and manually insert
+  # stringify bind args, quote via $dbh, and manually insert
+  #my ($op, $extra_bind, $ident, $args) = @_;
+  my $ident = $_[2];
 
   my @sql_part = split /\?/, $sql;
   my $new_sql;
 
+  my $col_info = $self->_resolve_column_info($ident, [ map $_->[0], @$bind ]);
+
   foreach my $bound (@$bind) {
     my $col = shift @$bound;
-    my $datatype = 'FIXME!!!';
+
+    my $datatype = $col_info->{$col}{data_type};
+
     foreach my $data (@$bound) {
-        if(ref $data) {
-            $data = ''.$data;
-        }
-        $data = $self->_dbh->quote($data);
-        $new_sql .= shift(@sql_part) . $data;
+      $data = ''.$data if ref $data;
+
+      $data = $self->_prep_interpolated_value($datatype, $data)
+        if $datatype;
+
+      $data = $self->_dbh->quote($data)
+        unless $self->interpolate_unquoted($datatype, $data);
+
+      $new_sql .= shift(@sql_part) . $data;
     }
   }
   $new_sql .= join '', @sql_part;
@@ -65,11 +73,43 @@ sub _prep_for_execute {
   return ($new_sql, []);
 }
 
-=head1 AUTHORS
+=head2 interpolate_unquoted
+
+This method is called by L</_prep_for_execute> for every column in
+order to determine if its value should be quoted or not. The arguments
+are the current column data type and the actual bind value. The return
+value is interpreted as: true - do not quote, false - do quote. You should
+override this in you Storage::DBI::<database> subclass, if your RDBMS
+does not like quotes around certain datatypes (e.g. Sybase and integer
+columns). The default method always returns false (do quote).
+
+ WARNING!!!
+
+ Always validate that the bind-value is valid for the current datatype.
+ Otherwise you may very well open the door to SQL injection attacks.
 
-Brandon Black <blblack@gmail.com>
+=cut
+
+sub interpolate_unquoted {
+  #my ($self, $datatype, $value) = @_;
+  return 0;
+}
+
+=head2 _prep_interpolated_value
+
+Given a datatype and the value to be inserted directly into a SQL query, returns
+the necessary string to represent that value (by e.g. adding a '$' sign)
+
+=cut
+
+sub _prep_interpolated_value {
+  #my ($self, $datatype, $value) = @_;
+  return $_[2];
+}
+
+=head1 AUTHORS
 
-Trym Skaar <trym@tryms.no>
+See L<DBIx::Class/CONTRIBUTORS>
 
 =head1 LICENSE
 
index e29abec..bf01131 100644 (file)
@@ -5,7 +5,6 @@ use warnings;
 use base qw/DBIx::Class::Storage::DBI::MSSQL/;
 use mro 'c3';
 
-use Carp::Clan qw/^DBIx::Class/;
 use List::Util();
 use Scalar::Util ();
 
@@ -62,7 +61,7 @@ sub connect_call_use_dynamic_cursors {
   my $self = shift;
 
   if (ref($self->_dbi_connect_info->[0]) eq 'CODE') {
-    croak 'cannot set DBI attributes on a CODE ref connect_info';
+    $self->throw_exception ('cannot set DBI attributes on a CODE ref connect_info');
   }
 
   my $dbi_attrs = $self->_dbi_connect_info->[-1];
@@ -91,7 +90,7 @@ sub _set_dynamic_cursors {
     $dbh->do('SELECT @@IDENTITY');
   };
   if ($@) {
-    croak <<'EOF';
+    $self->throw_exception (<<'EOF');
 
 Your drivers do not seem to support dynamic cursors (odbc_cursortype => 2),
 if you're using FreeTDS, make sure to set tds_version to 8.0 or greater.
@@ -102,12 +101,18 @@ EOF
   $self->_identity_method('@@identity');
 }
 
-sub _rebless {
-  no warnings 'uninitialized';
+sub _init {
   my $self = shift;
 
-  if (ref($self->_dbi_connect_info->[0]) ne 'CODE' &&
-      eval { $self->_dbi_connect_info->[-1]{odbc_cursortype} } == 2) {
+  no warnings qw/uninitialized/;
+
+  if (
+    ref($self->_dbi_connect_info->[0]) ne 'CODE'
+      &&
+    ref ($self->_dbi_connect_info->[-1]) eq 'HASH'
+      &&
+    $self->_dbi_connect_info->[-1]{odbc_cursortype} == 2
+  ) {
     $self->_set_dynamic_cursors;
     return;
   }
@@ -159,7 +164,7 @@ sub connect_call_use_MARS {
   my $dsn = $self->_dbi_connect_info->[0];
 
   if (ref($dsn) eq 'CODE') {
-    croak 'cannot change the DBI DSN on a CODE ref connect_info';
+    $self->throw_exception('cannot change the DBI DSN on a CODE ref connect_info');
   }
 
   if ($dsn !~ /MARS_Connection=/) {
index 7a49b50..da60a2d 100644 (file)
@@ -19,10 +19,8 @@ sub _rebless {
           ? 'DBIx::Class::Storage::DBI::Oracle::WhereJoins'
           : 'DBIx::Class::Storage::DBI::Oracle::Generic';
 
-        # Load and rebless
-        eval "require $class";
-
-        bless $self, $class unless $@;
+        $self->ensure_class_loaded ($class);
+        bless $self, $class;
     }
 }
 
index b97e34f..88cf72d 100644 (file)
@@ -206,12 +206,6 @@ sub connect_call_datetime_setup {
 "alter session set nls_timestamp_tz_format='$timestamp_tz_format'");
 }
 
-sub _svp_begin {
-    my ($self, $name) = @_;
-
-    $self->_get_dbh->do("SAVEPOINT $name");
-}
-
 =head2 source_bind_attributes
 
 Handle LOB types in Oracle.  Under a certain size (4k?), you can get away
@@ -256,6 +250,12 @@ sub source_bind_attributes
        return \%bind_attributes;
 }
 
+sub _svp_begin {
+    my ($self, $name) = @_;
+
+    $self->_get_dbh->do("SAVEPOINT $name");
+}
+
 # Oracle automatically releases a savepoint when you start another one with the
 # same name.
 sub _svp_release { 1 }
index ee43384..1589b5f 100644 (file)
@@ -17,9 +17,9 @@ BEGIN {
   my @didnt_load;
 
   for my $module (keys %replication_required) {
-       eval "use $module $replication_required{$module}";
-       push @didnt_load, "$module $replication_required{$module}"
-        if $@;
+    eval "use $module $replication_required{$module}";
+    push @didnt_load, "$module $replication_required{$module}"
+      if $@;
   }
 
   croak("@{[ join ', ', @didnt_load ]} are missing and are required for Replication")
@@ -33,7 +33,6 @@ use DBIx::Class::Storage::DBI::Replicated::Balancer;
 use DBIx::Class::Storage::DBI::Replicated::Types qw/BalancerClassNamePart DBICSchema DBICStorageDBI/;
 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';
@@ -222,7 +221,7 @@ has 'pool' => (
   isa=>'DBIx::Class::Storage::DBI::Replicated::Pool',
   lazy_build=>1,
   handles=>[qw/
-    connect_replicants    
+    connect_replicants
     replicants
     has_replicants
   /],
@@ -277,7 +276,7 @@ has 'read_handler' => (
     select
     select_single
     columns_info_for
-  /],    
+  /],
 );
 
 =head2 write_handler
@@ -290,9 +289,9 @@ has 'write_handler' => (
   is=>'ro',
   isa=>Object,
   lazy_build=>1,
-  handles=>[qw/   
+  handles=>[qw/
     on_connect_do
-    on_disconnect_do       
+    on_disconnect_do
     connect_info
     throw_exception
     sql_maker
@@ -300,8 +299,8 @@ has 'write_handler' => (
     create_ddl_dir
     deployment_statements
     datetime_parser
-    datetime_parser_type  
-    build_datetime_parser      
+    datetime_parser_type
+    build_datetime_parser
     last_insert_id
     insert
     insert_bulk
@@ -316,19 +315,19 @@ has 'write_handler' => (
     sth
     deploy
     with_deferred_fk_checks
-       dbh_do
+    dbh_do
     reload_row
-       with_deferred_fk_checks
+    with_deferred_fk_checks
     _prep_for_execute
 
-       backup
-       is_datatype_numeric
-       _count_select
-       _subq_count_select
-       _subq_update_delete 
-       svp_rollback
-       svp_begin
-       svp_release
+    backup
+    is_datatype_numeric
+    _count_select
+    _subq_count_select
+    _subq_update_delete
+    svp_rollback
+    svp_begin
+    svp_release
   /],
 );
 
@@ -364,7 +363,7 @@ around connect_info => sub {
     );
 
     $self->pool($self->_build_pool)
-       if $self->pool;
+      if $self->pool;
   }
 
   if (@opts{qw/balancer_type balancer_args/}) {
@@ -376,7 +375,7 @@ around connect_info => sub {
     );
 
     $self->balancer($self->_build_balancer)
-       if $self->balancer;
+      if $self->balancer;
   }
 
   $self->_master_connect_info_opts(\%opts);
@@ -413,9 +412,9 @@ sub BUILDARGS {
   my ($class, $schema, $storage_type_args, @args) = @_;        
 
   return {
-       schema=>$schema, 
-       %$storage_type_args,
-       @args
+    schema=>$schema,
+    %$storage_type_args,
+    @args
   }
 }
 
@@ -452,7 +451,7 @@ the balancer knows which pool it's balancing.
 sub _build_balancer {
   my $self = shift @_;
   $self->create_balancer(
-    pool=>$self->pool, 
+    pool=>$self->pool,
     master=>$self->master,
     %{$self->balancer_args},
   );
@@ -494,23 +493,23 @@ around connect_replicants => sub {
   for my $r (@args) {
     $r = [ $r ] unless reftype $r eq 'ARRAY';
 
-    croak "coderef replicant connect_info not supported"
+    $self->throw_exception('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    
+# make one if none
     $r->[$i] = {} unless $r->[$i];
 
 # merge if two hashes
     my @hashes = @$r[$i .. $#{$r}];
 
-    croak "invalid connect_info options"
+    $self->throw_exception('invalid connect_info options')
       if (grep { reftype($_) eq 'HASH' } @hashes) != @hashes;
 
-    croak "too many hashrefs in connect_info"
+    $self->throw_exception('too many hashrefs in connect_info')
       if @hashes > 2;
 
     my %opts = %{ merge(reverse @hashes) };
@@ -600,11 +599,11 @@ sub execute_reliably {
       ($result[0]) = ($coderef->(@args));
     } else {
       $coderef->(@args);
-    }       
+    }
   };
 
   ##Reset to the original state
-  $self->read_handler($current); 
+  $self->read_handler($current);
 
   ##Exception testing has to come last, otherwise you might leave the 
   ##read_handler set to master.
@@ -738,7 +737,7 @@ sub debug {
   if(@_) {
     foreach my $source ($self->all_storages) {
       $source->debug(@_);
-    }   
+    }
   }
   return $self->master->debug;
 }
@@ -754,7 +753,7 @@ sub debugobj {
   if(@_) {
     foreach my $source ($self->all_storages) {
       $source->debugobj(@_);
-    }  
+    }
   }
   return $self->master->debugobj;
 }
@@ -770,7 +769,7 @@ sub debugfh {
   if(@_) {
     foreach my $source ($self->all_storages) {
       $source->debugfh(@_);
-    }   
+    }
   }
   return $self->master->debugfh;
 }
@@ -786,7 +785,7 @@ sub debugcb {
   if(@_) {
     foreach my $source ($self->all_storages) {
       $source->debugcb(@_);
-    }   
+    }
   }
   return $self->master->debugcb;
 }
index 6a20ba4..47678e3 100644 (file)
@@ -13,7 +13,7 @@ sub _rebless {
   my $self = shift;
   my $dbh  = $self->_get_dbh;
 
-  if (not $self->_placeholders_supported) {
+  if (not $self->_typeless_placeholders_supported) {
     bless $self,
       'DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::NoBindVars';
     $self->_rebless;
@@ -28,6 +28,7 @@ sub _rebless {
   $dbh->do("set textsize $text_size");
 }
 
+
 1;
 
 =head1 NAME
index 16db6d1..622cf1e 100644 (file)
@@ -9,9 +9,8 @@ use base qw/
 /;
 use mro 'c3';
 
-sub _rebless {
+sub _init {
   my $self = shift;
-
   $self->disable_sth_caching(1);
 }
 
index c8162bf..6852cd8 100644 (file)
@@ -2,7 +2,7 @@ package DBIx::Class::Storage::Statistics;
 use strict;
 use warnings;
 
-use base qw/Class::Accessor::Grouped/;
+use base qw/DBIx::Class/;
 use IO::File;
 
 __PACKAGE__->mk_group_accessors(simple => qw/callback debugfh silence/);
index 303f028..9bd22f5 100644 (file)
@@ -7,8 +7,6 @@ use Test::More;
 use lib qw(t/lib);
 use DBICTest::ForeignComponent;
 
-plan tests => 6;
-
 #   Tests if foreign component was loaded by calling foreign's method
 ok( DBICTest::ForeignComponent->foreign_test_method, 'foreign component' );
 
@@ -35,32 +33,7 @@ is_deeply( \@DBICTest::_InjectBaseTest::ISA,
     'inject_base filters duplicates'
 );
 
-# Test for a warning with incorrect order in load_components
-my @warnings = ();
-{
-  package A::Test;
-  our @ISA = 'DBIx::Class';
-  {
-    local $SIG{__WARN__} = sub { push @warnings, shift};
-    __PACKAGE__->load_components(qw(Core UTF8Columns));
-  }
-}
-like( $warnings[0], qr/Core loaded before UTF8Columns/,
-      'warning issued for incorrect order in load_components()' );
-is( scalar @warnings, 1,
-    'only one warning issued for incorrect load_components call' );
-
-# Test that no warning is issued for the correct order in load_components
-{
-  @warnings = ();
-  package B::Test;
-  our @ISA = 'DBIx::Class';
-  {
-    local $SIG{__WARN__} = sub { push @warnings, shift };
-    __PACKAGE__->load_components(qw(UTF8Columns Core));
-  }
-}
-is( scalar @warnings, 0,
-    'warning not issued for correct order in load_components()' );
-
 use_ok('DBIx::Class::AccessorGroup');
+use_ok('DBIx::Class::Componentised');
+
+done_testing;
index 9fc87f0..677d78a 100644 (file)
@@ -1,5 +1,5 @@
 use strict;
-use warnings;  
+use warnings;
 
 use Test::More;
 use Test::Exception;
index 1962431..4327cef 100644 (file)
@@ -6,10 +6,10 @@ use lib qw(t/lib);
 use DBICTest;
 
 BEGIN {
-  require DBIx::Class;
+  require DBIx::Class::Storage::DBI;
   plan skip_all =>
-      'Test needs SQL::Translator ' . DBIx::Class->_sqlt_minimum_version
-    if not DBIx::Class->_sqlt_version_ok;
+      'Test needs SQL::Translator ' . DBIx::Class::Storage::DBI->_sqlt_minimum_version
+    if not DBIx::Class::Storage::DBI->_sqlt_version_ok;
 }
 
 my $schema = DBICTest->init_schema (no_deploy => 1);
index 9ea6762..03a61d3 100644 (file)
@@ -16,10 +16,10 @@ BEGIN {
   plan skip_all => 'Set $ENV{DBICTEST_MYSQL_DSN}, _USER and _PASS to run this test'
     unless ($dsn);
 
-  require DBIx::Class;
+  require DBIx::Class::Storage::DBI;
   plan skip_all =>
-      'Test needs SQL::Translator ' . DBIx::Class->_sqlt_minimum_version
-    if not DBIx::Class->_sqlt_version_ok;
+      'Test needs SQL::Translator ' . DBIx::Class::Storage::DBI->_sqlt_minimum_version
+    if not DBIx::Class::Storage::DBI->_sqlt_version_ok;
 }
 
 my $version_table_name = 'dbix_class_schema_versions';
index 6f3a3e2..d4b1a9f 100644 (file)
@@ -6,10 +6,10 @@ use lib qw(t/lib);
 use DBICTest;
 
 BEGIN {
-  require DBIx::Class;
+  require DBIx::Class::Storage::DBI;
   plan skip_all =>
-      'Test needs SQL::Translator ' . DBIx::Class->_sqlt_minimum_version
-    if not DBIx::Class->_sqlt_version_ok;
+      'Test needs SQL::Translator ' . DBIx::Class::Storage::DBI->_sqlt_minimum_version
+    if not DBIx::Class::Storage::DBI->_sqlt_version_ok;
 }
 
 my $schema = DBICTest->init_schema();
index a160193..a004090 100644 (file)
@@ -1,6 +1,6 @@
 -- 
 -- Created by SQL::Translator::Producer::SQLite
--- Created on Tue Aug 25 12:34:34 2009
+-- Created on Mon Sep 21 00:11:34 2009
 --