From: Peter Rabbitson Date: Sun, 14 Feb 2010 10:41:14 +0000 (+0000) Subject: Merge 'trunk' into 'pri_key_refactor' X-Git-Tag: v0.08120~27^2~3 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=0777ad33930b2c09258f9752e4e76c27ca75f347;hp=a77f5ab1c0f242d27d3f77018574c56172bdd95c;p=dbsrgits%2FDBIx-Class.git Merge 'trunk' into 'pri_key_refactor' r8510@Thesaurus (orig r8497): caelum | 2010-02-01 12:07:13 +0100 throw exception on attempt to insert a blob with DBD::Oracle == 1.23 r8511@Thesaurus (orig r8498): caelum | 2010-02-01 12:12:48 +0100 add RT link for Oracle blob bug in DBD::Oracle == 1.23 r8527@Thesaurus (orig r8514): caelum | 2010-02-02 23:20:17 +0100 r22968@hlagh (orig r8502): caelum | 2010-02-02 05:30:47 -0500 branch to support Sybase SQL Anywhere r22971@hlagh (orig r8505): caelum | 2010-02-02 07:21:13 -0500 ASA last_insert_id and limit support, still needs BLOB support r22972@hlagh (orig r8506): caelum | 2010-02-02 08:33:57 -0500 deref table name if needed, check all columns for identity column not just PK r22973@hlagh (orig r8507): caelum | 2010-02-02 08:48:11 -0500 test blobs, they work, didn't have to do anything r22974@hlagh (orig r8508): caelum | 2010-02-02 09:15:44 -0500 fix stupid identity bug, test empty insert (works), test DTs (not working yet) r22976@hlagh (orig r8510): caelum | 2010-02-02 14:31:00 -0500 rename ::Sybase::ASA to ::SQLAnywhere, per mst r22978@hlagh (orig r8512): caelum | 2010-02-02 17:02:29 -0500 DT inflation now works r22979@hlagh (orig r8513): caelum | 2010-02-02 17:18:06 -0500 minor POD update r8528@Thesaurus (orig r8515): caelum | 2010-02-02 23:23:26 +0100 r22895@hlagh (orig r8473): caelum | 2010-01-30 03:57:26 -0500 branch to fix computed columns in Sybase ASE r22911@hlagh (orig r8489): caelum | 2010-01-31 07:18:33 -0500 empty insert into a Sybase table with computed columns and either data_type => undef or default_value => SCALARREF works now r22912@hlagh (orig r8490): caelum | 2010-01-31 07:39:32 -0500 add POD about computed columns and timestamps for Sybase r22918@hlagh (orig r8496): caelum | 2010-02-01 05:09:07 -0500 update POD about Schema::Loader for Sybase r8531@Thesaurus (orig r8518): ribasushi | 2010-02-02 23:57:27 +0100 r8512@Thesaurus (orig r8499): boghead | 2010-02-01 23:38:13 +0100 - Creating a branch for adding _post_inflate_datetime and _pre_deflate_datetime to InflateColumn::DateTime r8513@Thesaurus (orig r8500): boghead | 2010-02-01 23:42:14 +0100 - Add _post_inflate_datetime and _pre_deflate_datetime to InflateColumn::DateTime to allow for modifying DateTime objects after inflation or before deflation. r8524@Thesaurus (orig r8511): boghead | 2010-02-02 22:59:28 +0100 - Simplify by allowing moving column_info depreciated {extra}{timezone} data to {timezone} (and the same with locale) r8533@Thesaurus (orig r8520): caelum | 2010-02-03 05:19:59 +0100 support for Sybase SQL Anywhere through ODBC r8536@Thesaurus (orig r8523): ribasushi | 2010-02-03 08:27:54 +0100 Changes r8537@Thesaurus (orig r8524): ribasushi | 2010-02-03 08:31:20 +0100 Quote fail r8538@Thesaurus (orig r8525): caelum | 2010-02-03 13:21:37 +0100 test DT inflation for Sybase SQL Anywhere over ODBC too r8539@Thesaurus (orig r8526): caelum | 2010-02-03 17:36:39 +0100 minor code cleanup for SQL Anywhere last_insert_id r8540@Thesaurus (orig r8527): ribasushi | 2010-02-04 11:28:33 +0100 Fix bug reported by tommyt r8548@Thesaurus (orig r8535): ribasushi | 2010-02-04 14:34:45 +0100 Prepare for new SQLA release r8560@Thesaurus (orig r8547): ribasushi | 2010-02-05 08:59:04 +0100 Refactor some evil code r8565@Thesaurus (orig r8552): ribasushi | 2010-02-05 17:00:12 +0100 Looks like RSC is finally (halfway) fixed r8566@Thesaurus (orig r8553): ribasushi | 2010-02-05 17:07:13 +0100 RSC subquery can not include the prefetch r8567@Thesaurus (orig r8554): ribasushi | 2010-02-05 17:10:29 +0100 Fix typo and borked test r8569@Thesaurus (orig r8556): ribasushi | 2010-02-05 17:33:12 +0100 Release 0.08116 r8571@Thesaurus (orig r8558): ribasushi | 2010-02-05 18:01:33 +0100 No idea how I missed all these fails... r8572@Thesaurus (orig r8559): ribasushi | 2010-02-05 18:13:34 +0100 Release 0.08117 r8574@Thesaurus (orig r8561): ribasushi | 2010-02-05 18:51:12 +0100 Try to distinguish trunk from official versions r8580@Thesaurus (orig r8567): gshank | 2010-02-05 22:29:24 +0100 add doc on 'where' attribute r8587@Thesaurus (orig r8574): frew | 2010-02-07 21:07:03 +0100 add as_subselect_rs r8588@Thesaurus (orig r8575): frew | 2010-02-07 21:13:04 +0100 fix longstanding unmentioned bug ("me") r8589@Thesaurus (orig r8576): frew | 2010-02-08 06:17:43 +0100 another example of as_subselect_rs r8590@Thesaurus (orig r8577): frew | 2010-02-08 06:23:58 +0100 fix bug in UTF8Columns r8591@Thesaurus (orig r8578): ribasushi | 2010-02-08 09:31:01 +0100 Extend utf8columns test to trap fixed bug r8592@Thesaurus (orig r8579): ribasushi | 2010-02-08 12:03:23 +0100 Cleanup rel accessor type handling r8593@Thesaurus (orig r8580): ribasushi | 2010-02-08 12:20:47 +0100 Fix some fallout r8595@Thesaurus (orig r8582): ribasushi | 2010-02-08 12:38:19 +0100 Merge some obsolete code cleanup from the prefetch branch r8596@Thesaurus (orig r8583): ribasushi | 2010-02-08 12:42:09 +0100 Merge fix of RT54039 from prefetch branch r8598@Thesaurus (orig r8585): ribasushi | 2010-02-08 12:48:31 +0100 Release 0.08118 r8600@Thesaurus (orig r8587): ribasushi | 2010-02-08 12:52:33 +0100 Bump trunk version r8606@Thesaurus (orig r8593): ribasushi | 2010-02-08 16:16:44 +0100 cheaper lookup r8609@Thesaurus (orig r8596): ribasushi | 2010-02-10 12:40:37 +0100 Consolidate last_insert_id handling with a fallback-attempt on DBI::last_insert_id r8614@Thesaurus (orig r8601): caelum | 2010-02-10 21:29:51 +0100 workaround for Moose bug affecting Replicated storage r8615@Thesaurus (orig r8602): caelum | 2010-02-10 21:40:07 +0100 revert Moose bug workaround, bump Moose dep for Replicated to 0.98 r8616@Thesaurus (orig r8603): caelum | 2010-02-10 22:48:34 +0100 add a couple proxy methods to Replicated so it can run r8628@Thesaurus (orig r8615): caelum | 2010-02-11 11:35:01 +0100 r21090@hlagh (orig r7836): caelum | 2009-11-02 06:40:52 -0500 new branch to fix unhandled methods in Storage::DBI::Replicated r21091@hlagh (orig r7837): caelum | 2009-11-02 06:42:00 -0500 add test to display unhandled methods r21092@hlagh (orig r7838): caelum | 2009-11-02 06:55:34 -0500 minor fix to last committed test r21093@hlagh (orig r7839): caelum | 2009-11-02 09:26:00 -0500 minor test code cleanup r23125@hlagh (orig r8607): caelum | 2010-02-10 19:25:51 -0500 add unimplemented Storage::DBI methods to ::DBI::Replicated r23130@hlagh (orig r8612): ribasushi | 2010-02-11 05:12:48 -0500 Podtesting exclusion r8630@Thesaurus (orig r8617): frew | 2010-02-11 11:45:54 +0100 Changes (from a while ago) r8631@Thesaurus (orig r8618): caelum | 2010-02-11 11:46:58 +0100 savepoints for SQLAnywhere r8640@Thesaurus (orig r8627): ribasushi | 2010-02-11 12:33:19 +0100 r8424@Thesaurus (orig r8411): ribasushi | 2010-01-22 11:19:40 +0100 Chaining POC test r8641@Thesaurus (orig r8628): ribasushi | 2010-02-11 12:34:19 +0100 r8426@Thesaurus (orig r8413): ribasushi | 2010-01-22 11:35:15 +0100 Moev failing regression test away from trunk r8642@Thesaurus (orig r8629): ribasushi | 2010-02-11 12:34:56 +0100 r8643@Thesaurus (orig r8630): ribasushi | 2010-02-11 12:35:03 +0100 r8507@Thesaurus (orig r8494): frew | 2010-02-01 04:33:08 +0100 small refactor to put select/as/+select/+as etc merging in it's own function r8644@Thesaurus (orig r8631): ribasushi | 2010-02-11 12:35:11 +0100 r8514@Thesaurus (orig r8501): frew | 2010-02-02 05:12:29 +0100 revert actual changes from yesterday as per ribasushis advice r8645@Thesaurus (orig r8632): ribasushi | 2010-02-11 12:35:16 +0100 r8522@Thesaurus (orig r8509): frew | 2010-02-02 19:39:33 +0100 delete +stuff if stuff exists r8646@Thesaurus (orig r8633): ribasushi | 2010-02-11 12:35:23 +0100 r8534@Thesaurus (orig r8521): frew | 2010-02-03 06:14:44 +0100 change deletion/overriding to fix t/76 r8647@Thesaurus (orig r8634): ribasushi | 2010-02-11 12:35:30 +0100 r8535@Thesaurus (orig r8522): frew | 2010-02-03 06:57:15 +0100 some basic readability factorings (aka, fewer nested ternaries and long maps) r8648@Thesaurus (orig r8635): ribasushi | 2010-02-11 12:36:01 +0100 r8558@Thesaurus (orig r8545): frew | 2010-02-04 20:32:54 +0100 fix incorrect test in t/76select.t and posit an incorrect solution r8649@Thesaurus (orig r8636): ribasushi | 2010-02-11 12:38:47 +0100 r8650@Thesaurus (orig r8637): ribasushi | 2010-02-11 12:38:57 +0100 r8578@Thesaurus (orig r8565): ribasushi | 2010-02-05 19:11:09 +0100 Should not be needed r8651@Thesaurus (orig r8638): ribasushi | 2010-02-11 12:39:03 +0100 r8579@Thesaurus (orig r8566): ribasushi | 2010-02-05 19:13:24 +0100 SQLA now fixed r8652@Thesaurus (orig r8639): ribasushi | 2010-02-11 12:39:10 +0100 r8624@Thesaurus (orig r8611): ribasushi | 2010-02-11 10:31:08 +0100 MOAR testing r8653@Thesaurus (orig r8640): ribasushi | 2010-02-11 12:39:17 +0100 r8626@Thesaurus (orig r8613): frew | 2010-02-11 11:16:30 +0100 fix bad test r8654@Thesaurus (orig r8641): ribasushi | 2010-02-11 12:39:23 +0100 r8627@Thesaurus (orig r8614): frew | 2010-02-11 11:21:52 +0100 fix t/76, break rsc tests r8655@Thesaurus (orig r8642): ribasushi | 2010-02-11 12:39:30 +0100 r8632@Thesaurus (orig r8619): frew | 2010-02-11 11:53:50 +0100 fix incorrect test r8656@Thesaurus (orig r8643): ribasushi | 2010-02-11 12:39:35 +0100 r8633@Thesaurus (orig r8620): frew | 2010-02-11 11:54:49 +0100 make t/76s and t/88 pass by deleting from the correct attr hash r8657@Thesaurus (orig r8644): ribasushi | 2010-02-11 12:39:40 +0100 r8634@Thesaurus (orig r8621): frew | 2010-02-11 11:55:41 +0100 fix a test due to ordering issues r8658@Thesaurus (orig r8645): ribasushi | 2010-02-11 12:39:45 +0100 r8635@Thesaurus (orig r8622): frew | 2010-02-11 11:58:23 +0100 this is why you run tests before you commit them. r8659@Thesaurus (orig r8646): ribasushi | 2010-02-11 12:39:51 +0100 r8636@Thesaurus (orig r8623): frew | 2010-02-11 12:00:59 +0100 fix another ordering issue r8660@Thesaurus (orig r8647): ribasushi | 2010-02-11 12:39:57 +0100 r8637@Thesaurus (orig r8624): frew | 2010-02-11 12:11:31 +0100 fix for search/select_chains r8661@Thesaurus (orig r8648): ribasushi | 2010-02-11 12:40:03 +0100 r8662@Thesaurus (orig r8649): caelum | 2010-02-11 12:40:07 +0100 test nanosecond precision for SQLAnywhere r8663@Thesaurus (orig r8650): ribasushi | 2010-02-11 12:40:09 +0100 r8639@Thesaurus (orig r8626): ribasushi | 2010-02-11 12:33:03 +0100 Changes and small ommission r8666@Thesaurus (orig r8653): ribasushi | 2010-02-11 18:16:45 +0100 Changes r8674@Thesaurus (orig r8661): ribasushi | 2010-02-12 09:12:45 +0100 Fix moose dep r8680@Thesaurus (orig r8667): dew | 2010-02-12 18:05:11 +0100 Add is_ordered to DBIC::ResultSet r8688@Thesaurus (orig r8675): ribasushi | 2010-02-13 09:36:29 +0100 r8667@Thesaurus (orig r8654): ribasushi | 2010-02-11 18:17:35 +0100 Try a dep-handling idea r8675@Thesaurus (orig r8662): ribasushi | 2010-02-12 12:46:11 +0100 Move optional deps out of the Makefile r8676@Thesaurus (orig r8663): ribasushi | 2010-02-12 13:40:53 +0100 Support methods to verify group dependencies r8677@Thesaurus (orig r8664): ribasushi | 2010-02-12 13:45:18 +0100 Move sqlt dephandling to Optional::Deps r8679@Thesaurus (orig r8666): ribasushi | 2010-02-12 14:03:17 +0100 Move replicated to Opt::Deps r8684@Thesaurus (orig r8671): ribasushi | 2010-02-13 02:47:52 +0100 Auto-POD for Optional Deps r8685@Thesaurus (orig r8672): ribasushi | 2010-02-13 02:53:20 +0100 Privatize the full list method r8686@Thesaurus (orig r8673): ribasushi | 2010-02-13 02:59:51 +0100 Scary warning r8687@Thesaurus (orig r8674): ribasushi | 2010-02-13 09:35:01 +0100 Changes r8691@Thesaurus (orig r8678): ribasushi | 2010-02-13 10:07:15 +0100 Autogen comment for Dependencies.pod r8692@Thesaurus (orig r8679): ribasushi | 2010-02-13 10:11:24 +0100 Ask for newer M::I r8698@Thesaurus (orig r8685): ribasushi | 2010-02-13 11:11:10 +0100 Add author/license to pod r8699@Thesaurus (orig r8686): arcanez | 2010-02-13 13:43:22 +0100 fix typo per nuba on irc r8705@Thesaurus (orig r8692): ribasushi | 2010-02-13 15:15:33 +0100 r8001@Thesaurus (orig r7989): goraxe | 2009-11-30 01:14:47 +0100 Branch for dbicadmin script refactor r8003@Thesaurus (orig r7991): goraxe | 2009-11-30 01:26:39 +0100 add DBIx::Class::Admin r8024@Thesaurus (orig r8012): goraxe | 2009-12-02 22:49:27 +0100 get deployment tests to pass r8025@Thesaurus (orig r8013): goraxe | 2009-12-02 22:50:42 +0100 get deployment tests to pass r8026@Thesaurus (orig r8014): goraxe | 2009-12-02 23:52:40 +0100 all ddl tests now pass r8083@Thesaurus (orig r8071): goraxe | 2009-12-12 17:01:11 +0100 add quite attribute to DBIx::Class admin r8086@Thesaurus (orig r8074): goraxe | 2009-12-12 17:36:58 +0100 add tests for data manipulation ported from 89dbicadmin.t r8088@Thesaurus (orig r8076): goraxe | 2009-12-12 17:38:07 +0100 add sleep 1 to t/admin/02ddl.t so insert into upgrade table does not happen too quickly r8089@Thesaurus (orig r8077): goraxe | 2009-12-12 17:40:33 +0100 update DBIx::Class::Admin data manip functions to pass the test r8095@Thesaurus (orig r8083): goraxe | 2009-12-12 19:36:22 +0100 change passing of preversion to be a parameter r8096@Thesaurus (orig r8084): goraxe | 2009-12-12 19:38:26 +0100 add some pod to DBIx::Class::Admin r8103@Thesaurus (orig r8091): goraxe | 2009-12-12 22:08:55 +0100 some changes to make DBIx::Class::Admin more compatible with dbicadmin interface r8104@Thesaurus (orig r8092): goraxe | 2009-12-12 22:09:39 +0100 commit refactored dbicadmin script and very minor changes to its existing test suite r8107@Thesaurus (orig r8095): goraxe | 2009-12-12 22:34:35 +0100 add compatability for --op for dbicadmin, revert test suite r8127@Thesaurus (orig r8115): goraxe | 2009-12-15 22:14:20 +0100 dep check to end of module r8128@Thesaurus (orig r8116): goraxe | 2009-12-15 23:15:25 +0100 add namespace::autoclean to DBIx::Class::Admin r8129@Thesaurus (orig r8117): goraxe | 2009-12-15 23:16:00 +0100 update test suite to skip if cannot load DBIx::Class::Admin r8130@Thesaurus (orig r8118): goraxe | 2009-12-15 23:18:35 +0100 add deps check for 89dbicadmin.t r8131@Thesaurus (orig r8119): goraxe | 2009-12-15 23:19:01 +0100 include deps for dbicadmin DBIx::Class::Admin to Makefile.PL r8149@Thesaurus (orig r8137): goraxe | 2009-12-17 23:21:50 +0100 use DBICTest::_database over creating a schema object to steal conn info r8338@Thesaurus (orig r8326): goraxe | 2010-01-15 19:00:17 +0100 change white space to not be tabs r8339@Thesaurus (orig r8327): goraxe | 2010-01-15 19:10:42 +0100 remove Module::Load from test suite r8358@Thesaurus (orig r8346): ribasushi | 2010-01-17 17:52:10 +0100 Real detabify r8359@Thesaurus (orig r8347): ribasushi | 2010-01-17 18:01:53 +0100 Fix POD (spacing matters) r8360@Thesaurus (orig r8348): ribasushi | 2010-01-17 21:57:53 +0100 More detabification r8361@Thesaurus (orig r8349): ribasushi | 2010-01-17 22:33:12 +0100 Test cleanup r8362@Thesaurus (orig r8350): ribasushi | 2010-01-17 22:41:11 +0100 More tets cleanup r8363@Thesaurus (orig r8351): ribasushi | 2010-01-17 22:43:57 +0100 And more cleanup r8364@Thesaurus (orig r8352): ribasushi | 2010-01-17 22:51:21 +0100 Disallow mucking with INC r8365@Thesaurus (orig r8353): ribasushi | 2010-01-17 23:23:15 +0100 More cleanup r8366@Thesaurus (orig r8354): ribasushi | 2010-01-17 23:27:49 +0100 Add lib path to ENV so that $^X can see it r8367@Thesaurus (orig r8355): ribasushi | 2010-01-17 23:33:10 +0100 Move script-test r8368@Thesaurus (orig r8356): goraxe | 2010-01-17 23:35:03 +0100 change warns/dies -> carp/throw_exception r8369@Thesaurus (orig r8357): goraxe | 2010-01-17 23:53:54 +0100 add goraxe to contributors r8370@Thesaurus (orig r8358): goraxe | 2010-01-17 23:54:15 +0100 remove comment headers r8404@Thesaurus (orig r8391): caelum | 2010-01-20 20:54:29 +0100 minor fixups r8405@Thesaurus (orig r8392): goraxe | 2010-01-20 21:13:24 +0100 add private types to coerce r8406@Thesaurus (orig r8393): goraxe | 2010-01-20 21:17:19 +0100 remove un-needed coerce from schema_class of type Str r8411@Thesaurus (orig r8398): caelum | 2010-01-21 23:36:25 +0100 minor documentation updates r8436@Thesaurus (orig r8423): caelum | 2010-01-25 02:56:30 +0100 this code never runs anyway r8440@Thesaurus (orig r8427): caelum | 2010-01-26 14:05:53 +0100 prefer JSON::DWIW for barekey support r8693@Thesaurus (orig r8680): ribasushi | 2010-02-13 10:27:18 +0100 dbicadmin dependencies r8694@Thesaurus (orig r8681): ribasushi | 2010-02-13 10:28:04 +0100 Some cleaup, make use of Text::CSV r8695@Thesaurus (orig r8682): ribasushi | 2010-02-13 10:34:19 +0100 We use Try::Tiny in a single spot, not grounds for inlusion in deps r8696@Thesaurus (orig r8683): ribasushi | 2010-02-13 10:37:30 +0100 POD section r8697@Thesaurus (orig r8684): ribasushi | 2010-02-13 11:05:17 +0100 Switch tests to Optional::Deps r8700@Thesaurus (orig r8687): ribasushi | 2010-02-13 14:32:50 +0100 Switch Admin/dbicadmin to Opt::Deps r8702@Thesaurus (orig r8689): ribasushi | 2010-02-13 14:39:24 +0100 JSON dep is needed for Admin.pm itself r8703@Thesaurus (orig r8690): ribasushi | 2010-02-13 15:06:28 +0100 Test fixes r8704@Thesaurus (orig r8691): ribasushi | 2010-02-13 15:13:31 +0100 Changes r8707@Thesaurus (orig r8694): ribasushi | 2010-02-13 16:37:57 +0100 Test for optional deps manager r8710@Thesaurus (orig r8697): caelum | 2010-02-14 05:22:03 +0100 add doc on maximum cursors for SQLAnywhere r8711@Thesaurus (orig r8698): ribasushi | 2010-02-14 09:23:09 +0100 Cleanup dependencies / Admin inheritance r8712@Thesaurus (orig r8699): ribasushi | 2010-02-14 09:28:29 +0100 Some formatting r8715@Thesaurus (orig r8702): ribasushi | 2010-02-14 10:46:51 +0100 This is Moose, so use CMOP --- diff --git a/Makefile.PL b/Makefile.PL index c725626..e747063 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -138,7 +138,6 @@ no_index directory => $_ for (qw| lib/DBIx/Class/PK/Auto |); no_index package => $_ for (qw/ - DBIx::Class::Storage::DBI::AmbiguousGlob DBIx::Class::SQLAHacks DBIx::Class::Storage::DBIHacks /); diff --git a/lib/DBIx/Class/Ordered.pm b/lib/DBIx/Class/Ordered.pm index 5f17790..2cac812 100644 --- a/lib/DBIx/Class/Ordered.pm +++ b/lib/DBIx/Class/Ordered.pm @@ -797,15 +797,15 @@ sub _shift_siblings { if (grep { $_ eq $position_column } ( map { @$_ } (values %{{ $rsrc->unique_constraints }} ) ) ) { - my @pcols = $rsrc->primary_columns; + my @pcols = $rsrc->_pri_cols; 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 @all_pks = $cursor->all; + while (my $pks = shift @all_pks) { my $cond; for my $i (0.. $#pcols) { - $cond->{$pcols[$i]} = $pks[$i]; + $cond->{$pcols[$i]} = $pks->[$i]; } $rs->search($cond)->update ({ $position_column => \ "$position_column $op 1" } ); diff --git a/lib/DBIx/Class/PK.pm b/lib/DBIx/Class/PK.pm index cf8a194..a25c431 100644 --- a/lib/DBIx/Class/PK.pm +++ b/lib/DBIx/Class/PK.pm @@ -31,13 +31,27 @@ sub id { my ($self) = @_; $self->throw_exception( "Can't call id() as a class method" ) unless ref $self; - my @pk = $self->_ident_values; - return (wantarray ? @pk : $pk[0]); + my @id_vals = $self->_ident_values; + return (wantarray ? @id_vals : $id_vals[0]); } sub _ident_values { my ($self) = @_; - return (map { $self->{_column_data}{$_} } $self->primary_columns); + my (@ids, @missing); + + for ($self->_pri_cols) { + push @ids, $self->get_column($_); + push @missing, $_ if (! defined $ids[-1] and ! $self->has_column_loaded ($_) ); + } + + if (@missing && $self->in_storage) { + $self->throw_exception ( + 'Unable to uniquely identify row object with missing PK columns: ' + . join (', ', @missing ) + ); + } + + return @ids; } =head2 ID @@ -64,12 +78,11 @@ sub ID { $self->throw_exception( "Can't call ID() as a class method" ) unless ref $self; return undef unless $self->in_storage; - return $self->_create_ID(map { $_ => $self->{_column_data}{$_} } - $self->primary_columns); + return $self->_create_ID(%{$self->ident_condition}); } sub _create_ID { - my ($self,%vals) = @_; + my ($self, %vals) = @_; return undef unless 0 == grep { !defined } values %vals; return join '|', ref $self || $self, $self->result_source->name, map { $_ . '=' . $vals{$_} } sort keys %vals; @@ -87,9 +100,25 @@ Produces a condition hash to locate a row based on the primary key(s). sub ident_condition { my ($self, $alias) = @_; - my %cond; + + my @pks = $self->_pri_cols; + my @vals = $self->_ident_values; + + my (%cond, @undef); my $prefix = defined $alias ? $alias.'.' : ''; - $cond{$prefix.$_} = $self->get_column($_) for $self->primary_columns; + for my $col (@pks) { + if (! defined ($cond{$prefix.$col} = shift @vals) ) { + push @undef, $col; + } + } + + if (@undef && $self->in_storage) { + $self->throw_exception ( + 'Unable to construct row object identity condition due to NULL PK columns: ' + . join (', ', @undef) + ); + } + return \%cond; } diff --git a/lib/DBIx/Class/Relationship/BelongsTo.pm b/lib/DBIx/Class/Relationship/BelongsTo.pm index af68b7b..471a417 100644 --- a/lib/DBIx/Class/Relationship/BelongsTo.pm +++ b/lib/DBIx/Class/Relationship/BelongsTo.pm @@ -24,19 +24,14 @@ sub belongs_to { # no join condition or just a column name if (!ref $cond) { $class->ensure_class_loaded($f_class); - my %f_primaries = map { $_ => 1 } eval { $f_class->primary_columns }; + my %f_primaries = map { $_ => 1 } eval { $f_class->_pri_cols }; $class->throw_exception( - "Can't infer join condition for ${rel} on ${class}; ". - "unable to load ${f_class}: $@" + "Can't infer join condition for ${rel} on ${class}: $@" ) if $@; my ($pri, $too_many) = keys %f_primaries; $class->throw_exception( "Can't infer join condition for ${rel} on ${class}; ". - "${f_class} has no primary keys" - ) unless defined $pri; - $class->throw_exception( - "Can't infer join condition for ${rel} on ${class}; ". "${f_class} has multiple primary keys" ) if $too_many; diff --git a/lib/DBIx/Class/Relationship/HasMany.pm b/lib/DBIx/Class/Relationship/HasMany.pm index d74a9a4..7690af8 100644 --- a/lib/DBIx/Class/Relationship/HasMany.pm +++ b/lib/DBIx/Class/Relationship/HasMany.pm @@ -14,7 +14,10 @@ sub has_many { unless (ref $cond) { $class->ensure_class_loaded($f_class); - my ($pri, $too_many) = $class->primary_columns; + my ($pri, $too_many) = eval { $class->_pri_cols }; + $class->throw_exception( + "Can't infer join condition for ${rel} on ${class}: $@" + ) if $@; $class->throw_exception( "has_many can only infer join for a single primary key; ". diff --git a/lib/DBIx/Class/Relationship/HasOne.pm b/lib/DBIx/Class/Relationship/HasOne.pm index 1578c63..9be220b 100644 --- a/lib/DBIx/Class/Relationship/HasOne.pm +++ b/lib/DBIx/Class/Relationship/HasOne.pm @@ -24,7 +24,7 @@ sub _has_one { $class->ensure_class_loaded($f_class); my $pri = $class->_get_primary_key; - + $class->throw_exception( "might_have/has_one needs a primary key to infer a join; ". "${class} has none" @@ -60,7 +60,11 @@ sub _has_one { sub _get_primary_key { my ( $class, $target_class ) = @_; $target_class ||= $class; - my ($pri, $too_many) = $target_class->primary_columns; + my ($pri, $too_many) = eval { $target_class->_pri_cols }; + $class->throw_exception( + "Can't infer join condition on ${target_class}: $@" + ) if $@; + $class->throw_exception( "might_have/has_one can only infer join for a single primary key; ". "${class} has more" diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index 26ee0f7..ef7055e 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -1261,7 +1261,7 @@ sub _count_subq_rs { # if we multi-prefetch we group_by primary keys only as this is what we would # get out of the rs via ->next/->all. We *DO WANT* to clobber old group_by regardless if ( keys %{$attrs->{collapse}} ) { - $sub_attrs->{group_by} = [ map { "$attrs->{alias}.$_" } ($rsrc->primary_columns) ] + $sub_attrs->{group_by} = [ map { "$attrs->{alias}.$_" } ($rsrc->_pri_cols) ] } $sub_attrs->{select} = $rsrc->storage->_subq_count_select ($rsrc, $sub_attrs); @@ -1420,7 +1420,7 @@ sub _rs_update_delete { my $attrs = $self->_resolved_attrs_copy; delete $attrs->{$_} for qw/collapse select as/; - $attrs->{columns} = [ map { "$attrs->{alias}.$_" } ($self->result_source->primary_columns) ]; + $attrs->{columns} = [ map { "$attrs->{alias}.$_" } ($self->result_source->_pri_cols) ]; if ($needs_group_by_subq) { # make sure no group_by was supplied, or if there is one - make sure it matches diff --git a/lib/DBIx/Class/ResultSource.pm b/lib/DBIx/Class/ResultSource.pm index 1b9baa8..2794292 100644 --- a/lib/DBIx/Class/ResultSource.pm +++ b/lib/DBIx/Class/ResultSource.pm @@ -503,6 +503,16 @@ sub primary_columns { return @{shift->_primaries||[]}; } +sub _pri_cols { + my $self = shift; + my @pcols = $self->primary_columns + or $self->throw_exception (sprintf( + 'Operation requires a primary key to be declared on %s via set_primary_key', + ref $self, + )); + return @pcols; +} + =head2 add_unique_constraint =over 4 diff --git a/lib/DBIx/Class/ResultSourceProxy.pm b/lib/DBIx/Class/ResultSourceProxy.pm index ffef623..6df208e 100644 --- a/lib/DBIx/Class/ResultSourceProxy.pm +++ b/lib/DBIx/Class/ResultSourceProxy.pm @@ -75,6 +75,10 @@ sub primary_columns { shift->result_source_instance->primary_columns(@_); } +sub _pri_cols { + shift->result_source_instance->_pri_cols(@_); +} + sub add_unique_constraint { shift->result_source_instance->add_unique_constraint(@_); } diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 0030431..e3d90e8 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -1601,15 +1601,7 @@ sub _subq_update_delete { my $rsrc = $rs->result_source; # quick check if we got a sane rs on our hands - my @pcols = $rsrc->primary_columns; - unless (@pcols) { - $self->throw_exception ( - sprintf ( - "You must declare primary key(s) on source '%s' (via set_primary_key) in order to update or delete complex resultsets", - $rsrc->source_name || $rsrc->from - ) - ); - } + my @pcols = $rsrc->_pri_cols; my $sel = $rs->_resolved_attrs->{select}; $sel = [ $sel ] unless ref $sel eq 'ARRAY'; @@ -1662,7 +1654,7 @@ sub _per_row_update_delete { my ($rs, $op, $values) = @_; my $rsrc = $rs->result_source; - my @pcols = $rsrc->primary_columns; + my @pcols = $rsrc->_pri_cols; my $guard = $self->txn_scope_guard; diff --git a/lib/DBIx/Class/Storage/DBI/AmbiguousGlob.pm b/lib/DBIx/Class/Storage/DBI/AmbiguousGlob.pm deleted file mode 100644 index 2008c54..0000000 --- a/lib/DBIx/Class/Storage/DBI/AmbiguousGlob.pm +++ /dev/null @@ -1,47 +0,0 @@ -package DBIx::Class::Storage::DBI::AmbiguousGlob; - -use strict; -use warnings; - -use base 'DBIx::Class::Storage::DBI'; -use mro 'c3'; - -=head1 NAME - -DBIx::Class::Storage::DBI::AmbiguousGlob - Storage component for RDBMS choking on count(*) - -=head1 DESCRIPTION - -Some servers choke on things like: - - COUNT(*) FROM (SELECT tab1.col, tab2.col FROM tab1 JOIN tab2 ... ) - -claiming that col is a duplicate column (it loses the table specifiers by -the time it gets to the *). Thus for any subquery count we select only the -primary keys of the main table in the inner query. This hopefully still -hits the indexes and keeps the server happy. - -At this point the only overriden method is C<_subq_count_select()> - -=cut - -sub _subq_count_select { - my ($self, $source, $rs_attrs) = @_; - - return $rs_attrs->{group_by} if $rs_attrs->{group_by}; - - my @pcols = map { join '.', $rs_attrs->{alias}, $_ } ($source->primary_columns); - return @pcols ? \@pcols : [ 1 ]; -} - -=head1 AUTHORS - -See L - -=head1 LICENSE - -You may distribute this code under the same terms as Perl itself. - -=cut - -1; diff --git a/lib/DBIx/Class/Storage/DBI/MSSQL.pm b/lib/DBIx/Class/Storage/DBI/MSSQL.pm index 8bd0d45..fedec7f 100644 --- a/lib/DBIx/Class/Storage/DBI/MSSQL.pm +++ b/lib/DBIx/Class/Storage/DBI/MSSQL.pm @@ -3,7 +3,7 @@ package DBIx::Class::Storage::DBI::MSSQL; use strict; use warnings; -use base qw/DBIx::Class::Storage::DBI::AmbiguousGlob DBIx::Class::Storage::DBI/; +use base qw/DBIx::Class::Storage::DBI/; use mro 'c3'; use List::Util(); diff --git a/lib/DBIx/Class/Storage/DBI/MultiColumnIn.pm b/lib/DBIx/Class/Storage/DBI/MultiColumnIn.pm index 2a757ea..c675c1e 100644 --- a/lib/DBIx/Class/Storage/DBI/MultiColumnIn.pm +++ b/lib/DBIx/Class/Storage/DBI/MultiColumnIn.pm @@ -26,7 +26,7 @@ sub _multipk_update_delete { my ($rs, $op, $values) = @_; my $rsrc = $rs->result_source; - my @pcols = $rsrc->primary_columns; + my @pcols = $rsrc->_pri_cols; my $attrs = $rs->_resolved_attrs; # naive check - this is an internal method after all, we should know what we are doing diff --git a/lib/DBIx/Class/Storage/DBI/Sybase/ASE.pm b/lib/DBIx/Class/Storage/DBI/Sybase/ASE.pm index 10cc9c8..e3485ce 100644 --- a/lib/DBIx/Class/Storage/DBI/Sybase/ASE.pm +++ b/lib/DBIx/Class/Storage/DBI/Sybase/ASE.pm @@ -728,10 +728,9 @@ sub _remove_blob_cols_array { sub _update_blobs { my ($self, $source, $blob_cols, $where) = @_; - my (@primary_cols) = $source->primary_columns; - - $self->throw_exception('Cannot update TEXT/IMAGE column(s) without a primary key') - unless @primary_cols; + my @primary_cols = eval { $source->_pri_cols }; + $self->throw_exception("Cannot update TEXT/IMAGE column(s): $@") + if $@; # check if we're updating a single row by PK my $pk_cols_in_where = 0; @@ -763,10 +762,9 @@ sub _insert_blobs { my $table = $source->name; my %row = %$row; - my (@primary_cols) = $source->primary_columns; - - $self->throw_exception('Cannot update TEXT/IMAGE column(s) without a primary key') - unless @primary_cols; + my @primary_cols = eval { $source->_pri_cols} ; + $self->throw_exception("Cannot update TEXT/IMAGE column(s): $@") + if $@; $self->throw_exception('Cannot update TEXT/IMAGE column(s) without primary key values') if ((grep { defined $row{$_} } @primary_cols) != @primary_cols); diff --git a/lib/DBIx/Class/Storage/DBI/mysql.pm b/lib/DBIx/Class/Storage/DBI/mysql.pm index 20e4f7f..486594e 100644 --- a/lib/DBIx/Class/Storage/DBI/mysql.pm +++ b/lib/DBIx/Class/Storage/DBI/mysql.pm @@ -5,7 +5,6 @@ use warnings; use base qw/ DBIx::Class::Storage::DBI::MultiColumnIn - DBIx::Class::Storage::DBI::AmbiguousGlob DBIx::Class::Storage::DBI /; use mro 'c3';